在 Kotlin 中处理 Excel:Apache POI 和 Kotlin 封装库
Kotlin 作为一种面向 JVM 的现代编程语言,为办公文档的自动化处理提供了出色的能力。在本文中,我们将探讨如何使用流行的 Apache POI 库及其面向 Kotlin 的封装库 Apache POI for Kotlin,在 Kotlin 中高效地处理 Excel 文件(XLS 和 XLSX)。
为什么选择 Kotlin 来处理 Excel?
与 Java 相比,Kotlin 提供了更简洁、更安全的语法,这在处理庞大的 Excel API 时尤其有用。使用 Kotlin,您可以:
- 减少样板代码的数量
- 使用安全类型和空安全特性
- 应用扩展函数来提高代码可读性
- 轻松与现有的 Java 库集成
核心库:Apache POI
Apache POI 是在 JVM 生态系统中处理 Microsoft Office 文档的事实标准。它支持:
- 读取和写入 XLS (HSSF) 和 XLSX (XSSF) 格式
- 处理公式、样式、合并单元格
- 创建图表和数据透视表
- 通过 SXSSF(流式处理)处理大文件
要在 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)。它添加了扩展函数和 DSL 风格,用于创建 Excel 文件。
添加依赖:
repositories { mavenCentral()}
dependencies { implementation("com.github.doyaaaaaken:kotlinpoi:1.0.0")}示例 1:创建一个简单的 XLSX 文件(纯 POI)
创建一个包含一个工作表的工作簿并填充数据:
import org.apache.poi.xssf.usermodel.XSSFWorkbookimport 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.WorkbookFactoryimport 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 r