Клонирование листов между файлами

У меня есть три или более файлов Excel с различными листами среди них, и мне нужно создать новый пустой файл с копией (или клоном), который вставляет листы в новый файл, и расположить их в нужном мне порядке, чтобы я мог заполнить соответствующие формы с данными.

Как я могу сделать это с помощью Джакарта POI (XSSFWorkbook)?

3 ответа

Во-первых, я думаю, что вы имеете в виду Apache POI - это не Apache Jakarta POI уже несколько лет...

С точки зрения копирования листов из одной рабочей книги в другую это может быть сделано, но это потребует некоторого кодирования. Сначала вы захотите определить стили ячеек, которые вы используете, и клонировать их. Убедитесь, что вы отслеживаете, какой исходный стиль ячейки переходит к какому целевому стилю ячейки, так как вы не хотите продолжать повторное создание, или вы достигнете предела! CellStyle.cloneStyleFrom (CellStyle) - это метод, который вам нужен.

Затем для каждого исходного листа создайте лист в целевой книге. Цикл по всем исходным строкам, создавая новые целевые. Затем выполните цикл по ячейкам, переключитесь по типу ячейки, возьмите соответствующее значение и установите его. Промыть и повторить!

Это моя реализация копирования листов из одной рабочей книги в другую. Я сделал все, как описано Гаграварром. Это решение работает для меня. Этот код будет работать, если на листах нет таблиц и т. Д. Если на листах содержится простой текст (String, boolean, int и т. Д.), Формулы, это решение будет работать.

Workbook oldWB = new XSSFWorkbook(new FileInputStream("C:\\input.xlsx"));
Workbook newWB = new XSSFWorkbook();
CellStyle newStyle = newWB.createCellStyle(); // Need this to copy over styles from old sheet to new sheet. Next step will be processed below
Row row;
Cell cell;
for (int i = 0; i < oldWB.getNumberOfSheets(); i++) {
    XSSFSheet sheetFromOldWB = (XSSFSheet) oldWB.getSheetAt(i);
    XSSFSheet sheetForNewWB = (XSSFSheet) newWB.createSheet(sheetFromOldWB.getSheetName());
    for (int rowIndex = 0; rowIndex < sheetFromOldWB.getPhysicalNumberOfRows(); rowIndex++) {
        row = sheetForNewWB.createRow(rowIndex); //create row in this new sheet
        for (int colIndex = 0; colIndex < sheetFromOldWB.getRow(rowIndex).getPhysicalNumberOfCells(); colIndex++) {
            cell = row.createCell(colIndex); //create cell in this row of this new sheet
            Cell c = sheetFromOldWB.getRow(rowIndex).getCell(colIndex, Row.CREATE_NULL_AS_BLANK ); //get cell from old/original WB's sheet and when cell is null, return it as blank cells. And Blank cell will be returned as Blank cells. That will not change.
                if (c.getCellType() == Cell.CELL_TYPE_BLANK){
                    System.out.println("This is BLANK " +  ((XSSFCell) c).getReference());
                }
                else {  //Below is where all the copying is happening. First It copies the styles of each cell and then it copies the content.              
                CellStyle origStyle = c.getCellStyle();
                newStyle.cloneStyleFrom(origStyle);
                cell.setCellStyle(newStyle);            

                 switch (c.getCellTypeEnum()) {
                    case STRING:                            
                        cell.setCellValue(c.getRichStringCellValue().getString());
                        break;
                    case NUMERIC:
                        if (DateUtil.isCellDateFormatted(cell)) {                             
                            cell.setCellValue(c.getDateCellValue());
                        } else {                              
                            cell.setCellValue(c.getNumericCellValue());
                        }
                        break;
                    case BOOLEAN:

                        cell.setCellValue(c.getBooleanCellValue());
                        break;
                    case FORMULA:

                        cell.setCellValue(c.getCellFormula());
                        break;
                    case BLANK:
                        cell.setCellValue("who");
                        break;
                    default:
                        System.out.println();
                    }
                }
            }
        }

    }
    //Write over to the new file
    FileOutputStream fileOut = new FileOutputStream("C:\\output.xlsx");
    newWB.write(fileOut);
    oldWB.close();
    newWB.close();
    fileOut.close();

Если ваше требование состоит в том, чтобы скопировать полные листы, не оставляя и не добавляя ничего Я думаю, что процесс исключения работает лучше и быстрее, чем приведенный выше код. И вам не нужно беспокоиться о потере формул, рисунков, таблиц, стилей, шрифтов и т. Д.

XSSFWorkbook wb = new XSSFWorkbook("C:\\abc.xlsx");
for (int i = wb.getNumberOfSheets() - 1; i >= 0; i--) {
        if (!wb.getSheetName(i).contentEquals("January")) //This is a place holder. You will insert your logic here to get the sheets that you want.  
            wb.removeSheetAt(i); //Just remove the sheets that don't match your criteria in the if statement above               
}
FileOutputStream out = new FileOutputStream(new File("C:\\xyz.xlsx"));
wb.write(out);
out.close();

FileOutputStream os = new FileOutputStream("difnetFileName") readWorkbook.write(os);

Полагаю, мы можем использовать операцию записи в ОС с именем файла diff.

Другие вопросы по тегам