Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一些严重的问题,如代码编写繁琐且重复,极其耗费内存。EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百万的Excel
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.4</version>
</dependency>
这些注解要写在 实体类 中
ExcelProperty
的注解的属性都会参与读写,在类上配置此注解剩余属性不会参与读写。 @RequestMapping("/请求地址")
public void printEasyExcel(String inputDate) throws IOException {
//i.查询获取数据列表
List<ContractProductVo> list = contractService.findContractProductVoByShipTime(inputDate,getCompanyId());
//ii.配置下载属性
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
//下载时文件的名称
String fileName = URLEncoder.encode("出货表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
//iii.生成并下载Excel文件
EasyExcel.write(response.getOutputStream()).head(ContractProductVo.class).sheet("出货表s1").doWrite(list);
}
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data //我使用了lombok
@ContentRowHeight(24)
@HeadRowHeight(30)
@ColumnWidth(25)
public class ContractProductVo implements Serializable {
@ExcelProperty("客户名称")
private String customName; //客户名称
@ExcelProperty("合同号")
private String contractNo; //合同号,订单号
@ExcelProperty("货号")
private String productNo; //货号
@ExcelProperty("数量")
private Integer cnumber; //数量
@ExcelProperty("厂家名称")
private String factoryName; //厂家名称,冗余字段
@ExcelProperty("交货期限")
@DateTimeFormat("yyyy-MM-dd")
private Date deliveryPeriod; //交货期限
@ExcelProperty("船期")
@DateTimeFormat("yyyy-MM-dd")
private Date shipTime; //船期
@ExcelProperty("贸易条款")
private String tradeTerms; //贸易条款
}
{属性名} :针对单一对象的数据详情(传入参数为对象或者map) 属性名 = 对象的属性/map中的key {.属性名} :针对数组中循环迭代,配置数组中对象元素的属性名称
需要在模板中用这样的形式
@RequestMapping("/请求方法")
public void printEasyExcelTemplate(String inputDate) throws IOException {
//1.查询获取数据列表
List<ContractProductVo> list = contractService.findAll();
//2.配置对象数据map
Map map = new HashMap();
map.put("time",inputDate.replaceAll("-0","-").replaceAll("-","年"));
//3.配置下载属性
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
//下载时的名称
String fileName = URLEncoder.encode("出货表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
//4.获取模板路径
String path = session.getServletContext().getRealPath("/")+"自己的模板位置.xlsx";
//5.获取ExcelWrite对象
ExcelWriter writer = EasyExcel.write(response.getOutputStream())
.head(ContractProductVo.class) //指定头
.withTemplate(path) //加载模板
.build(); //构造write对象
//6.获取WriterSheet对象
WriteSheet sheet = EasyExcel.writerSheet().build();
//7.填充列表,自动的创建数据行
writer.fill(list,sheet);
//8.填充对象数据
writer.fill(map,sheet);
//9.释放资源,完成数据下载
writer.finish();
}
@RequestMapping("/解析请求")
public String importExcel(String contractId,MultipartFile file) throws Exception {
//通过EasyExcel自动解析并获取数据
List<ContractProduct> list = EasyExcel.read(file.getInputStream())
.head(ContractProduct.class) //指定实体类
.sheet(0) //指定解析的sheet
.doReadSync(); //将解析结果封装为list集合返回
//设置对象的基本属性
for (ContractProduct contractProduct : list) {
contractProduct.setId(UUID.randomUUID().toString());
contractProduct.setContractId(contractId);
}
//保存
contractProductService.saveList(list);
return "返回结果";
}
/**
* 解析实体类
*/
@ExcelIgnoreUnannotated
public class ContractProduct extends BaseEntity implements Serializable {
@ExcelProperty(value = "货号")
private String productNo; //货号
@ExcelProperty(value = "货物描述")
private String productDesc; //货描
@ExcelProperty(value = "装率")
private String loadingRate; //报运:装率 1/3
@ExcelProperty(value = "箱数")
private Integer boxNum; //报运:箱数 100
@ExcelProperty(value = "包装单位")
private String packingUnit; //包装单位:PCS/SETS 支/箱
@ExcelProperty(value = "数量")
private Integer cnumber; //数量 300
@ExcelProperty(value = "要求")
private String productRequest; //要求
@ExcelProperty(value = "单价")
private Double price; //单价
@ExcelProperty(value = "生产厂家")
private String factoryName; //厂家名称,冗余字段
//其他字段和getter,setter略
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有