作者 RuoYi

Excel注解ColumnType类型新增文本

@@ -171,7 +171,7 @@ public @interface Excel @@ -171,7 +171,7 @@ public @interface Excel
171 171
172 public enum ColumnType 172 public enum ColumnType
173 { 173 {
174 - NUMERIC(0), STRING(1), IMAGE(2); 174 + NUMERIC(0), STRING(1), IMAGE(2), TEXT(3);
175 private final int value; 175 private final int value;
176 176
177 ColumnType(int value) 177 ColumnType(int value)
@@ -42,7 +42,7 @@ public class SysUser extends BaseEntity @@ -42,7 +42,7 @@ public class SysUser extends BaseEntity
42 private String email; 42 private String email;
43 43
44 /** 手机号码 */ 44 /** 手机号码 */
45 - @Excel(name = "手机号码") 45 + @Excel(name = "手机号码", cellType = ColumnType.TEXT)
46 private String phonenumber; 46 private String phonenumber;
47 47
48 /** 用户性别 */ 48 /** 用户性别 */
@@ -39,6 +39,7 @@ import org.apache.poi.ss.usermodel.Cell; @@ -39,6 +39,7 @@ import org.apache.poi.ss.usermodel.Cell;
39 import org.apache.poi.ss.usermodel.CellStyle; 39 import org.apache.poi.ss.usermodel.CellStyle;
40 import org.apache.poi.ss.usermodel.CellType; 40 import org.apache.poi.ss.usermodel.CellType;
41 import org.apache.poi.ss.usermodel.ClientAnchor; 41 import org.apache.poi.ss.usermodel.ClientAnchor;
  42 +import org.apache.poi.ss.usermodel.DataFormat;
42 import org.apache.poi.ss.usermodel.DataValidation; 43 import org.apache.poi.ss.usermodel.DataValidation;
43 import org.apache.poi.ss.usermodel.DataValidationConstraint; 44 import org.apache.poi.ss.usermodel.DataValidationConstraint;
44 import org.apache.poi.ss.usermodel.DataValidationHelper; 45 import org.apache.poi.ss.usermodel.DataValidationHelper;
@@ -783,6 +784,8 @@ public class ExcelUtil<T> @@ -783,6 +784,8 @@ public class ExcelUtil<T>
783 titleFont.setFontHeightInPoints((short) 16); 784 titleFont.setFontHeightInPoints((short) 16);
784 titleFont.setBold(true); 785 titleFont.setBold(true);
785 style.setFont(titleFont); 786 style.setFont(titleFont);
  787 + DataFormat dataFormat = wb.createDataFormat();
  788 + style.setDataFormat(dataFormat.getFormat("@"));
786 styles.put("title", style); 789 styles.put("title", style);
787 790
788 style = wb.createCellStyle(); 791 style = wb.createCellStyle();
@@ -862,35 +865,67 @@ public class ExcelUtil<T> @@ -862,35 +865,67 @@ public class ExcelUtil<T>
862 Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); 865 Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
863 for (Object[] os : fields) 866 for (Object[] os : fields)
864 { 867 {
  868 + Field field = (Field) os[0];
865 Excel excel = (Excel) os[1]; 869 Excel excel = (Excel) os[1];
866 - String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor());  
867 - if (!styles.containsKey(key)) 870 + if (Collection.class.isAssignableFrom(field.getType()))
868 { 871 {
869 - CellStyle style = wb.createCellStyle();  
870 - style.setAlignment(excel.align());  
871 - style.setVerticalAlignment(VerticalAlignment.CENTER);  
872 - style.setBorderRight(BorderStyle.THIN);  
873 - style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());  
874 - style.setBorderLeft(BorderStyle.THIN);  
875 - style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());  
876 - style.setBorderTop(BorderStyle.THIN);  
877 - style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());  
878 - style.setBorderBottom(BorderStyle.THIN);  
879 - style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());  
880 - style.setFillPattern(FillPatternType.SOLID_FOREGROUND);  
881 - style.setFillForegroundColor(excel.backgroundColor().getIndex());  
882 - Font dataFont = wb.createFont();  
883 - dataFont.setFontName("Arial");  
884 - dataFont.setFontHeightInPoints((short) 10);  
885 - dataFont.setColor(excel.color().index);  
886 - style.setFont(dataFont);  
887 - styles.put(key, style); 872 + ParameterizedType pt = (ParameterizedType) field.getGenericType();
  873 + Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0];
  874 + List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class);
  875 + for (Field subField : subFields)
  876 + {
  877 + Excel subExcel = subField.getAnnotation(Excel.class);
  878 + annotationDataStyles(styles, subField, subExcel);
  879 + }
  880 + }
  881 + else
  882 + {
  883 + annotationDataStyles(styles, field, excel);
888 } 884 }
889 } 885 }
890 return styles; 886 return styles;
891 } 887 }
892 888
893 /** 889 /**
  890 + * 根据Excel注解创建表格列样式
  891 + *
  892 + * @param styles 自定义样式列表
  893 + * @param field 属性列信息
  894 + * @param excel 注解信息
  895 + */
  896 + public void annotationDataStyles(Map<String, CellStyle> styles, Field field, Excel excel)
  897 + {
  898 + String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType());
  899 + if (!styles.containsKey(key))
  900 + {
  901 + CellStyle style = wb.createCellStyle();
  902 + style.setAlignment(excel.align());
  903 + style.setVerticalAlignment(VerticalAlignment.CENTER);
  904 + style.setBorderRight(BorderStyle.THIN);
  905 + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
  906 + style.setBorderLeft(BorderStyle.THIN);
  907 + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
  908 + style.setBorderTop(BorderStyle.THIN);
  909 + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
  910 + style.setBorderBottom(BorderStyle.THIN);
  911 + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
  912 + style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  913 + style.setFillForegroundColor(excel.backgroundColor().getIndex());
  914 + Font dataFont = wb.createFont();
  915 + dataFont.setFontName("Arial");
  916 + dataFont.setFontHeightInPoints((short) 10);
  917 + dataFont.setColor(excel.color().index);
  918 + style.setFont(dataFont);
  919 + if (ColumnType.TEXT == excel.cellType())
  920 + {
  921 + DataFormat dataFormat = wb.createDataFormat();
  922 + style.setDataFormat(dataFormat.getFormat("@"));
  923 + }
  924 + styles.put(key, style);
  925 + }
  926 + }
  927 +
  928 + /**
894 * 创建单元格 929 * 创建单元格
895 */ 930 */
896 public Cell createHeadCell(Excel attr, Row row, int column) 931 public Cell createHeadCell(Excel attr, Row row, int column)
@@ -904,7 +939,7 @@ public class ExcelUtil<T> @@ -904,7 +939,7 @@ public class ExcelUtil<T>
904 if (isSubList()) 939 if (isSubList())
905 { 940 {
906 // 填充默认样式,防止合并单元格样式失效 941 // 填充默认样式,防止合并单元格样式失效
907 - sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); 942 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType())));
908 if (attr.needMerge()) 943 if (attr.needMerge())
909 { 944 {
910 sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); 945 sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column));
@@ -922,7 +957,7 @@ public class ExcelUtil<T> @@ -922,7 +957,7 @@ public class ExcelUtil<T>
922 */ 957 */
923 public void setCellVo(Object value, Excel attr, Cell cell) 958 public void setCellVo(Object value, Excel attr, Cell cell)
924 { 959 {
925 - if (ColumnType.STRING == attr.cellType()) 960 + if (ColumnType.STRING == attr.cellType() || ColumnType.TEXT == attr.cellType())
926 { 961 {
927 String cellValue = Convert.toStr(value); 962 String cellValue = Convert.toStr(value);
928 // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 963 // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
@@ -1034,7 +1069,7 @@ public class ExcelUtil<T> @@ -1034,7 +1069,7 @@ public class ExcelUtil<T>
1034 CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); 1069 CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column);
1035 sheet.addMergedRegion(cellAddress); 1070 sheet.addMergedRegion(cellAddress);
1036 } 1071 }
1037 - cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); 1072 + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType())));
1038 1073
1039 // 用于读取对象中的属性 1074 // 用于读取对象中的属性
1040 Object value = getTargetValue(vo, field, attr); 1075 Object value = getTargetValue(vo, field, attr);