背景介绍

最近要改一个导出的功能,在原有的基础上,在导出一份明细数据,要求导出内容加在原有 excel 的第二个 sheet 上。考虑到数据量还比较大,干脆引入阿里的 EasyExcel 来做。

下面我先上最终代码,再来说说我遇到的坑有哪些

代码实战

public String doHandle() {
try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
com.alibaba.excel.ExcelWriter excelWriter = EasyExcel.write(outputStream).build()) { List<SaleTransferSummaryRateExportVo> exportVos = queryAction.querySummaryExport();
List<SaleTransferClassRateExportVo> exportRateVos = queryAction.queryClassRate(); WriteSheet writeSheet = EasyExcel.writerSheet(0, "统计").head(SaleTransferSummaryRateExportVo.class).build();
excelWriter.write(exportVos, writeSheet);
WriteSheet rateWriteSheet = EasyExcel.writerSheet(1, "明细").head(SaleTransferClassRateExportVo.class).build();
excelWriter.write(exportRateVos, rateWriteSheet);
excelWriter.close();
// 数据落地到OSS
String resultPath = ossClient.uploadFile(outputStream.toByteArray(), ContentMediaEnum.XLSX.getName(), FileExtEnum.XLSX.getName());
return resultPath;
} catch (Exception e) {
return "";
}
}

我们项目是将文件传到 oss,然后去 oss 进行下载。也可以直接写入到文件或 response

public void doHandle() {
File file=new File("");
try(
com.alibaba.excel.ExcelWriter excelWriter = EasyExcel.write(file).build()) { List<SaleTransferSummaryRateExportVo> exportVos = queryAction.querySummaryExport();
List<SaleTransferClassRateExportVo> exportRateVos = queryAction.queryClassRate(); WriteSheet writeSheet = EasyExcel.writerSheet(0, "统计").head(SaleTransferSummaryRateExportVo.class).build();
excelWriter.write(exportVos, writeSheet);
WriteSheet rateWriteSheet = EasyExcel.writerSheet(1, "明细").head(SaleTransferClassRateExportVo.class).build();
excelWriter.write(exportRateVos, rateWriteSheet);
} catch (Exception e) {
log.error("导出异常",e);
}
}

只需要修改 write 的参数即可。

主要的代码就完成了,那么数据的属性和 excel 列名称怎么对应上的呢?

在数据的实体类上加上@ExcelProperty 注解就行了。它就能自动创建列头,并将数据对应写入。

  • @ColumnWidth 列宽度
  • @ExcelIgnore 代表不用导出的属性
  • DateTimeFormat 日期格式化
public class SaleTransferSummaryRateExportVo {

    @ExcelProperty("老师昵称")
@ColumnWidth(10)
private String teacherName; @ExcelProperty("大区")
private String regionName; @ExcelProperty("小组")
private String groupName; @ExcelProperty("创建时间")
@DateTimeFormat("yyyy-MM-dd")
private Date createTime; }

写完之后觉得表格有点丑,于是又调了下样式。也是几个注解搞定

@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 44)
@HeadFontStyle(fontHeightInPoints = 10)
@ContentFontStyle(fontHeightInPoints = 10)
public class SaleTransferSummaryRateExportVo { @ExcelProperty("老师昵称")
private String teacherName; @ExcelProperty("大区")
private String regionName; @ExcelProperty("小组")
private String groupName; @ExcelProperty("创建时间")
@DateTimeFormat("yyyy-MM-dd")
private Date createTime; }

fillForegroundColor 的值就代表颜色,具体什么值代表什么颜色,可以参考 IndexedColors 枚举类。

就这样就完成了。导出效果图如下:

遇到的坑

  1. 版本问题

我最开始用的版本是这样的,因为项目里之前就引入了 poi


<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.2</version>
</dependency>

版本不对的时候写入直接报错。

异常信息如下:

Exception in thread "main" com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.setCellValue(Ljava/time/LocalDateTime;)V
at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:65)
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:70)
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:47)
at cn.jojo.sales.app.task.ExportSalesTransferSummaryTask.main(ExportSalesTransferSummaryTask.java:90)
Caused by: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.setCellValue(Ljava/time/LocalDateTime;)V
at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.converterAndSet(AbstractExcelWriteExecutor.java:95)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addJavaObjectToExcel(ExcelWriteAddExecutor.java:174)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addOneRowOfDataToExcel(ExcelWriteAddExecutor.java:82)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.add(ExcelWriteAddExecutor.java:58)
at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:59)
... 3 more
  1. excelWriter 要关闭
excelWriter.close();

