ClosedXML.Report的使用

ClosedXML.Report是一个开源的Excel报表引擎

github:  GitHub - ClosedXML/ClosedXML.Report: ClosedXML.Report is a tool for report generation with which you can easily export any data from your .NET classes to Excel using a XLSX-template.

在网上搜索了一下其使用,有一篇文章有介绍:

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中的每个字段绑定都添加后台代码关联,这得多麻烦。

       下面是生成的一些报表的截图:

      

如果bs.report_no是varchar类型的,并且其中只包含数字,你可以使用以下SQL语句进行排序: ```sql SELECT bs.report_no, bs.sample_id, bs.test_id, bs.service_type, bs.sample_name, bs.total_fee, bs.receivable_fee, bs.sample_no, bs.ranges, bs.grade, bs.sample_remark AS remark, bs.factory, bs.item_name, bs.apply_dept, bs.specification, bs.factory_number, bs.calibrat_point, bs.mandatory_flag, bs.inspection_type, bs.report_org_name, bs.plan_complete_date, bs.standard_instrument_name, bs.bleeding_site_name, bs.arrive_date, DATEDIFF(bs.plan_complete_date, NOW()) AS surplus_days, bs.order_no, bs.order_type, bs.customer_name, bs.order_id, bs.business_type, bs.group_id, bs.group_name, bs.item_id, bs.is_merge, bs.pass_time, bs.audit_time, bs.report_id, bs.compile_time, bs.generate_time, bs.pass_user_name, bs.audit_user_name, bs.compile_user_name, bs.report_state, bs.is_just_certificate, bs.label_price, bs.labor_cost, bs.product_type, bs.batch_number, bs.original_number, bs.type_no, bs.template_id, bs.template_version, bs.standard_instrument_id, bs.standard_instrument_name, bs.report_query_code, bs.test_user_id, bs.test_user_name, bs.test_time, bs.review_user_id, bs.review_user_name, bs.review_time, bs.or_number, bs.test_result, bs.test_result_text, bs.test_date, bs.test_address, bs.result_value, bs.unit, bs.test_dept_id, bs.test_dept_name, bs.sample_mass, bs.form, bs.color, bs.clarity, bs.amplification_detection, bs.precious_metal, bs.remarks, bs.photo, bs.identifying_code, bs.diamond_quality, bs.hand_ring, bs.craft, bs.instrument_photo, bs.customer_item_basis, bs.quality_photo, bs.check_point, bs.check_code, bs.mass_unit, bs.manufacturer_name, bs.manufacturer_addr, bs.result_sample_describe AS sampleDescribe, bs.test_rule AS metalRuleIdsStr, bsa.attach_id FROM view_sample_info bs JOIN bus_sample_report bsr ON bs.report_id = bsr.id JOIN bus_sample sa ON bsr.sample_id = sa.id JOIN bus_sample_attr bsa ON sa.id = bsa.id ORDER BY CAST(bs.report_no AS UNSIGNED) ASC; ``` 这将按照bs.report_no的数字值从小到大对结果进行排序。如果bs.report_no中包含非数字字符,可能会导致排序不正确。在这种情况下,你可能需要先清洗数据,使得bs.report_no只包含数字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值