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

如何将Java对象转换为Ballerina对象或JSON类型?含POI读取XLSX场景

Java对象与Ballerina类型/JSON的转换方案

完全可以实现Java对象到Ballerina对象或JSON的转换,结合Apache POI读取XLSX文件的需求,以下是具体实现方案:

核心思路

Ballerina原生支持Java互操作,可通过java模块调用Java类、提取对象属性,再将这些属性映射到Ballerina的record或直接构造json类型。

步骤1:配置POI依赖

在Ballerina项目的Ballerina.toml中添加POI的Maven依赖:

[[platform.java11.dependency]]
groupId = "org.apache.poi"
artifactId = "poi-ooxml"
version = "5.2.5"

步骤2:定义Ballerina目标类型

先定义与XLSX数据结构匹配的record,后续可直接转换为json[]:

type Employee record {
    string name;
    int age;
    string department;
};

步骤3:读取XLSX并转换

通过POI读取Excel行数据,提取Java对象属性后映射到Ballerina类型:

import ballerina/io;
import ballerina/java;
import ballerina/lang.int;

public function main() returns error? {
    // 加载XLSX文件到POI Workbook
    byte[] fileBytes = check io:fileReadBytes("employees.xlsx");
    java:Object workbook = check java:newInstance("org.apache.poi.xssf.usermodel.XSSFWorkbook", [fileBytes]);
    
    // 获取第一个Sheet
    java:Object sheet = check java:call(workbook, "getSheetAt", [0]);
    int rowCount = check java:call(sheet, "getPhysicalNumberOfRows");
    
    Employee[] employeeRecords = [];
    
    // 遍历行(跳过表头行)
    for int i from 1 to rowCount - 1 {
        java:Object row = check java:call(sheet, "getRow", [i]);
        
        // 读取单元格值,处理不同单元格类型
        java:Object nameCell = check java:call(row, "getCell", [0]);
        string name = check java:call(nameCell, "getStringCellValue");
        
        java:Object ageCell = check java:call(row, "getCell", [1]);
        float ageNum = check java:call(ageCell, "getNumericCellValue");
        int age = check int:fromFloat(ageNum);
        
        java:Object deptCell = check java:call(row, "getCell", [2]);
        string department = check java:call(deptCell, "getStringCellValue");
        
        // 添加到record数组
        employeeRecords.push({name, age, department});
    }
    
    // 转换为json数组
    json[] employeeJsonArr = employeeRecords.clone();
    io:println("转换后的JSON数组: ", employeeJsonArr);
    
    // 释放POI资源
    check java:call(workbook, "close");
}

关键注意事项

  • 单元格类型处理:Excel单元格可能有数值、字符串、日期等类型,需根据CellType做对应转换(如日期类型需调用getDateCellValue)
  • 资源释放:使用完POI的Workbook后必须调用close()避免内存泄漏
  • 类型兼容性:Ballerina的record可直接转换为json,无需额外序列化操作,二者结构天然兼容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:15:18