web-dev-qa-db-ja.com

開こうとしているファイルは、Asp.Netのファイル拡張子で指定されている形式とは異なる形式です

開こうとしているファイルは、Excelでファイルを開こうとしたときに、ファイル拡張子c#エラーで指定されたものとは異なる形式です。

ここに私のコードがあります

public ActionResult Export(string filterBy)
{
    MemoryStream output = new MemoryStream();
    StreamWriter writer = new StreamWriter(output, Encoding.UTF8);

    var data = City.GetAll().Select(o => new
    {
        CountryName = o.CountryName,
        StateName = o.StateName,
        o.City.Name,
        Title = o.City.STDCode
    }).ToList();
    var grid = new GridView { DataSource = data };
    grid.DataBind();
    var htw = new HtmlTextWriter(writer);

    grid.RenderControl(htw);

    writer.Flush();
    output.Position = 0;

    return File(output, "application/vnd.ms-Excel", "test.xls");

}

excelを開こうとすると、このエラーが発生します

開こうとしているファイルは、ファイル拡張子で指定されたものとは異なる形式です

enter image description here

[はい]をクリックすると、ファイルが適切に開きます。しかし、私はこのメッセージを表示したくありません。

18
Rahul Rajput

CloseXML を使用して問題を解決しました。

public static void ExportToExcel(IEnumerable<dynamic> data, string sheetName)
{
    XLWorkbook wb = new XLWorkbook();
    var ws = wb.Worksheets.Add(sheetName);
    ws.Cell(2, 1).InsertTable(data);
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    HttpContext.Current.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx",sheetName.Replace(" ","_")));

    using (MemoryStream memoryStream = new MemoryStream())
    {
        wb.SaveAs(memoryStream);
        memoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
        memoryStream.Close();
    }

    HttpContext.Current.Response.End();
}

Nuget Package Manager を使用して、プロジェクトにClosedXMLをインストールしました。

23
Rahul Rajput

開こうとしているファイルは、ファイル拡張子で指定されたものとは異なる形式です

作成されたファイルは実際のExcelファイルではないため、常にこの警告メッセージが表示されます。生成されたファイルを調べる場合、それは単なるHTMLタグの束です。 GridViewのRenderControlはhtmlテーブルを生成することに注意してください。

問題を解決するには、実際のExcelファイルを作成するサードパーティツールを使用する必要があります(使用するツールの1つは [〜#〜] npoi [〜#〜] )。カンマ区切りファイル、または単にcsvファイルで、そのファイルを返します。

5
von v.

他の誰かがこれに遭遇した場合に備えて... C#でBLOBをオンザフライでファイルに変換する必要がありました。 Pdfはうまく機能し、ExcelがOPの説明と同じエラーを出してくれました。

これは、Excelを他のファイルタイプとは異なる方法で処理するために書いたコードです。

Excelアプリケーション/オクテットストリームに実際のファイル名を付けると、問題が解決しました。おそらくそれを行うための最もクリーンな方法ではありませんが、それは私の目的には十分でした。

string theExt = Path.GetExtension(theDoc.documentFileName).ToUpper();

Response.Clear();

if (theExt == ".XLS" || theExt == ".XLSX"){
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentFileName));
    }
else{
    Response.ContentType = theDoc.documentMimeType;
    Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentTitle));
}

using (MemoryStream stream = new MemoryStream(theDoc.file))
{
    stream.WriteTo(Response.OutputStream);
    stream.Close();
};

Response.End();
4
Mike Wallace

誰かが CloseXML でExcelファイルとしてデータセットをエクスポートする必要がある場合。

Dataset ds = { your data from db }
var xlsx = new XLWorkbook();
var dataTable = ds.Tables[0];

xlsx.Worksheets.Add(dataTable);

xlsx.SaveAs("export.xlsx");
2
dvdmn