postman json格式文档转word表格文档

  • 说明
  • 依赖
  • 代码

说明

json版本Collection v2.1,运行main方法输入json文件路径,生成word
参考:
https://gitee.com/zhexiao/postman-to-word (解析思路).
https://blog.csdn.net/qq_26408545/article/details/110669104 (poi导出操作).
https://www.cnblogs.com/sun-flower1314/p/10128796.html (poi导出操作).
https://tool.oschina.net/apidocs/apidoc?api=apache-POI (api文档).

遇到的问题
单元格文字过长,表格样式会变, 有擅长导出的大佬还请指点一下。

依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>JsonToWord</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--office解析需要的包--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.61</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

代码

package com.jsonToWord;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;/*** @author zxq* @date 2020-09-15 22:17* @description 解析postman Collection v2.1版本的json文件到word中**              参考:https://gitee.com/zhexiao/postman-to-word (解析思路),*                   https://blog.csdn.net/qq_26408545/article/details/110669104 (poi导出操作),*                   https://www.cnblogs.com/sun-flower1314/p/10128796.html (poi导出操作),*                   https://tool.oschina.net/apidocs/apidoc?api=apache-POI (api文档)**/
public class JsonToWord {private static final Logger log = LoggerFactory.getLogger(com.jsonToWord.JsonToWord.class);public static void main(String[] args) {try {Scanner sc = new Scanner(System.in);System.out.println("请输入json文件路径:");//读取字符串型输入String jsonFile = sc.nextLine();File file = new File(jsonFile);if (!file.exists()) {System.out.println("找不到文件");System.out.println("程序结束!");}System.out.println(jsonFile);String wordFile = jsonFile.substring(0,jsonFile.lastIndexOf("\\") + 1);if (!file.exists()) {file.mkdir();}FileInputStream fileInputStream = new FileInputStream(file);String res = read(fileInputStream);JSONObject jsonObject = JSON.parseObject(res);XWPFDocument word = createWordFile(jsonObject);String fileUrl = wordFile + System.currentTimeMillis() + "word.docx";saveDocument(word,fileUrl);System.out.println("word导出完成:" + fileUrl);} catch (Exception e) {e.printStackTrace();}}/*** 设置文档标题* @param jsonObject* @return*/private static XWPFDocument createWordFile(JSONObject jsonObject) {//解析json,将json中的数据放到word中//获取api文档名称JSONObject info = (JSONObject) jsonObject.get("info");String title = (String)info.get("name");XWPFDocument document = new XWPFDocument();//设置标题createTitleParagraph(document,title);JSONArray items = (JSONArray)jsonObject.get("item");for(Object itemObj:items){JSONObject item = (JSONObject)itemObj;//设置接口文件表格内容createTable(item,document);}return  document;}/*** 生成接口表格* @param item* @param document*/private static void createTable(JSONObject item, XWPFDocument document) {//创建1*6的表格int row = 0;//接口名XWPFTable table = document.createTable(1, 6);//设置表格宽度固定,但是有过长的字段时会失效CTTblPr ctTblPr = table.getCTTbl().addNewTblPr();CTTblLayoutType ctTblLayoutType = ctTblPr.isSetTblLayout()?ctTblPr.getTblLayout():ctTblPr.addNewTblLayout();ctTblLayoutType.setType(STTblLayoutType.FIXED);//设置表格样式//table.setWidth(7800);XWPFTableCell cell1 = table.getRow(row).getCell(0);//设置表格宽度cell1.setWidth("1300");cell1.addParagraph().createRun().setText("接口名称");XWPFTableCell cell2 = table.getRow(row).getCell(1);//合并2-6单元格mergeCellH(table,cell2,row,1,5);cell2.setWidth("6500");cell2.addParagraph().createRun().setText((String)item.get("name"));row++;//请求方法table.createRow();XWPFTableCell cell3 = table.getRow(row).getCell(0);cell3.setWidth("1300");cell3.addParagraph().createRun().setText("接口方法");XWPFTableCell cell4 = table.getRow(row).getCell(1);//合并2-6单元格mergeCellH(table,cell4,row,1,5);cell4.setWidth("6500");cell4.addParagraph().createRun().setText((String)((JSONObject)item.get("request")).get("method"));row++;//地址table.createRow();XWPFTableCell cell5 = table.getRow(row).getCell(0);cell5.setWidth("1300");cell5.addParagraph().createRun().setText("接口地址");XWPFTableCell cell6 = table.getRow(row).getCell(1);//合并2-6单元格mergeCellH(table,cell6,row,1,5);String url = (String) ((JSONObject) ((JSONObject) item.get("request")).get("url")).get("raw");if(url.contains("?")){url = url.substring(0, url.indexOf("?"));}cell6.setWidth("6500");cell6.addParagraph().createRun().setText(url);row++;//请求头//设置请求头标题int headStart = row;int headEnd = row;table.createRow();XWPFTableCell cell7 = table.getRow(row).getCell(0);cell7.setWidth("1300");XWPFTableCell cell8 = table.getRow(row).getCell(1);cell8.setWidth("1300");cell8.addParagraph().createRun().setText("参数名");XWPFTableCell cell9 = table.getRow(row).getCell(2);cell9.setWidth("1300");cell9.addParagraph().createRun().setText("类型");XWPFTableCell cell10 = table.getRow(row).getCell(3);mergeCellH(table,cell10,row,3,5);cell10.setWidth("3900");XWPFRun run = cell10.addParagraph().createRun();run.setText("举例");row++;//请求头参数JSONArray headers = (JSONArray)((JSONObject)item.get("request")).get("header");if(headers.size() == 0){//没有请求头参数给个空行table.createRow();XWPFTableCell cell11 = table.getRow(row).getCell(0);cell11.setWidth("1300");XWPFTableCell cell12 = table.getRow(row).getCell(1);cell12.setWidth("1300");XWPFTableCell cell13 = table.getRow(row).getCell(2);cell13.setWidth("1300");XWPFTableCell cell14 = table.getRow(row).getCell(3);mergeCellH(table,cell14,row,3,5);cell14.setWidth("3900");headEnd = row;row++;}else{//有数据循环添加到表格for(Object headerObj:headers){JSONObject header = (JSONObject)headerObj;table.createRow();setHeader(header,table,row);headEnd = row;row++;}}//合并请求头列mergeCellV(table,cell7,0,headStart,headEnd);cell7.addParagraph().createRun().setText("请求头");//入参//设置入参标题int paramStart = row;int paramEnd = row;table.createRow();XWPFTableCell cell15 = table.getRow(row).getCell(0);cell15.addParagraph().createRun().setText("");XWPFTableCell cell16 = table.getRow(row).getCell(1);cell16.setWidth("1300");cell16.addParagraph().createRun().setText("参数名");XWPFTableCell cell17 = table.getRow(row).getCell(2);cell17.setWidth("1300");cell17.addParagraph().createRun().setText("类型");XWPFTableCell cell18 = table.getRow(row).getCell(3);cell18.setWidth("1300");cell18.addParagraph().createRun().setText("必填");XWPFTableCell cell19 = table.getRow(row).getCell(4);cell19.setWidth("1300");cell19.addParagraph().createRun().setText("举例");XWPFTableCell cell20 = table.getRow(row).getCell(5);cell20.setWidth("1300");cell20.addParagraph().createRun().setText("描述");row++;//设置具体参数JSONArray querys = (JSONArray)((JSONObject)((JSONObject)item.get("request")).get("url")).get("query");if(querys != null && querys.size() != 0){//有数据循环添加到表格for(Object queryObj :querys){JSONObject query = (JSONObject) queryObj;table.createRow();setParam(query,table,row);paramEnd = row;row++;}}else{//为空或没有参数,设置一个空行table.createRow();setParamStytle(table,row);paramEnd = row;row++;}//合并参数列mergeCellV(table,cell15,0,paramStart,paramEnd);cell15.setWidth("1300");cell15.addParagraph().createRun().setText("请求参数");//返回值table.createRow();JSONArray responses = (JSONArray) item.get("response");if(responses != null && responses.size() > 0){XWPFTableCell cell21 = table.getRow(row).getCell(0);//设置表格宽度cell21.setWidth("1300");cell21.addParagraph().createRun().setText("返回值");XWPFTableCell cell22 = table.getRow(row).getCell(1);//合并2-6单元格mergeCellH(table,cell22,row,1,5);for(Object responseObj : responses){JSONObject response = (JSONObject)responseObj;cell22.addParagraph().createRun().setText((String)response.get("body"));}cell22.setWidth("6500");row++;}else{XWPFTableCell cell21 = table.getRow(row).getCell(0);//设置表格宽度cell21.setWidth("1300");cell21.addParagraph().createRun().setText("返回值");XWPFTableCell cell22 = table.getRow(row).getCell(1);//合并2-6单元格mergeCellH(table,cell22,row,1,5);cell22.setWidth("6500");row++;}//防止表格挨在一起影响阅读document.createParagraph();}/*** 设置接口参数* @param query* @param table* @param row*/private static void setParam(JSONObject query, XWPFTable table, int row) {XWPFTableCell cell0 = table.getRow(row).getCell(0);cell0.setWidth("1300");XWPFTableCell cell1 = table.getRow(row).getCell(1);cell1.setWidth("1300");cell1.addParagraph().createRun().setText((String)query.get("key"));XWPFTableCell cell2 = table.getRow(row).getCell(2);cell2.setWidth("1300");XWPFTableCell cell3 = table.getRow(row).getCell(3);cell3.setWidth("1300");XWPFTableCell cell4 = table.getRow(row).getCell(4);cell4.setWidth("1300");cell4.addParagraph().createRun().setText((String)query.get("value"));XWPFTableCell cell5 = table.getRow(row).getCell(5);cell5.setWidth("1300");cell5.addParagraph().createRun().setText((String)query.get("description"));}private static void setParamStytle(XWPFTable table, int row) {XWPFTableCell cell0 = table.getRow(row).getCell(0);cell0.setWidth("1300");XWPFTableCell cell1 = table.getRow(row).getCell(1);cell1.setWidth("1300");XWPFTableCell cell2 = table.getRow(row).getCell(2);cell2.setWidth("1300");XWPFTableCell cell3 = table.getRow(row).getCell(3);cell3.setWidth("1300");XWPFTableCell cell4 = table.getRow(row).getCell(4);cell4.setWidth("1300");XWPFTableCell cell5 = table.getRow(row).getCell(5);cell5.setWidth("1300");}/*** 设置请求头* @param header* @param table* @param row*/private static void setHeader(JSONObject header, XWPFTable table, int row) {XWPFTableCell cell0 = table.getRow(row).getCell(0);cell0.setWidth("1300");XWPFTableCell cell1 = table.getRow(row).getCell(1);cell1.setWidth("1300");cell1.addParagraph().createRun().setText((String)header.get("key"));XWPFTableCell cell2 = table.getRow(row).getCell(2);cell2.setWidth("1300");cell2.addParagraph().createRun().setText((String)header.get("type"));XWPFTableCell cell3 = table.getRow(row).getCell(3);mergeCellH(table,cell3,row,3,5);cell3.setWidth("3900");XWPFRun run = cell3.addParagraph().createRun();run.setText((String)header.get("value"));}/*** 合并列* @param table:表格对象* @param cell:合并起始单元格对象* @param row:行数* @param start:合并起始列* @param end:合并结束列*/private static void mergeCellH(XWPFTable table, XWPFTableCell cell, int row, int start, int end) {cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);for (int i = start + 1; i <= end; i++) {XWPFTableCell cellNext = table.getRow(row).getCell(i);cellNext.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);}}/*** 合并行* @param table:表格对象* @param cell:合并起始单元格对象* @param col:列数* @param start:合并起始行* @param end:合并结束行*/private static void mergeCellV(XWPFTable table, XWPFTableCell cell, int col, int start, int end) {cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);for (int i = start + 1; i <= end; i++) {XWPFTableCell cellNext = table.getRow(i).getCell(col);cellNext.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);}}/*** 导出word* @param document* @param savePath* @throws IOException*/public static void saveDocument(XWPFDocument document, String savePath) throws IOException {File file = new File(savePath);OutputStream os = new FileOutputStream(file);document.write(os);os.close();}/*** word标题* @param document* @param title*/public static void createTitleParagraph(XWPFDocument document,String title) {//新建一个标题段落对象(就是一段文字)XWPFParagraph titleParagraph = document.createParagraph();//样式居中titleParagraph.setAlignment(ParagraphAlignment.CENTER);//创建文本对象XWPFRun titleFun = titleParagraph.createRun();//设置标题的名字titleFun.setText(title);//加粗titleFun.setBold(true);//设置颜色titleFun.setColor("000000");//字体大小titleFun.setFontSize(25);//换行titleFun.addBreak();}/*** 读取文件* 使用 Charset + CharsetDecoder 解决了中文乱码问题** @param fis* @return*/public static String read(FileInputStream fis) {StringBuilder stringBuilder = new StringBuilder();//解决中文乱码问题Charset charset = StandardCharsets.UTF_8;CharsetDecoder decoder = charset.newDecoder();char[] charCache = null;try{FileChannel fisChannel = fis.getChannel();//分配缓冲区、分配字符缓冲区解决中文乱码ByteBuffer byteBuffer = ByteBuffer.allocate(10240);CharBuffer charBuffer = CharBuffer.allocate(10240);//读取数据while (fisChannel.read(byteBuffer) != -1) {//上面把数据写入到了buffer,所以可知上面的buffer是写模式,调用flip把buffer切换到读模式,读取数据byteBuffer.flip();//把字节buffer解码到字符bufferdecoder.decode(byteBuffer, charBuffer, true);//字符buffer切换到读模式charBuffer.flip();//存储字符charCache = new char[charBuffer.length()];while (charBuffer.hasRemaining()) {charBuffer.get(charCache);}stringBuilder.append(charCache);//读完了buffer,清空buffercharBuffer.clear();byteBuffer.clear();}} catch (Exception e) {log.info("读取文件异常,e={}", e.getMessage());return null;}return stringBuilder.toString();}
}

postman json格式文档转word表格文档相关推荐

