根据NVeloDocx Word模板引擎生成Word(四)

devtools/2024/9/19 15:43:52/ 标签: word

前面介绍了《E6低代码开发平台》的Word模版引擎NVeloDocx,实现了表单的基本字段、子表、单张图片、二维码、条形码怎么基于NVelocity脚本输出到Word文件,都是些比较简单且常用的需求。

本篇介绍怎么基于NVeloDocx在Word中插入图表,目前只支持柱状图,折线图,饼图。

当前只支持这3种图表的原因主要还是在Word中插入图表实在是有点困难,这种困难主要体现在软件编码上,很难找到相关的可参考代码,Open Xml SDK仅有的例子都是基于Excel的,拿过来压根不能用。而网络上很少例子,即使有也是基于Open Xml SDK 2.X的,不兼容Open XML SDK 3。

后来基于V2.5的工具Open XML SDK 2.5 Productivity Tool,花费大量的时间才最终把这3个图表的生成代码写出来,个中滋味不足为外人道!

当然花费这么大的代价最终也是很值得的,方便了我们自己,同时也方便了E6的用户,毕竟E6开发平台是永久免费开放的,且绝大部分都是没有软件基础的,要他们去开发个插件基本不可能。

下面进入正题:

要插入图表,首先得有数据源,Word图表的数据源就是一个如下类似的表格,所以能生成图表的也就是子表数据了:

Word图表的数据格式 

那么就需要我们在E6的Word模版数据源配置中,选择好子表,这样才能把对于子表的数据读取出来。由于E6开发平台是完全免费开放的,所以如果想实操,请自行注册下载安装。

 

在E6中设置好数据源 

 

其实整个过程最主要的就是设置好数据子表。图表所需要的子表的操作和E6表单上的子表操作完全相同,可以是主表单上的某个子表,也可以是某个表单的汇总信息,甚至存储过程返回的数据都可以。和普通子表不一样的地方在于,需要一个非数字列,其他的都是数字列(如上图中,非数字列为:保险公司,数字列为:保单保费、折标保费),因为图表显示的数据格式要求如此。

定义好数据后,插入图表的操作就是一行代码了:

柱状图:使用word.InsertBarChart()方法插入柱状图,包括4个参数,如下:

${word.InsertBarChart(${data.GetChild("Policy","DataGridViewForGroupBy1")},"保单汇总",140,90)}

参数1:子表,通过${data.GetChild("Policy","DataGridViewForGroupBy1")}获得子表数据,其中Policy表示子表编号(在E6中,每个表单都有一个编号),DataGridViewForGroupBy1表示控件名(在E6开发平台中可以查看)。

参数2:图表标题,如“保单汇总”;

参数3:图表宽,如“140”(单位毫米);

参数4:图表高,如“90”(宽度毫米)。

柱状图 

基于NVeloDocx是不是非常容易理解?虽然整个开发过程非常困难,但是最终用户的使用就是这么简单。

折线图和饼图的使用方法,除了方法名不一样以外,其他参数都是相同的,所以就不再一一介绍。

折线图:折线图的方法是word.InsertLineChart

${word.InsertLineChart(${data.GetChild("Policy","DataGridViewForGroupBy1")},"保单汇总",140,90,"Stacked")}

折线图 

饼图:饼图的方法是word.InsertPieChart

${word.InsertPieChart(${data.GetChild("Policy","DataGridViewForGroupBy1")},"保单汇总",140,90)}

饼图 

 Word支持很多的图表,但是很多都是基于这3中基本图表的变化,所以想把所有图表都实现其实也是没有太多意义的。


写在最后:基于E6开发平台的NVeloDocx,整个Word模版制作非常容易。

相信使用过NVelocity模版引擎的人都知道,这个模版引擎确实很强,就是出问题排查的时候实在头痛,特别是模版内容很多且命令很多的时候。但是NVeloDocx自带了NVelocity命令错误检测功能(很智能吧?),能够检测到具体是Word模版中哪一段的命令错误,错误原因大概是什么,最多的情况就是命令不正确,#if,#foreach等缺少对应的#end,以及括号是否匹配等等。毕竟E6开发平台的用户绝大部分都是无任何编程经验的。

 


http://www.ppmy.cn/devtools/112710.html

相关文章

HarmonyOS Next鸿蒙NDK使用示例

创建一个Native C项目 跟普通项目相比,主要区别是多了一个cpp文件夹、oh-package.json5中的dependencies引入还有build-profile.json5中的externalNativeOptions配置,abiFilters是支持的CPU架构,目前移动端项目只支持arm64-v8a、x86_64两种。…

笔试强训day07

在字符串中找出连续最长的数字串 #include <bits/stdc.h>using namespace std; const int N 500; char s[N]; bool check(char c) {return c > 0 && c < 9; } int main() {scanf("%s", s);int l -1, r -1;int n strlen(s);int left 0, rig…

Spring Boot 常用注解

1. 基础 Spring 注解 Component 标记一个类作为 Spring IoC 容器的一个组件。Repository 标记一个 DAO 类&#xff0c;同时提供了异常转换机制。Service 标记业务逻辑层的服务类。Controller 标记一个 Web 层的控制器类。RestController 结合了 Controller 和 ResponseBody&am…

GO Govaluate

govaluate 是一个用于在 Go 语言中动态求值表达式的库。它允许你解析和评估字符串形式的表达式&#xff0c;这些表达式可以包含变量、函数以及逻辑、算术和比较操作。它非常适合在运行时处理复杂的逻辑规则和条件表达式&#xff0c;而不需要重新编译代码。 安装 govaluate go…

