2、进阶之Jxls2的Each数据循环

Jxls2
placeholder image
admin 发布于:2018-04-04 14:32:09
阅读:loading

基本介绍

前文中我们说道的${name}只作为一个变量存在,可作为一个格子的内容数据来显示,而实际应用中更多的则会是循环列表的数据,这就是本章节所要讲述的使用each来循环显示数据。同样的在1.0版本中的用法完全与jstl一致,而2的版本则不需要你熟悉jstl了,完全是一种新写法。本示例涉及jxls2的jx:each表达式函数,需要自行另外掌握。

既然是要循环数据,常见的数据格式有3中,分别是ArrayList<简单类型>List<Vo>,如果你想使用Array[Vo]Map类型也同样是可以循环的。本章示例将为给出前面常见的3中来展示。

参考代码

package cn.chendd.examples;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Calendar;

import java.util.Date;

import java.util.List;

 

import org.jxls.common.Context;

import org.jxls.util.JxlsHelper;

 

import cn.chendd.examples.vo.Employee;

 

/**

 * 简单列表模板导出

* @author chendd

 */

public class SimpleEachJxls {

 

   public static void main(String[] args) throws Exception {

      //构造集合数据

      List<Employee> employees = new ArrayList<Employee>();

      Calendar time = Calendar.getInstance();

      time.set(2015, 5, 20);

      Date date = time.getTime();

      employees.add(new Employee("lishengle" , date , new BigDecimal(15000) , new BigDecimal(800)));

      employees.add(new Employee("jiajitao" , date , new BigDecimal(16000) , new BigDecimal(1000)));

      employees.add(new Employee("sunming" , date , new BigDecimal(17000) , new BigDecimal(1500)));

      //载入模板

      InputStream is = SimpleEachJxls.class.getClass().getResourceAsStream("/cn/chendd/examples/templates/simpleEach.xls");

      Context context = new Context();

      context.putVar("employees", employees);

      context.putVar("title""员工信息列表");

      OutputStream os = new FileOutputStream(new File("d:\\test\\out_simpleEach.xls"));

      //添加A-Z的字符数据

      List<Character> dataList = new ArrayList<Character>();

      for(int i=65; i <= 90 ; i++){

         dataList.add((char)i);

      }

      context.putVar("dataList", dataList);

      //数组循环不支持?

      List<Object[]> arrays = new ArrayList<Object[]>();

      Object a1[] = new Object[]{"chendd1" , "" , 25};

      Object a2[] = new Object[]{"chendd2" , "" , 26};

      Object a3[] = new Object[]{"chendd3" , "" , 27};

      arrays.add(a1);

      arrays.add(a2);

      arrays.add(a3);

      context.putVar("arrays", arrays);

     

      //集合循环

      List<List<Object>> list = new ArrayList<List<Object>>();

      list.add(Arrays.asList(a1));

      list.add(Arrays.asList(a2));

      list.add(Arrays.asList(a3));

      context.putVar("list", list);

     

      JxlsHelper.getInstance().processTemplate(is, os, context);

      os.flush();

      os.close();

      is.close();

   }

 

}

 

public class Employee {

 

   private String name;

   private Date birthDate;

   private BigDecimal payment;

   private BigDecimal bonus;

  

   public Employee() {

      super();

   }

 

   public Employee(String name, Date birthDate, BigDecimal payment,

         BigDecimal bonus) {

      super();

      this.name = name;

      this.birthDate = birthDate;

      this.payment = payment;

      this.bonus = bonus;

   }

 

   //省略getter/setter

 

}

 

代码说明

上述代码中我们可以看出由后台设置了5个变量分别是“employees”、“title”、“dataList”、“arrays”、“list”,其中title是String类型的标题;employees则是一个对象类型集合(List<Employee>),取值时用元素的具体属性来;dataList中是一个简单的Character类型,具体的元素就是它的值,无需再调用其他;arrays是集合数组(List<Object[]>)类型,循环时按数组的下标进行取值;list是集合集合类型(List<List<String>),循环时使用List的get(索引)的方式来获取。

模板介绍

image.png

模板说明

循环数组Sheet主要是为演示使用jxel表达式来循环Object[]List<List<String>>结构的数据,数组使用下标取值,集合采用get索引的方式取值,比较简单。

image.png

循环对象的方式更简单了,直接在相应的单元格内引用索引即可,另外title的引用主要是为演示在循环数据时同样可以使用全局的变量,同样比较简单。

模板说明

image.png

实际上单元格的横向扩展也是较为常见的一种结构,本例主要演示在同一行中循环A-Z26个大写字母,可以看到主要是使用了direction属性,该属性默认是向下扩展,比较简单再加1

运行示例

image.png

image.png

image.png

运行说明

循环数组Sheet中的第一个列表与第二个列表中间有7行的空行,这是由于模板中定义时给出了这些空行,生成的文件完全按模板走。另外上述示例中涉及到了字体加粗、居中、文本颜色、背景色、边框样式、格式化等均是由模板设置的。

相关下载

out_simpleEach.xls

本示例代码会在后文中提供。

 点赞


 发表评论

当前回复:作者

 评论列表


留言区