首页 > 解决方案 > Apache POI - 将样式从 XSSFCell 复制到 HSSFCell

问题描述

我正在尝试将具有特定格式(自定义表)的现有 XSSFWorkbook 转换为 HSSFWorkbook,以便将其保存为 .xls 文件。

为此,我使用以下方法从 XSSFWorkbook 复制数据并将其粘贴到新的 HSSFWorkbook 中,然后再尝试复制样式。但是我不能使用 cloneStyleFrom 方法,因为它只能从一个 XSSFCell 到另一个。

您是否知道我如何继续复制每个单元格的样式并将其应用于新的 HSSF 单元格?

我考虑过的替代方法是将一个 .xls 文件添加到我的项目的资源文件夹中,其中包含一个具有正确格式的巨大空表,然后我将填充从另一个工作簿中获取的数据,然后以编程方式删除额外的列和行仍然是空的。但我并不真正喜欢这个解决方案,并想在实施之前确保没有其他解决方案。

public Workbook convert(XSSFWorkbook wb, File inpFn) throws InvalidFormatException,IOException {

    XSSFWorkbook wbIn = wb;

    Workbook wbOut = new HSSFWorkbook();
    int sheetCnt = wbIn.getNumberOfSheets();
    for (int i = 0; i < sheetCnt; i++) {
        Sheet sIn = wbIn.getSheetAt(i);
        Sheet sOut = wbOut.createSheet(sIn.getSheetName());
        Iterator<Row> rowIt = sIn.rowIterator();
        while (rowIt.hasNext()) {
            Row rowIn = rowIt.next();
            Row rowOut = sOut.createRow(rowIn.getRowNum());

            Iterator<Cell> cellIt = rowIn.cellIterator();
            while (cellIt.hasNext()) {
                Cell cellIn = cellIt.next();
                Cell cellOut = rowOut.createCell(cellIn.getColumnIndex(), cellIn.getCellType());

                switch (cellIn.getCellType()) {
                case Cell.CELL_TYPE_BLANK: break;

                case Cell.CELL_TYPE_BOOLEAN:
                    cellOut.setCellValue(cellIn.getBooleanCellValue());
                    break;

                case Cell.CELL_TYPE_ERROR:
                    cellOut.setCellValue(cellIn.getErrorCellValue());
                    break;

                case Cell.CELL_TYPE_FORMULA:
                    cellOut.setCellFormula(cellIn.getCellFormula());
                    break;

                case Cell.CELL_TYPE_NUMERIC:
                    cellOut.setCellValue(cellIn.getNumericCellValue());
                    break;

                case Cell.CELL_TYPE_STRING:
                    cellOut.setCellValue(cellIn.getStringCellValue());
                    break;
                }

                CellStyle styleIn = cellIn.getCellStyle();
                CellStyle styleOut = cellOut.getCellStyle();
                styleOut.setDataFormat(styleIn.getDataFormat());
                //styleOut.cloneStyleFrom(styleIn); Does not work from XSSFCell to HSSFCell
                cellOut.setCellStyle(styleOut);
                }
        }
    }

    return wbOut;

}

标签: javaapache-poi

解决方案


推荐阅读