一 easyExcel的导入导出
1.导入jar包
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beat1</version> </dependency>1.导入与导出 这里分两种 一种是有模板的,一种是无Java模板的,先说有Java模板的 有Java模板的就是先定义一个实体类,继承BaseRowMode,再加上@ExcelProperty注解
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TaskDetail extends BaseRowModel implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 用户id
*/
private String userId;
/**
* 商品名称
*/
@ExcelProperty(value = {"商品名称"},index = 2)
private String wareName;
/**
* 收货人手机号
*/
@ExcelProperty(value = {"收货人手机号"},index = 3)
private String mobile;
/**
* 收货人姓名
*/
@ExcelProperty(value = {"收货人姓名"},index = 4)
private String name;
/**
* 省
*/
@ExcelProperty(value = {"省份"},index = 5)
private String province;
/**
* 市
*/
@ExcelProperty(value = {"城市"},index = 6)
private String city;
/**
* 区县
*/
@ExcelProperty(value = {"区县"},index = 7)
private String county;
/**
* 详细地址
*/
@ExcelProperty(value = {"详细地址"},index = 8)
private String address;
/**
* 运单号
*/
@ExcelProperty(value = {"运单号"},index = 1)
private String waybill;
}
其中value对应的就是excel表头标题 ,index就是第几列, 这里有两点需要注意 这个bean必须继承 BaseRowModel,另一个是我这里这个类直接就是对应数据库表的实体类,在使用lombok省去get、set方法的@Data注解时,再继承BaseRowModel,导致了使用jdbc模板插入数据时出现异常,所以如果要用同一个bean类,最好自己写插入的sql。
导入的话 配合上一篇说的MultipartFile 以表单形式提交 获取文件
@RequestMapping("/multipleUploadReceipt")
public @ResponseBody CallbackResult<?> multipleUploadReceipt(@RequestParam("multipartFile") MultipartFile multipartFile, @RequestParam("detailId") int detailId){
return taskDetailService.multipleUploadReceipt(multipartFile, detailId);
}
这个multipartFile能获取到文件的流
List<Object> dataList = dataList = EasyExcelFactory.read(multipartFile.getInputStream(), new Sheet(1, 2, TaskDetail.class));
sheet的参数 1表示excel中第一个sheet表,2表示第几行, TaskDetail就是定义的java模型。
如果不定义java模型 如下:
List<Object> data = EasyExcelFactory.read(inputStream, new Sheet(1, 0));
这里他的示例中有提到一个 建议 就是 小于1000行数据读取使用read,大于1000 最好使用 readBySax方法。
导出也是一样,因为业务需求导出需要按照用户的搜索条件获取数据,而且需要下载到客户端本地,这个时候没法用ajax异步请求,他做不到下载文件,尝试了很多方法,貌似是无法做到的,
以前发送下载请求是这样的
var url = Global.contextPath + "/industry/exportData?date="+date+"&cid3="+cid3;
openNewWin({
url : url,
target : "_self"
});
但是我这里由于参数太多,用get方法比较麻烦,就用form表单提交请求了,js中使用 $("#form-condition").submit();
Controller:
1 @RequestMapping("/exportOrderBatch")
2 public void exportOrderBatch(ListTaskDetialDTO listTaskDetialDTO, HttpServletResponse response){3 service.exportOrderBatch(listTaskDetialDTO, response);
4 }
其中listTaskDetialDTO就是表单提交上来的查询参数,会自动实例化,
Service:
1 public void exportOrderBatch(ListTaskDetialDTO listTaskDetialDTO, HttpServletResponse response) {
2
3 int pageSize = 1000;
4 listTaskDetialDTO.getPage().setSize(pageSize);
5 //查询导出数据
6 IPage<TaskDetail> detailPage = listTaskDetail(listTaskDetialDTO);
7 List<TaskDetail> records = detailPage.getRecords();
8 int pages = ((Long)detailPage.getPages()).intValue();
9 Integer exportType = listTaskDetialDTO.getPlatform();
10
11 String name = "";
12 if(exportType == 1){
13 name = "淘宝-" ;
14 }else if(exportType == 3){
15 name = "京东-";
16 }else{
17 name = "拼多多-";
18 }
19 name += System.currentTimeMillis() + ".xlsx";
20
21 try (OutputStream out = response.getOutputStream()){
22 response.setContentType("application/octet-stream;charset=utf-8");
23 response.setContentType("application/vnd.ms-excel");
24 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(name,"utf-8") + ".xlsx");
25 response.setHeader("Pragma", "public");
26
27 ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
28
29 // 设置SHEET
30 Sheet sheet;
31 if(exportType == 1){
32 sheet = new Sheet(1, 0, ExportExcelJd.class);
33 }else if(exportType == 2){
34 sheet = new Sheet(1, 0, ExportExcelTaobao.class);
35 }else{
36 sheet = new Sheet(1, 0, ExportExcelPin.class);
37 }
38 sheet.setSheetName("sheet1");
39 sheet.setAutoWidth(true);
40 List<ExportExcelJd> excelData = getExcelData(records);
41 writer.write(excelData, sheet);//导出
42
43 for (int i = 2; i < pages; i++) {
44 listTaskDetialDTO.getPage().setCurrent(i);
45 records = listTaskDetail(listTaskDetialDTO, mobile).getRecords();
46 excelData = getExcelData(records);
47 writer.write(excelData, sheet);
48 }
49 writer.finish();
50 out.flush();
51 } catch (IOException e) {
52 e.printStackTrace();
53 }
54 }
这里值得说的是31行,设置表头,因为同样的数据要导出3种不同的格式的excle表格,下面write方法用的实体类 是哪一个 都无所谓,关键是new Sheet的时候的参数,决定了导出excel采用哪种表头格式。
而无模型的 需要多做一件事情,设置表头
1 Table table = new Table(1);
2 List<List<String>> titles = new ArrayList<>();
3 titles.add(Arrays.asList("用户ID"));
4 titles.add(Arrays.asList("名称"));
5 titles.add(Arrays.asList("年龄"));
6 titles.add(Arrays.asList("生日"));
7 table.setHead(titles);
导出时数据集合不能用List<ExportExcelJd> 而是List<List<String>> userList
里面的List<String>代表一行数据,把你的数据按照顺序放到集合中
userList.add(Arrays.asList("ID_" + i, "小明" + i, String.valueOf(i), new Date().toString()));
最后导出
writer.write0(userList, sheet, table); writer.finish();
他也可以用循环方式分批 操作
这里再说宽度设置
//设置列宽 设置每列的宽度 Map columnWidth = new HashMap(); columnWidth.put(0,10000); columnWidth.put(1,40000); sheet.setColumnWidthMap(columnWidth);
有模型导出时可以通过注解 进行合拼单元格表头的,记住是表头

