C#解析Excel匯總

來源:互聯網
上載者:User

標籤:

    項目中多次用到對Excel的操作,想想有必要對這些方式、方法進行匯總,以便能夠在整體上有個清晰的認識,本篇文章主要討論使用C#對Excel操作、解析的三種方式:OleDb、Com組件、NPOI


1.OleDb

    該方法簡單快速,能夠操作高版本的Excel,缺點是不夠靈活,只能對Excel進行簡單的讀寫操作。在最開始接觸編程的時候,便有所耳聞:Object Link andembed(對象串連與嵌入),其主要目的是為了相容更多類型的資料來源。是較底層化的操作,在使用上非常複雜,另外一個特點是可以直接使用SQL語句對Excel資料來源進行操作:

   

<span style="white-space:pre"></span>/// <summary>        /// 從Excel中讀取資料到DataTable的方法        /// </summary>        /// <param name="strSavePath">檔案儲存路徑</param>        /// <param name="strSheetName">Sheet名稱</param>        /// <returns></returns>        protected DataTable ExcelToDataTable(string strSavePath, string strSheetName)        {            #region 讀取檔案Sheet,轉換為DataTable            string strConn;string strFileType = System.IO.Path.GetExtension(strSavePath);              if (string.IsNullOrEmpty(strFileType)) return null;if (strFileType == ".xls")                  strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strSavePath+ ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";              else                 strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strSavePath+ ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";             OleDbConnection conn = new OleDbConnection(strConn);            conn.Open();            OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [" + strSheetName + "$]", strConn);            DataSet myDataSet = new DataSet();            try            {                myCommand.Fill(myDataSet, "ExcelInfo");            }            catch            {                throw new Exception("設定檔的Sheet名稱配置錯誤!");            }            finally            {                if (conn.State == ConnectionState.Open)                  {                      conn.Close();                      myCommand.Dispose();                      conn.Dispose();                  }            }            DataTable table = myDataSet.Tables["ExcelInfo"].DefaultView.ToTable();            return table;            #endregion 讀取檔案Sheet,轉換為DataTable        }

2.Com組件

    非常靈活、完全的操作Excel,精確控制Excel文檔的各種屬性(儲存格式、樣式、內容、公式以及條件等),前提是電腦必須安裝Excel,會啟動Excel進程。程式需要添加引用:Microsoft.Office.Interop.Excel

    使用此方式對Excel的基本操作,可參考:C#操作Excel總結


3.NPOI

         顧名思義,NPOI是POI項目的.NET版本。POI是一個開源的Java讀寫Excel、Word等微軟OLE2組件文檔的項目。此種方式則避免了使用Com組件的缺點,不用在相應的環境機器上安裝Office,同時也結合了操作靈活的特點,讀取速度也相對較快。

    NPOI2.0主要組成:

    

Assembly名稱 模組/命名空間 說明
NPOI.DLL NPOI.POIFS OLE2/ActiveX文件屬性讀寫庫
NPOI.DLL NPOI.DDF 微軟Office Drawing讀寫庫
NPOI.DLL NPOI.HPSF OLE2/ActiveX文檔讀寫庫
NPOI.DLL NPOI.HSSF 微軟Excel BIFF(Excel 97-2003, doc)格式讀寫庫
NPOI.DLL NPOI.SS Excel公用介面及Excel公式計算引擎
NPOI.DLL NPOI.Util 基礎類庫,提供了很多實用功能,可用於其他讀寫檔案格式項目的開發
NPOI.OOXML.DLL NPOI.XSSF Excel 2007(xlsx)格式讀寫庫
NPOI.OOXML.DLL NPOI.XWPF Word 2007(docx)格式讀寫庫
NPOI.OpenXml4Net.DLL NPOI.OpenXml4Net OpenXml底層zip包讀寫庫
NPOI.OpenXmlFormats.DLL NPOI.OpenXmlFormats 微軟Office OpenXml對象關係庫


        使用NPOI匯入Excel如下:

<pre name="code" class="csharp">public static DataTable RenderFromExcel<T>(Stream excelFileStream) where T : new(){    using (excelFileStream)    {        using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))        {            using (ISheet sheet = workbook.GetSheetAt(0))//取第一個表            {                DataTable table = new DataTable();                IRow headerRow = sheet.GetRow(0);//第一行為標題列                int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells                int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1                //定義存取DB欄位名稱的數組                String[] strArrayHeader = new String[cellCount - headerRow.FirstCellNum];                //定義數組所需用的索引值                int intArrayIndex = 0;                //handling header.得到Excel匯入檔案的標題列字串數組                for (int i = 0; i < strArrayHeader.Length; i++)                {                    strArrayHeader[intArrayIndex] = headerRow.GetCell(i).StringCellValue;                    ++intArrayIndex;                }                //調用方法,將標題列文字描述轉換為對應的屬性名稱                strArrayHeader = ConfigOperater.QueryImportEntityProperty<T>(strArrayHeader);                intArrayIndex = 0;                for (int i = headerRow.FirstCellNum; i < cellCount; i++)                {                    //DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);                    DataColumn column = new DataColumn(strArrayHeader[intArrayIndex]);                    table.Columns.Add(column);                    ++intArrayIndex;                }                for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)                {                    IRow row = sheet.GetRow(i);                    DataRow dataRow = table.NewRow();                    if (row != null)                    {                        for (int j = row.FirstCellNum; j < cellCount; j++)                        {                            if (row.GetCell(j) != null)                                dataRow[j] = GetCellValue(row.GetCell(j));                        }                    }                    table.Rows.Add(dataRow);                }                return table;            }        }    }}




總結:

    在解析Excel上,三種方式各有千秋,其中NPOI更像是對前面兩種方式的中和,讓我們在操作Excel的上多了一個選擇,還是那句話,沒有什麼好與不好,只能說是在特定的情況下選擇更加適合的方式。


更多資料:

    C#操作Excel

       NPOI1.2教程

       C#讀取Excel幾種方法的體會




C#解析Excel匯總

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.