【实战】OCR识别数据后自动填单

;制作销售单自动录入Excel表格
#Include <正则全局模式>

Home::
Send, ^a
Send, ^c
Ysj = % clipboard  ;这是复制的原始数据
hs=          ;用来确定录入了多少行
Danhao=
Riqi=
; name1=
; amt1=
; MsgBox % Ysj
;---------------获取单号与日期---------------------------
正则1=
(`%
m)(*ANYCRLF)(?<!\d)000\d{4}(?!\d)
)
正则2=
(`%
m)(*ANYCRLF)(?<!\d)\d{2,4}年\d{1,2}月\d{1,2}日(?!\d)
)
返回值:=GlobalRegExMatch(Ysj, 正则1, 起点:=1)
for k,v in 返回值
  Danhao = % v.Value[0]
DayV:=GlobalRegExMatch(Ysj, 正则2, 起点:=1)
for k,v in DayV
  Riqi = % v.Value[0]

;-------获取产品名称---转化产品名称为编号----------- 
正则=
(`%
m)(*ANYCRLF)(?<=[·`]).{1,10}(?=[·`])
)
Sname=
;创建一个关联数组,用于替换编号方式
Nbian := {"绿":"LV", "普":"PU"
, "大":"DA", "铁":"TE", "单":"DN", "酒":"JU"}
; msgbox % Nbian.绿
for k,v in GlobalRegExMatch(Ysj, 正则, 起点:=1)
{
	Index_01 = % A_index
	name%A_index% = % v.Value[0]
	for k2, v2 in Nbian
		If InStr(v.Value[0], k2){
		Sname := StrReplace(v.value[0], k2, v2)
		; msgbox % Sname
		name%Index_01% = % Sname
		}
		hs = % A_index
}
; msgbox % name1
;----------获取产品数量----------------------
正则=
(`%
m)(*ANYCRLF)(?<=s)\d[.\d]*
)
返回值:=GlobalRegExMatch(Ysj, 正则, 起点:=1)
for k,v in 返回值
	{
	amt%A_index%= % v.Value[0]
	}
; msgbox % num2
;----------获取产品价格(总价)----------------------

