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创建完成");

效果:

image.png

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);
}

5. 参考文章

  1. 官方文档 Wiki
  2. 令人驚豔的Excel程式庫 - ClosedXML
  3. Export DataGridView to Excel with Formatting using C# and VB.Net

最后更新时间:2019/7/15 9:45:20