大家好,欢迎来到IT知识分享网。
要求生成的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;
}
}
4)注意事项:最终想要的文件就按要求生成了,但是我用公司给的模板去跑程序时,发现excel会报一个错误,错误提示如下:
Merged region E25 must contain 2 or more cells
后面我把excel一部分一部分复制过来,然后运行又没有报错,所以后续遇到类似的情况可以分块复制成一个新的excel模板,用于数据的填充。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/28297.html