您的位置:首页 > 其它

jxls框架解析(一)报表导出快速入门

2015-02-05 16:31 369 查看
jxls是基于POI根据模板开发的一个框架。它在POI上又封装了一层,然后能根据模板快速生成报表,代码简单,结构清晰,下面就来看个例子,包你立马上手。

先来看个javaSE的例子

<span style="white-space:pre">	</span>@Test
public void TestExcel1(){
//核心类
XLSTransformer transformer = new XLSTransformer();
//需要一个map
Map map = new HashMap();
//用来保存student对象的list
List<Student> student = new ArrayList<Student>();
Student s = new Student();
s.setId(0);
s.setName("jack");
s.setHobby("eating");
student.add(s);
Student s1 = new Student();
s1.setId(1);
s1.setName("rose");
s1.setHobby("swimming");
student.add(s1);
Student s2 = new Student();
s2.setId(2);
s2.setName("jim");
s2.setHobby("sleeping");
student.add(s2);
Student s3 = new Student();
s3.setId(3);
s3.setName("tom");
s3.setHobby("basketball");
student.add(s3);
map.put("student", student);
try {
transformer.transformXLS("d:"+File.separator+"student_template.xls", map, "d:"+File.separator+"new.xls");
} catch (ParsePropertyException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


我这里是用的junit测试的,也可以把这个方法里的代码copy到main方法里,一样的。

中间一大段只是初始化数据,而核心就一句

transformer.transformXLS("d:"+File.separator+"student_template.xls", map, "d:"+File.separator+"new.xls");


这个方法有三个参数,第一个是Excel模板路径,第二个是一个map,就是你的数据,第三个是要保存的路径。这里比较绕的应该是map,map里面有个list,list里面就是多个student对象,这样是为了在Excel模板里面能够遍历它。

这是模板代码



这里的标签跟jstl的几乎一样,但是在Excel中,一个单元格中只能有一个标签,就是说

<jx:if test="1==1">1==1</jx:if>
不能写在一个单元格中,不然无法解析,之前就因为这个问题弄了我一下午。

模板中第二行的forEach标签,items属性的值就是要遍历的值,这个名字跟map中的key是对应的,var属性的值可以自己命名,为了方便后面调用,它也算是代表遍历的集合中的对象的引用吧。

输出结果



这里用模板的好处就是你可以在模板中定义好样式,它会直接原样输出,不用像POI那样长篇的写代码。

接下来用个javaWEB的,我这里搭的spring+hibernate

@RequestMapping("exportExcel")
public void exportExcel(HttpServletRequest request,HttpServletResponse response){
//查出学生信息并放到map中
List list = studentService.findAll();
Map<String,Object> beans = new HashMap<String,Object>();
beans.put("list", list);
//获得模板路径
String path=request.getServletContext().getRealPath("/template");
String srcPath = path+File.separator+"student_template.xls";
//准备输出流
OutputStream os=null;
try {
//设置响应头
response.setContentType("application/x-excel");
//response.setHeader("Content-Disposition", "attachment;filename=studentInfo.xls");
response.setHeader("Content-Disposition", "attachment;filename="+new String("中文名.xls".getBytes(),"iso8859-1"));
os = response.getOutputStream();
XLSTransformer transformer = new XLSTransformer();
try {
//获得模板的输入流
FileInputStream in = new FileInputStream(srcPath);
//将beans通过模板输入流写到workbook中
Workbook workbook = transformer.transformXLS(in, beans);
//将workbook中的内容用输出流写出去
workbook.write(os);
}catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Excel模板



模板路径



这里的forEach标签是在第一个单元格内的,因为后面没有内容所以才所有内容都显示出来

结果



jxls需要的jar包

jxls-core-1.0.6.jar jxls-reader-1.0.6.jar

poi-ooxml-schemas-3.11-20141221.jar poi-ooxml-3.11-20141221.jar poi-3.11-20141221.jar

commons-logging-1.1.1.jar commons-jexl-2.1.1.jar commons-digester.jar commons-beanutils-1.9.2.jar

xmlbeans-2.6.0.jar

如果需要循环遍历集合则还需要 commons-collections-3.1.jar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: