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

前面几篇基本上介绍完了NVeloDocx的基础用法,绝大部分的需求其实都是这些基础的东西,本篇将介绍2个不常用但是实际的业务场景:

1、图片列表输出;

比如在E6开发平台生成的客户端中,图片列表往往是这样显示的:

E6开发平台的图片列表

但是在生成Word报告时,往往会要求把图片按每2张或者3张一行,自动填入Word表格中,还需要显示图片名称,这种情况如果不做特殊处理,显然是很难通过NVelocity脚本实现的,毕竟NVelocity脚本能力有限。

需要在Word中把图片按每2张一行显示在表格中

怎么处理呢?NVeloDocx提供了方法,把一个图片列表先转成每2张图片为一组的形式,再使用前面介绍的#foreach循环的方式就可以把图片按上图要求进行输出了:

把图片转成每2张一组后再foreach循环输出

上面效果图所对应的NVeloDocx模版如下图:

NVeloDocx模版

脚本如下:

第一步:先获取图片列表数据,取数方法和前面介绍的取子表数据完全一致,采用data.GetChild("图片列表表单编号") 的方式,取数后把数据赋值给一个$child变量:

#set(child={data.GetChild("CustomerPictureBoxList")})

第二步

采用NVeloDocx提供的工具utils.ToArr方法,把图片列表数据child转成每2张图片为一组的列表items:

#set(items=utils.ToArr($child, 2))

第三步:得到新的图片列表后就可以for循环了:

#foreach(item in items)

#end

for循环由于循环的是前面已经分组好的图片列表,每组2张图片,所以我们就需要分别获得这2张图片并使用word.InsertImg方法填入表格位置:

{word.InsertImg({child.GetValue(${item.GetValue(0)},"Path")},72,45)}

{word.InsertImg({child.GetValue(${item.GetValue(1)},"Path")},72,45)}

这里最关键的是item.GetValue(0)和item.GetValue(1),因为前面已经对图片进行分组了,所以这里就表示分别取第1和第2张图片对象。而{child.GetValue({item.GetValue(0)},"Path")},表示的就是取图片实际路径了,这里和前面介绍的取子表字段的方式是一致的。

总体来说图片的处理算是整个NVeloDocx中是"复杂"的了(就这?),但是您可以直接拷贝整段脚本,修改下"图片列表编号"的值即可执行。


2、多行文本的处理:

比如有如下的多行文本框,如果不做特殊处理的话,那么输出的内容那都是没换行没分段的,那么我们就需要借助NVeloDocx工具utils.SplitStr来实现换行分段:

多行文本框

脚本如下:

由于多行文本框本身就是一个普通字段,所以我们可以通过前面介绍过的取主表字段的方法data.GetValue("多行文本框字段名")获取到文本框的值,然后借助于utils.SplitStr就可以默认按回车换行符把这个字段拆分多行,就可以使用#foreach进行输出了。

#foreach(str in {utils.SplitStr(${data.GetValue("多行文本框字段名")})})

${str}

#end

输出后的效果如下:

输出到Word中的效果

从这一系列文章可以看出,基于NVeloDocx引擎,Word模版制作非常容易。

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

相关推荐
三品吉他手会点灯4 小时前
C语言学习笔记 - 50.流程控制4 - 流程控制为什么非常非常重要
c语言·开发语言·笔记·学习
在放️6 小时前
Python 爬虫 · 第三方代理接入与合规使用
开发语言·爬虫·python
KANGBboy7 小时前
java知识五(继承)
java·开发语言
c++之路7 小时前
Bazel C++ 构建系列文档(三):构建第一个 C++ 项目
开发语言·c++
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
聚名网8 小时前
域名net,com,cn有区别吗?有哪些不同呢?
服务器·开发语言·php
牛油果子哥q8 小时前
STL set与map底层精讲,红黑树适配原理、有序去重特性、迭代器遍历、API实战与面试核心考点全解
开发语言·数据结构·c++·面试
foundbug9998 小时前
直流电机 PID 速度控制 MATLAB 仿真程序
开发语言·matlab
Tian_Hang9 小时前
C++原型模式(Protype)
开发语言·c++·算法
天天讯通9 小时前
OKCC 呼叫中心安全性能全解析:技术防护与管理措施指南
大数据·开发语言·网络·人工智能·安全·语音识别