我正在使用C#将数据导出到excel。这起初工作正常。导出是通过按钮事件触发的,如果用户从一行中的同一页面请求多次导出,我开始收到错误"无法读取文件"。如果我选择" SAVE"文件而不是打开,然后它写文件就好了。它只是不会在浏览器中打开文件。
我很确定错误来自Excel,因为Excel确实打开但不会加载我的文件。
我读到了关于Response.End和Response.Close ...有些人说从来没有使用过他们有人说使用它们。我已经尝试了End和Close的所有组合。
我的直觉是,由于我关闭浏览器(或等待很长时间),某些东西被缓存在内存中,似乎可以解决问题。
有没有人知道可能出现什么问题,或者至少我怎么知道为什么excel无法读取我的文件,我可以写它并从硬盘驱动器中打开它而没有问题?
protected void btnSaveToXls_Click(object sender, EventArgs e)
{
Response.ClearHeaders();
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.Buffer = true;
Response.AddHeader("content-transfer-encoding", "binary");
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=myFileName.xls");
Response.AddHeader("pragma", "private");
Response.ContentType = "application/vnd.ms-excel";
using (StringWriter sw = new StringWriter())
{
// The main purpose of these next two writes are to name the worksheet and add the gridlines to the excel sheet
sw.Write(@"<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">");
sw.Write(@"<head>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>Clients Contacted</x:Name>
<x:WorksheetOptions>
<x:Panes></x:Panes>
<x:Print><x:Gridlines /></x:Print>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
</head>");
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
Label newLine = new Label();
newLine.Text = "<br/>";
GridView gv = new GridView();
gv.GridLines = GridLines.Both;
gv.HeaderStyle.Font.Bold = true;
//. . .
// a bunch of code here to populate my gridview
//. . .
Panel p = new Panel();
p.Controls.Add(lblTitle);
p.Controls.Add(new Label { Text = "<BR/>" });
p.Controls.Add(lblReportTitle);
p.Controls.Add(new Label { Text = "<BR/>" });
p.Controls.Add(new Label { Text = string.Format("Run Date {0}", DateTime.Now.ToString("MM/dd/yyyy")) });
p.Controls.Add(new Label { Text = "<BR/>" });
p.Controls.Add(new Label { Text = "<BR/>" });
p.Controls.Add(gv);
p.RenderControl(htw);
try
{
// Response.Clear();
sw.Write("</html>");
Response.Buffer = true;
Response.Output.Write(sw.ToString());
// Response.Output.Flush();
Response.Flush();
// Response.End();
}
catch (Exception ex)
{
//... Logging the error ...
}
finally
{
Response.Close();
}
}
}
}
答案 0 :(得分:0)
这是我发现的。问题似乎是第二次你需要等待来自I.E.的对话框。 (提示您“打开”,“保存”或“取消”)以更改其背景颜色。就我而言,它从白色背景变为黄色背景。我的猜测是,在excel尝试打开它之前,文档并没有全部下载到客户端。如果我走得太快,Chrome给了我一个错误,但无论如何它打开了它,文件看起来很好。