我正在编写一些代码来生成 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-excel
和 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
,结合.xls 和 .xlsx 的文件扩展名。所有组合都会导致上述两种行为之一。
在这种情况下,文件扩展名和 MIME 类型的正确组合是什么?除了不正确的 MIME 类型或扩展之外,还有什么可能导致此失败?
仅供引用,这是通过 Visual Studio 的内置开发 Web 服务器发生的。我还没有用 IIS 尝试过这个。
最佳答案
我不能肯定地说您的方法有什么问题,但我只是分享一些通过类似操作得出的观察结果。
header 是 Pascal 大小写,大多数浏览器不关心,但我会将您的内容处置更改为 Content-Disposition。更改字符集应该不是必需的或相关的。您的内容类型应该没问题,如果这实际上是文件的内容,我只会使用 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,并且任何浏览器都应该提供下载它,然后大多数浏览器都会根据扩展名让您在下载后打开它。
关于c# - 使用 Response.TransmitFile() 下载 .xlsx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2274780/