diff --git a/devttl-common/src/main/java/com/devttl/common/utils/poi/ExcelUtil.java b/devttl-common/src/main/java/com/devttl/common/utils/poi/ExcelUtil.java index 3346eb2a4..2d6c8b841 100644 --- a/devttl-common/src/main/java/com/devttl/common/utils/poi/ExcelUtil.java +++ b/devttl-common/src/main/java/com/devttl/common/utils/poi/ExcelUtil.java @@ -21,6 +21,7 @@ import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; @@ -129,12 +130,12 @@ public class ExcelUtil { /** * 对象的子列表方法 */ - private Method subMethod; + private Map subMethods = new HashMap<>(); /** * 对象的子列表属性 */ - private List subFields; + private Map> subFieldsMap = new HashMap<>(); /** * 统计列表 @@ -199,7 +200,7 @@ public class ExcelUtil { if (StringUtils.isNotEmpty(title)) { int titleLastCol = this.fields.size() - 1; if (isSubList()) { - titleLastCol = titleLastCol + subFields.size() - 1; + titleLastCol = titleLastCol + subFieldsMap.values().size() - 1; } Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); titleRow.setHeightInPoints(30); @@ -217,14 +218,15 @@ public class ExcelUtil { if (isSubList()) { Row subRow = sheet.createRow(rownum); int column = 0; - int subFieldSize = subFields != null ? subFields.size() : 0; for (Object[] objects : fields) { Field field = (Field) objects[0]; Excel attr = (Excel) objects[1]; + CellStyle cellStyle = styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor())); if (Collection.class.isAssignableFrom(field.getType())) { Cell cell = subRow.createCell(column); cell.setCellValue(attr.name()); - cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + cell.setCellStyle(cellStyle); + int subFieldSize = subFieldsMap != null ? subFieldsMap.get(field.getName()).size() : 0; if (subFieldSize > 1) { CellRangeAddress cellAddress = new CellRangeAddress(rownum, rownum, column, column + subFieldSize - 1); sheet.addMergedRegion(cellAddress); @@ -233,7 +235,7 @@ public class ExcelUtil { } else { Cell cell = subRow.createCell(column++); cell.setCellValue(attr.name()); - cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + cell.setCellStyle(cellStyle); } } rownum++; @@ -301,13 +303,14 @@ public class ExcelUtil { Map cellMap = new HashMap(); // 获取表头 Row heard = sheet.getRow(titleNum); - for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { + if (heard == null) { + throw new UtilException("文件标题行为空,请检查Excel文件格式"); + } + for (int i = 0; i < heard.getLastCellNum(); i++) { Cell cell = heard.getCell(i); if (StringUtils.isNotNull(cell)) { String value = this.getCellValue(heard, i).toString(); cellMap.put(value, i); - } else { - cellMap.put(null, i); } } // 有数据时才处理 得到类的所有field. @@ -556,7 +559,8 @@ public class ExcelUtil { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; if (Collection.class.isAssignableFrom(field.getType())) { - for (Field subField : subFields) { + List currentSubFields = subFieldsMap.get(field.getName()); + for (Field subField : currentSubFields) { Excel subExcel = subField.getAnnotation(Excel.class); this.createHeadCell(subExcel, row, column++); } @@ -565,7 +569,7 @@ public class ExcelUtil { } } if (Type.EXPORT.equals(type)) { - fillExcelData(index, row); + fillExcelData(index); addStatisticsRow(); } } @@ -578,13 +582,13 @@ public class ExcelUtil { * @param row 单元格行 */ @SuppressWarnings("unchecked") - public void fillExcelData(int index, Row row) { + public void fillExcelData(int index) { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); int currentRowNum = rownum + 1; // 从标题行后开始 for (int i = startNo; i < endNo; i++) { - row = sheet.createRow(currentRowNum); + Row row = sheet.createRow(currentRowNum); T vo = (T) list.get(i); int column = 0; int maxSubListSize = getCurrentMaxSubListSize(vo); @@ -596,6 +600,7 @@ public class ExcelUtil { Collection subList = (Collection) getTargetValue(vo, field, excel); if (subList != null && !subList.isEmpty()) { int subIndex = 0; + List currentSubFields = subFieldsMap.get(field.getName()); for (Object subVo : subList) { Row subRow = sheet.getRow(currentRowNum + subIndex); if (subRow == null) { @@ -603,13 +608,13 @@ public class ExcelUtil { } int subColumn = column; - for (Field subField : subFields) { + for (Field subField : currentSubFields) { Excel subExcel = subField.getAnnotation(Excel.class); addCell(subExcel, subRow, (T) subVo, subField, subColumn++); } subIndex++; } - column += subFields.size(); + column += currentSubFields.size(); } } catch (Exception e) { log.error("填充集合数据失败", e); @@ -920,7 +925,7 @@ public class ExcelUtil { if (attr.isExport()) { // 创建cell cell = row.createCell(column); - if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) { + if (isSubListValue(vo) && getListCellValue(vo) > 1 && attr.needMerge()) { if (subMergedLastRowNum >= subMergedFirstRowNum) { sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column)); } @@ -1303,10 +1308,10 @@ public class ExcelUtil { fields.add(new Object[]{field, attr}); } if (Collection.class.isAssignableFrom(field.getType())) { - subMethod = getSubMethod(field.getName(), clazz); + String fieldName = field.getName(); ParameterizedType pt = (ParameterizedType) field.getGenericType(); Class subClass = (Class) pt.getActualTypeArguments()[0]; - this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + subFieldsMap.put(fieldName, FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class)); } } @@ -1505,27 +1510,33 @@ public class ExcelUtil { * 是否有对象的子列表 */ public boolean isSubList() { - return StringUtils.isNotNull(subFields) && subFields.size() > 0; + return !StringUtils.isEmpty(subFieldsMap); } /** * 是否有对象的子列表,集合不为空 */ public boolean isSubListValue(T vo) { - return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + return !StringUtils.isEmpty(subFieldsMap) && getListCellValue(vo) > 0; } /** * 获取集合的值 */ - public Collection getListCellValue(Object obj) { - Object value; + public int getListCellValue(Object obj) { + Collection value; + int max = 0; try { - value = subMethod.invoke(obj, new Object[]{}); + for (String s : subMethods.keySet()) { + value = (Collection) subMethods.get(s).invoke(obj); + if (value.size() > max) { + max = value.size(); + } + } } catch (Exception e) { - return new ArrayList(); + return 0; } - return (Collection) value; + return max; } /**