|  | @@ -28,6 +28,7 @@ import org.apache.poi.ss.usermodel.Cell;
 | 
											
												
													
														|  |  import org.apache.poi.ss.usermodel.CellStyle;
 |  |  import org.apache.poi.ss.usermodel.CellStyle;
 | 
											
												
													
														|  |  import org.apache.poi.ss.usermodel.CellType;
 |  |  import org.apache.poi.ss.usermodel.CellType;
 | 
											
												
													
														|  |  import org.apache.poi.ss.usermodel.ClientAnchor;
 |  |  import org.apache.poi.ss.usermodel.ClientAnchor;
 | 
											
												
													
														|  | 
 |  | +import org.apache.poi.ss.usermodel.DataFormat;
 | 
											
												
													
														|  |  import org.apache.poi.ss.usermodel.DataValidation;
 |  |  import org.apache.poi.ss.usermodel.DataValidation;
 | 
											
												
													
														|  |  import org.apache.poi.ss.usermodel.DataValidationConstraint;
 |  |  import org.apache.poi.ss.usermodel.DataValidationConstraint;
 | 
											
												
													
														|  |  import org.apache.poi.ss.usermodel.DataValidationHelper;
 |  |  import org.apache.poi.ss.usermodel.DataValidationHelper;
 | 
											
										
											
												
													
														|  | @@ -652,6 +653,8 @@ public class ExcelUtil<T>
 | 
											
												
													
														|  |          titleFont.setFontHeightInPoints((short) 16);
 |  |          titleFont.setFontHeightInPoints((short) 16);
 | 
											
												
													
														|  |          titleFont.setBold(true);
 |  |          titleFont.setBold(true);
 | 
											
												
													
														|  |          style.setFont(titleFont);
 |  |          style.setFont(titleFont);
 | 
											
												
													
														|  | 
 |  | +        DataFormat dataFormat = wb.createDataFormat();
 | 
											
												
													
														|  | 
 |  | +        style.setDataFormat(dataFormat.getFormat("@"));
 | 
											
												
													
														|  |          styles.put("title", style);
 |  |          styles.put("title", style);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          style = wb.createCellStyle();
 |  |          style = wb.createCellStyle();
 | 
											
										
											
												
													
														|  | @@ -714,6 +717,9 @@ public class ExcelUtil<T>
 | 
											
												
													
														|  |                  headerFont.setBold(true);
 |  |                  headerFont.setBold(true);
 | 
											
												
													
														|  |                  headerFont.setColor(excel.headerColor().index);
 |  |                  headerFont.setColor(excel.headerColor().index);
 | 
											
												
													
														|  |                  style.setFont(headerFont);
 |  |                  style.setFont(headerFont);
 | 
											
												
													
														|  | 
 |  | +                // 设置表格头单元格文本形式
 | 
											
												
													
														|  | 
 |  | +                DataFormat dataFormat = wb.createDataFormat();
 | 
											
												
													
														|  | 
 |  | +                style.setDataFormat(dataFormat.getFormat("@"));
 | 
											
												
													
														|  |                  headerStyles.put(key, style);
 |  |                  headerStyles.put(key, style);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
										
											
												
													
														|  | @@ -731,34 +737,66 @@ public class ExcelUtil<T>
 | 
											
												
													
														|  |          Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
 |  |          Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
 | 
											
												
													
														|  |          for (Object[] os : fields)
 |  |          for (Object[] os : fields)
 | 
											
												
													
														|  |          {
 |  |          {
 | 
											
												
													
														|  | 
 |  | +            Field field = (Field) os[0];
 | 
											
												
													
														|  |              Excel excel = (Excel) os[1];
 |  |              Excel excel = (Excel) os[1];
 | 
											
												
													
														|  | -            String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor());
 |  | 
 | 
											
												
													
														|  | -            if (!styles.containsKey(key))
 |  | 
 | 
											
												
													
														|  | 
 |  | +            if (Collection.class.isAssignableFrom(field.getType()))
 | 
											
												
													
														|  |              {
 |  |              {
 | 
											
												
													
														|  | -                CellStyle style = wb.createCellStyle();
 |  | 
 | 
											
												
													
														|  | -                style.setAlignment(excel.align());
 |  | 
 | 
											
												
													
														|  | -                style.setVerticalAlignment(VerticalAlignment.CENTER);
 |  | 
 | 
											
												
													
														|  | -                style.setBorderRight(BorderStyle.THIN);
 |  | 
 | 
											
												
													
														|  | -                style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 |  | 
 | 
											
												
													
														|  | -                style.setBorderLeft(BorderStyle.THIN);
 |  | 
 | 
											
												
													
														|  | -                style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 |  | 
 | 
											
												
													
														|  | -                style.setBorderTop(BorderStyle.THIN);
 |  | 
 | 
											
												
													
														|  | -                style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 |  | 
 | 
											
												
													
														|  | -                style.setBorderBottom(BorderStyle.THIN);
 |  | 
 | 
											
												
													
														|  | -                style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 |  | 
 | 
											
												
													
														|  | -                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
 |  | 
 | 
											
												
													
														|  | -                style.setFillForegroundColor(excel.backgroundColor().getIndex());
 |  | 
 | 
											
												
													
														|  | -                Font dataFont = wb.createFont();
 |  | 
 | 
											
												
													
														|  | -                dataFont.setFontName("Arial");
 |  | 
 | 
											
												
													
														|  | -                dataFont.setFontHeightInPoints((short) 10);
 |  | 
 | 
											
												
													
														|  | -                dataFont.setColor(excel.color().index);
 |  | 
 | 
											
												
													
														|  | -                style.setFont(dataFont);
 |  | 
 | 
											
												
													
														|  | -                styles.put(key, style);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                ParameterizedType pt = (ParameterizedType) field.getGenericType();
 | 
											
												
													
														|  | 
 |  | +                Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0];
 | 
											
												
													
														|  | 
 |  | +                List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class);
 | 
											
												
													
														|  | 
 |  | +                for (Field subField : subFields)
 | 
											
												
													
														|  | 
 |  | +                {
 | 
											
												
													
														|  | 
 |  | +                    Excel subExcel = subField.getAnnotation(Excel.class);
 | 
											
												
													
														|  | 
 |  | +                    annotationDataStyles(styles, subField, subExcel);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            else
 | 
											
												
													
														|  | 
 |  | +            {
 | 
											
												
													
														|  | 
 |  | +                annotationDataStyles(styles, field, excel);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |          return styles;
 |  |          return styles;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * 根据Excel注解创建表格列样式
 | 
											
												
													
														|  | 
 |  | +     * 
 | 
											
												
													
														|  | 
 |  | +     * @param styles 自定义样式列表
 | 
											
												
													
														|  | 
 |  | +     * @param field  属性列信息
 | 
											
												
													
														|  | 
 |  | +     * @param excel  注解信息
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    public void annotationDataStyles(Map<String, CellStyle> styles, Field field, Excel excel)
 | 
											
												
													
														|  | 
 |  | +    {
 | 
											
												
													
														|  | 
 |  | +        String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType());
 | 
											
												
													
														|  | 
 |  | +        if (!styles.containsKey(key))
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            CellStyle style = wb.createCellStyle();
 | 
											
												
													
														|  | 
 |  | +            style.setAlignment(excel.align());
 | 
											
												
													
														|  | 
 |  | +            style.setVerticalAlignment(VerticalAlignment.CENTER);
 | 
											
												
													
														|  | 
 |  | +            style.setBorderRight(BorderStyle.THIN);
 | 
											
												
													
														|  | 
 |  | +            style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 | 
											
												
													
														|  | 
 |  | +            style.setBorderLeft(BorderStyle.THIN);
 | 
											
												
													
														|  | 
 |  | +            style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 | 
											
												
													
														|  | 
 |  | +            style.setBorderTop(BorderStyle.THIN);
 | 
											
												
													
														|  | 
 |  | +            style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 | 
											
												
													
														|  | 
 |  | +            style.setBorderBottom(BorderStyle.THIN);
 | 
											
												
													
														|  | 
 |  | +            style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
 | 
											
												
													
														|  | 
 |  | +            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
 | 
											
												
													
														|  | 
 |  | +            style.setFillForegroundColor(excel.backgroundColor().getIndex());
 | 
											
												
													
														|  | 
 |  | +            Font dataFont = wb.createFont();
 | 
											
												
													
														|  | 
 |  | +            dataFont.setFontName("Arial");
 | 
											
												
													
														|  | 
 |  | +            dataFont.setFontHeightInPoints((short) 10);
 | 
											
												
													
														|  | 
 |  | +            dataFont.setColor(excel.color().index);
 | 
											
												
													
														|  | 
 |  | +            style.setFont(dataFont);
 | 
											
												
													
														|  | 
 |  | +            if (ColumnType.TEXT == excel.cellType())
 | 
											
												
													
														|  | 
 |  | +            {
 | 
											
												
													
														|  | 
 |  | +                DataFormat dataFormat = wb.createDataFormat();
 | 
											
												
													
														|  | 
 |  | +                style.setDataFormat(dataFormat.getFormat("@"));
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            styles.put(key, style);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  |       * 创建单元格
 |  |       * 创建单元格
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
										
											
												
													
														|  | @@ -773,7 +811,7 @@ public class ExcelUtil<T>
 | 
											
												
													
														|  |          if (isSubList())
 |  |          if (isSubList())
 | 
											
												
													
														|  |          {
 |  |          {
 | 
											
												
													
														|  |              // 填充默认样式,防止合并单元格样式失效
 |  |              // 填充默认样式,防止合并单元格样式失效
 | 
											
												
													
														|  | -            sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor())));
 |  | 
 | 
											
												
													
														|  | 
 |  | +            sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType())));
 | 
											
												
													
														|  |              if (attr.needMerge())
 |  |              if (attr.needMerge())
 | 
											
												
													
														|  |              {
 |  |              {
 | 
											
												
													
														|  |                  sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column));
 |  |                  sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column));
 | 
											
										
											
												
													
														|  | @@ -791,7 +829,7 @@ public class ExcelUtil<T>
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      public void setCellVo(Object value, Excel attr, Cell cell)
 |  |      public void setCellVo(Object value, Excel attr, Cell cell)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        if (ColumnType.STRING == attr.cellType())
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (ColumnType.STRING == attr.cellType() || ColumnType.TEXT == attr.cellType())
 | 
											
												
													
														|  |          {
 |  |          {
 | 
											
												
													
														|  |              String cellValue = Convert.toStr(value);
 |  |              String cellValue = Convert.toStr(value);
 | 
											
												
													
														|  |              // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
 |  |              // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
 | 
											
										
											
												
													
														|  | @@ -903,7 +941,7 @@ public class ExcelUtil<T>
 | 
											
												
													
														|  |                      CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column);
 |  |                      CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column);
 | 
											
												
													
														|  |                      sheet.addMergedRegion(cellAddress);
 |  |                      sheet.addMergedRegion(cellAddress);
 | 
											
												
													
														|  |                  }
 |  |                  }
 | 
											
												
													
														|  | -                cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor())));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType())));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |                  // 用于读取对象中的属性
 |  |                  // 用于读取对象中的属性
 | 
											
												
													
														|  |                  Object value = getTargetValue(vo, field, attr);
 |  |                  Object value = getTargetValue(vo, field, attr);
 | 
											
										
											
												
													
														|  | @@ -1032,7 +1070,7 @@ public class ExcelUtil<T>
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  |       * 解析导出值 0=男,1=女,2=未知
 |  |       * 解析导出值 0=男,1=女,2=未知
 | 
											
												
													
														|  | -     *
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * 
 | 
											
												
													
														|  |       * @param propertyValue 参数值
 |  |       * @param propertyValue 参数值
 | 
											
												
													
														|  |       * @param converterExp 翻译注解
 |  |       * @param converterExp 翻译注解
 | 
											
												
													
														|  |       * @param separator 分隔符
 |  |       * @param separator 分隔符
 |