java poi3.10.1基本excel使用

比较好的实现方式是通过提前做好excel文件,然后使用这个做好的excel文件作为模板,使用poi读入这个文件,将需要的值填入;这样就不要编程来设置行宽的样式;

效果:

代码:

//时间
		String checkTime = "yyyy/MM/dd";

		//人员查询
		Set preParticipantNames = new HashSet();

		HSSFWorkbook wb = new HSSFWorkbook();

		// 生成一个样式
		HSSFCellStyle style = wb.createCellStyle();
		this.setHSSFCellBorder(style);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格为水平对齐的类型
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		HSSFFont songFont = createSongFont(wb);
		style.setFont(songFont);

		HSSFCellStyle songPoint14FontStyle = wb.createCellStyle();
		this.setHSSFCellBorder(songPoint14FontStyle);
		songPoint14FontStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		songPoint14FontStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格为水平对齐的类型
		HSSFFont songPoint14Font = createSongFont(wb);
		songPoint14Font.setFontHeightInPoints((short) 14); //设置字号
		songPoint14FontStyle.setFont(songPoint14Font);

		HSSFCellStyle arialFontStyle = wb.createCellStyle();
		this.setHSSFCellBorder(arialFontStyle);
		arialFontStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		arialFontStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格为水平对齐的类型
		HSSFFont arialFont = createSongFont(wb);
		arialFont.setFontName("Arial");
		arialFontStyle.setFont(arialFont);

		HSSFCellStyle rightBoldStyle = wb.createCellStyle();
		rightBoldStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		rightBoldStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 设置单元格为水平对齐的类型
		HSSFFont boldSongFont = createSongFont(wb);
		boldSongFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
		rightBoldStyle.setFont(boldSongFont);

		HSSFCellStyle songPoint22RedFontStyle = wb.createCellStyle();
		songPoint22RedFontStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		songPoint22RedFontStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格为水平对齐的类型
		HSSFFont songPoint22RedFont = createSongFont(wb);
		songPoint22RedFont.setFontHeightInPoints((short) 22); //设置字号
		songPoint22RedFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
		songPoint22RedFont.setColor(HSSFColor.RED.index);
		songPoint22RedFontStyle.setFont(songPoint22RedFont);

		HSSFCellStyle contentDefaultStyle = wb.createCellStyle();
		this.setHSSFCellBorder(contentDefaultStyle);
		contentDefaultStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		contentDefaultStyle.setFont(songFont);

		HSSFCellStyle verticalStyle = wb.createCellStyle();
		this.setHSSFCellBorder(verticalStyle);
		verticalStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格为水平对齐的类型
		verticalStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		verticalStyle.setFont(songFont);



		// 建立新的sheet对象(excel的表单)
		HSSFSheet sheet = wb.createSheet(excelFileName);
		sheet.setColumnWidth(0,15* 256);
		sheet.setColumnWidth(1,15* 256);
		sheet.setColumnWidth(2,60* 256);
		sheet.setColumnWidth(3,15* 256);

		sheet.addMergedRegion(new CellRangeAddress(0,1,0,3));
		sheet.addMergedRegion(new CellRangeAddress(2,3,0,3));
		sheet.addMergedRegion(new CellRangeAddress(4,5,0,0));
		sheet.addMergedRegion(new CellRangeAddress(4,5,1,1));
		sheet.addMergedRegion(new CellRangeAddress(4,5,2,2));
		sheet.addMergedRegion(new CellRangeAddress(4,5,3,3));


		int beginRowIndex = 6;
		int endRowIndex = 6;


		//要获总记录,下一步来确定合并的单元格的数量
		List<TbCheckSamplEventReportVo> detailList = this.checkCountDao.getCheckResultDaily(checkEventCountDto);


		if (detailList != null && detailList.size() > 0) {
			endRowIndex += detailList.size() -1;
			log.info("detailList.size() " + detailList.size());
		}
		sheet.addMergedRegion(new CellRangeAddress(beginRowIndex,endRowIndex,0,0));


		int sumScore = 0;
		for (int i = beginRowIndex; i <= endRowIndex; i++) {
			int j = i - beginRowIndex;
			sheet.addMergedRegion(new CellRangeAddress(i,i,1,3));
			HSSFRow row = sheet.createRow(i);
			if (i == beginRowIndex) {
				HSSFCell problemTextCell = row.createCell(0);
				problemTextCell.setCellValue("问题");
				problemTextCell.setCellStyle(verticalStyle);
			}

			StringBuilder contentDetail = new StringBuilder();
			if (detailList != null && detailList.size() > 0) {
				BigDecimal checkScore = detailList.get(j).getCheckScore() == null ? null : detailList.get(j).getCheckScore();
				if (checkScore != null) {
					sumScore += checkScore.intValue();
				}
				if (detailList.get(j).getPreParticipantName() != null) {
					preParticipantNames.add(detailList.get(j).getPreParticipantName());
				}

				contentDetail.append(j+1).append(".").append(detailList.get(j).getDesc()).append(" ").append("xxx").append(checkScore == null ? "" : checkScore.intValue())
						.append("xxx(").append(detailList.get(j).getCheckTypeName()).append(")");
			}

			HSSFCell cell = row.createCell(1);
			cell.setCellValue(contentDetail.toString());
			cell.setCellStyle(contentDefaultStyle);

			HSSFCell cell2 = row.createCell(2);
			cell2.setCellStyle(contentDefaultStyle);

			HSSFCell cell3 = row.createCell(3);
			cell3.setCellStyle(contentDefaultStyle);

		}



		//合计
		sheet.addMergedRegion(new CellRangeAddress(endRowIndex+1,endRowIndex+1,1,3));
		//人员
		sheet.addMergedRegion(new CellRangeAddress(endRowIndex+2,endRowIndex+2,1,3));


		HSSFRow row0 = sheet.createRow(0);
		HSSFCell row0Cell0 = row0.createCell(0);
		row0Cell0.setCellValue("xxxxxx");
		row0Cell0.setCellStyle(songPoint22RedFontStyle);

		HSSFRow row1 = sheet.createRow(2);
		HSSFCell row1Cell0 = row1.createCell(0);
		row1Cell0.setCellValue(checkEventCountDto.getCompanyName());
		row1Cell0.setCellStyle(rightBoldStyle);

		//5行
		HSSFRow row2 = sheet.createRow(4);
		HSSFCell row2Cell0 = row2.createCell(0);
		row2Cell0.setCellStyle(style);

		HSSFCell row2Cell1 = row2.createCell(1);
		row2Cell1.setCellStyle(style);

		HSSFCell row2Cell2 = row2.createCell(2);
		row2Cell2.setCellStyle(style);
		row2Cell2.setCellValue("时间");

		HSSFCell row2Cell3 = row2.createCell(3);
		row2Cell3.setCellValue(checkTime);
		row2Cell3.setCellStyle(arialFontStyle);

		//6行
		HSSFRow row3 = sheet.createRow(5);
		HSSFCell row3Cell0 = row3.createCell(0);
		row3Cell0.setCellStyle(style);

		HSSFCell row3Cell1 = row3.createCell(1);
		row3Cell1.setCellStyle(style);

		HSSFCell row3Cell2 = row3.createCell(2);
		row3Cell2.setCellStyle(style);

		HSSFCell row3Cell3 = row3.createCell(3);
		row3Cell3.setCellStyle(style);




		//xxxxx
		HSSFRow row5 = sheet.createRow(endRowIndex+1);
		HSSFCell row5Cell0 = row5.createCell(0);
		row5Cell0.setCellValue("合计");
		row5Cell0.setCellStyle(style);
		HSSFCell row5Cell1 = row5.createCell(1);
		row5Cell1.setCellValue(new StringBuilder("xx").append(sumScore).append("xxx").toString());
		row5Cell1.setCellStyle(songPoint14FontStyle);
		HSSFCell row5Cell2 = row5.createCell(2);
		row5Cell2.setCellStyle(songPoint14FontStyle);
		HSSFCell row5Cell3 = row5.createCell(3);
		row5Cell3.setCellStyle(songPoint14FontStyle);



		//人员
		HSSFRow row6 = sheet.createRow(endRowIndex+2);
		HSSFCell row6Cell0 = row6.createCell(0);
		row6Cell0.setCellValue("人员");
		row6Cell0.setCellStyle(style);

		StringBuilder tmpNames = new StringBuilder();
		if (preParticipantNames.size() > 0){
			preParticipantNames.forEach(item -> tmpNames.append(item).append(","));
		}
		HSSFCell row6Cell1 = row6.createCell(1);
		row6Cell1.setCellValue(tmpNames.toString().length() > 0 ? (tmpNames.toString().substring(0,tmpNames.toString().length() -1)) : "");
		row6Cell1.setCellStyle(style);

		HSSFCell row6Cell2 = row6.createCell(2);
		row6Cell2.setCellStyle(style);

		HSSFCell row6Cell3 = row6.createCell(3);
		row6Cell3.setCellStyle(style);


		return wb;

  代码里面的问题:

1、关于cell的style可以使用for循环来做,代码更加简洁;

2、每列的宽度没有做子适应展开,现在四列是用了固定值来设置列宽的。

3、...

原文地址:https://www.cnblogs.com/zhucezmf/p/12070519.html