Java查询数据库表信息导出Word

参考: POI生成Word多级标题格式_poi设置word标题-CSDN博客

1.概述

        使用jdbc查询数据库把表信息导出为word文档, 导出为word时需要下载word模板文件。

已实现数据库: 

  • KingbaseES, 实现代码: 点击跳转

2.效果图

2.1.生成word内容

所有数据库合并

数据库不合并

2.2.生成文件列表

3.代码文件结构

4.代码实现

4.1.dto

4.1.1.DbInfoDTO.java

package cn.nordrassil.db2doc.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
public class DbInfoDTO {private String dbName;private String dbDescribe;private List<TableInfo> tableInfos;@Data@AllArgsConstructor@NoArgsConstructorpublic static class TableInfo {private String tableName;private String tableDescribe;private List<TableField> tableFields;private List<List<String>> tableContents;public TableInfo(String tableName, String tableDescribe, List<TableField> tableFields) {this.tableName = tableName;this.tableDescribe = tableDescribe;this.tableFields = tableFields;}}@Data@AllArgsConstructor@NoArgsConstructorpublic static class TableField {private String name;private String type;private Integer length;private String allowEmpty;private String isPrimaryKey;private String defaultValue;private String describe;}}

4.1.2.DbConnParamDTO.java

package cn.nordrassil.db2doc.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class DbConnParamDTO {private String host;private Integer port;private String username;private String password;// 随机填一个数据库即可private String randomDatabase;// 数据库前缀过滤private String dbPrefixFilter;// 等于true是只会导出第一张表private Boolean testRun;
}

4.1.3.ExportWordParamDTO

package cn.nordrassil.db2doc.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExportWordParamDTO {// 数据信息private List<DbInfoDTO> ds;// 导出word模板文件private String wordTemplateFile;// 导出目录private String exportFolder;// 所有数据库是否合并到一个文档, 默认每个数据库一个文档private Boolean merge = Boolean.FALSE;
}

4.2.util

4.2.1.CommonUtil.java

