java读取含有合并行的excel

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>

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

报表名称班次生产线站点编号设备区域报表状态检查项目检查方法填报方式标准值偏差值频次
import11lc12321检查项目1目测数值111
检查项目2填报文本222
检查项目3目测数值333
import22lc45621检查项目4目测数值444
检查项目5填报文本555
检查项目6目测数值666
import33lk721检查项目7目测数值777
import44lc78921检查项目8目测数值888
检查项目9填报文本999
检查项目10目测数值101010
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值