2、进阶之Jxls2的Each数据循环
Jxls2admin 发布于:2018-04-04 14:32:09
阅读:loading
前文中我们说道的${name}只作为一个变量存在,可作为一个格子的内容数据来显示,而实际应用中更多的则会是循环列表的数据,这就是本章节所要讲述的使用each来循环显示数据。同样的在1.0版本中的用法完全与jstl一致,而2的版本则不需要你熟悉jstl了,完全是一种新写法。本示例涉及jxls2的jx:each表达式函数,需要自行另外掌握。
既然是要循环数据,常见的数据格式有3中,分别是Array、List<简单类型>、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(索引)的方式来获取。
模板介绍
模板说明
循环数组Sheet主要是为演示使用jxel表达式来循环Object[]、List<List<String>>结构的数据,数组使用下标取值,集合采用get索引的方式取值,比较简单。
循环对象的方式更简单了,直接在相应的单元格内引用索引即可,另外title的引用主要是为演示在循环数据时同样可以使用全局的变量,同样比较简单。
模板说明
实际上单元格的横向扩展也是较为常见的一种结构,本例主要演示在同一行中循环A-Z的26个大写字母,可以看到主要是使用了direction属性,该属性默认是向下扩展,比较简单再加1。
运行示例
运行说明
循环数组Sheet中的第一个列表与第二个列表中间有7行的空行,这是由于模板中定义时给出了这些空行,生成的文件完全按模板走。另外上述示例中涉及到了字体加粗、居中、文本颜色、背景色、边框样式、格式化等均是由模板设置的。
相关下载
本示例代码会在后文中提供。
点赞