JXLS是基于Jakarta POI API的Excel报表生成工具,可以生成精美的Excel格式报表。它采用标签的方式,类似JSP标签,写一个Excel模板,然后生成报表,非常灵活简单。
下载地址: http://sourceforge.net/projects/jxls/files/jxls/1.0.6/
下面通过一个简单的实例来描述其常规应用。生成某班级学生信息的报表,首先我们得新建一个Student类,比如有姓名(name), 性别 (sex), 年龄(age)这三个属性。
public class Student {
private String name;
private String sex;
private String age;
public Student(String name, String sex, String age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
其次得有个XLS模板来设计数据render的逻辑(因为JXLS生成报表数据都是根据XLS模板的表达式来渲染的)
好,现在我们来写个测试方法
@Test
public void testGenerateReportByJXLS() throws ClassCastException, Exception {
/* Mock testing data */
List<Student> studentList = new ArrayList<Student>();
Student stu1 = new Student("ALEX", "MALE", "27");
Student stu2 = new Student("WILL", "MALE", "23");
Student stu3 = new Student("FELIX", "MALE", "30");
studentList.add(stu1);
studentList.add(stu2);
studentList.add(stu3);
/* build important parameter 'beansMap'*/
Map<String, Object> beansMap = new HashMap<String, Object>();
beansMap.put("stus", studentList);
XLSTransformer transformer = new XLSTransformer();
transformer.transformXLS("C:/student.xls", beansMap, "C:/student_result.xls");
}
transformXLS方法中第一个参数是模板的位置。第二个参数是beansMap,它可以是多个key-value组合,key即是模板中对应的表达式值,比如这里的${stus},value可以是一个对象集合也可以是一个对象实例。第三个参数是生成最终文件的地址。
结果:
如果这个时候需要在报表的上面显示班级的具体信息,比如学院,专业,班级等,这时候要新增一个类来描素这些信息,并且修改原有模板。
public class Grade {
private String college;
private String specialities;
private String className;
public Grade(String college, String specialities, String className) {
super();
this.college = college;
this.specialities = specialities;
this.className = className;
}
public String getCollege() {
return college;
}
public void setCollege(String college) {
this.college = college;
}
public String getSpecialities() {
return specialities;
}
public void setSpecialities(String specialities) {
this.specialities = specialities;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
@Test
public void testGenerateReportByJXLS() throws ClassCastException, Exception {
/* Mock testing data */
List<Student> studentList = new ArrayList<Student>();
Student stu1 = new Student("ALEX", "MALE", "27");
Student stu2 = new Student("WILL", "MALE", "23");
Student stu3 = new Student("FELIX", "MALE", "30");
studentList.add(stu1);
studentList.add(stu2);
studentList.add(stu3);
Grade grade = new Grade("College of software", "computer science", "Class 7");
/* build important parameter 'beansMap'*/
Map<String, Object> beansMap = new HashMap<String, Object>();
beansMap.put("stus", studentList);
beansMap.put("grade", grade);
XLSTransformer transformer = new XLSTransformer();
transformer.transformXLS("C:/student.xls", beansMap, "C:/student_result.xls");
好!问题来了,是不是以后这个模板要加新的信息进来,比如任课老师的信息,或者说新建别的模板显示学校老师的信息报表,那我们是不是又得去新建对应的java类,比如teacher.java.
如果是这样的话,每次新加新的报表,都得部署服务,重启服务(因为涉及到code的改动),显然在现实场景中这是非常不可取的,那又有什么方法能解决上述的问题呢?在下篇会介绍JXLS的应用扩展。