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
相关产品推荐
相关产品推荐

