【C#常用方法】2.DataTable(或DataSet)與Excel文件之間的導出與導入(使用NPOI)

来源:https://www.cnblogs.com/512kd/archive/2019/11/04/11791433.html
-Advertisement-
Play Games

DataTable與Excel之間的互導 1.項目添加NPOI的引用 NPOI項目簡介: NPOI是一個開源的C#讀寫Excel、WORD等微軟OLE2組件文檔的項目,特點是可以在沒有安裝Office的情況下對Word或Excel文檔進行讀寫操作。並且對老版本Office(2003-)與新版本Off ...


DataTable與Excel之間的互導

1.項目添加NPOI的引用 


 

  • NPOI項目簡介:
  NPOI是一個開源的C#讀寫Excel、WORD等微軟OLE2組件文檔的項目,特點是可以在沒有安裝Office的情況下對Word或Excel文檔進行讀寫操作。並且對老版本Office(2003-)與新版本Office(2007+)均有較好的支持。NPOI功能非常強大,可以操作Excel或Word文檔的各個細節,如果你對NPOI想進行細緻的學習,淘寶上有專門有書來講NPOI,當然也可以訪問NPOI的官方網站查看他們的文檔與Demo。
  • 關於Excel擴展名.xls與.xlsx簡介:
  .xls是Excel2003及以前的版本所保存的文件格式,老版本及新版本的Excel對其均可相容,.xlsx是Excel2007及以後的Excel版本所預設保存的文件格式,這種格式只能被Excel2007及以後的版本所相容,老版本Excel無法打開。
  • NPOI項目的引用:

  使用VisualStudio,打開NuGet包管理器,搜索NPOI,並添加到當前項目。

  

 

 

 

