java导出excel的文章网上搜索有许多,一般有两种,poi和jxl方式,但是一般导出的都是列固定的,对应的都是javabean中的一个属性,偶尔有做动态列的,也是伪动态,比如这个bean有20个字段,web端有个页面,显示出所有的20个属性,然后根据你选择了哪些属性导出,最多不能超过这20个属性,所以我说这种是伪动态的。最近遇到了一个导出要求,是全动态的,就是导出列是完全变化的,包括列名称都是动态。
JSONObject json = JSONTools.toJSONObject(args);
XmjckzSearchBean search = JSONTools.toBean(json, XmjckzSearchBean.class);
List<Xmjckz> list = xmjckzService.queryAll(search);
if (list == null || list.size() == 0) {
return;
}
try {
String exportName = "项目进程控制信息";
if (WebUtils.isIE()) {
exportName = URLEncoder.encode(exportName, "UTF-8");
} else {
exportName = new String(exportName.getBytes("UTF-8"),
"ISO-8859-1");
}
response.addHeader("Content-Disposition", "attachment;filename=" + exportName + ".xls");
response.setContentType("application/vnd.ms-excel");
// 创建可写工作薄
WritableWorkbook wwb = Workbook.createWorkbook(response.getOutputStream());
WritableSheet ws = wwb.createSheet("项目进程控制信息", 0);
WritableFont headerFont = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD);
WritableCellFormat cellFormat = new WritableCellFormat(headerFont);
cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
cellFormat.setAlignment(Alignment.CENTRE);
ws.setColumnView(0, 20);
List<Nqsjzd> zdList = nqxlkwhService.getAllByLxmc("YW_DLZC");
Label labelCF = null;
if(Utils.isNotEmpty(zdList)) {
//创建标题
labelCF = new Label(0, 0, "序号");
labelCF.setCellFormat(cellFormat);
ws.addCell(labelCF);
ws.setColumnView(0, 15);
labelCF = new Label(1, 0, "公司名称");
labelCF.setCellFormat(cellFormat);
ws.addCell(labelCF);
ws.setColumnView(1, 15);
int i = 2;
for(Nqsjzd zd : zdList) {
// 每一个zd就是一列,列标题就是zd的value
labelCF = new Label(i, 0, zd.getValue());
labelCF.setCellFormat(cellFormat);
ws.addCell(labelCF);
ws.setColumnView(i++, 15);
}
}
//给每个列根据查询出的数据进行填充数据
for (int i = 0; i < list.size(); i++) {
Xmjckz entity = list.get(i);
labelCF = new Label(0, i + 1, i + 1 + "");
cellFormat = new WritableCellFormat();
cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
labelCF.setCellFormat(cellFormat);
ws.addCell(labelCF);
labelCF = new Label(1, i + 1, entity.getGsmc());
labelCF.setCellFormat(cellFormat);
ws.addCell(labelCF);
JSONObject content = JSONTools.toJSONObject(entity.getContent());
int j = 2;
for(Nqsjzd zd : zdList) {
String rqS = (String) content.get(zd.getTid().toString());
labelCF = new Label(j++, i + 1, rqS);
labelCF.setCellFormat(cellFormat);
ws.addCell(labelCF);
}
}
wwb.write();
wwb.close();
} catch (Exception e) {
e.printStackTrace();
}
return ;
说明一下:
List list,这个list是根据条件查询出来需要到处多少条数据。
List zdList,这个list里面保存的是有多少列,每一列就是一个Nqsjzd。
content字段保存的一个json字符串,key是zd的主键,值是日期。看下面图可能更直观点。
代理注册的进程是动态的,可以维护的,然后进行进程设定日期。


