There are many excel reader and writer open source dlls available like EPPLUS, NPOI.
here is example of code I have developed in one of my project, it is more focusing on reading data but you have plenty of features to write data into individual cell as well just need to explore it. little bit. The dll does not require MS office to be installed on server as it is open source.
#region Read xlsx file
using (ExcelPackage package = new ExcelPackage())
{
package.Load(stream);
if (package.Workbook.Worksheets.Count > 1 && ReaderRequestEntity.firsttimeread == true)
{
foreach (var item in package.Workbook.Worksheets)
{
ReaderRequestEntity.SheetNamesList.Add(item.Name);
}
}
if (package.Workbook.Worksheets.Count == 0)
ReaderRequestEntity.Message = "Your Excel file does not contain any work sheets";
else
{
ExcelWorksheet workSheet = package.Workbook.Worksheets.First();
int EndColumn = workSheet.Dimension.End.Column > 50 ? 50 : workSheet.Dimension.End.Column;
foreach (var firstRowCell in workSheet.Cells[ReaderRequestEntity.HeaderRowNo, 1, ReaderRequestEntity.HeaderRowNo, EndColumn])
{
if (ReaderRequestEntity.firsttimeread != true && (firstRowCell.Text == null || firstRowCell.Text == ""))
continue;
else
table.Columns.Add(firstRowCell.Text);
}
for (var rowNumber = ReaderRequestEntity.HeaderRowNo; rowNumber <= workSheet.Dimension.End.Row; rowNumber++)
{
if (!ReaderRequestEntity.RowsTobeIngonredList.Contains(rowNumber.ToString()))
{
int endcolumn = (ReaderRequestEntity.firsttimeread == true ? EndColumn : table.Columns.Count);
var row = workSheet.Cells[rowNumber, 1, rowNumber, endcolumn];
var newRow = table.NewRow();
int j = 0;
foreach (var cell in row)
{
try
{
newRow[j] = cell.Text;
j++;
}
catch (Exception ex)
{
if (ex.Message.Contains("Cannot find column"))
{
table.Columns.Add("column" + j);
}
}
}
try
{
table.Rows.Add(newRow);
}
catch (Exception)
{
throw;
}
}
}
}
}
#endregion
private void formatCellValue(ref ExcelWorksheet worksheet)
{
DataTable dtColumnMapping = (DataTable)HttpContext.Current.Session["ColumnMappingTable"];
int i = 0;
foreach (DataRow item in dtColumnMapping.Rows)
{
if (item["Dbcolumntype"].ToString() == "date")
worksheet.Column(i).Style.Numberformat.Format = "yyyy-mm-dd";
i++;
}
}
public int Calculatewidth(string firstRowCell)
{
switch (firstRowCell.Length)
{
case 1 - 5:
{
return 75;
}
case 6 - 9:
{
return 120;
}
default:
return 140;
}
}
You can get very good example for the same at dev plex.