这边是我模仿写的一个小工具类 实现了将datatable 写入到EXCEL指定的SHEET 指定的行 中 ,
背景是 由于一开始引用了using Microsoft.Office.Interop.Excel;
类库导致客户在没有装office环境的电脑上时候 所以改用了更通用的NPOI进行EXCEL的使用
/// <summary>
/// datatable 写入现有的EXCEL
/// </summary>
/// <param name=\”dt_source\”>需要写入的数据源</param>
/// <param name=\”filepath\”>excel 文件路径</param>
/// <param name=\”sheetname\”>哪个页面 写</param>
/// <param name=\”startrow\”>从第几行开始写 </param>
public static void DtWriteExitExcel(DataTable dt_source, string filepath,string sheetname,int startrow)
{
//1.读取现有的EXCEL 文件 获取 IWorkbook 记得关闭 文件流 这里只是要获取SHEET格式
FileStream fs = null;
IWorkbook workbook = null;
ISheet xSheet = null;
fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
if (filepath.IndexOf(\”.xlsx\”) > 0)
{
workbook = new XSSFWorkbook(fs);
}
else if (filepath.IndexOf(\”.xls\”) > 0)
{
workbook = new HSSFWorkbook(fs);
}
fs.Close();
//2.获取需要的SHEET 一个excel 由很多的页组成 这边 sheetname 就是获取需要哪个页的SHEET 格式
try
{
xSheet = workbook.GetSheetAt(workbook.GetSheetIndex(sheetname));
//3.赋值 根据这个SHEET 来新建行 赋值 单元格 这里startrow 是可以指定从第几行开始写入内容
for (int i = 0; i < dt_source.Rows.Count; i++)
{
IRow row1 = xSheet.CreateRow(i + startrow );
for (int j = 0; j < dt_source.Columns.Count; j++)
{
ICell celli = row1.CreateCell(j );
celli.SetCellValue(dt_source.Rows[i][j].ToString());
}
}
//4.再次打开这个文件然后将刚刚的 workbook 写入进去
FileStream fileStream = File.Open(filepath,FileMode.OpenOrCreate, FileAccess.ReadWrite);
workbook.Write(fileStream);
//5.这里 不能把 workbook.Dispose(); 写到写入下面因为是天然异步的 所以就是没有写进去就被你销毁了
//workbook.Dispose();
fileStream.Close();
}
catch (Exception EX)
{
//6.这边是报错的时候销毁流 不然导致文件锁死状态 只能重启电脑才能打开文件了
fs.Close();
workbook.Dispose();
}
}