基於.net EF6 MVC5+WEB Api 的Web系統框架總結(4)-Excel文件讀、寫操作

  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文件讀、寫操作項目介紹分享完畢,欲聽更多精彩,且聽下回分解!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章