6

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

这是我正在使用的代码。

 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)

请给出一些建议或示例代码来解决这个问题。

4

3 回答 3

8

我相信这个问题是由这个声明产生的:

    XSSFCellStyle newCellStyle = styleMap.get(stHashCode);

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

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

    newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();     
    newCellStyle.cloneStyleFrom(oldCell.getCellStyle());     
    styleMap.put(stHashCode, newCellStyle);     
于 2013-08-09T07:01:57.680 回答
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());
}
于 2015-10-30T13:44:18.033 回答
0

Why do you need to copy the CellStyle? As for as i undesrstood, you want to apply same style to both cells, probably accross several workbooks. If that's the case, i would copy the cell value, and applied the same(predefined) style to both cells.

于 2013-08-09T08:52:59.667 回答