繁体   English   中英

使用Response.TransmitFile()下载.xlsx文件

[英]Download .xlsx file using Response.TransmitFile()

我正在研究一些生成Excel电子表格服务器端的代码,然后将其下载到用户。 我正在使用ExcelPackage生成文件。

这一代工作得很好。 我可以使用Excel 2007打开生成的文件,没有任何问题。 但是,我在使用Response.TransmitFile()下载文件时遇到问题。

现在,我有以下代码:

//Generate the file using ExcelPackage
string fileName = generateExcelFile(dataList, "MyReportData");

Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.ContentType = "application/vnd.xls"
Response.Charset = "";
Response.TransmitFile(fileName);

当Excel 2007打开如上所下载的文件时,它会提供“文件格式与扩展名不匹配”警告。 单击警告后,Excel将显示该文件的原始xml内容。

如果我更改文件扩展名,就像这样

Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");

Excel 2007提供“Excel在文件中找到不可读的内容”错误,然后是一个对话框,提供在Web上查找转换器。 如果我点击“否”,该对话框中,Excel 能够加载数据。

我还尝试了不同的MIME类型,例如application/vnd.ms-excelapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet ,以及.xls和.xlsx的文件扩展名。 所有组合都导致上述两种行为之一。

在此方案中使用的文件扩展名和MIME类型的正确组合是什么? 除了不正确的MIME类型或扩展名之外,还有什么可能导致此失败?

仅供参考,这是Visual Studio的内置开发Web服务器。 我还没有用IIS试过这个。

我不能肯定地说你的方法有什么问题,但我会从做类似的事情中分享一些观察结果。

标题是Pascal Case,大多数浏览器都不应该关心,但我会将您的内容更改为Content-Disposition。 更改Charset不应该是必要的或相关的。 你的内容类型应该没问题,我只会使用application / vnd.openxmlformats-officedocument.spreadsheetml.sheet和.xlsx,如果它实际上是文件的内容,否则坚持使用application / vnd.ms-excel和.xls。

您应该考虑的另一件事是向浏览器发送Content-Length:

Response.AddHeader("Content-Length", new System.IO.FileInfo("FileName.xlsx").Length);

您是否尝试过多个浏览器? 只是想知道这是否是供应商特定的问题。

作为最后的努力,您可以将Content-Type设置为application / octet-stream,并且任何浏览器都应该提供下载它,然后大多数浏览器将允许您在根据扩展名下载后打开它。

用这个

HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"filename + ".zip" + "\"");
                Response.TransmitFile(zipPath);
                Response.Flush();
                Response.Close();
                Response.End();

在你的代码中

Response.AddHeader("content-disposition", "attachment;filename=\FileName.xlsx\");

试试这样吧

public void DataTableToExcel(DataTable dt, string Filename)
{
    MemoryStream ms = DataTableToExcelXlsx(dt, "Sheet1");
    ms.WriteTo(HttpContext.Current.Response.OutputStream);
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + Filename);
    HttpContext.Current.Response.StatusCode = 200;
    HttpContext.Current.Response.End();
}

public static MemoryStream DataTableToExcelXlsx(DataTable table, string sheetName)
{
    MemoryStream result = new MemoryStream();
    ExcelPackage excelpack = new ExcelPackage();
    ExcelWorksheet worksheet = excelpack.Workbook.Worksheets.Add(sheetName);
    int col = 1;
    int row = 1;
    foreach (DataColumn column in table.Columns)
    {
        worksheet.Cells[row, col].Value = column.ColumnName.ToString();
        col++;
    }
    col = 1;
    row = 2;
    foreach (DataRow rw in table.Rows)
    {
        foreach (DataColumn cl in table.Columns)
        {
            if (rw[cl.ColumnName] != DBNull.Value)
                worksheet.Cells[row, col].Value = rw[cl.ColumnName].ToString();
            col++;
        }
        row++;
        col = 1;
    }
    excelpack.SaveAs(result);
    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM