找回密码
 立即注册

QQ登录

只需一步,快速开始

xcymoo
葡萄城公司职员   /  发表于:2023-9-13 15:24  /   查看:926  /  回复:0
本帖最后由 xcymoo 于 2023-10-8 11:51 编辑

在一些应用场景中,会有类似于这种横向排版的需求:
image.png526511229.png
                              
最终这个界面需要用A4纸张打印出来,并沿虚线剪开,分发给不同的对象。
我将这种类型的需求称为“三联”类型,这种三联需求的关键点在于以下几点:
1. 部分单元格需要同时绑定多个字段,并将其组合为一段文字,如A3、J5等。
2. 其中一联的部分内容的高度是可变的,比方说上面例子中,第二、三联中间的那一段话的长度是不确定的,因此它所占据的单元格行数也是不确定的。

先来看一下最终的实现效果吧:
[mp4]https://videos.grapecity.com.cn/SpreadJS/online/demos/horizontal-layout.mp4[/mp4]

下面简单讲一下这两个难点如何实现。
1. 如何在同一个单元格绑定多个字段,并将其组合为一段文字
这个案例中,这种单元格共有两种,我分别用黄色和蓝色的背景色标示,它们都绑定了多个字段,比如说黄色单元格,绑定了年月日、子女姓名、学校名等多个字段。
image.png493035888.png
由于设计器界面提供的数据绑定只能在一个单元格绑定一个字段,如果想绑定一个对象,则必须用代码设置。
image.png435088500.png
同时,使用自定义单元格来实现文本的拼接:
image.png188555297.png
类似的需求,可以查看实战代码库的demo:https://docs.grapecity.com.cn/spreadjs/practice/data-binding/cell-binding-object
2. 第二、三联中,可变高度的单元格,变化高度后,如何做到不影响第一联?
这里的思路不是插入新的行,而是将第三联下方的单元格向下移动,于是这里便需要做两件事,第一,记录需要向下移动的区域;第二,计算要向下移动几行。
关于第一点,可以选中区域,并使用上方的按钮来设置需要向下移动的区域,将其记录在tag中:
image.png101815489.png
代码如下:
image.png535786437.png
而第二点,则稍微有点麻烦,因为真实的文本需要几行单元格展示,不仅和文字的长度有关,还与单元格的宽度(考虑到单元格是合并的,这里需要分开计算并相加)、字体的大小都有关系:
image.png555182799.png
计算文本长度时,使用canvas的measureText方法即可,需要将canvas的字体设置为和表单中一致,文本存在自定义单元格的实例中,直接获取即可。
image.png901145019.png
最后,使用计算出来的diff,扩大单元格合并的范围,并向下移动对应行数即可:
image.png253088988.png
这里要先移除合并单元格,再重新添加一次。
至此,核心的功能就完成了。
最后,针对此Demo,还要做一个说明:我们无需在每次填报时都设置单元格类型、需移动区域,因为这些信息都存储在模板sheet的tag中了,填报时只需要加载模板,载入数据源后执行固定的换行逻辑即可。


三联-入学通知.zip

40.11 KB, 下载次数: 18

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部