java模型写法如下:
1 public class MultiLineHeadExcelModel extends BaseRowModel {
2
3 @ExcelProperty(value = {"表头1","表头1","表头31"},index = 0)
4 private String p1;
5
6 @ExcelProperty(value = {"表头1","表头1","表头32"},index = 1)
7 private String p2;
8
9 @ExcelProperty(value = {"表头3","表头3","表头3"},index = 2)
10 private int p3;
11
12 @ExcelProperty(value = {"表头4","表头4","表头4"},index = 3)
13 private long p4;
14
15 @ExcelProperty(value = {"表头5","表头51","表头52"},index = 4)
16 private String p5;
17
18 @ExcelProperty(value = {"表头6","表头61","表头611"},index = 5)
19 private String p6;
20
21 @ExcelProperty(value = {"表头6","表头61","表头612"},index = 6)
22 private String p7;
23
24 @ExcelProperty(value = {"表头6","表头62","表头621"},index = 7)
25 private String p8;
26
27 @ExcelProperty(value = {"表头6","表头62","表头622"},index = 8)
28 private String p9;
29 }
easyExcel就上面这些了
二、easyPoi
easyPoi和easyExcel比最大的好处就是,他有完善的Api, easyExcel没有。
easyPoi的api地址 http://easypoi.mydoc.io/ ,在使用上里面说的其实很清楚,这里就不说了,
easyPoi其实在功能多样性上更完善些,使用上更灵活些,但是在导出的性能比较上就差easyExcel很多,数据超过1万条在内存的消耗上就会出现差距, easyExcel是很省内存的,如果导出量很大的话 还是建议使用easyExcel