Java Excel转JSON:高效数据转换的实践指南

引言:为什么需要Excel转JSON?

在企业级应用开发中,Excel常用于存储和导出数据,而JSON因其轻量级和易于解析的特性,成为Web API和数据交换的首选格式。使用Java进行Excel转JSON,能够实现自动化数据迁移、简化系统集成,并提升数据处理效率。

准备工作:选择合适的Java库

要实现Excel转JSON,需依赖以下核心库:

  • Apache POI:用于读取和操作Excel文件(.xls或.xlsx格式)。
  • Jackson:将Java对象序列化为JSON,或反序列化JSON数据。

通过Maven或Gradle添加依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.2</version>
</dependency>

基础步骤:实现简单的Excel转JSON

以下代码示例展示了如何将Excel单个工作表转换为JSON数组:

import org.apache.poi.ss.usermodel.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
import java.util.*;

public class ExcelToJsonConverter {
    public static void main(String[] args) throws Exception {
        // 1. 读取Excel文件
        FileInputStream fis = new FileInputStream("data.xlsx");
        Workbook workbook = WorkbookFactory.create(fis);
        Sheet sheet = workbook.getSheetAt(0);
        
        // 2. 获取表头(第一行)
        Row headerRow = sheet.getRow(0);
        List<String> headers = new ArrayList<>();
        for (Cell cell : headerRow) {
            headers.add(cell.getStringCellValue());
        }
        
        // 3. 遍历数据行并构建JSON对象
        List<Map<String, Object>> dataList = new ArrayList<>();
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            if (row == null) continue;
            Map<String, Object> dataMap = new LinkedHashMap<>();
            for (int j = 0; j < headers.size(); j++) {
                Cell cell = row.getCell(j);
                dataMap.put(headers.get(j), getCellValue(cell));
            }
            dataList.add(dataMap);
        }
        
        // 4. 转换为JSON并输出
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(dataList);
        System.out.println(json);
        
        workbook.close();
    }
    
    private static Object getCellValue(Cell cell) {
        if (cell == null) return null;
        switch (cell.getCellType()) {
            case STRING: return cell.getStringCellValue();
            case NUMERIC: return cell.getNumericCellValue();
            case BOOLEAN: return cell.getBooleanCellValue();
            default: return null;
        }
    }
}

此代码适用于结构简单的表格,能将每行数据映射为JSON对象,并组织成数组。

进阶处理:应对复杂场景

在实际项目中,可能需要处理更多复杂情况:

  • 多Sheet转换:遍历工作簿中的所有工作表,为每个Sheet生成独立的JSON结构。
  • 空值与格式处理:在getCellValue方法中增加日期、公式等单元格类型的判断,并对空值设置默认值。
  • 大文件优化:使用SAXParser事件驱动模式读取Excel,避免内存溢出。
  • 数据类型映射:通过注解或配置将Excel列名映射为自定义的JSON字段名。

总结与最佳实践

使用Java进行Excel转JSON,关键在于选择合适的库并设计健壮的数据读取逻辑。建议:

  1. 始终使用try-with-resources确保文件流关闭。
  2. 根据数据规模选择DOM或SAX解析方式。
  3. 结合POI的样式API保留单元格格式信息(如数字精度)。
  4. 通过单元测试验证转换结果的正确性。

掌握这些技巧后,您可以轻松应对各种数据转换需求,提升开发效率。