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