簡體   English   中英

使用 EPPlus 生成的 Excel 文件中的不可讀內容

[英]Unreadable content in Excel file generated with 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>

這顯然是由我在代碼中定義的命名范圍(“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; }
}

請注意,無論如何都正確填充了數據透視表,為什么會發生這種情況?

謝謝:-)

我只是自己遇到了這個問題並修復了它,如果其他人遇到它,請將我的解決方案放在這里:

這是使用asp.net,出於明顯的原因,它在其他情況下不適用。

我的問題不是表格范圍,Epplus 生成的文件很好,而是服務器響應將頁面響應附加到 excel 文件,顯然使文件無效。 發送文件后立即結束服務器響應解決了我的問題,有些事情是這樣的:

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

問題沒有解決,但現在我確切地知道為什么。 這個“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>

我們在這里感興趣的是“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);

現在我的 Excel 文件正確生成,“Table1”適合我的數據的實際范圍!

我花了大約 4 個小時解決這個問題,由於我的問題和解決方案不在帖子中,我正在為任何未來的訪問者編寫它,

我的問題是由 Excel 表中的重復列引起的。 為一列添加空間后,問題解決了。 有趣的是,當我通過 MS excel 生成數據透視表時從未出現錯誤,只有當我使用 epplus 在 excel 文件中生成數據透視表時才會出現錯誤。 使錯誤更難發現

當我有一個錯誤在每行后添加一個額外的列分隔符時,我遇到了這個問題:

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

最后一列之后的額外選項卡以同樣的方式破壞了生成的 Excel 電子表格,刪除它可以解決問題。 注意我正在使用LoadFromText從文本數據中一次性加載整個工作表。 這可能不是 OP 的問題,但也許未來的搜索者會發現這很有幫助。

在編輯帶有特殊格式(Windings 字體用於顯示特殊符號)的表的工作簿時遇到此問題。 必須刪除格式才能修復消息。

不同的設置(返回一個流),但同樣的問題(損壞的表記錄)。 就我而言,問題是對 ExcelPackage.Save() 的顯式調用:

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());
}

當我使用 C# 和 epplus 從表中刪除所有行時,我的問題解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM