这一篇来写操作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的操作方式
由简入繁,拿来即用
更多精彩,请关注微信公众号: