网站首页 > 博客文章 正文
这一篇来写操作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的操作方式
由简入繁,拿来即用
后续精彩,持续关注
猜你喜欢
- 2024-10-15 Python 速度慢,试试这个方法提高 1000 倍
- 2024-10-15 C# 文件操作浅析(c#代码文件)
- 2024-10-15 从零开始自学C#基础的第十五天——数组的基本用法
- 2024-10-15 浅谈C#取消令牌CancellationTokenSource
- 2024-10-15 总结了才知道,原来channel有这么多用法
- 2024-10-15 面向对象(8-15)异常类-C#编程零基础到入门学习
- 2024-10-15 .NET 6 中 LINQ 的改进(.net 调优)
- 2024-10-15 Log4net配置文件 C#(c# log4j)
- 2024-10-15 C# BIN文件读取以及CRC校验(匹配STM32F103)
- 2024-10-15 C#如何对String中的Contact/Join方法进行优化的
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)