Excel文件讀、寫可以使用Office自帶的庫(Microsoft.Office.Interop.Excel),前提是本機須安裝office才能運行,且不同的office版本之間可能會有相容問題。還可以使用NPOI,在不安裝office的時候也是可以讀寫的,速度很快。當然,還有支持Excel200 ...
Excel文件讀、寫可以使用Office自帶的庫(Microsoft.Office.Interop.Excel),前提是本機須安裝office才能運行,且不同的office版本之間可能會有相容問題。
還可以使用NPOI,在不安裝office的時候也是可以讀寫的,速度很快。當然,還有支持Excel2007以上版本的OpenXml。以及其他一些開源項目,由於本人不太熟悉,在此不做過多介紹。
為瞭解決煩人Office版本相容問題,本項目-ShiQuan.Offices 決定採用基於NPOI,進行Excel文件讀、寫操作。
本項目目前實現內容包括:
1、直接根據DataTable,生成Excel文件內容。
2、根據列表設置和DataTable,生成Excel文件內容。
3、根據Excel模板,使用模板設置,生成Excel文件內容。
4、讀取Excel內容,返回DataTable。
本項目基於LGPL3.0開源,供大家參考、使用,歡迎提供寶貴意見!
項目源碼:https://gitee.com/ShiQuanSoft/ShiQuan.Offices
下麵介紹分享如何使用該項目-ShiQuan.Offices。
首先,創建ConsoleApp測試項目,添加程式包安裝:
1、先我們試下,普通的DataTable生成Excel文件是怎樣的?
try { //取出數據源 DataTable dtData = new DataTable(); dtData.Columns.Add("account"); dtData.Columns.Add("realname"); dtData.Columns.Add("birthday"); dtData.Columns.Add("description"); dtData.Columns.Add("remark"); DataRow dr = dtData.NewRow(); dr["account"] = "賬戶"; dr["realname"] = "姓名"; dr["birthday"] = "2000-05-25"; dr["description"] = "說明"; dr["remark"] = "說明";/*多餘欄位,不會數據導出*/ dtData.Rows.Add(dr); Console.WriteLine("生成2007以上版本Excel..."); NPOIHelper.SaveToExcel(dtData, "XSSFWorkbook.xlsx"); Console.WriteLine("生成2003版本Excel..."); NPOIHelper.SaveToExcel(dtData, "HSSFWorkbook.xls"); } catch (Exception ex) { Console.WriteLine("導出異常:" + ex.Message); }
運行效果:
2、一般從系統中導出Excel,我們都將採用中文標題,設置相應的數據列格式,對齊方式等信息?
try { //取出數據源 DataTable dtData = new DataTable(); dtData.Columns.Add("account"); dtData.Columns.Add("realname"); dtData.Columns.Add("gender"); dtData.Columns.Add("birthday"); dtData.Columns.Add("enabled"); dtData.Columns.Add("price"); dtData.Columns.Add("percent"); dtData.Columns.Add("money"); dtData.Columns.Add("remark"); DataRow dr = dtData.NewRow(); dr["account"] = "賬戶"; dr["realname"] = "姓名"; dr["gender"] = "0";/*0:女*/ dr["birthday"] = "2000-05-25"; dr["price"] = "10.5656"; dr["percent"] = "0.56"; dr["money"] = "1000.56"; dr["enabled"] = "1";/*是否啟用:1:是*/ dr["remark"] = "說明";/*多餘欄位,不會數據導出*/ dtData.Rows.Add(dr); /*設置導出格式*/ ColumnCollection colModel = new ColumnCollection(); colModel.Add("account", "賬戶"); colModel.Add("realname", "姓名"); colModel.Add("birthday", "出生日期", typeof(DateTime), "yyyy年MM月dd日"); colModel.Add("price", "保留兩位",typeof(double), "#0.00"); colModel.Add("percent", "百分比", typeof(double), "0.00%"); colModel.Add(new ColumnModel() { Name = "money", Desc = "貨幣格式", Type = typeof(double), Format = "¥#,##0", TextAlign = ColumnAlign.Right }); colModel.Add("gender", "性別", new DataOptions("0:女,1:男".Split(','))); colModel.Add(new ColumnModel[] { new ColumnModel() { Name = "enabled", Desc = "是否啟用", Options = new DataOptions("0:否,1:是".Split(',')), TextAlign = ColumnAlign.Center } }); Console.WriteLine("保存Excel..."); //調用導出方法 NPOIHelper.SaveToExcel(dtData,colModel, "用戶信息.xls"); Console.WriteLine("Excel保存成功!"); } catch (Exception ex) { Console.WriteLine("導出異常:" + ex.Message); }
運行效果:
3、當我們使用普通的設置數據列格式,還不能滿足要求時,此時,只能採用預定的Excel模板,使用數據填充方式,生成Excel文件?
var fileName = "根據模板生成Excel.xlsx"; try { var templateFile = "templateFile.xlsx"; System.IO.File.WriteAllBytes(templateFile, ConsoleApp.Properties.Resources.template); List<TemplateModel> list = new List<TemplateModel>(); list.Add(new TemplateModel() { RowIndex = 1, ColIndex = 0, Value = "賬號" }); list.Add(new TemplateModel() { RowIndex = 1, ColIndex = 1, Value = "名稱" }); list.Add(new TemplateModel() { RowIndex = 1, ColIndex = 2, Value = "2000-09-01" }); list.Add(new TemplateModel() { RowIndex = 1, ColIndex = 3, Value = "備註" }); list.Add(new TemplateModel() { RowIndex = 2, ColIndex = 0, Value = "賬號" }); list.Add(new TemplateModel() { RowIndex = 3, ColIndex = 1, Value = "名稱" }); list.Add(new TemplateModel() { RowIndex = 4, ColIndex = 2, Value = "2000-09-01" }); list.Add(new TemplateModel() { RowIndex = 5, ColIndex = 3, Value = "備註" }); Console.WriteLine("根據模板生成Excel..."); NPOIHelper.SaveToExcel(templateFile,"sheet1", list, fileName); Console.WriteLine("Excel保存成功!"); } catch (Exception ex) { Console.WriteLine("生成異常:" + ex.Message); }
定義的模板:
運行效果:
4、生成Excel文件方法介紹完畢,下麵我們看下怎麼讀取Excel文件內容,我們以直接讀取模板生成的Excel文件為例?
try { Console.WriteLine("讀取Excel內容..."); DataTable dtData = NPOIHelper.ReadToTable(fileName); StringBuilder fileContent = new StringBuilder(); //標題 foreach (DataColumn dc in dtData.Columns) { fileContent.Append(dc.ColumnName + "\t"); } fileContent.AppendLine(); foreach (DataRow dr in dtData.Rows) { foreach (DataColumn dc in dtData.Columns) { if (dr[dc.ColumnName] == DBNull.Value) fileContent.Append("\t"); else fileContent.Append(dr[dc.ColumnName].ToString() + "\t"); } fileContent.AppendLine(); } Console.WriteLine("文件內容:"); Console.WriteLine(fileContent.ToString()); } catch (Exception ex) { Console.WriteLine("生成異常:" + ex.Message); }
運行效果:
至此 ShiQuan.Offices Excel文件讀、寫操作項目介紹分享完畢,欲聽更多精彩,且聽下回分解!