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