簡體   English   中英

NPOI-保存到文件后,.xlsx工作簿損壞

[英]NPOI - After saving to file corrupts .xlsx workbook

我使用此代碼編寫了一個令人興奮的Excel文件。 寫入文件后,當我手動打開文件時,文件已損壞。 我正在使用NPOI二進制2.3.0.0,請告訴如何避免excel損壞。

[Authorize]
public void ExportUsers()
{
    var path = Server.MapPath(@"~\Content\ExportTemplates\") + "sample.xlsx";

    FileStream sw = new FileStream(path, FileMode.Open, FileAccess.Read);

    IWorkbook workbook = WorkbookFactory.Create(sw);       

    ISheet sheet = workbook.GetSheetAt(0);
    IRow row = sheet.GetRow(12);

    ICell cell = row.CreateCell(row.LastCellNum);
    cell.SetCellValue("test");
    workbook.CreateSheet("Ripon");            
    sw.Close();

    using (var exportData = new MemoryStream())
    {
        workbook.Write(exportData);
        string saveAsFileName = string.Format("Export-{0:d}.xls", DateTime.Now).Replace("/", "-");
        System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", saveAsFileName));
        System.Web.HttpContext.Current.Response.Clear();
        System.Web.HttpContext.Current.Response.BinaryWrite(exportData.GetBuffer());
        System.Web.HttpContext.Current.Response.End();                    
    }
}

新文件已創建但已損壞。 我見過有人說此問題已在2.0.6版中修復,但仍不適用於我

這里有幾個問題。

首先,您從.xlsx文件開始,然后將下載文件擴展名更改為.xls .xls.xlsx文件格式不同; 前者是二進制格式,而后者是壓縮的XML格式。 如果您使用錯誤的擴展名保存文件,則Excel在打開文件時會報告該文件已損壞。

其次,您使用了錯誤的方法從MemoryStream獲取數據。 GetBuffer將返回整個分配的內部緩沖區數組,如果緩沖區未完全滿,它將包含超出數據末尾的所有未使用字節。 多余的空字節將導致下載的文件損壞。 如果只想獲取緩沖區中的數據,則應改用ToArray

第三,看起來您正在使用ASP.NET MVC框架(基於方法中[Authorize]屬性的存在),但是您正在直接操縱當前響應,而不是使用控制器的內置File方法來返回可下載的文件。 我建議盡可能使用內置方法,因為這會使您的代碼更簡潔。

這是更正的代碼:

[Authorize]
public ActionResult ExportUsers()
{
    var path = Server.MapPath(@"~\Content\ExportTemplates\") + "sample.xlsx";

    FileStream sw = new FileStream(path, FileMode.Open, FileAccess.Read);

    IWorkbook workbook = WorkbookFactory.Create(sw);

    ISheet sheet = workbook.GetSheetAt(0);
    IRow row = sheet.GetRow(12);

    ICell cell = row.CreateCell(row.LastCellNum);
    cell.SetCellValue("test");
    workbook.CreateSheet("Ripon");
    sw.Close();

    var exportData = new MemoryStream();
    workbook.Write(exportData);
    exportData.Seek(0, SeekOrigin.Begin);  // reset stream to beginning so it can be read

    string saveAsFileName = string.Format("Export-{0:d}.xlsx", DateTime.Now).Replace("/", "-");

    return File(exportData, "application/vnd.ms-excel", saveAsFileName);
}

暫無
暫無

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

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