Рубрики
Без рубрики

Пакет Spring – JPA в XLSX с Apache POI

Что такое Apache POI? Apache POI – это библиотека Java, которая позволяет читать и записывать Microsoft… С тегами spring, java, jpa, xlsx.

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 ItemReader bookReader(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 ItemWriter bookWriter(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 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(ItemReader reader, 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”