【问题标题】:Export data in excel using webapi使用 webapi 在 excel 中导出数据
【发布时间】:2018-08-31 13:30:14
【问题描述】:

我们正在开发 web api,从中可以下载 excel 和数据。在网上搜索时,我们发现了 npoi、epplus、closexml 等库。

我们真的需要使用这些库来处理 excel 还是使用标准方法?

我们正在使用 asp.net core 进行 web api 开发。

编辑: 基本上我们的前端是在我们的角度 5 正在公开 web api。在 web api 中,我们编写了获取数据的逻辑,在获取数据后,我们需要以提供的特定格式/模板(单元格、列方式、工作表方式等)放置。我们需要在excel中导出相当多的行。

我们的数据库和 API 也是基于 azure 的。

对此的任何帮助表示赞赏!

【问题讨论】:

  • "我们真的需要使用这些库来处理 excel" 是的。或者您可以使用 excel 互操作,但是您需要在网络服务器上使用 excel,并且互操作不是非常可扩展的。另外,什么是“标准方法”?听起来……好得令人难以置信;)
  • 这还取决于您的目标是 .NET Framework 还是 .NET Core
  • 您将什么定义为“标准方法”?这些库是处理和操作 Excel 文件的合理选择。如果您只想下载已经创建的 excel 文件,那么您不需要任何这些。您还没有真正清楚地定义要求和流程,我们无法给您正确的答案。
  • @XamDev 该链接中的代码创建了一个 HTML 文档,而不是 Excel 文档。您可以在下载它时给它一个 .xlsx 扩展名,当然 Excel 可以读取 HTML 文件,但它不是 Excel 文件。它不能包含公式、宏等内容。也许它足以满足您的要求,但是如果您想创建实际上是 Excel 格式并且可以利用 Excel 特定功能的东西,那么您需要使用另一个库。而且我不会以任何方式将这种方法称为“标准”。这只是完成特定任务的一种方式。
  • 所以让我们把这个过程分成几部分。 1) 从模板创建文件并 2) 填充数据 - 假设您要制作真正的 Excel 文件而不是 HTML 文档,那么这两者都将由 Excel 代码库处理,例如NPOI 或任何你喜欢的。 3) 然后,假设您可以从库中以二进制形式获取内容,您可以使用诸如 memorystream 之类的标准方法流式传输文件内容以供下载。任何展示如何在 .NET 中下载文件的教程都应该给你这个想法。如果您无法直接从库中获取二进制流,则可能必须先保存到临时文件中

标签: c# excel asp.net-core


【解决方案1】:

我使用过 epplus,我认为它适用于这种情况。让我给你举个例子。 导出数据

private ExcelPackage CreateDoc(string title, string subject, string keyword)
    {
        var p = new ExcelPackage();
        p.Workbook.Properties.Title = title;
        p.Workbook.Properties.Author = "Application Name";
        p.Workbook.Properties.Subject = subject;
        p.Workbook.Properties.Keywords = keyword;
        return p;
    }

public ExcelPackage getApplicantsStatistics()
    {
        ExcelPackage p = CreateDoc("Applicant Statistics", "Applicant statistics", "All Applicants");
        var worksheet = p.Workbook.Worksheets.Add("Applicant Statistics");

        //Add Report Header
        worksheet.Cells[1, 1].Value = "Applicant Statistics";
        worksheet.Cells[1, 1, 1, 3].Merge = true;

      //Get the data you want to send to the excel file
        var appProg = _unitOfWork.ApplicantsProgram
                        .AllIncluding(pr => pr.Program1)
                        .GroupBy(ap => ap.Program1.Name)
                        .Select(ap => new { programName = ap.Key, TotalNum = ap.Count() })
                        .ToList();
        //First add the headers
        worksheet.Cells[2, 1].Value = "SR No";
        worksheet.Cells[2, 2].Value = "Program";
        worksheet.Cells[2, 3].Value = "No. of Applicants";

        //Add values
        var numberformat = "#,##0";
        var dataCellStyleName = "TableNumber";
        var numStyle = p.Workbook.Styles.CreateNamedStyle(dataCellStyleName);
        numStyle.Style.Numberformat.Format = numberformat;

        for (int i = 0; i < appProg.Count; i++)
        {
            worksheet.Cells[i + 3, 1].Value = i + 1;
            worksheet.Cells[i + 3, 2].Value = appProg[i].programName;
            worksheet.Cells[i + 3, 3].Value = appProg[i].TotalNum;
        }
        // Add to table / Add summary row
        var rowEnd = appProg.Count + 2;
        var tbl = worksheet.Tables.Add(new ExcelAddressBase(fromRow: 2, fromCol: 1, toRow: rowEnd, toColumn: 3), "Applicants");
        tbl.ShowHeader = true;
        tbl.TableStyle = TableStyles.Dark9;
        tbl.ShowTotal = true;
        tbl.Columns[2].DataCellStyleName = dataCellStyleName;
        tbl.Columns[2].TotalsRowFunction = RowFunctions.Sum;
        worksheet.Cells[rowEnd, 3].Style.Numberformat.Format = numberformat;

        // AutoFitColumns
        worksheet.Cells[2, 1, rowEnd, 3].AutoFitColumns();
        return p;
    }

返回的 ExcelPackage 对象可以通过 MVC 下载到文件中

byte[] reportBytes;
            using (var package = _excelRep.getApplicantsStatistics())
            {
                reportBytes = package.GetAsByteArray();
            }
            return File(reportBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);

【讨论】:

  • 不错,但有一个小细节 - OP 使用的是 .NET Core 的 Web API,而不是 MVC,因此关于 return File 的最后一点不适用。
【解决方案2】:

有几个很好的库可以做到这一点,我最喜欢的是 Microsoft 的 EPPlus 和 OpenXML

https://github.com/JanKallman/EPPlus

https://docs.microsoft.com/en-us/office/open-xml/open-xml-sdk

你的数据库和前端没有太大区别,因为一切都是由后端组织的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    相关资源
    最近更新 更多