5. 批量导出图片

在表单中上传图片时,可直接将数据项定义成图片,可上传单张图片或者多张图片,如何批量将这些表单中的图片导出呢?

1.图片的存储逻辑

云表系统中支持上传图片,上传图片有3种方式:图片数据项、附件和文档管理。其中附件和文档管理功能支持图片以外的文件格式,文档管理相对于附件又多了权限控制和版本控制。图片数据项在定义数据项时,需要将数据项的类型设置为“图片”,右侧工具栏选项卡“图片属性”还可设置图片的类型,是单图片还是多图片,在表单无需操作可直接预览图片,更直观方便。
图片数据项在存储时会分为2部分:图片和图片路径,图片上传到云表服务器安装路径下的隐藏路径,图片路径保存到数据库的“图片”字段,因此只要获取到图片的路径就可将图片下载导出。
如下图在“数据接口”中将图片数据项强制转化为文本数据项后,可看到如下的效果图,其中编号为“sp-05”的商品只保存1张图片,编号为“sp-01”的商品保存2张图片
批量导出图片可分为2种情况:单图片批量导出和多图片批量导出。
  • 单图片批量导出实现思路:设计辅助模板将多个表单的图片写入到辅助模板中通过导出excel功能批量导出到指定的文件夹,简单很多。
再看多图片的批量导出:
{"fileData":[{"fileSize":269431,"fileType":"png","fileName":".png","fileId":"221","owner":""}],"type":"file"},
{"fileData":[{"fileSize":155938,"fileType":"png","fileName":".png","fileId":"222","owner":""},{"fileSize":190128,"fileType":"png","fileName":".png","fileId":"223","owner":""}],"type":"file"}
仔细观看这2条记录会发现,图片数据项的文本中有前后的注释,文本中黄色斜体的部分才是真正的图片,因此需要批量导出图片有多图片时,需要先获取黄部分,将文本的首 {"fileData":[  13个字符,尾 ],"type":"file"} 16个字符去掉,然后将文本先拆分成多个单图片的文本,然后再导出图片;
  • 多图片批量导出实现思路:通过辅助模板实现将多个表单的图片写入到辅助模板,先首尾多余文本,再拆分成单图片,最后通过导出excel功能将图片批量导出到指定的文件夹。

2.设计辅助模板

新建辅助模板样式如下图,该模板不保存到数据库(在模板属性中勾选不保存表单到数据库,将不占模板数)。
  • 单图片批量导出,辅助模板样式只需要下图中“原图”明细表即可
  • 多图片批量导出,辅助模板样式设计如下,基本信息中“图片文本”保存图片转化为文本的内容,“处理后文本”保存图片文本去头去尾后的文本。“原图”明细表是直接将多个表单的图片数据插入后的结果,“单图”明细表是将原图图片中多个图片拆分为单个图片后的明细,这2个明细表中的“图片”数据项都是“图片”类型。
比如“原图”明细中有2条记录,其中1条记录保存了1张图片,1条记录保存了2张图片,对应“单图”明细应该有3条单个图片的记录。

3.插入原图

实现功能:将多个表单的图片插入到“原图”明细表中。
①在辅助模板中,打开“填表公式”,选中“工具栏按钮单击”事件
②在“工具栏按钮单击”事件下添加按钮“选择表单”,并在该按钮下添加赋值操作“赋值_原图”
③在赋值操作中,调用《商品信息》模板下的数据接口“全局选择_可用商品列表”,该数据接口中包含商品的主图片数据项
④为了让用户手动选择需要批量导出图片的表单,勾选显示对话框和可多选;如果是直接将多有的图片都导出来,可以去掉对话框,默认选择所有数据源数据
⑤对目标表“原图”执行插入操作,插入前删除所有行(列),执行一次选择表单原图明细表中数据清空一次
⑥给原图明细表的图片数据项赋值 数据源.主图片,这里的图片数据项都是 图片类型
实现效果,在工具栏上单击【选择表单】,弹出所有商品列表,选择多选商品确定后,已选中商品的图片插入到“原图”中

