需求就是生成一个excel,要求就是数据大于10行的时候动态添加,小于10行的时候,原来的模板不变,只是填充数据。
还有一些小需求比如说添加图片所以本篇文章分三部分。
目录
读取模板
try (FileInputStream is = new FileInputStream(mdlpart); XSSFWorkbook workBook = new XSSFWorkbook(is)) {
XSSFSheet sheet1 = workBook.getSheetAt(0);
}
动态添加行数据
我本来想的思路和手动操作excel一样,直接插入行就可以了。奈何发现POI没有类似的方法可以使用。解决办法就是先调用函数sheet.shiftRows();向下移动行,这样就会空出来一个空行。再去创建行,然后复制行的格式。
这里有一个小坑
POI的4.1.0版本的sheet.shiftRows();当sheet为XSSF时,此方法无法正常工作,直接使用会导致保存之后的excel(xlsx),访问会显示文件已损坏,是否修复。这个是4.1.0版本POI的一个bug,目前appache还没有修复这个bug,需要手动添加代码。这个代码实在stackoverflow论坛上找到的解决办法。向开发者们致敬。
这里附上链接:POI4.1.0 seet.shiftRows()在xssf下无法使用解决办法。
我这里直接贴出代码:
sheet1.shiftRows(3, sheet1.getLastRowNum(), table1.size() - 20);
//XSSFSheet中的shiftRows方法在4.1.0版本中存在bug,至今还未修复,所以这一段话必须加上:
if (sheet1 instanceof XSSFSheet) {
XSSFSheet xSSFSheet = (XSSFSheet) sheet1;
// correcting bug that shiftRows does not adjusting references of the cells
// if row 3 is shifted down, then reference in the cells remain r="A3", r="B3", ...
// they must be adjusted to the new row thoug: r="A4", r="B4", ...
// apache poi 3.17 has done this properly but had have other bugs in shiftRows.
for (int r = xSSFSheet.getFirstRow