package cn.nordrassil.db2doc.util;import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class CommonUtil {private static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");private static DateTimeFormatter dateFormatter2 = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");public static String readByLineRs(String path) {StringBuffer sb = new StringBuffer();File file = new File(path);BufferedReader reader = null;String temp = null;try {reader = new BufferedReader(new FileReader(file));while ((temp = reader.readLine()) != null) {sb.append(temp).append("\n");}} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (Exception e) {e.printStackTrace();}}}return sb.toString();}/*** 依次替换{}* 例 : join("a={},b={}",1,2) => a=1,b=2** @param str* @param param* @return*/public static String join(String str, Object... param) {try {for (Object p : param) {String processedParam = p.toString().replace("\\", "\\\\");str = str.replaceFirst("\\{\\}", processedParam);}} catch (Exception e) {for (Object p : param) {str = str + p;}}return str;}public static void writeString(String content, String path) {try {File file = new File(path);if (!file.exists()) {file.createNewFile();}FileWriter fw = new FileWriter(file.getAbsoluteFile());BufferedWriter bw = new BufferedWriter(fw);bw.write(content);bw.close();} catch (IOException e) {e.printStackTrace();}}public static void info(String str, Object... param) {System.out.println(LocalDateTime.now().format(dateFormatter) + "|" + join(str, param));}public static String getDayTime() {return LocalDateTime.now().format(dateFormatter2);}public static void createDirectoryIfNotExists(String absolutePath) {File file = new File(absolutePath);// 获取文件所在的目录File parentDir = file.getParentFile();if (parentDir != null && !parentDir.exists()) {// 创建目录parentDir.mkdirs();}}}

4.3.service

4.3.1.DbInfoExportWordService.java

package cn.nordrassil.db2doc;import cn.nordrassil.db2doc.dto.DbInfoDTO;
import cn.nordrassil.db2doc.dto.ExportWordParamDTO;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import static cn.nordrassil.db2doc.util.CommonUtil.*;// 参考: https://blog.csdn.net/qq_37945565/article/details/121518330public class DbInfoExportWordService {public static List<String> tableTitles = new ArrayList<String>() {{add("序号");add("字段名");add("字段类型");add("长度");add("非空");add("主键");add("默认值");add("注释");}};public static List<String> fields = new ArrayList<String>() {{add("name");add("type");add("length");add("allowEmpty");add("isPrimaryKey");add("defaultValue");add("describe");}};public static void generateWord(ExportWordParamDTO paramDTO) throws Exception {// 获得模板文档的整体样式XWPFDocument template = new XWPFDocument(new FileInputStream(paramDTO.getWordTemplateFile()));CTStyles wordStyles = template.getStyle();int totalTableCount = 0;int index = 1;List<DbInfoDTO> ds = paramDTO.getDs();XWPFDocument document = null;boolean merge = paramDTO.getMerge() != null && paramDTO.getMerge();if (merge) {document = new XWPFDocument();}for (DbInfoDTO d : ds) {info("执行第[{}/{}]生成word文档...表数量:{}", index, ds.size(), d.getTableInfos().size());if (!merge) {document = new XWPFDocument();}// 获取新建文档对象的样式XWPFStyles newStyles = document.createStyles();// 关键行// 修改设置文档样式为静态块中读取到的样式newStyles.setStyles(wordStyles);if (merge) {XWPFParagraph title1 = document.createParagraph();title1.setStyle("2");XWPFRun titleRun1 = title1.createRun();String dbText = index + "." + d.getDbName();if (d.getDbDescribe() != null) {dbText += "(" + d.getDbDescribe().replaceAll("\r\n", "").replaceAll("\r", "").replaceAll("\n", "") + ")";}titleRun1.setText(dbText);}List<DbInfoDTO.TableInfo> tableInfos = d.getTableInfos();totalTableCount += tableInfos.size();for (int k = 0; k < tableInfos.size(); k++) {DbInfoDTO.TableInfo tableInfo = tableInfos.get(k);XWPFParagraph title2 = document.createParagraph();XWPFRun titleRun2 = title2.createRun();String tableText;if (merge) {title2.setStyle("3");tableText = index + "." + (k + 1) + "." + tableInfo.getTableName();} else {title2.setStyle("2");tableText = (k + 1) + "." + tableInfo.getTableName();}if (tableInfo.getTableDescribe() != null) {tableText += "(" + tableInfo.getTableDescribe().replaceAll("\r\n", "").replaceAll("\r", "").replaceAll("\n", "") + ")";}titleRun2.setText(tableText);// 创建表格(第一列为序号)List<DbInfoDTO.TableField> tableFields = tableInfo.getTableFields();XWPFTable table = document.createTable(tableFields.size(), 8);int titleFontSize = 10;int textFontSize = 8;// 设置表格标题样式for (int i = 0; i < table.getRows().get(0).getTableCells().size(); i++) {XWPFTableCell cell = table.getRows().get(0).getCell(i);XWPFParagraph cellParagraph = cell.getParagraphs().get(0);cellParagraph.setIndentationLeft(0); // 设置左侧缩进为0cellParagraph.setIndentationRight(0); // 设置右侧缩进为0cellParagraph.setIndentationFirstLine(0); // 设置首行缩进为0cellParagraph.setIndentationLeft(0);// 设置单元格背景色为灰色CTTcPr cellPr = cell.getCTTc().addNewTcPr();CTShd shd = cellPr.addNewShd();shd.setFill("D3D3D3");cellParagraph.setAlignment(ParagraphAlignment.CENTER);XWPFRun cellRun = cellParagraph.createRun();cellRun.setBold(true);cellRun.setText(tableTitles.get(i));cellRun.setFontSize(titleFontSize);}// 写入表格内容for (int row = 1; row < table.getNumberOfRows(); row++) {for (int col = 0; col < table.getRow(row).getTableCells().size(); col++) {XWPFTableCell cell = table.getRow(row).getCell(col);XWPFParagraph cellParagraph = cell.getParagraphs().get(0);XWPFRun cellRun = cellParagraph.createRun();if (col == 0) {cellRun.setText(row + "");} else {DbInfoDTO.TableField tableField = tableFields.get(row - 1);JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(tableField));cellRun.setText(jsonObject.getString(fields.get(col - 1)));}CTTcPr tcPr = cell.getCTTc().getTcPr();if (tcPr == null) {tcPr = cell.getCTTc().addNewTcPr();}if (!tcPr.isSetTcMar()) {tcPr.addNewTcMar();}tcPr.getTcMar().addNewLeft().setW(0);tcPr.getTcMar().addNewRight().setW(0);tcPr.getTcMar().addNewTop().setW(0);tcPr.getTcMar().addNewBottom().setW(0);cellRun.setFontSize(textFontSize);cellParagraph.setIndentationLeft(0);// 设置段落左对齐cellParagraph.setAlignment(ParagraphAlignment.LEFT);// 设置左缩进为 0cellParagraph.setIndentationLeft(0);}}}if (!merge) {// 保存文档String outputFile = paramDTO.getExportFolder() + File.separator + d.getDbName() + ".docx";createDirectoryIfNotExists(outputFile);try (FileOutputStream out = new FileOutputStream(outputFile)) {document.write(out);info("第[{}/{}]数据库信息生成word文档完成, 文档路径:{}", index, ds.size(), outputFile);} catch (IOException e) {e.printStackTrace();}}index++;}if (merge) {// 保存文档String outputFile = paramDTO.getExportFolder() + File.separator + getDayTime() + "_all_db.docx";createDirectoryIfNotExists(outputFile);try (FileOutputStream out = new FileOutputStream(outputFile)) {document.write(out);info("所有数据库信息生成word文档完成, 文档路径:{}", outputFile);} catch (IOException e) {e.printStackTrace();}}info("数据库已导出为word文档完成, 数据库数量:{}, 所有表总数量:{}", ds.size(), totalTableCount);}
}

4.3.2.GetDbInfoService.java

package cn.nordrassil.db2doc;import cn.nordrassil.db2doc.dto.DbConnParamDTO;
import cn.nordrassil.db2doc.dto.DbInfoDTO;import java.util.List;public interface GetDbInfoService {List<DbInfoDTO> get(DbConnParamDTO dto);
}

5.依赖 

5.1.mave依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>provided</scope></dependency><!-- Apache Commons Compress 用于处理多种归档文件格式 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.24.0</version></dependency><!-- Apache Commons IO 提供了 IO 操作的工具类 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.13.0</version></dependency><dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>7.5.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency>

5.2.word文档模板

word/word模板.docx · 楽焫旒璡/public-share - 码云 - 开源中国

6.测试

6.1.MyTest.java

package cn.nordrassil.db2doc;import cn.nordrassil.db2doc.dto.DbConnParamDTO;
import cn.nordrassil.db2doc.dto.DbInfoDTO;
import cn.nordrassil.db2doc.dto.ExportWordParamDTO;
import cn.nordrassil.db2doc.impl.GetDbInfoKingBaseEsService;
import cn.nordrassil.db2doc.util.CommonUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class MyTest {public static void main(String[] args) throws Exception {String exportFolder = System.getProperty("user.dir") + File.separator + "files";String templateFile = "F:\\文档\\开发\\word模板.docx";String resultFile = exportFolder + File.separator + "result.json";//getDbInfo(resultFile);List<DbInfoDTO> ds = readData(resultFile);ExportWordParamDTO exportWordParamDTO = new ExportWordParamDTO(ds, templateFile, exportFolder, true);//DbInfoExportWordService.generateWord(exportWordParamDTO);}public static void getDbInfo(String resultFile) throws Exception {GetDbInfoService getDbInfoService = new GetDbInfoKingBaseEsService();List<DbInfoDTO> dbInfoDTOS = getDbInfoService.get(new DbConnParamDTO("192.168.1.1",5432,"root","123456","test","test",true));CommonUtil.writeString(JSONObject.toJSONString(dbInfoDTOS), resultFile);}public static List<DbInfoDTO> readData(String resultFile) {JSONArray jas = JSONObject.parseArray(CommonUtil.readByLineRs(resultFile));List<DbInfoDTO> ds = new ArrayList<>();for (int i = 0; i < jas.size(); i++) {JSONObject ja = jas.getJSONObject(i);DbInfoDTO dbInfo = new DbInfoDTO();dbInfo.setDbName(ja.getString("dbName"));dbInfo.setDbDescribe(ja.getString("dbDescribe"));List<DbInfoDTO.TableInfo> tableInfos = new ArrayList<>();dbInfo.setTableInfos(tableInfos);JSONArray tis = ja.getJSONArray("tableInfos");for (int k = 0; k < tis.size(); k++) {JSONObject ti = tis.getJSONObject(k);DbInfoDTO.TableInfo tableInfo = new DbInfoDTO.TableInfo();tableInfos.add(tableInfo);tableInfo.setTableName(ti.getString("tableName"));tableInfo.setTableDescribe(ti.getString("tableDescribe"));JSONArray tfs = ti.getJSONArray("tableFields");List<DbInfoDTO.TableField> tableFields = new ArrayList<>();tableInfo.setTableFields(tableFields);for (int j = 0; j < tfs.size(); j++) {JSONObject tf = tfs.getJSONObject(j);tableFields.add(new DbInfoDTO.TableField(tf.getString("name"),tf.getString("type"),tf.getInteger("length"),tf.getString("allowEmpty"),tf.getString("isPrimaryKey"),tf.getString("defaultValue"),tf.getString("describe")));}}ds.add(dbInfo);}return ds;}
}

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

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

相关文章

Qt中的全局函数讲解集合(全)

在头文件<QtGlobal>中包含了Qt的全局函数&#xff0c;现在就这些全局函数一一详解。 1.qAbs 原型&#xff1a; template <typename T> T qAbs(const T &t)一个用于计算绝对值的函数。它可以用于计算各种数值类型的绝对值&#xff0c;包括整数、浮点数等 示…

AI与IT协同的典型案例

简介 本篇代码示例展示了IT从业者如何与AI协同工作&#xff0c;发挥各自优势。这些案例均来自2025年的最新企业实践&#xff0c;涵盖了不同IT岗位的应用场景。 一、GitHub Copilot生成代码框架 开发工程师AI协作示例&#xff1a;利用GitHub Copilot生成代码框架&#xff0c;…

三网通电玩城平台系统结构与源码工程详解(二):Node.js 服务端核心逻辑实现

本篇文章将聚焦服务端游戏逻辑实现&#xff0c;以 Node.js Socket.io 作为主要通信与逻辑处理框架&#xff0c;展开用户登录验证、房间分配、子游戏调度与事件广播机制的剖析&#xff0c;并附上多个核心代码段。 一、服务端文件结构概览 /server/├── index.js …

【prompt是什么?有哪些技巧?】

Prompt&#xff08;提示词&#xff09;是什么&#xff1f; Prompt 是用户输入给AI模型&#xff08;如ChatGPT、GPT-4等&#xff09;的指令或问题&#xff0c;用于引导模型生成符合预期的回答。它的质量直接影响AI的输出效果。 Prompt 的核心技巧 1. 明确目标&#xff08;Clar…

堆和二叉树--数据结构初阶(3)(C/C++)

文章目录 前言理论部分堆的模拟实现:(这里举的大根堆)堆的创建二叉树的遍历二叉树的一些其他功能实现 作业部分 前言 这期的话讲解的是堆和二叉树的理论部分和习题部分 理论部分 二叉树的几个性质:1.对于任意一个二叉树&#xff0c;度为0的节点比度为2的节点多一个 2.对于完全…

Dockerfile讲解与示例汇总

容器化技术已经成为应用开发和部署的标准方式,而Docker作为其中的佼佼者,以其轻量、高效、可移植的特性,深受开发者和运维人员的喜爱。本文将从实用角度出发,分享各类常用服务的Docker部署脚本与最佳实践,希望能帮助各位在容器化之路上少走弯路。 无论你是刚接触Docker的…

在QGraphicsView中精确地以鼠标为锚缩放图片

在pyqt中以鼠标所在位置为锚点缩放图片-CSDN博客中的第一个示例中&#xff0c;通过简单设置&#xff1a; self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) 使得QGraphicsView具有了以鼠标为锚进行缩放的功能。但是&#xff0c;其内部应当是利用了滚动条的移动来…

制造工厂如何借助电子看板实现高效生产管控

在当今高度竞争的制造业环境中&#xff0c;许多企业正面临着严峻的管理和生产挑战。首先&#xff0c;管理流程落后&#xff0c;大量工作仍依赖"人治"方式&#xff0c;高层管理者理论知识薄弱且不愿听取专业意见。其次&#xff0c;生产过程控制能力不足&#xff0c;导…

在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战

JSON (JavaScript Object Notation) 已经成为现代 Web 应用和服务之间数据交换的通用语言。无论你是开发后端 API、与第三方服务集成&#xff0c;还是处理配置文件&#xff0c;都绕不开 JSON 的解析与生成。在 C# .NET 世界里&#xff0c;处理 JSON 有多种选择&#xff0c;其中…

Debian10系统安装,磁盘分区和扩容

1、说明 过程记录信息有些不全&#xff0c;仅作为参考。如有其它疑问&#xff0c;欢迎留言。 2、ISO下载 地址&#xff1a;debian-10.13.0镜像地址 3、开始安装 3.1、选择图形界面 3.2、选择中文语言 3.3、选择中国区域 3.4、按照提示继续 3.5、选择一个网口 3.6、创建管…

1.10软考系统架构设计师:优秀架构设计师 - 练习题附答案及超详细解析

优秀架构设计师综合知识单选题 每道题均附有答案解析&#xff1a; 题目1 衡量优秀系统架构设计师的核心标准不包括以下哪项&#xff1f; A. 技术全面性与底层系统原理理解 B. 能够独立完成模块开发与调试 C. 与利益相关者的高效沟通与协调能力 D. 对业务需求和技术趋势的战略…

MPI Code for Ghost Data Exchange in 3D Domain Decomposition with Multi-GPUs

MPI Code for Ghost Data Exchange in 3D Domain Decomposition with Multi-GPUs Here’s a comprehensive MPI code that demonstrates ghost data exchange for a 3D domain decomposition across multiple GPUs. This implementation assumes you’re using CUDA-aware MPI…

计算机考研精炼 计网

第 19 章 计算机网络体系结构 19.1 基本概念 19.1.1 计算机网络概述 1.计算机网络的定义、组成与功能 计算机网络是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 …

KUKA机器人自动备份设置

在机器人的使用过程中&#xff0c;对机器人做备份不仅能方便查看机器人的项目配置与程序&#xff0c;还能防止机器人项目和程序丢失时进行及时的还原&#xff0c;因此对机器人做备份是很有必要的。 对于KUKA机器人来说&#xff0c;做备份可以通过U盘来操作。也可以在示教器上设…

【wpf】 WPF中实现动态加载图片浏览器(边滚动边加载)

WPF中实现动态加载图片浏览器&#xff08;边滚动边加载&#xff09; 在做图片浏览器程序时&#xff0c;遇到图片数量巨大的情况&#xff08;如几百张、上千张&#xff09;&#xff0c;一次性加载所有图片会导致界面卡顿甚至程序崩溃。 本文介绍一种 WPF Prism 实现动态分页加…

Kubernetes》》k8s》》Taint 污点、Toleration容忍度

污点 》》 节点上 容忍度 》》 Pod上 在K8S中&#xff0c;如果Pod能容忍某个节点上的污点&#xff0c;那么Pod就可以调度到该节点。如果不能容忍&#xff0c;那就无法调度到该节点。 污点和容忍度的概念 》》污点等级——>node 》》容忍度 —>pod Equal——>一种是等…

SEO长尾关键词优化核心策略

内容概要 在搜索引擎优化领域&#xff0c;长尾关键词因其精准的流量捕获能力与较低的竞争强度&#xff0c;已成为提升网站自然流量的核心突破口。本文围绕长尾关键词优化的全链路逻辑&#xff0c;系统拆解从需求洞察到落地执行的五大策略模块&#xff0c;涵盖用户搜索意图解析…

AWS中国区ICP备案全攻略:流程、注意事项与最佳实践

导语 在中国大陆地区开展互联网业务时,所有通过域名提供服务的网站和应用必须完成ICP备案(互联网内容提供商备案)。对于选择使用AWS中国区(北京/宁夏区域)资源的用户,备案流程因云服务商的特殊运营模式而有所不同。本文将详细解析AWS中国区备案的核心规则、操作步骤及避坑…

计算机视觉——通过 OWL-ViT 实现开放词汇对象检测

介绍 传统的对象检测模型大多是封闭词汇类型&#xff0c;只能识别有限的固定类别。增加新的类别需要大量的注释数据。然而&#xff0c;现实世界中的物体类别几乎无穷无尽&#xff0c;这就需要能够检测未知类别的开放式词汇类型。对比学习&#xff08;Contrastive Learning&…

大语言模型的“模型量化”详解 - 04:KTransformers MoE推理优化技术

基本介绍 随着大语言模型&#xff08;LLM&#xff09;的规模不断扩大&#xff0c;模型的推理效率和计算资源的需求也在迅速增加。DeepSeek-V2作为当前热门的LLM之一&#xff0c;通过创新的架构设计与优化策略&#xff0c;在资源受限环境下实现了高效推理。 本文将详细介绍Dee…