zoukankan      html  css  js  c++  java
  • 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
    eport.xls";//输出目录
                var template = new XLTemplate(@".TemplateStudent.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

  • 相关阅读:
    hdu4122
    poj3410单调队列(单调栈)
    hdu3415 单调队列模板题
    网站指纹识别工具Whatweb的使用
    Python中shodan模块的使用
    Shodan的使用
    Google Hacking的用法
    PyCharm调试程序
    Python脚本与Metasploit交互进行自动永恒之蓝攻击
    关于PHP动态的接收传递的GET,POST和COOKIE变量
  • 原文地址:https://www.cnblogs.com/chenzhaojie/p/12862622.html
Copyright © 2011-2022 走看看