我之前因为 excelWriter 的定义是是写在 try 里的,所以没有 close,但是我的用法又是将 excelWriter 写入到字节流,然后字节流传到 oss,而且这个步骤也是在 try 里面。就导致了我一直写入不成功,后来才发现,浪费了一点时间。

我用EasyExcel优化了公司的导出(附踩坑记录)的更多相关文章

  1. 多页应用 Webpack4 配置优化与踩坑记录

    前言 最近新起了一个多页项目,之前都未使用 webpack4 ,于是准备上手实践一下.这篇文章主要就是一些配置介绍,对于正准备使用 webpack4 的同学,可以做一些参考. webpack4 相比之 ...

  2. 基于ABP做一个简单的系统——实战篇:4.基于富文本编辑器,Razor模板引擎生成内容并导出Word 填坑记录

    起因 需求是这样的,有一种协议需要生成,协议的模板是可配置的,在生成过程中,模板中的内容可以根据约定的标记进行替换(就像mvc的razor模板一样).生成后的内容还需要导出成word或pdf. 常见的 ...

  3. [转帖]优化IMPDP/EXPDP导入导出速度

    优化IMPDP/EXPDP导入导出速度 https://www.2cto.com/database/201308/238176.html 一年半没太学习数据库了.. 其实这个parallel 的参数一 ...

  4. 外贸网站SEO优化哪家公司好

    http://www.wocaoseo.com/thread-98-1-1.html        随着b2c的崛起,越来越多的企业已经放弃挂在第三方面台销售,而是选择去建独立的商场,拥有一个属于自已 ...

  5. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  6. 【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑

    一.引子 最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作.在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接 ...

  7. linux下python导出sybase 数据库 表记录的方式

    导出sybase 数据库 表记录的方式 1 执行启动sybase 数据库命令 code : dbeng7 gkdb 2 执行 连接sybase 数据库命令code : dbisql -c " ...

  8. JAVA实用案例之文件导出(JasperReport踩坑实录)

    写在最前面 想想来新公司也快五个月了,恍惚一瞬间. 翻了翻博客,因为太忙,也有将近五个多月没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六 ...

  9. JasperReport报表导出踩坑实录

    写在最前面 翻了翻博客,因为太忙,已经好久没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六月份的时候写过一篇利用poi文件导入导出的小De ...

随机推荐

  1. [CSharpTips]判断两条线段是否相交

    判断两条线段是否相交 主要用到了通过向量积的正负判断两个向量位置关系 向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向量a的逆时针方向:若等于 ...

  2. B/S结构通信系统原理

    本文介绍JavaWeb的B/S结构通信原理 概念:        Javaweb中B/S架构是一种系统架构形式,这里的B是Browser(浏览器),S是Server(服务器),是一种系统的架构形式,有 ...

  3. 在vue项目中使用UEditor--plus

    1:UEditor-plus富文本编辑器如何在vue项目中使用 备注:UEditor是由百度web前端研发部开发的所见即所得的开源富文本编辑器,由于该项目不在维护:程序员自发对其进行了维护,详见 ht ...

  4. Vue 3-150行代码实现新国标红绿灯效果案例

    昨天刷视频,都是关于新国标红绿灯的,看大家议论纷纷,下班就用150行代码通过Vue组件实践红绿模拟演示,视频也跟大家展示过了.今天接着更新图文版本,大家跟着优雅哥通过该案例实操模拟一下. 不过新国标红 ...

  5. CF593D Happy Tree Party(不用树剖)

    题面 题解 我们发现,对于除法有效的xi最小为2,yi最多除log次就会变成0,所以我们可以每次找路径上下一个>=2的xi,暴力除,当发现y=0时就停止 于是我们维护每个点向上走一直走到根最近的 ...

  6. 网站优化,dns预解析,解析缓存

    DNS Prefetch 是一种 DNS 预解析技术.当你浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页中的连接时就无需进行 DNS 的解析,减少用户等待时间,提高用 ...

  7. 抛砖系列之git仓库拆分工具git-filter-repo

    最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来. 背景 笔者团队目前是把业务相关的java项目都放到了一 ...

  8. Python工具箱系列(四)

    上期描述了如何在Windows下安装官方的Python3.8,本期描述如何安装Anaconda.建立Python环境这个话题,为何要大费周章.不厌其烦的叙述呢,主要的原因是: 所有的语言在设计时,都假 ...

  9. Kubernetes 监控:Prometheus Operator + Thanos ---实践篇

    具体参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/16291296.html 本章用到的yaml文件地址:https://files.cnblogs.com/ ...

  10. Elasticsearch:Node 介绍 - 7.9 之后版本

    文章转载自:https://elasticstack.blog.csdn.net/article/details/110947372 在 Elastic Stack 7.9 之后的发布中,我们可以直接 ...