這一篇來(lái)寫(xiě)操作Excel文件的第二種方式,COM組件的方式,也就是使用:Microsoft.Office.Interop.Excel.dll,這個(gè)dll大家可以直接在NuGet搜索下載

先來(lái)介紹下優(yōu)缺點(diǎn):
Microsoft.Office.Interop.Excel用起來(lái)也是非常強大、非常靈活,可以直接對Excel進(jìn)行一些常用操作
缺點(diǎn)就是這個(gè)肯定是要在機器上安裝Excel的,而且最后的資源釋放得處理好,否則會(huì )一直占用Excel進(jìn)程
實(shí)現功能:
使用Microsoft.Office.Interop.Excel.dll將Excel文件中的數據顯示到dataGridView
使用Microsoft.Office.Interop.Excel.dll對Excel文件進(jìn)行數據修改
開(kāi)發(fā)環(huán)境:
開(kāi)發(fā)工具:Visual Studio 2013
.NET Framework版本:4.5
實(shí)現代碼:
首先需要導入以下命名空間:
using Excel = Microsoft.Office.Interop.Excel;using System.IO;
//實(shí)例化一個(gè)datatable用來(lái)存儲數據DataTable dt = new DataTable();//指定excel所在路徑string excelPath = "d:\\1.xlsx";//可以用來(lái)表示type中的缺省值//object missing = System.Reflection.Missing.Value;//打開(kāi)excel的時(shí)候可以指定數據類(lèi)型//如:excel.Application.Workbooks.Open(excelPath,missing,typeof(decimal),typeof(int));//打開(kāi)excel文件Excel.Application excel = new Excel.Application();Excel.Workbook workbook = excel.Application.Workbooks.Open(excelPath);//獲取所有sheet頁(yè)Excel.Sheets sheets = workbook.Worksheets;//取第一個(gè)sheetExcel.Worksheet sheet = sheets[1];//獲取excel的列數int columnCount = sheet.UsedRange.Columns.Count;//獲取excel的行數int rowCount = sheet.UsedRange.Rows.Count;#region 區域讀取,效率相對較高//將第一行作為表頭Excel.Range rangeColumn = sheet.get_Range((Excel.Range)sheet.Cells[1, 1], (Excel.Range)sheet.Cells[1, columnCount]);object[,] arrColumn = rangeColumn.Value as object[,];foreach (object obj in arrColumn){string value = Convert.ToString(obj);dt.Columns.Add(value);}//將所有數據全部讀取出來(lái)。然后轉化為二維數組。//數據量很多時(shí)可以考慮分批/多線(xiàn)程讀取Excel.Range rangeRow = sheet.get_Range((Excel.Range)sheet.Cells[2, 1], (Excel.Range)sheet.Cells[rowCount, columnCount]);object[,] arrRow = rangeRow.Value as object[,];for (int i = 1; i <= arrRow.GetLength(0); i++){DataRow dr = dt.NewRow();for (int c = 1; c <= dt.Columns.Count; c++){string value = Convert.ToString(arrRow[i, c]);dr[c - 1] = value;}dt.Rows.Add(dr);}#endregion#region 單元格逐個(gè)讀取,效率很低/*//將第一行作為表頭for (int j = 1; j <= columnCount; j++){string value = Convert.ToString(((Excel.Range)sheet.Cells[1, j]).Value);dt.Columns.Add(value);}for (int i = 2; i <= rowCount; i++){DataRow dr = dt.NewRow();for (int j = 1; j <= columnCount; j++){string value = Convert.ToString(((Excel.Range)sheet.Cells[i, j]).Value);for (int c = 0; c < dt.Columns.Count; c++){dr[j - 1] = value;}}dt.Rows.Add(dr);}*/#endregion//釋放資源workbook.Close();excel.Quit();System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);GC.Collect();//若有必要,可以使用Process殺進(jìn)程進(jìn)行資源釋放//顯示到頁(yè)面dataGridView1.DataSource = dt;
我上面寫(xiě)了兩種讀取方式,可以注意下,酌情使用。
如果是要修改數據的話(huà),取到要修改的sheet后,直接指定到單元格進(jìn)行賦值即可,代碼如下:
//修改第二行第二列的數據為Hellosheet.Cells[2, 2] = "Hello";//保存workbook.Save();//釋放資源workbook.Close();excel.Quit();System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);GC.Collect();//若有必要,可以使用Process殺進(jìn)程進(jìn)行資源釋放
個(gè)人認為,此方法雖然很強大,但現在使用的應該不多,大部分會(huì )出現在一些老項目中,現在大多都會(huì )選擇使用NPOI的方式去操作Excel,更方便,更簡(jiǎn)單,更強大。下一篇我們介紹下使用NPOI的操作方式
由簡(jiǎn)入繁,拿來(lái)即用
后續精彩,持續關(guān)注
聯(lián)系客服