1. 概述
一直以来都是使用 NPOI 类库来读取或生成 Excel 文件,但总是感觉使用起来不够直观。偶然的机会发现 ClosedXML 类库读取和生成 Excel 语法很直观,非常容易上手。索性先整理一篇使用 ClosedXML 读取和生成 Excel 的文章,只包含最简单的使用语法。
ClosedXML 是基于 OpenXML API 封装的 .NET 类库,支持传统的 .Net Framwork 和最新的 .Net Core。官网网站:https://github.com/ClosedXML/ClosedXML
需要注意的是:ClosedXML 只支持操作 Excel 2007+ 以上的版本,也就是扩展名对应 .xlsx、.xlsm 的文件。
可以通过 NuGet 直接安装 ClosedXML,也可使用命令行安装:
PM> Install-Package ClosedXML
2. Excel 生成
生成一个简单的 Excel 文件:
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("示例工作表");
worksheet.Cell("A1").Value = "Hello World!";
worksheet.Cell("A2").FormulaA1 = "=MID(A1, 7, 5)";
workbook.SaveAs("测试文件.xlsx");
}
Console.WriteLine("Excel创建完成");
效果:
3. Excel 读取
循环读取简单的 Excel 文件:
Dictionary<Tuple<int, int>, object> data = new Dictionary<Tuple<int, int>, object>();
using (XLWorkbook wb = new XLWorkbook("测试文件.xlsx"))//FilePath
{
var ws = wb.Worksheets.First();
var range = ws.RangeUsed();
for (int i = 1; i < range.RowCount() + 1; i++)
{
for (int j = 1; j < range.ColumnCount() + 1; j++)
{
data.Add(new Tuple<int, int>(i, j), ws.Cell(i, j).Value);
}
}
}
4. DataGridView 导出到 Excel 实例
/// <summary>
/// DataGridview 导出EXCEL
/// </summary>
/// <param name="dgvDataInfo"></param>
/// <param name="path">存放文件的文件夹路径</param>
/// <param name="fileNameWithExtension">文件名称(以.xlsx结尾)</param>
public static void ClosedXMLExportExcel(DataGridView dgvDataInfo, string path,string fileNameWithExtension)
{
//判断文件夹是否存在
bool directoryExist = Directory.Exists(path);
if (!directoryExist )
{
//创建
Directory.CreateDirectory(path);//关联创建所有层级
}
//判断文件是否存在
bool fileExist = File.Exists(path+"\\"+fileNameWithExtension);
if (fileExist)
{
//删除文件
File.Delete(path + "\\" + fileNameWithExtension);
}
DataTable dt = new DataTable();
//添加列
foreach (DataGridViewColumn column in dgvDataInfo.Columns)
{
dt.Columns.Add(column.HeaderText, column.ValueType);
}
//添加行
foreach (DataGridViewRow row in dgvDataInfo.Rows)
{
dt.Rows.Add();
foreach (DataGridViewCell cell in row.Cells)
{
dt.Rows[dt.Rows.Count - 1][cell.ColumnIndex] = cell.Value.ToString();
}
}
//保存成文件
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dt, "导出的数据");
//自动调整列的宽度
wb.Worksheet(1).Columns().AdjustToContents();
//保存文件
wb.SaveAs(path + "\\" + fileNameWithExtension);
}
//打开文件
System.Diagnostics.Process.Start(path + "\\" + fileNameWithExtension);
}