在C#中导出到Excel时无法读取文件

时间:2017-09-27 20:07:55

标签: c# excel response.write

我正在使用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();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是我发现的。问题似乎是第二次你需要等待来自I.E.的对话框。 (提示您“打开”,“保存”或“取消”)以更改其背景颜色。就我而言,它从白色背景变为黄色背景。我的猜测是,在excel尝试打开它之前,文档并没有全部下载到客户端。如果我走得太快,Chrome给了我一个错误,但无论如何它打开了它,文件看起来很好。