我们都知道实现某一项功能的途径都不唯一,导表也是如此;所以咱们一块来看看究竟有哪些方式帮助咱们从VS的Winform窗体中导出Excel表;
一、微软推荐:Microsoft.Office.Interop.Excel
说明:程序会启动一个Excel进程,然后和Excel进程进行通讯来针对Excel操作。
优点:功能qi强大,能够使用Excel的所有功能,要求装Excel,这也是为什么微软推荐的yuan原因;
缺点:因为会启动Excel进程,所以不适用于服务器;
二、微软应用:“Microsoft Office 16.0 Object Library”与“Microsoft Excel 16.0 Object Library”
位置:引用管理器中COM(外置引用,非.Net平台)添加即可;同时我们也可以看到摆明ji就是我们安装的Office的路径;
优点:不光可以caou操作Excel,同时还兼具Office旗下的多种产品;
三、微软提供:Microsoft Jet OLEDb
说明:通过Microsoft Jet引擎提供程序连接Excel,并把Excel当做数据源来读写
优点:简单快速,可以操作高版本的Excel
缺点:xi效率较低,功能较差
四、微软提供:OPenXml
说明:Office 老版本在设计的时候,为了更好的和其它应用交互,便是通过XML+zip技术来实现产品等组件的本地保存,所以产品本质就是ZIP的压缩包,包内是组织好的XML文件;
五、第三方开源组件:NPOI
说明:NPOI能够分析Excel文件的格式,有一部分是基于Open Xml来开发的;
优点:没有安全性、性能的问题,不依赖于Excel,节约资源,常用于Asp.net中;
缺点:老版本仅仅支持.Xls后缀(07之前),不知道新版本的怎么样,新版本我仅仅用了写入,有兴趣的伙伴可以尝试读取,看看是否支持高版本的Excel;
--------------------------------------------------------------------------------------------------------------------------------------------------
针对上面常见的(好几种几乎都不怎么用了)该如何选择呢?
正常使用的话,我们应该抛弃前三种,因为性价比不高,所以我们选择第四种或者第五种;
那么这两者又有什么区别呢?
OpenXml:类似文件流处理,防止一次性处理数据,存储巨大数据量;
NPOI:把数据加载到内存中一次性处理,因此一旦数据量过大,便开始产生溢出;
解决:把需要读取的数据通过文件流方式,导出到Excel中,可有效的防止数据溢出;
内部添加方式(外部引用也可以):
------------------------<NPOI方式将DataGridView组件中的数据导出到Excel>-------------------
#region 导出数据至表中
var list = wLIFacade.GetList(id, firstTime, lastTime, dtpFirst.ShowCheckBox && dtpLast.ShowCheckBox);
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("用户工作记录");//Excel表名
#region 编辑表中首行名称
IRow rowTitle = sheet.CreateRow(0);
ICell cellTitle0 = rowTitle.CreateCell(0);
cellTitle0.SetCellValue("编号");
ICell cellTitle1 = rowTitle.CreateCell(1);
cellTitle1.SetCellValue("卡号");
ICell cellTitle2 = rowTitle.CreateCell(2);
cellTitle2.SetCellValue("类型");
//按照上方依次添加表中需要的字段即可
#endregion
int rowIndex = 1;
foreach (var ri in list)
{
IRow rowData = sheet.CreateRow(rowIndex++);
ICell cellData0 = rowData.CreateCell(0);
cellData0.SetCellValue(ri.Serial);
ICell cellData1 = rowData.CreateCell(1);
cellData1.SetCellValue(ri.UserName);
ICell cellData2 = rowData.CreateCell(2);
cellData2.SetCellValue(ri.UType);
ICell cellData3 = rowData.CreateCell(3);
cellData3.SetCellValue(ri.LoginTime.ToString());
ICell cellData4 = rowData.CreateCell(4);
cellData4.SetCellValue(ri.LogoutTime.ToString());
ICell cellData5 = rowData.CreateCell(5);
cellData5.SetCellValue(ri.Status);
ICell cellData6 = rowData.CreateCell(6);
cellData6.SetCellValue(ri.Computer);
}
FileStream stream = new FileStream(@"..\..\..\ExportExcel\用户工作记录查询.xls", FileMode.Create);//通过文件流的方式写入,防止数据量过大时,数据溢出
workbook.Write(stream);
stream.Close();
stream.Dispose();
当然了,最好的方式是把这些代码片段写到模块里面,方便后期使用的直接调用,解决代码冗余问题,正在探索之中,各位读者如果有更好的方式,欢迎在评论区交流