EsayExcel的使用

EsayExcel的使用

引入依赖

<dependency>  
<groupId>com.alibaba</groupId>  
<artifactId>easyexcel</artifactId>  
<version>3.1.1</version>  
</dependency>

类属性中的注解

# 默认下标从0开始,index可以不填,value值必填
@ExcelProperty(value = "excel名称", index = 0)
private String name;
# 可以识别多行字段
@ExcelProperty(value = {"商品信息", "商品价格"})
private String name;
# 忽略该属性
@ExcelIgnore  
private String sex;

代码部分

在Service中的代码如下

    @Overridepublic boolean importExcelSyncLineLoss(MultipartFile file, String dataDate) {try{//获取文件流InputStream inputStream = file.getInputStream();List<List<String>> heads = new ArrayList<>();// 内层list 有两个值,表示有两行,外层list有两个对象,表示有两列。同一行如果列名相同,将进行合并heads.add(Arrays.asList("类型", "类型1"));heads.add(Arrays.asList("类型","类型2"));heads.add(Arrays.asList("类型","类型3"));//easyexcel导入文件EasyExcel.read(inputStream, TPowerSyncLineLoss.class,new SyncLineLossImportListener(this, dataDate)).head(heads).headRowNumber(2).sheet().doRead();return true;}catch (IOException e){e.printStackTrace();return false;}}

若Excel中只有第一行有标题可以去除head与headRowNumber方法
SyncLineLossImportListener类

public class SyncLineLossImportListener extends AnalysisEventListener<TPowerSyncLineLoss> {private static final Logger LOGGER = LoggerFactory.getLogger(SyncLineLossImportListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;private List<TPowerSyncLineLoss> list = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来*/private TPowerSyncLineLossService tPowerSyncLineLossService;private String dataDate;public SyncLineLossImportListener(TPowerSyncLineLossService tPowerSyncLineLossService) {this.tPowerSyncLineLossService = tPowerSyncLineLossService;}public SyncLineLossImportListener(TPowerSyncLineLossService tPowerSyncLineLossService, String dataDate) {this.tPowerSyncLineLossService = tPowerSyncLineLossService;this.dataDate = dataDate;}@Overridepublic void invoke(TPowerSyncLineLoss syncLineLoss, AnalysisContext analysisContext) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(syncLineLoss));list.add(syncLineLoss);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());list.forEach(tmp->{tmp.setDataDate(dataDate);});tPowerSyncLineLossService.saveBatch(list);LOGGER.info("存储数据库成功!");}}

可以设置二级表头
在需要合并单元格的属性上设置 @ExcelMerge 注解,二级表头通过设置 @ExcelProperty 注解中 value 值为数组形式来实现该效果:

/*** @author william@StarImmortal*/
@Data
public class OrderBO {@ExcelProperty(value = "订单主键")@ColumnWidth(16)@ExcelMerge(merge = true, isPrimaryKey = true)private String id;@ExcelProperty(value = "订单编号")@ColumnWidth(20)@ExcelMerge(merge = true)private String orderId;@ExcelProperty(value = "收货地址")@ExcelMerge(merge = true)@ColumnWidth(20)private String address;@ExcelProperty(value = "创建时间")@ColumnWidth(20)@DateTimeFormat("yyyy-MM-dd HH:mm:ss")@ExcelMerge(merge = true)private Date createTime;@ExcelProperty(value = {"商品信息", "商品编号"})@ColumnWidth(20)private String productId;@ExcelProperty(value = {"商品信息", "商品名称"})@ColumnWidth(20)private String name;@ExcelProperty(value = {"商品信息", "商品标题"})@ColumnWidth(30)private String subtitle;@ExcelProperty(value = {"商品信息", "品牌名称"})@ColumnWidth(20)private String brandName;@ExcelProperty(value = {"商品信息", "商品价格"})@ColumnWidth(20)private BigDecimal price;@ExcelProperty(value = {"商品信息", "商品数量"})@ColumnWidth(20)private Integer count;
}

导入导出参考连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows安装Kafka3.6,单机

Kafka版本&#xff1a;kafka_2.13-3.6.0 Windows10系统 安装与配置 下载 kafka_2.13-3.6.0.tgz 下载并解压Kafka 3.6.0的压缩包到你选择的目录。 Kafka3.6.0下载链接https://kafka.apache.org/downloads 说明&#xff1a;Kafka3.6内置了Zookeeper&#xff0c;使用内置的Zo…

Ps:用好钢笔工具

使用钢笔工具时&#xff0c;应随时注意鼠标指针的形状。 ◆ ◆ ◆ 基本操作方法 1、绘制闭合路径 路径绘制结束时回到起点即可创建闭合路径。 2、绘制开放路径 想结束绘制时&#xff0c;按住 Ctrl 键点击画布空白处&#xff0c;或者&#xff0c;直接按 Esc 键&#xff0c;即可…

传统算法: Pygame 实现快速排序

使用 Pygame 模块实现了快速排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过快速排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序选择一个基准元素(pivot),将数组分成两部分,…

IP地址更改的方法及注意事项,让你的网络更安全稳定

在互联网时代&#xff0c;IP地址是我们上网时的身份标识&#xff0c;它可以追踪我们的上网行为和地理位置。然而&#xff0c;有时我们可能需要更改IP地址&#xff0c;以保护个人隐私&#xff0c;解决网络问题或绕过某些限制。那么&#xff0c;IP地址更改在哪里呢&#xff1f;虎…

腾讯云手动下发指令到设备-用于设备调试

