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

Zip*_*ive 15 .net c# excel xlsx epplus

当我使用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>
Run Code Online (Sandbox Code Playgroud)

这显然是由我在代码中定义的命名范围("Table1")引起的,用于指示要用于数据透视表的数据.模板中已经有一个名为"Table1"的"表名",但我似乎无法通过ExcelPackage.Worksheet.Names集合访问它.作为EPPlus的新手,并没有非常熟悉Excel,我不明白我做错了什么.这是我生成文件的代码:

private string GenerateFromTemplate(string fileName, string templateName, DataTable tab)
{
    FileInfo newFile = new FileInfo(string.Format("C:\\MyPath\\{0}.xlsx", fileName));
    FileInfo templateFile = new FileInfo(string.Format("C:\\MyPath\\{0}.xlsx", templateName));

    try
    {
        using (ExcelPackage pkg = new ExcelPackage(newFile, templateFile))
        {
            ExcelWorksheet sheet = pkg.Workbook.Worksheets["MyDataSheet"];
            ExcelRange range = sheet.Cells[string.Format("A1:U{0}", dt.Rows.Count)];
            pkg.Workbook.Names.Add("Table1", range as ExcelRangeBase);

            int sheetRowIndex = 2;

            foreach (DataRow row in this.dt.Rows)
            {
                sheet.Cells[sheetRowIndex, 1].Value = row["Row1"];
                sheet.Cells[sheetRowIndex, 2].Value = row["Row2"];
                [...]
                sheet.Cells[sheetRowIndex, 21].Value = row["Row21"];

                sheetRowIndex++;
            }

            pkg.Save();
            return newFile.FullName;
        }
    }
    catch (IOException ex) { return ex.Message; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,无论如何都要正确填充数据透视表,为什么会发生这种情况呢?

谢谢 :-)

小智 28

我自己遇到了这个问题并修复了它,如果其他人遇到它,请将我的解决方案放在这里:

这是使用asp.net,原因显而易见,它不适用.

我的问题不是表格范围,Epplus生成的文件很好,而是服务器响应将页面响应附加到excel文件,显然使文件无效.发送文件后立即结束服务器响应修复了我的问题,有些事情可以调整:

Response.BinaryWrite(pck.GetAsByteArray());  // send the file
Response.End();
Run Code Online (Sandbox Code Playgroud)


Zip*_*ive 8

问题没有解决,但现在我知道原因.这个"Table1"的东西不是命名范围而是一个表,我可以通过工作表的"Tables"集合访问它.

现在,问题是EPPlus中的Tables集合和Table对象都是只读的,所以我不能从我的代码中定义表的维度,也不能删除它或添加新的以满足我的需要.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>
Run Code Online (Sandbox Code Playgroud)

我们感兴趣的是"table"和"autoFilter"节点中的"ref"属性,因为更改它们的值允许重新定义表的范围.

我这样做了:

XmlDocument tabXml = sheet.Tables(0).TableXml;
XmlNode tableNode = tabXml.ChildNodes[1];
tableNode.Attributes["ref"].Value = string.Format("A1:U{0}", dt.Rows.Count + 1);
XmlNode autoFilterNode = tableNode.ChildNodes[0];
autoFilterNode.Attributes["ref"].Value = string.Format("A1:U{0}", dt.Rows.Count + 1);
Run Code Online (Sandbox Code Playgroud)

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


Raj*_*mal 5

我花了大约4个小时来解决此问题,因为我的问题和解决方案不在帖子中,所以我正在为以后的任何访问者编写它,

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