Apache POI – это библиотека Java, которая позволяет читать и записывать документы Microsoft. Он поддерживает Excel, Word, PowerPoint и даже Vision.
В этой статье я сосредоточусь на Excel и его текущем формате файлов XLSX. Apache POI предоставляет API с низким объемом памяти, SXSSF, для записи в файлы XLSX. Вы можете указать, сколько строк обрабатывается в памяти, установив скользящее окно. Если количество строк превышает размер окна, они удаляются во временные файлы. В конце все данные передаются в указанный вами файл назначения.
Spring Framework имеет собственную библиотеку для обработки больших объемов данных. Это называется Весенняя партия. Spring Batch поддерживает файлы CSV, но изначально не поддерживает файлы XLSX. Вы можете добиться сохранения данных в формате XLSX с поддержкой Apache POI XSSF API.
Допустим, у вас есть книжный магазин. У вас также есть приложение, которое позволяет вам хранить информацию о книгах, доступных для продажи. Вы хотите сделать заказ на новые книги. Ваш отправитель хочет, чтобы вы отправили ему файл XLSX со списком книг для доставки.
Ниже приведено представление JPA логики приложения вашего книжного магазина. У вас есть модель Book
и репозиторий, в котором хранится информация о книгах в базе данных.
@Data
аннотация является частью проекта Lombok . Он генерирует toString
, равно
, Хэш-код
, методы получения и установки для всех свойств.
@Data @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String title; private String author; private String isbn; }
@Repository public interface BookRepository extends PagingAndSortingRepository{ }
Для обработки данных из репозитория JPA вам необходимо создать RepositoryItemReader
и конфигурацию, которая включает пакетную обработку и репозитории JPA.
@Configuration @EnableBatchProcessing @EnableJpaRepositories public class BatchConfiguration { private static final int CHUNK = 100; @Bean public ItemReaderbookReader(BookRepository repository) { RepositoryItemReader reader = new RepositoryItemReader<>(); reader.setRepository(repository); reader.setMethodName("findAll"); reader.setPageSize(CHUNK); reader.setSort(singletonMap("id", Sort.Direction.ASC)); return reader; } }
Выбранные книги будут записаны в электронную таблицу. Все электронные таблицы хранятся в Workbook
, поэтому перед этим вы должны создать одну из них.
@Bean public SXSSFWorkbook workbook() { return new SXSSFWorkbook(CHUNK); }
SXSSFWorkbook
количество сохраненных в памяти строк явно задано равным CHUNK
. С помощью Рабочей книги
вы можете создать электронную таблицу с именем Books
. Он будет передан в Book Writer
.
@Bean public ItemWriterbookWriter(SXSSFWorkbook workbook) { SXSSFSheet sheet = workbook.createSheet("Books"); return new BookWriter(sheet); }
Book Writer
– это класс, который добавляет новую строку в электронную таблицу для каждой книги в репозитории. Свойства книги сохраняются в виде ячеек в столбцах.
public class BookWriter implements ItemWriter{ private final Sheet sheet; BookWriter(Sheet sheet) { this.sheet = sheet; } @Override public void write(List extends Book> list) { for (int i = 0; i < list.size(); i++) { writeRow(i, list.get(i)); } } private void writeRow(int currentRowNumber, Book book) { List columns = prepareColumns(book); Row row = this.sheet.createRow(currentRowNumber); for (int i = 0; i < columns.size(); i++) { writeCell(row, i, columns.get(i)); } } private List prepareColumns(Book book) { return asList( book.getId().toString(), book.getAuthor(), book.getTitle(), book.getIsbn() ); } private void writeCell(Row row, int currentColumnNumber, String value) { Cell cell = row.createCell(currentColumnNumber); cell.setCellValue(value); } }
Чтобы завершить перенос книг из репозитория JPA в файл XLSX, вам необходимо создать Job
. У каждого Задания
есть по крайней мере одно Шаг
сделать.
@Bean public Step step(ItemReaderreader, ItemWriter writer) { return stepBuilderFactory.get("export") . chunk(CHUNK) .reader(reader) .writer(writer) .build(); } @Bean public Job job(Step step, JobExecutionListener listener) { return jobBuilderFactory.get("exportBooksToXlsx") .start(step) .listener(listener) .build(); }
При изменении статуса Job
вызывается JobExecutionListener
. По завершении Задания
вы можете сохранять книги из Рабочая тетрадь
в выбранный файл XLSX с помощью FileOutputStream
и удалить созданный Рабочая тетрадь
.
@Slf4j public class JobListener implements JobExecutionListener { private final SXSSFWorkbook workbook; private final FileOutputStream fileOutputStream; JobListener(SXSSFWorkbook workbook, FileOutputStream fileOutputStream) { this.workbook = workbook; this.fileOutputStream = fileOutputStream; } @Override public void afterJob(JobExecution jobExecution) { BatchStatus batchStatus = jobExecution.getStatus().getBatchStatus(); if (batchStatus == COMPLETED) { try { workbook.write(fileOutputStream); fileOutputStream.close(); workbook.dispose(); } catch (IOException e) { log.error(e.getMessage(), e); } } } @Override public void beforeJob(JobExecution jobExecution) { } }
Пакет Spring Batch очень эластичен, и он может помочь вам обрабатывать большие объемы данных с помощью любой доступной библиотеки. В этом примере показано, как это сделать с помощью Apache POI, но вы можете легко изменить его для своих собственных целей. Не забывайте максимизировать свою производительность с помощью блоков настройки. Когда объем оперативной памяти будет превышен, скорость обработки данных значительно снизится.
Проект, созданный для этой статьи, доступен на GitHub .
Оригинал: “https://dev.to/wpanas/spring-batch-jpa-to-xlsx-with-apache-poi-4lf1”