我已经在网上寻找这个解决方案,找不到能解释我问题的任何内容。
我正在使用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)
然后一切都运转良好,没有错误......
我做错了什么?
答案 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"];