正则=
(`%
m)(*ANYCRLF)(?<!\d)(?<!s)\d{1,4}\.\d{2}
)
返回值:=GlobalRegExMatch(Ysj, 正则, 起点:=1)
heji=
for k,v in 返回值
	{
	price%A_index%= % v.Value[0]
	heji += price%A_index%
	}
; msgbox % price2
;----------获取客户姓名----------------------
#Include customerinfo.ahk        ;将客户姓名放在另一个文件里面
kehuG=                   ;将所有客户名字集合在一个字符串里面,用于判断
For k, v in KehuNamegroup
	kehuG .= k . "=" . v . "`n"
;------接下来从原数据中获取姓名,跟kehuG进行比对筛选------
正则=
(`%
m)(*ANYCRLF)(?<=\[-)[一-龟]{2,4}
)
返回值:=GlobalRegExMatch(Ysj, 正则, 起点:=1)
for k,v in 返回值
	{
	kehu%A_index%= % v.Value[0]
		If !(InStr(kehuG, v.Value[0]))  
		;如果源数据中的两三个字没有在数据库里面,那就删掉它
			kehu%A_index%=
	}
; ToolTip, 读取完成
; sleep 500
; ToolTip
heji2 = % Format("{:.2f}", heji)     ;改为小数点后两位
tanchu= % "合计:" . heji2 . "元"
msgbox, , 总数, %tanchu%, 1
Return

;---------------输出端口----------------------
; ---------各个按键不同输出端口-----------------
Insert::
PostMessage, 0x0050, 0, 0x4090409,, A       ;切换为英文输入法
Loop %hs%
{
SendInput % Riqi
Send, {tab}
;错误提示----输入法如果没有调整为英文,就很容易出错---
SendInput % name%A_index%
; msgbox % name%A_index%
; KeyWait, F1, D
Send, {tab}
SendInput % amt%A_index%
Send, {tab 2}
SendInput % Danhao
Send, {tab}
SendInput % price%A_index% / amt%A_index%
Send, {tab}
SendInput % price%A_index%
Send, {tab}
SendInput % kehu%A_index%
Send, {tab}
SendInput, 林新腾
Send, {enter}
}
sleep, 500
Send, #{Space}
Return






;---------附加几个快捷键---------------
#IfWinActive ahk_exe PandaOCR.exe
:*:fw::芙蓉王
:*:hz::合中
:*:cz::林长治
:*:1q::pu
~w & f::SendInput, `[-
:*:ls::零售客户
:*:ll::林立
:*:cs::茶试
:*:syd::宋衍东
#If

今天我给大家带来最近我的新作,自动录入我的手动销售单,我的销售单是长这样子的:

【实战】OCR识别数据后自动填单

识别出来的数据长这样:

销售单№0004934单位:
5月27日4022年第页编号编码名 称单位数量单价金额备注1盘22盒1100.0发浩2姜13龙珠斤12230照陈哲第一联3440230硬01包10125.00朱孙磊4440230硬双喜包115.00(存根)5678第二联 (入账)9101112合计人民币(大写):
拾72壹佰柒拾司元②川②1¥470.-会计:
出纳:
字腾复核:
事正乐

接着制定自己的规则,我用“·”来标记产品名称,用“s”标记数量, 用‘[-’标记客户,再用f分割一下简单人工处理一下,就变成了:

销售单№0004934单位:
5月27日4022年第页编号编码名 称单位数量单价金额备注1`绿22`盒s1fff100.0fffw[-发浩ff2姜`pu139`龙珠斤1s2fff230.00照陈哲第一联3`440230`硬01包s10fffw125.00fffw[-林新展4`440230`硬双喜包s1fff15.00(存根)56w[-林新蔚78第二联 (入账)9101112合计人民币(大写):

接着上代码:

;类似于将阿墘进货单自动录入excel表格一样
;制作销售单自动录入Excel表格
#Include <正则全局模式>

Home::
Send, ^a
Send, ^c
Ysj = % clipboard  ;这是复制的原始数据
hs=          ;用来确定录入了多少行
Danhao=
Riqi=
; name1=
; amt1=
; MsgBox % Ysj
;---------------获取单号与日期---------------------------
正则1=
(`%
m)(*ANYCRLF)(?<!\d)000\d{4}(?!\d)
)
正则2=
(`%
m)(*ANYCRLF)(?<!\d)\d{2,4}年\d{1,2}月\d{1,2}日(?!\d)
)
返回值:=GlobalRegExMatch(Ysj, 正则1, 起点:=1)
for k,v in 返回值
  Danhao = % v.Value[0]
DayV:=GlobalRegExMatch(Ysj, 正则2, 起点:=1)
for k,v in DayV
  Riqi = % v.Value[0]

;-------获取产品名称---转化产品名称为编号----------- 
正则=
(`%
m)(*ANYCRLF)(?<=[·`]).{1,10}(?=[·`])
)
Sname=
;创建一个关联数组,用于替换编号方式
Nbian := {"绿":"LV", "普":"PU"
, "大":"DA", "铁":"TE", "单":"DN", "酒":"JU"}
; msgbox % Nbian.绿
for k,v in GlobalRegExMatch(Ysj, 正则, 起点:=1)
{
	Index_01 = % A_index
	name%A_index% = % v.Value[0]
	for k2, v2 in Nbian
		If InStr(v.Value[0], k2){
		Sname := StrReplace(v.value[0], k2, v2)
		; msgbox % Sname
		name%Index_01% = % Sname
		}
		hs = % A_index
}
; msgbox % name1
;----------获取产品数量----------------------
正则=
(`%
m)(*ANYCRLF)(?<=s)\d[.\d]*
)
返回值:=GlobalRegExMatch(Ysj, 正则, 起点:=1)
for k,v in 返回值
	{
	amt%A_index%= % v.Value[0]
	}
; msgbox % num2
;----------获取产品价格(总价)----------------------

正则=
(`%
m)(*ANYCRLF)(?<!\d)(?<!s)\d{1,4}\.\d{2}
)
返回值:=GlobalRegExMatch(Ysj, 正则, 起点:=1)
heji=
for k,v in 返回值
	{
	price%A_index%= % v.Value[0]
	heji += price%A_index%
	}
; msgbox % price2
;----------获取客户姓名----------------------
#Include customerinfo.ahk
kehuG=                   ;将所有客户名字集合在一个字符串里面,用于判断
For k, v in KehuNamegroup
	kehuG .= k . "=" . v . "`n"
;------接下来从原数据中获取姓名,跟kehuG进行比对筛选------
正则=
(`%
m)(*ANYCRLF)(?<=\[-)[一-龟]{2,4}
)
返回值:=GlobalRegExMatch(Ysj, 正则, 起点:=1)
for k,v in 返回值
	{
	kehu%A_index%= % v.Value[0]
		If !(InStr(kehuG, v.Value[0]))  
		;如果源数据中的两三个字没有在数据库里面,那就删掉它
			kehu%A_index%=
	}
; ToolTip, 读取完成
; sleep 500
; ToolTip
heji2 = % Format("{:.2f}", heji)     ;改为小数点后两位
tanchu= % "合计:" . heji2 . "元"
msgbox, , 总数, %tanchu%, 1
Return

;---------------输出端口----------------------
; ---------各个按键不同输出端口-----------------
Insert::
PostMessage, 0x0050, 0, 0x4090409,, A       ;切换为英文输入法
Loop %hs%
{
SendInput % Riqi
Send, {tab}
;错误提示----输入法如果没有调整为英文,就很容易出错---
SendInput % name%A_index%
; msgbox % name%A_index%
; KeyWait, F1, D
Send, {tab}
SendInput % amt%A_index%
Send, {tab 2}
SendInput % Danhao
Send, {tab}
SendInput % price%A_index% / amt%A_index%
Send, {tab}
SendInput % price%A_index%
Send, {tab}
SendInput % kehu%A_index%
Send, {tab}
SendInput, 林新腾
Send, {enter}
}
sleep, 500
Send, #{Space}
Return






;---------附加几个快捷键---------------
#IfWinActive ahk_exe PandaOCR.exe
:*:fw::芙蓉王
:*:hz::合中
:*:cz::林长治
:*:1q::pu
~w & f::SendInput, `[-
:*:ls::零售客户
:*:ll::林立
:*:cs::茶试
:*:syd::宋衍东
#If
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA捐赠
共{{data.count}}人
人已捐赠
案例

把window运行框为我所用(字符串计算器,翻译,解码,打开应用等)

2022-6-17 19:45:47

案例

用AHK做一个简单的调节声音快捷键。

2022-6-26 7:47:21

8 条回复 A文章作者 M管理员
  1. hexuren

    很不错的开发案例,还有很多优化的空间

    • 月下马

      ?谢谢河大佬提点!可能还要等学多几个月,才能回来优化了哈哈!

  2. hexuren
    1河许人给您捐赠了¥2
  3. tony5768

    学习,积分

  4. 云上的星

    学习,膜拜大佬

  5. user15820

    积分不够评论来凑!

  6. usnake

    什么ocr识别能力这么强

个人中心
购物车
优惠劵
有新私信 私信列表
搜索