Apache POI - стиль копирования из XSSFCell в HSSFCell - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь преобразовать существующую книгу 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;

}
...