1

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

1 回答 1

1

它未正确呈现的原因是因为您不能只返回 mime 类型并期望框架找出其余的。

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

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

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

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);
}
于 2015-11-26T10:01:41.373 回答