• 数据库表字段以表格形式写入Word


    在项目的开发中,难免会有编写概要设计、详细设计文档的要求,而在这些文档中,不可避免的就是要把数据库表的字段信息以表格的形式体现出来。例如下面这种格式

    表数量少点还可以一点点粘贴,多了的话真的会疯,所以自己编写了一套可以自动读取数据表字段来批量写入文档的代码。

    maven项目需要先引入依赖

    1. com.google.guava
    2. guava
    3. 27.0-hbase
    4. org.apache.poi
    5. poi-ooxml
    6. 5.0.0
    7. mysql
    8. mysql-connector-java
    9. 8.0.23
    10. com.google.guava
    11. guava
    12. 25.1-jre

    代码如下: 

    1. import avro.shaded.com.google.common.collect.Lists;
    2. import org.apache.poi.xwpf.usermodel.*;
    3. import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
    4. import java.sql.*;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.math.BigInteger;
    8. import java.util.List;
    9. public class DatabaseToWordExample{
    10. public static void main(String[] args) throws SQLException, IOException {
    11. // 创建Word文档
    12. XWPFDocument doc = new XWPFDocument();
    13. // 创建1级标题
    14. setDocTitle(doc,1,"一、数据库表设计");
    15. // 连接数据库
    16. Connection conn = DriverManager.getConnection("jdbc:mysql://{IP}:{port}/{数据库名}", 用户名, 密码);
    17. List dbList = Lists.newArrayList("user");
    18. // 获取元数据
    19. DatabaseMetaData metaData = conn.getMetaData();
    20. int dbNum = 1;
    21. for (String database : dbList) {
    22. // 2级数据库标题名
    23. String databaseTitle = new StringBuilder(String.format("%d.%d",1,dbNum))
    24. .append(" ")
    25. .append(database)
    26. .append("库")
    27. .toString();
    28. // 创建2级标题
    29. setDocTitle(doc,2,databaseTitle);
    30. int tableNum = 1;
    31. // 查询表列表
    32. ResultSet tables = metaData.getTables(database, null, null, null);
    33. while (tables.next()){
    34. String tableName = tables.getString("TABLE_NAME");
    35. // 查询表注释
    36. String sql = "SELECT table_comment FROM information_schema.tables WHERE table_schema = ? AND table_name = ?";
    37. PreparedStatement ps = conn.prepareStatement(sql);
    38. ps.setString(1, database);
    39. ps.setString(2, tableName);
    40. ResultSet rs = ps.executeQuery();
    41. String tableComment = "";
    42. if (rs.next()) {
    43. tableComment = rs.getString("table_comment");
    44. }
    45. // 3级表标题名
    46. String tableTitle = new StringBuilder(String.format("%d.%d.%d",1,dbNum,tableNum))
    47. .append(" ")
    48. .append(tableName)
    49. .append(" ")
    50. .append(tableComment)
    51. .toString();
    52. // 创建3级标题
    53. setDocTitle(doc,3,tableTitle);
    54. // 创建表格
    55. XWPFTable table = createTable(doc);
    56. ResultSet columns = metaData.getColumns(database, null, tableName, null);
    57. // 添加数据行
    58. while (columns.next()) {
    59. XWPFTableRow dataRow = table.createRow();
    60. setRowHeight(dataRow, "490");
    61. dataRow.getCell(0).setText(columns.getString("COLUMN_NAME"));
    62. dataRow.getCell(1).setText(columns.getString("TYPE_NAME"));
    63. dataRow.getCell(2).setText(Integer.toString(columns.getInt("COLUMN_SIZE")));
    64. dataRow.getCell(3).setText(columns.getString("REMARKS"));
    65. // 设置数据行单元格边框
    66. for (XWPFTableCell cell : dataRow.getTableCells()) {
    67. setCellBorders(cell);
    68. }
    69. }
    70. tableNum++;
    71. }
    72. dbNum++;
    73. }
    74. // 保存Word文档
    75. try (FileOutputStream out = new FileOutputStream("output.docx")) {
    76. doc.write(out);
    77. }
    78. // 关闭数据库连接
    79. conn.close();
    80. }
    81. /**
    82. * 设置标题
    83. *
    84. * @param doc
    85. * @param titleLevel 标题等级
    86. * @param titleName 标题名称
    87. */
    88. private static void setDocTitle(XWPFDocument doc, int titleLevel, String titleName){
    89. switch (titleLevel) {
    90. case 1:
    91. // 创建一级标题
    92. XWPFParagraph title1 = doc.createParagraph();
    93. XWPFRun run1 = title1.createRun();
    94. run1.setText(titleName);
    95. run1.setBold(true);
    96. run1.setFontSize(16);
    97. break;
    98. case 2:
    99. // 创建二级标题
    100. XWPFParagraph title2 = doc.createParagraph();
    101. XWPFRun run2 = title2.createRun();
    102. run2.setText(titleName);
    103. run2.setBold(true);
    104. run2.setFontSize(14);
    105. break;
    106. case 3:
    107. // 创建三级标题
    108. XWPFParagraph title3 = doc.createParagraph();
    109. XWPFRun run3 = title3.createRun();
    110. run3.setText(titleName);
    111. run3.setBold(true);
    112. run3.setFontSize(12);
    113. break;
    114. default:
    115. break;
    116. }
    117. }
    118. /**
    119. * 创建表格
    120. *
    121. * @param doc
    122. * @return
    123. */
    124. private static XWPFTable createTable(XWPFDocument doc){
    125. // 创建表格
    126. XWPFTable table = doc.createTable();
    127. // 设置表格宽度
    128. table.setWidth("9990");
    129. // 创建表头
    130. XWPFTableRow headerRow = table.getRow(0);
    131. setRowHeight(headerRow, "490"); // 设置行高
    132. headerRow.getCell(0).setText("字段名");
    133. headerRow.addNewTableCell().setText("字段类型");
    134. headerRow.addNewTableCell().setText("字段长度");
    135. headerRow.addNewTableCell().setText("字段备注");
    136. // 计算每个单元格的宽度
    137. int totalWidth = 8222; // 总宽度,例如14.5厘米
    138. int numColumns = 4; // 列数,例如4列
    139. int cellWidth = totalWidth / numColumns; // 计算每个单元格的宽度
    140. // 设置表格的列宽
    141. CTTblWidth tblWidth = table.getCTTbl().addNewTblPr().addNewTblW();
    142. tblWidth.setType(STTblWidth.DXA);
    143. tblWidth.setW(BigInteger.valueOf(totalWidth));
    144. // 设置单元格的宽度
    145. for (XWPFTableRow row : table.getRows()) {
    146. for (XWPFTableCell cell : row.getTableCells()) {
    147. CTTcPr tcPr = cell.getCTTc().addNewTcPr();
    148. CTTblWidth cellWidth1 = tcPr.addNewTcW();
    149. cellWidth1.setW(BigInteger.valueOf(cellWidth));
    150. cellWidth1.setType(STTblWidth.DXA);
    151. }
    152. }
    153. // 设置表头单元格边框
    154. for (XWPFTableCell cell : headerRow.getTableCells()) {
    155. setCellBorders(cell);
    156. cell.setColor("D3D3D3"); // 浅灰色的十六进制颜色代码
    157. // 设置文字竖向居中
    158. cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
    159. }
    160. return table;
    161. }
    162. private static void setRowHeight(XWPFTableRow row, String height) {
    163. row.setHeight(Integer.parseInt(height));
    164. }
    165. /**
    166. * 设置单元格边框和竖向居中
    167. * @param cell
    168. */
    169. private static void setCellBorders(XWPFTableCell cell) {
    170. // 确保单元格的CTTcPr对象已经被初始化
    171. if (!cell.getCTTc().isSetTcPr()) {
    172. cell.getCTTc().addNewTcPr();
    173. }
    174. // 设置文字竖向居中
    175. cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
    176. // 设置单元格上边框
    177. CTTcBorders borders = cell.getCTTc().getTcPr().addNewTcBorders();
    178. CTBorder topBorder = borders.addNewTop();
    179. topBorder.setVal(STBorder.SINGLE);
    180. topBorder.setSz(BigInteger.valueOf(4));
    181. topBorder.setColor("000000");
    182. // 设置单元格下边框
    183. CTBorder bottomBorder = borders.addNewBottom();
    184. bottomBorder.setVal(STBorder.SINGLE);
    185. bottomBorder.setSz(BigInteger.valueOf(4));
    186. bottomBorder.setColor("000000");
    187. // 设置单元格左边框
    188. CTBorder leftBorder = borders.addNewLeft();
    189. leftBorder.setVal(STBorder.SINGLE);
    190. leftBorder.setSz(BigInteger.valueOf(4));
    191. leftBorder.setColor("000000");
    192. // 设置单元格右边框
    193. CTBorder rightBorder = borders.addNewRight();
    194. rightBorder.setVal(STBorder.SINGLE);
    195. rightBorder.setSz(BigInteger.valueOf(4));
    196. rightBorder.setColor("000000");
    197. }
    198. }

  • 相关阅读:
    计算机网络 —— 运输层(UDP和TCP)
    【LVGL(重要)】样式属性API函数及其参数
    基于UE4 的AirSim虚拟仿真
    【期望初步、例题】单选错位+小魔女帕琪+收集邮票
    活动库存限制是“递增”还是“递减”、你认为哪种方式更好些???
    js双击修改元素内容并提交到后端封装实现
    golang及beego框架单元测试小结
    C++核心编程
    (四)Spring Security Oauth2.0 源码分析--客户端端鉴权(token校验)
    Python数据采集:抓取和解析XML数据
  • 原文地址:https://blog.csdn.net/cm15835106905/article/details/134414475