首页 > 其他分享 >【工具使用】【EasyExcel 】EasyExcel 实现 Excel 作者信息、版本信息等的写入和读取

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

时间:2024-09-05 13:36:20浏览次数:10  
标签:String Excel EasyExcel excel alibaba com import 版本信息

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());

        // 读 excel
        EasyExcel.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
    @Override
    public void afterSheetCreate(SheetWriteHandlerContext context) {

        // 获取到当前的 workbook
        WriteWorkbookHolder 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>> {

    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {

    }

    @SneakyThrows
    @Override
    public 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  小结

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

标签:String,Excel,EasyExcel,excel,alibaba,com,import,版本信息
From: https://www.cnblogs.com/kukuxjx/p/18398229

相关文章

  • # yyds干货盘点 # 安装modin后读取excel表格提示如下报错,应该怎么解决呢?
    大家好,我是Python进阶者。一、前言前几天在Python最强白银交流群【wen】问了一个Python库安装报错的问题,问题如下:importmodin.pandasaspddf=pd.read_excel('D:\input\数据.xlsx',sheet_name='原始数据').convert_dtypes()df请教,安装modin后读取excel表格提示如下报错Plea......
  • 数据分析之Excel周报开发
    周报一般包括:标题、小看板、结果指标、过程指标外卖平台周报这里以外卖平台周报为例,数据来自B站@戴戴戴师兄一、标题        1.标明数据时间二、小看板        1.设置单元格为筛选器:        (1)选中单元格        (2)在数据菜单栏中找到有......
  • 数据分析之Excel常用的函数
    函数注意事项1.写函数前要加'='号:        2.函数可以跨工作表引用3.单元格下方小十字可以自动填充,仿照选中单元格函数,如果自动填充时想锁定某个条件,可以在前面加$符,如图,锁定了Q18这个条件(选中想要锁定的条件后可以直接按F4快捷键锁定,Mac是fn+F4)        ......
  • 导入excel测试分析与测试验证点
    前言:excel导入是一个很常见的功能,基本上toB的系统在web端都能用到,能够解决大批数据快速生成,是快速创建/修改数据的绝佳方式;通常导入excel分了2种,一种是导入后新增数据,一种是导入后修改数据。笔者曾经在公司对内的销售系统,CRM,监管系统等都见过类似的功能,用于快速创建大批客户数据......
  • JS之实现Excel数据导入
    1.<template>部分<a-uploadname="file":customRequest="importExcelData"accept=".xls,.xlsx"class="uploadBtn":showUploadList="false"><a-buttontype="primary"......
  • AWC 批量查询使用关系的最新版本并导出Excel
    1.查询使用关系的方法:*调用查询返回数据 *@param{Object}data *@returns{Promise} **/exportletqueryItemRevisionById=function(data){  if(!data.item_id){    messagingService.showInfo("请输入查询条件");    return;  ......
  • Python批量分割Excel后逐行做差、合并文件的方法
      本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,首先依据某一列数据的特征截取我们需要的数据,随后对截取出来的数据逐行求差,并基于其他多个文件夹中同样大量的Excel表格文件,进行数据跨文件合并的具体方法。  首先,我们来明确一下本文的具体需......
  • 【Python自动化办公】按条件删除Excel表格数据
    本文介绍基于Python语言,读取Excel表格文件,基于我们给定的规则,对其中的数据加以筛选,将不在指定数据范围内的数据剔除,保留符合我们需要的数据的方法。首先,我们来明确一下本文的具体需求。现有一个Excel表格文件(在本文中我们就以.csv格式的文件为例),如下图所示。其中,Excel表......
  • Python 中读取 Excel 表格数据
    在Python中读取Excel表格数据可以使用 pandas 库,这个库为数据处理和分析提供了强大的工具。以下是如何在Python中读取Excel文件的示例脚本。安装所需库首先,我们需要确保安装了所需的库。主要使用的库是 pandas 和 openpyxl(用于读取Excel文件)。您可以使用以下......
  • Excel vloopup应用案例
    业务大致要求给出某一特定范围员工的上班记录 eg.出具横向的报表了解背景,考勤数据无法从系统获取,那就默认考勤数据是准确的,只需要把列表记录转换成矩阵结构就行。 方案一:手工(少量,人员不定)按人员日期排序,人员复制过去,日期和项目一并复制,然后转置(行列互换)就可以了......