WebAPI-Excel

WebAPI-Excel

在SpringBoot中,我们可以是使用Apache POI轻松创建Excel文件并写入文件内容

在ASP.NETCore中,我们也有多种操作Excel表格的方式

  • OpenXML SDK 是最底层的技术,提供对 Office Open XML 文件的最大灵活性和控制力,但同时也增加了复杂性。
  • EPPlus 在 OpenXML SDK 的基础上进行了抽象,提供了一套更易用的 API 来处理 Excel 文件,同时保持了良好的性能。
  • ClosedXML 则是在 EPPlus 的基础上进一步简化了 API,特别注重于提高开发效率和用户体验,适用于那些希望快速实现功能而不需要深入了解底层细节的开发者。

Template

可以为 ClosedXML 提供一个 Excel 模板文件,然后使用该模板来生成新的报表。这种方法不仅可以保留模板中的格式、图表和其他静态内容,还可以动态填充数据,从而创建一致且专业的报表

Closed XML

public byte[] ExportData()
{
    // 如果需要模板文件,可以先加载模板
    string templatePath = Path.Combine(_webHostEnvironment.WebRootPath, "Resources", "运营数据报表模板.xlsx");

    if (!File.Exists(templatePath))
    {
        throw new FileNotFoundException("缺少模板文件", templatePath);
    }

    byte[] templateBytes = File.ReadAllBytes(templatePath);

    // 使用文件流的原因:ClosedXML仅支持针对于流进行操作,而不是直接操作字节数组
    using (var stream = new MemoryStream())
    {
        // 将模板加载到内存流中
        stream.Write(templateBytes, 0, templateBytes.Length);
        stream.Position = 0;

        // 打开模板文件
        using (var workbook = new XLWorkbook(stream))
        {
            // 获取工作表
            IXLWorksheet worksheet = workbook.Worksheet("Sheet1");

            //TODO: 在这里对模板工作表进行操作

            // 保存到内存流
            stream.Position = 0;
            workbook.SaveAs(stream);

            // 返回字节数组
            return stream.ToArray();
        }
    }
}

Controller的返回格式

在 ASP.NET Core 中,如果你不使用 IActionResult 或其派生类作为控制器方法的返回类型,默认情况下,ASP.NET Core 会尝试根据返回的对象类型选择适当的格式化程序来序列化响应。对于大多数对象,默认的行为是将它们序列化为 JSON,并设置 Content-Type 响应头为 application/json

在ASP.NETCore中,无需同SpringBoot一样在Controller获取到response对象后响应文件内容

它提供了更加便捷的响应文件的方式:

返回内存中的文件
public FileResult DownloadFile()
{
    // 假设你已经有一个 byte[] 数组表示要下载的文件
    byte[] fileBytes = GetFileBytes(); // 从某个地方获取文件字节

    return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "ExportedFile.xlsx");
}
返回本地文件
public FileResult DownloadPhysicalFile()
{
    string filePath = Path.Combine(_env.WebRootPath, "excelTemplates", "Template.xlsx");

    if (!System.IO.File.Exists(filePath))
    {
        return NotFound();
    }

    return PhysicalFile(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Template.xlsx");
}

WebAPI静态文件的存放位置

我们通常将静态文件存放到启动项目中,然后通过注入IWebHostEnvironment对象来获取运行时的项目根路径,通过路径拼接就能读到我们想要的静态文件了

private readonly IWebHostEnvironment _webHostEnvironment;

public ReportService(IWebHostEnvironment webHostEnvironment)
{
    _webHostEnvironment = webHostEnvironment;
}

Path.Combine(_webHostEnvironment.ContentRootPath, "Resources", "运营数据报表模板.xlsx")