
JSON 广泛应用于 REST API、Web 服务和企业应用中的数据交换。然而,业务人员更习惯使用 Excel 进行报表展示、数据筛选和分析。因此,开发者在导出 API 响应、生成报表或向非技术人员共享结构化数据时,经常需要在 Java 中将 JSON 转换为 Excel。
Java 生态中有多种 JSON 处理库,但要将数据转换为结构良好的 Excel 文件,还需要处理列头、单元格类型、行遍历和输出格式等问题——如果没有合适的工具,这些工作会非常繁琐。Spire.XLS for Java 提供了简洁的 API,无需依赖 Microsoft Office 即可创建 Excel 工作簿,大幅简化了这一过程。
本文将介绍如何使用 Spire.XLS for Java 和 Jackson 在 Java 中将 JSON 转换为 Excel,涵盖 JSON 数组转换、嵌套 JSON 处理、JSON 文件读取、XLSX 和 XLS 导出、自适应列宽、格式化以及大数据集处理的最佳实践。
快速导航
- 为什么需要在 Java 中将 JSON 转换为 Excel
- 安装 Spire.XLS for Java
- 准备 JSON 数据
- 在 Java 中逐步将 JSON 转换为 Excel
- 完整的 Java 代码:将 JSON 转换为 Excel
- 在 Java 中将 JSON 导出为 XLSX
- 在 Java 中将嵌套 JSON 转换为 Excel
- 将 JSON 文件转换为 Excel
- 在 Excel 中自适应行高和列宽
- 为导出的 Excel 文件应用格式
- JSON 转 Excel 的常见挑战
- 为什么选择 Spire.XLS for Java
- 总结
- 常见问题
1. 为什么需要在 Java 中将 JSON 转换为 Excel
JSON 因其轻量且易于机器解析的特点,成为 REST API、Web 服务和企业应用中数据交换的主流格式。然而,业务人员通常需要 Excel 文件来进行报表展示、数据筛选、可视化和进一步分析。
在 Java 中将 JSON 转换为 Excel,能够有效打通后端系统与业务流程之间的壁垒。典型应用场景包括:
导出 API 数据
许多 REST API 返回 JSON 格式的响应。将这些响应转换为 Excel,用户无需手动处理原始 JSON,即可直接查看、筛选和分析数据。
生成报表
Java 应用可以将来自 API、数据库或其他数据源的 JSON 数据转换为结构化的 Excel 报表,包含表头、格式化和规范的表格布局。
共享结构化数据
Excel 文件便于分发,且支持图表、公式和数据透视表等分析工具。将 JSON 数据导出为 Excel,非技术用户也能直接使用这些功能。
2. 安装 Spire.XLS for Java
在开始转换之前,需要在项目中配置以下依赖。
Maven 依赖
Spire.XLS for Java 已通过 e-iceblue Maven 仓库发布。在 pom.xml 中添加仓库和依赖:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.6.5</version>
</dependency>
也可以下载 Spire.XLS for Java,手动将 JAR 文件添加到项目中。
添加 JSON 处理库
Java 没有内置的 JSON 支持。本指南使用 Jackson,这是 Java 生态中最广泛采用的 JSON 处理库:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>
导入必要的类
在 Java 源文件中添加以下导入语句:
import com.spire.xls.*;
import com.spire.xls.core.spreadsheet.collections.AutoFitType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
3. 准备 JSON 数据
为了演示转换过程,我们使用一个简单的 JSON 数组,其中每个对象代表一行数据,每个属性代表一列。这是 REST API 响应和数据导出中最常见的 JSON 结构。
示例:简单 JSON 数组
[
{
"ID": 1,
"Name": "陈明辉",
"Department": "销售部",
"Salary": 75000,
"HireDate": "2022-03-15"
},
{
"ID": 2,
"Name": "林雨婷",
"Department": "市场部",
"Salary": 68000,
"HireDate": "2021-07-01"
},
{
"ID": 3,
"Name": "赵文博",
"Department": "技术部",
"Salary": 92000,
"HireDate": "2023-01-10"
}
]
JSON 与 Excel 之间的映射关系非常直观:
- 每个 JSON 对象对应电子表格中的一行
- 每个属性名对应一个列头
- 每个属性值对应相应行和列中的单元格值
理解这一映射关系,有助于理解后续章节中的代码示例。
4. 在 Java 中逐步将 JSON 转换为 Excel
转换过程分为五个步骤:创建工作簿、获取工作表、解析 JSON 数据、写入列头和填充单元格值。本节逐一讲解每个步骤,最后给出完整代码。
第 1 步:创建工作簿
Workbook 类代表一个 Excel 文件。实例化该类即可创建一个新的空工作簿:
Workbook workbook = new Workbook();
第 2 步:获取工作表
一个工作簿包含一个或多个工作表。获取默认创建的第一个工作表,并可选择为其重命名:
Worksheet sheet = workbook.getWorksheets().get(0);
sheet.setName("员工数据");
第 3 步:读取 JSON 数据
使用 Jackson 的 ObjectMapper 将 JSON 字符串解析为 JsonNode 树。如果根元素是 JSON 数组,将其转换为 ArrayNode 以便遍历:
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
if (!rootNode.isArray()) {
throw new IllegalArgumentException("Expected a JSON array at the root level");
}
ArrayNode jsonArray = (ArrayNode) rootNode;
第 4 步:将 JSON 键名写入列头
从第一个 JSON 对象中提取字段名,写入工作表的第一行。注意 Spire.XLS 的行和列索引从 1 开始:
JsonNode firstObject = jsonArray.get(0);
int col = 1;
for (Iterator<Map.Entry<String, JsonNode>> it = firstObject.fields(); it.hasNext(); ) {
Map.Entry<String, JsonNode> entry = it.next();
sheet.get(1, col).setValue(entry.getKey());
col++;
}
第 5 步:将 JSON 值写入 Excel 单元格
遍历数组中的每个 JSON 对象,将其值写入对应的行。由于第 1 行已是列头,数据从第 2 行开始写入:
for (int i = 0; i < jsonArray.size(); i++) {
JsonNode record = jsonArray.get(i);
int dataRow = i + 2;
int dataCol = 1;
for (Iterator<Map.Entry<String, JsonNode>> it = record.fields(); it.hasNext(); ) {
Map.Entry<String, JsonNode> entry = it.next();
JsonNode value = entry.getValue();
if (value.isNumber()) {
sheet.get(dataRow, dataCol).setNumberValue(value.doubleValue());
} else if (value.isBoolean()) {
sheet.get(dataRow, dataCol).setBooleanValue(value.booleanValue());
} else {
sheet.get(dataRow, dataCol).setValue(value.asText());
}
dataCol++;
}
}
这种方式保留了数据类型——数值和布尔值以对应的类型写入单元格,而非作为字符串存储,从而确保生成的 Excel 文件中数值排序、筛选和公式计算能够正常工作。
5. 完整的 Java 代码:将 JSON 转换为 Excel
以下是完整的可运行程序,读取 JSON 字符串并将其转换为 Excel 文件,展示了在 Java 中将 JSON 转换为 Excel 的完整流程:
import com.spire.xls.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import java.io.File;
import java.util.Iterator;
import java.util.Map;
public class JsonToExcelConverter {
public static void main(String[] args) {
// 示例 JSON 数据——员工记录数组
String jsonString = "["
+ "{\"ID\":1,\"Name\":\"陈明辉\",\"Department\":\"销售部\",\"Salary\":75000,\"HireDate\":\"2022-03-15\"},"
+ "{\"ID\":2,\"Name\":\"林雨婷\",\"Department\":\"市场部\",\"Salary\":68000,\"HireDate\":\"2021-07-01\"},"
+ "{\"ID\":3,\"Name\":\"赵文博\",\"Department\":\"技术部\",\"Salary\":92000,\"HireDate\":\"2023-01-10\"}"
+ "]";
try {
// 将 JSON 字符串解析为 JsonNode 树结构
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
if (!rootNode.isArray()) {
throw new IllegalArgumentException("Expected a JSON array at the root level");
}
ArrayNode jsonArray = (ArrayNode) rootNode;
// 创建新工作簿并获取第一个工作表
Workbook workbook = new Workbook();
Worksheet sheet = workbook.getWorksheets().get(0);
sheet.setName("员工数据");
// 从第一个 JSON 对象的键名提取列头
JsonNode firstObject = jsonArray.get(0);
int col = 1;
for (Iterator<Map.Entry<String, JsonNode>> it = firstObject.fields(); it.hasNext(); ) {
Map.Entry<String, JsonNode> entry = it.next();
sheet.get(1, col).setValue(entry.getKey());
col++;
}
// 将 JSON 值逐行写入 Excel
for (int i = 0; i < jsonArray.size(); i++) {
JsonNode record = jsonArray.get(i);
int dataRow = i + 2;
int dataCol = 1;
for (Iterator<Map.Entry<String, JsonNode>> it = record.fields(); it.hasNext(); ) {
Map.Entry<String, JsonNode> entry = it.next();
JsonNode value = entry.getValue();
// 保留数据类型:数值和布尔值以对应类型写入单元格
if (value.isNumber()) {
sheet.get(dataRow, dataCol).setNumberValue(value.doubleValue());
} else if (value.isBoolean()) {
sheet.get(dataRow, dataCol).setBooleanValue(value.booleanValue());
} else {
sheet.get(dataRow, dataCol).setValue(value.asText());
}
dataCol++;
}
}
// 自适应列宽,提升可读性
sheet.getAllocatedRange().autoFitColumns();
// 将工作簿保存为 XLSX 文件
workbook.saveToFile("员工数据.xlsx", ExcelVersion.Version2016);
System.out.println("JSON 已成功转换为 Excel 文件。");
// 释放资源
workbook.dispose();
} catch (Exception e) {
System.err.println("JSON 转 Excel 过程中发生错误:" + e.getMessage());
e.printStackTrace();
}
}
}
运行程序后,JSON 数据将被转换为 Excel 工作表。生成的 员工数据.xlsx 文件包含员工记录,数据类型得以保留,列宽已自动调整:

