news 2026/9/16 10:38:46

Java实现JSON转Excel嵌入式流水线工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java实现JSON转Excel嵌入式流水线工具

简介:这是一款面向Web开发与数据分析师的JSON/HTML/网络抓包三合一Excel导出工具,解决多源异构数据(如API返回JSON、网页HTML结构、HTTP通信包)难以直观分析与存档的痛点。资源为Java编写的桌面应用工程,共21个文件,含8个核心Java源码(如Json2Excle.java、HtmlStart.java、Url.java等)、9个编译后class文件,以及Eclipse项目配置文件(.project、.classpath、.prefs),整体仅27KB,轻量易部署。已有567人学习下载,适合具备基础Java开发能力或需快速处理前端调试数据的技术人员。用户可直接导入Eclipse运行,支持JSON对象转Excel工作表(自动映射键为列名)、HTML内容结构化解析导出、以及网站抓包信息(URL/状态码/Headers等)批量存入Excel,所有功能模块代码清晰分层,便于二次开发与定制化扩展。

1. 这不是个“JSON转Excel”按钮,而是一套嵌入式数据流水线

你手头有一份从接口抓下来的 JSON 响应体,嵌套了 4 层对象、混着数组和 null 值,还夹着 HTML 片段;你想把它塞进 Excel——但不是简单 flatten 后丢进 A1 单元格。你真正需要的是:字段自动映射成列头、数组展开为多行、HTML 标签剥离后保留文本、URL 和响应头单独建 sheet、甚至把抓包时的 timestamp 和 status code 也带上。Json2ExcleTool 就是干这个的:它不依赖 Excel GUI,不走 Office COM,也不调用在线 API,而是用纯 Java 实现了一条从网络层(HTTP 抓包)→ 解析层(JSON/HTML)→ 存储层(XLSX)的端到端流水线。它适合 Web 开发者做接口调试、测试工程师导出测试数据、数据分析师清洗爬虫结果——尤其当你需要把「一次抓包动作」里所有可结构化信息(请求 URL、Headers、Body JSON、渲染后 HTML 文本)全部归档到同一 Excel 文件的不同 sheet 中时,这个工具比写 Python 脚本快 3 分钟,比手动复制粘贴准 100%。

2. 工具链拆解:从 .class 文件反推核心模块职责与协作逻辑

2.1 源码结构即架构图:6 个核心类如何分工

压缩包中bin/目录下的.class文件与src/下的.java文件一一对应,说明这是一个编译后可直接运行的 Java 工程(JDK 8+ 兼容)。我们按功能域反向梳理:

