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

首先是公共方法

    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;
            // ... 其他字段
        }
    }

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

D435相机结合Yolo V8识别出目标物体,并转点云出抓取位姿。

最近项目上需要完成整个识别、定位、到最后的抓取流程。 分享一下&#xff0c;通过使用D435相机并结合Yolo V8识别出目标物体后&#xff0c;抠取出目标物体部分的有效深度图&#xff0c;最后将前景物体部分的RGB D435相机结合Yolo V8识别出目标物体&#xff0c;并转点云出抓取位…

mac虚拟光驱工具:Daemon Tools for Mac

Daemon Tools for Mac是一款功能强大的虚拟光驱工具&#xff0c;它为用户提供了在Mac上模拟物理光驱的能力&#xff0c;从而方便用户处理各种光盘映像文件。以下是关于Daemon Tools for Mac的详细介绍&#xff1a; 守护进程工具&#xff1a;Daemon Tools不仅是一个简单的虚拟光…

废品回收小程序开发,助力商家拓展回收市场

随着互联网的快速发展&#xff0c;废品回收行业也走向了数字化发展&#xff0c;废品回收小程序成为了拓展市场的重要方式。在当下万亿元下的回收市场中&#xff0c;废品回收小程序的发展也能够发挥重要作用&#xff0c;提高市场回收效率&#xff0c;提高大众的回收意识&#xf…

前端 Web 与原生应用端 WebView 通信交互 - HarmonyOS Next

基于鸿蒙 HarmonyOS Next 与前端 Vue 通信交互相关小结; DevEco Studio NEXT Developer Preview2 Vue js 两端相互拟定好协议后,通过前端页面的点击事件,将所需的数据传输给原生移动端组件方法中,处理后将消息回传至前端. 根据官方文档的案例尝试,但没成功 ... 后经过几经尝试…

github删除某个仓库

在GitHub上删除一个仓库&#xff0c;按照以下步骤操作&#xff1a; 1、登录到GitHub账户。 2、导航到想要删除的仓库页面。 3、点击仓库页面上的"Settings"&#xff08;设置&#xff09;选项卡。 4、向下滚动到页面底部&#xff0c;找到"Danger Zone"&…

【Linux多线程】LWP和pthread_t

文章目录 LWPclone系统调用查看线程LWP理解LWP与TID pthread_id LWP LWP是Linux中线程的具体实现形式&#xff0c;在linux中&#xff0c;进程和线程本质上都是相同的&#xff0c;都是通过task_struct结构体来表示的。LWP是内核级线程&#xff0c;TID是其唯一标识符&#xff0c…

Day43 代码随想录打卡|二叉树篇---左叶子之和

题目&#xff08;leecode T404&#xff09;&#xff1a; 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 方法&#xff1a; 迭代法&#xff1a;计算所有的左叶子节点&#xff0c;那我们就必然要找到所有的左叶子节点。那么怎么找呢&#xff1f;如何针对cur->l…

电路分析答疑 1

三要素法求解的时候&#xff0c; 电容先求U&#xff0c;再利用求导求I 电感先求I&#xff0c;再利用求导求U 若I的头上没有点点&#xff0c;那就是求有效值 叠加定理&#xff0c;不要忘记 若电流值或者电压值已经给出来了&#xff0c;那就说明这一定是直流电。 在画画圈的时候…

【Qt】Qt Style Sheets (QSS) 指南:打造个性化用户界面

文章目录 前言&#xff1a;1. QSS 选择器2. 子控件选择器&#xff08;Sub-Controls&#xff09;2.1. 示例&#xff1a;给 QComboBox 给下拉按钮加上图标2.2. 示例&#xff1a;修改进度条颜色 3. 伪类选择器3.1. 代码示例: 设置按钮的伪类样式.3.2. 代码示例: 使用事件方式实现同…

超级羊毛!Splashtop SOS 远程软件免费用!

​作为新时代的 IT 青年&#xff0c;您是否经常被亲朋好友、同事、客户们请求帮助解决各种电脑、手机问题&#xff1f;您是否需要一个免费好用的远程支持软件&#xff1f; 机会来了&#xff0c;我们现在免费送您一年专业商业远程支持软件——Splashtop SOS&#xff0c;价值990…

