0

我已经在网上寻找这个解决方案,但找不到任何可以解释我的问题的东西。

我正在为 vb.net 使用 EPPLus(使用 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

4 回答 4

1

我遇到了同样的问题(至少有同样的症状),我的问题原来是因为我的 DataTable.TableName 中有一个“:”。

我发现 EPPlus 使用 DataTable.TableName 作为 .xlsx 文件中 table1.xml 中的显示名称,并且它不支持“:”字符。

我通过将损坏的输出与 Excel 修复的版本进行比较来解决这个问题。您可以通过简单地将它们作为 .zip 文件打开(将它们从 .xlsx 重命名为 .zip)来查看办公文档的底层结构,然后您可以查看底层文件。就我而言,Excel 将我指向 table1.xml 文件,因此很容易找到。

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

希望这可能对其他人有所帮助。

于 2014-02-27T15:40:32.553 回答
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;

    }
于 2018-11-02T16:55:24.823 回答
0

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

就我而言,我创建了具有自定义列名称的数据表,这些列名称分为 2 行,如下所示:

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

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

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

错误消失了:)

希望这可以节省其他人我所经历的所有烦恼!

于 2012-10-17T20:55:30.360 回答
0

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

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

然后稍后

var tableTitle = sheet.Cells[range];
tableTitle.Merge = true;
tableTitle.Value = dataTable.ExtendedProperties["Title"];
于 2018-08-15T01:49:56.550 回答