介绍这么多ZK的背景知识就是想让大家去他的官网看看,ZK能做的东西相当多。
最近在对一个ZK的遗留系统进行改造(为此我们的jPress进度稍微放缓一下,毕竟客户是给了钱的),根据客户的要求要对订单列表进行导出和打印,于是想到了用JXL或者POI进行Excel的导出。一般情况下JXL用的比较多,前几个小项目都是用的JXL对数据进行excel导出,poi是个重量级的工具,对Microsoft Office的excel,word甚至pdf进行了高强度的集成,能实现很多复杂的功能,并且最新版本部分支持了最新的office2007格式。POI功能强大,可惜一般用不到,而且JAR体积也很大,POI一个jar包就能抵得上我们整个项目文件大小,所以这次还是使用JXL来进行数据的导出。
功能很简单,点击ZK的一个button按钮,将容器中分页显示的订单详情导出到excel。示例中使用ByteArrayOutputStream产生内存中的字节输出流,然后从内存中的字节流中获取字节码形成输出流,通过或输出流构造excel文件到客户端,所以并不需要在服务器端生成任何文件。此外本节示例并不是构造全新的excel文件,而是根据已有的excel模板来生成。示例代码如下:
/**
* TODO:使用ONGL表达式对JXL进行封装,设计excel模板引擎
* http://cuihongxin1030.iteye.com/blog/410411
*/
@SuppressWarnings("static-access")
public void onClick$btn_exportDetial(){
Filedownload f=new Filedownload();
try {
String path=this.getClass().getResource("/detail.xls").toURI().getPath();
Workbook wb=Workbook.getWorkbook(new File(path));
ByteArrayOutputStream bos=new ByteArrayOutputStream();
WritableWorkbook wwb=Workbook.createWorkbook(bos,wb);
WritableSheet wws = wwb.getSheet(0);
((jxl.write.Label)wws.getWritableCell(1, 1)).setString(this.unitOrder.getCustomer().getName()); //姓名
((jxl.write.Label)wws.getWritableCell(1, 2)).setString(this.unitOrder.getCustomer().getIdentifyId()); //身份证号码
((jxl.write.Label)wws.getWritableCell(1, 3)).setString(this.unitOrder.getCustomer().getLinkNumber()); //联系号码
((jxl.write.Label)wws.getWritableCell(1, 4)).setString(this.unitOrder.getCustomer().getAddress()); //地址
((jxl.write.Label)wws.getWritableCell(1, 6)).setString(this.unitOrder.getCar()); //车型
((jxl.write.DateTime)wws.getWritableCell(1, 7)).setDate(this.unitOrder.getCreateDt()); //订购时间
((jxl.write.Label)wws.getWritableCell(1, 8)).setString(this.unitOrder.getStatus()); //状态
((jxl.write.Label)wws.getWritableCell(1, 11)).setString(this.unitOrder.getFactoryOrder().getProvider().getName()); //经销商
((jxl.write.Number)wws.getWritableCell(1, 13)).setValue(this.unitOrder.getOriginalPrice()); //进价
((jxl.write.DateTime)wws.getWritableCell(1, 14)).setDate(this.unitOrder.getFactoryOrder().getOrderDt()); //经销商订车时间
((jxl.write.Number)wws.getWritableCell(1, 15)).setValue(this.unitOrder.getFactoryOrder().getFrontMoney()); //经销商定金
((jxl.write.Label)wws.getWritableCell(1, 16)).setString(this.unitOrder.getFactoryOrder().getStatus()); //经销商状态
((jxl.write.Label)wws.getWritableCell(1, 17)).setString(this.unitOrder.getFactoryOrder().getRemark()); //经销商备注
((jxl.write.Label)wws.getWritableCell(4, 1)).setString(this.unitOrder.getSaleStaff().getStaffName()); //销售员
((jxl.write.Number)wws.getWritableCell(4, 2)).setValue(this.unitOrder.getSalePrice()); //售价
wws.addCell(new jxl.write.Label(3,i,"净利润",wcf1)); //利润
WritableCellFormat wcf2=new WritableCellFormat();
wcf2.setBorder(Border.ALL, BorderLineStyle.THIN);
WritableFont wf=new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD);
wf.setColour(jxl.format.Colour.RED);
wcf2.setFont(wf);
wws.addCell(new jxl.write.Number(4,i++,this.unitOrder.getProfit(),wcf2));
wwb.write();
wwb.close();
wb.close();
f.save(bos.toByteArray(),"application/vnd.ms-excel", "data.xls");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}