2.將Excel文件導入到DataSet(DataTable)中


 

  因為一個Excel文件可以有多個sheet頁,所以C#方法最好使用與Excel文檔結構相對應的DataSet類,即將DataSet(可以包含多個DataTable)導出為Excel,DataSet中的每個DataTabel對應一個Excel中的Sheet頁。

  

  方法解釋:此方法將一個Excel文件導入為一個DataSet,Excel中每個Sheet頁都會生成一個DataTable存放在導入的DataSet中,並且每個DataTable的TableName與每個Sheet的SheetName一一對應。參數isFirstLineColumnName用來表示Excel文件各表第一行是否為表頭。

  代碼如下:

        /// <summary>
        /// 讀取Execl數據到DataTable(DataSet)中
        /// </summary>
        /// <param name="filePath">指定Execl文件路徑</param>
        /// <param name="isFirstLineColumnName">設置第一行是否是列名</param>
        /// <returns>返回一個DataTable數據集</returns>
        public static DataSet ExcelToDataSet(string filePath, bool isFirstLineColumnName)
        {
            DataSet dataSet = new DataSet();
            int startRow = 0;
            try
            {
                using (FileStream fs = File.OpenRead(filePath))
                {
                    IWorkbook workbook = null;
                    // 如果是2007+的Excel版本
                    if (filePath.IndexOf(".xlsx") > 0)
                    {
                        workbook = new XSSFWorkbook(fs);
                    }
                    // 如果是2003-的Excel版本
                    else if (filePath.IndexOf(".xls") > 0)
                    {
                        workbook = new HSSFWorkbook(fs);
                    }
                    if (workbook != null)
                    {
                        //迴圈讀取Excel的每個sheet,每個sheet頁都轉換為一個DataTable,並放在DataSet中
                        for (int p = 0; p < workbook.NumberOfSheets; p++)
                        {
                            ISheet sheet = workbook.GetSheetAt(p);
                            DataTable dataTable = new DataTable();
                            dataTable.TableName = sheet.SheetName;
                            if (sheet != null)
                            {
                                int rowCount = sheet.LastRowNum;//獲取總行數
                                if (rowCount > 0)
                                {
                                    IRow firstRow = sheet.GetRow(0);//獲取第一行
                                    int cellCount = firstRow.LastCellNum;//獲取總列數

                                    //構建datatable的列
                                    if (isFirstLineColumnName)
                                    {
                                        startRow = 1;//如果第一行是列名,則從第二行開始讀取
                                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                                        {
                                            ICell cell = firstRow.GetCell(i);
                                            if (cell != null)
                                            {
                                                if (cell.StringCellValue != null)
                                                {
                                                    DataColumn column = new DataColumn(cell.StringCellValue);
                                                    dataTable.Columns.Add(column);
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                                        {
                                            DataColumn column = new DataColumn("column" + (i + 1));
                                            dataTable.Columns.Add(column);
                                        }
                                    }

                                    //填充行
                                    for (int i = startRow; i <= rowCount; ++i)
                                    {
                                        IRow row = sheet.GetRow(i);
                                        if (row == null) continue;

                                        DataRow dataRow = dataTable.NewRow();
                                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                                        {
                                            ICell cell = row.GetCell(j);
                                            if (cell == null)
                                            {
                                                dataRow[j] = "";
                                            }
                                            else
                                            {
                                                //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
                                                switch (cell.CellType)
                                                {
                                                    case CellType.Blank:
                                                        dataRow[j] = "";
                                                        break;
                                                    case CellType.Numeric:
                                                        short format = cell.CellStyle.DataFormat;
                                                        //對時間格式(2015.12.5、2015/12/5、2015-12-5等)的處理
                                                        if (format == 14 || format == 31 || format == 57 || format == 58)
                                                            dataRow[j] = cell.DateCellValue;
                                                        else
                                                            dataRow[j] = cell.NumericCellValue;
                                                        break;
                                                    case CellType.String:
                                                        dataRow[j] = cell.StringCellValue;
                                                        break;
                                                }
                                            }
                                        }
                                        dataTable.Rows.Add(dataRow);
                                    }
                                }
                            }
                            dataSet.Tables.Add(dataTable);
                        }

                    }
                }
                return dataSet;
            }
            catch (Exception)
            {
                return null;
            }
        }    

 

3.將DataSet(DataTable)導出為一個Excel文件


 

  代碼解釋:我們可以將要導出的DataTable都放入一個DataSet中,將DataSet導出為Excel文件,方法參數OutPath用來傳入導出Excel文件的路徑,路徑可以加Excel的擴展名(.xls或.xlsx),也可以不加,不加預設導出Excel文件擴展名為.xls。  

        /// <summary>
        /// 將DataTable(DataSet)導出到Execl文檔
        /// </summary>
        /// <param name="dataSet">傳入一個DataSet</param>
        /// <param name="Outpath">導出路徑(可以不加擴展名,不加預設為.xls)</param>
        /// <returns>返回一個Bool類型的值,表示是否導出成功</returns>
        /// True表示導出成功,Flase表示導出失敗
        public static bool DataTableToExcel(DataSet dataSet, string Outpath)
        {
            bool result = false;
            try
            {
                if (dataSet == null || dataSet.Tables == null || dataSet.Tables.Count == 0 || string.IsNullOrEmpty(Outpath))
                    throw new Exception("輸入的DataSet或路徑異常");
                int sheetIndex = 0;
                //根據輸出路徑的擴展名判斷workbook的實例類型
                IWorkbook workbook = null;
                string pathExtensionName = Outpath.Trim().Substring(Outpath.Length - 5);
                if (pathExtensionName.Contains(".xlsx"))
                {
                    workbook = new XSSFWorkbook();
                }
                else if(pathExtensionName.Contains(".xls"))
                {
                    workbook = new HSSFWorkbook();
                }
                else
                {
                    Outpath = Outpath.Trim() + ".xls";
                    workbook = new HSSFWorkbook();
                }
                //將DataSet導出為Excel
                foreach (DataTable dt in dataSet.Tables)
                {
                    sheetIndex++;
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        ISheet sheet = workbook.CreateSheet(string.IsNullOrEmpty(dt.TableName) ? ("sheet" + sheetIndex) : dt.TableName);//創建一個名稱為Sheet0的表
                        int rowCount = dt.Rows.Count;//行數
                        int columnCount = dt.Columns.Count;//列數

                        //設置列頭
                        IRow row = sheet.CreateRow(0);//excel第一行設為列頭
                        for (int c = 0; c < columnCount; c++)
                        {
                            ICell cell = row.CreateCell(c);
                            cell.SetCellValue(dt.Columns[c].ColumnName);
                        }

                        //設置每行每列的單元格,
                        for (int i = 0; i < rowCount; i++)
                        {
                            row = sheet.CreateRow(i + 1);
                            for (int j = 0; j < columnCount; j++)
                            {
                                ICell cell = row.CreateCell(j);//excel第二行開始寫入數據
                                cell.SetCellValue(dt.Rows[i][j].ToString());
                            }
                        }
                    }
                }
                //向outPath輸出數據
                using (FileStream fs = File.OpenWrite(Outpath))
                {
                    workbook.Write(fs);//向打開的這個xls文件中寫入數據
                    result = true;
                }
                return result;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }

 

4.上面兩個方法的使用方法 


 

  將上面兩個方法都定義在ExcelHelper類中,使用如下代碼使用:

        DataSet set = ExcelHelper.ExcelToDataTable("test.xlsx", true);//Excel導入
        bool b = ExcelHelper.DataTableToExcel(set, "test2.xlsx");//導出Excel

 


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

-Advertisement-
Play Games
更多相關文章
  • toc: true title: 滴滴實時計算發展之路及平臺架構實踐 date: 2019 08 25 tags: Flink 大數據 滴滴的核心業務是一個實時線上服務,因此具有豐富的實時數據和實時計算場景。本文將介紹滴滴實時計算發展之路以及平臺架構實踐。 <! more 實時計算演進 隨著滴滴業務 ...
  • toc: true title: Flink 從 0 到 1 學習 —— Flink Data transformation(轉換) date: 2018 11 04 tags: Flink 大數據 流式計算 前言 在第一篇介紹 Flink 的文章 "《《從0到1學習Flink》—— Apache ...
  • 官網:http://automapper.org/ 文檔:https://automapper.readthedocs.io/en/latest/index.html GitHub:https://github.com/AutoMapper/AutoMapper/blob/master/docs/i ...
  • 無論是網站還是APP分頁功能都是必不可少的。為什麼使用分頁呢? 1,載入速度快,不會占用伺服器太多資源,減少伺服器壓力。 2,減少資料庫壓力。 3,提升用戶體驗。 那麼我們常用的分頁方法有兩種。 1,真分頁:每頁都會從資料庫讀取少量數據,優點就是讀取數據量少,性能非常好,大型網站往往採用這種方式。 ...
  • 從一段字元串中,提取中文、英文、數字 中文字元30Margin中文字元40HorizontalAlignment 正則表達式: Regex使用: 註: Regex只會返回第一個匹配項 如果需要獲取正則對應的所有匹配項,可以使用 Regex.Matches ...
  • C# -- 模擬撲克牌發牌 1. User 類: 玩家 public class User { private List<PaperCard> listCard = new List<PaperCard>(); public string Name { get; set; } public User ...
  • using System; namespace program { class program1 { static void Main(string[] args) { program1 fenshu = new program1(); fenshu.Panduan(); program1 tian ...
  • Aspose.Slides for .NET是獨特的演示處理API,使應用程式能夠讀取,編寫,修改和轉換PowerPoint演示文稿。作為獨立的API,它提供了管理PowerPoint關鍵功能的功能,例如管理文本,形狀,表格和動畫,向幻燈片添加音頻和視頻,預覽幻燈片等等。 近期,Aspose.Sli ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...