(已解决) 复制 Excel 模板区域到指定位置
大佬们,我碰到这么一个操作 Excel 的需求,需要把工作表中设定好的模板区域填好对应的数值后,复制粘贴到指定工作表中的指定位置,有多个结果,模板区域粘贴后需纵向排列。如下所示:
Excel 中的模板是这样的:
要得到的结果是这样的,在同一个工作表中纵向排列:
类似的需求在论坛中有不少例子,搜索“卡片”就会出来很多例子,比如以下链接:
5.5 纵向拆分 - 一行生成一张卡片
但这个需求是把模板保存为了一个工作簿。我翻遍了论坛,并没有发现把模板格式复制粘贴到工作表中的某个位置的例子。
之前也求助过一个类似的例子,把模板以工作表的方式添加,SPL 帮忙提供了 xlmove 函数用于移动复制工作表,链接在此: (已解决) 把 Excel 格式化模板以工作表方式添加
我重新翻阅了 SPL 操作 excel 的相关的函数,好像没有把带格式的模板区域复制粘贴到指定位置的操作。此处所指的复制模板格式区域,粘贴后需保留源列宽和行高,也就是粘贴后不能变形。在 VBA 中,复制粘贴模板格式,有一个对应的 xlPasteColumnWidth,可以保留源列宽,至于行高也可以设置成源的行高,VBA 中的代码如下:
我想求助的是,SPL 在操作 excel 时是否也能复制一个带格式的区域到指定的位置,粘贴后保持与源格式一致,保持同样的列宽和行高。恳请大佬们得闲时给予帮助🙏
附上 Excel 文件,里边的 VBA 代码可以放心执行,运行后会在结果表中得到一个跟模板一致的区域。附件如下:
VBAxlsmzip
SPL 主要处理数据,不处理格式。不然要引入整个表格对象,这太复杂了。而且外观属性用代码编辑并不方便,很不直观。
这种格式性的东西用报表(ReportLite) 很容易做出来 如何用明细数据批量制作卡片
再用 SPL 调用它自动定时算出报表生成 xls 就行了 使用 ReportLite 外部库生成有格式报表
懂了,谢谢老贼回复🙏
确实如此,这种需求用 ReportLite 最合适不过了。
就用 VBA 解决先,我再学习一下 ReportLite 怎么玩😄
用 ReportLite 解决这种卡片报表确实方便,真香👍 👍 ,哈哈。
“用以致学”,周末按照官网的教程学了一下,瞬间觉得 VBA 不香了 (代码又长又绕)😄
结果如下:
我有几个问题不懂,确实鼓捣不出来了,恳请大佬们得闲时给予帮助指点:
1、我们观察报表头部的序号 1 号,2 号,当前数据源中是没有这个序号的,我是人为加了一列这个序号,用”ds. 序号“得到这个值,可以在附件的脚本中看到。我想问的是,有没有一个隐藏的序号可以用在此处,不需要计算得到这个索引序号?
2、再观察报表下半部分帮扶次数那里的记录,我特地留出来两行空格,目的是为了保持记录行数在一个固定的数量,比如 5 行。本例比较特殊,都是帮扶 3 次,因此,报表看上去都是 5 行记录。如果某些个人的帮扶次数是 4 次或者 5 次,那报表向下扩展的时候,行数会自动变成 6 行或者 7 行。如果我想维持这个总行数在固定数,要如何设置?意思就是,不管个人的帮扶次数是多少次,希望报表下半部分的总行数一直是某个固定的行数,比如 5 行(前提是知道帮扶最多次数不会超过 5 次 ),如下所示,有 5 行数据,因为故意多设置了两行,所以扩展后变成 7 行,此时,我想只保留 5 行,后面的两行空行可不可以见机自动舍弃?
3、设置数据集的时候,我用的是来自集算器,集算器里写的 filename@psd() 不能被 ReportLite 识别,如下所示:
当前 A3 用的是 A2 路径,ReportLite 能出结果,如果把 A3 中的路径换成 A1,就会报错:
4、在桌面版集算器配合 ReportLite 使用时,最后一步 export 时,2 参的相对路径我一直搞不懂,在 Win 桌面版里,如图所示的写法,文件会输出到集算器的安装目录下,也就是在 esProcDesk 文件夹下:
但同样的脚本在 Mac 版本集算器里输出时,就报错了,说是路径有问题:
5、输出的 docx 和 pdf 能控制分页吗?(这点请忽略🙏 可以在报表属性里设置页面方向😂 )
6、上图中 A3 这一句”>reportlite_config(“config/raqsoftConfig.xml”)“这样的写法是通用写法吗?这一句注释掉也可以,当前情况不影响运行和输出。
因为 reportlite 刚学不久,有些方面还不熟练,如果上述几点是我操作失误,还望大佬们包涵并给予指导帮助🙏
附上所有文件 (4 个):
zip
1:序号问题,那里直接用 =“失业人员 (”+&B2+“) 号”, 直接用 &B2 就行,这个表示这个格子跟随 B2 扩展时扩展出的第几个,也就是你这里的序号了
2:在那个 select 下边的单元格里写个 =to(1,5-ds.count()),这样这块会根据上边数据集的条数自动扩展,ds.count()是取条数,比如有 3 条,那么这块相减就是 2,会扩展 2 行,然后右侧属性栏中有个可视属性,那个复选框去掉,这样就实现了补空行效果。有一点要注意,你数据集条数最高为 5,如果正好为 5 时,那么这个格子就是 to(1,0), 也会扩展出两个空行,在这个格子右侧属性栏中的隐藏行表达式中写个 ds.count()==5, 这个就表示条数为 5 时,隐藏行条件成立,就隐藏了。 实际上按照你原来加两个空行方式,再结合隐藏行表达式也行,就是判断下条数的事。
5:导出时能分页,report_export 时加上对应的参数就行,可以看下这个:
也可以看下对应文档
6:raqsoftConfig.xml 这个,这个是设置配置文件的,如果直接在集算器下执行,这个 config/raqsoftConfig.xml 就是集算器安装目录下的文件,所以注释掉应该也没问题,会自动去找,但是将来有可能通过其他程序调用,比如 java 程序执行,或者 raqsoftCofnig.xml 可能会增加一些特殊配置,不想和集算器自带的冲突的话,那么有可能就重命名一个新的,这时就需要写这句了。
另外两个问题需要测试下再回复了。
问题 3:A3 中 file 函数加个 @s, 这个获取当前寻址路径的,也就是设置里那个路径,默认设置就是那个 demo 目录,如果是上一层,那么 A2 里改成 ./ReportData.xlsx
感谢大佬指导🙏 🙏
1、果然是 &B2,我昨天试了 &B2,一直没整出来这个序号,可能是当时数据集哪里有问题。刚刚测试了,完美解决;
2、这个我学习一下。
5、分页这个请忽略,我在报表属性里找到了打印设置。
其他那个相对路径问题,感觉跟集算器里不一样,恳请大佬得闲时帮忙测试一下附件。极有可能是我懵圈了没整明白。
第四个这个,身边暂时没有mac电脑,还不太好测试,可以先用filename@p 那种方式获取个路径,然后再拼接下,看下这样是否可以。
谢谢大佬,Mac 的先不管了。还有以下 3 个问题恳请大佬再看看,指导一下:
1、ReportData.splx 这个集算器文件里的路径,观察以下截图中的,A1,A2,A3 的写法,其中写成 A1 和 A2 的方式,ReportLite 里均能刷出结果,但写成 A3 的方式,报表里刷不出结果,说是找不到文件。照理 A3 中 filename@psd() 是返回当前 splx 脚本所在的路径,跟其余两个返回结果是一样的。
2、当前做报表是用集算器处理了一下原始数据,把原本为空的姓名都填上了。可不可以用附件中的 xlsx 格式直接做出来?报表里是不是不能用 group@i() 这样的分组?
3、你提到的隐藏多余空行的两种方法,第一种 to() 已经实践成功了,后一种判断行数条件表达式,这个要怎么写,可否麻烦大佬再唠细一点🙏 😄
1:可以用 output 函数将那个 A3 的值输出下,比如写成 >output(A3), 然后在 reportlite 左侧控制台看下这个输出结果是什么
2:报表里没有 group@i, 如果 excel 有空数据,建议还是用你现在的方式在 splx 里补齐,报表里 group 都是按字段分组,有空那就合并错了
3:补空行这个,建议用 to 方式,简单些。 当时说的第二种是这样,在下边放 4 个空行,然后在每个空行里写个隐藏行表达式,比如第 4 个里编写 ds.count()>2, 表示条数大于 2 的时候隐藏,也就是两条数据,加这四个空行,那么就是 6 行了,所以第 4 个空行隐藏,然后第三个就是 ds.count()>3 这种,这么做太费事了,如果说你的数据至少有 3 条的话,加两个空行,这么做和 to 差不多,但是如果不确定几条,就费事了
报错信息是这个:
ERROR StatusLogger Log4j2 could not find a logging implementation.
Please add log4j-core to the classpath. Using SimpleLogger to log to the console…
这个错误是找 log4 的 jar 包,报表里现在应该不用这个。奇怪为啥报这个错。
除了这个之外,还有其他报表信息不?或者脚本里那个 xls 文件用其他几个路径,报表正常展现时是否还有这个错
在集算器里第一次运行时,也会有这一句 ERROR 出来, 但不影响 ReportLite 出结果。
唯独写成 filename@psd() 这样的时候,ReportLite 就识别不了这个路径了。
加 output 输出后,在 reportlite 里预览报表,然后在左侧控制台能看到这个输出,看看输出的路径是什么。看下这块和实际放的文件位置是否一致
这样的。我尝试了其他写法都可以,filename@psd() 这样就不行
直接用filename@p 试下,不用sd
其他写法都可以。就 filename@psd() 不行。
filename@psd() 获取不到路径的问题已修复,请更新 reportlite.jar。
问题解决了🙏 🙏
感谢 @老贼大神指引方向;
感谢 @gxy 大佬的耐心指导,胜过我自己琢磨一个月;
感谢 @leavedy 和 @SmilingAngel 两位大佬的帮助。
太强了,SPL+ReportLite 简直就是绝世神器,倚天屠龙👍 👍