我正在尝试使用 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/