我是靠谱客的博主 怕孤独小懒虫,最近开发中收集的这篇文章主要介绍POI进行Excel的合并单元格数据处理POI进行Excel的合并单元格数据处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

POI进行Excel的合并单元格数据处理

近日接到一个要处理合并Excel单元格的上料表的需求,就到网上找了一些模板,发现有的技术大牛还是挺厉害的,对他们致以敬意。

合并单元格工具类

在这个类中将传入的文件转化成流对象,再对其进行具体的数据处理

public class ExcelUtilsMerge {


    public static Map<String, Object> readFileContentToEntity(InputStream inputStream) {
        Map<String, Object> excelMap = new HashMap<>(16);
        List<List<ExcelEntity>> result = new ArrayList<>();
        Workbook wb = null;
        try {
            wb = WorkbookFactory.create(inputStream);
        } catch (IOException e) {
        }
        if (wb == null) {
            return excelMap;
        }
        // 获取excel中存在的sheet个数
        int sheetsNum = wb.getNumberOfSheets();
        if (sheetsNum <= 0) {
            return excelMap;
        }
        for (int i = 0; i < sheetsNum; i++) {
            Sheet sheet = wb.getSheetAt(i);
            // 读取excel数据
            if (sheet.getPhysicalNumberOfRows() <= 0) {
                continue;
            }

            int coloumNum = sheet.getRow(0).getPhysicalNumberOfCells();
            result.addAll(dealWithExcelSheet(sheet));
            // 列总数
            excelMap.put("totalColumnNumber", coloumNum);
            // 数据集
            excelMap.put("data", result);
        }
        return excelMap;
    }

    /**
     * @Description: 读取sheet中的数据
     * @author: drj
     * @date: 2019/5/22 17:14
     */
    private static List<List<ExcelEntity>> dealWithExcelSheet(Sheet sheet) {
        List<List<ExcelEntity>> result = new ArrayList<>();
        // 遍历sheet行
        for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
            List<ExcelEntity> record = new ArrayList<>();
            Row row = sheet.getRow(i);  //首先獲取Excel的行
            // 遍历行中的没有个单元格
            if (row == null || row.getPhysicalNumberOfCells() <= 0) {
                continue;
            }
            //循環列
            for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
                Cell cell = row.getCell(j);  //獲取沒個單元的值
                if (cell == null) {
                    continue;
                }
                // 读取单元格数据格式(标记为字符串)
                cell.setCellType(CellType.STRING);
                String value = cell.getStringCellValue();
                // 处理有值的cell
                if (StringUtils.isEmpty(value)) {
                    continue;
                }
                try {
                    value = value.trim();
                    ExcelEntity entity = new ExcelEntity();  //初始化封裝好的返回Excel實體類
                    // 起始行数
                    entity.setStartRow(i);
                    // 结束行数
                    entity.setEndRow(getMergeRowNum(cell, sheet) + i - 1);  //加上当前行数,因为获取的当前行数加了1,所以要减1
                    // 起始列数
                    entity.setStartCol(j);
                    // 结束列数
                    entity.setEndCol(getMergeColumNum(cell, sheet) + j - 1); //加上当前列数,因为获取的当前列数加了1,所以要减1
                    // 单元格数据
                    entity.setValue(value); //将获取的值添加Value里
                    record.add(entity);
                } catch (NumberFormatException e) {
                }
            }
            result.add(record);
        }
        return result;
    }

    /**
     * @param cell  当前cell
     * @param sheet 当前sheet
     * @Description: 获取当前cell合并的行数
     * @author: drj
     * @date: 2019/5/22 18:00
     */
    public static int getMergeRowNum(Cell cell, Sheet sheet) {
        int mergeSize = 1;
        List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();   //獲取的是合併的區域
        for (CellRangeAddress cellRangeAddress : mergedRegions) {   //對合併區域進行循環
            if (cellRangeAddress.isInRange(cell)) {   //判斷傳入單元格是否在合併區域中
                //获取合并的行数
                mergeSize = cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow() + 1;
                break;
            }
        }
        return mergeSize;
    }

    /**
     * @param cell  当前cell
     * @param sheet 当前sheet
     * @Description: 获取合并的列数
     * @author: drj
     * @date: 2019/5/22 17:59
     */
    public static int getMergeColumNum(Cell cell, Sheet sheet) {
        int mergeSize = 1;
        List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
        for (CellRangeAddress cellRangeAddress : mergedRegions) {
            if (cellRangeAddress.isInRange(cell)) {
                //获取合并的列数
                mergeSize = cellRangeAddress.getLastColumn() - cellRangeAddress.getFirstColumn() + 1;
                break;
            }
        }
        return mergeSize;
    }
}

返回的Excel对象实体类

这个类定义了要返回的结果集对象,封装了开始行结束行,开始列结束列,以及单元格的值.

public class ExcelEntity {

    /**
     * 开始行
     */
    private int startRow;
    /**
     * 结束行
     */
    private int endRow;
    /**
     * 开始列
     */
    private int startCol;
    /**
     * 结束列
     */
    private int endCol;
    /**
     * 单元格值
     */
    private String value;

    public int getStartRow() {
        return startRow;
    }

    public void setStartRow(int startRow) {
        this.startRow = startRow;
    }

    public int getEndRow() {
        return endRow;
    }

    public void setEndRow(int endRow) {
        this.endRow = endRow;
    }

    public int getStartCol() {
        return startCol;
    }

    public void setStartCol(int startCol) {
        this.startCol = startCol;
    }

    public int getEndCol() {
        return endCol;
    }

    public void setEndCol(int endCol) {
        this.endCol = endCol;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

测试类

返回的结果集的数据类型是List,然后每一行封装为一个类型为ExcelEntity的List.

        InputStream inputStream = file.getInputStream();
        Map<String, Object> result = ExcelUtilsMerge.readFileContentToEntity(inputStream);
        List<List<ExcelEntity>> data = (List<List<ExcelEntity>>) result.get("data");

网上的技术点琳琅满目,而在这样杂而乱的网络环境中,亦要吸取其精华,让它变为自己的东西,这才是真正的学习~

最后

以上就是怕孤独小懒虫为你收集整理的POI进行Excel的合并单元格数据处理POI进行Excel的合并单元格数据处理的全部内容,希望文章能够帮你解决POI进行Excel的合并单元格数据处理POI进行Excel的合并单元格数据处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部