
简介这是一款面向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?page1→Url对象GetJson.class发起 HTTP GET 请求捕获响应 Body 并尝试解析为JSONObject或JSONArrayUrl,Util4html返回原始 JSON 字符串或解析失败异常HtmlStart.class启动 HTML 解析流程调用Util4html提取title、meta、a href等结构化字段Util4htmlHTML 字符串 →MapString, ListString如links → [https://a.com, https://b.com]ReadExcel.class非读取而是定义 Excel 写入契约创建 Workbook、Sheet、Row、Cell 的标准操作封装Apache POIListMapString, Object→.xlsx文件流Json2Excle.class核心转换器递归遍历 JSON 结构识别 object/array/primitive生成扁平化列名如user.profile.name处理 null/boolean/date 类型映射ReadExcel,FilesRWJSONObject→ 多 sheet 的XSSFWorkbookToolStart.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, MapString, Object flatMap) { if (obj instanceof JSONObject) { JSONObject json (JSONObject) obj; IteratorString 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(MapString, String)注入自定义映射// 在 ToolStart.java 中调用示例 Json2Excle converter new Json2Excle(); MapString, 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等字段存入MapString, String// GetJson.java 片段 public MapString, 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); MapString, 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 字符串 // 提取响应头 MapString, ListString headers conn.getHeaderFields(); result.put(headers, headers); // 供后续写入独立 sheet return result; }Util4html.java则使用Jsoup项目未显式声明依赖但HtmlStart.java导入了org.jsoup.Jsoup解析 HTML// Util4html.java 片段 public MapString, ListString extractHtmlElements(String html) { Document doc Jsoup.parse(html); MapString, ListString elements new HashMap(); elements.put(title, Collections.singletonList(doc.title())); // title内容/title elements.put(meta_description, doc.select(meta[namedescription]).eachAttr(content)); // meta namedescription 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?page2的响应结构# 1. 执行抓包并导出 java -cp bin:lib/* ToolStart \ -url https://reqres.in/api/users?page2 \ -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.lawsonreqres.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].avatar26127michael.lawsonreqres.inMichaelLawsonhttps://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()顺序不确定 SetString headers flatMap.keySet(); // 修改后显式定义列顺序 ListString 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:00ZtoString()会输出字符串而非 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-ddTHH:mm:ssZ).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.Workbooklib/下缺少 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。本文还有配套的精品资源点击获取