使用EPPlus将DataTable导出到Excel

78

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

有人知道如何导出这样的DataTable到Excel吗?

5个回答

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

那应该对你有用。如果你的字段被定义为int类型,EPPlus会将列正确转换为数字或浮点数。


2
如何在导出时格式化数据表的标题? - Abhinav
1
是的,这个可以正常工作。但是当数据表中包含成千上万行时,它就无法正常工作了。 - thevan
3
也许你应该针对那个特定情况提出一个问题? - bastianwegge
1
清晰的方法。谢谢! - Ashokan Sivapragasam
2
这个已经有9年历史了,但仍然帮助着人们。SO网站一次又一次地让我惊叹。@AshokanSivapragasam,感谢您提醒我这件事! - bastianwegge
显示剩余2条评论

21

如果您希望在浏览器响应中下载

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

谢谢你的代码片段!不需要对“Logs.xlsx”进行urlencode :) - Anders Lindén

5

要在浏览器中下载Excel表格,请使用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();

}

对于任何人遇到“System.Web.HttpContextBase”不包含“Current”的定义:要获取对HttpContext.Current的引用,您需要将HttpContext.Current替换为System.Web.HttpContext.Currenthttps://dev59.com/oWIk5IYBdhLWcg3wRMNR - Ray Koren

2

这里有一段代码片段,可以将 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;

1

前言

从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控制器中使用此功能,您可以使用以下代码将其作为下载文件返回:
    string fileName = ...;  //without extension

    return File(p.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName + ".xlsx");

注意 using 的范围!这是 C#8 语法,只在声明它的代码块结束之前有效。

VB.NET

与上面相同,但是用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

关于下载,必须将其放置在使用块内

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接