用 EPPlus 将 DataTable 导出到 Excel

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

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

118196 次浏览
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);
}

HttpContext.Current.Response代替 Response下载 EXCEL 表,否则会出现 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 控制器中使用它,你可以使用以下方法将它作为一个下载文件返回:

    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")