计算病理学的视觉语言基础模型| 文献速递-视觉通用模型与疾病诊断

Title 题目 A visual-language foundation model for computational pathology 计算病理学的视觉语言基础模型 01 文献速递介绍 数字病理学的快速普及和深度学习的进步使得可以开发出针对各种疾病和患者群体的各种病理学任务的强大模型。然而&#xff0c;由于医学领域标签…

windows下 Qt 操作xlsx 和 csv

需求: 工作中遇到一个需求,有两张表格,一个xlsx表,一个csv表格,格式如下: 以csv表格中船台标识为基础,读取xlsx中的数据,如果存在该MMSI则把船名写道csv中对应船名的后面,不存在的话,则添加进csv中,合并两个表格。由于表格数据非常多,有十几万个,所以只能通过程序…

ClickHouse内幕(1)数据存储与过滤机制

本文主要讲述ClickHouse中的数据存储结构&#xff0c;包括文件组织结构和索引结构&#xff0c;以及建立在其基础上的数据过滤机制&#xff0c;从Part裁剪到Mark裁剪&#xff0c;最后到基于SIMD的行过滤机制。 数据过滤机制实质上是构建在数据存储格式之上的算法&#xff0c;所…

GNN与Transformer创新结合!模型性能起飞!

前言 近年来&#xff0c;图神经网络&#xff08;GNN&#xff09;和Transformer模型分别凭借其独到的优势&#xff0c;在处理复杂数据结构和识别序列间的相互依赖性方面取得了突破性进展&#xff0c;这些优势使得GNN和Transformer的结合成为图表示学习领域的一个有前景的研究方…

微信小程序实现图生图(AI动漫特效)效果代码(触站API)

1.效果 触站AI图生图 2.本次用的是触站平台的API,我申请的适用积分,有水印(博主没钱)。如果需要没有水印的可以去买他们的资源包 3.首先我们需要去触站官网平台注册/登录账号(已注册可跳过该步骤) 4.开通API权限 我们可以在主页看到自己免费获取的500积分,用于接口调用…

Echarts 中type是value的X轴在设置了interval间隔后没有展示

文章目录 问题分析问题 Echarts中type是value的X轴在设置了interval间隔后没有展示 分析 之前代码是这样写的:axisLabel 属性中设置了 interval ,但未起作用,原因如下 在 ECharts 中,interval 属性是用于类目型(category)轴的刻度间隔设置,并不适用于数值型(value)…

2024会声会影激活码免费注册码大揭秘!

在当今数字化时代&#xff0c;视频编辑已经成为了许多人日常生活和工作中不可或缺的一部分。无论是制作短视频、Vlog还是专业影视剪辑&#xff0c;一款优秀的视频编辑软件都能让我们事半功倍。而市面上众多的视频编辑软件中&#xff0c;会声会影无疑是备受瞩目的一款。本文将为…

如何将华为Ascend手机的短信和联系人安全传输到电脑

华为Ascend系列手机以其流畅的使用体验、光滑的触感以及轻巧的设计赢得了市场的青睐。不仅如此&#xff0c;Ascend系列手机还以亲民的价格和出色的用户体验&#xff0c;搭载了众多先进功能&#xff0c;如Ascend P6的4.7英寸大屏、海思四核处理器、2GB RAM和800万像素摄像头等。…

3 - 大的国家(高频 SQL 50 题基础版)

3.大的国家 -- 查询属性&#xff1a;国家名称、人口和面积 select name,population,area fromWorld where area>3000000 OR population>25000000;

【启明智显分享】Model3A 7寸彩屏应用于智能中控屏解决方案

比尔盖茨曾在出版的《未来之路》中预言&#xff1a;“在不远的未来&#xff0c;没有智能家居系统的住宅会像不能上网的住宅一样不合潮流”。随着5G时代的到来&#xff0c;国内十几万家企业竞逐智能家居的产业赛道。智能家居的风口已然到来&#xff0c;智能家居产品也不断进行升…