功能背景

简单的说下这个功能的背景需求吧,有类似需求的可以复用,果然导入还没写完,导出的功能接踵而来,一块写了吧

  • 实现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>
</dependency>

项目编码

如多个表格样式相同,可编写一个父类,将样式定义在父类上,子类继承父类即可。

  • 定义经销商信息对象,代码如下:
package org.cango.dealer.manage.model.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 xiaoxiaofeng* @date 2022/6/6*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExcelCompany {// -------------------- 基本信息 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 ---------------------
}
  • 定义联系人信息对象,代码如下:
package org.cango.dealer.manage.model.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 xiaoxiaofeng* @date 2022/6/6*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExcelContact {@ExcelProperty("公司名称")private String companyName;@ExcelProperty("姓名")private String name;@ExcelProperty("身份证号码")private String idCard;@ExcelProperty("电话号码")private String mobile;@ExcelProperty("职位")private String contactPostName;
}
  • 编写controller进行测试,代码如下:
package org.cango.dealer.manage.controller;import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import lombok.extern.slf4j.Slf4j;
import org.cango.dealer.manage.model.excel.ExcelCompany;
import org.cango.dealer.manage.model.excel.ExcelContact;
import org.springframework.web.bind.annotation.GetMapping;
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 zhangfuzeng* @date 2022/6/9*/
@Slf4j
@RestController
public class ExportExcelController {@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);excelWriter.finish();out.flush();} catch (Exception e) {log.error(e.getMessage());}}private void handleExcel(OutputStream out) {try (ExcelWriter excelWriter = EasyExcelFactory.write(out).build()) {WriteSheet dealerSheet = EasyExcel.writerSheet(0, "经销商信息").head(ExcelCompany.class).build();WriteSheet contactSheet = EasyExcel.writerSheet(1, "联系人").head(ExcelContact.class).build();excelWriter.write(getCompany(), dealerSheet);excelWriter.write(getContact(), contactSheet);}}private List<ExcelCompany> getCompany() {List<ExcelCompany> companyList = new ArrayList<>();for (int i = 0; i < 5; i++) {companyList.add(ExcelCompany.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<ExcelContact> getContact() {List<ExcelContact> contactList = new ArrayList<>();for (int i = 0; i < 5; i++) {contactList.add(ExcelContact.builder().companyName("笑小枫公司" + i).name("笑小枫" + i).mobile("183000000000").idCard("371324199011111111").contactPostName("后端").build());}return contactList;}
}

测试结果

浏览器请求:http://localhost:8080/exportExcel

经销商sheet页信息:

联系人sheet页信息:

相关属性解读

注解

参数
通用参数
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 需要写入的编码。默认0
sheetName 需要些的Sheet名称,默认同sheetNo
WriteTable(就把excel的一个Sheet,一块区域看一个table)参数
tableNo 需要写入的编码。默认0

Java使用EasyExcel导出Excel相关推荐

  1. Java 使用EasyExcel导出excel文件

    Java 使用EasyExcel导出excel文件 一.引入pom依赖 二.导出实体 三. 生成excelController 四.效果 一.引入pom依赖 <dependency>< ...

  2. 【JAVA】easyexcel 导出excel文件带多个图片

    最终效果 pom版本 <developer> <groupId>com.alibaba</groupId><artifactId>easyexcel&l ...

  3. 【笑小枫的SpringBoot系列】【十三】JAVA使用EasyExcel导出excel

    功能背景 简单的说下这个功能的背景需求吧,有类似需求的可以复用,果然导入还没写完,导出的功能接踵而来,一块写了吧 实现excel导出(依旧废话-) 多个sheet页一起导出 第一个sheet页数据表头 ...

  4. Java 通过EasyExcel导出的Excel文档的字体,背景色,自动列宽等符合要求

    这次开任务使用的是EasyExcel导出Excel文档,但是在任务过程中,生成的文档的格式要求并不符合产品和测试的期望值,如图: 想着自己地位低下,也无能力反驳.只好硬着头皮查阅资料来达到他们的想要的 ...

  5. Java从零开始实现导出excel(一)

    Java从零开始实现导出excel(一) java导出excel两种方式 使用easyExcel通过模板导出excel 1.快速创建工程 下面我就直接贴代码 注意事项: 新人博主,随笔记录.主要还是通 ...

  6. POI封装工具easyexcel导出EXCEL表样式设置

    POI封装工具easyexcel导出EXCEL表样式设置 java中对Office操作比较好的工具是POI,但POI在导出数据量较大的情况下很容易因内存占用过大,而出错,阿里巴巴推出的easyexce ...

  7. Java从零开始实现导出excel(三)

    Java从零开始实现导出excel(三) 新人博主,随笔记录.主要还是通过自己日常工作积累,系统整理一些技术.希望能够节省更多人的时间,走出自己的路. 简述 新的一年,先祝各位小伙伴新的一年,事业有成 ...

  8. easyexcel导出excel,大数据量100万以内分页查询zip格式导出

    easyexcel导出excel,大数据量100万以内分页查询zip格式导出 准备工作 整体思路 controller层 service层 mapper层 VO 表结构 测试 备注 easyExcel ...

  9. java导入、导出Excel文件

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

最新文章

  1. Python 进阶 — 面向对象编程
  2. 如何实现把固定内容自动写入excel_Odoo如何实现基于关联数据自动写入本表数据项的实施技巧分享...
  3. mysql主从架构搭建_MySQL主从架构搭建
  4. RabbitMQ自学之路(九)——RabbitMQ实现延时队列的两种方式
  5. 中国软件正版化的理想模型
  6. Catlike Coding网站文章解析 -- 2.Procedural Grid
  7. cookies的存值问题
  8. reactor p java_Java反应式框架Reactor中的Mono和Flux
  9. 【ssh登陆问题】no matching cipher found / no matching key exchange method found
  10. 苹果侧边滑动返回_后置指纹、侧边指纹、屏幕指纹到底哪个更好用? 来讨论一下!...
  11. 区块链六-Merkle Tree
  12. 福利网站!程序员面试——算法工程师面试大全第三部分
  13. 远程开发工作具备因素有哪些?
  14. 怎么安装服务器打印组件,Windows Server2012 配置打印服务器图文教程
  15. mysql 表空间碎片_MySQL碎片产生的原因及清除表空间碎片的方法
  16. PLL-Hyd-PEG-COOH/NH2/NHS/OH/MAL/SH/N3 聚赖氨酸-腙键-聚乙二醇-官能团的制备
  17. 【信息系统项目管理师】第三章 立项管理思维导图
  18. rk3128 debian9 如何配置recover键(长按开机进入loader模式)
  19. 修复液晶显示器屏幕上的划痕
  20. 使用css做水印效果

热门文章

  1. 你能向我解释范畴 论里的monad吗?
  2. 用几行python代码获取Yahoo,tushare股票数据,超级爽!!(比爬网好太多)
  3. emule-Xtreme(电驴)
  4. 国际期货黄金手续费怎么算?
  5. python 股票图表_k线图分析法_【趣味案例】用Python绘制K线图,一眼看清股市状况...
  6. 小吴学汇编之第一章基础知识 (2)
  7. 【转】MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
  8. Button字体大写
  9. 普林斯顿大学计算机科学研究生条件,普林斯顿大学计算机科学研究生Offer及录取要求...
  10. DHT11温湿度传感器初识