asp.net 如何在C#中从DataTable对象下载Excel文件(.xlsx)

dbf7pr2w  于 2022-11-19  发布在  .NET
关注(0)|答案(3)|浏览(254)

我想做一个按钮,使用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,因为该文件格式无效.请验证该文件未损坏,并且文件扩展名与文件格式匹配.
你知道为什么这不起作用吗?

ssm49v7z

ssm49v7z1#

在我看来,您试图发送扩展名为.xlsx的HTML内容。这是行不通的,因为XLSX基本上不是HTML,而是带有相当特定的压缩XML最简单的方法是使用现有的第三方库,它可以动态地生成XLSX。我个人曾使用ClosedXML完成过类似的任务,但是有many other options at NuGet

edqdpe6u

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

public byte[] Export(DataTable dt)
{
    using (var p = new ExcelPackage())
    {
        var ws = p.Workbook.Worksheets.Add("SomeSheet");
        var table=ws.Cells.LoadFromDataTable(dt);
        var excelData = package.GetAsByteArray();
        return excelData;
    }
}

然后,将输出写入响应流:

var bytes = Export(dt);
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", $"attachment;filename={excelFileNameNowDateTime}.xlsx");
Response.BinaryWrite(bytes);
Response.End();
vdzxcuhz

vdzxcuhz3#

对于ASP.NET(不需要.NET核心解决方案)。

using ClosedXML.Excel;

private void DownloadExcelClosedXML(DataTable dt)
{
    using (var workbook = new XLWorkbook())
    {
        var worksheet = workbook.Worksheets.Add(dt);
        using (var stream = new MemoryStream())
        {
            workbook.SaveAs(stream);
            var content = stream.ToArray();
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheet.sheet";
            Response.AddHeader("content-disposition", "attachment; filename=name_you_file.xlsx");
            Response.BinaryWrite(content);
            Response.End();
        }
    }
}

相关问题