Browse Source

支持树形结构的导出

pull/2479/head
Wish 3 years ago
parent
commit
e97a268456
  1. 37
      easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java
  2. 26
      easyexcel-core/src/main/java/com/alibaba/excel/write/metadata/WriteTreeData.java
  3. 56
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

37
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,14 +47,37 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor {
if (writeSheetHolder.isNew() && !writeSheetHolder.getExcelWriteHeadProperty().hasHead()) {
newRowIndex += writeContext.currentWriteHolder().relativeHeadRowIndex();
}
// BeanMap is out of order, so use sortedAllFieldMap
Map<Integer, Field> sortedAllFieldMap = new TreeMap<>();
int relativeRowIndex = 0;
for (Object oneRowData : data) {
relativeRowIndex = loopDataByLevel(oneRowData, relativeRowIndex, newRowIndex);
}
}
private int loopDataByLevel(Object oneRowData, int relativeRowIndex, int newRowIndex) {
// BeanMap is out of order, so use sortedAllFieldMap
Map<Integer, Field> 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,
@ -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(

26
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, E> {
T parentData;
List<E> childDataList;
public WriteTreeData(T parentData, List<E> childDataList) {
this.parentData = parentData;
this.childDataList = childDataList;
}
}

56
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;
@ -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<LongestMatchColumnWidthData> dataLong() {
List<LongestMatchColumnWidthData> list = ListUtils.newArrayList();
for (int i = 0; i < 10; i++) {
@ -858,4 +865,43 @@ public class WriteTest {
return list;
}
private List<WriteTreeData> treeData() {
List<WriteTreeData> 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<WriteTreeData> gradeWithClass = ListUtils.newArrayList();
List<DemoData> 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;
}
}

Loading…
Cancel
Save