这一篇来写操作Excel文件的第二种方式,COM组件的方式,也就是使用:Microsoft.Office.Interop.Excel.dll,这个dll大家可以直接在NuGet搜索下载

先来介绍下优缺点:

Microsoft.Office.Interop.Excel用起来也是非常强大、非常灵活,可以直接对Excel进行一些常用操作

缺点就是这个肯定是要在机器上安装Excel的,而且最后的资源释放得处理好,否则会一直占用Excel进程


实现功能:

    • 使用Microsoft.Office.Interop.Excel.dll将Excel文件中的数据显示到dataGridView
    • 使用Microsoft.Office.Interop.Excel.dll对Excel文件进行数据修改

开发环境:

开发工具: Visual Studio 2013

.NET Framework版本:4.5

实现代码:

首先需要导入以下命名空间:

using Excel = Microsoft.Office.Interop.Excel; using System.IO;

//实例化一个datatable用来存储数据 DataTable dt = new DataTable(); //指定excel所在路径 string excelPath = "d:\1.xlsx"; //可以用来表示type中的缺省值 //object missing = System.Reflection.Missing.Value; //打开excel的时候可以指定数据类型 //如: excel.Application.Workbooks.Open(excelPath,missing,typeof(decimal),typeof(int)); //打开excel文件 Excel.Application excel = new Excel.Application(); Excel.Workbook workbook = excel.Application.Workbooks.Open(excelPath); //获取所有sheet页 Excel.Sheets sheets = workbook.Worksheets; //取第一个sheet Excel.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); } //将所有数据全部读取出来。然后转化为二维数组。 //数据量很多时可以考虑分批/多线程读取 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 单元格逐个读取,效率很低 /* //将第一行作为表头 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杀进程进行资源释放 //显示到页面 dataGridView1.DataSource = dt;

我上面写了两种读取方式,可以注意下,酌情使用。

如果是要修改数据的话,取到要修改的sheet后,直接指定到单元格进行赋值即可,代码如下:

//修改第二行第二列的数据为Hello sheet.Cells[2, 2] = "Hello"; //保存 workbook.Save(); //释放资源 workbook.Close(); excel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); GC.Collect(); //若有必要,可以使用Process杀进程进行资源释放

个人认为,此方法虽然很强大,但现在使用的应该不多,大部分会出现在一些老项目中,现在大多都会选择使用NPOI的方式去操作Excel,更方便,更简单,更强大。下一篇我们介绍下使用NPOI的操作方式

由简入繁,拿来即用

后续精彩,持续关注