0

我需要以编程方式创建一个包含 3 个工作表的 Excel 电子表格。

对于 Sheet1,我正在尝试导出一个 Gridview...及其所有格式...并且在不使用 Http.Response 的情况下执行此操作,因为该技术会强制弹出一个文件“保存/另存为”请求框,这似乎停止所有进一步的代码执行。

如果我能够成功地将我的 Gridview 直接写入 Excel 工作簿,我应该能够继续我的编码例程,然后重新打开文件并以编程方式添加表格 2 和 3。

这段代码工作......有点'......几乎!

private void ExportGridView(GridView myGrid)
{
    System.IO.StringWriter sw = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);

    // Render grid view control.
    myGrid.RenderControl(htw);

    // Write the rendered content to a file.
    string renderedGridView = sw.ToString();

    File.WriteAllText("C:\\TimeSheets\\ExportedFile.xlsx", renderedGridView);

}

如果我停止编码...并导航到 TimeSheets 目录,我会看到“ExportedFile.xlsx”显示为“Microsoft Office Excel 2007 工作簿”,并且我的 Excel 程序在打开和显示格式正确的 Gridview 时没有问题。

但是,如果我继续使用 C# 进行编码并尝试在我的代码隐藏中打开同一个文件,则会收到“文件包含损坏的数据”错误。

如果在使用 Excel 查看“ExportedFile.xlsx”文件时,我执行“另存为”,我看到文件名放在引号中,并且文件类型默认为另存为网页 htm/html。如果我通过删除文件名中的引号并将文件类型设置为“.xlsx”来重置这些值......那么,可以在我的代码隐藏中读取生成的文件而无需抱怨。

谁能给我一个解决方案?

乔。

4

2 回答 2

0

我不确定您究竟是如何“尝试在我的代码隐藏中打开同一个文件”,但如果您尝试将其作为实际的 excel 文件打开,这可能是您的问题。

当您使用 HtmlTextWriter 将其保存为“excel 文件”时,您实际上是将其保存为 excel 可以读取的 html 文件。尝试将扩展名更改为 .html 并在浏览器中打开它,您就会明白我的意思。这就是为什么 excel 默认为“另存为网页”,因为这就是它的打开方式。

因此,如果您的加载代码将其视为 excel 文件,这就是您遇到问题的原因。您没有发布任何加载代码,因此很难确定。

于 2013-10-04T15:02:04.030 回答
0

不能只是将 gridview 转储到 xlsx 文件中并期望它能够工作。需要使用 OpenXml 生成文件的自定义包装器或使用外部库,例如http://epplus.codeplex.com/

于 2013-10-04T15:10:38.340 回答