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

时间:2014-01-13 18:57:24

标签: c# asp.net-mvc excel export-to-excel

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

“'Export.xls'的文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任它的来源,否则请不要打开它。你还要打开它吗?”< / p>

我继续选择“是”,然后打开。我可以在我的机器上重新保存并打开该文件,但我没有收到错误。它可以正常工作,唯一的另一个奇怪的是文件的网格线格式与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。您将给予的任何见解或帮助将不胜感激;谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

并将其编写为带有.xls扩展名的文本文件。 Excel足够“智能”(如果您可以调用它)打开文件并正确显示它,尽管它会提醒您文件实际上不是xls文件。

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

答案 1 :(得分:0)

我得到了同样的错误。所以,我开始(使用Microsoft.Office.Interop.Excel)从Nuget Manager获取它。

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);