Работа с Excel в Kotlin: библиотеки Apache POI и Kotlin-обертка
Kotlin, будучи современным языком программирования для JVM, предоставляет отличные возможности для автоматизации работы с офисными документами. В этой статье мы рассмотрим, как эффективно работать с файлами Excel (XLS и XLSX) в Kotlin, используя популярные библиотеки Apache POI и её Kotlin-ориентированную обертку Apache POI for Kotlin.
Почему Kotlin для работы с Excel?
Kotlin предлагает более лаконичный и безопасный синтаксис по сравнению с Java, что особенно полезно при работе с громоздкими API Excel. Используя Kotlin, вы можете:
- Сократить количество шаблонного кода
- Использовать безопасные типы и null-safety
- Применять extension-функции для улучшения читаемости
- Легко интегрироваться с существующими Java-библиотеками
Основная библиотека: Apache POI
Apache POI — это де-факто стандарт для работы с документами Microsoft Office в экосистеме JVM. Она поддерживает:
- Чтение и запись XLS (HSSF) и XLSX (XSSF)
- Работу с формулами, стилями, объединенными ячейками
- Создание диаграмм и сводных таблиц
- Обработку больших файлов через SXSSF (streaming)
Для подключения в Gradle (Kotlin DSL) добавьте в build.gradle.kts:
dependencies {
implementation("org.apache.poi:poi:5.3.0")
implementation("org.apache.poi:poi-ooxml:5.3.0")
}
Библиотека-обертка: Apache POI for Kotlin
Существует несколько Kotlin-оберток, упрощающих работу с POI. Одна из популярных — kotlin-poi (com.github.doyaaaaaken:kotlinpoi). Она добавляет extension-функции и DSL-стиль для создания Excel-файлов.
Подключение:
repositories {
mavenCentral()
}
dependencies {
implementation("com.github.doyaaaaaken:kotlinpoi:1.0.0")
}
Пример 1: Создание простого XLSX-файла (чистый POI)
Создадим книгу с одним листом и заполним её данными:
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.io.FileOutputStream
fun createSimpleExcel() {
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("Анна", 28, "Москва"),
listOf("Иван", 35, "Санкт-Петербург"),
listOf("Мария", 22, "Казань")
)
data.forEachIndexed { index, rowData ->
val row = sheet.createRow(index + 1)
rowData.forEachIndexed { cellIndex, value ->
when (value) {
is String -> row.createCell(cellIndex).setCellValue(value)
is Int -> row.createCell(cellIndex).setCellValue(value.toDouble())
else -> row.createCell(cellIndex).setCellValue(value.toString())
}
}
}
// Автоширина колонок
for (i in 0..2) {
sheet.autoSizeColumn(i)
}
// Сохраняем файл
FileOutputStream("output.xlsx").use { fileOut ->
workbook.write(fileOut)
}
workbook.close()
println("Файл создан: output.xlsx")
}
Пример 2: Чтение Excel-файла (чистый POI)
import org.apache.poi.ss.usermodel.WorkbookFactory
import java.io.FileInputStream
fun readExcel(filePath: String) {
val file = FileInputStream(filePath)
val workbook = WorkbookFactory.create(file)
val sheet = workbook.getSheetAt(0)
println("Чтение листа: ${sheet.sheetName}")
println("Всего строк: ${sheet.physicalNumberOfRows}")
for (row in sheet) {
val rowData = mutableListOf<String>()
for (cell in row) {
rowData.add(cell.toString())
}
println(rowData.joinToString(" | "))
}
workbook.close()
}
Пример 3: Использование Kotlin-обертки (kotlinpoi)
Библиотека kotlinpoi предоставляет DSL для более лаконичной записи:
import com.github.doyaaaaaken.kotlinpo