【工具使用】【EasyExcel 】EasyExcel 实现 Excel 作者信息、版本信息等的写入和读取

news/2024/11/15 14:44:33/文章来源:https://www.cnblogs.com/kukuxjx/p/18398229

1  前言

导入的功能,想必大家都做过,大家肯定也都遇到过比如我的模板变化了(比如新增一列、删除一列等),客户在使用的时候可能还是用的老模板进行导入,那么我们在写代码的时候,应该怎么快速识别到呢?

比如可以比较客户导入的 Excel 一列一列的去比较或者列的个数等是可以的。

我想的一个是能不能给 Excel 写入一个版本信息,类型属性信息这种,这样在导入的时候,我可以比较一下这个版本号,来提示用户当前版本,最新版本让客户下载新的模板。

当时没空整,这不是空了,那我们本节就来小小的研究一下。

Excel 官网:官方文档我看了,没有关于这种属性信息、作者信息这种的写入、读取

Excel 依赖:

<!--工具 excel-->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.2</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</artifactId><groupId>org.apache.poi</groupId></exclusion></exclusions>
</dependency>

2  实现

我这里就直接贴代码了哈:

主类:

package com.virtuous.demo.laboratory.excel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.ListUtils;import java.util.Date;
import java.util.List;/*** @author: kuku* @description*/
public class TemplateDownload {public static void main(String[] args) {// 文件名String fileName = "test.xlsx";// 写 excel
        EasyExcel.write(fileName).registerWriteHandler(new CustomSheetWriteHandler()).sheet("模板").doWrite(dataList());// 读 excelEasyExcel.read("test.xlsx", new ReadDataListener()).sheet().doRead();}private static List<List<Object>> dataList() {List<List<Object>> list = ListUtils.newArrayList();for (int i = 0; i < 10; i++) {List<Object> data = ListUtils.newArrayList();data.add("字符串" + i);data.add(0.56);data.add(new Date());list.add(data);}return list;}
}

写入的拦截器,用于对 Excel 进行一些特定的写入:

package com.virtuous.demo.laboratory.excel;import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.handler.context.SheetWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ooxml.POIXMLProperties;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.lang.reflect.Field;/*** 写 ExceL 拦截器* @author kuku*/
@Slf4j
public class CustomSheetWriteHandler implements SheetWriteHandler {@SneakyThrows@Overridepublic void afterSheetCreate(SheetWriteHandlerContext context) {// 获取到当前的 workbookWriteWorkbookHolder writeWorkbookHolder = context.getWriteWorkbookHolder();// 由于没有直接的获取方式 我们这里用反射Field workbookField = WriteWorkbookHolder.class.getDeclaredField("workbook");workbookField.setAccessible(true);SXSSFWorkbook sxssfWorkbook = (SXSSFWorkbook)workbookField.get(writeWorkbookHolder);XSSFWorkbook xssfWorkbook = sxssfWorkbook.getXSSFWorkbook();// 获取属性对象POIXMLProperties properties = xssfWorkbook.getProperties();POIXMLProperties.CoreProperties coreProperties = properties.getCoreProperties();String creator = "酷酷2024";String description = "订单导入模板";String version = "2.0";// 设置作者信息
        coreProperties.setCreator(creator);// 设置描述信息
        coreProperties.setDescription(description);// 设置版本号
        coreProperties.setVersion(version);log.info("写入作者:{},描述:{},版本:{}", creator, description, version);}
}

读取的监听器:

package com.virtuous.demo.laboratory.excel;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageProperties;import java.lang.reflect.Field;
import java.util.Map;/*** 读 Excel 监听器* @author kuku*/
@Slf4j
public class ReadDataListener extends AnalysisEventListener<Map<Integer, String>> {@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {}@SneakyThrows@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {ReadWorkbookHolder readWorkbookHolder = context.readWorkbookHolder();if (readWorkbookHolder instanceof XlsxReadWorkbookHolder) {Field opcPackageField = XlsxReadWorkbookHolder.class.getDeclaredField("opcPackage");opcPackageField.setAccessible(true);OPCPackage opcPackage = (OPCPackage) opcPackageField.get(readWorkbookHolder);PackageProperties packageProperties = opcPackage.getPackageProperties();String creator = packageProperties.getCreatorProperty().orElse(null);String description = packageProperties.getDescriptionProperty().orElse(null);String version = packageProperties.getVersionProperty().orElse(null);log.info("读取作者:{},描述:{},版本:{}", creator, description, version);}}}

最后说一下:这种属性信息比如版本、作者信息等是可以自己编辑的,哈哈哈,当然这种概率比较小,我估计影响不大,如果要非常严谨的话,还是一列一列的去比较校验。

另外 POI 方式的就不写了哈,写入和读取基本都是用的 POI 里的对象,方式是一样的。

还有有的一些反射以及类型的校验,大家可以再严谨点,我这里主要是测试下看看行不行,所以直接 @SneakyThrows 来大包大揽了哈。

3  小结

好啦,本节就看到这里,有理解不对的地方欢迎指正哈。

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

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

相关文章

查看pdf的字体,导出电脑的字体

1、 查看PDF文件的使用字体: ⑴、打开PDF文件,右上角,点击【文件】⑵、打开属性⑶、查看字体字体结果:2、 导出字体 ⑴、打开控制面板,小图标下面选择字体⑵、打开字体,查看方式改成【详细信息】,按照名称排序⑶、找到字体缩小窗口,点击字体,拖到桌面上就行了

Exchange 2016部署实施案例篇-04.Ex基础配置篇(中)

昨天更新了基础配置的上篇《Exchange 2016部署实施案例篇-04.Ex基础配置篇(上)》,欢迎各位老铁多多提出宝贵意见,非常感谢。 虚拟目录 自动发现配置有的朋友可能知道,虽然在虚拟目录里有自动发现这个选项,但自动发现记录在图形化界面无法配置自动发现地址,如图所示 其实…

一个故事理解消息队列-下

这是一篇迟到一月有余的文章。 在7月18号,我用了一个故事作为案例,介绍了消息队列的基本功能和应用场景。本打算第二天介绍消息队列的主要功能特性的,由于文章排期等其他因素影响,顾更新搁置了。 这篇文章,接上篇《一个故事理解消息队列-上》,以Kafka为例,为大家介绍消息…

开源文档管理系统 MinDoc 安装和使用教程

说到文档管理,很多团队的文档管理都是一团糟,每个员工在自己本地写了各种 Word 文档、Excel 表格、甚至还有手写的便签,到处都是,找起来就像大海捞针。有些聪明的团队开始用飞书来管理团队文档,但是并不适合所有团队,有的团队可能更倾向于使用开源的方案。今天就给大家介…

解决idea创建版本时只有Java21和Java17选项

你是否在使用IntelliJ IDEA创建新项目时遇到了只有Java 21和Java 17的选项?别担心,我们的指南将为你提供解决方案,通过简单的步骤,你将能够选择你需要的任何Java版本,继续阅读,让我们开始吧!idea如果版本高了就会出现在创建Springboot项目时只有Java21和Java17选项 选择jdk1.…

短视频获客系统市场分析和竞品分析

在当前经济环境下,各行各业都面临着严峻的获客挑战。无论是中小企业、大型企业,还是新兴的互联网行业,都在努力寻找更加高效的获客途径,说明企业迫切需要一套创新的获客系统来解决这些难题。 1、市场分析 互联网的快速发展极大地改变了企业的运营模式,尤其是在客户获取方面…

Yolov8-源码解析-四十四-

Yolov8 源码解析(四十四) .\yolov8\ultralytics\utils\triton.py # Ultralytics YOLO 🚀, AGPL-3.0 license# 引入必要的类型 from typing import List # 解析 URL 的组件 from urllib.parse import urlsplit# 引入 NumPy 库 import numpy as npclass TritonRemoteModel:&q…

Yolov8-源码解析-四十三-

Yolov8 源码解析(四十三) .\yolov8\ultralytics\utils\patches.py # Ultralytics YOLO 🚀, AGPL-3.0 license """Monkey patches to update/extend functionality of existing functions."""import time from pathlib import Pathimport cv2…

Yolov8-源码解析-四十二-

Yolov8 源码解析(四十二) .\yolov8\ultralytics\utils\loss.py # 导入PyTorch库中需要的模块 import torch import torch.nn as nn import torch.nn.functional as F# 从Ultralytics工具包中导入一些特定的功能 from ultralytics.utils.metrics import OKS_SIGMA from ultral…

Yolov8-源码解析-二十六-

Yolov8 源码解析(二十六) .\yolov8\tests\test_engine.py # 导入所需的模块和库 import sys # 系统模块 from unittest import mock # 导入 mock 模块# 导入自定义模块和类 from tests import MODEL # 导入 tests 模块中的 MODEL 对象 from ultralytics import YOLO # 导…

Yolov8-源码解析-二十八-

Yolov8 源码解析(二十八) .\yolov8\ultralytics\data\base.py # Ultralytics YOLO 🚀, AGPL-3.0 licenseimport glob # 导入用于获取文件路径的模块 import math # 导入数学函数模块 import os # 导入操作系统功能模块 import random # 导入生成随机数的模块 from copy…

Yolov8-源码解析-八-

Yolov8 源码解析(八)comments: true description: Learn how to manage and optimize queues using Ultralytics YOLOv8 to reduce wait times and increase efficiency in various real-world applications. keywords: queue management, YOLOv8, Ultralytics, reduce wait …