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

news2024/11/20 16:24:17

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

1、数据格式(两个Sheet)

 

2、代码

public static EngineerTunnelMonitorExcelVo importExcel(MultipartFile file){
        if(file.isEmpty()){
            return null;
        }

        EngineerTunnelMonitorExcelVo result=new EngineerTunnelMonitorExcelVo();

        //获取excel对象
        Workbook workbook= null;
        try {
            //获取excel
            workbook = new XSSFWorkbook(file.getInputStream());
            //获取工作簿

            /************************************主表**************************************/
            Sheet sheetAt = workbook.getSheetAt(0);
            //标题
            String titl = getMergedRegionValue(sheetAt, 1, 1);
            if(null!=titl && !"".equals(titl) && titl.contains("周边")){
                result.setTestPart(2);
            }else{
                result.setTestPart(1);
            }
            //项目名称
            result.setPointName(getMergedRegionValue(sheetAt,2 , 3));
            //施工单位名称
            result.setConstructionName(getMergedRegionValue(sheetAt, 2, 7));
            //围岩级别
            result.setWallRockLevel(getMergedRegionValue(sheetAt, 2, 10));
            //断面里程
            result.setFractureSurfaceMileage(getMergedRegionValue(sheetAt, 2, 13));
            //建立日期
            result.setBuildTime(getDataForExcel(getMergedRegionValue(sheetAt, 3,3)));
            //施工方法
            result.setConstructMethod(getMergedRegionValue(sheetAt, 3, 7));
            //观测方法
            result.setObservationMethod(getMergedRegionValue(sheetAt, 3, 10));
            //测点编号
            result.setTestCode(getMergedRegionValue(sheetAt, 3, 13));

            /************************************记录表子表**************************************/
            Integer rows=6;
            Integer index=1;
            ArrayList<EngineerTunnelMonitorRecordForRimExcelVo> list=new ArrayList<>();
            while (true){
                if(null==sheetAt.getRow(rows)){
                    break;
                }
                EngineerTunnelMonitorRecordForRimExcelVo engineerTunnelMonitorRecordForRimExcelVo=new EngineerTunnelMonitorRecordForRimExcelVo();
                engineerTunnelMonitorRecordForRimExcelVo.setTestTime(getDataForExcel(getCellData(sheetAt.getRow(rows).getCell(index))))
                                    .setTestTemp(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setSpaceTime(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setSpaceFirstTime(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setMeasureOne(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setMeasureTwo(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setMeasureThree(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setAvgValue(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setLastDown(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setFirstDown(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setDownRate(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setSpaceFace(getCellData(sheetAt.getRow(rows).getCell(++index)))
                                    .setManageLevel(getCellData(sheetAt.getRow(rows).getCell(++index)));

                list.add(engineerTunnelMonitorRecordForRimExcelVo);

                index=1;
                rows++;
            }

            /************************************分析表子表**************************************/
            Sheet sheetTwo = workbook.getSheetAt(1);
            EngineerTunnelMonitorAnalyseExcelVo engineerTunnelMonitorAnalyse = new EngineerTunnelMonitorAnalyseExcelVo();
            engineerTunnelMonitorAnalyse.setName(getMergedRegionValue(sheetTwo, 2, 3))
                    .setConstructionName(getMergedRegionValue(sheetTwo, 2, 7))
                    .setFractureSurfaceMileage(getMergedRegionValue(sheetTwo, 2, 10))
                    .setTestPart(getMergedRegionValue(sheetTwo, 3,3))
                    .setWallRockLevel(getMergedRegionValue(sheetTwo, 3, 7))
                    .setTestCode(getMergedRegionValue(sheetTwo, 3, 10))
                    .setFirstTime(getDataForExcel(getMergedRegionValue(sheetTwo, 4, 3)))
                    .setLastTime(getDataForExcel(getMergedRegionValue(sheetTwo, 4, 7)))
                    .setDataTaskTime(getDataForExcel(getMergedRegionValue(sheetTwo, 4, 10)))
                    .setRegressionEquation(getMergedRegionValue(sheetTwo, 5, 3))
                    .setCoefficientAssociation(getMergedRegionValue(sheetTwo, 5, 9))
                    .setDisplacementLevel(getMergedRegionValue(sheetTwo, 6, 3)+";"+getMergedRegionValue(sheetTwo, 8, 3))
                    .setRate(getMergedRegionValue(sheetTwo, 10, 3))
                    .setConclusion(getMergedRegionValue(sheetTwo, 13, 3));



            result.setEngineerTunnelMonitorRecordList(list);
            result.setEngineerTunnelMonitorAnalyse(engineerTunnelMonitorAnalyse);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return result;
    }



    /**
     * 获取合并单元格的值
     * @param sheet
     * @param row
     * @param column
     * @return
     */
    public static String getMergedRegionValue(Sheet sheet ,int row , int column){
        int sheetMergeCount = sheet.getNumMergedRegions();
        for(int i = 0 ; i < sheetMergeCount ; i++){
            CellRangeAddress ca = sheet.getMergedRegion(i);
            int firstColumn = ca.getFirstColumn();
            int lastColumn = ca.getLastColumn();
            int firstRow = ca.getFirstRow();
            int lastRow = ca.getLastRow();
            if(row >= firstRow && row <= lastRow){
                if(column >= firstColumn && column <= lastColumn){
                    Row fRow = sheet.getRow(firstRow);
                    Cell fCell = fRow.getCell(firstColumn);

                    return getCellData(fCell);
                }
            }
        }
        return null ;
    }

    //获取单元格内容
    public static String getCellData(Cell cell){
        String value="";
        if(null==cell){
            return value;
        }
        switch (cell.getCellType()) {
            case FORMULA:value = "" + cell.getCellFormula();
                break;
            case NUMERIC:value = "" + cell.getNumericCellValue();
                break;
            case STRING:value = cell.getStringCellValue();
                break;
            default:
                break;
        }
        return value;
    }

    //获取日期
    public static Date getDataForExcel(String val){
        try {
            if(StringUtils.isEmpty(val)){
                return null;
            }
           return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(val);
        } catch (Exception e) {
            double excelDate = Double.valueOf(val); // 示例 Excel 日期和时间数值
            long baseMillis = -2209017600000L; // 1900 年 1 月 1 日的毫秒数(注意 Excel 的 1900 年闰年错误,减去两天)
            // 计算日期和时间的毫秒数
            long millis = baseMillis + (long) (excelDate * 24 * 60 * 60 * 1000) - 172800000;
            // 创建 Date 对象
            return new Date(millis);
        }

    }

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

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

相关文章

从零开始理解Linux中断架构(19)--中断线程化irq_thread

前面一节讲到的中断流处理流程是在hard_irq 流程上&#xff0c;工作在中断堆栈上。还有一种情况是使用中断线程的情形。request_threaded_irq参数中有两个处理函数handler,thread_fn是有区别的。handler主中断处理例程&#xff0c;运行hard_irq 流程上。而如果驱动程序填写thre…

利用R分别绘制配对连线散点图、云雨图、山脊图

大家好&#xff0c;我是带我去滑雪&#xff01; 精美的科研绘图总会给人眼前一亮&#xff0c;今天学习利用R绘制多组配对连线散点图、云雨图、山脊图&#xff0c;这三幅图最近都曾出现在Nature Communications (IF 16.6)中&#xff0c;比如配对连线散点图&#xff0c;如下所示&…

AI智能助手的未来:与人类互动的下一代人工智能技术

自我介绍⛵ &#x1f4e3;我是秋说&#xff0c;研究人工智能、大数据等前沿技术&#xff0c;传递Java、Python等语言知识。 &#x1f649;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a;人工智能&#xff1a;创新无限、MySQL进阶之路、C刷题集、网络安…

AIGC文生图:使用ControlNet 控制 Stable Diffusion

1 ControlNet介绍 1.1 ControlNet是什么&#xff1f; ControlNet是斯坦福大学研究人员开发的Stable Diffusion的扩展&#xff0c;使创作者能够轻松地控制AI图像和视频中的对象。它将根据边缘检测、草图处理或人体姿势等各种条件来控制图像生成。 论坛地址&#xff1a;Adding…

操作系统进行设备控制的方式

一.I/O控制方式 上一篇的博客介绍了设备管理的一些概念基础知识点&#xff0c;其中I/O控制方式这一块没有详细说明。设备管理的主要任务之一是控制设备和内存或CPU之间的数据传送。外围设备和内存之间的输入/输出控制方式有4种&#xff0c;下面分别加以介绍。 二.程序直接控制…

ITIL 4—事件管理实践

1 关于本文 本文档提供事件管理实践实用指南。分为五个主要部分&#xff0c;内容包括&#xff1a; 本实践的一般信息实践的流程和活动及其在服务价值链中的作用参与实践的组织和人员支持实践的信息和技术对实践的合作伙伴和供应商的考虑。 1.1 ITIL4 认证方案 本文档的部分…

Ubuntu 安装 Docker

本文目录 1. 卸载旧版本 Docker2. 更新及安装工具软件2.1 更新软件包列表2.2 安装几个工具软件2.3 增加一个 docker 的官方 GPG key2.4 下载仓库文件 3. 安装 Docker3.1 再次更新系统3.2 安装 docker-ce 软件 4. 查看是否启动 Docker5. 验证是否安装成功 1. 卸载旧版本 Docker …

图片文字对齐 图片文字居中对齐

方法一: 用 vertical-align: middle; <view class="container"><view class="search"><image src="../../images/icon/search.png" alt="" /><text class="tex">搜索</text></view>&…

手写对象浅比较(React中pureComponent和Component区别)

PureComponent和Component的区别 PureComponent会给类组件默认加一个shouldComponentUpdate这样的周期函数 //PureComponent类似自动加了这段shouldComponentUpdate(nextProps,nextState){let { props, state } this;// props/state:修改之前的属性状态// nextProps/nextState…

layui入门增删改查

layui入门增删改查 创建Lauiyi对象1.后台准备1.dao方法2.子实现类 2.R工具类的使用3.查询前端代码实现前端页面 4.增删改实现2.浮层3分离的js代码1.userManage.js2.userEdit.js3.index.js 5.运行效果 作为一名开发人员&#xff0c;我们经常需要对数据库中的数据进行增删改查&am…

120、仿真-51单片机温湿度光照强度C02 LCD1602 报警设计(Proteus仿真+程序+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

刷题 DAY4

题目1 给定一个有序数组arr&#xff0c;给定一个正数aim (1)返回累加和为aim的&#xff0c;所有不同二元组 (2)返回累加和为aim的&#xff0c;所有不同三元组 问题一 暴力的解法就是 遍历每一个二元组 找和为aim的 当然 只用暴力解很难ac 想一想有序 那肯定就是能加速 我们…

RocketMQ下载安装、集群搭建保姆级教程

目录 1.下载安装 2.配置 3.测试 4.集群配置 4.1.规划 4.2.环境准备 4.3.节点配置 4.3.1.master1 4.3.2.slave2 4.3.3.master2 4.3.4.slave1 4.4.启动 4.5.测试 1.下载安装 前置条件&#xff1a; JDK环境 下载地址&#xff1a; 下载 | RocketMQ 博主下载的是4.…

排序算法笔记--摩尔投票算法

摩尔投票算法 摩尔投票算法是一种用于在数组中查找出现次数超过一半的元素的有效算法。算法的核心思想是利用候选元素和计数器进行投票&#xff0c;通过消除不同元素之间的抵消来找到出现次数超过一半的元素。 算法原理 如果数组中存在一个出现次数超过一半的元素&#xff0…

【从零开始学习CSS | 第三篇】选择器优先级

目录 前言&#xff1a; 常见选择器的优先级&#xff08;从高到低&#xff09; 选择器的权重&#xff1a; 总结&#xff1a; 前言&#xff1a; 在前几篇文章中我们介绍了大量的选择器&#xff0c;那么大量的选择器在使用的时候&#xff0c;一定是有一个优先级顺序的&#xff…

graylog源码搭建

这里主要讲如何源码安装graylog 下载地址&#xff1a; https://www.graylog.org/downloads/ 下载带有JVM的源码文件源码安装 下载graylog-5.1.3-linux-x64.tgz&#xff0c;并上传到Centos中&#xff0c;执行以下操作 tar -zxvf graylog-5.1.3-linux-x64.tgzcd /etcmkdir -p …

Python GUI编程利器:Tkinker中的颜色选择对话框(15)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日目标 学习Tkinter中的颜色对话框的使用&#xff0c;实现如下效果&#xff1a; 颜色选择对话框 颜色选择对话框可以提供一…

JavaWeb 笔记——6

JavaWeb 笔记——6 一、Vue1.1、Vue-概述1.2、Vue快速入门1.3、Vue常用指令1.3、Vue生命周期1.4、查询所有-案例1.5、新增品牌-案例 二、Element2.1、Element概述2.2、快速入门2.3、Element布局2.4、常用组件 三、综合案例3.1、换件搭建3.2、查询所有3.3、新增品牌3.4、Servlet…

集群基础2——LVS负载均衡apache(nat模式)

文章目录 一、环境说明一、配置调度器网卡二、配置后端服务器三、配置调度器四、验证五、设置https负载均衡 一、环境说明 使用lvs中的nat模型&#xff0c;对apache负载均衡集群。 主机IP角色安装服务真实IP&#xff1a;192.168.161.129VIP&#xff1a;192.168.161.130调度服务…

证照之星软件怎么样?证照之星怎么换背景色

随着科技的快速发展&#xff0c;越来越多的软件应用于各个方面&#xff0c;为人们的生活和工作带来便利。今天&#xff0c;我们要介绍的就是一款证件照制作方面的软件——证照之星。那么&#xff0c;证照之星到底是什么软件&#xff1f;它好用吗&#xff1f;这篇文章将为大家详…