导出Mysql数据库表名和字段并合并成一个word

参考链接: 

导出MySQL数据库所有库和字段注释及相关信息为word文档——工具类

java - Apache POI - How to copy tables from one docx to another docx - Stack Overflow

领导让我研究下一个低代码平台的代码,我就想着做一个把数据库字段直接导出来的工具。百度了一份代码是分表导出的,每个表都一个单独的word,用着不方便,我就在这个基础上加了个合并word的功能。说起来还是外网的质量高,一搜就搜到了,在百度上找了半天不行。

    public static void main(String[] args) throws Exception {// 创建新的空白Word文档作为目标文件XWPFDocument mergedDoc = new XWPFDocument();// 定义需要合并的源文件路径列表String prefix = "D:\\要合并的文件夹\\";File fold = new File(prefix);File[] fs = fold.listFiles();for(File file:fs){FileInputStream fis = new FileInputStream(file);// 读取每个源文件中的内容XWPFDocument doc = new XWPFDocument(fis);copyElements(doc, mergedDoc);// 关闭输入流fis.close();}// 保存合并后的文档FileOutputStream fos = new FileOutputStream(prefix + "\\000merged.docx");mergedDoc.write(fos);fos.close();System.out.println("合并完成!");}public static void copyElements(XWPFDocument sourceDocument, XWPFDocument targetDocument) {List<IBodyElement> elements = sourceDocument.getBodyElements();for (IBodyElement element : elements) {if (element instanceof XWPFParagraph) {XWPFParagraph paragraph = (XWPFParagraph) element;copyParagraph(paragraph, targetDocument.createParagraph());} else if (element instanceof XWPFTable) {XWPFTable table = (XWPFTable) element;copyTable(table, targetDocument.createTable());}}}private static void copyTable(XWPFTable source, XWPFTable target) {target.getCTTbl().setTblPr(source.getCTTbl().getTblPr());target.getCTTbl().setTblGrid(source.getCTTbl().getTblGrid());for (int r = 0; r<source.getRows().size(); r++) {XWPFTableRow targetRow = target.createRow();XWPFTableRow row = source.getRows().get(r);targetRow.getCtRow().setTrPr(row.getCtRow().getTrPr());for (int c=0; c<row.getTableCells().size(); c++) {//newly created row has 1 cellXWPFTableCell targetCell = c==0 ? targetRow.getTableCells().get(0) : targetRow.createCell();XWPFTableCell cell = row.getTableCells().get(c);targetCell.getCTTc().setTcPr(cell.getCTTc().getTcPr());XmlCursor cursor = targetCell.getParagraphArray(0).getCTP().newCursor();for (int p = 0; p < cell.getBodyElements().size(); p++) {IBodyElement elem = cell.getBodyElements().get(p);if (elem instanceof XWPFParagraph) {XWPFParagraph targetPar = targetCell.insertNewParagraph(cursor);cursor.toNextToken();XWPFParagraph par = (XWPFParagraph) elem;copyParagraph(par, targetPar);} else if (elem instanceof XWPFTable) {XWPFTable targetTable = targetCell.insertNewTbl(cursor);XWPFTable table = (XWPFTable) elem;copyTable(table, targetTable);cursor.toNextToken();}}//newly created cell has one default paragraph we need to removetargetCell.removeParagraph(targetCell.getParagraphs().size()-1);}}//newly created table has one row by default. we need to remove the default row.target.removeRow(0);}private static void copyParagraph(XWPFParagraph source, XWPFParagraph target) {target.getCTP().setPPr(source.getCTP().getPPr());for (int i=0; i<source.getRuns().size(); i++ ) {XWPFRun run = source.getRuns().get(i);XWPFRun targetRun = target.createRun();//copy formattingtargetRun.getCTR().setRPr(run.getCTR().getRPr());//no images just copy texttargetRun.setText(run.getText(0));}}

顺便贴上我的github地址:https://github.com/gitUserMandjq/tool

在JdbcTest类里执行方法,生成效果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439273.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask框架小程序后端分离开发学习笔记《5》简易服务器代码

Flask框架小程序后端分离开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后…

【网络】:网络套接字(UDP)

网络套接字 一.网络字节序二.端口号三.socket1.常见的API2.封装UdpSocket 四.地址转换函数 网络通信的本质就是进程间通信。 一.网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网…

校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!

随着移动互联网的快速发展&#xff0c;校园社交成为了大学生们日常生活中重要的一部分。为了方便校园内学生的交流和互动&#xff0c;校园社交小程序逐渐走入人们的视野。本文将探讨校园社交小程序的开发以及其带来的益处。 校园社交小程序的开发涉及许多技术和设计方面。首先&…

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇Windows11下启动rpc服务报错panic解决方案的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题来源 今天在编写完proto文件后&#xff0c;使用goctl生成…

Hadoop-MapReduce-YarnChild启动篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在上一篇<Hadoop-MapReduce-MRAppMaster启动篇>中已经将到&#xff1a;MRAppMaster的启动&#xff0c;那么运行M…

burp靶场--xss上篇【1-15】

burp靶场–xss https://portswigger.net/web-security/cross-site-scripting 1. 什么是xss: 跨站脚本 (XSS) 是一种通常出现在 Web 应用程序中的计算机安全漏洞。XSS 允许攻击者将恶意代码注入网站&#xff0c;然后在访问该网站的任何人的浏览器中执行该代码。这可能允许攻击…

【UE 材质】闪电材质

效果 步骤 1. 新建一个材质这里命名为“M_Lighting” 打开“M_Lighting”&#xff0c;设置混合模式为半透明&#xff0c;着色模型为无光照 在材质图表中添加如下节点 其中&#xff0c;纹理采样节点的纹理是一个线条 此时预览窗口中效果如文章开头所示。

VS编写Qt项目:vs2017运行vs2019项目时的一些问题

目录 一、无法找到 v142 的生成工具(平台工具集 “v142”) ​编辑 二、第一个问题解决后的后续问题 一、无法找到 v142 的生成工具(平台工具集 “v142”) 第一步&#xff1a;选中项目->右键点击属性->常规->平台工具集&#xff1a;选为v141 第二步&#xff1a;选中项…

【DRAM存储器十八】DDR3介绍

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR3数据手册》 、《JESD79-3E》 最近忙于工作&#xff0…

vue3封装el-pagination分页组件

1、效果如图&#xff1a; 2、分页组件代码&#xff1a; <template><div class"paging"><el-config-provider :locale"zhCn"><el-paginationv-model:current-page"page.currentPage"v-model:page-size"page.pageSize…

JVM系列——垃圾收集器

对象存活判断 引用计数法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 可达性分析算法 通过一系列称为“GC …

C语言系列-整数在内存中的存储大小端字节序

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 整数在内存中的存储 大小端字节序和字节序判断 什么是大小端 为什么会有大小端 练习 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下面的内容 整数的2…