-
c# ClosedXML.Report excel报表排坑
一.介绍ClosedXML.Report
ClosedXML.Report开源报表 支持net4.0+。
github:https://github.com/ClosedXML/ClosedXML.Report
github项目下载慢参考:https://blog.csdn.net/czjnoe/article/details/106034095
一个可以生成Excel报表的工具,创建一份xlsx 模板,设置数据填充规则,然后直接填充数据即可快速转换为 Excel报表。
在网上没有找到较好ClosedXML.Report的示例,而且官方提供的使用示例实在太坑人了,也许该博主太"懒惰"了,所以今天写下该文章,方便后来者的使用,以免入坑太久。
二.如何使用
1.首先创建xlsx模板
注意:上图红色区域,需要在excel中,设置区域名称为item,否则无法填充数据
2.c# demo示例
首先添加ClosedXML(0.95.0.0)、ClosedXML.Report(0.2.0.0),不要在nuget直接下载,最好下载官方开源项目,引用项目下的dll,或者直接使我的demo中的引用,在文章末尾
创建所需实体:
public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public class Course { public int Id { get; set; } public string Name { get; set; } public double Grade { get; set; } public item Items { get; set; } } public class item { public int Id { get; set; } public string Name { get; set; } }
代码示例:
const string outputFile = @".\Output\report.xls";//输出目录 var template = new XLTemplate(@".\Template\Student.xls");//模板目录 Student stu = new Student { Age = 25, Id = 1, Name = "財政局", }; Dictionary<string, string> dic = new Dictionary<string, string>(); dic["Id"] = "1"; dic["Age"] = "25"; dic["Name"] = "財政局"; //AddVariable(object)方法,可传入实体、字典 { //template.AddVariable(stu);//传入单个实体 template.AddVariable(dic);//传入字典 } //AddVariable(string alias, object value)方法,可以传入集合、动态类型、DataTable。如果希望输出多个table表,建议传入集合 //注意key值必须为item { IEnumerable<dynamic> CourseItems() { return new List<dynamic> { new { Id=1, Name="数学", Grade=89,Items=new { Id=1,Name="1"} }, new { Id=2, Name="英语", Grade=15,Items=new { Id=2,Name="2"} }, new { Id=3, Name="语文", Grade=100,Items=new { Id=3,Name="3"} }, }; } var Course = new List<Course> { new Course{ Id=1, Name="数学", Grade=89 , Items=new item{ Id=1,Name="1"}}, new Course{ Id=2, Name="英语", Grade=15, Items=new item{ Id=2,Name="2"}}, new Course{ Id=3, Name="语文", Grade=100, Items=new item{ Id=3,Name="3"}} }; DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Grade", typeof(int)); var newRow = dt.NewRow(); newRow["Id"] = 1; newRow["Name"] = "数学"; newRow["Grade"] = 89; dt.Rows.Add(newRow); newRow = dt.NewRow(); newRow["Id"] = 2; newRow["Name"] = "英语"; newRow["Grade"] = 15; dt.Rows.Add(newRow); newRow = dt.NewRow(); newRow["Id"] = 3; newRow["Name"] = "语文"; newRow["Grade"] = 100; dt.Rows.Add(newRow); //template.AddVariable("item", CourseItems());//动态类型 template.AddVariable("item", Course);//集合 key必须为item //template.AddVariable("item", dt);//DataTable } template.Generate(); template.SaveAs(outputFile);//输出excel文件 //打开excel文件 Process.Start(new ProcessStartInfo(outputFile) { UseShellExecute = true });
3.输出excel:
三.总结
如果你只是处理一些简单的报表输出或只需要输出一张table表,还是可以使用的,毕竟比npoi输出简单多了,否则不建议使用
ClosedXML.Report缺点:
1.只能处理简单的数据插入,如果想要输出多个table表的话,则会麻烦一点,这点非常不友好。
2.输出表格table,需要指定excel一块区域,且把该区域设置名称为item。
3.不支持xls格式。只支持如下格式。'.xlsx', '.xlsm', '.xltx' and '.xltm'.
我的demo:https://gitee.com/czjnoe/ClosedXML.ReportDemo