用java实现easyExcel实现单sheet多子表
时间: 2024-03-21 09:39:15 浏览: 192
好的,以下是使用 Java 实现 EasyExcel 单 sheet 多子表的示例代码:
首先,我们需要创建一个主表实体类和多个子表实体类,每个子表实体类都要包含一个 List 类型的属性,用于存储该子表的数据。以下是主表实体类和两个子表实体类的示例代码:
```java
public class MainTable {
private List<SubTable1> subTable1List;
private List<SubTable2> subTable2List;
// getter 和 setter 方法
}
public class SubTable1 {
private String field1;
private String field2;
// getter 和 setter 方法
}
public class SubTable2 {
private String field3;
private String field4;
// getter 和 setter 方法
}
```
接下来,在读取 Excel 文件时,可以通过指定一个 List 类型的参数来接收读取到的数据,然后根据数据的内容,将数据分别添加到不同的子表 List 中。以下是读取 Excel 文件的示例代码:
```java
public void readExcel(File file) {
// 创建读取 Excel 文件的对象
EasyExcel.read(file, new MyReadListener())
.sheet()
.doRead();
}
public class MyReadListener extends AnalysisEventListener<Object> {
private MainTable mainTable;
private SubTable1 subTable1;
private SubTable2 subTable2;
@Override
public void invoke(Object data, AnalysisContext context) {
// 判断当前行属于哪个子表
if (data instanceof SubTable1) {
// 如果是子表1,将数据添加到子表1的 List 中
subTable1List.add((SubTable1) data);
} else if (data instanceof SubTable2) {
// 如果是子表2,将数据添加到子表2的 List 中
subTable2List.add((SubTable2) data);
} else {
// 如果是主表,创建主表实体类对象并保存
mainTable = new MainTable();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 将子表的数据设置到主表实体类中
mainTable.setSubTable1List(subTable1List);
mainTable.setSubTable2List(subTable2List);
}
}
```
最后,在写入 Excel 文件时,可以将主表和子表的数据分别写入到同一个 sheet 中,每个子表的数据占用一定的行数,可以通过设置合并单元格的方式将不同子表的数据分别显示出来。以下是写入 Excel 文件的示例代码:
```java
public void writeExcel(File file, MainTable mainTable) {
// 创建写入 Excel 文件的对象
EasyExcel.write(file).withTemplate(templateFile)
.sheet()
.registerWriteHandler(new MyWriteHandler(mainTable))
.doWrite(mainTable);
}
public class MyWriteHandler implements WriteHandler {
private MainTable mainTable;
public MyWriteHandler(MainTable mainTable) {
this.mainTable = mainTable;
}
@Override
public void sheet(int sheetNo, Sheet sheet) {
// 在写入数据之前,设置每个子表的起始行和结束行
int subTable1StartRow = 2;
int subTable1EndRow = subTable1StartRow + mainTable.getSubTable1List().size() - 1;
int subTable2StartRow = subTable1EndRow + 2;
int subTable2EndRow = subTable2StartRow + mainTable.getSubTable2List().size() - 1;
// 设置子表1的数据
for (int i = 0; i < mainTable.getSubTable1List().size(); i++) {
Row row = sheet.getRow(subTable1StartRow + i);
SubTable1 subTable1 = mainTable.getSubTable1List().get(i);
row.createCell(0).setCellValue(subTable1.getField1());
row.createCell(1).setCellValue(subTable1.getField2());
}
// 设置子表2的数据
for (int i = 0; i < mainTable.getSubTable2List().size(); i++) {
Row row = sheet.getRow(subTable2StartRow + i);
SubTable2 subTable2 = mainTable.getSubTable2List().get(i);
row.createCell(0).setCellValue(subTable2.getField3());
row.createCell(1).setCellValue(subTable2.getField4());
}
// 合并单元格,显示子表的数据
sheet.addMergedRegion(new CellRangeAddress(subTable1StartRow, subTable1EndRow, 0, 1));
sheet.addMergedRegion(new CellRangeAddress(subTable2StartRow, subTable2EndRow, 0, 1));
}
@Override
public void row(int rowNum, Row row) {
// do nothing
}
@Override
public void cell(int cellNum, Cell cell) {
// do nothing
}
}
```
以上就是使用 Java 实现 EasyExcel 单 sheet 多子表的示例代码,希望能对你有所帮助。
阅读全文