类名主要职责关键依赖典型输入/输出
Url.class封装 HTTP 请求地址、协议、端口、路径等元信息https://api.example.com/v1/users?page=1Url对象
GetJson.class发起 HTTP GET 请求,捕获响应 Body 并尝试解析为JSONObjectJSONArrayUrl,Util4html返回原始 JSON 字符串或解析失败异常
HtmlStart.class启动 HTML 解析流程,调用Util4html提取<title><meta><a href>等结构化字段Util4htmlHTML 字符串 →Map<String, List<String>>(如"links" → ["https://a.com", "https://b.com"]
ReadExcel.class非读取,而是定义 Excel 写入契约:创建 Workbook、Sheet、Row、Cell 的标准操作封装Apache POIList<Map<String, Object>>.xlsx文件流
Json2Excle.class核心转换器:递归遍历 JSON 结构,识别 object/array/primitive,生成扁平化列名(如user.profile.name),处理 null/boolean/date 类型映射ReadExcel,FilesRWJSONObject→ 多 sheet 的XSSFWorkbook
ToolStart.class主入口:解析命令行参数(-json file.json/-url https://.../-html page.html),调度对应模块,统一调用FilesRW.writeToFile()输出 Excel所有其他类启动整个流水线

提示:Excel.class是一个被多次引用但未在源码列表中显式出现的辅助类,实际应为org.apache.poi.ss.usermodel.Workbook的包装,用于屏蔽 POI 版本差异。项目未打包 POI 依赖,需自行添加poi-5.2.4.jarpoi-ooxml-5.2.4.jar到 classpath。

2.2 JSON 到 Excel 的映射规则:为什么{"a": {"b": [1,2]}}会生成 3 行?

Json2Excle.java的核心逻辑在于flattenJson()方法——它不是简单地把 key 当列名、value 当单元格值,而是遵循一套可配置的展平策略:

// Json2Excle.java 片段(已还原关键逻辑) private void flattenJson(Object obj, String prefix, Map<String, Object> flatMap) { if (obj instanceof JSONObject) { JSONObject json = (JSONObject) obj; Iterator<String> keys = json.keys(); while (keys.hasNext()) { String key = keys.next(); Object value = json.get(key); String newPrefix = prefix.isEmpty() ? key : prefix + "." + key; // 支持嵌套路径 flattenJson(value, newPrefix, flatMap); } } else if (obj instanceof JSONArray) { JSONArray array = (JSONArray) obj; for (int i = 0; i < array.length(); i++) { Object item = array.get(i); String newPrefix = prefix + "[" + i + "]"; // 数组索引显式标记 flattenJson(item, newPrefix, flatMap); } } else { // 基础类型:String/Number/Boolean/NULL flatMap.put(prefix, obj == JSONObject.NULL ? "" : obj.toString()); } }

这段代码决定了最终 Excel 的列结构:

  • 输入{"user": {"name": "Alice", "tags": ["dev", "java"]}}
  • 输出列名:user.name,user.tags[0],user.tags[1]
  • tags长度不一致(如第二条数据只有 1 个 tag),则user.tags[1]列自动补空字符串
2.2.1 字段映射的隐式约定与显式覆盖

工具默认将 JSON key 作为 Excel 列头,但可通过Json2Excle.setCustomHeaderMapping(Map<String, String>)注入自定义映射:

// 在 ToolStart.java 中调用示例 Json2Excle converter = new Json2Excle(); Map<String, String> headerMap = new HashMap<>(); headerMap.put("user.name", "员工姓名"); // 重命名列 headerMap.put("user.id", "工号"); // 重命名列 headerMap.put("user.tags[0]", "主技能"); // 重命名数组首项 converter.setHeaderMapping(headerMap);

注意:setHeaderMapping()必须在convert()之前调用,且 key 必须与flattenJson()生成的扁平化路径完全一致(区分大小写、含[0]索引)。若未设置映射,列头直接显示user.name这类路径,对非技术人员不友好。

2.3 抓包与 HTML 解析:GetJsonUtil4html如何协同工作

GetJson.java并非仅发送 GET 请求,它内置了简易抓包能力——通过HttpURLConnection获取完整响应头,并将responseCodecontentTypedate等字段存入Map<String, String>

// GetJson.java 片段 public Map<String, Object> fetchWithHeaders(String urlString) throws IOException { URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(10000); Map<String, Object> result = new HashMap<>(); result.put("url", urlString); result.put("status_code", conn.getResponseCode()); // 200, 404... result.put("content_type", conn.getContentType()); // application/json result.put("response_body", readResponseBody(conn)); // JSON 字符串 // 提取响应头 Map<String, List<String>> headers = conn.getHeaderFields(); result.put("headers", headers); // 供后续写入独立 sheet return result; }

Util4html.java则使用Jsoup(项目未显式声明依赖,但HtmlStart.java导入了org.jsoup.Jsoup)解析 HTML:

// Util4html.java 片段 public Map<String, List<String>> extractHtmlElements(String html) { Document doc = Jsoup.parse(html); Map<String, List<String>> elements = new HashMap<>(); elements.put("title", Collections.singletonList(doc.title())); // <title>内容</title> elements.put("meta_description", doc.select("meta[name=description]").eachAttr("content")); // <meta name="description" content="..."/> elements.put("links", doc.select("a[href]").eachAttr("href")); // 所有 <a> 的 href 属性 return elements; }

ToolStart.java将二者结果合并:GetJson.fetchWithHeaders()返回的response_body若为 HTML,则传给Util4html.extractHtmlElements();若为 JSON,则传给Json2Excle.convert()。最终所有数据(URL 元信息、HTTP 头、JSON 解析结果、HTML 提取字段)被写入同一 Excel 文件的不同 sheet。

3. 实战:三步完成「抓包→解析→导出」全流程

3.1 环境准备:JDK 8+ 与 Apache POI 依赖安装

该工具需本地 Java 运行环境,且必须手动引入 Apache POI 库(因未打包进 jar)。验证 JDK 版本并下载依赖:

# 1. 检查 JDK(必须 8 或更高) java -version # 输出应类似:openjdk version "1.8.0_362" # 2. 创建 lib 目录并下载 POI(推荐 5.2.4,兼容 JDK 8) mkdir -p Json2ExcleTool/lib cd Json2ExcleTool/lib wget https://repo1.maven.org/maven2/org/apache/poi/poi/5.2.4/poi-5.2.4.jar wget https://repo1.maven.org/maven2/org/apache/poi/poi-ooxml/5.2.4/poi-ooxml-5.2.4.jar wget https://repo1.maven.org/maven2/org/apache/xmlbeans/xmlbeans/5.1.0/xmlbeans-5.1.0.jar # poi-ooxml 依赖

提示:若无法访问 Maven Central,可从 Apache 官网下载poi-bin-5.2.4.zip,解压后取poi-5.2.4.jarpoi-ooxml-5.2.4.jarlib/xmlbeans-5.1.0.jar三个文件。

3.2 命令行启动与参数详解

解压Json2ExcleTool.zip后,进入根目录(含bin/src/lib/),执行:

# 方式一:直接运行已编译的 class(需指定 classpath) java -cp "bin:lib/*" ToolStart -json example.json -output report.xlsx # 方式二:先编译再运行(若需修改源码) javac -cp "lib/*" -d bin src/*.java java -cp "bin:lib/*" ToolStart -url https://httpbin.org/json -output api_report.xlsx # 方式三:解析本地 HTML 文件 java -cp "bin:lib/*" ToolStart -html index.html -output html_analysis.xlsx
3.2.1 支持的命令行参数表
参数必填说明示例
-json <file>指定本地 JSON 文件路径,优先级高于-url-json ./data/users.json
-url <url>指定 HTTP URL,工具自动 GET 并解析响应-url https://jsonplaceholder.typicode.com/posts/1
-html <file>指定本地 HTML 文件路径,解析其结构化内容-html ./pages/login.html
-output <file>指定输出 Excel 文件路径(.xlsx 后缀)-output ./output/result.xlsx
-sheetname <name>自定义主数据 sheet 名称(默认Data-sheetname Raw_JSON
-timeout <ms>设置 HTTP 请求超时(毫秒,默认 5000)-timeout 10000

注意:-json-url-html三者互斥,同时指定多个时仅第一个生效。-output必须提供,否则抛出IllegalArgumentException

3.3 一次完整抓包导出示例:从接口获取用户列表并分析响应头

假设你要分析https://reqres.in/api/users?page=2的响应结构:

# 1. 执行抓包并导出 java -cp "bin:lib/*" ToolStart \ -url https://reqres.in/api/users?page=2 \ -output users_analysis.xlsx \ -timeout 8000 # 2. 查看生成的 Excel(共 4 个 sheet) # - Sheet1: Data → JSON 解析后的扁平化数据(id, email, first_name, last_name, avatar, ...) # - Sheet2: Headers → HTTP 响应头(Date, Content-Type, X-RateLimit-Limit, ...) # - Sheet3: UrlInfo → 请求 URL、状态码、响应时间等元信息 # - Sheet4: HtmlParse → 若响应体含 HTML(此例无),则存放解析结果

打开users_analysis.xlsx,你会看到:

  • Datasheet 中avatar列全是图片 URL 字符串,id列为数字;
  • Headerssheet 第一行为 header 名(Date,Content-Type),第二行为对应值;
  • UrlInfosheet 包含url,status_code,response_time_ms三列,response_time_ms是工具内部计时得出。
3.3.1 验证 JSON 解析准确性:对比原始响应与 Excel 数据

原始响应片段(截取):

{ "page": 2, "per_page": 6, "total": 12, "data": [ { "id": 7, "email": "michael.lawson@reqres.in", "first_name": "Michael", "last_name": "Lawson", "avatar": "https://reqres.in/img/faces/7-image.jpg" } ] }

ExcelDatasheet 对应行:

pageper_pagetotaldata[0].iddata[0].emaildata[0].first_namedata[0].last_namedata[0].avatar
26127michael.lawson@reqres.inMichaelLawsonhttps://reqres.in/img/faces/7-image.jpg

这证实了flattenJson()正确处理了顶层字段(page,per_page)和数组内嵌对象(data[0].*)。

4. 进阶技巧:定制化导出与常见问题排查

4.1 自定义列顺序与空值处理:修改Json2ExclewriteToSheet()方法

默认导出时列顺序由flattenJson()遍历 key 的顺序决定,不可控。若需固定列序(如总把id放第一列),需修改Json2Excle.javawriteToSheet()

// 修改前:列名来自 flatMap.keySet(),顺序不确定 Set<String> headers = flatMap.keySet(); // 修改后:显式定义列顺序 List<String> orderedHeaders = Arrays.asList( "id", "email", "first_name", "last_name", "avatar", "page", "per_page", "total", "data[0].id", "data[0].email" ); // 确保 orderedHeaders 包含所有实际存在的 key,缺失则补空字符串 for (String header : orderedHeaders) { Object value = flatMap.getOrDefault(header, ""); row.createCell(colIndex++).setCellValue(value.toString()); }

提示:orderedHeaders列表需根据你的 JSON Schema 动态生成,硬编码仅适用于固定结构。生产环境建议在ToolStart中读取外部配置文件(如columns.conf)来加载顺序。

4.2 处理中文乱码与日期格式:POI 的字符集与单元格样式设置

若 JSON 中含中文,导出 Excel 后显示为方框,是因 POI 默认使用US-ASCII。需在ReadExcel.javacreateCell()前设置字体:

// ReadExcel.java 中添加 Font font = workbook.createFont(); font.setFontName("微软雅黑"); // 或 "SimSun"(宋体) font.setFontHeightInPoints((short) 10); CellStyle style = workbook.createCellStyle(); style.setFont(font); cell.setCellStyle(style);

对于日期字段(如 JSON 中"created_at": "2023-10-05T14:30:00Z"),toString()会输出字符串而非 Excel 可识别的日期。应在Json2Excle.java中增强类型判断:

// 在 flattenJson() 的 else 分支中插入 } else if (obj instanceof java.util.Date) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); flatMap.put(prefix, sdf.format((java.util.Date) obj)); } else if (obj instanceof String && isIsoDateTime((String) obj)) { try { Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse((String) obj); flatMap.put(prefix, date); // 直接存 Date 对象,后续 write 时设为日期格式 } catch (ParseException e) { flatMap.put(prefix, obj.toString()); } }

4.3 排查三类高频报错:ClassNotFoundExceptionJSONExceptionInvalidFormatException

错误信息根本原因解决方案
java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Workbooklib/下缺少 POI jar 或路径错误执行ls lib/确认poi-*.jar存在;检查java -cplib/*是否被 shell 展开(zsh 用户需加引号:"lib/*"
org.json.JSONException: JSONObject["key"] is not a JSONObject.JSON 格式非法(如末尾逗号、单引号、Unicode 未转义)用在线工具(如 jsonlint.com)校验 JSON;或在GetJson.java中捕获JSONException并打印原始字符串定位错误位置
org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]输出路径已存在同名 Excel 文件且被其他程序占用(如 Excel 正在打开)关闭所有 Excel 进程;或改用-output ./output/report_$(date +%s).xlsx生成唯一文件名
4.3.1 快速验证工具是否正常:用内建测试 JSON

项目未提供测试脚本,但可用最小 JSON 验证核心流程:

# 创建测试文件 test.json echo '{"name":"test","value":123,"tags":["a","b"]}' > test.json # 运行转换(无需网络) java -cp "bin:lib/*" ToolStart -json test.json -output test.xlsx # 检查输出文件是否生成且可打开 ls -lh test.xlsx # 应显示 > 5KB unzip -l test.xlsx \| head -5 # 应看到 xl/worksheets/sheet1.xml 等 POI 结构

test.xlsx生成成功且 Excel 能正常打开,说明 Java 环境、POI 依赖、Json2Excle逻辑均无问题,后续失败必为输入数据或网络问题。

注意:test.json必须是合法 UTF-8 编码,Windows 记事本保存时选「UTF-8 无 BOM」,否则JSONObject构造会抛JSONException

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 10:38:44

AS5048A与R7KA8D2KFLCAC磁角度传感方案实战指南

1. 项目概述&#xff1a;为什么磁角度传感需要“终极”方案&#xff1f;AS5048A 和 R7KA8D2KFLCAC 这两个器件组合&#xff0c;乍看像是一组陌生的型号代号&#xff0c;但拆开来看&#xff0c;它们各自代表了当前高精度磁角度传感领域里最成熟、最可靠、也最容易被低估的两类核…

作者头像 李华
网站建设 2026/9/16 10:37:51

COMSOL三次谐波仿真技巧与避坑指南

1. COMSOL三次谐波仿真实战指南作为一名长期与COMSOL斗智斗勇的光学仿真工程师&#xff0c;我深刻理解在非线性光学仿真中&#xff0c;三次谐波生成&#xff08;Third Harmonic Generation, THG&#xff09;这个磨人的小妖精有多难伺候。今天我就把自己在THG仿真中踩过的坑、总…

作者头像 李华
网站建设 2026/9/16 10:36:39

Django Web开发全流程实战:从零到一

1. 项目概述"从零到一&#xff1a;Django Web开发全流程实战"是一个面向初学者的完整Django开发教程。作为Python生态中最流行的Web框架&#xff0c;Django以其"开箱即用"的特性著称&#xff0c;但新手在实际开发中仍会遇到各种环境配置、项目结构设计和功…

作者头像 李华
网站建设 2026/9/16 10:33:36

STM32 RS485从机实现:MODBUS RTU协议栈与自动收发控制

简介&#xff1a;本资源是面向嵌入式开发工程师与STM32初学者的MODBUS RTU协议实战项目&#xff0c;聚焦RS485工业通信场景下STM32作为从机的完整实现方案。资源提供可直接编译运行的Keil工程&#xff08;含uvprojx/uvoptx配置&#xff09;&#xff0c;涵盖GPIO方向控制、USART…

作者头像 李华
网站建设 2026/9/16 10:32:22

SPC在线质量监控系统:InfluxDB+Flask实时控制图实现

简介&#xff1a;本资源是一套完整的基于SPC&#xff08;统计过程控制&#xff09;的在线产品质量分析系统毕业设计实现&#xff0c;面向自动化、工业工程、质量管理及软件工程方向的本科生与初学者&#xff0c;解决制造业中生产过程质量实时监控与异常预警的实际问题。压缩包共…

作者头像 李华
网站建设 2026/9/16 10:32:12

N皇后问题回溯算法实战与优化技巧

1. 回溯法解N皇后问题实战指南棋盘上摆放皇后就像在办公室安排工位——既要保证每个同事有独立空间&#xff0c;又要避免相互干扰。N皇后问题正是这类约束满足问题的经典代表&#xff0c;它要求在一个NN的棋盘上放置N个皇后&#xff0c;且彼此不能互相攻击&#xff08;即不能同…

作者头像 李华