poi做多行合并,一定需要先绘制单元格,然后写入数据,最后合并,不然各种坑啊。
合并单元格所使用的方法:
sheet.addMergedRegion( CellRangeAddress cellRangeAddress );
CellRangeAddress 对象的构造方法需要传入合并单元格的首行、最后一行、首列、最后一列。
CellRangeAddress cra=new CellRangeAddress(0, 3, 3, 9);
怎样把数据写入合并后的单元格中
- 首先要查看你 CellRangeAddress 构造方法的firstcol index
- 创建firstcol cell对象
- cell 的set 方法写数据
在合并单元格的后一个位置写数据
- 查看 CellRangeAddress 构造方法的lastcol index
- 创建lastcol+1 cell
- cell 的set方法写数据
附上一个例子:
public static void test() { String beginTime = "2017-10-08"; String endTime = "2017-10-11"; HSSFWorkbook wb = new HSSFWorkbook(); Date b = DateUtil.parse(beginTime, "yyyy-MM-dd"); Date e = DateUtil.parse(endTime, "yyyy-MM-dd"); String bs = DateUtil.format(b, "MM.dd"); String es = DateUtil.format(e, "MM.dd"); String sheetName = bs + "-" + es; HSSFSheet sheet = wb.createSheet(sheetName); HSSFRow row = sheet.createRow((short) 0);// 第一行 // 定制表头 List<String> header = new ArrayList<>(); header.add("部门"); header.add("岗位"); header.add("员工编号"); header.add("姓名"); header.add("服务中心名称"); header.add("时间段"); header.add("次数"); header.add("走访日期"); header.add("到店时段"); header.add("时长(分钟)"); HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中 style.setWrapText(true);// 自动换行 style.setIndention((short) 5);// 缩进 for (int i = 0; i < header.size(); i++) { HSSFCell cell = row.createCell(i); cell.setCellValue(header.get(i)); } // List<OaPunchVisitDataDto> // dtos=oaReportDao.findPunchVisitData(beginTime, endTime, departName, // name); List<OaPunchVisitDataDto> dtos = Lists.newArrayList(); OaPunchVisitDataDto dto = new OaPunchVisitDataDto(); dto.setNAMES("张三"); dto.setDEPARTNAME("开发部"); dto.setLOCATION_TITLE("五里店"); dto.setUSERID("10000"); dto.setPOSITION("员工"); dto.setCHECK_TIME("2017-10-09"); dto.setCHECK_ATS("2017-10-09 09:54,2017-10-09 17:54"