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的主键,值是日期。看下面图可能更直观点。
代理注册的进程是动态的,可以维护的,然后进行进程设定日期。