利用poi实现将数据库表字段信息导出到word中

研发文档对于开发人员来说都不陌生了,而研发文档里重要的一部分就是表结构设计,需要我们在word建个表格把我们数据库中的表字段信息填进去,表多的话靠我们手动去填非常累人!!!

因此作为开发人员可不可以写段代码,自动帮我把数据库表及字段信息封装成表格导出到word中呢?

当然可以

sql 复制代码
-- 该sql可以返回表字段信息
SHOW FULL FIELDS FROM base_user

这个sql就可以返回我们需要查的表字段信息

++那思路就有了,我们把查到的信息进行封装,利用poi导出到word中++

1、创建实体类接收数据库表信息

sql 复制代码
package com.javacoding.entity;

import lombok.Data;

@Data
public class TableStruct {
   private String field;
   private String type;
   private String comment;
}

2、接口实现

java 复制代码
@GetMapping("/dbtable")
public void dbTableExport(HttpServletResponse response) {
    poiTestService.export(response);
}
java 复制代码
public void export(HttpServletResponse response) {
    try {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("表结构注释说明" + LocalDate.now().toString(), "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".docx");

        // 创建文档
        XWPFDocument document = new XWPFDocument();

        //设置标题
        XWPFStyles styles = document.createStyles();
        String heading1StyleId = "heading1";
        addCustomHeadingStyle(styles, heading1StyleId, "标题 1", 1);

        // 需要导出的表名
        List<String> tables = new ArrayList<>();
        tables.addAll(Arrays.asList("base_user"));

        tables.forEach(temp -> {
            //生成标题
            XWPFParagraph title1Paragraph = document.createParagraph();
            title1Paragraph.setStyle(heading1StyleId);
            XWPFRun title1Run = title1Paragraph.createRun();
            title1Run.setText(temp);

            //生成表头
            List<TableStruct> tableInfo = poiTestMapper.getTableInfo(temp);
            XWPFTable table = document.createTable(tableInfo.size() + 1, 3);
            table.setWidth("100%");
            table.getRow(0).getCell(0).setText("字段名称");
            table.getRow(0).getCell(1).setText("字段类型");
            table.getRow(0).getCell(2).setText("字段描述");

            //生成表内容  第0行已经设置为表头,因此我们需要从第一行开始
            for (int row = 0; row < tableInfo.size(); row++) {
                table.getRow(row + 1).getCell(0).setText(tableInfo.get(row).getField());
                table.getRow(row + 1).getCell(1).setText(tableInfo.get(row).getType());
                table.getRow(row + 1).getCell(2).setText(tableInfo.get(row).getComment());
            }
        });

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        document.write(byteArrayOutputStream);
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(byteArrayOutputStream.toByteArray());
        outputStream.flush();
        outputStream.close();
        document.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static void addCustomHeadingStyle(XWPFStyles styles, String styleId, String styleName, int headingLevel) {
    CTStyle ctStyle = CTStyle.Factory.newInstance();
    ctStyle.setStyleId(styleId);
    CTString styleNameString = CTString.Factory.newInstance();
    styleNameString.setVal(styleName);
    ctStyle.setName(styleNameString);

    CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
    indentNumber.setVal(BigInteger.valueOf(headingLevel));

    CTPPr ppr = CTPPr.Factory.newInstance();
    ppr.setOutlineLvl(indentNumber);
    ctStyle.setPPr(ppr);

    XWPFStyle style = new XWPFStyle(ctStyle);
    styles.addStyle(style);
}

上述代码我只导出了三个字段,如果需要其他字段按照逻辑自行添加即可。

看下效果图:

OK,打完收工!!!

相关推荐
long3162 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql
Pluchon2 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦雨生生3 小时前
java开发工具(学习第一天)
java·开发语言·学习
数据库小学妹3 小时前
数据库等保三级和四级有什么区别?从访问控制到备份恢复的完整对比
数据库·安全·数据库安全·三级等保·等保合规·四级等保
她说可以呀3 小时前
Spring-ai-alibaba文生图
java·人工智能·spring
看浪的路人4 小时前
第3讲:手写第一个 MCP Server(Python SDK)
jvm·数据库·oracle
大眼、不聚光4 小时前
5.mysql--主从同步安装部署
数据库·mysql
Yan_chen6665 小时前
SQL-LABS_Less18-20实战攻略
数据库·sql·web安全·网络安全
oradh5 小时前
Oracle RAC OCR维护操作总结
数据库·oracle·ocr·rac ocr维护·ocr维护·vote disk
松仔log5 小时前
Java中级——组合和继承
android·java·开发语言