【问题标题】:ASP.NET MVC Excel export file format errorASP.NET MVC Excel 导出文件格式错误
【发布时间】:2014-01-13 18:57:24
【问题描述】:

我目前正在编写一个 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();

}

我已经尝试将 Response.ContentType 设置为其他值(“application/excel”、“application/ms-excel”),但无济于事。一般来说,我对 ASP.NET 和 C# 有点陌生,所以我可能在这里遗漏或做错了一些事情;我更习惯 PHP 和 Zend。您可以提供的任何见解或帮助将不胜感激;谢谢!

【问题讨论】:

  • 旁注:您的示例代码看起来与 ASP.MVC 操作的外观完全不同...ContentFile 会更有意义。
  • 那个 File 方法看起来很整洁,感谢您指出这一点。 (就像我说我是 C# 新手 :))

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


【解决方案1】:

您正在将 HTML 表格编写为 Excel 文件。基本上,你正在接受这样的文字:

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

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

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

【讨论】:

  • +1。请注意,“使用 Excel 库”并不意味着“使用 Excel 互操作”(需要在服务器上运行 Office 应用程序 - 不支持),更像是使用 OpenXml SDK 或任何其他不需要安装 Excel 的库。
  • 你能推荐一个 Excel 库吗?
  • NPOI,OpenXML SDK,除了 Excel 互操作之外的任何东西,就像 @AlexeiLevenkov 说的那样。
【解决方案2】:

我遇到了同样的错误。所以,我开始(使用 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);

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多