最新封装了一个导出Excel文件的方法,如下所示,只要传入文件参数和数据就能下载对应的Excel文件。
[HttpGet("ExportExcel")]
public IActionResult ExportExcel() {
var settings = new ExportSettings() {
FileName = "文件名"
};
var datas = new List<ExportData>()
{
new ExportData{
Name = "张无忌",
Sex = "男"
},
new ExportData{
Name = "周芷若",
Sex = "女"
},
new ExportData{
Name = "赵敏"
},
new ExportData{
Sex = "男"
}
};
return ExportExcel(settings, datas);
}
以上代码可以获得这样的文件(文件名.xlsx)
下面来讲讲封装的思路和教程。
1.在.net core的web项目中添加Nuget包 EPPlus.Core
2.在某个你喜欢的控制器中引用它 using OfficeOpenXml;
3.新建一个用来定义导出文件的文件名和Worksheet名的类,这个类的类名和属性需要和这里的一样,不可修改:
public class ExportSettings
{
public string FileName { get; set; } = $"{Guid.NewGuid().ToString()}";
public string WorksheetName { get; set; } = "Worksheet";
}
4.新建一个用来存数据的类,这个类的Description定义的值,就是未来excel文档表头的的名字。然后这个类的类名和属性都没有任何限制,可以根据你的实际需要,自行修改,只要在属性前面加上Description,就会有这个字段对应的head。如上图所示。
public class ExportData
{
[Description("姓名")]
public string Name { get; set; }
[Description("性别")]
public string Sex { get; set; }
}
5.然后把下面的这个方法复制进你的控制器的类里面,这是一个泛型的方法,主要是利用反射读取类的所有属性,再按顺序填进excel表里面,这也是为什么,第4步中没有限制类名和属性名的原因。其次还做了自动适配宽度的处理。
private IActionResult ExportExcel<T>(ExportSettings settings, List<T> datas) where T : class
{
var stream = new MemoryStream();
using (ExcelPackage package = new ExcelPackage(stream))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(settings.WorksheetName);
var i = 0;
var propertyInfos = typeof(T).GetProperties();
foreach (PropertyInfo property in propertyInfos)
{
var objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true);
var headName = ((DescriptionAttribute)objs[0]).Description;
worksheet.Cells[1, ++i].Value = headName;
worksheet.Column(i).Width = headName.Length * 2.5;
}
var rowNum = 2;
foreach (var data in datas)
{
i = 0;
foreach (PropertyInfo property in propertyInfos)
{
worksheet.Cells[rowNum, ++i].Value = (property.GetValue(data, null) ?? "").ToString();
}
rowNum++;
}
package.Save();
}
stream.Position = 0;
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", settings.FileName + ".xlsx");
}
}
6.构造自己的标题与数据,如下
[HttpGet("ExportExcel")]
public IActionResult ExportExcel() {
var settings = new ExportSettings() {
FileName = "文件名"
};
var datas = new List<ExportData>()
{
new ExportData{
Name = "张无忌",
Sex = "男"
},
new ExportData{
Name = "周芷若",
Sex = "女"
},
new ExportData{
Name = "赵敏"
},
new ExportData{
Sex = "男"
}
};
return ExportExcel(settings, datas);
}
最后,访问链接,就可以成功下载excel文件了。
总结:文章参考https://www.cnblogs.com/shy-huang/p/9076062.html,经过优化而来,主要解决了原文中复用较差,使用较难的问题,无法拓展等问题。
但是对一个excel文件中只能有一个Worksheet,表头只能支持单行等问题,没有做优化和处理。如果这两个问题都不是你在乎的问题的话,强烈推荐使用!