如何使用POI java将多个工作表添加到同一工作簿?

时间:2018-04-24 12:19:45

标签: java excel apache-poi

我正在尝试使用POI创建Excel报告。我想在我的excel工作簿中添加多个工作表,但每次运行该方法时都会覆盖我的工作簿。 将数据写入excel的方法 - 在excel中存在3次,只有最后一次报告

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 :(得分:1)

您的createReportFile()方法正在创建一个新的工作簿实例,在其中创建一个工作表,向其中写入数据,然后使用name + counter关闭并保存它。 每次拨打createReportFile,您都会创建一个新的单页工作簿

counter变量似乎来自类范围,这可能是您希望Workbook实例的范围。您还应该在关闭它的同一范围内打开工作簿。

我建议您创建一个updateReportFile()方法,该方法接收事先获得的工作簿实例以及要写入的数据。对于您的工作簿,您应该提供您希望更新/创建的OutputStream对象(假设它存在,否则创建一个新对象)。