在开发中难免会遇到需要提交excel文件进行报表数据批量更新等需求,本次记录的契机是有报表需要用到excel进行批量更新数据,同时需要提供excel模板文件的下载,而这个模板就存在很多跨行跨列的需求,之前也在网上找过不少博文,但是不少的都是较为老的版本呢了,poi已经对某些方法进行过时处理了。

  废话不多说  进入正文

  首先是创建sheet页

wb = new HSSFWorkbook();
sheet = wb.createSheet(unitName + "***");

  然后就是跨行跨列的重点了,poi设置跨行跨列其实可以理解为,预先告诉poi我在后面创建单元格的时候 那些地方需要单元格合并。

sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 15)); // 
sheet.addMergedRegion(new CellRangeAddress(4, 4, 2, 4)); // 
sheet.addMergedRegion(new CellRangeAddress(4, 4, 5, 7)); //
sheet.addMergedRegion(new CellRangeAddress(4, 4, 8, 10)); // 
int dayCount = 0;
// row合并
int i = 7;
do {
	sheet.addMergedRegion(new CellRangeAddress(i, i + 23, 0, 0)); // 每日跨行合并
	startDate = DateUtil.getTimeByAddSubDay(startDate, 1);
	i = i + 24;
	dayCount++;
} while (startDate.getTime() <= endDate.getTime());
sheet.addMergedRegion(new CellRangeAddress(dayCount * 24 + 7, dayCount * 24 + 7, 0, 1)); // 平均值
sheet.addMergedRegion(new CellRangeAddress(dayCount * 24 + 8, dayCount * 24 + 8, 0, 1)); // 最大值
sheet.addMergedRegion(new CellRangeAddress(dayCount * 24 + 9, dayCount * 24 + 9, 0, 1)); // 最小值

CellRangeAddress类构造方法的参数列表解释:  第一个参数为开始行  第二个为结束行,第三个为开始列,第四个为结束列

java 添加一行数据到excel java在原有的excel添加一列_表数据

拿这个表个为例,开始行下标应该7 结束行下标是30  开始列、结束列下标都是0   因为这个是跨行合并。 
反之跨列的参数就应该是 开始结束行下标一致,开始结束列 下标就是根据具体要合并的列而定了。

然后后面就是我自的一部分代码了  也记录上来吧!

设置单元格默认样式,这里是定义一个样式对象  为每个单元格都设置上这个样式,其实有个统一设置样式的方法的。

只不过我自己懒 没有用那个方式,嘿嘿

/**
	 * 获取单元格默认样式
	 * @param wb
	 * @return
	 */
	private static CellStyle getDefaultStyle(HSSFWorkbook wb) {
		CellStyle style;
		Font font;
		style = wb.createCellStyle();
		style.setAlignment((short) 2);
		font = wb.createFont();
		font.setFontName("宋体");
		font.setFontHeightInPoints((short) 12);
		style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		style.setFont(font);
		return style;
	}

 创建单元格

//创建下标为2的表格行
row = sheet.createRow(2);
//在下标为2的表格行上  创建下标为0的单元格 并赋值
setCellDefaultStyle("排放源名称:", style, row.createCell(0));
//在下标为2的表格行上  创建下标为2的单元格
setCellDefaultStyle(orgName, style, row.createCell(2));

row = sheet.createRow(3);
setCellDefaultStyle("排放源编号:", style, row.createCell(0));
setCellDefaultStyle(unitId, style, row.createCell(2));
setCellDefaultStyle("监测月份:", style, row.createCell(12));
sdf = new SimpleDateFormat("yyyy年MM月");
setCellDefaultStyle(sdf.format(startDate), style, row.createCell(13));

//创建下标为4的表格行
row = sheet.createRow(4);
// 这里是上面设置了跨列的单元格    sheet.addMergedRegion(new CellRangeAddress(4, 4, 2, 4));   //第5行  第3~5列合并
setCellDefaultStyle("cellName", style, row.createCell(2));
// 这里是上面设置了跨列的单元格    sheet.addMergedRegion(new CellRangeAddress(4, 4, 5, 7));   //第5行  第6~8列合并
setCellDefaultStyle("cellName", style, row.createCell(5));
// 这里是上面设置了跨列的单元格  heet.addMergedRegion(new CellRangeAddress(4, 4, 8, 10));   
//第5行  第9~11列合并
setCellDefaultStyle("cellName", style, row.createCell(8));
private static void setCellDefaultStyle(String value, CellStyle style, Cell cell) {
		cell.setCellStyle(style);
		cell.setCellValue(value);
	}

最后写入流 中  或者写入文件中

wb.write(fos);