导入excel 文件解析,一行数据,有一列分两行显示,解析时如何 合为一行?

来源:互联网 发布:哪个看书软件全部免费 编辑:程序博客网 时间:2024/06/03 18:10

现象如图

实现代码:

1主方法测试

public static void main(String[] args) throws FileNotFoundException, IOException {
        if (args.length < 1) {
            System.out.println("请提供Excel文件名作为参数。");
            System.exit(-1);
        }
        String fileName = args[0];
        FileInputStream fis = new FileInputStream(fileName);
        POIFSFileSystem fs = new POIFSFileSystem(fis);
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFSheet ns = MergeRows(sheet, 2, 0);
        wb.write(new FileOutputStream(fileName + "1.xls"));
    }


2实现方法

/**
     * @param sheet
     *            需要处理的ExcelSheet
     * @param startRow
     *            开始行
     * @param checkColumn
     *            进行合并行的依据列,即如果该行的值不为空则需要保留,如果为空则需要将内容合并至上端非空的行
     * @return
     */
    public static HSSFSheet MergeRows(HSSFSheet sheet, int startRow, int checkColumn) {
        ExcelReader excelReader = new ExcelReader();
        HSSFSheet newSheet = sheet.getWorkbook().createSheet(UUIDGenerator.getUUID());
        if (sheet.getLastRowNum() == 0 && sheet.getRow(0) == null || startRow < 0 || checkColumn < 0
                || checkColumn > sheet.getPhysicalNumberOfRows()) {
            // 空表同样返回空表
            // 无效起始行
            // 无效判断列
            return newSheet;
        }
        {
            // 复制表头
            for (int i = 0; i < startRow && i < (sheet.getLastRowNum() + 1); i++) {
                HSSFRow newRow = newSheet.createRow(i);
                if (sheet.getRow(i) == null) {
                    continue;
                }
                Iterator<Cell> it = sheet.getRow(i).cellIterator();
                while (it.hasNext()) {
                    Cell cell = (Cell) it.next();
                    if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
                        // 合并数据,并且开始行非当前行,忽略,继续下一个单元格
                        continue;
                    }
                    String v = excelReader.getCellFormatValue((HSSFCell) cell);
                    if (v != null && v.length() > 0) {
                        // 非空单元格,复制至新的Sheet
                        newRow.createCell(cell.getColumnIndex()).setCellValue(v);
                    }
                }
            }
        }

        {
            // 如果checkColumn的值不为空,则创建新的行,否则直接添加至最后一行
            HSSFRow rowNew = null;
            for (int i = startRow; i < sheet.getLastRowNum() + 1; i++) {
                HSSFRow rowOrg = sheet.getRow(i);
                HSSFCell checkCell = rowOrg.getCell(checkColumn);
                String checkCellValue = excelReader.getCellFormatValue(checkCell);
                if (!StringUtils.isHaveNullOrBlankTrim(checkCellValue)) {
                    if (newSheet.getRow(newSheet.getLastRowNum()) == null) {
                        rowNew = newSheet.createRow(newSheet.getLastRowNum());
                    } else {
                        rowNew = newSheet.createRow(newSheet.getLastRowNum() + 1);
                    }
                    // 复制本行的值
                    Iterator<Cell> it = rowOrg.cellIterator();
                    while (it.hasNext()) {
                        Cell cell = (Cell) it.next();
                        if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
                            // 合并数据,并且开始行非当前行,忽略,继续下一个单元格
                            continue;
                        }
                        String v = excelReader.getCellFormatValue((HSSFCell) cell);
                        if (v != null && v.length() > 0) {
                            // 非空单元格,复制至新的Sheet
                            rowNew.createCell(cell.getColumnIndex()).setCellValue(v);
                        }
                    }
                } else {
                    // 关键列值为空,需要将本行数据合并至最后一行
                    if (rowNew != null) {
                        Iterator<Cell> it = rowOrg.cellIterator();
                        while (it.hasNext()) {
                            Cell cell = (Cell) it.next();
                            if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
                                // 合并数据,并且开始行非当前行,忽略,继续下一个单元格
                                continue;
                            }
                            String v = excelReader.getCellFormatValue((HSSFCell) cell);
                            if (v != null && v.length() > 0) {
                                // 非空单元格,创建或追加至新的Sheet
                                HSSFCell c = rowNew.getCell(cell.getColumnIndex());
                                if (c == null) {
                                    rowNew.createCell(cell.getColumnIndex()).setCellValue(v);
                                } else {
                                    c.setCellValue(excelReader.getCellFormatValue(c) + v);
                                }
                            }
                        }
                    }
                }
            }
        }
        return newSheet;
    }


笑图:



原创粉丝点击