|
|
|
@ -39,6 +39,7 @@ import org.apache.poi.ss.usermodel.Cell;
|
|
|
|
|
import org.apache.poi.ss.usermodel.CellStyle; |
|
|
|
|
import org.apache.poi.ss.usermodel.CellType; |
|
|
|
|
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.DataValidationConstraint; |
|
|
|
|
import org.apache.poi.ss.usermodel.DataValidationHelper; |
|
|
|
@ -783,6 +784,8 @@ public class ExcelUtil<T>
|
|
|
|
|
titleFont.setFontHeightInPoints((short) 16); |
|
|
|
|
titleFont.setBold(true); |
|
|
|
|
style.setFont(titleFont); |
|
|
|
|
DataFormat dataFormat = wb.createDataFormat(); |
|
|
|
|
style.setDataFormat(dataFormat.getFormat("@")); |
|
|
|
|
styles.put("title", style); |
|
|
|
|
|
|
|
|
|
style = wb.createCellStyle(); |
|
|
|
@ -845,6 +848,9 @@ public class ExcelUtil<T>
|
|
|
|
|
headerFont.setBold(true); |
|
|
|
|
headerFont.setColor(excel.headerColor().index); |
|
|
|
|
style.setFont(headerFont); |
|
|
|
|
// 设置表格头单元格文本形式
|
|
|
|
|
DataFormat dataFormat = wb.createDataFormat(); |
|
|
|
|
style.setDataFormat(dataFormat.getFormat("@")); |
|
|
|
|
headerStyles.put(key, style); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -862,34 +868,66 @@ public class ExcelUtil<T>
|
|
|
|
|
Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); |
|
|
|
|
for (Object[] os : fields) |
|
|
|
|
{ |
|
|
|
|
Field field = (Field) os[0]; |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 根据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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 创建单元格 |
|
|
|
|
*/ |
|
|
|
@ -904,7 +942,7 @@ public class ExcelUtil<T>
|
|
|
|
|
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()) |
|
|
|
|
{ |
|
|
|
|
sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); |
|
|
|
@ -922,7 +960,7 @@ public class ExcelUtil<T>
|
|
|
|
|
*/ |
|
|
|
|
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); |
|
|
|
|
// 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
|
|
|
|
@ -1034,7 +1072,7 @@ public class ExcelUtil<T>
|
|
|
|
|
CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); |
|
|
|
|
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); |
|
|
|
|