LoadFromDataTable使用TableStyles在重新打开Excel工作簿时创建错误

时间:2012-09-25 13:51:24

标签: .net vb.net openxml export-to-excel epplus

我已经在网上寻找这个解决方案,找不到能解释我问题的任何内容。

我正在使用EPPLus for vb.net(使用OfficeOpenXml),我的代码看起来像这样:

Dim Package As New ExcelPackage
Dim wks As ExcelWorksheet
Dim dt As DataTable

wks.Cells("A1").LoadFromDataTable(dt, True, TableStyles.Medium9)

Dim SaveAs As New FileInfo([...somelocation.xlsx])
Package.SaveAs(SaveAs)

现在,当我运行它时,它运行得非常好,并将.xlsx文件保存为需要/预期。但是,当我尝试在Excel中打开它时,我收到一个错误说:
“Excel发现不可读的内容......您要恢复此工作簿的内容吗?”

如果我然后单击“是”,它会完全打开它并给我一个错误报告说: “Excel能够通过修复或删除不可读的内容来打开文件” 有很多错误(每个数据表加载一个): “修复记录:来自/xl/tables/table1.xml部分(表)的表”

现在......如果我改变代码行:

wks.Cells("A1").LoadFromDataTable(dt, True, TableStyles.Medium9)

要:

wks.Cells("A1").LoadFromDataTable(dt, True)

然后一切都运转良好,没有错误......

我做错了什么?

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题(至少是相同的症状),我的问题结果是因为我在DataTable.TableName中有一个':'。

我发现EPPlus在.xlsx文件的table1.xml中使用DataTable.TableName作为displayName,并且它不支持':'char。

我通过将损坏的输出与Excel修复的版本进行比较来弄清楚。您可以通过简单地将它们打开为.zip文件(将它们从.xlsx重命名为.zip)来查看office文档的基础结构,然后您可以查看基础文件。在我的例子中,Excel将我指向table1.xml文件,因此很容易找到。

我通过简单地用'_'替换我的DataTable.TableName中的任何':'来解决问题。

希望这可能有助于其他人。

答案 1 :(得分:1)

我遇到了同样的问题,我的表名和列名都是动态的,因此有可能出现无效字符。这是我从其他人那里窃取的代码,这些代码将取代所有这些代码:

protected string ReplaceSpecialChars(string inputName)
    {
        char[] verbotten = new char[] { ' ', '/', '\'', '"', '\'', '@', '`', '#', '%', '>', '<', '!', '.', '[', ']', '*', '$', ';', ':', '?', '^', '{', '}', '+', '-', '=', '~', '\\' };

        int pos = -1;
        while ((pos = inputName.IndexOfAny(verbotten)) != -1)
            inputName = inputName.Substring(0, pos) + inputName.Substring(pos + 1);

        return inputName;

    }

答案 2 :(得分:0)

...所以我想出了我的问题是什么,我只是把它放在这里以防万一有人像我一样愚蠢......

就我而言,我使用自定义列名称创建了Datatable,这些名称分为2行,如下所示:

dt.Columns.Add("First Line's Text" & vbCrLf & "Second Line")

问题是 vbCrLf - 我将其更改为:

dt.Columns.Add("First Line's Text" & vbLf & "Second Line")

错误消失了:))

希望这可以拯救别人我所经历的所有烦恼!!

答案 3 :(得分:0)

我有一个类似的问题,是由我的数据表名称引起的。我的解决方案是向DataTable添加扩展属性,然后在创建电子表格时调用它。

dataTable.ExtendedProperties.Add("Title",someText);

然后再

var tableTitle = sheet.Cells[range];
tableTitle.Merge = true;
tableTitle.Value = dataTable.ExtendedProperties["Title"];