XSSF无法复制样式(POI)

时间:2013-08-08 11:14:16

标签: java apache-poi

无法将.xlsx文件中的“STYLE”复制到另一个文件。

以下是我正在使用的代码。

 public static void copyCell(XSSFCell oldCell, XSSFCell newCell, Map<Integer, XSSFCellStyle> styleMap) {     
    if(styleMap != null) {     
        if(oldCell.getSheet().getWorkbook() .equals( 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);     
        }     
    }     
    switch(oldCell.getCellType()) {     
        case XSSFCell.CELL_TYPE_STRING:     
            newCell.setCellValue(oldCell.getStringCellValue());     
            break;     
      case XSSFCell.CELL_TYPE_NUMERIC:     
            newCell.setCellValue(oldCell.getNumericCellValue());     
            break;     
        case XSSFCell.CELL_TYPE_BLANK:     
            newCell.setCellType(XSSFCell.CELL_TYPE_BLANK);     
            break;     
        case XSSFCell.CELL_TYPE_BOOLEAN:     
            newCell.setCellValue(oldCell.getBooleanCellValue());     
            break;     
        case XSSFCell.CELL_TYPE_ERROR:     
            newCell.setCellErrorValue(oldCell.getErrorCellValue());     
            break;     
        case XSSFCell.CELL_TYPE_FORMULA:     
            newCell.setCellFormula(oldCell.getCellFormula());     
            break;     
        default:     
            break;     
    }     

}     

与HSSF相同,即.xls文件,但不适用于XSSF(.xlsx)

请提供一些建议或示例代码来解决此问题。

3 个答案:

答案 0 :(得分:7)

我认为这个问题产生的问题是:

    XSSFCellStyle newCellStyle = styleMap.get(stHashCode);

通过此声明,您基本上是在说newCellStyle = oldCellStyle。但是,在这种情况下,oldCellStyle链接到另一个工作簿,当您打开文件时会出现错误,因为链接已损坏。

只需使用您的代码,删除该语句和测试,它应该可以正常工作:

    newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();     
    newCellStyle.cloneStyleFrom(oldCell.getCellStyle());     
    styleMap.put(stHashCode, newCellStyle);     

答案 1 :(得分:1)

这是 cloneStyleFrom

中的错误

花了很多时间后,我最终得到了这段丑陋的代码:

 private static void copyCellStyle(HSSFCell cell, HSSFCellStyle newCellStyle) {
    newCellStyle.setAlignment(cell.getCellStyle().getAlignment());
    newCellStyle.setBorderBottom(cell.getCellStyle().getBorderBottom());
    newCellStyle.setBorderLeft(cell.getCellStyle().getBorderLeft());
    newCellStyle.setBorderRight(cell.getCellStyle().getBorderRight());
    newCellStyle.setBorderTop(cell.getCellStyle().getBorderTop());
    newCellStyle.setBottomBorderColor(cell.getCellStyle().getBottomBorderColor());
    newCellStyle.setDataFormat(cell.getCellStyle().getDataFormat());
    newCellStyle.setFillBackgroundColor(cell.getCellStyle().getFillBackgroundColor());
    newCellStyle.setFillForegroundColor(cell.getCellStyle().getFillForegroundColor());
    newCellStyle.setFillPattern(cell.getCellStyle().getFillPattern());
    newCellStyle.setFont(cell.getCellStyle().getFont(cell.getSheet().getWorkbook()));
    newCellStyle.setHidden(cell.getCellStyle().getHidden());
    newCellStyle.setIndention(cell.getCellStyle().getIndention());
    newCellStyle.setLeftBorderColor(cell.getCellStyle().getLeftBorderColor());
    newCellStyle.setLocked(cell.getCellStyle().getLocked());
    newCellStyle.setRightBorderColor(cell.getCellStyle().getRightBorderColor());
    newCellStyle.setRotation(cell.getCellStyle().getRotation());
    newCellStyle.setShrinkToFit(cell.getCellStyle().getShrinkToFit());
    newCellStyle.setTopBorderColor(cell.getCellStyle().getTopBorderColor());
    // newCellStyle.setUserStyleName(cell.getCellStyle().getUserStyleName()); -> ignore
    newCellStyle.setVerticalAlignment(cell.getCellStyle().getVerticalAlignment());
    newCellStyle.setWrapText(cell.getCellStyle().getWrapText());
}

答案 2 :(得分:0)

为什么需要复制CellStyle? 至于我所理解的,你想要将相同的样式应用于两个单元格,可能在几个工作簿中。如果是这种情况,我会复制单元格值,并将相同(预定义)样式应用于两个单元格。