Java poi插件合并内容为数字的excel单元格时的问题

原代码

  1. HSSFCell gradeCell = gradeRow.createCell(beginCol);
  2. gradeCell.setCellValue("2018");
  3. gradeCell.setCellStyle(cellStyle);
  4. sheet.addMergedRegion(new CellRangeAddress(2, 2, beginCol, beginCol + classes.size() - 1));

修改后

  1. HSSFCell gradeCell = gradeRow.createCell(beginCol);
  2. gradeCell.setCellValue(Integer.parseInt(grade.getName()));
  3. gradeCell.setCellStyle(cellStyle);
  4. gradeCell.setCellType(CellType.NUMERIC);
  5. sheet.addMergedRegion(new CellRangeAddress(2, 2, beginCol, beginCol + classes.size() - 1));

问题描述

原代码生成的excel打开后如下图:
原导出文件单元格

如果通过poi生成的excel单元格内的内容为数字时,如果不设置cellType,则poi默认为CellType.STRING,此时无论cellValue设置的为什么类型的值(String或Integer),合并单元格后导出文件,该单元格都会如上图,有一个小三角;或者设置了cellType为CellType.NUMERIC,但cellValue设置的为String,这种情况代码会抛运行时错误:Cannot get a NUMERIC value from a STRING cell

重点说下为什么要在意合并后的单元格有这个小三角,鼠标移动到这个小三角,会提示“以文本形式保存的数字”。这种情况下,如果再用这个模板进行导入操作,2018所在的这一行的列数就会读取异常。如上图中,2018所在的单元格是合并了3个基本单元格,我们在读取2018所在的这一行时,希望得到的格子数(即列数)是“星期”和“节次”2个基本单元格,加“2018”所包含的3个基本单元格,即总和是5。但实际读到的是3。具体原因未深入代码查看原因,但实际得到的值确实是3。

修改代码后生成的excel打开后如下图:
修改后文件单元格

修改代码后导出的excel文件如上图,已经没有了小三角。并且导入后,poi读到的“2018”所在行的最后一个单元格的位置是5。

问题解决