java导出Excel(动态列)

作者: tcxurun 分类: Java 发布时间: 2014-03-05 22:11 ė 6 没有评论

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的主键,值是日期。看下面图可能更直观点。

代理注册的进程是动态的,可以维护的,然后进行进程设定日期。

2014-03-05_214107 2014-03-05_214212 2014-03-05_214234 2014-03-05_220646

本文出自天一直很蓝,转载时请注明出处及相应链接。

本文永久链接: http://www.tcxurun.cn/archives/105

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Ɣ回顶部