JXLS是基于Jakarta POI API的Excel报表生成工具,可以生成精美的Excel格式报表。它采用标签的方式,类似JSP标签,写一个Excel模板,然后生成报表,非常灵活,简单!
需要的主要Jar包:
commons-jexl-2.1.1.jar
jxls-core-1.0.1.jar
jxls-reader-1.0.1.jar
poi-3.9-20121203.jar
poi-ooxml-3.9-20121203.jar
模板中是使用jexl标签,使用很方便 。如:
需要在Excel中迭代生成数据可以使用:
<jx:forEach items="${resList}" var="entity" >
${entity.count }
</jx:forEach>
需要在Excel做业务逻辑判断:
<jx:if test="${status.index>10 }">
</jx:if>
需要显示一些信息:
${变量名}
等等,有很多标签。注意:“${变量名}”中的变量名一定要和你在后台放入Map中的Key值相同。
以上是对于Excel模板中的制作。下面介绍一下后台的实现:
//用于存放相关数据,并出入模板的Map信息
Map<Object, Object> beans = new HashMap<Object,Object>();
UserTask ut = (UserTask) request.getSession().getAttribute("USER_TASK");
Route r = null;
Task task = null;
User user = null;
if(ut != null){
task = ut.getTask();
user = ut.getUser();
}
if(task != null){
if(task.getStartTime() != null){
//用于生成一些不需要循环的信息(key是在模板中的变量名,在模板中会生成对应的Value)
beans.put("leaveTime", sdf.format(task.getStartTime()));
}else{
beans.put("leaveTime", "");
}
if(task.getEndTime() != null){
beans.put("comebackTime", sdf.format(task.getEndTime()));
}else{
beans.put("comebackTime", "");
}
if(task.getVehicle() != null){
Vehicle v = task.getVehicle();
beans.put("licenseplatenumber",v.getLicensePlateNumber());
beans.put("vehicleName", v.getVehicleName());
beans.put("vehicleCategory", v.getVehicleCategory());
//创建XLSTransformer对象
XLSTransformer transformer = new XLSTransformer();
//模板解析Jexl表达式
transformer.setJexlInnerCollectionsAccess(true);
//需要迭代循环输出的数据信息
List<TaskExcelDto> teList = new ArrayList<TaskExcelDto>();
if(r != null){
List<Site> sList = siteService.getByRouteId(r.getRouteId());
for(int i=0; i<sList.size(); i++){
TaskExcelDto teDto = new TaskExcelDto();
teDto.setCount(i+1);
teDto.setInstitutionName(sList.get(i).getSiteName());
teDto.setMileage(sList.get(i).getMileage());
teDto.setMessage("");
teList.add(teDto);
}
}
//把list放入到Map中
beans.put("resList", teList);
//templateFileName 为模板的路劲
//beans为出入到模板中的数据
//fileName为新生成Excel的文件名
transformer.transformXLS(templateFileName, beans, fileName);
以上一些代码为Jxls生成Excel的核心代码事例。
由于本人第一次写微博,写的不好请多见谅,谢谢。