libxl库能无需环境依赖实现后台读写xlsx表格,可用于AHK操控浏览器等采集数据后,用libxl库后台把数据整理保存下来。
以下展示libxl库能实现的效果,将下图原始数据表,一键转换成下下图的正式表格。
转换后的效果图
示例链接:
打卡记录转换.ahk
#Include %A_ScriptDir%/../Lib/libxl.ahk SetWorkingDir %A_ScriptDir% SetBatchLines -1 #MaxMem 256 libxl.init(A_ScriptDir "/../Lib/64bit/libxl.dll") ; 初始化加载指定路径的libxl.dll ; 托盘 Gui, Destroy Menu, Tray, NoStandard ;删除自带托盘菜单 Menu, tray, Add, 帮助, gcpy帮助 ; 创建 Menu, tray, Add, 关于, gcpy关于 ; 创建 Menu, tray, Add Menu, tray, Add, 退出, gcpy退出 ; 创建 iii= ( 即将运行,请点击确定。。。。 作者:城西(3300372390) -2021-07-01 ) gui,+OwnDialogs msgbox,% iii ;清空或定义变量 book :="" book2 :="" bzname :="" arr :=[] bcxu :=0 ;表格数量序号 book2:=libxl.new("xlsx") ; 新建工作簿用于保存新文件 loop Files,*.xlsx ; 循环xlsx文件 { arr :=[] ; if A_LoopFileFullPath ~="^\~\$|^打卡记录转换文件_\d{6,}" ; 打卡记录转换文件_ + 6位数字 的过滤 if A_LoopFileFullPath ~="^\~\$|^打卡记录转换文件_" ; 如果是隐藏的备份文件则跳过, 筛选的结果文件也过滤掉 continue bcxu++ ;记录表序号 book :="" book := libxl.Load(A_LoopFileFullPath) sheet :=book.active ; 当前激活表 xlsxlastRow :=sheet.lastRow() xlsxlastCol :=sheet.lastCol() bzname :=sheet.__Item[1,1].Value ; 班主名字 loop,% xlsxlastCol - 2 ;循环获取单元格数据 { y :=A_Index loop,% xlsxlastRow - 1 { x :=A_Index try{ arr[x,y]:=sheet.__Item[x,y+1].Value ; 注意从姓名行列开始 arr[x,y] := RegExReplace(arr[x,y],"_") }catch{ arr[x,y]:="" } } } ;写入新表 newsheet%bcxu% :=book2.Addsheet(bcxu . bzname) ;设置表序号加班组名字为表名 ft1 :=book2.addFormat() ; 居中+边框设置 ft1.setBorder(1) ; 设置边框 ft1.setAlignH(2) ; 设置水平居中 ft1.setAlignV(1) ; 设置竖直居中 xx:=0 yy:=1 nit:=2 ; 坐标序号 niy :=-1 ; 合并坐标序号 xuhao1 :=0 ;写入表头 rs1 :=book2.addRichString() ff1 :=rs1.addFont() ff1.setSize(22) ff1.setBold(1) rs1.addText(bzname " 班组考勤表",ff1) newsheet%bcxu%.__Item[0,0] :=rs1 ; 写入班主名字 ;newsheet%bcxu%.__Item[0,0] :=bzname " 班组考勤表" ;写入班主名字 newsheet%bcxu%.__Item[1,0] := "序号" newsheet%bcxu%.__Item[1,1] := "姓名" newsheet%bcxu%.__Item[1,2] := "午别" loop,31 { nit :=nit + 1 newsheet%bcxu%.__Item[1,nit] := A_Index } newsheet%bcxu%.__Item[1,34] := "合计天数" newsheet%bcxu%.__Item[1,35] := "农民工签字" ; setMerge(rowFirst, rowLast, colFirst, colLast) newsheet%bcxu%.setMerge(0,0,0,35) loop,36 { niy :=niy +1 newsheet%bcxu%.setMerge(1,2,niy,niy) newsheet%bcxu%.SetCellFormat(0,niy,ft1) newsheet%bcxu%.SetCellFormat(1,niy,ft1) newsheet%bcxu%.SetCellFormat(2,niy,ft1) } newsheet%bcxu%.setCol(3,33,3) ; 设置列宽 newsheet%bcxu%.setCol(0,0,5) newsheet%bcxu%.setCol(34,34,9.5) newsheet%bcxu%.setCol(35,35,11) ; 写入数据 loop,% xlsxlastRow - 1 { x :=A_Index xuhao1 :=A_Index xx:=xx+3 loop,% xlsxlastCol - 2 { y :=A_Index if y <> 1 ; 不是名字 则是时间,需正则处理 { swd := RegExMatch(arr[x,y],"^.+\n") ? "√" : "" xwd := RegExMatch(arr[x,y],"\n.+$") ? "√" : "" newsheet%bcxu%.__Item[xx,y+1] :={value:swd,Format:ft1} newsheet%bcxu%.__Item[xx+1,y+1] :={value:xwd,Format:ft1} newsheet%bcxu%.__Item[xx+2,y+1] :={value:"",Format:ft1} } else { newsheet%bcxu%.__Item[xx,0] :=xuhao1 ; 写序号 newsheet%bcxu%.SetCellFormat(xx,0,ft1) newsheet%bcxu%.SetCellFormat(xx+1,0,ft1) newsheet%bcxu%.SetCellFormat(xx+2,0,ft1) newsheet%bcxu%.setMerge(xx,xx+2,0,0) newsheet%bcxu%.__Item[xx,y] :={value:arr[x,y],Format:ft1} ; 写姓名 newsheet%bcxu%.__Item[xx+1,y] :={value:arr[x,y],Format:ft1} newsheet%bcxu%.__Item[xx+2,y] :={value:arr[x,y],Format:ft1} newsheet%bcxu%.setMerge(xx,xx+2,1,1) newsheet%bcxu%.__Item[xx,y+1] :={value:"上午",Format:ft1} ; 写午别 newsheet%bcxu%.__Item[xx+1,y+1] :={value:"下午",Format:ft1} newsheet%bcxu%.__Item[xx+2,y+1] :={value:"加班",Format:ft1} js :=xuhao1 * 3 + 1 ; 写合计天数公式 je :=js+2 fom ==COUNTIF(D%js%:AH%je%,"=√")/2 newsheet%bcxu%.writeFormula(xx,34,fom) newsheet%bcxu%.SetCellFormat(xx,34,ft1) newsheet%bcxu%.SetCellFormat(xx+1,34,ft1) newsheet%bcxu%.SetCellFormat(xx+2,34,ft1) newsheet%bcxu%.setMerge(xx,xx+2,34,34) newsheet%bcxu%.SetCellFormat(xx,35,ft1) ; 农民工签字格式 newsheet%bcxu%.SetCellFormat(xx+1,35,ft1) newsheet%bcxu%.SetCellFormat(xx+2,35,ft1) newsheet%bcxu%.setMerge(xx,xx+2,35,35) } } } } book2.save("打卡记录转换文件_" A_Now ".xlsx") msgbox,完成 exitapp return tltip: if actstate { settimer,tltip,off ToolTip return } tltiptime++ ToolTip,请君骚等。。。%tltiptime% return goclear: loop,5 { GuiControl,,guigjlz%A_Index% GuiControl,,guisxtj%A_Index% } Return GuiEscape: GuiClose: gui,Destroy return gcpy帮助: iii= ( 热键 :F12 关键列设置 :软件自动在表格前10行中找到匹配的列,作为关键列 筛选条件 :在对应关键列中筛选出匹配的行 读取表格设置 :-1>工作簿全部表格,0>工作簿中激活的表,1>工作簿中第一个表 清空 :清空设置的数据 不读取数据筛选 :在执行过一次后,且表格源数据不变的情况选择此项 ) gui,+OwnDialogs msgbox,% iii return gcpy关于: iii= ( 名称:xls xlsx数据筛选工具 作者:城西(3300372390) -2021-3-27 ) gui,+OwnDialogs msgbox,% iii return gcpy退出: exitapp return
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)