打开腾讯云API Explorer&#xff0c;Publish Msg https://console.cloud.tencent.com/api/explorer?Productiotcloud&Version2021-04-08&ActionPublishMessagehttps://console.cloud.tencent.com/api/explorer?Productiotcloud&Version2021-04-08&ActionPub…

C#图像处理OpenCV开发指南(CVStar,04)——图片像素访问与多种局部放大效果的实现代码

​​​​​​​ 使用本文代码需要预先设置一点开发环境&#xff0c;请阅读另外一篇博文&#xff1a; C#图像处理OpenCV开发指南&#xff08;CVStar&#xff0c;03&#xff09;——基于.NET 6的图像处理桌面程序开发实践第一步https://blog.csdn.net/beijinghorn/article/deta…

RocketMQ-RocketMQ快速实战及集群原理

一、MQ简介 ​ MQ&#xff1a;MessageQueue&#xff0c;消息队列。是在互联网中使用非常广泛的一系列服务中间件。 这个词可以分两个部分来看&#xff0c;一是Message&#xff1a;消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上&#xff0c;也可以分布…

Nashorn 简介

1. 引言 本文重点介绍 Nashorn – 从 Java 8 开始&#xff0c;JVM 的新默认 JavaScript 引擎。 许多复杂的技术已被用于使 Nashorn 的性能比其前身 Rhino 高出几个数量级&#xff0c;因此这是一个值得的改变。让我们来看看它的一些使用方式。 本文大部分内容翻译自&#xff1…

element-ui表格滚动效果,el-table滚动条样式重置

项目首页需要展示一个表格滚动区域&#xff0c;特此来记录一下 HTML <div class"table-box" mouseenter"mouseenter" mouseleave"mouseleave"><el-table :data"tableList" border height"400px" v-loading"…

华为eNSP AR2220路由器配置教程

文章目录 华为eNSP AR2220路由器配置教程基础配置系统初始化设置用户密码配置设备IP地址 接口配置LAN接口配置WAN接口配置 路由配置静态路由配置动态路由协议配置OSPF配置 安全配置防火墙配置 故障排除查看接口状态日志和诊断测试网络连通性 华为eNSP AR2220路由器配置教程 华…

web前端开发简介及门槛、学习路线

1. 什么是web&#xff1f; Web是 world wide web,万维网,广域网,互联网 Web可以理解是网站 2. 什么网站和网页&#xff1f; 网站是由多个网页和其他文件组成的 3. 什么是web的前端和后端&#xff1f; 4.网页的组成&#xff1a; html: 在网页中真实存在的,例如: 文本,输入…

图像img2img任务任务中评估指标

均方误差&#xff08;Mean Squared Error&#xff0c;MSE&#xff09;&#xff1a;计算两个图像像素之间的平均差异的平方。MSE越小&#xff0c;表示两个图像越接近。 均方根误差&#xff08;Root Mean Squared Error&#xff0c;RMSE&#xff09;&#xff1a;MSE的平方根。RM…

编程之外,生活的美好航程

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

回顾Django的第二天

1.http 1.1http请求协议与响应协议 1.1.1简介 http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的请求协议。用于HTTP协议交互的信被为HTTP报文。请求端(客户端)的HTTP报文 做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身…

使用JAVA语言写一个排队叫号的小程序

以下是一个简单的排队叫号的小程序&#xff0c;使用JAVA语言实现。 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class NumberingSystem {public static void main(String[] args) {Queue<String> queue new LinkedList<…

PCB布线为什么不能走直角或锐角-笔记

PCB布线为什么不能走直角或锐角-笔记 摘要一.PCB走线在直角转弯的地方&#xff0c;信号前后部分相互影响这几个理由我们来一一分析一下传输线的直角带来的寄生电容从阻抗的角度来看直角的尖角产生放电或者电磁辐射走线直角的工艺问题 摘要 有一定熟悉画过PCB板的人或者PCB教学…

Linux常用命令——mv命令

文章目录 1. 简介2. 命令格式3. 主要参数4. 常见用法及示例4.1 移动文件4.2 重命名文件4.3 交互式移动文件4.4 强制移动文件4.5 移动多个文件4.6 使用通配符移动文件 5. 注意事项6. 结论 1. 简介 mv 命令在Linux系统中用于移动文件或目录&#xff0c;同时也可以用于重命名文件…

【js】如何在不指定具体属性名,而是通过变量获取属性名,设置一个对象中多层级下的某个属性的值

为了优化这种赋值方式&#xff0c;可以考虑使用ES6的解构和展开运算符。 首先&#xff0c;我们可以使用解构运算符来提取需要赋值的变量&#xff0c;以增加代码的可读性和简洁性&#xff1a; const { ContainerKey, formId } obj; obj[ContainerKey][formId[0]][formId[1]] …

Ubuntu Server 20.04.6下Anaconda3安装Pytorch

环境 Ubuntu 20.04.6 LTS Anaconda3-2023.09-0-Linux-x86_64.sh conda 23.7.4 Pytorch 1.11.0 安装 先创建一个工作环境&#xff0c;环境名叫lia&#xff1a; conda create -n lia python3.8环境的使用方法如下&#xff1a; conda activate lia # 激活环境 conda deactiv…

【Java 基础 - 泛型机制详细解释】

Java 基础 - 泛型机制详解 为什么会引入泛型泛型的基本使用 泛型类泛型接口泛型方法泛型的上下限泛型数组深入理解泛型 如何理解Java中的泛型是伪泛型&#xff1f;泛型中类型擦除如何证明类型的擦除呢&#xff1f;如何理解类型擦除后保留的原始类型?如何理解泛型的编译期检查&…