如何在java xssf poi中移动列

时间:2014-01-10 08:00:58

标签: java excel apache-poi

如何将现有列数据和格式复制到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);   
        }   

    }

我能够将值从旧单元格复制到新单元格,但不会将现有列向右移动。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

我几年没有使用过POI,但是如果我没记错的话,你必须连续遍历所有单元格并更新每个Cell中的列号,使其成为你想要的。没有神奇的“插入列”方法。请记住从右到左执行此操作以避免完全破坏工作表: - )

答案 1 :(得分:1)

你可以参考这个[链接] https://poi.apache.org/apidocs/4.0/org/apache/poi/ss/usermodel/Sheet.html#shiftColumns-int-int-int-

想象表已经创建, 只需使用此 worksheet.shiftColumns(int startcol, int lastcol, int cols_to_be_moved);

worksheet.shiftColumns(0,13,1)

注意:

  • 索引从 0 开始。
  • lastcol 必须是您工作表的最后一列,在上述情况下,最后一列是 13
  • cols_to_be_moved 将决定要移动的列数,负数将向左移动

答案 2 :(得分:0)

我无法相信它不在API中。

您可以使用这两个方便的功能。我将在稍后尝试将PR发布到Apache POI。

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;
    }
}