  1. php实现生成word表格,TP5利用phpforword生成word表格文档

    TP5利用phpforword生成word表格文档 2019-12-18 573 1.首先用composer安装下载 phpoffice/phpforwordcomposer require phpo ...

  2. 用DELPHI怎样生成WORD表格文档

    Delphi与Word之间的融合技术      一.VBA代码含义      Microsoft   Word是一个集成化环境,是美国微软公司的字处理系统,但是它决不仅仅是一个字处      理系统, ...

  3. word学习/word如何显示空格/LaTeX格式转为Word格式/ latex中的公式格式如何转换成word中的公式格式/excel复制到word表格过大超出

    以windows的word365为例进行讲解,主要分为显示,公式,表格,图片,审阅以及写作方式(含Latex格式转换). 常用快捷键: f4: cmd + y 查找: cmd + shift + h ...

  4. 「格式技巧」在word表格中做出分割线效果

    文章目录 I. Motivation II. Solution I. Motivation 我们在写论文的实验结果时,常常需要表格来记录实验结果,如果此时仅在一种数据集上做实验,我们的结果可以列成这样 ...

  5. poi生成word文档,插入图片,echar报表生成到word,word表格

    poi生成word文档,word表格,将echar报表生成到word 项目中用到生成word报表,报表中有表格的合并 .页眉.表格中会有报表图片.然后查找了网上的资料,利用echar生成柱状图,然后已 ...

