From b8e389bb7e7e08ba64df847a46c27356bdef7d31 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期二, 23 五月 2023 13:45:11 +0800
Subject: [PATCH] update 优化 excel导出合并 在初始化类时进行数据的处理
---
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java | 131 +++++++++++++++++++++----------------------
1 files changed, 65 insertions(+), 66 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java
index 71a5703..08f4dda 100644
--- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java
+++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java
@@ -28,95 +28,94 @@
@Slf4j
public class CellMergeStrategy extends AbstractMergeStrategy {
- private final List<?> list;
- private final boolean hasTitle;
+ private final List<CellRangeAddress> cellList;
+ private final boolean hasTitle;
private int rowIndex;
public CellMergeStrategy(List<?> list, boolean hasTitle) {
- this.list = list;
this.hasTitle = hasTitle;
// 琛屽悎骞跺紑濮嬩笅鏍�
this.rowIndex = hasTitle ? 1 : 0;
+ this.cellList = handle(list, hasTitle);
}
@Override
- protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
- List<CellRangeAddress> cellList = handle(list, hasTitle);
- // judge the list is not null
- if (CollUtil.isNotEmpty(cellList)) {
- // the judge is necessary
- if (cell.getRowIndex() == rowIndex && cell.getColumnIndex() == 0) {
- for (CellRangeAddress item : cellList) {
- sheet.addMergedRegion(item);
- }
- }
- }
- }
+ protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
+ // judge the list is not null
+ if (CollUtil.isNotEmpty(cellList)) {
+ // the judge is necessary
+ if (cell.getRowIndex() == rowIndex && cell.getColumnIndex() == 0) {
+ for (CellRangeAddress item : cellList) {
+ sheet.addMergedRegion(item);
+ }
+ }
+ }
+ }
- @SneakyThrows
- private List<CellRangeAddress> handle(List<?> list, boolean hasTitle) {
- List<CellRangeAddress> cellList = new ArrayList<>();
- if (CollUtil.isEmpty(list)) {
- return cellList;
- }
+ @SneakyThrows
+ private List<CellRangeAddress> handle(List<?> list, boolean hasTitle) {
+ List<CellRangeAddress> cellList = new ArrayList<>();
+ if (CollUtil.isEmpty(list)) {
+ return cellList;
+ }
Field[] fields = ReflectUtils.getFields(list.get(0).getClass(), field -> !"serialVersionUID".equals(field.getName()));
- // 鏈夋敞瑙g殑瀛楁
- List<Field> mergeFields = new ArrayList<>();
- List<Integer> mergeFieldsIndex = new ArrayList<>();
- for (int i = 0; i < fields.length; i++) {
- Field field = fields[i];
- if (field.isAnnotationPresent(CellMerge.class)) {
- CellMerge cm = field.getAnnotation(CellMerge.class);
+ // 鏈夋敞瑙g殑瀛楁
+ List<Field> mergeFields = new ArrayList<>();
+ List<Integer> mergeFieldsIndex = new ArrayList<>();
+ for (int i = 0; i < fields.length; i++) {
+ Field field = fields[i];
+ if (field.isAnnotationPresent(CellMerge.class)) {
+ CellMerge cm = field.getAnnotation(CellMerge.class);
mergeFields.add(field);
mergeFieldsIndex.add(cm.index() == -1 ? i : cm.index());
if (hasTitle) {
ExcelProperty property = field.getAnnotation(ExcelProperty.class);
rowIndex = Math.max(rowIndex, property.value().length);
}
- }
- }
+ }
+ }
- Map<Field, RepeatCell> map = new HashMap<>();
- // 鐢熸垚涓や袱鍚堝苟鍗曞厓鏍�
- for (int i = 0; i < list.size(); i++) {
- for (int j = 0; j < mergeFields.size(); j++) {
- Field field = mergeFields.get(j);
+ Map<Field, RepeatCell> map = new HashMap<>();
+ // 鐢熸垚涓や袱鍚堝苟鍗曞厓鏍�
+ for (int i = 0; i < list.size(); i++) {
+ for (int j = 0; j < mergeFields.size(); j++) {
+ Field field = mergeFields.get(j);
Object val = ReflectUtils.invokeGetter(list.get(i), field.getName());
- int colNum = mergeFieldsIndex.get(j);
- if (!map.containsKey(field)) {
- map.put(field, new RepeatCell(val, i));
- } else {
- RepeatCell repeatCell = map.get(field);
- Object cellValue = repeatCell.getValue();
- if (cellValue == null || "".equals(cellValue)) {
- // 绌哄�艰烦杩囦笉鍚堝苟
- continue;
- }
- if (!cellValue.equals(val)) {
- if (i - repeatCell.getCurrent() > 1) {
- cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum));
- }
- map.put(field, new RepeatCell(val, i));
- } else if (i == list.size() - 1) {
- if (i > repeatCell.getCurrent()) {
- cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum));
- }
- }
- }
- }
- }
- return cellList;
- }
+ int colNum = mergeFieldsIndex.get(j);
+ if (!map.containsKey(field)) {
+ map.put(field, new RepeatCell(val, i));
+ } else {
+ RepeatCell repeatCell = map.get(field);
+ Object cellValue = repeatCell.getValue();
+ if (cellValue == null || "".equals(cellValue)) {
+ // 绌哄�艰烦杩囦笉鍚堝苟
+ continue;
+ }
+ if (!cellValue.equals(val)) {
+ if (i - repeatCell.getCurrent() > 1) {
+ cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum));
+ }
+ map.put(field, new RepeatCell(val, i));
+ } else if (i == list.size() - 1) {
+ if (i > repeatCell.getCurrent()) {
+ cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum));
+ }
+ }
+ }
+ }
+ }
+ return cellList;
+ }
- @Data
- @AllArgsConstructor
- static class RepeatCell {
+ @Data
+ @AllArgsConstructor
+ static class RepeatCell {
- private Object value;
+ private Object value;
- private int current;
+ private int current;
- }
+ }
}
--
Gitblit v1.9.3