如何在Java XSSF POI中移动列

3
如何在Apache POI中将现有列数据和格式复制到下一列,并将下一列向右移动。
我尝试过这个。 假设我的代码是这样的...
XSSFCell oldCell = worksheet.getRow(0).getCell(1);
XSSFCell newCell =  worksheet.getRow(0).getCell(2);

if(styleMap != null) {   
        if(oldCell.getSheet().getWorkbook() == newCell.getSheet().getWorkbook()){   
            newCell.setCellStyle(oldCell.getCellStyle());   
        } else{   
            int stHashCode = oldCell.getCellStyle().hashCode();   
            XSSFCellStyle newCellStyle = styleMap.get(stHashCode);   
            if(newCellStyle == null){   
                newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();   
                newCellStyle.cloneStyleFrom(oldCell.getCellStyle());   
                styleMap.put(stHashCode, newCellStyle);   
            }   
            newCell.setCellStyle(newCellStyle);   
        }   

    }

我可以将旧单元格的值复制到新单元格,但它不会将现有列向右移动。

提前感谢您的帮助。


你的问题不够清晰。实际上发生了什么?第一列的值是否出现在第二列中?你上面的代码从未删除第一列的单元格? - Jim Garrison
谢谢您的回复。我的问题是如何在填充了上面代码的数据后移动列。- 是的,它出现了,但它覆盖了下一个单元格的数据。 - EurekaSThurston
3个回答

4

几年来我没有用过POI,但如果我记得正确的话,您必须遍历行中的所有单元格,并更新每个Cell中的列号以达到您想要的效果。没有什么魔法般的“插入列”方法。请记住,要从右到左进行此操作,以避免完全破坏工作表 :-)


3

我简直无法相信这个API中没有它。

你可以使用这两个方便的函数。我会尝试稍后向Apache POI提交PR(Pull Request)。

void shiftColumns(Row row, int startingIndex, int shiftCount) {
    for (int i = row.getPhysicalNumberOfCells()-1;i>=startingIndex;i--){
        Cell oldCell = row.getCell(i);
        Cell newCell = row.createCell(i + shiftCount, oldCell.getCellTypeEnum());
        cloneCellValue(oldCell,newCell);
    }
}

void cloneCellValue(Cell oldCell, Cell newCell) { //TODO test it
    switch (oldCell.getCellTypeEnum()) {
        case STRING:
            newCell.setCellValue(oldCell.getStringCellValue());
            break;
        case NUMERIC:
            newCell.setCellValue(oldCell.getNumericCellValue());
            break;
        case BOOLEAN:
            newCell.setCellValue(oldCell.getBooleanCellValue());
            break;
        case FORMULA:
            newCell.setCellFormula(oldCell.getCellFormula());
            break;
        case ERROR:
            newCell.setCellErrorValue(oldCell.getErrorCellValue());
        case BLANK:
        case _NONE:
            break;
    }
}

1
最近在发布的4.1.1版本中,Apache POI提供了一个API来移动列,但它仍处于测试阶段,并且不能按预期工作。 - Amol Suryawanshi
好主意,非常有帮助,在添加删除单元格功能后,可以按照我的需求进行工作。 - Steven Sun

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接