開こうとしているファイルは、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を開こうとすると、このエラーが発生します
開こうとしているファイルは、ファイル拡張子で指定されたものとは異なる形式です
[はい]をクリックすると、ファイルが適切に開きます。しかし、私はこのメッセージを表示したくありません。
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をインストールしました。
開こうとしているファイルは、ファイル拡張子で指定されたものとは異なる形式です
作成されたファイルは実際のExcelファイルではないため、常にこの警告メッセージが表示されます。生成されたファイルを調べる場合、それは単なるHTMLタグの束です。 GridView
のRenderControlはhtmlテーブルを生成することに注意してください。
問題を解決するには、実際のExcelファイルを作成するサードパーティツールを使用する必要があります(使用するツールの1つは [〜#〜] npoi [〜#〜] )。カンマ区切りファイル、または単にcsvファイルで、そのファイルを返します。
他の誰かがこれに遭遇した場合に備えて... 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();
誰かが 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");