上一篇文章写了使用NPOI将DataTable直接写入EXCEL文件,但是问题就是没有表头而且不能保留原有格式。经过优化,写出了以下两个解决方案
1.在写入DataTable的时候添加一行表头(插入上一篇文章的代码中)
int rowIndex = 0;
int i = 0;
IRow data = sheet.CreateRow(rowIndex);
data.RowStyle = cellStyle;
foreach (var item in Hands)//循环遍历表头
{
data.CreateCell(i).SetCellValue(item.ToString());//添加表头
i++;
}
但是这样也有个坏处,就是写入的都是数据表自带的属性和内容,如果我想加个花里胡哨的表头或者把Bool型转为 √ 或者 × 怎么办呢,那就要用到第二种方法,多次循环并一次写入。
public static void PushValue(String ExcelPath, List<Mans> LMan)
{
string fileExt = Path.GetExtension(ExcelPath).ToLower();
HSSFWorkbook wk = null;
using (FileStream fs = File.Open(ExcelPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
wk = new HSSFWorkbook(fs);
fs.Close();
}
//把xls文件读入workbook变量里,之后就可以关闭了
int Index = 0;
ISheet sheet = wk.GetSheetAt(0);
foreach (var ps in LMan)
{
IRow row = sheet.CreateRow(Index + 6);
ICell cell = row.CreateCell(0);
cell.SetCellValue(ps.Name);
if (ps.IsAlive == "健在")
{
cell = row.CreateCell(15);
cell.SetCellValue("√");
}
if (ps.IsAlive == "死亡")
{
cell = row.CreateCell(16);
cell.SetCellValue("√");
}
///......内部执行语句....////
Index++;
}
using (FileStream fileStream = File.Open(ExcelPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
wk.Write(fileStream);
fileStream.Close();
}
}
而其中单行写入造成写入越来越慢的罪魁祸首就是
ISheet sheet = wk.GetSheetAt(0);
当文件越来越大的时候,获取表的速度就会越来越慢,而当文件行数超过2000时速度下降会非常厉害,如果需要写入大量文件就一定要直接一次写入。这个算法经过实测分批写入一份40W的数据文件仅需要半分钟,比直接一行行写入耗费几个小时快了不知道几个华莱士了