首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.xlsx ()下载Response.TransmitFile文件

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

Stack Overflow用户
提问于 2010-02-16 17:13:36
回答 3查看 35.8K关注 0票数 15

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

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

现在,我有以下代码:

代码语言:javascript
复制
//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内容。

如果我更改文件扩展名,如下所示

代码语言:javascript
复制
Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");

Excel 2007提供了一个"Excel在文件中找到不可读内容“错误,然后是一个对话框,该对话框提供了在web上找到转换器的机会。如果我在此对话框上单击"no“,Excel将能够加载数据。

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

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

FYI,这发生在Visual的内置开发web服务器上.我还没有在IIS上尝试过这个。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-16 17:57:23

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

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

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

代码语言:javascript
复制
Response.AddHeader("Content-Length", new System.IO.FileInfo("FileName.xlsx").Length);

另外,您是否在多个浏览器中尝试过这一点?只是想知道这是否是厂商特有的问题。

作为最后的努力,您可以将内容类型设置为应用程序/八进制流,任何浏览器都应该提供下载它,然后大多数浏览器将允许您在基于扩展的基础上下载内容之后打开它。

票数 18
EN

Stack Overflow用户

发布于 2015-07-08 06:48:01

使用这个

代码语言:javascript
复制
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"filename + ".zip" + "\"");
                Response.TransmitFile(zipPath);
                Response.Flush();
                Response.Close();
                Response.End();

在您的代码中是

代码语言:javascript
复制
Response.AddHeader("content-disposition", "attachment;filename=\FileName.xlsx\");
票数 3
EN

Stack Overflow用户

发布于 2015-07-14 13:02:19

试着像这样

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2274780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档