代码之家  ›  专栏  ›  技术社区  ›  Odrade

使用response.transmitfile()下载.xlsx文件

  •  14
  • Odrade  · 技术社区  · 16 年前

    我正在编写一些代码,生成Excel电子表格服务器端,然后将其下载给用户。我在用 ExcelPackage 生成文件。

    这一代人工作得很好。我可以使用Excel2007打开生成的文件,没有问题。但是,我下载文件时遇到问题 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);
    

    当Excel2007打开如上所述下载的文件时,会发出“文件格式与扩展名不匹配”警告。单击超过警告后,Excel将显示文件的原始XML内容。

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

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

    Excel2007给出了一个“Excel在文件中发现无法读取的内容”错误,随后出现了一个对话框,用于在Web上定位转换器。如果我在此对话框中单击“否”,Excel 能够加载数据。

    我也尝试过不同的mime类型,比如 application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ,与.xls和.xlsx的文件扩展名组合在一起。所有组合都会导致上述两种行为之一。

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

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

    3 回复  |  直到 11 年前
        1
  •  15
  •   Brad Nabholz    16 年前

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

    头是Pascal的情况,大多数浏览器不应该关心,但我会将您的内容配置更改为内容配置。更改字符集不应该是必要的或相关的。您的内容类型应该很好,我只使用application/vnd.openxmlformats-officecondument.spreadsheetml.sheet和.xlsx,如果这实际上是文件的内容,则使用application/vnd.ms-excel和.xls。

    您应该考虑的另一件事是向浏览器发送内容长度:

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

    您是否也在多个浏览器中尝试过这种方法?只是想知道这是否是供应商特有的问题。

    作为最后的努力,您可以将您的内容类型设置为application/octet流,任何浏览器都应该提供下载,然后大多数浏览器将允许您在基于扩展名下载后打开它。

        2
  •  2
  •   Mayank Jain Pushpendra Rathor    11 年前

    用这个

    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\");
    
        3
  •  0
  •   Karthikeyan P    11 年前

    像这样尝试

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