Java中将Excel转换为JSON的两种方法

将Excel数据转换为JSON格式在许多 Java 应用程序中很常见,尤其是在处理不同系统之间的数据交换时。

在本教程中,我们将探讨在 Java 中将 Excel 文件转换为 JSON 的两种方法。

1、将 Apache POI 库与 JSON 结合使用
Apache POI是一个流行的 Java 库,用于读写Microsoft Office文件格式(包括 Excel)。因此,我们可以使用POI读取Excel文件并将数据转换为JSON格式。

在pom.xml中包含以下依赖项:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20230227</version>
</dependency>

读取Excel数据并转换为JSON
以下是示例 Java 代码,演示如何使用 Apache POI 读取 Excel 文件并将其数据转换为 JSON:

JSONArray jsonArray = new JSONArray();
public String expectedJson = "[[\"C1\",\"C2\",\"C3\",\"C4\",\"C5\"]," +
  "[\ŕ.0\",\Ŗ.0\",\ŗ.0\",\Ř.0\",\ř.0\"]," +
  "[\ŕ.0\",\Ŗ.0\",\ŗ.0\",\Ř.0\",\ř.0\"]," +
  "[\ŕ.0\",\Ŗ.0\",\ŗ.0\",\Ř.0\",\ř.0\"]," +
  "[\ŕ.0\",\Ŗ.0\",\ŗ.0\",\Ř.0\",\ř.0\"]]";
private Workbook workbook;
private Sheet sheet;
private InputStream inputStream;
public ExcelToJsonUnitTest() throws IOException {
    inputStream = new FileInputStream(filePath);
    workbook = new XSSFWorkbook(inputStream);
    sheet = workbook.getSheetAt(0);
}

将 Excel 转换为 JSON 首先初始化一个InputStream,该 InputStream 将filePath作为参数来读取 Excel 文件。

然后,我们将此文件加载到Workbook对象中,显式利用.xlsx文件的XSSFWorkbook实现。有了工作簿变量,就可以通过getSheetAt(0)方法访问所需的工作表(假设它是第一个工作表)。

现在,让我们使用 Apache POI 功能迭代工作表中的每一行和单元格来处理 Excel 数据:

Row headerRow = sheet.getRow(0);
List<String> headers = new ArrayList<>();
for (Cell cell : headerRow) {
    headers.add(cell.toString());
}
jsonArray.put(headers);

最初,我们使用sheet.getRow(0)检索Excel工作表的headerRow ,并使用headerRow.cellIterator()方法迭代标题行中的每个单元格。对于每个cell ,我们使用cell.toString()方法将其内容提取为字符串,并将其存储在jsonArray列表中。此过程可确保我们准确捕获所有标头值。

随后,我们将使用 for 循环遍历 Excel 工作表的每一行(不包括标题行):

for (int i = 1; i <= sheet.getLastRowNum(); i++) {
    Row row = sheet.getRow(i);
    List<String> rowData = new ArrayList<>();
    for (Cell cell : row) {
        rowData.add(cell.toString());
    }
    jsonArray.put(rowData);
}

在这里,我们使用sheet.getRow(i)检索每一行。此外,我们迭代当前行中的每个单元格并将其内容添加到rowData中。然后使用jsonArray.put()将该列表(表示 Excel 文件中的行)附加到JSONArray。

assertEquals(expectedJson, jsonArray.toString());
最后,我们使用assertEquals()断言它与预期的JSON字符串相等。

2、将 Apache POI 库与 Jackson 一起使用
Jackson是一个流行的用于 JSON 处理的 Java 库。它提供了强大的数据绑定功能,用于将 Java 对象转换为 JSON,反之亦然。

将以下依赖项添加到pom.xml中:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.0</version>
</dependency>

读取Excel数据并转换为JSON
这里的转换过程有所不同,因为它侧重于在序列化为 JSON 之前将 Excel 数据构建为 Java 对象。 Jackson 的ObjectMapper类在这里至关重要,因为它可以毫不费力地处理 Java 对象到 JSON 字符串的转换:

@Test
public void givenExcelFile_whenUsingJacksonConversion_thenConvertToJson() throws JsonProcessingException {
    List<List<String>> data = new ArrayList<>();
    Row headerRow = sheet.getRow(0);
    List<String> headers = new ArrayList<>();
    for (Cell cell : headerRow) {
        headers.add(cell.toString());
    }
    data.add(headers);
    for (int i = 1; i <= sheet.getLastRowNum(); i++) {
        Row row = sheet.getRow(i);
        List<String> rowData = new ArrayList<>();
        for (Cell cell : row) {
            rowData.add(cell.toString());
        }
        data.add(rowData);
    }
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(data);
    assertEquals(expectedJson, json);
}

在这里,我们初始化一个名为 data 的空数据列表,以结构化方式保存 Excel 数据。然后,它循环访问Excel 工作表的每一行,将单元格值转换为字符串并将它们存储在数据列表中。收集完所有数据后,我们利用 Jackson 的ObjectMapper使用writeValueAsString()方法将结构化列表转换为 JSON 字符串。

Jackson 的优势在于其强大的数据绑定功能,使其成为处理复杂对象结构和提供高级别抽象的理想选择。

结论
在本文中,我们讨论了在 Java 中将 Excel 文件转换为 JSON 格式的两种方法:使用 Apache POI 读取和处理 Excel 数据,然后使用JSON和 Jackson 库将其转换为 JSON。

这两个库都提供了读取 Excel 文件和操作其数据的便捷方法,使我们能够将 Excel 数据无缝转换为 JSON 对象,以便在 Java 应用程序中进一步处理。