记录下easyexcel导出复杂excel表格(填充excel模板)
要求生成的excel如下:
这里我第一想到的就是用阿里的easyexcel来做:链接如下填充excel
要求生成的excel如下:
1)引入pom依赖:需要3.0.x以上的版本
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency>
2)定义excel模板,如下;为了测试方便,下面的两个表格里的模板字段就放一样的,后面好赋值
3)编写代码:
点击查看列表实体代码
package com.px.model;
import lombok.Data;
/**
* @author pengxin
* @Description
* @date 2023-04-23 14:05
*/
@Data
public class Data2DTO {
private String no;
private String billDate;
private String billNo;
private String billCompany;
private String notReciviedAmount;
private String goodSn;
private String goodName;
private String goodUnit;
private String paymentDays;
private String qty;
private String expectedPaymentTime;
}
点击查看生成excel代码
package com.px.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.px.model.Data2DTO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author pengxin
* @Description
* @date 2023-04-23 14:05
*/
@RestController
@RequestMapping("/easyExcel")
public class EasyExcelTestController {
@GetMapping("/export")
public void export(HttpServletResponse response) throws IOException {
String templateFileName = "D:\\Downloads\\对账单模板2023-04-23.xlsx";
String fileName = "D:\\Downloads\\" + "对账单" + System.currentTimeMillis() + ".xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 表单一
Map<String, Object> data1Map = new HashMap<String, Object>();
data1Map.put("customName", "aaa");
data1Map.put("deadline", "bbb");
data1Map.put("salesman", "ccc");
data1Map.put("invoiceReceived", "ddd");
data1Map.put("deliveryNotInvoiceReceived", "eee");
data1Map.put("received", "fff");
data1Map.put("bankName", "ggg");
data1Map.put("demo01", "1000万");
data1Map.put("demo02", "2");
data1Map.put("demo03", "2000万");
excelWriter.fill(data1Map, writeSheet);
// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 表单二
excelWriter.fill(new FillWrapper("data2", data2()), fillConfig, writeSheet);
// 表单三
excelWriter.fill(new FillWrapper("data3", data2()), fillConfig, writeSheet);
}
}
private List<Data2DTO> data2() {
List<Data2DTO> data2DTOS = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
final Data2DTO data2DTO = new Data2DTO();
data2DTO.setBillCompany("aaa");
data2DTO.setBillDate("bbb" + i);
data2DTO.setBillNo("ccc");
data2DTO.setGoodName("ddd");
data2DTO.setExpectedPaymentTime("eee");
data2DTO.setGoodSn("fff");
data2DTO.setGoodUnit("ggg");
data2DTO.setNo("hhh" + i);
data2DTO.setPaymentDays("iii");
data2DTO.setQty("jjjj");
data2DTOS.add(data2DTO);
}
return data2DTOS;
}
}
Merged region E25 must contain 2 or more cells
后面我把excel一部分一部分复制过来,然后运行又没有报错,所以后续遇到类似的情况可以分块复制成一个新的excel模板,用于数据的填充。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