我正在尝试使用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;
}
答案 0 :(得分:1)
您的createReportFile()
方法正在创建一个新的工作簿实例,在其中创建一个工作表,向其中写入数据,然后使用name + counter
关闭并保存它。
每次拨打createReportFile
,,您都会创建一个新的单页工作簿。
counter
变量似乎来自类范围,这可能是您希望Workbook实例的范围。您还应该在关闭它的同一范围内打开工作簿。
我建议您创建一个updateReportFile()
方法,该方法接收事先获得的工作簿实例以及要写入的数据。对于您的工作簿,您应该提供您希望更新/创建的OutputStream对象(假设它存在,否则创建一个新对象)。