尝试打开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时出现此错误
您尝试打开的文件格式与其他格式不同 由文件扩展名
指定
单击是后,文件正常打开。但我不希望这个消息出现。
答案 0 :(得分:23)
我使用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。
答案 1 :(得分:5)
您尝试打开的文件格式与其他格式不同 由文件扩展名
指定
您不断收到该警告消息,因为创建的文件不是实际的Excel文件。如果你要查看生成的文件,它只是一堆html标签。请记住,GridView
的RenderControl将生成一个html表。
要解决您的问题,您需要使用第三方工具创建一个真正的Excel文件(您可能想要使用的一个工具是NPOI)或创建一个逗号分隔的文件,或者只是一个csv文件,并返回该文件。
答案 2 :(得分:4)
如果其他人偶然发现了这个......我需要在C#中即时将blob转换回文件。 Pdf的运作良好,excel给了我同样的错误,就像OP解释的那样。
这是我编写的代码,它处理excel与其他文件类型不同。
使用实际文件名给excel application / octet-stream解决了我的问题。可能不是最干净的方式,但它对我的目的来说已经足够了。
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();
答案 3 :(得分:2)
如果有人需要将数据集导出为带有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");