无法从 mvc 操作导出到 excel

Trouble exporting to excel from mvc action

我创建了一个简单的操作来将一些内容下载为 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);
    }

我有 2 个问题:

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 格式使用什么分隔符或如何将数据写入文件以使其成为 table excel 格式?

对我来说理想的解决方案就是 return 导出视图(强类型),但到目前为止我还不知道如何去做。

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

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

它没有被正确呈现的原因是因为你不能只 return 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);
}