1

MemoryStreamExcel ドキュメントを作成するための API と EPPlus を使用して、メモリ内に Excel ファイルを作成しています。

Excelファイルを作成するための私のコードは、基本的に次のようになります。

public Stream GetXlsDocument(IQueryable data)
{

    const string sheetName = "Sheet1";
    var file = new FileInfo("test2.xls");

    MemoryStream stream = new MemoryStream();
    using (ExcelPackage p = new ExcelPackage(stream))
    {
        p.Workbook.Worksheets.Add(sheetName);

        ExcelWorksheet ws = p.Workbook.Worksheets[1];
        ws.Name = sheetName;
        ws.Cells.Style.Font.Size = 11;
        ws.Cells.Style.Font.Name = "Calibri";

        // Headers
        ws.SetValue(1, 1, "Some data");

        p.SaveAs(stream);
    }

    stream.Position = 0;
    return stream;
}

次に、他の関数がこのストリームをダウンロードとしてユーザーに提供する必要があります。私はこのようにしようとしています:

var file = Documents.GetXlsDocument();

var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);

Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", "attachment; filename=nfile.xls");
Response.BinaryWrite(memoryStream.ToArray());
Response.End();

これにより、ダウンロードダイアログが表示されます。しかし、Excelファイルを開くと、Excelドキュメント全体がゴミでいっぱいになります(文字列として表されたバイナリデータだと思います)。

私は何が間違っているのか分かりません。

Excelファイルを適切な形式でダウンロード可能にする方法を知っている人はいますか? おそらく、EPPlus はすでにこのための何かを持っていますか?

4

2 に答える 2

2

コンストラクターにストリームを追加しないでください。コンストラクターを空のままにします。

したがって、次の行を変更します。

using (ExcelPackage p = new ExcelPackage(stream))

これに:

using (ExcelPackage p = new ExcelPackage())
于 2012-09-12T14:24:11.797 に答える
0

タイプとして「Response.ContentType」を使用application/octet-streamします。これにより、ほとんどのブラウザはファイルをデータとして扱い、他に何もダウンロードしないように指示されます。

于 2012-09-12T13:15:04.467 に答える