共计 7153 个字符,预计需要花费 18 分钟才能阅读完成。
性能背景
简略的说下这个性能的背景需要吧,有相似需要的能够复用,果然导入还没写完,导出的性能接踵而来,一块写了吧
- 实现 excel 导出(仍旧废话 …)
- 多个 sheet 页一起导出
- 第一个 sheet 页数据表头信息有两行
- 款式略微好看,列宽能够自定义等
- 数据量略微有些大(多个 sheet 页总量 50w 左右)
我的项目引入依赖
如果是从上一篇看过去的,就不必看我的项目引入了🙈
gradle:
compile "com.alibaba:easyexcel:3.1.0"
maven:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
留神:3+ 版本的的 easyexcel,应用 poi 5+ 版本时,须要手动排除:poi-ooxml-schemas,例如:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
</exclusions>
</dependency>
我的项目编码
如多个表格款式雷同,可编写一个父类,将款式定义在父类上,子类继承父类即可。
- 在
config.bean.excel
包下定义经销商信息对象ExportCompany.java
,代码如下👇
package com.maple.demo.config.bean.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author 笑小枫
* @date 2022/7/22
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExportCompany {
// -------------------- 根本信息 start -------------
@ExcelProperty({"根本信息", "公司名称"})
private String companyName;
@ExcelProperty({"根本信息", "省份"})
private String province;
@ExcelProperty({"根本信息", "成立工夫"})
private Date startDate;
@ExcelProperty({"根本信息", "企业状态"})
private String entStatus;
@ColumnWidth(30)
@ExcelProperty({"根本信息", "博客地址"})
private String csdnAddress;
// ---------------- 根本信息 end ---------------------
// ---------------- 经营信息 start ---------------------
@ExcelProperty({"经营信息", "员工数"})
private String employeeMaxCount;
@ExcelProperty({"经营信息", "网站地址"})
private String netAddress;
@ExcelProperty({"经营信息", "所属区域省"})
private String businessProvinceName;
@ExcelProperty({"经营信息", "所属区域市"})
private String businessCityName;
@ExcelProperty({"经营信息", "所属区域区县"})
private String businessAreaName;
// ---------------- 经营信息 end ---------------------
}
- 在
config.bean.excel
包下定义联系人信息对象ExportContact.java
,代码如下👇
package com.maple.demo.config.bean.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 笑小枫
* @date 2022/7/22
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExportContact {@ExcelProperty("公司名称")
private String companyName;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("身份证号码")
private String idCard;
@ExcelProperty("电话号码")
private String mobile;
@ExcelProperty("职位")
private String contactPostName;
}
- 在
controller
包下编写TestExportExcelController.java
进行测试,代码如下:
package com.maple.demo.controller;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.maple.demo.config.bean.excel.ExportCompany;
import com.maple.demo.config.bean.excel.ExportContact;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
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.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author 笑小枫
* @date 2022/7/22
*/
@Slf4j
@RestController
@RequestMapping("/example")
@Api(tags = "实例演示 - 导出 Excel")
public class TestExportExcelController {@GetMapping("/exportExcel")
public void exportExcel(HttpServletResponse response) {try (OutputStream out = response.getOutputStream()) {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("笑小枫测试导出", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
handleExcel(out);
out.flush();} catch (Exception e) {log.error(e.getMessage());
}
}
private void handleExcel(OutputStream out) {try (ExcelWriter excelWriter = EasyExcelFactory.write(out).build()) {WriteSheet dealerSheet = EasyExcelFactory.writerSheet(0, "经销商信息").head(ExportCompany.class).build();
WriteSheet contactSheet = EasyExcelFactory.writerSheet(1, "联系人").head(ExportContact.class).build();
excelWriter.write(getCompany(), dealerSheet);
excelWriter.write(getContact(), contactSheet);
}
}
private List<ExportCompany> getCompany() {List<ExportCompany> companyList = new ArrayList<>();
for (int i = 0; i < 5; i++) {companyList.add(ExportCompany.builder()
.companyName("笑小枫公司" + i)
.province("上海市")
.businessProvinceName("山东省")
.businessCityName("临沂市")
.businessAreaName("河东区")
.entStatus("营业")
.netAddress("www.xiaoxiaofeng.site")
.csdnAddress("https://zhangfz.blog.csdn.net")
.employeeMaxCount("100")
.startDate(new Date())
.build());
}
return companyList;
}
private List<ExportContact> getContact() {List<ExportContact> contactList = new ArrayList<>();
for (int i = 0; i < 5; i++) {contactList.add(ExportContact.builder()
.companyName("笑小枫公司" + i)
.name("笑小枫" + i)
.mobile("183000000000")
.idCard("371324199011111111")
.contactPostName("后端")
.build());
}
return contactList;
}
}
测试后果
浏览器申请:http://localhost:8080/example/exportExcel
经销商 sheet 页信息:
联系人 sheet 页信息:
相干属性解读
注解
ExcelProperty
index 指定写到第几列,默认依据成员变量排序。value
指定写入的名称,默认成员变量的名字,多个value
能够参照疾速开始中的简单头ExcelIgnore
默认所有字段都会写入 excel,这个注解会疏忽这个字段DateTimeFormat
日期转换,将Date
写到 excel 会调用这个注解。外面的value
参照java.text.SimpleDateFormat
NumberFormat
数字转换,用Number
写 excel 会调用这个注解。外面的value
参照java.text.DecimalFormat
ExcelIgnoreUnannotated
默认不加ExcelProperty
的注解的都会参加读写,加了不会参加
参数
通用参数
WriteWorkbook
,WriteSheet
,WriteTable
都会有的参数,如果为空,默认应用下级。
converter
转换器,默认加载了很多转换器。也能够自定义。writeHandler
写的处理器。能够实现WorkbookWriteHandler
,SheetWriteHandler
,RowWriteHandler
,CellWriteHandler
,在写入 excel 的不同阶段会调用relativeHeadRowIndex
间隔多少行后开始。也就是结尾空几行needHead
是否导出头head
与clazz
二选一。写入文件的头列表,倡议应用 class。clazz
与head
二选一。写入文件的头对应的 class,也能够应用注解。autoTrim
字符串、表头等数据主动 trim
WriteWorkbook(了解成 excel 对象)参数
excelType
以后 excel 的类型 默认xlsx
outputStream
与file
二选一。写入文件的流file
与outputStream
二选一。写入的文件templateInputStream
模板的文件流templateFile
模板文件autoCloseStream
主动敞开流。password
写的时候是否须要应用明码useDefaultStyle
写的时候是否是应用默认头
WriteSheet(就是 excel 的一个 Sheet)参数
sheetNo
须要写入的编码。默认 0sheetName
须要些的 Sheet 名称,默认同sheetNo
WriteTable(就把 excel 的一个 Sheet, 一块区域看一个 table)参数
tableNo
须要写入的编码。默认 0
写在最初
本文只是用到局部性能,简略的做了一下总结,更多的性能,能够去官网查阅。
官网文档:https://www.yuque.com/easyexcel/doc/read
应用 EasyExcel 导入 excel:https://www.xiaoxiaofeng.com/archives/springboot12
对于笑小枫💕
本章到这里完结了,喜爱的敌人关注一下我呦😘😘
微信公众号:笑小枫
本文源码:https://github.com/hack-feng/maple-demo
正文完