我正在研究一些生成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。
答案 0 :(得分:15)
我不能肯定地说你的方法有任何问题,但我只是在做类似的事情时分享一些观察结果。
标题是Pascal Case,大多数浏览器都不应该关心,但我会将您的内容处置更改为Content-Disposition。更改Charset不应该是必要的或相关的。你的内容类型应该没问题,我只会使用application / vnd.openxmlformats-officedocument.spreadsheetml.sheet和.xlsx,如果那实际上是文件的内容,否则坚持使用application / vnd.ms-excel和.xls。 / p>
您应该考虑的另一件事是向浏览器发送Content-Length:
Response.AddHeader("Content-Length", new System.IO.FileInfo("FileName.xlsx").Length);
您是否尝试过使用多个浏览器?只是想知道这是否是特定于供应商的问题。
作为最后的努力,您可以将Content-Type设置为application / octet-stream,并且任何浏览器都应该提供下载它,然后大多数浏览器将允许您在基于扩展名下载后打开它。 / p>
答案 1 :(得分:2)
使用此
GET http://localhost/G-api/%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20…/G-api/index.php%3C/b%3E%20on%20line%20%3Cb%3E7%3C/b%3E%3Cbr%20/%3E?sz=200 403 (Forbidden)
您的代码中的是
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"filename + ".zip" + "\"");
Response.TransmitFile(zipPath);
Response.Flush();
Response.Close();
Response.End();
答案 2 :(得分:0)
试试这个
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;
}