Apache POI добавляет данные в файл xlsx, когда задача запускается дважды - PullRequest
1 голос
/ 01 мая 2019

У меня есть файл template.xls, к которому я добавляю данные из некоторых запросов к базе данных.Я добавляю данные и создаю новый файл с именем yyyyMMddHHmmss.xls.Это прекрасно работает.Размер файла становится большим, поэтому я пытаюсь сделать то же самое с файлом xlsx.Когда я генерирую файл в первый раз, он прекрасно работает.Если я запускаю процесс снова (даже если я перезапускаю приложение Java), он каким-то образом сохраняет последний файл в памяти и добавляет данные в этот файл.В обоих случаях он извлекает исходный файл из template.xls(x), который является неизмененным файлом.

Код между ними идентичен, за исключением того, что я передаю xlsx вместо xls в последнем случае.

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(Objects.requireNonNull(classLoader.getResource("template.xlsx")).getFile());
Workbook workbook = WorkbookFactory.create(file);
// write data
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String currentDate = formatter.format(date);
FileOutputStream fileOutputStream = new FileOutputStream(currentDate + ".xlsx");
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();

Я использую Java 8u201 и org.apache.poi:poi:4.1.0 (также пытался 4.0.1)

1 Ответ

2 голосов
/ 01 мая 2019

Как сказано в Apache POI - FileInputStream работает, объект File завершается с ошибкой (NullPointerException) , создание XSSFWorkbook из File имеет тот недостаток, что все изменения, которые были внесены в эту книгу, всегдабудет храниться в этом файле, пока XSSFWorkbook.write.Это верно, даже если write записывает в другой файл.Но явная запись в тот же файл невозможна даже потому, что File остается открытым после создания книги, и поэтому запись в этот же файл приводит к исключениям.

Итак, создание XSSFWorkbook из File использование

Workbook workbook = WorkbookFactory.create(file);

не очень хорошая идея, когда file является *.xlsx файлом.Вместо этого Workbook должен быть создан с использованием FileInputstream:

Workbook workbook = WorkbookFactory.create(new FileInputStream(file));

Несмотря на то, что связанный Q / A SO относится к 2017 году, такая же проблема всегда и сегодня не возникает при использовании apache poi 4.1.0.

...