poi 3.17导出word并分页写入表格数据

@ApiOperation(value = "导出水位记录")
	@GetMapping("/createFile")
	public void createFile(HttpServletResponse response,
						   @RequestParam(value = "pustId")String pustId,
						   @RequestParam(value = "startDate")String startDate,
						   @RequestParam(value = "endDate")String endDate) throws IOException {
//创建文本对象
		XWPFDocument docxDocument = new XWPFDocument();
		List<FloodPustRunWaterVo> floodPustRunWaterVoList = floodPustRunWaterService.findFloodPustRunWater(pustId,startDate,endDate);
		String year = startDate.substring(0, 4);
		if (floodPustRunWaterVoList.size() > 0){
			FloodPustRunWaterVo floodPustRunWaterVo = floodPustRunWaterVoList.get(0);
			//切割list后在进行遍历,这样才能使每页都有表头和标题
			List<List<FloodPustRunWaterVo>> lists = splitList(floodPustRunWaterVoList, 18);
			for (List<FloodPustRunWaterVo> list : lists) {
				//创建第一段落
				XWPFParagraph firstParagraphX = docxDocument.createParagraph();
				firstParagraphX.setAlignment(ParagraphAlignment.CENTER);

				XWPFRun runTitle = firstParagraphX.createRun();
				runTitle.setText("水位记录表");
				runTitle.setBold(true);
				runTitle.setFontSize(24);
				runTitle.setFontFamily("宋体");
				runTitle.addCarriageReturn();//回车键
				runTitle.setKerning(30);

				XWPFParagraph paragraphX = docxDocument.createParagraph();
				paragraphX.setAlignment(ParagraphAlignment.CENTER);
				XWPFRun runTitle2 = paragraphX.createRun();
				String protectionZoneName = floodPustRunWaterVo.getProtectionZoneName();
				protectionZoneName = StringUtils.isNotBlank(protectionZoneName) ? protectionZoneName: "		";
				runTitle2.setText("***:"+protectionZoneName +"	***:"+floodPustRunWaterVo.getPustName()+"	年度:"+year+" 年");
				runTitle2.setFontSize(14);
				runTitle2.setFontFamily("宋体");
				runTitle2.addCarriageReturn();//回车键
				runTitle2.setKerning(30);
				runTitle2.addCarriageReturn();//回车键

				//创建表格 x行*x列(创建table 时,会有一个默认一行一列的表格)
				//留出两行表头
				XWPFTable table = docxDocument.createTable(2+list.size(),7);
				//设置表格居中
				CTJc jc = table.getCTTbl().getTblPr().getJc();
				if(jc == null){
					jc = table.getCTTbl().getTblPr().addNewJc();
				}
				jc.setVal(STJc.CENTER);
				table.getCTTbl().getTblPr().setJc(jc);
				// 设置表每列宽度 与没行高度,这里应该有批量设置的方法,但是我没找到
				for (XWPFTableRow row : table.getRows()) {
					row.setHeight(560);
					List<XWPFTableCell> tableCells = row.getTableCells();
					for (XWPFTableCell tableCell : tableCells) {
						tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
						CTTcPr cellPr = tableCell.getCTTc().addNewTcPr();
						CTTblWidth cellw = cellPr.addNewTcW();
						cellw.setType(STTblWidth.DXA);
						//设置宽度
						cellPr.addNewTcW().setW(BigInteger.valueOf(2700));
						//表格文字居中
						XWPFParagraph cellParagraph = tableCell.getParagraphArray(0);
						cellParagraph.setAlignment(ParagraphAlignment.CENTER);
					}
				}
				mergeCellsVertically(table,0,0,1,"日期");
				mergeCellsVertically(table,1,0,1,"时刻");
				mergeCellsHorizontal(table,0,2,4,"水位");
				XWPFTableRow row2 = table.getRow(1);
				row2.getCell(2).setText("***");
				row2.getCell(3).setText("**");
				row2.getCell(4).setText("***");
				mergeCellsVertically(table,5,0,1,"记录员");
				mergeCellsVertically(table,6,0,1,"备注");

				//给表格填充文本
				setTableText(table,list);
			}
		}

		response.setContentType("application/vnd.ms-excel");
		response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
		response.addHeader("charset", "utf-8");
		response.addHeader("Pragma", "no-cache");
		String encodeName = URLEncoder.encode("hhh.doc", StandardCharsets.UTF_8.toString());
		response.setHeader("Content-Disposition", "attachment; filename=\"" + encodeName + "\"; filename*=utf-8''" + encodeName);
		docxDocument.write(response.getOutputStream());
		response.flushBuffer();

写入文本的方法

private void setTableText(XWPFTable table,List<FloodPustRunWaterVo> list) {
		//获取第一个表格
		for (int i = 0; i < list.size(); i++) {
			XWPFTableRow row = table.getRow(i + 2);
			row.getCell(0).setText(list.get(i).getRecordDate()!=null ? list.get(i).getRecordDate().toString():"");
			row.getCell(1).setText(list.get(i).getRecordTime()!=null ? list.get(i).getRecordTime():"");
			row.getCell(2).setText(list.get(i).getInletWater()!=null ? list.get(i).getInletWater().toString():"");
			row.getCell(3).setText(list.get(i).getBeforePoolWater()!=null ? list.get(i).getBeforePoolWater().toString():"");
			row.getCell(4).setText(list.get(i).getOutletWater()!=null ? list.get(i).getOutletWater().toString():"");
			row.getCell(5).setText(list.get(i).getRecordPersonName()!=null ? list.get(i).getRecordPersonName().toString():"");
			row.getCell(6).setText(list.get(i).getRemarks());
		}

	}

合并单元格的方法

/**
	 * @Description: 跨行合并
	 * table要合并单元格的表格
	 * col要合并哪一列的单元格
	 * fromRow从哪一行开始合并单元格
	 * toRow合并到哪一个行
	 */
	public  void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow,String date) {
		for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
			XWPFTableRow row = table.getRow(rowIndex);
			XWPFTableCell cell = row.getCell(col);
			if ( rowIndex == fromRow ) {
				cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
				cell.setText(date);
			} else {
				cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
				cell.setText(date);
			}
		}
	}

	/**
	 * @Description: 跨列合并
	 * table要合并单元格的表格
	 * row要合并哪一行的单元格
	 * fromCell开始合并的单元格
	 * toCell合并到哪一个单元格
	 */
	public  void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell,String date) {
		for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
			XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
			if ( cellIndex == fromCell ) {
				cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
				cell.setText(date);
			} else {
				cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
				cell.setText(date);
			}
		}
	}

拆分list的方法

	public static <T> List<List<T>> splitList(List<T> sourceList, int groupSize) {
		int length = sourceList.size();
		// 计算可以分成多少组
		int num = (length + groupSize - 1) / groupSize;
		List<List<T>> newList = new ArrayList<>(num);
		for (int i = 0; i < num; i++) {
			// 开始位置
			int fromIndex = i * groupSize;
			// 结束位置
			int toIndex = (i + 1) * groupSize < length ? (i + 1) * groupSize : length;
			newList.add(sourceList.subList(fromIndex, toIndex));
		}
		return newList;
	}

生成的word 文档样式
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值