我想做一个按钮,使用HTTP请求下载DataTable对象。我已经有了这个代码,可以通过更改注解中指示的contentType来打印.xls文件。但是,这不适用于xlsx文件。
private void DownloadExcel(DataSet ds, string excelFileNameNowDateTime)
{
System.IO.StringWriter tw = new System.IO.StringWriter(); ;
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
System.Web.UI.WebControls.DataGrid dgGrid = new System.Web.UI.WebControls.DataGrid();
dgGrid.DataSource = ds.Tables[0];
// Get the HTML for the control.
dgGrid.HeaderStyle.Font.Bold = false;
dgGrid.DataBind();
dgGrid.RenderControl(hw);
string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
//string contentType = "application/vnd.ms-excel";
Response.ContentType = contentType;
this.EnableViewState = true;
Response.Clear();
//Response.ContentEncoding = System.Text.Encoding.Default;
Response.AddHeader("content-disposition", String.Format(@"attachment; filename={0}", excelFileNameNowDateTime + ".xlsx"));
Response.Write(tw.ToString());
CloseHTTPResponse();
}
打开文件时出现错误
Excel无法打开文件.xlsx,因为该文件格式无效.请验证该文件未损坏,并且文件扩展名与文件格式匹配.
你知道为什么这不起作用吗?
3条答案
按热度按时间ssm49v7z1#
在我看来,您试图发送扩展名为.xlsx的HTML内容。这是行不通的,因为XLSX基本上不是HTML,而是带有相当特定的压缩XML最简单的方法是使用现有的第三方库,它可以动态地生成XLSX。我个人曾使用ClosedXML完成过类似的任务,但是有many other options at NuGet。
edqdpe6u2#
此代码不会生成Excel文件,而是生成一个带有伪扩展名的HTML文件。Excel不会上当,它会尝试使用用户区域设置的默认值导入此HTML文件。如果小数点分隔符不同或单元格中包含的文本干扰HTML,则很容易导致问题。
XLSX
是一个包含格式良好的XML文件的ZIP包。您可以使用Open XML SDK创建低级别的Excel文件,也可以使用EPPlus(下载量为57M)、ClosedXML(下载量为27M)、NPOI(下载量为22M)等库创建 * 真实的的 * Excel文件。使用EPPlus,从DataTable创建Excel文件实际上是一个命令
sheet.Cells.LoadFromDataTable(dt);
然后,将输出写入响应流:
vdzxcuhz3#
对于ASP.NET(不需要.NET核心解决方案)。