C# 操作Excel文件之COM组件方式

这一篇来写操作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的操作方式

由简入繁,拿来即用

更多精彩,请关注微信公众号:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值