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 POI和JSON的依赖。如果使用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上的文章。