From 7accca933fac460a764df65589a39ea2ee240cea Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期三, 21 六月 2023 16:45:28 +0800
Subject: [PATCH] update 优化 powerjob-server docker编排
---
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java | 167 +++++++++++++++++++++++++++++--------------------------
1 files changed, 87 insertions(+), 80 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 a409372..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
@@ -1,19 +1,20 @@
package org.dromara.common.excel.core;
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
-import org.dromara.common.excel.annotation.CellMerge;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
+import org.dromara.common.core.utils.reflect.ReflectUtils;
+import org.dromara.common.excel.annotation.CellMerge;
import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -24,91 +25,97 @@
*
* @author Lion Li
*/
-@AllArgsConstructor
@Slf4j
public class CellMergeStrategy extends AbstractMergeStrategy {
- private List<?> list;
- private boolean hasTitle;
+ private final List<CellRangeAddress> cellList;
+ private final boolean hasTitle;
+ private int rowIndex;
- @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 (CollectionUtils.isNotEmpty(cellList)) {
- // the judge is necessary
- if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {
- for (CellRangeAddress item : cellList) {
- sheet.addMergedRegion(item);
- }
- }
- }
- }
+ public CellMergeStrategy(List<?> list, boolean hasTitle) {
+ this.hasTitle = hasTitle;
+ // 琛屽悎骞跺紑濮嬩笅鏍�
+ this.rowIndex = hasTitle ? 1 : 0;
+ this.cellList = handle(list, hasTitle);
+ }
- @SneakyThrows
- private static List<CellRangeAddress> handle(List<?> list, boolean hasTitle) {
- List<CellRangeAddress> cellList = new ArrayList<>();
- if (CollectionUtils.isEmpty(list)) {
- return cellList;
- }
- Class<?> clazz = list.get(0).getClass();
- Field[] fields = clazz.getDeclaredFields();
- // 鏈夋敞瑙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());
- }
- }
- // 琛屽悎骞跺紑濮嬩笅鏍�
- int rowIndex = hasTitle ? 1 : 0;
- 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);
- String name = field.getName();
- String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
- Method readMethod = clazz.getMethod(methodName);
- Object val = readMethod.invoke(list.get(i));
+ @Override
+ 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);
+ }
+ }
+ }
+ }
- 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;
- }
+ @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()));
- @Data
- @AllArgsConstructor
- static class RepeatCell {
+ // 鏈夋敞瑙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);
+ }
+ }
+ }
- private Object value;
+ 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());
- private int current;
+ 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 {
+
+ private Object value;
+
+ private int current;
+
+ }
}
--
Gitblit v1.9.3