我在不同的 来源中找到了一些示例,用于将GridView控件 (ASP.NET)或DataTable中包含的信息从 C# 导出到 .xls 或 .xlsx (Excel) 文件。
在另一个来源中,我发现了以下代码片段:
/// <summary>
/// Fuente: http://www.codeproject.com/Tips/344604/Export-to-EXCEL-from-Datatable-in-Csharp-Net
/// </summary>
/// <param name="dt"></param>
public void ExportToExcel(DataTable dt, String nombreDelArchivo)
{
if (dt.Rows.Count > 0)
{
StringWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
DataGrid dgGrid = new DataGrid();
dgGrid.DataSource = dt;
dgGrid.DataBind();
// Get the HTML for the control.
dgGrid.RenderControl(hw);
Response.ContentType = "application/xls";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + nombreDelArchivo + "");
Response.Write(tw.ToString());
Response.End();
}
}
执行上述功能时,我得到 Excel 文件:
但在查看Excel文件内容之前,出现如下警告:
从上一个警报中按下是按钮后;文件显示正确。
要删除上述警报,我尝试过:
- 更改文件的扩展名以生成(.xls、.xlx、.xlsx)。
- 使用内容类型
application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
application/vnd.ms-excel
application/xlsx
application/xls
根据消息来源;这是一项安全功能;但我想知道是否有另一种方法可以从 C# 生成 Excel 文件,基于存储在一个GridView
或一个DataTable
中的信息,如果可能的话,不会生成这种类型的消息。
使用Excel,我们通常使用两种文件格式,新格式 (
XLSX
) 以二进制开头Excel 2007
并基于XML
旧格式 (XLS
)(您可以在此链接中获得有关格式的更多信息)任何ClosedXML和EPPlus 库都适用于处理文件
XLSX
,但它们不适用于旧格式的文件XLS
。要使用旧格式 (
XLS
) 的文件,我最喜欢的选项是使用 ADO.NET,因为它允许您像使用数据库一样使用 Excel 文件。当您必须处理大量数据时,这种工作方式非常适合。它也有其限制,因为您只使用数据,因此您无法设置格式、颜色、宽度……
在此Microsoft KB 文章中,他们详细解释了如何执行此操作,并且您将拥有的代码或多或少是这样的(从这个 SO 英文答案中获得的代码):
顺便说一句,还有一个名为NPOI的库,它允许您处理两种格式的文件,但要使用新格式
XLSX
,我推荐前两种格式中的任何一种,因为据我所知,它们更有效.每当您导出 html 并希望将其视为 excel 时,您都会收到该消息。
您应该使用基于 openxml 的库,例如
ClosedXML - OpenXML 的简单方法
以便正确生成 excel 并将其发送到响应中
如果您分析示例,您将看到您可以直接将数据集导出到 excel
将数据表添加为工作表
使用此库生成 excel 并将其发送到响应中,您将看到在查看文档时不应出现此消息。
我最喜欢的选择,也是最简单的选择是使用一个名为EPPlus的库。该库负责生成本机 Excel 文件,而不仅仅是通过将扩展名更改为 XLS 来构建 HTML 文档,以便 Excel 尝试打开它,这就是您正在做的事情,也是 Excel 显示该警告通知的原因。使用 EPPLus,代码将如下所示: