java读取含有合并行的excel

2023-11-18

excel格式如下:

 代码如下:

package com.example.demo.excel;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ExcelTest {


    public String addReportByExcel(InputStream inputStream, String fileName)
            {
        String message = "Import success";

        boolean isE2007 = false;    //格式判断
        if(fileName.endsWith("xlsx")){
            isE2007 = true;
        }

        int rowIndex = 0;
        int columnIndex = 0;
        try {
            InputStream input = inputStream;  //建立输入流
            Workbook wb  = null;
            if(isE2007){
                wb = new XSSFWorkbook(input);
            }else{
                wb = new HSSFWorkbook(input);
            }
            Sheet sheet = wb.getSheetAt(0);    //获得第一个表单

            //System.out.println("总行数:"+sheet.getLastRowNum());

            List<CellRangeAddress> cras = getCombineCell(sheet);
            int count = sheet.getLastRowNum()+1;//总行数

            List<InspectionReport> irs = new ArrayList<>();
            for(int i = 1; i < count;i++){
                rowIndex = i;
                Row row = sheet.getRow(i);
                InspectionReport ir = new InspectionReport();

                ir.setReportName(getCellValue(row.getCell(0)));
                ir.setShift(Double.valueOf(getCellValue(row.getCell(1))).intValue());
                ir.setLine(getCellValue(row.getCell(2)));
                ir.setStationCode(getCellValue(row.getCell(3)));
                ir.setArea(Double.valueOf(getCellValue(row.getCell(4))).intValue());
                ir.setReportStatus(Double.valueOf(getCellValue(row.getCell(5))).intValue());

                List<InspectionItem> items = new ArrayList<>();
                if(isMergedRegion(sheet,i,0)){
                    int lastRow = getRowNum(cras,sheet.getRow(i).getCell(0),sheet);

                    for(;i<=lastRow;i++){
                        row = sheet.getRow(i);
                        InspectionItem item = new InspectionItem();
                        item.setItem(getCellValue(row.getCell(6)));
                        item.setMethod(getCellValue(row.getCell(7)));
                        item.setMode(getCellValue(row.getCell(8)));
                        item.setStandardValue(getCellValue(row.getCell(9)));
                        item.setDeviationValue(getCellValue(row.getCell(10)));
                        String pinci = getCellValue(row.getCell(11));
                        Double d = Double.valueOf(pinci);
                        item.setFrequency(d.intValue());
                        items.add(item);
                    }
                    i--;
                }else{
                    row = sheet.getRow(i);
                    InspectionItem item = new InspectionItem();
                    item.setItem(getCellValue(row.getCell(6)));
                    item.setMethod(getCellValue(row.getCell(7)));
                    item.setMode(getCellValue(row.getCell(8)));
                    item.setStandardValue(getCellValue(row.getCell(9)));
                    item.setDeviationValue(getCellValue(row.getCell(10)));
                    String pinci = getCellValue(row.getCell(11));
                    Double d = Double.valueOf(pinci);
                    item.setFrequency(d.intValue());
                    items.add(item);
                }
                ir.setItems(items);
                irs.add(ir);

            }

            System.out.println(irs);


        } catch (Exception ex) {
            return "error"
        }
        return message;
    }

    /**
     * 获取单元格的值
     * @param cell
     * @return
     */
    public String getCellValue(Cell cell){
        if(cell == null) return "";
        if(cell.getCellType() == Cell.CELL_TYPE_STRING){
            return cell.getStringCellValue();
        }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
            return String.valueOf(cell.getBooleanCellValue());
        }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
            return cell.getCellFormula() ;
        }else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
            return String.valueOf(cell.getNumericCellValue());
        }
        return "";
    }
    /**
     * 合并单元格处理,获取合并行
     * @param sheet
     * @return List<CellRangeAddress>
     */
    public List<CellRangeAddress> getCombineCell(Sheet sheet)
    {
        List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();
        //获得一个 sheet 中合并单元格的数量
        int sheetmergerCount = sheet.getNumMergedRegions();
        //遍历所有的合并单元格
        for(int i = 0; i<sheetmergerCount;i++)
        {
            //获得合并单元格保存进list中
            CellRangeAddress ca = sheet.getMergedRegion(i);
            list.add(ca);
        }
        return list;
    }

    private int getRowNum(List<CellRangeAddress> listCombineCell,Cell cell,Sheet sheet){
        int xr = 0;
        int firstC = 0;
        int lastC = 0;
        int firstR = 0;
        int lastR = 0;
        for(CellRangeAddress ca:listCombineCell)
        {
            //获得合并单元格的起始行, 结束行, 起始列, 结束列
            firstC = ca.getFirstColumn();
            lastC = ca.getLastColumn();
            firstR = ca.getFirstRow();
            lastR = ca.getLastRow();
            if(cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR)
            {
                if(cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC)
                {
                    xr = lastR;
                }
            }

        }
        return xr;

    }
    /**
     * 判断单元格是否为合并单元格,是的话则将单元格的值返回
     * @param listCombineCell 存放合并单元格的list
     * @param cell 需要判断的单元格
     * @param sheet sheet
     * @return
     */
    public String isCombineCell(List<CellRangeAddress> listCombineCell,Cell cell,Sheet sheet)
            throws Exception{
        int firstC = 0;
        int lastC = 0;
        int firstR = 0;
        int lastR = 0;
        String cellValue = null;
        for(CellRangeAddress ca:listCombineCell)
        {
            //获得合并单元格的起始行, 结束行, 起始列, 结束列
            firstC = ca.getFirstColumn();
            lastC = ca.getLastColumn();
            firstR = ca.getFirstRow();
            lastR = ca.getLastRow();
            if(cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR)
            {
                if(cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC)
                {
                    Row fRow = sheet.getRow(firstR);
                    Cell fCell = fRow.getCell(firstC);
                    cellValue = getCellValue(fCell);
                    break;
                }
            }
            else
            {
                cellValue = "";
            }
        }
        return cellValue;
    }

    /**
     * 获取合并单元格的值
     * @param sheet
     * @param row
     * @param column
     * @return
     */
    public 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 getCellValue(fCell) ;
                }
            }
        }

        return null ;
    }


    /**
     * 判断指定的单元格是否是合并单元格
     * @param sheet
     * @param row 行下标
     * @param column 列下标
     * @return
     */
    private boolean isMergedRegion(Sheet sheet,int row ,int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress range = sheet.getMergedRegion(i);
            int firstColumn = range.getFirstColumn();
            int lastColumn = range.getLastColumn();
            int firstRow = range.getFirstRow();
            int lastRow = range.getLastRow();
            if(row >= firstRow && row <= lastRow){
                if(column >= firstColumn && column <= lastColumn){
                    return true;
                }
            }
        }
        return false;
    }

}

实体类如下

package com.example.demo.excel;

import lombok.Data;

import java.util.List;
@Data
public class InspectionReport {

    private String reportName;

    private Integer shift;

    private String line;

    private String stationCode;

    private Integer area;

    private Integer reportStatus;

    private List<InspectionItem> items;
}

package com.example.demo.excel;

import lombok.Data;

@Data
public class InspectionItem {

    private String item;

    private String method;

    private String mode;

    private String standardValue;

    private String deviationValue;

    private Integer frequency;
}

pom文件引入poi:

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>

由于上传不了表格,我复制了贴上来给你们

报表名称 班次 生产线 站点编号 设备区域 报表状态 检查项目 检查方法 填报方式 标准值 偏差值 频次
import1 1 lc 123 2 1 检查项目1 目测 数值 1 1 1
检查项目2 填报 文本 2 2 2
检查项目3 目测 数值 3 3 3
import2 2 lc 456 2 1 检查项目4 目测 数值 4 4 4
检查项目5 填报 文本 5 5 5
检查项目6 目测 数值 6 6 6
import3 3 lk 7 2 1 检查项目7 目测 数值 7 7 7
import4 4 lc 789 2 1 检查项目8 目测 数值 8 8 8
检查项目9 填报 文本 9 9 9
检查项目10 目测 数值 10 10 10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java读取含有合并行的excel 的相关文章

