繁体   English   中英

使用 EPPlus 将 DataTable 导出到 Excel

[英]Export DataTable to Excel with EPPlus

我想用 EPPlus 将数据表导出到 Excel 文件。 该数据表有一个 int 类型的属性,所以我想在 Excel 文件中使用相同的格式。

有谁知道如何将这样的 DataTable 导出到 Excel?

using (ExcelPackage pck = new ExcelPackage(newFile))
{
  ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Accounts");
  ws.Cells["A1"].LoadFromDataTable(dataTable, true);
  pck.Save();
}

那应该可以为您解决问题。 如果您的字段被定义为 int EPPlus 将正确地将列转换为数字或浮点数。

如果你想在浏览器响应中下载

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode("Logs.xlsx", System.Text.Encoding.UTF8));

using (ExcelPackage pck = new ExcelPackage())
{
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Logs");
    ws.Cells["A1"].LoadFromDataTable(dt, true);                 
    var ms = new System.IO.MemoryStream();
    pck.SaveAs(ms);
    ms.WriteTo(Response.OutputStream);                          
}

要在浏览器中下载 excelsheet,请使用HttpContext.Current.Response而不是Response ,否则您将得到Response is not available in this context. 错误。这是我的代码

public void ExporttoExcel(DataTable table, string filename)
{
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.Buffer = true;
    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=GridData.xlsx");


    using (ExcelPackage pack = new ExcelPackage())
    {
        ExcelWorksheet ws = pack.Workbook.Worksheets.Add(filename);
        ws.Cells["A1"].LoadFromDataTable(table, true);
        var ms = new System.IO.MemoryStream();
        pack.SaveAs(ms);
        ms.WriteTo(HttpContext.Current.Response.OutputStream); 
    }

    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();

}

下面是将 DataSet 导出到 Excel 的代码片段:

    private static void DataSetToExcel(DataSet dataSet, string filePath)
    {
        using (ExcelPackage pck = new ExcelPackage())
        {
            foreach (DataTable dataTable in dataSet.Tables)
            {
                ExcelWorksheet workSheet = pck.Workbook.Worksheets.Add(dataTable.TableName);
                workSheet.Cells["A1"].LoadFromDataTable(dataTable, true);
            }

            pck.SaveAs(new FileInfo(filePath));
        }
    }

并使用语句:

using OfficeOpenXml;
using System.Data;
using System.IO;

前言

在 v5 中,EPPlus 切换到商业用途的付费许可模式。 要在非商业环境中使用 v5,您需要将这行静态代码放在可以运行的地方:
 ExcelPackage.LicenseContext = LicenseContext.NonCommercial
如果您将其用于商业用途,您的公司可以获得许可或使用 v4.5.3.3(它确实适用于 netcore/net5),这是可以免费用于商业用途的最后一个版本

以下代码适用于 4.5.3.3

C#

DataTable 到 Excel,使用列名作为 excel 标题。

之后它还会遍历表格并设置任何 DateTime 列,以便它们在 Excel 中显示为日期,而不是像 45123 这样的数字

 DataTable dt =...; string sheetName =...; string dateFormat = "yyyy-MM-dd HH:mm:ss"; using var p = new ExcelPackage(); var ws = p.Workbook.Worksheets.Add(sheetName); ws.Cells["A1"].LoadFromDataTable(dt, PrintHeaders: true); for (int c = 0; c < dt.Columns.Count; c++) { if (dt.Columns[c].DataType == typeof(DateTime)) { ws.Column(c + 1).Style.Numberformat.Format = dateFormat; } }

如果您在 API 控制器中使用它,您可以使用以下命令将其作为下载文件返回:

    Dim dt As DataTable = ...
    Dim sheetName As String = ...
    Dim dateFormat As String = "yyyy-MM-dd HH:mm:ss"

    Using p As New ExcelPackage()
        Dim ws = p.Workbook.Worksheets.Add(sheetName)
        ws.Cells("A1").LoadFromDataTable(dt, PrintHeaders:=True)

        For c As Integer = 0 To dt.Columns.Count - 1

            If dt.Columns(c).DataType Is GetType(Date) Then
                ws.Column(c + 1).Style.Numberformat.Format = dateFormat
            End If
        Next
    End Using

注意using范围! 它是 C#8 语法并且一直存在到它声明的块的末尾

网络

同上,但在 VB 中:

 Dim dt As DataTable =... Dim sheetName As String =... Dim dateFormat As String = "yyyy-MM-dd HH:mm:ss" Using p As New ExcelPackage() Dim ws = p.Workbook.Worksheets.Add(sheetName) ws.Cells("A1").LoadFromDataTable(dt, PrintHeaders:=True) For c As Integer = 0 To dt.Columns.Count - 1 If dt.Columns(c).DataType Is GetType(Date) Then ws.Column(c + 1).Style.Numberformat.Format = dateFormat End If Next End Using

对于下载,它必须放在 using 块内

 Dim fileName As String =... 'without extension Return File(p.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName & ".xlsx")

我想使用 EPPlus 将数据表导出到 Excel 文件。 该数据表具有 int 类型的属性,因此我希望 Excel 文件中具有相同的格式。

有谁知道如何将这样的数据表导出到 Excel?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM