15

EPPlusを使用してExcelファイルを生成しようとすると、Excelから次のエラーメッセージが表示されます。

ファイル形式またはファイル拡張子が無効なため、Excelはファイル'myfilename.xlsx'を開くことができません。ファイルが破損していないこと、およびファイル拡張子がファイルの形式と一致していることを確認してください。

これが私のコードです:

public ActionResult Index()
{
    using (ExcelPackage package = new ExcelPackage())
    {
        // I populate the worksheet here.  I'm 90% sure this is fine
        // because the stream file size changes based on what I pass to it.

        var stream = new MemoryStream();
        package.SaveAs(stream);

        string fileName = "myfilename.xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        var cd = new System.Net.Mime.ContentDisposition
        {
            Inline = false,
            FileName = fileName
        };
        Response.AppendHeader("Content-Disposition", cd.ToString());
        return File(stream, contentType, fileName);
    }
}

私が間違っていることについて何か考えはありますか?

4

3 に答える 3

31

ストリームの位置をリセットするだけです。stream.Position = 0;

Response に直接書き込むべきではありません。MVCの方法ではありません。正しい MVC パイプラインに従わず、コントローラー アクション コードを Response オブジェクトに密結合します。

の 3 番目のパラメーターとしてファイル名を追加するとFile()、MVC は自動的に正しいContent-Dispositionヘッダーを追加します。そのため、手動で追加する必要はありません。

要するに、これはあなたが望むものです:

public ActionResult Index()
{
    using (ExcelPackage package = new ExcelPackage())
    {
        // I populate the worksheet here.  I'm 90% sure this is fine
        // because the stream file size changes based on what I pass to it.

        var stream = new MemoryStream();
        package.SaveAs(stream);

        string fileName = "myfilename.xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        stream.Position = 0;
        return File(stream, contentType, fileName);
    }
}
于 2012-09-03T18:57:20.537 に答える
10

あなたのコードはstreamHttpResponseおそらくFileあなたが投稿していないメソッドで行われていることを示していません。

機能する1つの方法は次のとおりです。

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader(
            "content-disposition", String.Format(CultureInfo.InvariantCulture, "attachment; filename={0}", fileName));
Response.BinaryWrite(package.GetAsByteArray());
Response.End();
于 2012-03-07T20:37:31.520 に答える