性能背景
简略的说下这个性能的背景需要吧,有相似需要的能够复用,果然导入还没写完,导出的性能接踵而来,一块写了吧
- 实现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