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

标签 java excel apache-poi

我正在尝试使用 POI 创建 Excel 报告。我想向我的 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;
    }

最佳答案

您的createReportFile()方法正在创建一个新的Workbook实例,在其中创建一张工作表,向其中写入数据,然后关闭并使用名称+计数器保存它。 每次调用 createReportFile 时,都会创建一个新的单工作表工作簿

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

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

关于java - 如何使用 POI java 将多个工作表添加到同一工作簿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50001523/

相关文章:

java - 垂直系统拥塞

Java HeapDumps 表明在 OutOfMemory 异常后使用的堆大小比实际堆定义小 30%

vba - 排序字段的 add2 是什么

php - 如何使用 PHP 将 SQL 表导出为 excel 格式

java - Apache POI 编码

java - 任何人都可以帮助我将我的应用程序连接到 Access

java - EJB服务PDF,导致重新请求对象属于其他PDF异常

r - ls(envir = envir, all.names = private) 出错?

java - Apache POI 未在 Excel 中为每一列呈现输出

java - 如何获取特定列中使用的行数