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

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

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

Начать курс

Работа с Excel в Kotlin: обзор библиотек и практические примеры

Kotlin, как современный JVM-язык, обладает отличной совместимостью с Java-экосистемой. Для работы с файлами Excel (.xls и .xlsx) наиболее мощным и распространённым решением является библиотека Apache POI. Она позволяет создавать, читать и модифицировать документы Microsoft Office. В этой статье мы рассмотрим, как использовать Apache POI в Kotlin, а также познакомимся со специализированными Kotlin-обёртками, упрощающими код.

1. Подключение Apache POI к проекту Kotlin

Добавьте зависимости в файл build.gradle.kts (для Gradle Kotlin DSL):

dependencies {
    implementation("org.apache.poi:poi:5.2.5")
    implementation("org.apache.poi:poi-ooxml:5.2.5")
}

Для Maven используйте соответствующие артефакты poi и poi-ooxml.

Важно: poi-ooxml требуется для работы с форматом .xlsx (Office Open XML), а poi — для старого .xls (HSSF).

2. Создание и запись Excel-файла (XLSX) на Kotlin

Создадим простую книгу с одним листом и запишем данные.

import org.apache.poi.ss.usermodel.*
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)
    val headers = listOf("ID", "Имя", "Должность", "Оклад")
    headers.forEachIndexed { index, header ->
        headerRow.createCell(index).setCellValue(header)
    }

    // Данные
    val data = listOf(
        listOf(1, "Иван Петров", "Разработчик", 120000.0),
        listOf(2, "Мария Смирнова", "Аналитик", 95000.0),
        listOf(3, "Алексей Кузнецов", "Тестировщик", 85000.0)
    )

    data.forEachIndexed { rowIndex, rowData ->
        val row = sheet.createRow(rowIndex + 1)
        rowData.forEachIndexed { colIndex, value ->
            when (value) {
                is Int -> row.createCell(colIndex).setCellValue(value.toDouble())
                is Double -> row.createCell(colIndex).setCellValue(value)
                is String -> row.createCell(colIndex).setCellValue(value)
            }
        }
    }

    // Автоширина колонок
    for (i in headers.indices) {
        sheet.autoSizeColumn(i)
    }

    // Сохранение
    FileOutputStream("employees.xlsx").use { stream ->
        workbook.write(stream)
    }
    println("Файл создан: employees.xlsx")
}

Ключевые моменты:

  • XSSFWorkbook — класс для работы с .xlsx (XSSF). Для .xls используйте HSSFWorkbook.
  • Строки и ячейки индексируются с 0.
  • autoSizeColumn автоматически подгоняет ширину колонок под содержимое.
  • В Kotlin удобно использовать use для автоматического закрытия потока.

3. Чтение Excel-файла в Kotlin

Прочитаем ранее созданный файл и выведем данные в консоль.

import org.apache.poi.ss.usermodel.*
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.io.FileInputStream

fun readExcel() {
    FileInputStream("employees.xlsx").use { stream ->
        val workbook = XSSFWorkbook(stream)
        val sheet = workbook.getSheetAt(0)

        for (row in sheet) {
            for (cell in row) {
                when (cell.cellType) {
                    CellType.STRING -> print("${cell.stringCellValue}\t")
                    CellType.NUMERIC -> print("${cell.numericCellValue}\t")
                    CellType.BOOLEAN -> print("${cell.booleanCellValue}\t")
                    else -> print("?\t")
                }
            }
            println()
        }
    }
}

Обратите внимание на проверку типа ячейки через cell.cellType — это обязательное условие, иначе может возникнуть исключение.

4. Форматирование: стили, цвета, шрифты

Apache POI позволяет гибко настраивать внешний вид. Пример — выделение заголовков жирным шрифтом и синим фоном:

fun createStyledExcel() {
    val workbook = XSSFWorkbook()
    val sheet = workbook.createSheet("Стили")

    // Создаём стиль для заголовка
    val headerStyle = workbook.createCellStyle().apply {
        fillForegroundColor = IndexedColors.DARK                    

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