C# 操作Excel文件之COM组件方式「建议收藏」

C# 操作Excel文件之COM组件方式「建议收藏」这一篇来写操作Excel文件的第二种方式,COM组件的方式,也就是使用:Microsoft.Office.Interop.Excel.dll,这

欢迎大家来到IT世界,在知识的湖畔探索吧!

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

C# 操作Excel文件之COM组件方式「建议收藏」

先来介绍下优缺点:

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;

欢迎大家来到IT世界,在知识的湖畔探索吧!

欢迎大家来到IT世界,在知识的湖畔探索吧! //实例化一个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的操作方式

由简入繁,拿来即用

后续精彩,持续关注

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/18366.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信