【C#】一款輕量級的Excel操作組件MiniExcel
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
一直以來,C#操作Excel格式文檔常用的方式有Office互操作組件、NPOI、EPPLUS等,每種方式各有其優(yōu)缺點。我們簡單匯總了一下,參見下表。 上表中,有商業(yè)的,也有免費的。就組件質(zhì)量來說,商業(yè)的肯定要比開源免費的好。不差錢的用戶建議優(yōu)先選擇商業(yè)組件庫。質(zhì)量和服務都有保障。免費的組件庫中,NPOI目前應該可以算是占有率最高了。 除了上面幾種外,我們現(xiàn)在還有一款簡單、高效避免OOM的輕量級,名為MiniExcel的類庫可以選擇。
MiniExcel使用比較方便,也有比較完善的文檔幫助(鏈接:https://gitee.com/dotnetchina/MiniExcel)。這里我們結合一個實際例子來簡單介紹如何使用。 1、需求說明 WinCC有兩個bool類型變量。分別表示Save和Export。其中Save為true時開始按照指定的時間間隔讀取數(shù)據(jù),為false時停止讀取。當Export為true時將讀取的數(shù)據(jù)寫到一個excel文件中,然后導出到指定的文件夾下面。 2、程序界面 因為完全后臺運行,所以界面比較簡單。只有一個過程消息顯示和兩個操作按鈕。兩個按鈕分別用于打開導出的文件夾和手動強制導出。 代碼也不復雜。界面加載后啟動一個線程對WinCC的這兩個變量進行監(jiān)視。當bSave為true時把數(shù)據(jù)保存到一個list中。當bSave為false時停止記錄。數(shù)據(jù)存儲的時間間隔我們簡單地用了一個計數(shù)器來實現(xiàn)。 //保存命令bool bSave = hmi.ReadTag("a1") == "1"; //導出命令bool bExport = hmi.ReadTag("a2") == "1"; if (bSave){ if (StartLog) { if (DataBuff.Count>=32000) { labMsg.Text = "信息: " + "記錄數(shù)超限,請先導出再記錄"; } else { labMsg.Text = "信息: " + "正在記錄數(shù)據(jù)......"; 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 = "信息: " + "暫停記錄數(shù)據(jù)......"; } } 當bExport為true時或者點擊手動導出按鈕時把數(shù)據(jù)保存到指定的文件夾下面。導出完成后清除list里面的數(shù)據(jù)。 //導出 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 = "信息: " + "創(chuàng)建新文件夾......"; 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 = "信息: " + "無數(shù)據(jù),請先記錄數(shù)據(jù)!"; } 從上面的代碼可以看出,MiniExcel的使用還是比較簡單的。寥寥數(shù)行即可實現(xiàn)將數(shù)據(jù)保存到Excel中。導出的文件效果如下圖所示。 這個小項目中我們只用到了MiniExcel的寫入和保存功能,其它的讀取、查詢功能沒有使用到,大家可以自行參考幫助。 該文章在 2023/10/16 9:45:42 編輯過 |
關鍵字查詢
相關文章
正在查詢... |