標籤:
項目中多次用到對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匯總