Word报告自动生成(例如 导出数据库结构)(上)

简介: 将很早之前写的一个小组件重新整理优化一下,做成一个通用的功能。适用于导出数据库的结构(表、字段等)到Word或将体检数据自动生成Word版的体检报告等。

一、主要需要完成功能:

1. 灵活的配置规则及word样式设置(文本、表格、图表、颜色等).


2. 支持表格.


3. 支持图表.


4. 支持章节内容循环生成.


5. 支持目录.


6.支持文档结构图


7.更新指定位置的文字


8.支持pdf导出.


最后结果如下:

16.png

图一

17.png

 图二

18.png

图三


二、需求分析与实现方式

  功能主要涉及3个比较重要的部分:数据源、Word样式、配置规则。


    为了简单,数据源决定采用一个存储过程返回Dataset的方式, 整张报告的数据来源于此Dataset的多个Datatable.


 样式与配置:首先想到的是写一个config文件,所有配置都放到一个文件里,然后将数据按照这个规则生成word。但无疑这样的配置项太多了,关键是“样式”问题,比如字体、颜色、表格宽度.....想想就头大。而且没有“所见即所得”的效果,配置完都不知道啥样。


后来决定采取修改的方式, 先以一个word文件作为模板,在模板中定义好上面提到的“样式”,然后在模板中做一个个标记,然后将数据按照规则更新到对应的标记。


19.png

19.png

    图四

   而这个标记我们用到了word的一个叫【书签】的功能,打开word按ctrl+shift+F5, 打开书签功能,如下图:

20.png

 图五


这样将【规则】通过一系列规则的【书签】定义到word模板中。


三、规则配置

 思路确定了,那就开始设计如何通过【书签】将规则定义到word模板中去,这里决定将所有规则都通过【书签】实现,而放弃config文件的方式,这个更统一而且直观一些。


A.循环

     以图四为例,数据库有多少张表是不固定的,我们在制作模板的时候不可能先画好N(N为表的总数)个表格等待数据填充, 这里就会需要遍历数据源中提供的所有表结构数据,然后逐一形成表格。这里就需要将图四中的表格循环一下,自动复制生成多个这样的表格。当然,这只是一种情况,还有可能会出现循环嵌套循环的情况,那么我将这个循环定义成一个书签的时候按照这样的格式:


     loop_级别_表序号_filter_名称


含义如下:


    loop:代表这是一个循环。


    级别:默认文档级别为0,出现的第一层循环为1,其内部若再次嵌套循环则级别为2,依次类推。


    表序号:取Dataset中的第几张表(从1开始)


    filter:循环的时候可能会用到对datatable的查找过滤,在此写出,多个字段用XX隔开(因为此处不允许有下划线外其他特殊字符, 就用这个XX吧 )


    名称:loop名称,方便与其他 loop区别


B.更新指定位置的文字

   如图四中的【服务器名】、【表总数】等,只需要替换对应的文字即可:


   label_级别_名称


含义如下:


    label:代表这是一个label。


    级别:默认文档级别为0,出现的第一层循环为1,其内部若再次嵌套循环则级别为2,依次类推。


    名称:label名称


    注意这里省略了表序号,当级别为0的时候 ,自动取最后一个datatable中的数据,因为这个label经常会用到其他表汇总的数据,可能会用到之前几张表的数据,所以放在其他表都处理好后。当级别为1的时候,自然取该级别循环的行数据。


C.表格

    表格的配置原本也想对表格添加书签,后来发现有个表格属性, 觉得写在这里更好一些。


21.png

21.png

如上图所示,【标题】格式为:table_级别_取Dataset中的第几张表(从1开始)_filter字段多个用XX隔开(此处不允许有下划线外其他特殊字符, 就用这个XX吧 )_名称


【说明】为可选项,若需要合计行, 则需要标识, summary或缩写s: [合计]行是模板中表格的第几行   summaryfilter或缩写sf:数据集进一步filter到summary行的条件(因为一个表格只取一个Datatable,通过一个标识指定了哪些datarow是用来作为合计的)


D.图表

同样为了方便将配置写在了【标题】,图表生成后会将名称修改过来。


配置格式为:chart_级别_取Dataset中的第几张表(从1开始)_filter字段多个用XX隔开(此处不允许有下划线外其他特殊字符, 就用这个XX吧 )_chart名称_是否将Datatable的columnName作为第一行_从datatable第几列开始(列起始为1)_截止列,


如下图所示配置即可。

22.png

E.目录

无需标识, 模板中添加目录, 当内容处理完成之后, 会根据处理后的结果动态更新目录.

目录
相关文章
|
8天前
|
存储 关系型数据库 MySQL
|
19天前
|
SQL 运维 数据管理
数据管理DMS产品使用合集之如何修改在结构设计中的基准数据库
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
115 4
|
24天前
|
存储 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
35 7
|
21天前
|
存储 缓存 监控
如何设计数据库结构?
如何设计数据库结构?【6月更文挑战第9天】
19 3
|
23天前
|
缓存 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
39 3
|
24天前
|
存储 关系型数据库 MySQL
MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)
26 1
|
24天前
|
SQL 关系型数据库 数据建模
Dify数据库结构导出到PowerDesigner
Dify是开源大语言模型应用开发平台,助力快速构建生成式AI应用。PowerDesigner是SAP的企业级建模工具,用于数据建模、业务流程建模和企业架构规划。通过PostgreSQL的`pg_dump`导出表结构到SQL文件,然后在PowerDesigner中导入生成物理数据模型,从而实现Dify数据库结构到PowerDesigner的迁移。
46 1
|
16天前
|
存储 数据库 数据安全/隐私保护
揭秘数据库技术的核心:从结构到策略
一、引言 在信息化快速发展的今天,数据库技术作为数据存储和管理的基石,扮演着至关重要的角色
|
24天前
|
存储 关系型数据库 MySQL
MySQL数据库——索引(1)-概述以及B-Tree结构
MySQL数据库——索引(1)-概述以及B-Tree结构
14 0
|
2天前
|
存储 关系型数据库 MySQL