【工具类】Excel 多 Sheet 导入工具类

这篇具有很好参考价值的文章主要介绍了【工具类】Excel 多 Sheet 导入工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用自定义注解 + 反射 + 泛型 + 封装,实现统一读取

自定义注解,Excel 作用于属性-Excel 列名,ExcelTarget 作用于类-ExcelSheet名

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Excel {
    String name();
}

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface ExcelTarget {
    String name();
}
import com.excel.tool.putuo.annotation.Excel;
import com.excel.tool.putuo.annotation.ExcelTarget;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 【工具类】Excel 多 Sheet 导入工具类
 *
 * @author jason
 */
public class ExcelSheetUtil {

    /**
     * 获取 Sheet 名字
     */
    public static <T> String getSheetName(Class<T> clazz) {
        return AnnotationUtil.getAnnotationValue(clazz, ExcelTarget.class, "name");
    }

    /**
     * 读取多个sheet
     *
     * @param inputStream
     * @param classList
     * @return
     */
    public static Map<String, List<?>> readExcelList(InputStream inputStream, List<Class<?>> classList) {
        Map<String, List<?>> sheetMap = new HashMap<>();

        // 解决 InputStream 流只能读一次的问题,复制一个 ByteArrayOutputStream
        ByteArrayOutputStream cacheInputStream = new ByteArrayOutputStream();
        IoUtil.write(cacheInputStream, true, IoUtil.readBytes(inputStream));
        classList.forEach(tClass -> {
            String sheetName = AnnotationUtil.getAnnotationValue(tClass, ExcelTarget.class, "name");
            InputStream inputStreamSingleton = new ByteArrayInputStream(cacheInputStream.toByteArray());
            List<?> excelData3List = readExcelList(sheetName, inputStreamSingleton, tClass);
            sheetMap.put(sheetName, excelData3List);
        });
        return sheetMap;
    }

