ASP.NET MVC Excel导出文件格式错误

我目前正在编写一个ASP.NET MVC 5控制器操作来导出一些数据到一个Excel文件(使用我在这里find的一些代码)。 它工作…大多数。 它输出一个Excel文件,我可以打开,但不显示以下错误消息之前:

“Export.xls的文件格式和扩展名不匹配,文件可能被破坏或者不安全,除非你信任它,否则不要打开它,你想打开吗?

我继续select“是”,然后打开。 我可以将其重新保存在我的机器上,并打开该文件,我不会得到错误。 它可以很好地工作,唯一的另外一个奇怪之处在于,文件的网格线的格式与Excel文件的格式不同,几乎更像HTML表格而不是Excel表格。 但是,奇怪的错误信息不是在这里可以接受的,所以我必须解决它。

这是我的代码:

public void ExportExcel() { // DataObject is a class that fetches the data for this method DataObject dataObj = new DataObject(); var grid = new GridView(); // dataObj.GetDataList returns a List<T> of data model class objects grid.DataSource = dataObj.GetDataList(); grid.DataBind(); Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=Export.xls"); Response.ContentType = "application/vnd.ms-excel"; Response.Charset = ""; StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); grid.RenderControl(htw); byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString()); MemoryStream s = new MemoryStream(byteArray); StreamReader sr = new StreamReader(s, Encoding.ASCII); Response.Write(sr.ReadToEnd()); Response.End(); } 

我已经尝试将Response.ContentType设置为其他值(“application / excel”,“application / ms-excel”),无济于事。 一般来说,我对ASP.NET和C#有点新鲜,所以可能会有一些我在这里错过或做错的地方; 我更习惯于PHP和Zend。 任何洞察力或帮助你可以给予不胜感激; 谢谢!

您正在编写一个HTML表格作为Excel文件。 基本上,你正在用这个文本:

 <table> <tr> <td> Stuff </td> </tr> </table> 

并把它写成一个扩展名为.xls的文本文件。 Excel是足够“聪明的”(如果可以的话)打开文件并正确显示,尽pipe它提醒你文件实际上并不是xls文件。

你需要处理它(不是一个好的解决scheme),将表中的数据转换为csv并发送一个CSV(一个更好的解决scheme),或使用Excel库创build一个实际的Excel文件并发送。 其中,CSV可能是最简单的。

我得到了同样的错误。 所以,我开始(使用Microsoft.Office.Interop.Excel)从Nugetpipe理器。

 Here is the code Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application(); Workbook wb = xla.Workbooks.Add(XlSheetType.xlWorksheet); Worksheet ws = (Worksheet)xla.ActiveSheet; 

/ *标题在这里* /

  ws.Cells[1, 1] = "Header1"; ws.Cells[1, 2] = "Header2"; ws.Cells[1, 3] = "Header3"; ws.Cells[1, 4] = "Header4"; ws.Cells[1, 5] = "Header5"; int i = 2; 

/ *在这里使用你的列表来填充数据行* /

  foreach (var a in pavmm.Funds) { ws.Cells[i, 1] = a.FilingID; ws.Cells[i, 2] = a.Security_Name; ws.Cells[i, 3] = a.Filing_Type; ws.Cells[i, 4] = a.st_name; ws.Cells[i, 5] = a.Permit; i = i + 1; } ws.Columns.AutoFit(); ws.Rows.AutoFit(); string folder = NewFolderName + "\\"; if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); string filename = ExcelsheetName + ".xlsx"; filename = filename.Replace('/', '-'); filename = filename.Replace('\\', '-'); string path = Path.Combine(folder, filename); wb.SaveCopyAs(path);