  6. Word/Excel文档操作API哪家强?一张表带你了解Aspose和Spire系列全功能对比

    Microsoft Office是微软公司的一个文字处理器应用程序,作为办公软件必不可少的神器之一,其中Word.Excel是日常工作中常用的文档管理工具.目前,Aspose系列和Spire系列是文档 ...

  7. php 转换json 表格,将json格式转化为excel表格(详细教程)

    下面我就为大家分享一篇javascript将json格式数组下载为excel表格的方法,具有很好的参考价值,希望对大家有所帮助. 实例如下: $(document).ready(function(){ ...

  8. word导入mysql表格_数据插入Word 表格步骤

    数据插入Word 表格步骤 数据插入Word 表格步骤 (1)单击[数据库]工具栏上的[插入数据库]按钮,出现[数 据库]对话框,如图4-33 所示. (2)单击[获取数据]按钮,弹出[选择数据源]对 ...

  9. Python将word表格存入excel —— 格式化pg参数手册

    一. 背景 收到一份<PostgreSQL13商用文档之PG参数参考手册>,打算学习一下,打开文档一看,151页T_T.参数虽然有分类,但不太有规律,word文档格式如下: 个人觉得如果用 ...

最新文章

  1. oracle有一百个人围一圈报数,案例:Oracle创建表时报session超过最大值 ORA-00018 证明递归ses...
  2. python和c-python和C的如何实现互相调用?
  3. Xcode9新特性介绍-中文篇
  4. 【一周热门软件更新】我一口气发布六个版本更新,还有谁?
  5. 深大转专业计算机,这所高校2020年1042人申请转专业!申请转出人数最多的竟是医学部...
  6. 什么叫一年有四季......
  7. Java反射机制:表单数据自动封装到JavaBean中【IT】
  8. 牛客13592 武藏牌牛奶促销
  9. VS2013配置Qt5.8.0环境
  10. 想Get热搜同款?GitHub开源神器让父亲重返18岁!
  11. java限流器_Smaphor(信号量)实现限流器
  12. C# DDOS攻击代码
  13. 《流畅的Python第二版》读书笔记
  14. linux 多个文件中查找字符串
  15. php斐波那契数列循环,两种php实现斐波那契数列的方法
  16. LBP特征提取原理和python库代码
  17. python读取odb_abaqus通过python从ODB中抽取模型数据和结果数据.pdf
  18. 【C++ 开根号和平方运算】
  19. 使用计算机录制声音10,win10系统电脑中如何解决录屏时无法录制声音的问题
  20. Python查询mysql返回序列化数据

热门文章

  1. VS2010 C# ReportViewer控件新手上路心得
  2. Firefox 附加组件 插件 Shockwave Flash
  3. playwright安装提速的研究
  4. 2022年化工自动化控制仪表最新解析及化工自动化控制仪表免费试题
  5. 关于手机屏幕分辨率与手机浏览器分辨率的差别
  6. 如何管理好自己的文件资料
  7. JavaScript 实现页面滚动动画
  8. sybase SQL 函数
  9. 【原】费马小定理(Fermat little theorem)详解
  10. 前端Vue2.6.10数据压缩(zlib/pako)和解压(zlib/pako),后端Python3.7数据压缩(zlib)和解压(zlib)