如何导出到 Excel?
本指南没有展示如何创建 Excel 文件,而是展示了使用表格创建 HTML 文件的技巧。 Excel 将尝试使用默认设置导入带有表格的 csv 或 HTML 文件,但这通常会失败。
使用 EPPlus 等库创建正确的 Excel 文件要容易得多。
I我确信这个问题之前已经得到解答,但我找不到一个答案来说明如何从数据创建 Excel 文件并为 xlsx 设置正确的内容类型file.
EPPlus 提供了 LoadFromDataTable 和 LoadFromCollection 方法,用于使用从 DataTable 或通用集合中提取的数据填充 Excel 范围。列或属性名称分别用作标题。
public ActionResult ExportData() { //Somehow, load data to a DataTable using (ExcelPackage package = new ExcelPackage()) { var ws = package.Workbook.Worksheets.Add("My Sheet"); //true generates headers ws.Cells["A1"].LoadFromDataTable(dataTable, true); var stream = new MemoryStream(); package.SaveAs(stream); string fileName = "myfilename.xlsx"; string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; stream.Position = 0; return File(stream, contentType, fileName); } }
LoadFromDataTable 或 LoadFromCollection 返回可用于格式化表格的 Excel 单元格范围:
var range=ws.Cells["A1"].LoadFromDataTable(table); range.Style.Numberformat.Format = "#,##0.00"; range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
您还可以应用将表格样式传递给范围,或者将所需的样式传递给 LoadFromDataTable 或 LoadFromCollection,例如:
ws.Cells[1,1].LoadFromDataTable(table, true, TableStyles.Light1);
该库的 Githup wiki 展示了如何格式化结果、生成公式、数据透视表、处理表等。
如果您想创建,保存到 MemoryStream 可能是一个问题相对较大的纸张。将相同的数据写入两次,一次写入 MemoryStream,然后将其复制到输出,这会浪费周期。不过,直接从 MVC 操作写入输出流是一种不好的做法。诀窍是创建一个处理 EPPlus 包的自定义 FileResult 并返回它,而不是 File 返回的 FileResult,例如:
public class EpplusResult:FileResult { public EpplusResult(ExcelPackage package) : base("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { if (package == null) { throw new ArgumentNullException("package"); } Package = package; } public ExcelPackage Package { get; private set; } protected override void WriteFile(HttpResponseBase response) { // grab chunks of data and write to the output stream Stream outputStream = response.OutputStream; using (Package) { Package.SaveAs(outputStream); } } }
这允许您编写以下操作:
public FileResult ExportData() { ExcelPackage package = new ExcelPackage(); var ws = package.Workbook.Worksheets.Add("My Sheet"); ... ws.Cells[1,1].LoadFromDataTable(table, true, TableStyles.Light1); return new EpplusResult(package){FileDownloadName = "SomeFile.xlsx"}; }
以上是如何使用EPPlus高效地将数据导出到Excel文件?的详细内容。更多信息请关注PHP中文网其他相关文章!