【问题标题】:Trouble exporting to excel from mvc action从 mvc 操作导出到 excel 时遇到问题
【发布时间】:2016-01-07 18:36:22
【问题描述】:

我创建了一个简单的动作来将一些内容下载为 excel 文件:

public FileResult ExportToExcel()
    {
        string filename = "list.xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        List<string[]> list = new List<string[]>();
        list.Add(new[] { "col1", "col2", "cols3" });
        list.Add(new[] { "col4", "col5", "cols6" });
        list.Add(new[] { "col7", "col8", "cols9" });

        StringWriter sw = new StringWriter();

        sw.WriteLine("ID,Date,Description");

        foreach (string[] item in list)
        {
            sw.WriteLine("{0},{1},{2}", item[0], item[1], item[2]);
        }

        byte[] fileContents = Encoding.UTF8.GetBytes(sw.ToString());

        return this.File(fileContents, contentType, filename);
    }

我有两个问题:

1.文件已下载,但我无法打开它并收到警告:

Excel 无法打开文件...因为文件格式或文件扩展名无效。验证文件没有损坏,并且文件扩展名与文件格式匹配。

当我使用旧的 excel 格式时:

        string filename = "List.xls";
        string contentType = "application/vnd.ms-excel";

我可以打开文件,但在收到 3 次关于文件损坏等不同警告后。

顺便说一句,我比较了保存并尝试将文件写为 pdf

        string filename = "List.pdf";
        string contentType = "application/pdf";

我仍然无法打开文件 - 它说格式无效等。

2.内容出现在第二个示例的文件中,但是逗号不被识别为列分隔符,一行中的所有数据都写为一列。

excel格式使用什么分隔符或如何将数据写入文件以使其成为表格excel格式?

对我来说理想的解决方案是返回导出的视图(强类型),但到目前为止我还没有弄清楚如何去做。

--- 编辑:工作解决方案---

public FileResult ExportToExcel()
    {
        string filename = "List.xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        List<string[]> titles = new List<string[]>() { new[] { "a", "be", "ce" } };
        List<string[]> list = new List<string[]>
                                  {
                                      new[] { "col1", "col2", "cols3" },
                                      new[] { "col4", "col5", "cols6" },
                                      new[] { "col7", "col8", "cols9" },
                                      new[] { "col10", "col11", "cols12" }
                                  };

        XLWorkbook wb = new XLWorkbook();
        XLTables xt = new XLTables();
        var ws = wb.Worksheets.Add("List");
        ws.Cell(1, 1).InsertData(titles);
        ws.Cell(2, 1).InsertData(list);
        ws.Columns().AdjustToContents();

        var stream = new MemoryStream();
        wb.SaveAs(stream);
        stream.Seek(0, SeekOrigin.Begin);
        wb.Dispose();

        return this.File(stream, contentType, filename);
    }

【问题讨论】:

    标签: asp.net-mvc export-to-excel xlsx fileresult filecontentresult


    【解决方案1】:

    它没有被正确渲染的原因是因为你不能只返回 mime 类型并期望框架找出其余的。

    我会使用一个名为 closedXML 的 nuget 包,它允许您在内存中创建一个 excel 文件并将其流式传输回客户端。

    它附带完整的文档 (here) 以获取更多信息。

    使用这个包你可以做类似的事情

    XLWorkbook wb = new XLWorkbook();
    XLTables xt = new XLTables();
    var ws = wb.Worksheets.Add("Sheet 1");
    var firstCell = ws.Cell(1, 1);
    var lastCell = ws.Cell(3, list.Count);
    var table = ws.Range(firstCell.Address, lastCell.Address).AsTable();
    table.Cell(2, 1).InsertData(list);
    table.CreateTable();
    ws.Columns().AdjustToContents();
    
    using(var stream = new MemoryStream())
    {
        wb.SaveAs(stream);
        stream.Seek(0, SeekOrigin.Begin);
        wb.Dispose();
        return File(stream , contentType, filename);
    }
    

    【讨论】:

    • 我安装了这个包并试图运行你的代码。但是我得到了:Cannot access a closed stream@Qpirate
    • 我已经从 `using' 块中删除了 new MemoryStream() 并修复了错误。我现在可以正确地在列中写入数据,但它没有解决打开文件@Qpirate 的问题 - 它仍然警告文件已损坏。
    • 尝试将内容类型更改为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml 我认为您的内容类型中缺少 +xml
    • 是的,就是这样。我在添加列标题时也遇到了麻烦,请在答案编辑中查看我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 2020-11-19
    • 2015-03-04
    • 1970-01-01
    • 2019-12-10
    • 2019-08-25
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多