本帖最后由 lisaisacat 于 2022-7-13 18:17 编辑
前情提要
有个朋友经常需要打印材料提交申报各种项目,据说经常推着小车去打印店装订。
于是有一天她忽然问我,说有个 Excel,好几千行,是从后台导出的数据,只有两列,但是要打印出来就有一百多页。
看起来很丑不说,还很浪费纸张,就问我有没有什么办法能快速整理下表格变成一页可以打印多列。
其实本来挺简单的,我当时想的就是让她先试试一张可以最多打印几列,然后手动把表格拆分一下不就好了吗。
比如一页横着可以打印 8 列,一共 800 行的话那就把第 201 行到 400 行剪切粘贴到第 3、4 列,以此类推。
然而问题又来了:
1. 有的文件行数太多,还不是 4 的整数,这个问题也不太大
2. 还要保留标题行
3. 有的文件太大了人工操作特别慢,还容易误操作。
因为最近正好在研究 RPA(机器人流程自动化),就写了一个流程给她用,只需要选择自己要拆分的 Excel 文件,自动实现计算、剪切、填写标题行等功能。
图片演示
比如表格原来长这样(演示用文件,随便瞎写的),直接打印是 14 页
打印预览发现横向最多一页打印 6 列,调整之后打印预览为 5 页
开发环境
Win10,Excel,友友编辑器 SDK 1.0.2.14(测试包 https://share.weiyun.com/0dfrllmA)
因为很多人问,这里特别说明:这个 RPA 是免费的!公测阶段注册就是专业版~
运行环境
Win10,Excel
项目压缩包
Excel 一页打印 (1).zip
(38.04 KB, 下载次数: 46)
也可以点击下面的链接下载,因为可以实时更新,肯定是最新版
下载链接:https://console.yoyorpa.com/process_share?id=dXeGgjSA58uBT4WsdBknQclPEBU0Uks8hGQy1H96QEHKJE
使用方法
部分源码
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?>
<root>
<rpa>
<variable key="总行数" type="string" value=""/>
<variable key="第一次剪切结束行号" type="string" value=""/>
<variable key="第二次剪切结束行号" type="string" value=""/>
<variable key="第二次剪切开始行号" type="string" value=""/>
<variable key="第一次剪切开始行号" type="string" value=""/>
<variable key="文件" type="string" value=""/>
<variable key="每次复制行数" type="string" value=""/>
<variable key="拆分后各列行数" type="string" value=""/>
<variable key="拆分后各列行数" type="int" value=""/>
<node id="dialog.openFile1645503914054" type="func" title="选择文件" name="dialog.openFile" out="文件" lineNum="1" displayTitle="选择文件:标题"请选择要处理的Excel文档",文件类型Excel工作簿(xls,csv,xlsx),单选,默认路径"./res",返回文件路径文件">
<param name="title" type="string" text="标题" value=""请选择要处理的 Excel 文档""/>
<param name="type" type="int" text="文件类型" value="1"/>
<param name="count" type="int" text="选择数量" value="0"/>
<param name="path" type="string" text="文件夹" value=""./res""/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<comment id="comment4552517405625">使用方法:给【打开 Excel 文件】选择文件后点击运行</comment>
<container id="openExcel4342694025421" title="打开 Excel 文件" type="excel" typeText="起始单元格" file="文件" fileText="文件" isVisible="1" isVisibleText="前台可见" isAutoSave="1" isAutoSaveText="自动保存" autoRelease="0" autoReleaseText="结束后关闭" saveBeforeClose="1" saveBeforeCloseText="关闭前保存" isCreate="0" isCreateText="新建文件" isReadOnly="0" isReadOnlyText="只读" errorPolicy="0" errorPolicyText="运行失败后" lineNum="3" displayTitle="打开Excel文件:文件">
<comment id="comment7658599390911">注释:计算行数</comment>
<node id="excel.getRowsCount3683750510147" type="func" title="行数" name="excel.getRowsCount" out="总行数" lineNum="5" displayTitle="行数:返回行数总行数">
<param name="sheetName" type="string" text="表名" value=""/>
<param name="column" type="string" text="列" value=""/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node id="log.print1633400319533" type="func" title="输出日志" name="log.info" out="" lineNum="6" displayTitle="输出日志:"总行数:"+总行数">
<param name="message" type="string" text="日志" value=""总行数:"+总行数"/>
</node>
<comment id="comment1654681116565">备注:如果拆成 8 列就输入 4</comment>
<node type="func" id="assign1645502873092" title="赋值" name="assign" out="拆分后各列行数" lineNum="8" displayTitle="赋值:拆分后各列行数=总行数/3">
<expression>总行数/3</expression>
<param name="timeout" type="int" text="超时" value=""/>
<param name="beforeDelay" type="int" text="运行前等待" value=""/>
<param name="afterDelay" type="int" text="运行后等待" value=""/>
<param name="errorPolicy" type="int" text="运行失败后" value="0"/>
</node>
<node id="math.format1645684789821" type="func" title="数字格式转换" name="math.format" out="拆分后各列行数" lineNum="9" displayTitle="数字格式转换:数字拆分后各列行数,数字格式整数,返回文本拆分后各列行数">
<param name="num" type="int" text="转换前数字" value="拆分后各列行数"/>
<param name="type" type="int" text="转换格式" value="0"/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node type="func" id="assign1645503353806" title="赋值" name="assign" out="每次复制行数" lineNum="10" displayTitle="赋值:每次复制行数=拆分后各列行数-1">
<expression>拆分后各列行数-1</expression>
<param name="timeout" type="int" text="超时" value=""/>
<param name="beforeDelay" type="int" text="运行前等待" value=""/>
<param name="afterDelay" type="int" text="运行后等待" value=""/>
<param name="errorPolicy" type="int" text="运行失败后" value="0"/>
</node>
<node id="log.print2060229618238" type="func" title="输出日志" name="log.info" out="" lineNum="11" displayTitle="输出日志:"每次复制行数:"+每次复制行数">
<param name="message" type="string" text="日志" value=""每次复制行数:"+每次复制行数"/>
</node>
<node id="log.print8988539181788" type="func" title="输出日志" name="log.info" out="" lineNum="12" displayTitle="输出日志:"拆分后各列行数:"+拆分后各列行数">
<param name="message" type="string" text="日志" value=""拆分后各列行数:"+拆分后各列行数"/>
</node>
<comment id="comment5830482162269">注释:复制粘贴表头</comment>
<node id="excel.copyRangeContent5995672596518" type="func" title="Excel 复制" name="excel.copyRangeContent" out="" lineNum="14" displayTitle="Excel复制:复制区域,从"A1"到"B1"">
<param name="sheetName" type="string" text="表名" value=""/>
<param name="type" type="int" text="范围" value="2"/>
<param name="startCell" type="string" text="起始单元格" value=""A1""/>
<param name="endCell" type="string" text="结束单元格" value=""B1""/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node id="excel.pasteRangeContent1134041805823" type="func" title="Excel 粘贴" name="excel.pasteRangeContent" out="" lineNum="15" displayTitle="Excel粘贴:单元格"C1"">
<param name="destCell" type="string" text="单元格" value=""C1""/>
<param name="sheetName" type="string" text="表名" value=""/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node id="excel.pasteRangeContent9943228848759" type="func" title="Excel 粘贴" name="excel.pasteRangeContent" out="" lineNum="16" displayTitle="Excel粘贴:单元格"E1"">
<param name="destCell" type="string" text="单元格" value=""E1""/>
<param name="sheetName" type="string" text="表名" value=""/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<comment id="comment9553838639312">注释:复制粘贴数据</comment>
<node type="func" id="assign4872698685127" title="赋值" name="assign" out="第一次剪切开始行号" lineNum="19" displayTitle="赋值:第一次剪切开始行号=拆分后各列行数+2">
<expression>拆分后各列行数+2</expression>
<param name="timeout" type="int" text="超时" value=""/>
<param name="beforeDelay" type="int" text="运行前等待" value=""/>
<param name="afterDelay" type="int" text="运行后等待" value=""/>
<param name="errorPolicy" type="int" text="运行失败后" value="0"/>
</node>
<node type="func" id="assign9178586789959" title="赋值" name="assign" out="第一次剪切结束行号" lineNum="20" displayTitle="赋值:第一次剪切结束行号=第一次剪切开始行号+每次复制行数">
<expression>第一次剪切开始行号+每次复制行数</expression>
<param name="timeout" type="int" text="超时" value=""/>
<param name="beforeDelay" type="int" text="运行前等待" value=""/>
<param name="afterDelay" type="int" text="运行后等待" value=""/>
<param name="errorPolicy" type="int" text="运行失败后" value="0"/>
</node>
<node id="excel.copyRangeContent1402565312902" type="func" title="Excel 复制" name="excel.copyRangeContent" out="" lineNum="21" displayTitle="Excel复制:复制区域,从"A"+第一次剪切开始行号到"B"+第一次剪切结束行号">
<param name="sheetName" type="string" text="表名" value=""/>
<param name="type" type="int" text="范围" value="2"/>
<param name="startCell" type="string" text="起始单元格" value=""A"+第一次剪切开始行号"/>
<param name="endCell" type="string" text="结束单元格" value=""B"+第一次剪切结束行号"/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node id="excel.pasteRangeContent2427778283906" type="func" title="Excel 粘贴" name="excel.pasteRangeContent" out="" lineNum="22" displayTitle="Excel粘贴:单元格"C2"">
<param name="destCell" type="string" text="单元格" value=""C2""/>
<param name="sheetName" type="string" text="表名" value=""/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node id="delay1644919580367" type="func" title="等待" name="delay" out="" lineNum="23" displayTitle="等待:3秒">
<param name="delay" type="int" text="等待秒数" value="3"/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node type="func" id="assign7359161588215" title="赋值" name="assign" out="第二次剪切开始行号" lineNum="24" displayTitle="赋值:第二次剪切开始行号=第一次剪切结束行号+1">
<expression>第一次剪切结束行号+1</expression>
<param name="timeout" type="int" text="超时" value=""/>
<param name="beforeDelay" type="int" text="运行前等待" value=""/>
<param name="afterDelay" type="int" text="运行后等待" value=""/>
<param name="errorPolicy" type="int" text="运行失败后" value="0"/>
</node>
<node type="func" id="assign6850443934763" title="赋值" name="assign" out="第二次剪切结束行号" lineNum="25" displayTitle="赋值:第二次剪切结束行号=第二次剪切开始行号+每次复制行数">
<expression>第二次剪切开始行号+每次复制行数</expression>
<param name="timeout" type="int" text="超时" value=""/>
<param name="beforeDelay" type="int" text="运行前等待" value=""/>
<param name="afterDelay" type="int" text="运行后等待" value=""/>
<param name="errorPolicy" type="int" text="运行失败后" value="0"/>
</node>
<node id="excel.copyRangeContent5531056372204" type="func" title="Excel 复制" name="excel.copyRangeContent" out="" lineNum="26" displayTitle="Excel复制:复制区域,从"A"+第二次剪切开始行号到"B"+第二次剪切结束行号">
<param name="sheetName" type="string" text="表名" value=""/>
<param name="type" type="int" text="范围" value="2"/>
<param name="startCell" type="string" text="起始单元格" value=""A"+第二次剪切开始行号"/>
<param name="endCell" type="string" text="结束单元格" value=""B"+第二次剪切结束行号"/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node id="excel.pasteRangeContent7061692612594" type="func" title="Excel 粘贴" name="excel.pasteRangeContent" out="" lineNum="27" displayTitle="Excel粘贴:单元格"E2"">
<param name="destCell" type="string" text="单元格" value=""E2""/>
<param name="sheetName" type="string" text="表名" value=""/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<node id="delay1644919585473" type="func" title="等待" name="delay" out="" lineNum="28" displayTitle="等待:3秒">
<param name="delay" type="int" text="等待秒数" value="3"/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<comment id="comment2926258301094">注释:清除第一行和第二行内容</comment>
<node id="excel.deleteSelectRange2379560676266" type="func" title="清除 Excel" name="excel.deleteSelectRange" out="" lineNum="34" displayTitle="清除Excel:清除区域,从"A"+第一次剪切开始行号到"B"+总行数的全部">
<param name="startCell" type="string" text="起始单元格" value=""A"+第一次剪切开始行号"/>
<param name="endCell" type="string" text="结束单元格" value=""B"+总行数"/>
<param name="type" type="int" text="范围" value="2"/>
<param name="sheetName" type="string" text="表名" value=""/>
<param name="optFlag" type="string" text="清除" value="1"/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
<comment id="comment5338394134799">注释:处理列宽</comment>
<node id="excel.setColumnWidth1645502592842" type="func" title="设置列宽" name="excel.setColumnWidth" out="" lineNum="36" displayTitle="设置列宽:范围:所有列,宽度根据内容自适应">
<param name="sheetName" type="string" text="表名" value=""/>
<param name="scope" type="int" text="范围" value="3"/>
<param name="type" type="int" text="宽度" value="0"/>
<param name="timeout" type="int" value="" text="超时"/>
<param name="beforeDelay" type="int" value="" text="运行前等待"/>
<param name="afterDelay" type="int" value="" text="运行后等待"/>
<param name="errorPolicy" type="int" value="0" text="运行失败后"/>
</node>
</container>
</rpa> |