下载(创建)
导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.2-beat1</version>
</dependency>
创建一个实体类
- 在EasyExcel中,通过java代码生成或者解析Excel文件很简单。不需要创建繁琐的表头* @ExcelProperty : 在创建Excel的时候,自动的读取实体类中的注解配置,生成表头
@ContentRowHeight(20) //数据行高数
@HeadRowHeight(20) //表头高度
@ColumnWidth(15) //列宽
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; //贸易条款
//省略get,set
}
通过EasyExcel创建Excel并下载(没有使用模板的版本)
例:
/**
* 使用EasyExcel完成excel的生成和下载
* 1、数据查询
* 2、设置下载信息
* 3、调用EasyExcel的工具类完成生成下载
*/
@RequestMapping("/printEasyExcel")
public void printEasyExcel(String inputDate) throws IOException {
//1、数据查询
List<ContractProductVo> list = contractService.findByShipTime(inputDate+"%");
//2、设置下载信息
response.setContentType("application/vnd.ms-excel"); //下载excel
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("出货表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
//3、调用EasyExcel的工具类完成生成下载
EasyExcel.write(response.getOutputStream())
.head(ContractProductVo.class) //设置表头
.sheet("heima127") //指定页名称
.doWrite(list); //设置数据
}
对于复杂样式的Excel文件创建,EasyExcel支持模板打印。已一个Excel文件作为模板,自动的进行数据的拓展和填充。
- 定义模板 ( 配置好了所有的样式 )
- 配置实体类(表头)
- java代码填充模板并下载Excel
定义模板
- 在easyExcel中,支持两个模板语言
- 语法:{map中的key}
- 传入一个map集合:往往是用于处理非list集合的数据
- 语法:{.对象中的属性名}
- 传入一个list集合,会自动的循环list集合构造数据列表
java代码填充模板并下载Excel
/**
* 模板打印
*
*/
@RequestMapping("/printTemplate")
public void printTemplate(String inputDate) throws IOException {
//1.准备数据
List<ContractProductVo> list = contractService.findByShipTime(inputDate+"%");
Map map = new HashMap<>();
inputDate = inputDate.replaceAll("-0","-").replaceAll("-","年");
map.put("time",inputDate);
map.put("title1","客户名称");
//2.设置下载信息
response.setContentType("application/vnd.ms-excel"); //下载excel
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("出货表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
//3.加载excel模板
String path = session.getServletContext().getRealPath("/")+"/make/tOUTPRODUCT.xlsx";
//4.创建EasyExcel的excelWtire对象( 用于数据填充)
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
.head(ContractProductVo.class) //设置表头
.withTemplate(path) //加载模板
.build();
//获取sheet对象
WriteSheet sheet = EasyExcel.writerSheet().build();
//5.调用方法完成填充map数据
excelWriter.fill(map,sheet);
//6.调用方法完成填充list数据
excelWriter.fill(list,sheet);
//7.属性资源,完成下载
excelWriter.finish(); //下载excel文件,释放内存资源
}
上传(解析)
创建一个实体类
合同下货物的实体类
通过EasyExcel完成文件解析,在实体类上通过注解配置表头
如果实体类中的属性,未配置@ExcelProperty
默认按照属性的编写顺序,从excel中获取数据
默认情况下,为配置注解的属性会影响数据封装
在类上配置一个注解:忽略未配置注解的属性
@ExcelIgnoreUnannotated
public class ContractProduct extends BaseEntity implements Serializable {
private String id;
@ExcelProperty("货号")
private String productNo; //货号
private String productImage; //图片路径
@ExcelProperty("货物描述")
private String productDesc; //货描
@ExcelProperty("装率")
private String loadingRate; //报运:装率 1/3
@ExcelProperty("箱数")
private Integer boxNum; //报运:箱数 100
@ExcelProperty("包装单位")
private String packingUnit; //包装单位:PCS/SETS 支/箱
@ExcelProperty("数量")
private Integer cnumber; //数量 300
private Integer outNumber; //报运:出货数量 200
private Integer finished; //报运:是否完成 no
@ExcelProperty("要求")
private String productRequest; //要求
@ExcelProperty("单价")
private Double price; //单价
private Double amount; //总金额,冗余
private Integer orderNo; //排序号
private String contractId; //合同号
@ExcelProperty("生产厂家")
private String factoryName; //厂家名称,冗余字段
private String factoryId;
private List<ExtCproduct> extCproducts ; //货物和附件,一对多
//省略,get,set方法
通过EasyExcel解析文件
通过EasyExcel完成文件上传解析,批量货物保存
* 参数:购销合同id
* 参数:上传的excel文件对象
@RequestMapping("/import")
public String importExcel(String contractId,MultipartFile file) throws Exception {
List<ContractProduct> list = EasyExcel.read(file.getInputStream())
.head(ContractProduct.class) //设置表头,将数据转化为目标对象
.sheet(0) //读取第一页数据
.doReadSync(); //解析excel,获取所有的数据
for (ContractProduct contractProduct : list) {
System.out.println(contractProduct);
contractProduct.setContractId(contractId);
contractProduct.setCompanyId(getLoginCompanyId());
contractProduct.setCompanyName(getLoginCompanyName());
}
contractProductService.saveAll(list);
return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
}