|  | @@ -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);
 |  | 
 | 
											
												
													
														|  | -                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));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                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())));
 | 
											
												
													
														|  | 
 |  | +                    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,66 +595,93 @@ 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(rowNo);
 |  | 
 | 
											
												
													
														|  | -            // 得到导出对象.
 |  | 
 | 
											
												
													
														|  | 
 |  | +            row = sheet.createRow(currentRowNum);
 | 
											
												
													
														|  |              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;
 |  | 
 | 
											
												
													
														|  | -                    for (Object obj : subList)
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    try
 | 
											
												
													
														|  |                      {
 |  |                      {
 | 
											
												
													
														|  | -                        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;
 |  | 
 | 
											
												
													
														|  | -                        for (Field subField : subFields)
 |  | 
 | 
											
												
													
														|  | -                        {
 |  | 
 | 
											
												
													
														|  | -                            if (subField.isAnnotationPresent(Excel.class))
 |  | 
 | 
											
												
													
														|  | 
 |  | +                            int subIndex = 0;
 | 
											
												
													
														|  | 
 |  | +                            for (Object subVo : subList)
 | 
											
												
													
														|  |                              {
 |  |                              {
 | 
											
												
													
														|  | -                                subField.setAccessible(true);
 |  | 
 | 
											
												
													
														|  | -                                Excel attr = subField.getAnnotation(Excel.class);
 |  | 
 | 
											
												
													
														|  | -                                this.addCell(attr, row, (T) obj, subField, column + subIndex);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                                Row subRow = sheet.getRow(currentRowNum + subIndex);
 | 
											
												
													
														|  | 
 |  | +                                if (subRow == null)
 | 
											
												
													
														|  | 
 |  | +                                {
 | 
											
												
													
														|  | 
 |  | +                                    subRow = sheet.createRow(currentRowNum + subIndex);
 | 
											
												
													
														|  | 
 |  | +                                }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +                                int subColumn = column;
 | 
											
												
													
														|  | 
 |  | +                                for (Field subField : subFields)
 | 
											
												
													
														|  | 
 |  | +                                {
 | 
											
												
													
														|  | 
 |  | +                                    Excel subExcel = subField.getAnnotation(Excel.class);
 | 
											
												
													
														|  | 
 |  | +                                    addCell(subExcel, subRow, (T) subVo, subField, subColumn++);
 | 
											
												
													
														|  | 
 |  | +                                }
 | 
											
												
													
														|  | 
 |  | +                                subIndex++;
 | 
											
												
													
														|  |                              }
 |  |                              }
 | 
											
												
													
														|  | -                            subIndex++;
 |  | 
 | 
											
												
													
														|  | 
 |  | +                            column += subFields.size();
 | 
											
												
													
														|  |                          }
 |  |                          }
 | 
											
												
													
														|  | -                        subFirst = true;
 |  | 
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  | -                    this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size();
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    catch (Exception e)
 | 
											
												
													
														|  | 
 |  | +                    {
 | 
											
												
													
														|  | 
 |  | +                        log.error("填充集合数据失败", e);
 | 
											
												
													
														|  | 
 |  | +                    }
 | 
											
												
													
														|  |                  }
 |  |                  }
 | 
											
												
													
														|  |                  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);
 |  | 
 | 
											
												
													
														|  | -                    sheet.addMergedRegion(cellAddress);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    if (subMergedLastRowNum >= subMergedFirstRowNum)
 | 
											
												
													
														|  | 
 |  | +                    {
 | 
											
												
													
														|  | 
 |  | +                        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 });
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  |                  }
 |  |                  }
 |