利用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,打完收工!!!

相关推荐
Python私教3 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
吾日三省吾码4 小时前
JVM 性能调优
java
弗拉唐5 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi775 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
BestandW1shEs6 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师6 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球6 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...6 小时前
表的操作(MySQL)
数据库·mysql·表的操作
哥谭居民00016 小时前
MySQL的权限管理机制--授权表
数据库