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