Работа с Excel в Kotlin: библиотеки Apache POI и Kotlin-обертки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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("Оль                    

Рекомендаций