欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c# ClosedXML.Report excel报表排坑

程序员文章站 2023-01-28 10:37:52
一.介绍ClosedXML.Report ClosedXML.Report开源报表 支持net4.0+。 github:https://github.com/ClosedXML/ClosedXML.Report github项目下载慢参考:https://blog.csdn.net/czjnoe/a ......

一.介绍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模板

c# ClosedXML.Report   excel报表排坑

 注意:上图红色区域,需要在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:

c# ClosedXML.Report   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