Как добавить несколько листов в одну книгу с помощью POI Java? - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь создать отчет в Excel, используя POI.Я хочу добавить несколько листов в мою книгу Excel, но моя книга перезаписывается при каждом запуске метода.Метод записи данных в Excel - вызывается 3 раза, и в Excel существует только последний отчет

public void createReportFile(MultiValueMap MMReport) {
        try {
            workBook = new XSSFWorkbook();
            sheet = workBook.createSheet("REPTRANS_TRN" + count);

            AtomicInteger rowCounter = new AtomicInteger();
            MMReport.forEach((k, v) -> {
                AtomicInteger cellCounter = new AtomicInteger();
                Row row = sheet.createRow(rowCounter.incrementAndGet());
                row.createCell(cellCounter.getAndIncrement()).setCellValue(k.toString());

                List<String> values = (List<String>) v;
                values.forEach(value -> {
                    row.createCell(cellCounter.getAndIncrement()).setCellValue(value.toString());
                });
            });
            fileOutput = new FileOutputStream(getReportFile());
            workBook.write(fileOutput);
            fileOutput.flush();
            fileOutput.close();
            ++count;
        } catch (Exception e) {
            System.out.println(e);
        }
    }

Метод создания нового файла

 public File getReportFile() throws IOException {
        File buildFileFolder;

        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        Date date = new Date();

        String rootDirectory = "Reports";       //main_folder_name
        String dailyFolderName = dateFormat.format(date);       //Daily folder name

        File dailyFileFolder = new File(rootDirectory + "/" + dailyFolderName);
        if (!dailyFileFolder.exists()) {
            dailyFileFolder.mkdirs();
            POIforgfgWrite.resetCounterValue("buildcounter");
            buildNumber = 1;
        }

        String buildFileName = "RentRun-Build-" + buildNumber;
        buildFileFolder = new File(rootDirectory + "/" + dailyFolderName + "/" + buildFileName + ".xlsx");
        if (!buildFileFolder.exists()) {
            buildFileFolder.createNewFile();
            POIforgfgWrite.writeBackCounterValue("buildcounter", buildNumber);
        }
        return buildFileFolder;
    }

1 Ответ

0 голосов
/ 26 апреля 2018

Ваш метод createReportFile() создает новый экземпляр Workbook, создает в нем один лист, записывает в него данные, затем закрывает и сохраняет его с помощью name + counter. При каждом вызове createReportFile, вы создаете новую отдельную рабочую книгу .

Кажется, переменная counter относится к области видимости класса, что может быть тем, что вы хотите, чтобы ваш экземпляр Workbook был. Вам также следует открыть книгу в том же объеме, в котором вы ее закрыли.

Я предлагаю вам создать метод updateReportFile(), который получает предварительно полученный экземпляр Workbook и ваши данные для записи. Для вашей книги вы должны предоставить объект OutputStream (если он существует, в противном случае создайте новый), который вы хотите обновить / создать.

...