`
gagapear
  • 浏览: 9704 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

JXLS生成报表的常规应用及扩展(上)

阅读更多

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的应用扩展。

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics