You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy读取XLSX文件出现乱码,求正确读取方法

正确读取XLSX文件的Groovy解决方案

哦,这个问题我太熟悉了——你现在的做法是把XLSX当成纯文本文件来读,但XLSX本质上是基于OOXML的二进制压缩格式,里面包含了多个XML文件和资源,根本不是普通的文本文件。直接用readFile读取后转成字符串,得到的只是压缩后的二进制数据,自然全是乱码。

下面分两种常见场景给你正确的解决方法:

一、普通Groovy脚本场景

我们需要用专门处理Excel的库,最常用的就是Apache POI的poi-ooxml模块。Groovy可以通过@Grab快速引入依赖,然后就能正常解析XLSX内容了:

// 引入Apache POI依赖
@Grab('org.apache.poi:poi-ooxml:5.2.5')
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.apache.poi.ss.usermodel.Row
import org.apache.poi.ss.usermodel.Cell

// 读取本地XLSX文件
def excelFile = new File("SystemCharts.xlsx")
def workbook = new XSSFWorkbook(excelFile)

// 获取第一个工作表(也可以通过名称获取:workbook.getSheet("你的工作表名"))
def targetSheet = workbook.getSheetAt(0)

// 遍历工作表中的每一行
for (Row row : targetSheet) {
    def rowData = []
    // 遍历当前行的每个单元格
    for (Cell cell : row) {
        // 根据单元格类型获取对应的值
        def cellValue = switch (cell.cellType) {
            case Cell.CELL_TYPE_STRING -> cell.stringCellValue
            case Cell.CELL_TYPE_NUMERIC -> cell.numericCellValue
            case Cell.CELL_TYPE_BOOLEAN -> cell.booleanCellValue
            case Cell.CELL_TYPE_FORMULA -> cell.cellFormula // 如果需要公式计算结果,可使用FormulaEvaluator
            default -> ""
        }
        rowData.add(cellValue)
    }
    // 打印整行内容,用制表符分隔单元格
    println rowData.join("\t")
}

// 记得关闭工作簿,释放资源
workbook.close()

二、Jenkins Pipeline场景

如果你的代码是在Jenkins Pipeline中运行的,需要注意Jenkins的readFile默认会按文本解析,所以要先保留二进制字节再传给POI处理:

// 引入Apache POI依赖
@Grab('org.apache.poi:poi-ooxml:5.2.5')
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.apache.poi.ss.usermodel.Row
import org.apache.poi.ss.usermodel.Cell
import java.io.ByteArrayInputStream

// 读取文件二进制字节(用ISO-8859-1确保字节不被篡改)
def fileBytes = readFile file: "SystemCharts.xlsx", encoding: 'ISO-8859-1'
def workbook = new XSSFWorkbook(new ByteArrayInputStream(fileBytes.getBytes('ISO-8859-1')))

// 后续工作表遍历逻辑和普通脚本一致
def targetSheet = workbook.getSheetAt(0)
for (Row row : targetSheet) {
    def rowData = []
    for (Cell cell : row) {
        def cellValue = switch (cell.cellType) {
            case Cell.CELL_TYPE_STRING -> cell.stringCellValue
            case Cell.CELL_TYPE_NUMERIC -> cell.numericCellValue
            case Cell.CELL_TYPE_BOOLEAN -> cell.booleanCellValue
            case Cell.CELL_TYPE_FORMULA -> cell.cellFormula
            default -> ""
        }
        rowData.add(cellValue)
    }
    println rowData.join("\t")
}

workbook.close()

关键说明

  • XLSX是二进制压缩格式,绝对不能用文本读取方式直接处理,必须用专门的Excel解析库。
  • Apache POI支持几乎所有Excel格式(XLS、XLSX等),是Java/Groovy生态中处理Excel的标准方案。
  • 如果是Jenkins环境,若@Grab无法正常引入依赖,可以考虑安装Jenkins的POI相关插件,或者通过共享库封装Excel读取逻辑。

内容的提问来源于stack exchange,提问作者HAla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 08:42:46