Java使用EasyExcel导出Excel
功能背景
简单的说下这个功能的背景需求吧,有类似需求的可以复用,果然导入还没写完,导出的功能接踵而来,一块写了吧
- 实现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页信息:
相关属性解读
注解
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都会有的参数,如果为空,默认使用上级。
Java使用EasyExcel导出Excel相关推荐
- Java 使用EasyExcel导出excel文件
Java 使用EasyExcel导出excel文件 一.引入pom依赖 二.导出实体 三. 生成excelController 四.效果 一.引入pom依赖 <dependency>< ...
- 【JAVA】easyexcel 导出excel文件带多个图片
最终效果 pom版本 <developer> <groupId>com.alibaba</groupId><artifactId>easyexcel&l ...
- 【笑小枫的SpringBoot系列】【十三】JAVA使用EasyExcel导出excel
功能背景 简单的说下这个功能的背景需求吧,有类似需求的可以复用,果然导入还没写完,导出的功能接踵而来,一块写了吧 实现excel导出(依旧废话-) 多个sheet页一起导出 第一个sheet页数据表头 ...
- Java 通过EasyExcel导出的Excel文档的字体,背景色,自动列宽等符合要求
这次开任务使用的是EasyExcel导出Excel文档,但是在任务过程中,生成的文档的格式要求并不符合产品和测试的期望值,如图: 想着自己地位低下,也无能力反驳.只好硬着头皮查阅资料来达到他们的想要的 ...
- Java从零开始实现导出excel(一)
Java从零开始实现导出excel(一) java导出excel两种方式 使用easyExcel通过模板导出excel 1.快速创建工程 下面我就直接贴代码 注意事项: 新人博主,随笔记录.主要还是通 ...
- POI封装工具easyexcel导出EXCEL表样式设置
POI封装工具easyexcel导出EXCEL表样式设置 java中对Office操作比较好的工具是POI,但POI在导出数据量较大的情况下很容易因内存占用过大,而出错,阿里巴巴推出的easyexce ...
- Java从零开始实现导出excel(三)
Java从零开始实现导出excel(三) 新人博主,随笔记录.主要还是通过自己日常工作积累,系统整理一些技术.希望能够节省更多人的时间,走出自己的路. 简述 新的一年,先祝各位小伙伴新的一年,事业有成 ...
- easyexcel导出excel,大数据量100万以内分页查询zip格式导出
easyexcel导出excel,大数据量100万以内分页查询zip格式导出 准备工作 整体思路 controller层 service层 mapper层 VO 表结构 测试 备注 easyExcel ...
- java导入、导出Excel文件
一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...
最新文章
- Python 进阶 — 面向对象编程
- 如何实现把固定内容自动写入excel_Odoo如何实现基于关联数据自动写入本表数据项的实施技巧分享...
- mysql主从架构搭建_MySQL主从架构搭建
- RabbitMQ自学之路(九)——RabbitMQ实现延时队列的两种方式
- 中国软件正版化的理想模型
- Catlike Coding网站文章解析 -- 2.Procedural Grid
- cookies的存值问题
- reactor p java_Java反应式框架Reactor中的Mono和Flux
- 【ssh登陆问题】no matching cipher found / no matching key exchange method found
- 苹果侧边滑动返回_后置指纹、侧边指纹、屏幕指纹到底哪个更好用? 来讨论一下!...
- 区块链六-Merkle Tree
- 福利网站!程序员面试——算法工程师面试大全第三部分
- 远程开发工作具备因素有哪些?
- 怎么安装服务器打印组件,Windows Server2012 配置打印服务器图文教程
- mysql 表空间碎片_MySQL碎片产生的原因及清除表空间碎片的方法
- PLL-Hyd-PEG-COOH/NH2/NHS/OH/MAL/SH/N3 聚赖氨酸-腙键-聚乙二醇-官能团的制备
- 【信息系统项目管理师】第三章 立项管理思维导图
- rk3128 debian9 如何配置recover键(长按开机进入loader模式)
- 修复液晶显示器屏幕上的划痕
- 使用css做水印效果
热门文章
- 你能向我解释范畴 论里的monad吗?
- 用几行python代码获取Yahoo,tushare股票数据,超级爽!!(比爬网好太多)
- emule-Xtreme(电驴)
- 国际期货黄金手续费怎么算?
- python 股票图表_k线图分析法_【趣味案例】用Python绘制K线图,一眼看清股市状况...
- 小吴学汇编之第一章基础知识 (2)
- 【转】MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
- Button字体大写
- 普林斯顿大学计算机科学研究生条件,普林斯顿大学计算机科学研究生Offer及录取要求...
- DHT11温湿度传感器初识