ClosedXML是以OpenXML为基础读写xlsx文件的类库。
1.读xlsx文件
首先 using ClosedXML.Excel;
然后
using (XLWorkbook wb = new XLWorkbook(@"E:\JOB\1.xlsx"))
{
IXLWorksheet ws = wb.Worksheets.First();//获得第一个Sheet。
//通过Worksheet(int position);函数获得sheet,position从1开始。
//不能使用ws.RowCount();获得很大的值。
//遍历所有可使用的行
var rows = ws.RowsUsed()
foreach (var row in rows)
{
//取得cell的值
string temps = row.Cell(columnIndex).GetString();//columnIndex列索引值从1开始
//遍历所有的Cells
foreach(var cell in row.Cells())
{
string tempst = cell.Value.ToString();
}
}
//一般情况下读的时候会过滤行,最常见的过滤掉首行因为他是标题。
var rows = ws.RowsUsed().Skip(1);//1是过滤掉行数,返回的结果是行的集合
var row = ws.RowsUsed().First().RowBelow(2);//2是过滤掉的函数。返回的结果是单行。他返回第三行
}
2.写xlsx文件
using (XLWorkbook ww = new XLWorkbook())
{
using (IXLWorksheet wws = ww.Worksheets.Add("Sheet1"))//sheet 名称
{
wws.Row(1,2).Value = "xxxx"; //第一行第二列赋值
//这里随便使用,只需使用行和列即可。当然也可以使用"A1"单独访问单元格。
}
ww.SaveAs(@"D:\1.xlsx");
}
注意:此部分是后添加的。实际测试按照上面的方法写文件。出现错误原因是他的属性没有设置。
wb4.Properties.Author = "theAuthor";
wb4.Properties.Title = "theTitle";
wb4.Properties.Subject = "theSubject";
wb4.Properties.Category = "theCategory";
wb4.Properties.Keywords = "theKeywords";
wb4.Properties.Comments = "theComments";
wb4.Properties.Status = "theStatus";
wb4.Properties.LastModifiedBy = "theLastModifiedBy";
wb4.Properties.Company = "theCompany"
wb4.Properties.Manager = "theManager";
假如新创建一定设置上面的值,修改可能不需要!
由于使用的过程中没有涉及到样式,因此这写就不介绍了。网上很多,但是读的时候遍历和过滤行很少。
说完使用,说说他的弊病:非常耗内存,最后竟然发生System.OutOfMemory错误。无法执行。
我的应用是打开一个xlsx文件然后在另外两个xlsx文件中查询。调试时发现内存以2M的步伐增长,知道超过1G多以后挂掉。
最后将xlsx数据导入到SQLite数据库中然后使用sql查询解决。
使用ClosedXML时慎重考虑内存的事宜。由于时间问题没有测试他的性能。
将项目中的ClosedXML读xlsx文件的代码使用OpenXML改写,运行发现内存大约在66M运行5分钟没有增长,使用OpenXML还可以。但是查找的时候非常慢,5分钟没有查询完。
三个文件记录数:202 158 6153
在二个文件记录数:1906 2042中遍历查询。