坑合集:
模板导出中
1.多层循环我没有用,因为会出现错乱,部分数据丢失或者为空等问题
2.循环不要用模板里的单元格合并。会出现错乱,部分数据丢失或者为空等问题。
2.1 我的处理方式是在模板里需要合并的单元格赋予同样的值,然后在代码中进行合并
2.2 纵向合并:
//纵向合并相同内容的单元格
// 3是开始合并的行数
// 0是需要合并的所在列
PoiMergeCellUtil.mergeCells(sheet, 3, 0);
2.3 横向合并:
//横向合并相同内容的单元格
CellRangeAddress craOne = new CellRangeAddress(0,3,2, 4);
//CellRangeAddress(第几行开始,第几行结束,第几列开始,第几列结束)
sheet.addMergedRegion(craOne);
2.3.1 循环里横向合并,我是在代码里对每一行都执行了这句操作。否则所有行会被合并成一个单元格
3.设置样式时,需要对每个cell都进行设置
CellStyle style = workbook.createCellStyle();
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setWrapText(true);
style.setAlignment(HorizontalAlignment.LEFT);
style.setVerticalAlignment(VerticalAlignment.CENTER);
row.getCell(i).setCellStyle(style);
4.在list后还有数据时,如果直接在模板里写第二部分数据,会出现第二部分数据把list的数据覆盖的问题
4.1我的处理方式是:list写在模板里,在代码里写第二部分的数据
Row newRow = sheet.createRow(sheet.getLastRowNum());
newRow.setHeightInPoints(50);
newRow.createCell(0).setCellValue("值1");
newRow.createCell(1).setCellValue("值2");
ps:其实写到这儿了我觉得我还不如全部用代码画,不要用模板
5.在已有的数据中插入新的一行数据
5.1 如果是最后一行,直接新增sheet.creatRow即可
5.2 如果是插入到中间,要进行移动
// sheet.shiftRows(插入行, 当前数据最后一行, 移动几行 ,是否复制行高, 是否重置原始行高);
sheet.shiftRows(12, sheet.getLastRowNum(), 1 ,true,false);
这句是把插入行以下的数据全部下移一行,以便空出空行去插入新数据,防止覆盖
通过这个也可以用来删除某行数据,把移动几行换成负数即可
6.简单的模板导出代码:
首先准备好模板
然后代码段参考如下
TemplateExportParams params = new TemplateExportParams(templateUrl);
params.setScanAllsheet(true);
Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 接着这儿可以插入一些特殊处理的数据或者合并单元格之类的操作
// 如果不需要就直接跳过
workbook.write(response.getOutputStream());
workbook.close();