网站首页 > 技术文章 正文
这一篇来写操作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-11 Windows编程系列:遍历文件(C++和C#实现)
- 2024-10-11 C# 使用FluentFTP上传文件至FTP,非常实用,建议收藏
- 2024-10-11 vs2013环境下打包C#项目,带卸载功能
- 2024-10-11 使用DocFX生成C#文档教程(c#生成pdf 或word)
- 2024-10-11 FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作
- 2024-10-11 C# 压缩PDF文件(c# 图片压缩)
- 2024-10-11 C#将文件大小转换整理成几G几M几K的形式
- 2024-10-11 C#中的CSV文件读写(c# csv文件)
- 2024-10-11 C# 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)
- 2024-10-11 C#语言简介与开发环境(c#语言用来开发什么)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)