EasyExcel的使用
导入依赖
x <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.4</version></dependency>
EasyExce的导出
1 实体类上添加注解创建关联关系(属性和Excel单元格中的字段建立关系)* @ExcelProperty : 配置属性和生成Excel中列的关系(并设置表头为自定义的内容)
- @ContentRowHeight(20) : 配置数据行的行高
- @HeadRowHeight(20): 配置表头行的行高
- @ColumnWidth(15) :配置列宽
- @ExcelIgnoreUnannotated: 默认不加
ExcelProperty
的注解的属性都会参与读写,在类上配置此注解剩余属性不会参与读写。
@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; //贸易条款
2.文件下载的代码实现(不使用模板)
@RequestMapping("/printEasyExcel")
public void printEasyExcel(String inputDate) throws IOException {
//i.查询获取数据列表
List<ContractProductVo> list = contractService.findContractProductVoByShipTime(inputDate,getCompanyId());
//ii.配置下载属性
response.setContentType("application/vnd.ms-excel");//在tomcat中复制来的(web.xml)
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("出货表").doWrite(list);
}
3.1模板填充
EasyExcel支持两种模板占位符的写法
{属性名} :针对单一对象的数据详情(传入参数为对象或者map)
属性名 = 对象的属性/map中的key
{.属性名} :针对数组中循环迭代,配置数组中对象元素的属性名称
3.2数据填充(控制器代码实现利用模板)
@RequestMapping("/printEasyExcelTemplate")
public void printEasyExcelTemplate(String inputDate) throws IOException {
//1.查询获取数据列表
List<ContractProductVo> list = contractService.findContractProductVoByShipTime(inputDate,getCompanyId());
//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("/")+"make/xlsprint/product.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();
}
EasyExce 导入(解析)
1.配置实体类
/**
* 合同下货物的实体类
*/
@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略
}
2.控制器代码实现
@RequestMapping("/import")
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 "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
}