Невозможно прочитать файл при экспорте в Excel в C#
Я использую C# экспорт данных, чтобы преуспеть. Это работает хорошо на первых порах. Экспорт запускается с помощью события кнопки, если пользователь запрашивает несколько экспортов с одной и той же страницы подряд, и я начинаю получать сообщение об ошибке "Невозможно прочитать файл". Если я выберу "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();
}
}
}
}
1 ответ
Вот что я узнал. Кажется, проблема заключается в том, что во второй раз вам нужно подождать, пока диалоговое окно из IE (которое предлагает вам "Открыть", "Сохранить" или "отменить"), чтобы изменить цвет фона. В моем случае это изменилось с белого фона на желтый. Я предполагаю, что документ не был полностью загружен клиенту, прежде чем Excel попытался его открыть. Chrome дал мне ошибку, если я пошел слишком быстро, но все равно открыл его, и файл выглядел нормально.