Trabalho com Excel em Kotlin: Apache POI e bibliotecas wrapper
Kotlin, como linguagem de programação moderna para JVM, oferece excelentes oportunidades para trabalhar com dados tabulares. Embora o ecossistema Kotlin não tenha suporte nativo para o formato .xlsx, você pode usar bibliotecas Java testadas, adaptadas à sintaxe Kotlin. Neste artigo, veremos a ferramenta principal — Apache POI — e dois wrappers Kotlin populares: poi-kotlin e kotlinpoi.
1. Apache POI — base para trabalhar com Excel
Apache POI é uma biblioteca Java madura para ler e escrever arquivos nos formatos Microsoft Office (OLE2 e OOXML). Para trabalhar com arquivos modernos .xlsx, use o submódulo poi-ooxml. Adicione a dependência no build.gradle.kts:
dependencies { implementation("org.apache.poi:poi:5.3.0") implementation("org.apache.poi:poi-ooxml:5.3.0")}Lendo um arquivo Excel em Kotlin
Exemplo de leitura de dados da primeira planilha:
import org.apache.poi.ss.usermodel.*import org.apache.poi.xssf.usermodel.XSSFWorkbookimport 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()}Criando um arquivo Excel
Vamos criar uma tabela simples com cabeçalhos:
import org.apache.poi.xssf.usermodel.XSSFWorkbookimport java.io.FileOutputStream
fun createExcel() { val workbook = XSSFWorkbook() val sheet = workbook.createSheet("Dados")
// Cabeçalhos val headerRow = sheet.createRow(0) headerRow.createCell(0).setCellValue("Nome") headerRow.createCell(1).setCellValue("Idade") headerRow.createCell(2).setCellValue("Cidade")
// Dados val data = listOf( listOf("Ana", 25, "Moscou"), listOf("Ivan", 30, "SPb"), listOf("Maria", 22, "Kazan") )
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. Biblioteca poi-kotlin — wrapper Kotlin-first
poi-kotlin (versão 0.3.0) é um wrapper leve sobre Apache POI que adiciona funções de extensão e sintaxe DSL, característica do Kotlin. Instalação:
repositories { maven("https://jitpack.io")}dependencies { implementation("com.github.nicklausw.poi-kotlin:poi-kotlin:0.3.0")}Exemplo com poi-kotlin
import com.github.nicklausw.poi.kotlin.*
fun dslExample() { val workbook = workbook { sheet("Relatório") { row { cell("Produto") cell("Preço") cell("Quantidade") } row { cell("Notebook") cell(1200.0) cell(5) } row { cell("Mouse") cell(25.5) cell(10) } } } workbook.writeToFile("report.xlsx")}O código ficou mais legível, e os blocos aninhados sheet { row { ... } } lembram a construção de marcação HTML.
3. Biblioteca kotlinpoi — abordagem funcional
kotlinpoi (ver