diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 9feebdde3..e3219a08c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -174,12 +174,12 @@ public class ExcelUtil /** * 对象的子列表方法 */ - private Method subMethod; + private Map subMethods = new HashMap<>(); /** * 对象的子列表属性 */ - private List subFields; + private Map> subFieldsMap = new HashMap<>(); /** * 统计列表 @@ -252,7 +252,7 @@ public class ExcelUtil 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); @@ -272,16 +272,17 @@ public class ExcelUtil { 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); @@ -293,7 +294,7 @@ public class ExcelUtil { Cell cell = subRow.createCell(column++); cell.setCellValue(attr.name()); - cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + cell.setCellStyle(cellStyle); } } rownum++; @@ -374,7 +375,11 @@ 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)) @@ -382,10 +387,6 @@ public class ExcelUtil String value = this.getCellValue(heard, i).toString(); cellMap.put(value, i); } - else - { - cellMap.put(null, i); - } } // 有数据时才处理 得到类的所有field. List fields = this.getFields(); @@ -697,7 +698,8 @@ public class ExcelUtil 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++); @@ -710,7 +712,7 @@ public class ExcelUtil } if (Type.EXPORT.equals(type)) { - fillExcelData(index, row); + fillExcelData(index); addStatisticsRow(); } } @@ -723,7 +725,7 @@ 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()); @@ -731,7 +733,7 @@ public class ExcelUtil 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); @@ -747,6 +749,7 @@ public class ExcelUtil if (subList != null && !subList.isEmpty()) { int subIndex = 0; + List currentSubFields = subFieldsMap.get(field.getName()); for (Object subVo : subList) { Row subRow = sheet.getRow(currentRowNum + subIndex); @@ -756,14 +759,14 @@ 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) @@ -1120,7 +1123,7 @@ public class ExcelUtil * 添加单元格 */ @SuppressWarnings("deprecation") - public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) { Cell cell = null; try @@ -1132,7 +1135,7 @@ public class ExcelUtil { // 创建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) { @@ -1603,10 +1606,11 @@ public class ExcelUtil } if (Collection.class.isAssignableFrom(field.getType())) { - subMethod = getSubMethod(field.getName(), clazz); + String fieldName = field.getName(); + subMethods.put(fieldName, getSubMethod(fieldName, clazz)); 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)); } } @@ -1859,7 +1863,7 @@ public class ExcelUtil */ public boolean isSubList() { - return StringUtils.isNotNull(subFields) && subFields.size() > 0; + return !StringUtils.isEmpty(subFieldsMap); } /** @@ -1867,24 +1871,32 @@ public class ExcelUtil */ 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) + public int getListCellValue(Object obj) { - Object value; + 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; } /**