Spire.XLS 核心类和方法
- Workbook — 代表一个 Excel 文件,负责创建工作簿、管理工作表和保存文件。
- Worksheet — 代表工作簿中的单个工作表,提供对单元格、行和列的访问。
get(int row, int column)— 返回指定单元格的CellRange对象。行和列索引从 1 开始。setValue(String)— 将单元格值设置为字符串,用于文本和表头。setNumberValue(double)— 将单元格值设置为数值,保留数值类型以支持计算。setBooleanValue(boolean)— 将单元格值设置为布尔值(TRUE/FALSE)。saveToFile(String, ExcelVersion)— 将工作簿按指定 Excel 格式保存到文件。dispose()— 释放工作簿占用的非托管资源。
如果还需要将 Excel 文件转换回 JSON 格式,请参阅我们关于如何在 Java 中将 Excel 转换为 JSON的指南。
6. 在 Java 中将 JSON 导出为 XLSX
Spire.XLS for Java 同时支持现代的 XLSX 格式(Excel 2007 及以上版本)和传统的 XLS 格式(Excel 97–2003)。通过向 saveToFile() 传递不同的 ExcelVersion 枚举值,即可控制输出格式。
保存为 XLSX
// 导出为现代 Excel 格式(.xlsx)
workbook.saveToFile("员工数据.xlsx", ExcelVersion.Version2016);
保存为 XLS
// 导出为传统 Excel 格式(.xls)
workbook.saveToFile("员工数据.xls", ExcelVersion.Version97to2003);
| 格式 | 说明 | 适用场景 |
|---|---|---|
| XLSX | 现代 Excel 格式(Excel 2007+) | 默认选择;文件更小,功能更完整 |
| XLS | 传统 Excel 格式(Excel 97–2003) | 需要兼容旧版系统时使用 |
同一个工作簿对象可以保存为上述任意格式,只需修改文件扩展名和版本参数即可,无需其他代码改动。这在应用需要同时支持新旧环境时尤为实用。
如需了解格式迁移或旧版升级的场景,还可以参考如何在 Java 中转换 XLS 和 XLSX 格式。
7. 在 Java 中将嵌套 JSON 转换为 Excel
实际项目中的 JSON 数据通常包含嵌套的对象和数组。要将嵌套 JSON 写入 Excel,需要将层级结构扁平化为表格格式,每个嵌套字段作为独立的列。
以下 JSON 包含带有嵌套联系方式的员工记录:
[
{
"ID": 1,
"Name": "陈明辉",
"Department": "销售部",
"Contact": {
"Email": "该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。","Phone":"555-0101"}},{"ID":2,"Name":"林雨婷","Department":"市场部","Contact":{"Email":"该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。","Phone":"555-0102"}}] 目标是将 Contact对象扁平化,使 Email和 Phone成为独立的列:
| ID | Name | Department | Contact.Email | Contact.Phone |
|---|---|---|---|---|
| 1 | 陈明辉 | 销售部 | 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 | 555-0101 |
| 2 | 林雨婷 | 市场部 | 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 | 555-0102 |
以下代码使用递归扁平化方法,可处理任意深度的嵌套:
import com.spire.xls.*;import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.node.ArrayNode;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.Map;public class NestedJsonToExcel{public static void main(String[] args){String jsonString = "["+ "{\"ID\":1,\"Name\":\"陈明辉\",\"Department\":\"销售部\","+ "\"Contact\":{\"Email\":\"该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。\",\"Phone\":\"555-0101\"}},"+ "{\"ID\":2,\"Name\":\"林雨婷\",\"Department\":\"市场部\","+ "\"Contact\":{\"Email\":\"该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。\",\"Phone\":\"555-0102\"}}"+ "]";try{ObjectMapper mapper = new ObjectMapper();ArrayNode jsonArray = (ArrayNode) mapper.readTree(jsonString);Workbook workbook = new Workbook();Worksheet sheet = workbook.getWorksheets().get(0);sheet.setName("员工信息");// 扁平化第一个对象,提取所有列头(包括嵌套键) LinkedHashMap<String,String>firstFlat = flattenJson(jsonArray.get(0),"");int col = 1;for (String key:firstFlat.keySet()){sheet.get(1,col).setValue(key);col++;}// 写入数据行 for (int i = 0;i <jsonArray.size();i++){LinkedHashMap<String,String>flat = flattenJson(jsonArray.get(i),"");int dataRow = i + 2;int dataCol = 1;for (String key:firstFlat.keySet()){String value = flat.getOrDefault(key,"");sheet.get(dataRow,dataCol).setValue(value);dataCol++;}}sheet.getAllocatedRange().autoFitColumns();workbook.saveToFile("NestedEmployees.xlsx",ExcelVersion.Version2016);System.out.println("嵌套 JSON 已成功转换为 Excel 文件。");workbook.dispose();}catch (Exception e){System.err.println("错误:"+ e.getMessage());}}private static LinkedHashMap<String,String>flattenJson(JsonNode node,String prefix){LinkedHashMap<String,String>flat = new LinkedHashMap<>();if (node.isObject()){for (Iterator<Map.Entry<String,JsonNode>>it = node.fields();it.hasNext();){Map.Entry<String,JsonNode>entry = it.next();String newPrefix = prefix.isEmpty() ? entry.getKey():prefix + "."+ entry.getKey();flat.putAll(flattenJson(entry.getValue(),newPrefix));}}else{flat.put(prefix,node.asText());}return flat;}}flattenJson方法递归遍历每个 JSON 对象。遇到嵌套对象时,以点号作为分隔符拼接父键名(如 Contact.Email);到达叶子节点时,将完整的点分隔键及其值存入 Map。这确保了任意嵌套深度的字段都能在 Excel 中表示为独立的列。

8. 将 JSON 文件转换为 Excel
在实际应用中,JSON 数据通常来自磁盘文件,而非内联字符串。转换步骤保持不变,只是 JSON 的数据源不同。Jackson 的 ObjectMapper可以直接从 File对象读取:
import com.spire.xls.*;import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.node.ArrayNode;import java.io.File;import java.util.Iterator;import java.util.Map;public class JsonFileToExcel{public static void main(String[] args){try{// 第 1 步:读取并解析 JSON 文件 ObjectMapper mapper = new ObjectMapper();JsonNode rootNode = mapper.readTree(new File("employees.json"));if (!rootNode.isArray()){throw new IllegalArgumentException("Expected a JSON array at the root level");}ArrayNode jsonArray = (ArrayNode) rootNode;// 第 2 步:创建工作簿 Workbook workbook = new Workbook();Worksheet sheet = workbook.getWorksheets().get(0);sheet.setName("员工信息");// 第 3 步:从第一个对象提取列头 JsonNode firstObject = jsonArray.get(0);int col = 1;for (Iterator<Map.Entry<String,JsonNode>>it = firstObject.fields();it.hasNext();){Map.Entry<String,JsonNode>entry = it.next();sheet.get(1,col).setValue(entry.getKey());col++;}// 第 4 步:写入数据行 for (int i = 0;i <jsonArray.size();i++){JsonNode record = jsonArray.get(i);int dataRow = i + 2;int dataCol = 1;for (Iterator<Map.Entry<String,JsonNode>>it = record.fields();it.hasNext();){Map.Entry<String,JsonNode>entry = it.next();JsonNode value = entry.getValue();if (value.isNumber()){sheet.get(dataRow,dataCol).setNumberValue(value.doubleValue());}else if (value.isBoolean()){sheet.get(dataRow,dataCol).setBooleanValue(value.booleanValue());}else{sheet.get(dataRow,dataCol).setValue(value.asText());}dataCol++;}}// 第 5 步:导出为 Excel sheet.getAllocatedRange().autoFitColumns();workbook.saveToFile("EmployeesFromJson.xlsx",ExcelVersion.Version2016);System.out.println("JSON 文件已成功转换为 Excel。");workbook.dispose();}catch (Exception e){System.err.println("读取 JSON 文件时出错:"+ e.getMessage());e.printStackTrace();}}}这种方式能够高效处理大型 JSON 文件,因为 Jackson 以流式树模型处理文件。对于超大 JSON 文件(数百 MB),建议使用 Jackson 的 JsonParser流式模式逐条读取记录,避免将整个文件一次性加载到内存中。
9. 在 Excel 中自适应行高和列宽
将 JSON 数据写入 Excel 单元格后,默认列宽可能不足以显示所有内容,文本值(如邮箱地址、URL 或较长的描述)会被截断。Spire.XLS 提供了自适应方法,可根据内容自动调整列宽和行高:
// 自适应已用区域的所有列宽和行高 sheet.getAllocatedRange().autoFitColumns();sheet.getAllocatedRange().autoFitRows();在写入所有数据之后、保存工作簿之前添加以上代码。getAllocatedRange()方法返回包含数据的单元格区域,因此只有已填充的单元格会受到影响。
如需更精细的控制,可以对单独列执行自适应:
// 自适应特定列(例如第 3 列) sheet.getAllocatedRange().getColumns()[2].autoFitColumns();自适应处理能让电子表格更加专业和易读,尤其在 JSON 数据包含长度不一的文本字段时效果明显。下图对比了原始导出与应用自适应后的效果差异。
10. 为导出的 Excel 文件应用格式
原始数据导出往往需要进一步格式化,才能满足企业报表的要求。Spire.XLS for Java 提供了丰富的单元格格式化 API,支持设置表头样式、数字格式和日期格式——全部通过代码完成。
格式化表头行
为第一行应用加粗字体和背景色,使表头与数据区分开来:
import com.spire.xls.core.spreadsheet.styles.CellStyle;import java.awt.Color;// 为表头行应用格式 CellRange headerRange = sheet.getAllocatedRange().getRows()[0];headerRange.getStyle().setFont(new ExcelFont(true));headerRange.getStyle().setColor(Color.decode("#4472C4"));headerRange.getStyle().getFont().setColor(Color.WHITE);headerRange.setStyle(headerRange.getStyle());格式化数字
为数值列应用货币或百分比格式:
// 将 Salary 列(第 4 列)格式化为货币格式 CellRange salaryColumn = sheet.getAllocatedRange().getColumns()[3];salaryColumn.setNumberFormat("$#,##0.00");格式化日期
如果 JSON 中包含日期字符串,可以对相应列设置统一的日期显示格式:
// 将 HireDate 列(第 5 列)格式化为日期格式 CellRange dateColumn = sheet.getAllocatedRange().getColumns()[4];dateColumn.setNumberFormat("yyyy-mm-dd");上述格式化方法可以组合使用,生成专业的 Excel 报表。如需了解更全面的 Excel 格式化功能,请参考如何使用 Spire.XLS 在 Java 中创建和格式化 Excel 文件。
11. JSON 转 Excel 的常见挑战
实际项目中的 JSON 数据往往不如教程示例那样理想。以下是开发者在转换过程中最常遇到的问题及对应的解决方案。
对象间字段不一致
同一数组中的不同 JSON 对象可能包含不同的字段。某条记录可能包含 Phone字段,而另一条则完全没有。如果代码假设所有对象具有相同的键,缺失的字段会导致 Excel 输出中的列错位。
解决方案:先收集所有对象中的全部唯一键,再按统一的键列表写入每条记录的值:
// 收集所有 JSON 对象中的唯一键 LinkedHashSet<String>allKeys = new LinkedHashSet<>();for (JsonNode record:jsonArray){record.fieldNames().forEachRemaining(allKeys::add);}// 按完整的键集合写入列头 int col = 1;for (String key:allKeys){sheet.get(1,col).setValue(key);col++;}// 写入值,缺失字段以空字符串填充 for (int i = 0;i <jsonArray.size();i++){JsonNode record = jsonArray.get(i);int dataRow = i + 2;int dataCol = 1;for (String key:allKeys){JsonNode value = record.get(key);String cellValue = (value != null &&!value.isNull()) ? value.asText():"";sheet.get(dataRow,dataCol).setValue(cellValue);dataCol++;}}嵌套对象
JSON 对象可以包含任意深度的嵌套。如果直接将嵌套对象写入单元格,输出结果将是不可读的 [object Object]或序列化后的 JSON 字符串。
解决方案:使用第 7 节中演示的递归扁平化方法。flattenJson方法遍历整个对象树,生成扁平的键值对,嵌套键以点号分隔。
大型 JSON 文件
将超大 JSON 文件(数百 MB 或更大)解析为单一的内存树结构可能导致 Java 的 OutOfMemoryError。此外,逐单元格写入数万行数据也会很慢。
解决方案:使用 Jackson 的流式 API(JsonParser)逐条读取 JSON 记录,每读取一条立即写入 Excel。这样无论文件多大,内存占用都保持恒定:
import com.fasterxml.jackson.core.JsonFactory;import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonToken;JsonFactory factory = new JsonFactory();try (JsonParser parser = factory.createParser(new File("large_data.json"))){int dataRow = 2;while (parser.nextToken() != JsonToken.END_ARRAY){// 逐条解析对象 JsonNode record = mapper.readTree(parser);// 写入 Excel... dataRow++;}}数据类型转换
JSON 支持字符串、数值、布尔值、null、数组和对象。Excel 单元格支持文本、数值、布尔值、日期和错误值。类型不匹配——例如将数值存储为字符串——会导致 Excel 的排序和公式功能无法正常工作。
解决方案:在写入单元格前检查每个 JSON 值的类型。数值使用 setNumberValue(),布尔值使用 setBooleanValue(),文本使用 setValue()。对于 null值,写入空字符串或占位符。对于日期字符串,将其解析为 Date对象后使用 setDateTimeValue()写入为 Excel 日期单元格:
if (value == null || value.isNull()){sheet.get(dataRow,dataCol).setValue("");}else if (value.isNumber()){sheet.get(dataRow,dataCol).setNumberValue(value.doubleValue());}else if (value.isBoolean()){sheet.get(dataRow,dataCol).setBooleanValue(value.booleanValue());}else{sheet.get(dataRow,dataCol).setValue(value.asText());}12. 为什么选择 Spire.XLS for Java 进行 JSON 转 Excel
以下特性使 Spire.XLS for Java 在企业 Java 应用的 JSON 转 Excel 场景中表现出色。
无需安装 Microsoft Excel
Spire.XLS for Java 是一个独立的库,不依赖 Microsoft Office 或任何外部软件。它可以在任何安装了 Java 运行环境的系统上运行,包括 Linux 服务器、Docker 容器和未安装 Office 的云平台。
同时支持 XLS 和 XLSX
该库同时支持传统的 XLS 格式(Excel 97–2003)和现代的 XLSX 格式(Excel 2007+)。只需修改一个参数即可导出为任意格式,轻松适配不同的下游环境。
丰富的格式化功能
除了基本的单元格值写入,Spire.XLS 还提供全面的格式化能力——单元格样式、数字格式、字体、颜色、边框、条件格式、图表和数据透视表。可以直接从 JSON 数据生成专业级的 Excel 文件,无需在 Excel 中进行后处理。
简洁的 API
API 遵循直观的对象模型:Workbook包含 Worksheets,每个 Worksheet包含 CellRanges,每个 CellRange支持值设置、样式和格式化。熟悉 Excel 对象模型的开发者可以快速上手。
适用于企业级应用
Spire.XLS for Java 专为服务端和企业场景设计。它能高效处理大文件,支持多线程访问模式,并与 Spring Boot、Jakarta EE 等企业级 Java 框架无缝集成。
可以申请 30 天免费许可证来在项目中评估所有功能。
13. 总结
本文详细介绍了如何使用 Spire.XLS for Java 和 Jackson 在 Java 中将 JSON 转换为 Excel。通过解析 JSON 数据、将值写入 Excel 工作表,并将工作簿导出为 XLSX 或 XLS 文件,开发者可以高效地将结构化 JSON 数据转换为易读的电子表格。
Spire.XLS for Java 提供了一种简洁灵活的方式来从 JSON 数据生成 Excel 文件,无需依赖 Microsoft Office 或其他外部依赖。同时支持格式化、自适应列宽以及处理复杂数据结构等高级功能,满足专业 Excel 报表的生成需求。
14. 常见问题
如何在 Java 中将 JSON 转换为 Excel?
使用 Jackson 的 ObjectMapper解析 JSON 数据,通过 Spire.XLS for Java 创建 Workbook和 Worksheet,将 JSON 键名写入第一行作为列头,然后遍历 JSON 数组填充每一行数据。最后使用 saveToFile()配合指定的 ExcelVersion保存工作簿。完整代码示例见第 5 节。
在没有安装 Microsoft Excel 的情况下,能在 Java 中将 JSON 转换为 XLSX 吗?
可以。Spire.XLS for Java 是一个独立的库,不需要 Microsoft Office 或其他软件。它能完全在 Java 中创建、读取和写入 XLSX 文件,适用于运行在 Linux、Docker 或云平台上的服务端应用。
转换嵌套 JSON 对象到 Excel 时如何处理?
使用递归扁平化函数遍历 JSON 对象树,生成扁平的键值对。嵌套键以点号分隔(如 Contact.Email),扁平化后的键作为 Excel 中的列头。完整实现见第 7 节。
Spire.XLS 中 setValue() 和 setNumberValue() 有什么区别?
setValue(String)将字符串值写入单元格,而 setNumberValue(double)将数值写入单元格,Excel 会将其作为数字处理。对数值类型的 JSON 字段使用 setNumberValue()可以确保排序、筛选和公式计算正常工作。类似地,setBooleanValue(boolean)写入的是类型化的布尔值。
如何在不内存溢出的情况下将大型 JSON 文件转换为 Excel?
对于大型 JSON 文件,使用 Jackson 的流式 API(JsonParser)逐条读取和处理 JSON 记录,而非将整个文件加载到内存中。每解析一条记录就立即写入 Excel 工作表,这样无论文件多大,内存占用都保持恒定。
Spire.XLS for Java 是免费的吗?
Spire.XLS for Java 是商业库。同时提供 Free Spire.XLS for Java免费版本,但在工作表数量和功能上有限制。也可以申请 30 天免费许可证来评估完整功能后再决定是否购买。









