Trabajo con Excel en Kotlin: bibliotecas Apache POI y envoltura para Kotlin
Kotlin, siendo un lenguaje de programación moderno para la JVM, ofrece excelentes oportunidades para automatizar el trabajo con documentos ofimáticos. En este artículo, veremos cómo trabajar eficazmente con archivos Excel (XLS y XLSX) en Kotlin, utilizando las populares bibliotecas Apache POI y su envoltura orientada a Kotlin Apache POI for Kotlin.
¿Por qué Kotlin para trabajar con Excel?
Kotlin ofrece una sintaxis más concisa y segura en comparación con Java, lo que es especialmente útil al trabajar con las voluminosas API de Excel. Usando Kotlin, usted puede:
- Reducir la cantidad de código repetitivo
- Usar tipos seguros y null-safety
- Aplicar funciones de extensión para mejorar la legibilidad
- Integrarse fácilmente con bibliotecas Java existentes
Biblioteca principal: Apache POI
Apache POI es el estándar de facto para trabajar con documentos de Microsoft Office en el ecosistema JVM. Soporta:
- Lectura y escritura de XLS (HSSF) y XLSX (XSSF)
- Trabajo con fórmulas, estilos, celdas combinadas
- Creación de gráficos y tablas dinámicas
- Procesamiento de archivos grandes mediante SXSSF (streaming)
Para agregarlo en Gradle (Kotlin DSL), añada en build.gradle.kts:
dependencies { implementation("org.apache.poi:poi:5.3.0") implementation("org.apache.poi:poi-ooxml:5.3.0")}Biblioteca envoltura: Apache POI for Kotlin
Existen varias envolturas de Kotlin que simplifican el trabajo con POI. Una de las populares es kotlin-poi (com.github.doyaaaaaken:kotlinpoi). Añade funciones de extensión y un estilo DSL para crear archivos Excel.
Agregar dependencia:
repositories { mavenCentral()}
dependencies { implementation("com.github.doyaaaaaken:kotlinpoi:1.0.0")}Ejemplo 1: Creación de un archivo XLSX simple (POI puro)
Crearemos un libro con una hoja y lo llenaremos con datos:
import org.apache.poi.xssf.usermodel.XSSFWorkbookimport java.io.FileOutputStream
fun createSimpleExcel() { val workbook = XSSFWorkbook() val sheet = workbook.createSheet("Datos") // Creamos los encabezados val headerRow = sheet.createRow(0) headerRow.createCell(0).setCellValue("Nombre") headerRow.createCell(1).setCellValue("Edad") headerRow.createCell(2).setCellValue("Ciudad") // Llenamos los datos val data = listOf( listOf("Ana", 28, "Moscú"), listOf("Iván", 35, "San Petersburgo"), listOf("María", 22, "Kazán") ) 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()) } } } // Autoajuste del ancho de las columnas for (i in 0..2) { sheet.autoSizeColumn(i) } // Guardamos el archivo FileOutputStream("output.xlsx").use { fileOut -> workbook.write(fileOut) } workbook.close() println("Archivo creado: output.xlsx")}Ejemplo 2: Lectura de un archivo Excel (POI puro)
import org.apache.poi.ss.usermodel.WorkbookFactoryimport java.io.FileInputStream
fun readExcel(filePath: String) { val file = FileInputStream(filePath) val workbook = WorkbookFactory.create(file) val sheet = workbook.getSheetAt(0) println("Leyendo hoja: ${sheet.sheetName}") println("Total de filas: ${sheet.physicalNumberOfRows}") for (row in sheet) { val r