2016-12-01 60 views
1

ASP.Netでは、NPOIを使用してExcelのドキュメントに保存していますが、バージョン2以上に移動しました。 xlsxへの書き込みはうまくいきましたが、xlsxへの切り替えはもう少し難しいです。私の新しい改善されたコードは、出力ファイルに多くのNUL文字を追加しています。Response.OutputStreamに書き込むときに壊れたXLSXファイルを取得する

その結果、「一部のコンテンツに問題があります」という文章がExcelから届きましたが、回復してもらいたいのですか?

私の16進エディタから作成されたxlsxファイルの写真は次のとおりです。 BadXlsxHexImageこれらの00sは数ページにわたって続きます。ファイルがエラーなく開かれるまで、私は文字通りエディタでそれらを削除しました。

なぜこのコードは非常に多くのNULをこのファイルに追加しますか?

using (var exportData = new MemoryStream()) 
{ 
    workbook.Write(exportData); 
    byte[] buf = exportData.GetBuffer(); 

    string saveAsFileName = sFileName + ".xlsx"; 

    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}; size={1}", saveAsFileName, buf.Length.ToString())); 
    Response.Clear(); 
    Response.OutputStream.Write(buf, 0, buf.Length); 
    exportData.Close(); 
    Response.BufferOutput = true; 
    Response.Flush(); 
    Response.Close(); 
} 

(私はすでにResponse.Closeの代わりにOutputStream.Writeの代わりにBinaryWriteResponse.Endを試みたが、バッファの長さでContent-Lengthを設定しました。また、これのどれもが、XLSへの書き込みの問題ではなかったが。)

+0

は、私はXLSXを作成するために考えて最高の一つである約https://epplus.codeplex.com/ – andrefadila

答えて

1

MemoryStreamGetBufferを使用しているため、ヌルバイトの束が得られる理由があります。これは、割り当てられた内部バッファ配列全体を返します。バッファ配列には、バッファが完全にいっぱいになっていない場合は、データの終わりを超えた未使用のバイトが含まれます。あなたが間違いなくバッファ内のデータを取得したい場合は、ToArrayを代わりに使用してください。

つまり、なぜあなたはMemoryStreamに書いていますか?書き込み先のストリームが既にあります:OutputStream。ワークブックを直接書くだけです。

このようにそれを試してみてください:あなたはここで、別のlibを使用したい場合には

Response.Clear(); 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", saveAsFileName)); 
workbook.Write(Response.OutputStream); 
Response.Flush(); 
Response.Close(); 
+0

ナイスキャッチ'OutputStream'を使います。その変更はそれを完全にクリアしました!私は 'GetBuffer'がトリミングを処理することを期待していましたが、実際には裏で役に立つのではなくバッファを実際に取得することを知っておいてよかったです。 –

+0

このコードはdownload.aspxのPage_Loadイベントから呼び出されます。 FirefoxとIEはそれをうまく処理しますが、Chromeはページ内のHTMLを処理し続け、バッファに追加します。 これを説明するためにこのコードを改訂する必要がありますか?たぶん 'OutputStream'を終了しますか? (私は 'OutputStream.End()'を試みたが、それは役に立たなかった)。 –

関連する問題