【C#】一款轻量级的Excel操作组件MiniExcel
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
一直以来,C#操作Excel格式文档常用的方式有Office互操作组件、NPOI、EPPLUS等,每种方式各有其优缺点。我们简单汇总了一下,参见下表。 上表中,有商业的,也有免费的。就组件质量来说,商业的肯定要比开源免费的好。不差钱的用户建议优先选择商业组件库。质量和服务都有保障。免费的组件库中,NPOI目前应该可以算是占有率最高了。 除了上面几种外,我们现在还有一款简单、高效避免OOM的轻量级,名为MiniExcel的类库可以选择。
MiniExcel使用比较方便,也有比较完善的文档帮助(链接:https://gitee.com/dotnetchina/MiniExcel)。这里我们结合一个实际例子来简单介绍如何使用。 1、需求说明 WinCC有两个bool类型变量。分别表示Save和Export。其中Save为true时开始按照指定的时间间隔读取数据,为false时停止读取。当Export为true时将读取的数据写到一个excel文件中,然后导出到指定的文件夹下面。 2、程序界面 因为完全后台运行,所以界面比较简单。只有一个过程消息显示和两个操作按钮。两个按钮分别用于打开导出的文件夹和手动强制导出。 代码也不复杂。界面加载后启动一个线程对WinCC的这两个变量进行监视。当bSave为true时把数据保存到一个list中。当bSave为false时停止记录。数据存储的时间间隔我们简单地用了一个计数器来实现。 //保存命令bool bSave = hmi.ReadTag("a1") == "1"; //导出命令bool bExport = hmi.ReadTag("a2") == "1"; if (bSave){ if (StartLog) { if (DataBuff.Count>=32000) { labMsg.Text = "信息: " + "记录数超限,请先导出再记录"; } else { labMsg.Text = "信息: " + "正在记录数据......"; Models.DataModel dm = new Models.DataModel(); dm.DT = DateTime.Now.ToString(); dm.Data1 = hmi.ReadTag("PAR1"); dm.Data2 = hmi.ReadTag("PAR2"); dm.Data3 = hmi.ReadTag("PAR3"); dm.Data4 = hmi.ReadTag("PAR4"); dm.Data5 = hmi.ReadTag("PAR5"); dm.Data6 = hmi.ReadTag("PAR6"); dm.Data7 = hmi.ReadTag("PAR7"); dm.Data8 = hmi.ReadTag("PAR8"); DataBuff.Add(dm); } } count++; if (count>=timespace) { StartLog = true; count = 0; } } Else { if (DataBuff.Count>0 && !bSave) { labMsg.Text = "信息: " + "暂停记录数据......"; } } 当bExport为true时或者点击手动导出按钮时把数据保存到指定的文件夹下面。导出完成后清除list里面的数据。 //导出 if (ExportPN.P(bExport) || ManualExport) { //手动导出命令 ManualExport = false; if (DataBuff.Count>0) { StartLog = true; count = 0; string MainPath = INIOperation.INIGetStringValue(CommData.ConfigPath, "Export", "Path", string.Empty); //判断路径是否存在 string Path = MainPath + DateTime.Now.ToString("yyyy-MM") + "/"; if (Directory.Exists(Path)) { // } else { DirectoryInfo directoryInfo = new DirectoryInfo(Path); labMsg.Text = "信息: " + "创建新文件夹......"; directoryInfo.create(); } //写Excel var config = new OpenXmlConfiguration { DynamicColumns = new DynamicExcelColumn[] { new DynamicExcelColumn("DT"){Width=20,Name="日期时间"}, new DynamicExcelColumn("Data1"){Width=15,Name=AliasList[0],Ignore=string.IsNullOrEmpty(AliasList[0])}, new DynamicExcelColumn("Data2"){Width=15,Name=AliasList[1],Ignore=string.IsNullOrEmpty(AliasList[1])}, new DynamicExcelColumn("Data3"){Width=15,Name=AliasList[2],Ignore=string.IsNullOrEmpty(AliasList[2])}, new DynamicExcelColumn("Data4"){Width=15,Name=AliasList[3],Ignore=string.IsNullOrEmpty(AliasList[3])}, new DynamicExcelColumn("Data5"){Width=15,Name=AliasList[4],Ignore=string.IsNullOrEmpty(AliasList[4])}, new DynamicExcelColumn("Data6"){Width=15,Name=AliasList[5],Ignore=string.IsNullOrEmpty(AliasList[5])}, new DynamicExcelColumn("Data7"){Width=15,Name=AliasList[6],Ignore=string.IsNullOrEmpty(AliasList[6])}, new DynamicExcelColumn("Data8"){Width=15,Name=AliasList[7],Ignore=string.IsNullOrEmpty(AliasList[7])} } }; MiniExcelLibs.MiniExcel.SaveAs(FilePath, DataBuff, configuration: config); DataBuff.Clear(); labMsg.Text = "信息: " + "导出文件成功!"; } else labMsg.Text = "信息: " + "无数据,请先记录数据!"; } 从上面的代码可以看出,MiniExcel的使用还是比较简单的。寥寥数行即可实现将数据保存到Excel中。导出的文件效果如下图所示。 这个小项目中我们只用到了MiniExcel的写入和保存功能,其它的读取、查询功能没有使用到,大家可以自行参考帮助。 该文章在 2023/10/16 9:45:42 编辑过 |
关键字查询
相关文章
正在查询... |