Работа с Excel в Kotlin: Apache POI и библиотеки-обертки
Kotlin, как современный язык программирования для JVM, предоставляет отличные возможности для работы с табличными данными. Хотя в экосистеме Kotlin нет нативной поддержки формата .xlsx, вы можете использовать проверенные Java-библиотеки, адаптированные под синтаксис Kotlin. В этой статье мы рассмотрим основной инструмент — Apache POI — и две популярные Kotlin-обертки: poi-kotlin и kotlinpoi.
1. Apache POI — основа работы с Excel
Apache POI — это зрелая Java-библиотека для чтения и записи файлов форматов Microsoft Office (OLE2 и OOXML). Для работы с современными файлами .xlsx используется подмодуль poi-ooxml. Добавьте зависимость в build.gradle.kts:
dependencies {
implementation("org.apache.poi:poi:5.3.0")
implementation("org.apache.poi:poi-ooxml:5.3.0")
}
Чтение Excel-файла в Kotlin
Пример чтения данных из первого листа:
import org.apache.poi.ss.usermodel.*
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.io.FileInputStream
fun readExcel(filePath: String) {
val file = FileInputStream(filePath)
val workbook: Workbook = XSSFWorkbook(file)
val sheet: Sheet = workbook.getSheetAt(0)
for (row in sheet) {
for (cell in row) {
when (cell.cellType) {
CellType.STRING -> print("${cell.stringCellValue} ")
CellType.NUMERIC -> print("${cell.numericCellValue} ")
else -> print(" ")
}
}
println()
}
workbook.close()
}
Создание Excel-файла
Создадим простую таблицу с заголовками:
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.io.FileOutputStream
fun createExcel() {
val workbook = XSSFWorkbook()
val sheet = workbook.createSheet("Данные")
// Заголовки
val headerRow = sheet.createRow(0)
headerRow.createCell(0).setCellValue("Имя")
headerRow.createCell(1).setCellValue("Возраст")
headerRow.createCell(2).setCellValue("Город")
// Данные
val data = listOf(
listOf("Анна", 25, "Москва"),
listOf("Иван", 30, "СПб"),
listOf("Мария", 22, "Казань")
)
data.forEachIndexed { index, rowData ->
val row = sheet.createRow(index + 1)
rowData.forEachIndexed { cellIndex, value ->
row.createCell(cellIndex).setCellValue(value.toString())
}
}
workbook.write(FileOutputStream("output.xlsx"))
workbook.close()
}
2. Библиотека poi-kotlin — Kotlin-first обертка
poi-kotlin (версия 0.3.0) — это легковесная обертка над Apache POI, которая добавляет extension-функции и DSL-синтаксис, характерный для Kotlin. Установка:
repositories {
maven("https://jitpack.io")
}
dependencies {
implementation("com.github.nicklausw.poi-kotlin:poi-kotlin:0.3.0")
}
Пример с poi-kotlin
import com.github.nicklausw.poi.kotlin.*
fun dslExample() {
val workbook = workbook {
sheet("Отчет") {
row {
cell("Продукт")
cell("Цена")
cell("Количество")
}
row {
cell("Ноутбук")
cell(1200.0)
cell(5)
}
row {
cell("Мышь")
cell(25.5)
cell(10)
}
}
}
workbook.writeToFile("report.xlsx")
}
Код стал читаемее, а вложенные блоки sheet { row { ... } } напоминают построение HTML-разметки.
3. Библиотека kotlinpoi — функциональный подход
kotlinpoi (версия 0.2.0) предлагает еще более лаконичный синтаксис с использованием лямбд и инфиксных функций. Подключение:
dependencies {
implementation("io.github.nicklausw:kotlinpoi:0.2.0")
}
Пример с kotlinpoi
import io.github.nicklausw.kotlinpoi.*
fun functionalExample() {
val workbook = createWorkbook {
sheet("Лист1") {
row {
cell("Имя") + cell("Email")
}
row {
cell("Петр") + cell("petr@example.com")
}
row {
cell("Оль