1. 概述

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

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

2. 使用Apache POI库与JSON

Apache POI 是一个流行的Java库,用于读写包括Excel在内的Microsoft Office文件格式。因此,我们可以利用POI来读取Excel文件并将其数据转换为JSON格式。

2.1. 添加Apache POI和JSON依赖项

首先,我们需要在项目中添加Apache POIJSON的依赖。如果使用Maven,可以在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>

2.2. 读取Excel数据并转换为JSON

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

JSONArray jsonArray = new JSONArray();

将Excel转换为JSON的步骤始于通过filePath参数初始化一个InputStream以读取Excel文件。

然后,我们使用XSSFWorkbook实现将此文件加载到Workbook对象中,针对.xlsx文件。有了workbook变量,可以通过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.cellIterator()方法迭代标题行中的每个单元格。对于每个单元格,我们使用cell.toString()方法提取其内容作为字符串,并将其存储在jsonArray列表中。这确保了准确地捕获所有标题值。

随后,我们将使用一个循环遍历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)获取每一行。此外,我们遍历当前row中的每个单元格,并将其内容添加到rowData中。这个列表代表Excel文件中的行,然后使用jsonArray.put()将其添加到JSONArray中。

assertEquals(expectedJson, jsonArray.toString());

最后,我们使用assertEquals()方法验证其与预期的JSON字符串是否相等。

3. 使用Apache POI库与Jackson

Jackson 是一个流行的Java库,用于JSON处理。它提供了强大的数据绑定功能,可以轻松地将Java对象转换为JSON和反向转换。

3.1. 添加Jackson依赖项

我们首先在pom.xml中添加以下依赖

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

3.2. 读取Excel数据并转换为JSON

这里的转换过程有所不同,因为它侧重于首先将Excel数据结构化为Java对象,然后再序列化为JSON。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工作表的每一行,将单元格值转换为字符串并存储在data列表中。收集完所有数据后,我们使用Jackson的ObjectMapper将结构化的列表转换为JSON字符串,使用writeValueAsString()方法。

Jackson的优势在于其强大的数据绑定能力,使其非常适合处理复杂对象结构,并提供高度抽象。

4. 总结

在这篇文章中,我们讨论了使用Apache POI和Jackson库将Excel文件转换为JSON格式的两种方法:使用POI读取和处理Excel数据,然后通过JSON和Jackson库将其转换为JSON对象。这两个库都提供了方便的方式来读取Excel文件并操作其数据,使我们能够无缝地将Excel数据转换为JSON对象,以便在Java应用程序中进一步处理。如需完整代码示例,请参阅GitHub上的文章