簡體   English   中英

C# 中的 OfficeOpenXML EPPlus - Excel 文件在寫入一定大小的數據后會損壞

[英]OfficeOpenXML EPPlus in C# - Excel file becomes corrupt after a certain size of data is written to it

我正在使用OfficeOpenXML庫在我的.NET MVC應用程序中導出 excel 數據。 然而,我注意到一些有趣的事情正在發生。 我能夠下載該文件,但打開它時,我收到以下消息提示。 如果我點擊“是”,所有數據都會顯示沒有任何問題。

我注意到只有在將一定數量的數據寫入 excel 文件后才會出現此提示。 而且數量不是很大。 如果我按照提示顯示的方式寫入 1000 行數據,但沒有顯示 10 行。

在此處輸入圖片說明

代碼如下:

public static ExcelPackage GenerateExcelFile<T>(ExcelPackage pck)
{
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Data");
    DataTable dt = new DataTable();

    dt.Columns.Add(new DataColumn { ColumnName = "A" });
    dt.Columns.Add(new DataColumn { ColumnName = "B" });
    dt.Columns.Add(new DataColumn { ColumnName = "C" });
    dt.Columns.Add(new DataColumn { ColumnName = "D" });
    dt.Columns.Add(new DataColumn { ColumnName = "E" });

    for (int i = 0; i < 1000; i++)
    {
        DataRow row = dt.NewRow();
        row["A"] = "Value";
        row["B"] = "Value";
        row["C"] = "Value";
        row["D"] = "Value";
        row["E"] = "Value";
        dt.Rows.Add(row);
    }
    ws.Cells["A1"].LoadFromDataTable(dt, true);
    return pck;
}

這是從以下控制器中獲取的:

public HttpResponseMessage ExportGridToExcelWithFilters ()
{
    using (ExcelPackage pck = new ExcelPackage())
    {
        var excelData = ExcelExportVM.GenerateExcelFile(pck);
        using (MemoryStream ms = new MemoryStream())
        {
            excelData.SaveAs(ms);
            HttpResponseMessage responsePackage = new HttpResponseMessage();
            responsePackage.Content = new ByteArrayContent(ms.GetBuffer());
            responsePackage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            return responsePackage;
        }
    }
}

更改上面的代碼以產生更少的數據:

for (int i = 0; i < 10; i++) //FROM 1000
{
    DataRow row = dt.NewRow();
    row["A"] = "Value";
    row["B"] = "Value";
    row["C"] = "Value";
    row["D"] = "Value";
    row["E"] = "Value";
    dt.Rows.Add(row);
}  

它現在可以工作了,我可以在不進入恢復模式的情況下打開文件。

我遇到了同樣的問題,這是由內存流和錯誤代碼引起的:)

當您在文件保存后處理流時,我可以假設您正在嘗試將其發送到某個地方,例如 HttpResponse,並且如果您在那里進行MemoryStreambyte[]轉換,則不應使用GetBuffer()方法來完成,請調用ToArray()代替。

暫無
暫無

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

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