Java实现一个公共方法解析不同类型的表格

news2025/1/17 21:16:00

首先是公共方法

    private String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        String value = "";
        switch (cell.getCellType()) {
            case STRING:
                value = cell.getStringCellValue();
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    value = cell.getDateCellValue().toString();
                } else {
                    value = Double.toString(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                value = Boolean.toString(cell.getBooleanCellValue());
                break;
            case FORMULA:
                value = cell.getCellFormula();
                break;
            default:
                return "";
        }
        // 移除所有换行符
        return value.replaceAll("\\r\\n|\\n|\\r", "");
    }

    /**
     * 解析联锁表表格的公共方法
     * @param sheetIndex    要解析的第几个表格
     * @param clazz         解析对象
     * @param mapper
     * @param passTitle     需要跳过的表头行数
     * @param <T>
     */
    public <T> void importJlLsb(Integer sheetIndex, Class<T> clazz, BiFunction<T, Cell, T> mapper, Integer passTitle) throws IOException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        String filePath = "D:/project/联锁表格式.xlsx";
        List<T> jlLSBList = new ArrayList<>();
        FileInputStream inputStream = new FileInputStream(new File(filePath));
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet firstSheet = workbook.getSheetAt(sheetIndex);
        Iterator<Row> iterator = firstSheet.iterator();

        // 跳过标题行
        for (int i = 0; i < passTitle; i++) {
            iterator.next();
        }

        while (iterator.hasNext()) {
            Row nextRow = iterator.next();
            T jlLSB = clazz.getDeclaredConstructor().newInstance();

            // 遍历列
            for (int i = 0; i < nextRow.getLastCellNum(); i++) {
                Cell cell = nextRow.getCell(i);
                if (cell == null || cell.getCellType() == CellType.BLANK) {
                    // 检查是否在合并单元格中
                    for (CellRangeAddress range : firstSheet.getMergedRegions()) {
                        if (range.isInRange(nextRow.getRowNum(), i)) {
                            // 获取合并单元格的第一个单元格的值
                            Row firstRow = firstSheet.getRow(range.getFirstRow());
                            Cell firstCell = firstRow.getCell(range.getFirstColumn());
                            // 设置对象的属性
                            jlLSB = mapper.apply(jlLSB, firstCell);
                            break;
                        }
                    }
                } else {
                    // 设置对象的属性
                    jlLSB = mapper.apply(jlLSB, cell);
                }
            }

            // 输出对象的属性
            System.out.println(jlLSB.toString());

            jlLSBList.add(jlLSB);
        }

        workbook.close();
        inputStream.close();
    }

