C# 使用EPPlus生成的Excel文件中的不可读内容

C# 使用EPPlus生成的Excel文件中的不可读内容,c#,.net,excel,xlsx,epplus,C#,.net,Excel,Xlsx,Epplus,使用EPPlus库从模板生成Excel文件时,我遇到了一个小问题。该文件有第一个电子表格,其中包含用于填充以下工作表中的透视表的数据 打开生成的文件时,会收到以下错误消息: Excel在“sampleFromTemplate.xlsx”中发现无法读取的内容。是否恢复此工作簿的内容?如果您信任此工作簿的源,请单击“是” 显然,我会单击“是”,然后获取对该文件所做修复的摘要,以及指向包含以下内容的xml格式日志文件的链接: <?xml version="1.0" encoding="UTF-8

使用EPPlus库从模板生成Excel文件时,我遇到了一个小问题。该文件有第一个电子表格,其中包含用于填充以下工作表中的透视表的数据

打开生成的文件时,会收到以下错误消息: Excel在“sampleFromTemplate.xlsx”中发现无法读取的内容。是否恢复此工作簿的内容?如果您信任此工作簿的源,请单击“是”

显然,我会单击“是”,然后获取对该文件所做修复的摘要,以及指向包含以下内容的xml格式日志文件的链接:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>error095080_01.xml</logFileName>
    <summary>Errors were detected in file  'C:\TEMP\sampleFromTemplate.xlsx'</summary>
    <repairedRecords summary="Following is a list of repairs:">
        <repairedRecord>Repaired Records: Table from /xl/tables/table1.xml part (Table)</repairedRecord>
    </repairedRecords>
</recoveryLog>
请注意,数据透视表无论如何都是正确填充的,那么为什么会发生这种情况呢


谢谢:-)

问题没有解决,但现在我知道确切原因了。“Table1”不是一个命名范围,而是一个表,我可以通过工作表的“Tables”集合访问它

现在,问题是EPPlus中的表集合和表对象都是只读的,因此我无法从代码中定义表的维度,也无法删除它或添加新的维度以满足我的需要。EPPlus的作者已经提到,它可能有一天会在总线上实现(和),因为这些消息已经有将近3年的历史了,我想看到这种情况发生的希望不大

无论如何,我希望这将帮助任何遇到同样问题的人

[编辑]我终于想出了一种绕过这个问题的方法:ExcelTable对象有一个名为“TableXml”的可写属性,其中包含表的xml定义,当然还有表的范围。以下是我的案例中的内容:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
    <table dataCellStyle="Normal 2" headerRowCellStyle="Normal 2" headerRowDxfId="70" totalsRowShown="0" insertRow="1" ref="A1:U2" displayName="Table1" name="Table1" id="1" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <autoFilter ref="A1:U2"/>
        <tableColumns count="21">
            <tableColumn dataCellStyle="Normal 2" name="Activity" id="1"/>
            <tableColumn dataCellStyle="Normal 2" name="Category" id="21"/>
            [...]
            <tableColumn dataCellStyle="Normal 2" name="Closed Year" id="20" dataDxfId="62"/>
        </tableColumns>
        <tableStyleInfo name="TableStyleMedium9" showColumnStripes="0" showRowStripes="1" showLastColumn="0" showFirstColumn="0"/>
</table>

现在,我的Excel文件已正确生成,“Table1”符合我的数据的实际范围

我自己也遇到了这个问题并解决了它,如果有人遇到这个问题,我会把我的解决方案放在这里:

这是在使用asp.net,因为显而易见的原因,它不适用于其他情况

我的问题不是表格范围,Epplus生成的文件很好,而是服务器响应将页面响应附加到excel文件,显然使文件无效。发送文件后立即结束服务器响应修复了我的问题,具体如下:

Response.BinaryWrite(pck.GetAsByteArray());  // send the file
Response.End();

在编辑工作簿时出现此问题,这些工作簿的标题中的表格具有特殊格式(字体用于显示特殊符号)。必须删除格式才能修复消息。

当我遇到一个错误,在每行后面添加了一个额外的列分隔符时,我遇到了这个问题:

head1{tab}head2{tab}
col11{tab}col21{tab}
col22{tab}col22{tab}

最后一列之后的额外选项卡以同样的方式破坏了生成的Excel电子表格,删除它修复了问题。注意,我使用
LoadFromText
从文本数据一次加载整个工作表。这可能不是OP的问题,但也许未来的搜索者会发现这很有帮助。

我花了大约4个小时来解决这个问题,因为我的问题和解决方案不在帖子中,我为任何未来的访问者写这篇文章

我的问题是由excel工作表中的重复列引起的。在给一列添加空间后,问题就解决了。 有趣的是,当我通过MS excel生成透视表时,错误从未出现过,它只出现在我使用epplus在excel文件中生成透视表时。使bug更难找到

不同的设置(返回流),但存在相同的问题(损坏的表记录)。在我的例子中,问题是对ExcelPackage.Save()的显式调用:


当我使用C#和epplus从表中删除所有行时,我的问题得到了解决。

Table1
这样的定义名称通常是保留的(尽管可以对非表范围使用这样的名称)。如果将该范围称为
Foo1
,会发生什么情况。我没有收到错误,但我的透视表不再工作。我忘记告诉模板中已经存在“Table1”命名范围。我将立即编辑我的问题…Response.End()修复了我的问题。谢谢你的回答。我的问题也解决了!谢谢,太好了。解决了我的问题:)响应。结束()解决了我的问题。谢谢你的回答。(:
Response.BinaryWrite(pck.GetAsByteArray());  // send the file
Response.End();
head1{tab}head2{tab}
col11{tab}col21{tab}
col22{tab}col22{tab}
using (var excelPackage = new ExcelPackage())
{
    /* ... removed code for clarity */

    // caused the stream to contain the file 2 times, 
    // save is already called by GetAsByteArray()                
    //excelPackage.Save(); 

    return new MemoryStream(excelPackage.GetAsByteArray());
}