    /**
     * 读取单个sheet
     *
     * @param sheetName
     * @param inputStream
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> List<T> readExcelList(String sheetName, InputStream inputStream, Class<T> clazz) {
        ExcelReader excelReader = ExcelUtil.getReader(inputStream, sheetName);
        List<Map<String, Object>> mapList = excelReader.read(0, 0, Integer.MAX_VALUE);
        excelReader.close();
        return Optional.ofNullable(mapList)
                .orElse(new ArrayList<>())
                .stream()
                .map(itemMap -> {
                    T excelData = ReflectUtil.newInstance(clazz);
                    Field[] fields = ReflectUtil.getFields(clazz);
                    for (Field field : fields) {
                        String key = AnnotationUtil.getAnnotationValue(field, Excel.class, "name");
                        String value = StrUtil.toStringOrNull(itemMap.get(key));
                        ReflectUtil.setFieldValue(excelData, field, value);
                    }
                    return excelData;
                })
                .collect(Collectors.toList());
    }

}

使用

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import com.excel.tool.putuo.excel.ExcelData0;
import com.excel.tool.putuo.excel.ExcelData1;
import com.excel.tool.putuo.excel.ExcelData2;
import com.excel.tool.putuo.excel.ExcelData3;
import com.excel.tool.putuo.util.ExcelSheetUtil;
import lombok.SneakyThrows;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public class TestMain {

    public static void main(String[] args) {
        File xlsx = FileUtil.file("数据11.21.xlsx");

        TestMain.startExcel(FileUtil.getInputStream(xlsx));
    }

    @SneakyThrows
    public static <T> void startExcel(InputStream inputStream) {
        List<Class<?>> classList = CollectionUtil.newArrayList(
                ExcelData0.class,
                ExcelData1.class,

                ExcelData2.class,
                ExcelData3.class
        );

        Map<String, List<?>> sheetMap = ExcelSheetUtil.readExcelList(inputStream, classList);

        List<ExcelData0> excelData0List = (List<ExcelData0>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData0.class));
        List<ExcelData1> excelData1List = (List<ExcelData1>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData1.class));
        List<ExcelData2> excelData2List = (List<ExcelData2>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData2.class));
        List<ExcelData3> excelData3List = (List<ExcelData3>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData3.class));

        System.out.println();
    }

}

实体定义

import com.excel.tool.putuo.annotation.Excel;
import com.excel.tool.putuo.annotation.ExcelTarget;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
@ExcelTarget(name = "整表")
public class ExcelData0 {

    @Excel(name = "序号")
    private String num;

    @Excel(name = "来源")
    private String mediaType;

    @Excel(name = "发布时间")
    private String publishTime;

    @Excel(name = "作者")
    private String author;

    @Excel(name = "标题")
    private String title;

    @Excel(name = "摘要")
    private String digest;

    @Excel(name = "原文链接")
    private String link;

}

源码:https://gitee.com/zhaomingjian/workspace_luoan_demo/tree/master/excel-tool/src/main/java/com/excel/tool/putuo文章来源地址https://www.toymoban.com/news/detail-758952.html

到了这里,关于【工具类】Excel 多 Sheet 导入工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java利用POI导入Excel数据(多个sheet、模板)

    需求:根据excel模板导入数据            sheet1:1-6行为固定格式,且需要取值({xxx});7行开始为数据集合(list)            sheet2:都为固定格式,取值地方:{xxx}         1、数据格式(两个Sheet)   2、代码

    2024年02月16日
    浏览(50)
  • Springboot Excel 最简单的 多sheet表 导入导出

    上周学习群里有人问到,多个sheet的导出导入,我第一反应就是easypoi不是自己就有方法了么? 后面一想,可能有些看客还处于是 找工具类,然后调试 的写代码 的 阶段,可能还不会去看jar包的一些函数。 既然如此,那就写一写Excel  多sheet表 导入导出。 之前的一些excel的相

    2024年02月16日
    浏览(38)
  • 微服务 Spring Boot Mybatis-Plus 整合 EasyPOI 实现 Excel 一对多 导入

    Excel导入 是 开发中 很常用的 功能 ,本篇 讲解 如何使用 Spring Boot + MyBatis -Plus 整合 EasyPOI 实现Excel 的一对多导入。 EasyPOI官网 采用 微服务 Spring Boot、Mybatis-Plus 整合 EasyPOI 实现Excel的一对多导入 Excel 导入 实现详细细节 前端采用 Vue+ElementUI 实现导入页面展示,要求 弹出上传框

    2024年02月03日
    浏览(50)
  • 使用easypoi-spring-boot-starter 4.1.1导入excel报错NoSuchMethodError和NoSuchMethodError

    使用easypoi进行excel的导入遇到的错误以及解决办法 easypoi项目地址:https://gitee.com/lemur/easypoi easypoi的Maven依赖: 报错描述: 解决办法: XmlOptions.setEntityExpansionLimit() 错误,是 jar 包版本引起的,3.0 版本以下的 xmlbeans 中根本没有该方法,需要将jar升级到 3.0+ 版本才可以。另外

    2024年02月08日
    浏览(49)
  • Spring Boot 我随手封装了一个万能的 Excel 导出工具,传什么都能导出!

    如题,这个小玩意,就是不限制你查的是哪张表,用的是什么类。 我直接一把梭,嘎嘎给你一顿导出。 我知道,这是很多人都想过的, 至少我就收到很多人问过我这个类似的问题。 我也跟他们说了,但是他们就是不动手,其实真的很简单。 不动手怎么办? 我出手呗。 不多

    2024年02月06日
    浏览(38)
  • vs code导入excel文件并且解析excel文件数据

    实习工作需要通过vs code导入excel文件并且解析excel文件数据,学习整理了一下相关方法分享给大家^_^ 要在 VS Code 中导入和解析 Excel 文件,你可以使用一些库和扩展来帮助你完成这个任务。以下是一种常用的方法: 安装必要的库和扩展: 安装  pandas  库:在终端窗口中运行 

    2024年02月03日
    浏览(64)
  • excel导入工具类

    2024年02月01日
    浏览(26)
  • EasyPoi快速入门(Excel导入导出工具)

    简介: easypoi是一款Excel快速导入导出的工具,最近有所使用,结合了网上的一些用法和官方文档的介绍,在在这里总结一下最简单的esaypoi导入Excel的实现,网上很多教程都已经封装了工具类,虽然方便,但第一次接触easypoi可能看的不是清晰,现在总结一下最为直观的SpringBoot集成easypoi快

    2023年04月22日
    浏览(42)
  • 数据分类分级 数据识别-excel分类分级模版文件导入、解析

    前面讲了数据分类分级 数据识别-实现部分敏感数据识别,本次针对模版导入展开,excel导入采用的是easyexcel 上面图片是AI创作生成!如需咒语可私戳哦! 之前的excel导入解析采用的是Apache poi,但是在Java领域解析、生成Excel比较有名的框架如Apache poi,jxl等,在使用的时候,存在

    2024年02月05日
    浏览(44)
  • 将多个EXCEL 合并一个EXCEL多个sheet

    合并老版本xls using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using NPOI.HSSF.UserModel; using System.IO; using NPOI.XSSF.UserModel; namespace Merge_Excel {     public partial class Form1

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包