From e97a268456740816b992b1617b763d9d39db8f07 Mon Sep 17 00:00:00 2001 From: Wish Date: Sun, 15 May 2022 21:29:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A0=91=E5=BD=A2=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E7=9A=84=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../write/executor/ExcelWriteAddExecutor.java | 49 ++++++++++----- .../excel/write/metadata/WriteTreeData.java | 26 ++++++++ .../easyexcel/test/demo/write/WriteTest.java | 60 ++++++++++++++++--- 3 files changed, 113 insertions(+), 22 deletions(-) create mode 100644 easyexcel-core/src/main/java/com/alibaba/excel/write/metadata/WriteTreeData.java diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java b/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java index 46ab5b63..7b327f65 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java @@ -1,12 +1,7 @@ package com.alibaba.excel.write.executor; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; import com.alibaba.excel.context.WriteContext; import com.alibaba.excel.enums.HeadKindEnum; @@ -22,12 +17,14 @@ import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; import com.alibaba.excel.write.metadata.CollectionRowData; import com.alibaba.excel.write.metadata.MapRowData; import com.alibaba.excel.write.metadata.RowData; +import com.alibaba.excel.write.metadata.WriteTreeData; import com.alibaba.excel.write.metadata.holder.WriteHolder; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; import org.springframework.cglib.beans.BeanMap; /** @@ -50,18 +47,41 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { if (writeSheetHolder.isNew() && !writeSheetHolder.getExcelWriteHeadProperty().hasHead()) { newRowIndex += writeContext.currentWriteHolder().relativeHeadRowIndex(); } - // BeanMap is out of order, so use sortedAllFieldMap - Map sortedAllFieldMap = new TreeMap<>(); int relativeRowIndex = 0; for (Object oneRowData : data) { - int lastRowIndex = relativeRowIndex + newRowIndex; + relativeRowIndex = loopDataByLevel(oneRowData, relativeRowIndex, newRowIndex); + } + } + + private int loopDataByLevel(Object oneRowData, int relativeRowIndex, int newRowIndex) { + // BeanMap is out of order, so use sortedAllFieldMap + Map sortedAllFieldMap = new TreeMap<>(); + int lastRowIndex = relativeRowIndex + newRowIndex; + if (oneRowData instanceof WriteTreeData) { + addOneRowOfDataToExcel(((WriteTreeData) oneRowData).getParentData(), lastRowIndex, relativeRowIndex, sortedAllFieldMap); + relativeRowIndex++; + List childList = ((WriteTreeData) oneRowData).getChildDataList(); + if (CollectionUtils.isNotEmpty(childList)) { + int fromRow = relativeRowIndex; + for (Object childData : childList) { + relativeRowIndex = loopDataByLevel(childData, relativeRowIndex, newRowIndex); + } + setGroup(fromRow, relativeRowIndex); + } + } else { addOneRowOfDataToExcel(oneRowData, lastRowIndex, relativeRowIndex, sortedAllFieldMap); relativeRowIndex++; } + return relativeRowIndex; + } + + private void setGroup(int fromRow, int toRow) { + Sheet sheet = writeContext.writeSheetHolder().getSheet(); + sheet.groupRow(fromRow + 1, toRow); } private void addOneRowOfDataToExcel(Object oneRowData, int rowIndex, int relativeRowIndex, - Map sortedAllFieldMap) { + Map sortedAllFieldMap) { if (oneRowData == null) { return; } @@ -75,9 +95,9 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { WriteHandlerUtils.afterRowCreate(rowWriteHandlerContext); if (oneRowData instanceof Collection) { - addBasicTypeToExcel(new CollectionRowData((Collection)oneRowData), row, rowIndex, relativeRowIndex); + addBasicTypeToExcel(new CollectionRowData((Collection) oneRowData), row, rowIndex, relativeRowIndex); } else if (oneRowData instanceof Map) { - addBasicTypeToExcel(new MapRowData((Map)oneRowData), row, rowIndex, relativeRowIndex); + addBasicTypeToExcel(new MapRowData((Map) oneRowData), row, rowIndex, relativeRowIndex); } else { addJavaObjectToExcel(oneRowData, row, rowIndex, relativeRowIndex, sortedAllFieldMap); } @@ -116,7 +136,7 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { } private void doAddBasicTypeToExcel(RowData oneRowData, Head head, Row row, int rowIndex, int relativeRowIndex, - int dataIndex, int columnIndex) { + int dataIndex, int columnIndex) { ExcelContentProperty excelContentProperty = ClassUtils.declaredExcelContentProperty(null, writeContext.currentWriteHolder().excelWriteHeadProperty().getHeadClazz(), head == null ? null : head.getFieldName()); @@ -139,7 +159,7 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { } private void addJavaObjectToExcel(Object oneRowData, Row row, int rowIndex, int relativeRowIndex, - Map sortedAllFieldMap) { + Map sortedAllFieldMap) { WriteHolder currentWriteHolder = writeContext.currentWriteHolder(); BeanMap beanMap = BeanMapUtils.create(oneRowData); // Bean the contains of the Map Key method with poor performance,So to create a keySet here @@ -156,7 +176,6 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { if (!beanKeySet.contains(name)) { continue; } - ExcelContentProperty excelContentProperty = ClassUtils.declaredExcelContentProperty(beanMap, currentWriteHolder.excelWriteHeadProperty().getHeadClazz(), name); CellWriteHandlerContext cellWriteHandlerContext = WriteHandlerUtils.createCellWriteHandlerContext( diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/write/metadata/WriteTreeData.java b/easyexcel-core/src/main/java/com/alibaba/excel/write/metadata/WriteTreeData.java new file mode 100644 index 00000000..a7f1b280 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/write/metadata/WriteTreeData.java @@ -0,0 +1,26 @@ +package com.alibaba.excel.write.metadata; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 用来显示树形结构 + * childDataList 类型支持 WriteTreeData进行嵌套 + * @author Wish + * @version 1.0 2022/5/14 + */ +@Getter +@Setter +@EqualsAndHashCode +public class WriteTreeData { + T parentData; + List childDataList; + + public WriteTreeData(T parentData, List childDataList) { + this.parentData = parentData; + this.childDataList = childDataList; + } +} diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java index f7d015ca..4dd8f353 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java @@ -3,11 +3,7 @@ package com.alibaba.easyexcel.test.demo.write; import java.io.File; import java.io.InputStream; import java.net.URL; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; @@ -35,6 +31,7 @@ import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; import com.alibaba.excel.write.merge.LoopMergeStrategy; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.WriteTable; +import com.alibaba.excel.write.metadata.WriteTreeData; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; @@ -528,7 +525,7 @@ public class WriteTest { // 背景设置为红色 headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex()); WriteFont headWriteFont = new WriteFont(); - headWriteFont.setFontHeightInPoints((short)20); + headWriteFont.setFontHeightInPoints((short) 20); headWriteCellStyle.setWriteFont(headWriteFont); // 内容的策略 WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); @@ -538,7 +535,7 @@ public class WriteTest { contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); WriteFont contentWriteFont = new WriteFont(); // 字体大小 - contentWriteFont.setFontHeightInPoints((short)20); + contentWriteFont.setFontHeightInPoints((short) 20); contentWriteCellStyle.setWriteFont(contentWriteFont); // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 HorizontalCellStyleStrategy horizontalCellStyleStrategy = @@ -794,6 +791,16 @@ public class WriteTest { EasyExcel.write(fileName).head(head()).sheet("模板").doWrite(dataList()); } + /** + * 支持树形结构的写 + */ + @Test + public void treeWrite() { + String fileName = TestFileUtil.getPath() + "treeWrite" + System.currentTimeMillis() + ".xlsx"; + // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 + EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(treeData()); + } + private List dataLong() { List list = ListUtils.newArrayList(); for (int i = 0; i < 10; i++) { @@ -858,4 +865,43 @@ public class WriteTest { return list; } + private List treeData() { + List list = ListUtils.newArrayList(); + for (int i = 0; i < 10; i++) { + DemoData school = new DemoData(); + school.setString("XX学校" + i); + school.setDate(new Date()); + school.setDoubleData(0.56); + + DemoData grade1 = new DemoData(); + grade1.setString("1年级" + i); + grade1.setDate(new Date()); + grade1.setDoubleData(1.0); + DemoData grade2 = new DemoData(); + grade2.setString("2年级" + i); + grade2.setDate(new Date()); + grade2.setDoubleData(2.0); + List gradeWithClass = ListUtils.newArrayList(); + + List classList = ListUtils.newArrayList(); + DemoData class1 = new DemoData(); + class1.setString("1班级" + i); + class1.setDate(new Date()); + class1.setDoubleData(1.0); + DemoData class2 = new DemoData(); + class2.setString("2班级" + i); + class2.setDate(new Date()); + class2.setDoubleData(1.0); + + classList.add(class1); + classList.add(class2); + + gradeWithClass.add(new WriteTreeData(grade1, classList)); + gradeWithClass.add(new WriteTreeData(grade2, classList)); + + WriteTreeData parentData = new WriteTreeData(school, gradeWithClass); + list.add(parentData); + } + return list; + } }