然后是是调用方法,这里使用了两个对象,对应两个表格

    public void ImportLcJlLsb() throws IOException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        importJlLsb(0, LcJlLSB.class, (jlLSB, cell) -> {
            LcJlLSB lcJlLSB = (LcJlLSB) jlLSB;
            setLcJlLSBProperty(lcJlLSB, cell, cell.getColumnIndex());
            return lcJlLSB;
        }, 2);
    }

    private void setLcJlLSBProperty(LcJlLSB lcJlLSB, Cell cell, int columnIndex) {
        // 根据列索引设置对象的属性
        switch (columnIndex) {
            case 0:
                lcJlLSB.setDirectionOne(getCellValueAsString(cell));
                break;
            case 1:
                lcJlLSB.setDirectionTow(getCellValueAsString(cell));
                break;
            case 3:
                lcJlLSB.setJlNumber(getCellValueAsString(cell));
                break;
            // ... 其他字段
        }
    }

    public void ImportYxJlLsb() throws IOException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        importJlLsb(1, YxJlLSB.class, (jlLSB, cell) -> {
            YxJlLSB yxJlLSB = (YxJlLSB) jlLSB;
            setYxJlLSBProperty(yxJlLSB, cell, cell.getColumnIndex());
            return yxJlLSB;
        }, 2);
    }

    private void setYxJlLSBProperty(YxJlLSB yxJlLSB, Cell cell, int columnIndex) {
        // 根据列索引设置对象的属性
        switch (columnIndex) {
            case 0:
                yxJlLSB.setDirectionOne(getCellValueAsString(cell));
                break;
            case 1:
                yxJlLSB.setDirectionTow(getCellValueAsString(cell));
                break;
            case 3:
                yxJlLSB.setJlNumber(getCellValueAsString(cell));
                break;
            // ... 其他字段
        }
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

git版本控制工具常用命令

一、本地仓库管理 push 向远程推送代码 pulll 拉取代码 二、远程仓库管理 三、分支操作 本地主分支master 远程主分支main head指向当前分支 查看&#xff1a;git branch 创建分支: git branch 名字 切换分支&#xff1a;git checkout 名字 合并分支&#xff1a;git…

CS4344国产替代音频DAC数模转换芯片DP7344采样率192kHz

目录 DAC应用简介DP7344简介结构框图DP7344主要特性微信号&#xff1a;dnsj5343参考原理图 应用领域 DAC应用简介 DAC&#xff08;中文&#xff1a;数字模拟转换器&#xff09;是一种将数字信号转换为模拟信号&#xff08;以电流、电压或电荷的形式&#xff09;的设备。电脑对…

收银系统源码-千呼新零售2.0【合作案例】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

MySQL数据库常见工具的基础使用_1

在上一篇文章中提到了对MySQL数据库进行操作的一些常见工具 mysqlcheck mysqlcheck是一个用于数据库表的检查&#xff0c;修复&#xff0c;分析和优化的一个客户端程序 分析的作用是查看表的关键字分布,能够让sql生成正确的执行计划(支持InnoDB,MyISAM,NDB)检查的作用是检查…

Java【springBoot和springCould引入外部jar包】

在项目的研发过程中&#xff0c;我们经常需要导入外部系统提供的jar包&#xff0c;并且这种jar包并没有上传到开源的maven仓库&#xff0c;属于内部环境的包&#xff0c;那么应该如何添加呢&#xff1f; springBoot 1、首先&#xff0c;将你的 JAR 文件拷贝到项目的 resource…

【k8s 控制器:ReplicaSet、Deployment、StatefulSet ...】

控制器 ReplicaSet、Deployment、StatefulSet 和 DaemonSet 都是 Kubernetes 中的控制器对象&#xff0c;用于管理 Pod 的创建、扩展、缩减和更新等操作。 一、Deployment 适用无状态服务应用部署&#xff1b;Deployment 是在 ReplicaSet 的基础上提供了更高级功能的控制器。它…

QT error: allocation of incomplete type ‘Ui::Server‘

目录 前言 报错内容&#xff1a; 过程解析&#xff1a; 原因分析&#xff1a; daisy.skye的博客 QT合集http://t.csdnimg.cn/wEVbu 前言 最近又开始需要做上位机了&#xff0c;要知道qt上位机对我来说已经3年没有接触了&#xff0c;最开始接触还是毕业时工作中的简单学习和…

C#WPF数字大屏项目实战06--报警信息

1、ItemsControl 简介 ItemsControl 是用来表示一些条目集合的控件&#xff0c;所以它叫条目控件&#xff0c;它的成员是一些其它控件的集合&#xff0c;其继承关系如下&#xff1a; 其常用的派生控件为&#xff1a;ListBox、ListView、ComboBox&#xff0c;为ItemsCo…

【预计IEEE出版】第四届电子信息工程与计算机技术国际学术会议(EIECT 2024)

第四届电子信息工程与计算机技术国际学术会议&#xff08;EIECT 2024&#xff09; 2024 4th International Conference on Electronic Information Engineering and Computer Technology 2024年11月15-17日 | 中国 深圳 #往届均已成功见刊、EI检索;先投稿&#xff0c;先送审…

智谱AI GLM4开源!快速上手体验

目录 前言 在线体验 模型链接及下载 模型推理 使用Transformers 大语言模型推理代码 多模态模型推理代码 使用vLLM推理 前言 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。 在语义、数学、推理、代码和知识等多方面的数据集测评中&#xff0c;…

视频批量剪辑技巧:轻松实现双视频同框播放,高效打造独特视觉盛宴!

在这个视频内容爆炸的时代&#xff0c;如何让自己的视频脱颖而出&#xff0c;吸引更多观众的眼球&#xff1f;答案就是创新&#xff01;而双视频同框播放&#xff0c;正是一种极具创意的视频剪辑方式。今天&#xff0c;我们就来聊聊如何通过批量剪辑技巧&#xff0c;轻松实现双…

牛客网刷题 | BC103 金字塔图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

C语言实战:贪吃蛇(万字详解)

&#x1f4a1;目录 效果图 界面设计思路 1. 基本布局 2. 视觉元素 游戏机制设计 基本规则 游戏代码 前期准备 游戏代码详解 数据结构设计 宏定义 数据结构定义 函数原型&#xff08;详见后文&#xff09; 主函数代码 核心代码 Review 效果图 界面设计思路 1. 基…

VMD-PSO-LSTM单维时序预测模型(单输入单输出)-附代码

VMD-PSO-LSTM单维时序预测模型&#xff08;单输入单输出&#xff09; 1&#xff09;首先对原始单维数据进行VMD分解&#xff0c;分解为K个模态分量和1个残差分量 2&#xff09;将各个模态分量输入模型&#xff0c;建立模型进行预测 3&#xff09;将各个预测结果相加得到最终…

Redis-02

redis安装包位置 /opt/redis-7.2.5 redis默认安装路径&#xff1a; 配置文件路径&#xff1a;/usr/local/bin/redisconfig gcc安装位置 /opt/rhwindows在D:\bs\code\Redis\Redis-x64-3.2.100目录下 启动&#xff1a;进入redis安装目录--->cmd打开--->输入"redis-s…

【面试笔记】C++ 软件开发工程师,智驾研发方向(非算法)

文章目录 1. 前言2. 基础问题2.1 什么是C++中的类?如何定义和实例化一个类?2.2 请解释C++中的继承和多态性。2.3 什么是虚函数?为什么在基类中使用虚函数?2.4 解释封装、继承和多态的概念,并提供相应的代码示例。2.5 如何处理内存泄漏问题?提供一些常见的内存管理技术。2…

【Java】数据加密

目录 数据加密介绍使用场景密码学历史古代密码学凯撒密码例子特点 维吉尼亚密码原理例子特点 现代密码学介绍 现代密码学的加密算法分类哈希算法优点缺点代码示例【封装写法】 对称加密算法对称加密算法的加密过程解密过程对称加密算法的优点&#xff1a;对称加密算法的缺点&am…

【C语言】结构体(及位段)

你好&#xff01;感谢支持孔乙己的新作&#xff0c;本文就结构体与大家分析我的思路。 希望能大佬们多多纠正及支持 &#xff01;&#xff01;&#xff01; 个人主页&#xff1a;爱摸鱼的孔乙己-CSDN博客 欢迎 互粉哦&#x1f648;&#x1f648;&#xff01; 目录 1. 声明结构…

LeetCode-43. 字符串相乘【数学 字符串 模拟】

LeetCode-43. 字符串相乘【数学 字符串 模拟】 题目描述&#xff1a;解题思路一&#xff1a;模拟乘法&#xff0c;两个数中每一位数相乘的时候乘上他们各自的进制数&#xff0c;之后求和。循环时&#xff0c;分别记录各自的进制数背诵版&#xff1a;解题思路三&#xff1a;0 题…

hcia datacom学习(12):vlan间路由

不同vlan相当于不同网段&#xff0c;如果vlan间没有三层技术&#xff0c;那么它们就无法互相通信。 vlan间路由可以有3种方式&#xff1a; 1.直接使用路由器转发 *路由器本身不需要额外设置&#xff0c;只需配置端口ip作为网关即可。 *路由器不能处理带有vlan标签的数据帧&a…