简介:这是一款面向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=1→Url对象 |
GetJson.class | 发起 HTTP GET 请求,捕获响应 Body 并尝试解析为JSONObject或JSONArray | Url,Util4html | 返回原始 JSON 字符串或解析失败异常 |
HtmlStart.class | 启动 HTML 解析流程,调用Util4html提取<title>、<meta>、<a href>等结构化字段 | Util4html | HTML 字符串 →Map<String, List<String>>(如"links" → ["https://a.com", "https://b.com"]) |
ReadExcel.class | 非读取,而是定义 Excel 写入契约:创建 Workbook、Sheet、Row、Cell 的标准操作封装 | Apache POI | List<Map<String, Object>>→.xlsx文件流 |
Json2Excle.class | 核心转换器:递归遍历 JSON 结构,识别 object/array/primitive,生成扁平化列名(如user.profile.name),处理 null/boolean/date 类型映射 | ReadExcel,FilesRW | JSONObject→ 多 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.jar和poi-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 解析:GetJson和Util4html如何协同工作
GetJson.java并非仅发送 GET 请求,它内置了简易抓包能力——通过HttpURLConnection获取完整响应头,并将responseCode、contentType、date等字段存入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.jar、poi-ooxml-5.2.4.jar、lib/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.xlsx3.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 对应行:
| page | per_page | total | data[0].id | data[0].email | data[0].first_name | data[0].last_name | data[0].avatar |
|---|---|---|---|---|---|---|---|
| 2 | 6 | 12 | 7 | michael.lawson@reqres.in | Michael | Lawson | https://reqres.in/img/faces/7-image.jpg |
这证实了flattenJson()正确处理了顶层字段(page,per_page)和数组内嵌对象(data[0].*)。
4. 进阶技巧:定制化导出与常见问题排查
4.1 自定义列顺序与空值处理:修改Json2Excle的writeToSheet()方法
默认导出时列顺序由flattenJson()遍历 key 的顺序决定,不可控。若需固定列序(如总把id放第一列),需修改Json2Excle.java的writeToSheet():
// 修改前:列名来自 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.java的createCell()前设置字体:
// 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 排查三类高频报错:ClassNotFoundException、JSONException、InvalidFormatException
| 错误信息 | 根本原因 | 解决方案 |
|---|---|---|
java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Workbook | lib/下缺少 POI jar 或路径错误 | 执行ls lib/确认poi-*.jar存在;检查java -cp中lib/*是否被 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。
本文还有配套的精品资源,点击获取