ClosedXML.Report是一个开源的Excel报表引擎
在网上搜索了一下其使用,有一篇文章有介绍:
c# ClosedXML.Report excel报表排坑 - 秋雨雁南飞 - 博客园 (cnblogs.com)
其中数据集定义区域名称,对我很有帮助,但其他地方有些错误,尤其是对于数据集中item的理解,其实这个报表是可以显示多层次数据的,并能显示多张数据表的,其显示方式和C#中编程引用变量的路径一致。
目前个人测试的结果,就是能显示各种层级结构的数据变量,功能还是很强大的,遗憾的是目前还不能显示Chart图表。
1、创建报表模板
通过Excel创建xlsx模板
注意:上图红色区域,需要在excel中,设置区域名称为item,否则无法填充数据,其中的区域名称”item”,是在程序中添加变量时映射的名称,可以是任意合法的名称,但Excel模板集合中字段的第一个根节点始终是item,这个是不能变的,后面有详细介绍。
2、后台编程
1>指定路径
const string outputFile = @".\Output\report.xlsx";//输出目录
var template = new XLTemplate(@".\Template\Student.xlsx");//模板目录
2>向模板中添加变量
可以添加单个数据集
var stu = new Student
{
Age = 25,
Id = 1,
Name = "財政局",
};
template.AddVariable(stu);
可以添加字典
var dic = new Dictionary<string, string>();
dic["Id"] = "1";
dic["Age"] = "25";
dic["Name"] = "財政局";
template.AddVariable(dic);
上面两种方式在Excel模板中都可以按照如下方式引用:
由于没有标识名称,所以添加的多个变量名称不能重复。
可以在Excel模板中添加数据集
由于数据集会生成很多行数据,如下1个两层结构的数据
Student stu = new Student
{
Age = 25,
Id = 1,
Name = "財政局",
Relates = new List<Relate>()
{
new Relate {Age=30,Id=11,Name="测试1"},
new Relate {Age=40,Id=21,Name="测试2"},
new Relate {Age=50,Id=31,Name="测试3"},
}
};
template.AddVariable("stuTag", stu);//添加变量和标识
上述如果只是显示变量stu.Name的值,则Excel中的字段定义为:
.不需要定义区域的名称
如果要显示stu.Relates数据集,则Excel按如下图定义(说明,Excel集合中字段的第1个根始终为”item”,它代表集合中的数据项,始终不变),在Excel中如果数据行模板只有一行,定义区域名称时,必须同时选择下方的一个空行,否则数据会横向显示,如下选择了两行,然后右键弹出菜单选择“定义名称…”
另外区域名称必须与引用路径一致,通过template.AddVariable("stuTag", stu)传递过来的数据标识是”stuTag”,而需要显示的变量数据集是stu.Relates,因此数据区域名称为:stuTag.Relates
因此可以向Excel模板传递多层次数据变量,而这个变量下又可以包含多个数据集变量,最终通过不同的数据区域名称引用可以在同一个sheet中显示多个数据表。
对于名称的查看/编辑,可以在Excel中点击 公式-->名称管理器
报表生成和保存
template.Generate();//报表生成
template.SaveAs(outputFile);//输出excel文件
//打开excel文件
Process.Start(new ProcessStartInfo(outputFile) { UseShellExecute = true });
最近在GitHub上搜索了一下Excel报表,开源项目还挺多的,但看了其使用方式,目前就感觉ClosedXML.Report的使用是最简单的,在后台代码中,只需要把要导出到Excel中的数据通过一行代码template.AddVariable() 添加即可,无论这个数据有多复杂,有多少层级都无所谓,在Excel模板中通过层级绑定机制简单的绑定即可,用过WPF Mvvm编程的都清楚,只需向视图传递一个DataContext对象,视图xaml中的UI元素通过层级绑定方式就能访问到这个数据中任意层级的公开数据,这里Excel就像Mvvm中的视图,Excel中的字段绑定就像Xaml中的UI元素绑定。
这个Report库目前最直接的应用就是将数据导出到Excel文件,以前都是在后台用c#代码一行一行的添加数据到Excel文件,为每个cell设定样式(当然用到一些循环),现在简单了,做好Excel模板中的字段绑定,后台关键代码就1行添加变量即可搞定,注意,是只需要1行,看过其他的一些开源项目,有些需要给Excel中的每个字段绑定都添加后台代码关联,这得多麻烦。
下面是生成的一些报表的截图: