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

本文介绍了如何使用Java和ApachePOI库开发一个工具,将MySQL数据库的所有库和字段注释整合到一个Word文档中,包括合并多个源文件,处理表格和段落。作者还分享了其GitHub项目地址,展示了通过JDBC调用该工具的示例输出。
摘要由CSDN通过智能技术生成

参考链接: 

导出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 cell
                XWPFTableCell 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 remove
                targetCell.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 formatting
            targetRun.getCTR().setRPr(run.getCTR().getRPr());
            //no images just copy text
            targetRun.setText(run.getText(0));
        }
    }

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

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

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用如下的SQL语句来获取dwd库中所有表的信息: ``` SELECT table_name, table_comment FROM information_schema.tables WHERE table_schema = 'dwd' ``` 这个语句会返回dwd库中所有表的表名和表注释。 接下来,可以使用以下的SQL语句来获取每个表的字段名和字段注释: ``` SELECT column_name, column_comment FROM information_schema.columns WHERE table_schema = 'dwd' AND table_name = '表名' ``` 将上面的SQL语句中的“表名”替换具体的表名,就可以获取该表的所有字段名和字段注释。 如果需要将所有表的信息导出来,可以使用脚本来自动化执行以上的SQL查询,并将结果保存到文件中。以下是一个Python脚本的示例: ``` import pymysql # 连接数据库 db = pymysql.connect(host='localhost', user='root', password='密码', db='dwd') # 获取所有表的信息 cursor = db.cursor() cursor.execute("SELECT table_name, table_comment FROM information_schema.tables WHERE table_schema = 'dwd'") tables = cursor.fetchall() # 获取每个表的字段信息并输出到文件 with open('output.txt', 'w', encoding='utf-8') as f: for table in tables: table_name = table[0] table_comment = table[1] f.write(f'Table Name: {table_name}\nTable Comment: {table_comment}\n') cursor.execute(f"SELECT column_name, column_comment FROM information_schema.columns WHERE table_schema = 'dwd' AND table_name = '{table_name}'") columns = cursor.fetchall() for column in columns: column_name = column[0] column_comment = column[1] f.write(f'Column Name: {column_name}\nColumn Comment: {column_comment}\n') f.write('\n') # 关闭数据库连接 db.close() ``` 这个脚本会将所有表的信息输出到一个名为“output.txt”的文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值