Apache POI-从XSSFCell复制样式到HSSFCell

时间:2019-03-29 10:57:53

标签: java apache-poi

我正在尝试将具有特定格式(自定义表)的现有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;

}

0 个答案:

没有答案