在开发中难免会遇到需要提交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类构造方法的参数列表解释: 第一个参数为开始行 第二个为结束行,第三个为开始列,第四个为结束列
拿这个表个为例,开始行下标应该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);