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

Tre*_*ntD 3 c# asp.net-mvc excel export-to-excel

我目前正在编写ASP.NET MVC 5控制器操作以将一些数据导出到Excel文件(使用我在此处找到的一些代码).它主要起作用.它输出一个Excel文件,我可以打开,但不会在显示以下错误消息之前:

"'Export.xls'的文件格式和扩展名不匹配.文件可能已损坏或不安全.除非您信任它的来源,否则请不要打开它.无论如何要打开它吗?"

我继续选择"是",然后打开.我可以在我的机器上重新保存并打开该文件,但我没有收到错误.它可以正常工作,唯一的另一个奇怪的是文件的网格线格式与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();

}
Run Code Online (Sandbox Code Playgroud)

我已经尝试将Response.ContentType设置为其他值("application/excel","application/ms-excel"),但无济于事.我对ASP.NET和C#一般都是新手,因此可能会有一些我在这里缺少或做错的事情; 我更习惯PHP和Zend.您将给予的任何见解或帮助将不胜感激; 谢谢!

Dav*_*ych 5

您正在将HTML表格编写为Excel文件.基本上,你正在用这个文字:

<table>
    <tr>
        <td>
            Stuff
       </td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

并将其写为带.xls扩展名的文本文件.Excel足够"智能"(如果你可以称之为)打开文件并正确显示它,尽管它会提醒你文件实际上不是xls文件.

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

  • +1.请注意,"使用Excel库"并不意味着"使用Excel互操作"(这需要在服务器上运行Office应用程序 - 不受支持),更像是使用OpenXml SDK或任何其他不需要安装Excel的库. (3认同)
  • NPOI,OpenXML SDK,除了Excel Interop之外的任何东西,比如@AlexeiLevenkov说. (2认同)