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

来源:https://www.cnblogs.com/henxiao25/archive/2019/09/21/11565500.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 目錄 1. 分支結構 1.1 初步介紹 1.2 使用案例 1.3 練習 2.迴圈結構 1.1 初步介紹 1.2 使用案例 目錄 1. 分支結構 1.1 初步介紹 1.2 使用案例 1.3 練習 2.迴圈結構 1.1 初步介紹 1.2 使用案例 1. 分支結構 1.1 初步介紹 1.2 ...
  • ZooKeeper技術的極少以及ZooKeeper集群的搭建 ...
  • 0. 序 我從一生下來就呆在這個昏暗的地方。 我不明白為什麼程式員這麼喜歡 Dark Mode,Brighten Mode 才是我的最愛。聽說最近連 iphone 都開始支持 Dark Mode 了,沒話講。。。說好的絕不妥協呢? 我周圍是熙熙攘攘的函數群,穿插著變數聲明和巨集定義。 在我們這裡,函數 ...
  • 一、前言 應聘IC前端相關崗位時,FIFO是最常考也是最基本的題目。FIFO經常用於數據緩存、位寬轉換、非同步時鐘域處理。隨著晶元規模的快速增長,靈活的system verilog成為設計/驗證人員的基本功。本文從簡易版的同步FIFO開始,熟悉IP設計與驗證的基礎技能。 二、IP設計 FIFO這一IP ...
  • 背景 運維人員反饋一個容器化的java程式每跑一段時間就會出現OOM問題,重啟後,間隔大概兩天後復現。 問題調查 一查日誌 由於是容器化部署的程式,登上主機後使用docker logs ContainerId查看輸出日誌,並沒有發現任何異常輸出。 使用docker stats查看容器使用的資源情況, ...
  • #set指令 #set指令用於向一個變數或者對象賦值。 格式: #set($var = value) LHS是一個變數,不要使用特殊字元例如英文句號等,不能用大括弧括起來。測試發現#set($user.name = 'zhangsan'),#set(${age} = 18)均賦值失敗。 RHS可以是 ...
  • 前言 說實話,這章本來不打算講的,因為配置多數據源的網上有很多類似的教程。但是最近因為項目要用到分庫分表,所以讓我研究一下看怎麼實現。我想著上一篇博客講了多環境的配置,不同的環境調用不同的資料庫,那接下來就將一個環境用到多個庫也就講了。所以才有了這篇文章。 我們先來看一下今天項目的項目結構,在上篇博 ...
  • 最近做了一些.NET Core的程式,有在Windows下運行的 有在CentOS 下運行的,Windows下運行的還好,對Windows下還算比較熟悉了,但CentOS 下 每次都是找筆記支持命令 於是今天晚上就乾脆把以.NET Core程式已服務形式啟動的代碼封裝了下,代碼 主要是便於安裝。 我 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...