C语言自定义类型结构体(24)

文章目录 前言一、结构体类型的声明结构体回顾结构体的特殊声明结构体的自引用 二、结构体的内存对齐对齐规则为什么存在内存对齐&#xff1f;修改默认对齐数 三、结构体传参四、结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段的应用位段使用的注意事项 总结 前言…

Linux学习-Ansible(一)

环境- Rocky-Linux8.6 安装部署Ansible # 安装ansible [rootharbor ansible]# dnf install -y ansible-core #查看安装信息 [rootharbor ansible]# ansible-doc --version ansible-doc [core 2.12.2]config file /root/ansible/ansible.cfgconfigured module search path […

动态规划---不相交的线

题目&#xff1a; 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水…

SQLITE3数据库实现信息的增删改查

#include <myhead.h> #include <sqlite3.h> typedef struct { int id; char name[20]; int age; int money; }woker; int callbake(void *arg,int n,char **a,char **b)//回调 输出查找到的工人信息 { for(int i 0;i<n;i) { …

[数据集][目标检测]汽车头部尾部检测数据集VOC+YOLO格式5319张3类别

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 版权单位&#xff1a;未来自主研究中心(FIRC) 版权声明&#xff1a;数据集仅仅供个人使用&#xff0c;不得在未授权情况下挂淘宝、咸鱼等交易网站公开售卖,由此引发的法律责任需自行承担 数据集格式&#xff1a;Pascal VOC格…

Linux05

1.echo命令 echo是输出命令&#xff0c;类似printf 例如&#xff1a;echo "hello world"&#xff0c;输出hello world echo pwd&#xff0c;输出pwd的位置。是键盘上~ 2.重定向符> >> >指把左边内容覆盖到右边 echo hello world>test.txt >…

MATLAB在嵌入式系统设计中的最佳实践

嵌入式系统设计是一个复杂的过程&#xff0c;涉及硬件和软件的紧密集成。MATLAB提供了一套全面的解决方案&#xff0c;从算法开发到代码生成&#xff0c;再到硬件验证&#xff0c;极大地简化了这一过程。本文将探讨使用MATLAB进行嵌入式系统设计的最佳实践&#xff0c;包括模型…

Vue Router push方法的使用

Vue Router push方法的使用 this.$router.push 是 Vue Router 提供的一个方法,用于在 Vue.js 应用中进行编程式导航。它的作用是将用户导航到应用中的不同路由。 基本作用 this.$router.push 方法会在浏览器历史记录中添加一个新的记录,并导航到指定的路由。它的工作方式类…

深度学习中常见的损失函数

在机器学习和深度学习中&#xff0c;损失函数用于衡量模型预测值与真实值之间的差异。根据任务的类型&#xff08;如回归、分类等&#xff09;&#xff0c;可以使用不同的损失函数。下面列举了一些常见的损失函数&#xff1a; 1. 回归问题中的损失函数 回归任务的目标是预测连…

广播与组播,超时检测

目录 一.超时检测 必要性 超时检测的设置方法 1. 通过函数自带的参数设置 2. 通过设置套接字属性进行设置 3. alarm函数与sigaction函数结合 二.广播与组播&#xff08;broadcast & multicast&#xff09; 1. 广播&#xff08;udp&#xff09; 理论&#xff1a…

什么是外贸专用路由器?

一、外贸专用路由器的显著特点 全球兼容性 外贸专用路由器支持多种国际通信标准和频段&#xff0c;能够无缝连接不同国家和地区的网络&#xff0c;从而避免因地域限制导致的网络问题。这种全球兼容性确保了外贸企业在全球范围内的网络部署更加顺畅&#xff0c;让企业在任何角落…

对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Adversarial EM for variational deep learning: Application to semi-supervised image quality enhancement in low-dose PET and low-dose CT 对抗性EM用于变分深度学习&#xff1a;在低剂量PET和低剂量CT中的半监督图像质量增强应用 01 文献速递介绍 医学影…

『功能项目』战士的伤害型技能【45】

我们打开上一篇44战士职业平A怪物掉血的项目&#xff0c; 本章要做的事情是制作技能按钮&#xff0c;点鼠标点击时释放对范围内怪物的伤害技能 首先双击打开资源脚本下的Canvas预制体 制作技能栏 在资源商店中下载免费资源 - 技能图片 将技能图片拖拽至技能栏的Button按钮组件…

深入理解Python中的魔法参数 *args 和 **kwargs

在Python编程中&#xff0c;函数的灵活性是其强大之处之一。其中&#xff0c;*args 和 **kwargs 是实现函数参数可变性的重要工具。 无论我们是Python初学者还是经验丰富的开发者&#xff0c;充分理解这两个概念都有助于编写更加灵活、高效的代码。 本文将深入探讨*args和**kw…

1、常用的数据库、表操作

基本的建表和数据库拷贝操作。 一、数据定义语言DDL show databases; # 查看全部数据库 show create database db; # 查看数据库db create database db; # 创建数据库db drop database db; # 删除数据库db use db; # 使用数据库db基本…

动态规划(算法)---03.斐波那契数列模型_最小花费爬楼梯

题目链接&#xff1a; 746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/min-cost-climbing-stairs/description/ 一、题目解析 题目&#xff1a; 解析&#xff1a; 题目说cost[i]为从某一个台阶向上爬的的费用&#xff0c;我们…