4.多图片处理

多图片特殊处理,单图片可直接略过。“原图”明细的记录中可能会存在多图片的情况,针对多图片需要将多图片拆分成单图片,如何处理呢?获取图片的文本,去掉首尾多余文本,再将多图片拆分为单图片。

4.1获取处理后文本

①在“工具栏按钮单击”事件下添加按钮“拆分”和赋值操作“赋值_主表信息”
②由于需要将原图明细中所有的多图片都拆分成单图片,数据源选择“原图”明细表
③给基本信息“图片文本”赋值 数据源.图片,此时将图片强制转化成了文本,
④再给“处理后文本”赋值图片文本去头尾的文本,前面我们分析过,头有13个字符,尾有16个字符都需要去掉,将这些需要去掉的文本可以用“文本替换”函数将其替换成 文本空“”,
先替换头13个字符,表达式为   文本替换( 本表单.图片文本 ,取左子串( 本表单.图片文本 , 13) , "" )
再替换尾16个字符,表单时为  文本替换( 文本替换( 本表单.图片文本 ,取左子串( 本表单.图片文本 , 13) , "" ), 取右子串( 本表单.图片文本 ,16) , "" ),因此这个表达式达到了最终将文本替换的效果,直接赋值给“处理后文本”即可
由于有数据源,数据源中有多少条记录“图片文本”和“处理后文本”则将赋值多少次

4.2拆分文本

“处理后文本”有新的值后,需要将它拆分成多个单图片,比如多图片中有2张图片时,处理后文本如下:
{"fileSize":155938,"fileType":"png","fileName":".png","fileId":"222","owner":""},{"fileSize":190128,"fileType":"png","fileName":".png","fileId":"223","owner":""}
需要使用系统内置的“文本列表”对字符串进行拆分,它可以将字符串根据分割符拆分成多个文本,比如“北京,上海,广东”根据 拆分后就变成了3个文本列表
当“处理后文本”通过分隔符   },,2个字符组合将多图片拆分为单图片,拆分后的文本如下:
{"fileSize":155938,"fileType":"png","fileName":".png","fileId":"222","owner":""
{"fileSize":190128,"fileType":"png","fileName":".png","fileId":"223","owner":""}
很明显第一个图片中缺少了     ,因此当拆分后的文本中包含} 时可以直接赋值,没有包含时则需要再添加 } 字符,
①在值变化事件“处理后文本”下添加赋值操作“赋值_插入单图”。
②在赋值操作中设置数据源,调用“全局.文本列表”,该数据源有3个参数,需要拆分的“字符串”为“本表单.处理后文本”,“分隔符号”为“},”,“是否去重”可不用赋值。
③对目标表明细“单图”执行“插入操作”,当“原图”明细中有多条记录时会执行多“处理后文本”的值变化,此时需要直接插入单图到明细中,不能勾选插入前删除所有的行(列)
④对“单图”明细表的“图片”数据项赋值表达式 IF( 取右子串( 数据源.文本 ,1) = "}" , 数据源.文本 , 数据源.文本 + "}" )    当数据源的文本最后是 时,直接赋值,否则需要在文本后再添加 }

4.3执行效果

执行效果如下图,原图中有2条记录,“处理后文本”会赋值2次并触发2次值变化事件,一共插入3条单图片,当然也可以将“原图”明细中的单个记录进行拆分,可自行尝试。

5.批量导出

在辅助模板设计界面的“公式设置区”,打开“填表公式”,选中“工具栏按钮单击”事件,找到系统内置的“导出excel”工具栏事件,修改公式,设置“保存文件名”可调用模本数据项;为了方便辨识设置勾选图片以独立文件方式保存,并设置图片文件夹名。
使用效果如下,在辅助模板上单击【导出excel】,选择需要导出的表格“单图”点击确定,弹出另存为的文件夹,选择“商品图片”,并将保存类型设置为“excel文件(*.xlsx)”确认保存。
导出excel时,同步将图片批量导出到文件下。
2022-09-21
44 40