java 利用poi根据excel模板导出数据(三)
本文是 java 利用poi根据excel模板导出数据(一) 的优化版本
主要针对于 fillBodyData 方法这块,具体如下
源代码:
private static void fillBodyData(Sheet sheet, int startRow, List<NutMap> bodyList, int[] colWidth) {
// 碰到 时间、金额等需要转换的 在setCellValue 里面操作
for (int rowNum = 0; rowNum < bodyList.size(); rowNum++) {
NutMap map = bodyList.get(rowNum);
Row row = sheet.createRow(rowNum + startRow);
int colNum = 0;
// comm
Cell accountNumberCell = row.createCell(colNum++, CellType.STRING);
String accountNumber = map.getString("comm");
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(accountNumber));
accountNumberCell.setCellValue(accountNumber);
// a
Cell accountNameCell = row.createCell(colNum++, CellType.STRING);
String accountName = map.getString("a");
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(accountName));
accountNameCell.setCellValue(accountName);
// b
Cell mobileCell = row.createCell(colNum++, CellType.STRING);
String mobile = map.getString("b");
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(mobile));
mobileCell.setCellValue(mobile);
// c
Cell addressCell = row.createCell(colNum++, CellType.STRING);
String address = map.getString("c");
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(address));
addressCell.setCellValue(address);
// d
Cell meterNoCell = row.createCell(colNum++, CellType.STRING);
String meterNo = map.getString("d");
meterNoCell.setCellValue(meterNo);
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(meterNo));
// e
Cell uncollectedNumberCell = row.createCell(colNum++, CellType.STRING);
String uncollectedNumber = map.getString("e");
uncollectedNumberCell.setCellValue(uncollectedNumber);
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(uncollectedNumber));
// f
Cell uncollectedDosageCell = row.createCell(colNum++, CellType.STRING);
String uncollectedDosage = map.getString("f");
uncollectedDosageCell.setCellValue(uncollectedDosage);
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(uncollectedDosage));
// g
Cell uncollectedDosageCell1 = row.createCell(colNum++, CellType.STRING);
String uncollectedDosage1 = map.getString("g");
uncollectedDosageCell1.setCellValue(uncollectedDosage1);
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(uncollectedDosage1));
// h
Cell uncollectedDosageCell2 = row.createCell(colNum++, CellType.STRING);
String uncollectedDosage2 = map.getString("h");
uncollectedDosageCell2.setCellValue(uncollectedDosage2);
colWidth[colNum - 1] = Math.max(colWidth[colNum - 1], Strings.charLength(uncollectedDosage2));
}
}
修改后代码:
private void fillBodyData(XSSFWorkbook workbook, Sheet sheet, int startRow, int startCol, List<List<String>> bodyList, int[] colWidth) {
// 单元格样式
XSSFCellStyle cellStyle = workbook.createCellStyle();
// 设置单元格的水平对齐类型
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 设置单元格的垂直对齐类型
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//设置样式对象,这里仅设置了边框属性
cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
cellStyle.setBorderTop(BorderStyle.THIN);//上边框
cellStyle.setBorderRight(BorderStyle.THIN);//右边框
for (int rowNum = 0; rowNum < bodyList.size(); rowNum++) {
List<String> rowData = bodyList.get(rowNum);
Row row = sheet.getRow(rowNum + startRow);
if (null == row) {
row = sheet.createRow(rowNum + startRow);
row.setHeight((short) 440);
}
int colNum = startCol;
for (String cellValue : rowData) {
Cell rowCell = row.getCell(colNum);
if (null == rowCell) {
rowCell = row.createCell(colNum, CellType.STRING);
rowCell.setCellStyle(cellStyle);
}
colWidth[colNum - startCol] = Math.max(colWidth[colNum - startCol], Strings.charLength(cellValue));
rowCell.setCellValue(cellValue);
colNum++;
}
}
}
相当于不用一个一个列去渲染了直接循环解决,
两个参数
1. startRow 起始行号 从0开始
2.startCol 起始列号 从0开始
当然具体的要根据需求来,也建议大家自己去去优化