随机推荐

  • html 常用知识点

    段落 h3 登黄鹤楼 h3 p 白日依山尽 p p 黄河入海流 p 跳转页面 a href http www daidu com target blank title 欢迎登陆 a href 链接的地址 target 打开页面的方式 tit
  • do while(0)的妙用

    do while 0 的妙用 do while 0 就如同一个花括号 具有独立的作用域 花括号所表示的符合语句是一个整体 do while 语句同样是一个整体 同样可以在if 等条件语句后直接使用 但是后所不同的是 do while 作为循
  • Mac 解决 command not found: mysql

    首先检查下面的目录中是否有mysql命令 cd usr local mysql bin 如果有的话 使用 echo export PATH PATH usr local mysql bin gt gt zshrc 即可解决 参考链接 htt
  • Ubuntu关闭无用服务

    linux的各大发行版 都有些不必要的服务被默认开启了 针对ubuntu 我们可以采用选择性关闭的方法加速起动 提高系统性能 这里我们安装一个软件 sudo apt get install sysv rc conf 然后这样起动 sudo
  • 力扣动态规划专题(一)背包理论基础 基础动规题 动规注意点 步骤及C++实现

    文章目录 动态规划 509 斐波那契数 五步骤 代码 70 爬楼梯 五步骤 代码 746 使用最小花费爬楼梯 五步骤 代码 扩展 62 不同路径 动态规划 数论 63 不同路径 II 五步骤 代码 343 整数拆分 五步骤 代码 96 不同
  • 什么是servlet?servlet有什么用?

    servlet概述 什么是servlet servlet有什么用 servlet是java编写的服务器端的程序 运行在web服务器中 作用 接收用户端发来的请求 调用其他java程序来处理请求 将处理结果 返回到服务器中 servlet的生
  • Weblogic - Socket Muxers in Thread Dumps

    What are these weblogic socket Muxer threads seen in thread dumps Note for a basic primer on taking thread dumps and ana
  • UE4 C++学习笔记之初识时间轴,定时器

    任务 在场景中做一个开关门 角色踩上开关后 门打开 离开开关2s后门自动关闭 第一步 新建一个C Actor类命名为DoorSwitch 并编写相应代码 DoorSwitch h代码如下 Fill out your copyright no
  • Loadrunner自带的网站WebTours打不开

    不少人在打开LR示例页面的时候会显示如下错误 Internal error your request was unsuccessful Cannot create CGI process program not found 解决方法 打开W
  • 汇编——单字符输入输出+字符串输入输出(换行实现)

    单字符输入输出 默认采用ML6 11汇编程序 DATAS SEGMENT CHAR DB CHAR存储输入的字符 CHANGELINE DB 13 10 用来表示换行符 DATAS ENDS STACKS SEGMENT DB 128 DU
  • HK32F030MF4P6 实现PAout(xx)/PAin(xx)

    需要将此代码加进程序中即可 ifdef cplusplus extern C endif typedef struct u16 bit0 1 u16 bit1 1 u16 bit2 1 u16 bit3 1 u16 bit4 1 u16 b
  • 保姆级python入门教程(非常详细),从零基础入门到精通,从看这篇开始!

    一 初聊Python 文末有惊喜福利 1 为什么要学习Python 在学习Python之前 你不要担心自己没基础或 脑子笨 我始终认为 只要你想学并为之努力 就能学好 就能用Python去做很多事情 在这个喧嚣的时代 很多技术或概念会不断兴
  • 华为OD机试 - 找出两个整数数组中同时出现的整数(Java )

    题目描述 现有两个整数数组 需要你找出两个数组中同时出现的整数 并按照如下要求输出 有同时出现的整数时 先按照同时出现次数 整数在两个数组中都出现并目出现次数较少的那个 进行归类 然后按照出现次数从小到大依次按行输出 没有同时出现的整数时
  • 什么是Ntrip?Ntrip协议简介

    文章目录 Ntrip通讯协议1 0 Ntrip是什么 Ntrip系统组成 NtripServer NtripClient 4 1 获取源列表 4 2 获取差分数据 其他资料 Ntrip通讯协议1 0 Ntrip是什么 NTRIP是在互联网上
  • 可能是把Docker的概念讲的最清楚的一篇文章

    编者的话 本文只是对Docker的概念做了较为详细的介绍 并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令 Docker是世界领先的软件容器平台 所以想要搞懂Docker的概念我们必须先从容器开始说起 如果你想和更多
  • 【Python开发】Flask中的单点登录解决方案

    Flask中的单点登录解决方案 1 SSO 和 CAS 单点登录 Single Sign On SSO 就是通过用户的一次性鉴别登录 当用户在身份认证服务器上登录一次以后 即可获得访问单点登录系统中其他关联系统和应用软件的权限 同时这种实现
  • win10下载与安装mysql详细步骤

    下载mysql 下载地址 https dev mysql com downloads mysql 5 1 html downloads 下载完以后 解压到自己想要安装的目录下 文件如下图所示 配置环境 右击 此电脑 选中 属性 点击 高级系
  • Buuctf Exec

    打开该靶机 发现该页面为一个ping页面 输入127 0 0 1测试 发现和电脑cmd上ping的结果差不多 分析一下ping小技巧 的区别 A B 简单的拼接 A B之间无制约关系 A B A执行成功 然后才会执行B A B A的输出 作
  • SQL语句用法大全

    SQL Structured Query Language 是一个对数据库进行增删改查的语言 不过这玩意儿还是挺难理解的 所以我就写了这篇文章 希望能帮助到您 为了方便阐述 我做了以下表格作为数据表进行演示 ABOUT NAME char
  • java读取含有合并行的excel

    excel格式如下 代码如下 package com example demo excel import org apache poi hssf usermodel HSSFWorkbook import org apache poi ss