2017-06-22 177 views
0

私はこのコードを使用して、エキサイティングなExcelファイルに書き込みます。ファイルを書き込んだ後、ファイルを手動で開くと、ファイルが破損しています。私はNPOIバイナリ2.3.0.0を使用していますどのように壊れてExcelを避けるために指示してください。NPOI - ファイルを保存した後に破損します.xlsxブック

[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で修正されていると言いましたが、まだ私のために働いていません

答えて

0

ここではいくつか問題が起こっています。

まず、.xlsxファイルで開始していますが、ダウンロードファイルの拡張子を.xlsに変更しています。 .xls.xlsxは同じファイル形式ではありません。前者はバイナリ形式で、後者は圧縮されたXML形式です。間違った拡張子でファイルを保存すると、ファイルが開かれたときに破損したとExcelが報告します。

第2に、間違った方法を使用してMemoryStreamからデータを取得しています。 GetBufferバッファが完全に満杯でない場合、データの終わりを超えている未使用のバイトを含む全体の割り当て内部バッファ配列を返します。余分なヌルバイトにより、ダウンロードしたファイルが破損します。バッファ内のデータだけを取得する場合は、代わりにToArrayを使用する必要があります。

第3に、メソッドの[Authorize]属性の存在に基づいてASP.NET MVCフレームワークを使用しているようですが、コントローラーに組み込まれた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); 
} 
:ここ

は修正されたコードです

関連する問題