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

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

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

Начать курс

Работа с 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                    

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