修复导出子列表对象只能在最后的问题
This commit is contained in:
		
							parent
							
								
									28a16d9878
								
							
						
					
					
						commit
						8faea60191
					
				| @ -225,8 +225,6 @@ public class ExcelUtil<T> | |||||||
|     { |     { | ||||||
|         if (StringUtils.isNotEmpty(title)) |         if (StringUtils.isNotEmpty(title)) | ||||||
|         { |         { | ||||||
|             subMergedFirstRowNum++; |  | ||||||
|             subMergedLastRowNum++; |  | ||||||
|             int titleLastCol = this.fields.size() - 1; |             int titleLastCol = this.fields.size() - 1; | ||||||
|             if (isSubList()) |             if (isSubList()) | ||||||
|             { |             { | ||||||
| @ -237,7 +235,7 @@ public class ExcelUtil<T> | |||||||
|             Cell titleCell = titleRow.createCell(0); |             Cell titleCell = titleRow.createCell(0); | ||||||
|             titleCell.setCellStyle(styles.get("title")); |             titleCell.setCellStyle(styles.get("title")); | ||||||
|             titleCell.setCellValue(title); |             titleCell.setCellValue(title); | ||||||
|             sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); |             sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), 0, titleLastCol)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -248,23 +246,31 @@ public class ExcelUtil<T> | |||||||
|     { |     { | ||||||
|         if (isSubList()) |         if (isSubList()) | ||||||
|         { |         { | ||||||
|             subMergedFirstRowNum++; |  | ||||||
|             subMergedLastRowNum++; |  | ||||||
|             Row subRow = sheet.createRow(rownum); |             Row subRow = sheet.createRow(rownum); | ||||||
|             int excelNum = 0; |             int column = 0; | ||||||
|  |             int subFieldSize = subFields != null ? subFields.size() : 0; | ||||||
|             for (Object[] objects : fields) |             for (Object[] objects : fields) | ||||||
|             { |             { | ||||||
|  |                 Field field = (Field) objects[0]; | ||||||
|                 Excel attr = (Excel) objects[1]; |                 Excel attr = (Excel) objects[1]; | ||||||
|                 Cell headCell1 = subRow.createCell(excelNum); |                 if (Collection.class.isAssignableFrom(field.getType())) | ||||||
|                 headCell1.setCellValue(attr.name()); |  | ||||||
|                 headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); |  | ||||||
|                 excelNum++; |  | ||||||
|             } |  | ||||||
|             int headFirstRow = excelNum - 1; |  | ||||||
|             int headLastRow = headFirstRow + subFields.size() - 1; |  | ||||||
|             if (headLastRow > headFirstRow) |  | ||||||
|                 { |                 { | ||||||
|                 sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); |                     Cell cell = subRow.createCell(column); | ||||||
|  |                     cell.setCellValue(attr.name()); | ||||||
|  |                     cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); | ||||||
|  |                     if (subFieldSize > 1) | ||||||
|  |                     { | ||||||
|  |                         CellRangeAddress cellAddress = new CellRangeAddress(rownum, rownum, column, column + subFieldSize - 1); | ||||||
|  |                         sheet.addMergedRegion(cellAddress); | ||||||
|  |                     } | ||||||
|  |                     column += subFieldSize; | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     Cell cell = subRow.createCell(column++); | ||||||
|  |                     cell.setCellValue(attr.name()); | ||||||
|  |                     cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             rownum++; |             rownum++; | ||||||
|         } |         } | ||||||
| @ -589,64 +595,91 @@ public class ExcelUtil<T> | |||||||
|     { |     { | ||||||
|         int startNo = index * sheetSize; |         int startNo = index * sheetSize; | ||||||
|         int endNo = Math.min(startNo + sheetSize, list.size()); |         int endNo = Math.min(startNo + sheetSize, list.size()); | ||||||
|         int rowNo = (1 + rownum) - startNo; |         int currentRowNum = rownum + 1; // 从标题行后开始 | ||||||
|  | 
 | ||||||
|         for (int i = startNo; i < endNo; i++) |         for (int i = startNo; i < endNo; i++) | ||||||
|         { |         { | ||||||
|             rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; |             row = sheet.createRow(currentRowNum); | ||||||
|             row = sheet.createRow(rowNo); |  | ||||||
|             // 得到导出对象. |  | ||||||
|             T vo = (T) list.get(i); |             T vo = (T) list.get(i); | ||||||
|             Collection<?> subList = null; |  | ||||||
|             if (isSubList()) |  | ||||||
|             { |  | ||||||
|                 if (isSubListValue(vo)) |  | ||||||
|                 { |  | ||||||
|                     subList = getListCellValue(vo); |  | ||||||
|                     subMergedLastRowNum = subMergedLastRowNum + subList.size(); |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     subMergedFirstRowNum++; |  | ||||||
|                     subMergedLastRowNum++; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             int column = 0; |             int column = 0; | ||||||
|  |             int maxSubListSize = getCurrentMaxSubListSize(vo); | ||||||
|             for (Object[] os : fields) |             for (Object[] os : fields) | ||||||
|             { |             { | ||||||
|                 Field field = (Field) os[0]; |                 Field field = (Field) os[0]; | ||||||
|                 Excel excel = (Excel) os[1]; |                 Excel excel = (Excel) os[1]; | ||||||
|                 if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) |                 if (Collection.class.isAssignableFrom(field.getType())) | ||||||
|                 { |                 { | ||||||
|                     boolean subFirst = false; |                     try | ||||||
|                     for (Object obj : subList) |  | ||||||
|                     { |                     { | ||||||
|                         if (subFirst) |                         Collection<?> subList = (Collection<?>) getTargetValue(vo, field, excel); | ||||||
|  |                         if (subList != null && !subList.isEmpty()) | ||||||
|                         { |                         { | ||||||
|                             rowNo++; |  | ||||||
|                             row = sheet.createRow(rowNo); |  | ||||||
|                         } |  | ||||||
|                         List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); |  | ||||||
|                             int subIndex = 0; |                             int subIndex = 0; | ||||||
|  |                             for (Object subVo : subList) | ||||||
|  |                             { | ||||||
|  |                                 Row subRow = sheet.getRow(currentRowNum + subIndex); | ||||||
|  |                                 if (subRow == null) | ||||||
|  |                                 { | ||||||
|  |                                     subRow = sheet.createRow(currentRowNum + subIndex); | ||||||
|  |                                 } | ||||||
|  | 
 | ||||||
|  |                                 int subColumn = column; | ||||||
|                                 for (Field subField : subFields) |                                 for (Field subField : subFields) | ||||||
|                                 { |                                 { | ||||||
|                             if (subField.isAnnotationPresent(Excel.class)) |                                     Excel subExcel = subField.getAnnotation(Excel.class); | ||||||
|                             { |                                     addCell(subExcel, subRow, (T) subVo, subField, subColumn++); | ||||||
|                                 subField.setAccessible(true); |  | ||||||
|                                 Excel attr = subField.getAnnotation(Excel.class); |  | ||||||
|                                 this.addCell(attr, row, (T) obj, subField, column + subIndex); |  | ||||||
|                                 } |                                 } | ||||||
|                                 subIndex++; |                                 subIndex++; | ||||||
|                             } |                             } | ||||||
|                         subFirst = true; |                             column += subFields.size(); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     catch (Exception e) | ||||||
|  |                     { | ||||||
|  |                         log.error("填充集合数据失败", e); | ||||||
|                     } |                     } | ||||||
|                     this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); |  | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                 { |                 { | ||||||
|                     this.addCell(excel, row, vo, field, column++); |                     // 创建单元格并设置值 | ||||||
|  |                     addCell(excel, row, vo, field, column); | ||||||
|  |                     if (maxSubListSize > 1 && excel.needMerge()) | ||||||
|  |                     { | ||||||
|  |                         sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum + maxSubListSize - 1, column, column)); | ||||||
|  |                     } | ||||||
|  |                     column++; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             currentRowNum += maxSubListSize; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 获取子列表最大数 | ||||||
|  |      */ | ||||||
|  |     private int getCurrentMaxSubListSize(T vo) | ||||||
|  |     { | ||||||
|  |         int maxSubListSize = 1; | ||||||
|  |         for (Object[] os : fields) | ||||||
|  |         { | ||||||
|  |             Field field = (Field) os[0]; | ||||||
|  |             if (Collection.class.isAssignableFrom(field.getType())) | ||||||
|  |             { | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     Collection<?> subList = (Collection<?>) getTargetValue(vo, field, (Excel) os[1]); | ||||||
|  |                     if (subList != null && !subList.isEmpty()) | ||||||
|  |                     { | ||||||
|  |                         maxSubListSize = Math.max(maxSubListSize, subList.size()); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 catch (Exception e) | ||||||
|  |                 { | ||||||
|  |                     log.error("获取集合大小失败", e); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         return maxSubListSize; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -952,8 +985,10 @@ public class ExcelUtil<T> | |||||||
|                 cell = row.createCell(column); |                 cell = row.createCell(column); | ||||||
|                 if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) |                 if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) | ||||||
|                 { |                 { | ||||||
|                     CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); |                     if (subMergedLastRowNum >= subMergedFirstRowNum) | ||||||
|                     sheet.addMergedRegion(cellAddress); |                     { | ||||||
|  |                         sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column)); | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|                 cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); |                 cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); | ||||||
| 
 | 
 | ||||||
| @ -1235,6 +1270,7 @@ public class ExcelUtil<T> | |||||||
|      */ |      */ | ||||||
|     private Object getTargetValue(T vo, Field field, Excel excel) throws Exception |     private Object getTargetValue(T vo, Field field, Excel excel) throws Exception | ||||||
|     { |     { | ||||||
|  |         field.setAccessible(true); | ||||||
|         Object o = field.get(vo); |         Object o = field.get(vo); | ||||||
|         if (StringUtils.isNotEmpty(excel.targetAttr())) |         if (StringUtils.isNotEmpty(excel.targetAttr())) | ||||||
|         { |         { | ||||||
| @ -1335,7 +1371,6 @@ public class ExcelUtil<T> | |||||||
|             Excel attr = field.getAnnotation(Excel.class); |             Excel attr = field.getAnnotation(Excel.class); | ||||||
|             if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) |             if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) | ||||||
|             { |             { | ||||||
|                 field.setAccessible(true); |  | ||||||
|                 fields.add(new Object[] { field, attr }); |                 fields.add(new Object[] { field, attr }); | ||||||
|             } |             } | ||||||
|             if (Collection.class.isAssignableFrom(field.getType())) |             if (Collection.class.isAssignableFrom(field.getType())) | ||||||
| @ -1359,7 +1394,6 @@ public class ExcelUtil<T> | |||||||
|                     if (ArrayUtils.contains(this.includeFields, field.getName() + "." + attr.targetAttr()) |                     if (ArrayUtils.contains(this.includeFields, field.getName() + "." + attr.targetAttr()) | ||||||
|                             && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) |                             && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) | ||||||
|                     { |                     { | ||||||
|                         field.setAccessible(true); |  | ||||||
|                         fields.add(new Object[] { field, attr }); |                         fields.add(new Object[] { field, attr }); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @ -1368,7 +1402,6 @@ public class ExcelUtil<T> | |||||||
|                     if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) |                     if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) | ||||||
|                             && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) |                             && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) | ||||||
|                     { |                     { | ||||||
|                         field.setAccessible(true); |  | ||||||
|                         fields.add(new Object[] { field, attr }); |                         fields.add(new Object[] { field, attr }); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 RuoYi
						RuoYi