机房重构之导出Excel表

我们都知道实现某一项功能的途径都不唯一,导表也是如此;所以咱们一块来看看究竟有哪些方式帮助咱们从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();

当然了,最好的方式是把这些代码片段写到模块里面,方便后期使用的直接调用,解决代码冗余问题,正在探索之中,各位读者如果有更好的方式,欢迎在评论区交流

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 49
    评论
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值