当前位置: 首页 > news >正文

根据NVeloDocx Word模板引擎生成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开发平台的用户绝大部分都是无任何编程经验的。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 即插即用篇 | YOLOv8 引入并行的分块注意力 | 北京大学 2024 | 微小目标
  • Linux:从入门到放弃
  • LeetCode之常用函数
  • LINQ语句中groupby和lookup的区别以及skip使用方法
  • The First项目报告:BlackCardCoin让数字资产多元化
  • React 组件的基本使用,useState 状态变量的使用
  • 万字长文 | Apache开源社区出海的“踩坑”之路,看完这3点你就明白了
  • SpringSecurity原理解析(五):HttpSecurity 类处理流程
  • 汽车无钥匙启动功能工作原理
  • vscode任务配置之tasks.json
  • 一位10块!餐厅的白开水,也开始收钱了……
  • 〖open-mmlab: MMDetection〗解析文件:mmdet/models/roi_heads/bbox_heads/bbox_head.py
  • 【安全系列--处理挖矿】
  • 解析主子格式的 csv
  • 基于Java+ssm+jsp开发的相亲交友网站管理系统
  • 「译」Node.js Streams 基础
  • Electron入门介绍
  • ES10 特性的完整指南
  • learning koa2.x
  • MySQL的数据类型
  • Redis中的lru算法实现
  • 规范化安全开发 KOA 手脚架
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 老板让我十分钟上手nx-admin
  • 试着探索高并发下的系统架构面貌
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 学习使用ExpressJS 4.0中的新Router
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #NOIP 2014# day.2 T2 寻找道路
  • #QT 笔记一
  • (07)Hive——窗口函数详解
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (libusb) usb口自动刷新
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (函数)颠倒字符串顺序(C语言)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET大文件上传知识整理
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET开源快速、强大、免费的电子表格组件
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET中的Exception处理(C#)
  • ::before和::after 常见的用法
  • [20150321]索引空块的问题.txt
  • [2544]最短路 (两种算法)(HDU)
  • [AIGC codze] Kafka 的 rebalance 机制
  • [BZOJ 3680]吊打XXX(模拟退火)