zoukankan      html  css  js  c++  java
  • JXLS 2.4.0系列教程(二)——循环导出一个链表的数据

    请务必先看上一篇文章,本文在上一篇文章的代码基础上修改而成。

    JXLS 2.4.0系列教程(一)——最简单的模板导出

     

      上一篇文章我们介绍了JXLS和模板导出最简单的应用,现在我们要更进一步,介绍在模板中循环导出链表中的数据,在日常开发中,循环导出应该才是最常用的功能吧!

      首先,我们要建立一个类模拟javabean对象。我们定义一个person类,里面有idnameage

    public class Person {
        String id;
        String name;
        Integer age;
        public Person(String id, String name, Integer age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public Person() {
        }
    
        /** 以下省略了对应的get/set方法,请自行补齐 */
    }

     

      然后我们修改main 方法,大体上和上一篇文章是一致的,只是模拟了从数据库取出javabean的过程,将取出的javabean对象放入model中,然后传给JxlsUtils

     

    public class TestMain {
        public static void main(String[] args) throws Exception {
            // 模板位置,输出流
            String templatePath = "E:/template2.xls";
            OutputStream os = new FileOutputStream("E:/out.xls");
            
            // 一个装有对象数据的链表
            List<Person> persons = new ArrayList<Person>();
            Person p1 = new Person("001", "张三", 18);
            Person p2 = new Person("002", "李四", 19);
            Person p3 = new Person("003", "王五", 20);
            persons.add(p1);
            persons.add(p2);
            persons.add(p3);
            
            Map<String, Object> model = new HashMap<String, Object>();
            model.put("person", persons);    // 把链表放进model中
            
            JxlsUtils.exportExcel(templatePath, os, model);
            os.close();
            System.out.println("完成");
        }
    }

     

      接下来我们设计模板:

     

      A1单元格(A1C1合并单元格,名字还是A1)中的注释:jx:area(lastCell="D4"),不用多讲划定模板的区域范围。依照上文讲的避免bug的原因,我们依然将区域范围设置成比模板内容至少大一圈。需要说明的是注释必须在左上角的A1中,但是可以在和A1合并后的单元格中。

      A3单元格的注释:jx:each(items="person" var="p" lastCell="C3")

    jx:each()  这是一个遍历注释,默认向下增加一行。官网写可以横向遍历(增加direction 参数),我没有试过。

    Items= 从java代码中传入的model的键值对中取出键名为“person”的对象,这个对象可以是集合,一般是链表。

    Var= 每一条记录的变量名,命名为p。

    lastCell= 遍历数据在模板中最后一个单元格的位置。

     

      然后在遍历的区域内写上${ } 表达式,以var中定义的变量名 . 传进来的对象属性为构成。

      然后保存模板,执行java代码,就能看到下图的结果了。

     

      我们再来测试下复杂一点的模板呢?

     

      遍历的模板有两行,而且开头一列为合并的单元格,遍历模板第二行为有底纹的单元格,看看整个表格生成后会不会崩掉?我试过几个模板导出插件,很多都是单行遍历模板没问题,一旦出现多行数据和带有合并的单元格整个模板就会崩掉。

     

      没毛病,完美。

      最后说一点:如果lastCell的参数的值要设定为一个合并后的单元格,你不知道这个合并后的单元格名字是什么,那就用鼠标点一下该单元格,excel左上角会显示这个合并单元格的名称的,就写这个名字就行。

      例如上图001所在的合并单元格,用数据点击后excel提示的单元格名称为A3,其实写A3,A4都行。

    2018-08-07 新增:

      还有一种用法,就是横向遍历显示list的数据。其实很简单,jx:each的注释里只要写direction="RIGHT"就行了。

      jx:each(items="data" var="dat" lastCell="A3" direction="RIGHT")

      具体参照下图,我就不写代码了,都一样,只是模板的不同而已。

      

  • 相关阅读:
    数据结构:关于重建二叉树的三种思路
    操作系统:进程调度算法详解之FCFS和SPF篇
    Java反射机制浅析
    数据挖掘:基于TF-IDF算法的数据集选取优化
    RC隔离 更新where条件列 没有索引的情况
    RR区间锁 不是唯一索引,即使区间内没值,也锁
    If one session has a shared or exclusive lock on record R in an index, another session cannot insert
    RR模式下利用区间锁防止幻读,RC模式没有区间锁会出现幻读
    使用next-key locks 用于搜索和索引扫描,可以防止幻读
    Gap Locks 区间锁
  • 原文地址:https://www.cnblogs.com/foxlee1024/p/7617120.html
Copyright © 2011-2022 走看看