背景: 深增值税开票软件在填入发票的明细时(2016年),没有从exce导入的功能,只能手工一个一个输入,对于明细清单数量多的情况,给财务人员带来过多的工作量。所以考虑做一个辅助输入工具。减轻财务的工作量,降低手工输入的出错率。

思路如下: 发票清单 Excel 格式如下, 因为开票的清单来自于销售的出货清单,都是excel格式(从sap导出的),处理起来很方便,所以也延续用Excel格式。

软件功能需要,实现将上面的清单,自动填入到,深增开软件的 清单填开 表格内。 实现原理也很简单,用程序来模拟手工输入过程,控制光标移动。 同一客户,可以连续打印发票。

选好 excel文件,然后层入。看以下效果图:

完整代码如下。用了pywin32 来操作窗口,完成光标移动,数据输入。

#!/usr/bin/python
# -*- coding: gbk -*-# KaiPiaoHaoPengYou.py
#
# Copyright (C) 2016 - xulong <fangkailove@yeah.net>
#import sys
from ctypes import *
import time
import win32con
import win32api
import win32ui
import wx
import xlrd
import win32gui
import sys
wildcard = "Excel (*.xls)|*.xls"class MainFrame(wx.Frame):def __init__(self,*agrs,**kw):wx.Frame.__init__(self,size=(480,200),*agrs,**kw)l1=wx.StaticText(self,-1,u"提示:请先启动开票软件,并确定打开了'清单填开' 窗口!!!",(30,100))l1.SetForegroundColour("Red")self.t1=wx.TextCtrl(self,-1,"",(30,50),size=(200,-1))b1=wx.Button(self,-1,u"选择清单文件(EXCEL)",(230,50))self.Bind(wx.EVT_BUTTON,self.b1Click,b1)b2=wx.Button(self,-1,u"开始填写",(370,50))self.Bind(wx.EVT_BUTTON,self.b2Click,b2)def b1Click(self,evt):text = self.t1.GetValue()dlg = wx.FileDialog(self,message=u"选择清单Excel文件",defaultFile=text , wildcard=wildcard,style=wx.FD_OPEN |wx.FD_CHANGE_DIR)if dlg.ShowModal() == wx.ID_OK:text = dlg.GetPath()self.t1.SetValue(text)dlg.Destroy()def b2Click(self,evt):self.parsexsl(self.t1.GetValue())def parsexsl(self,filename):book = Nonetry:book=xlrd.open_workbook(filename)except IOError as e:pass;#print ("数据提示:")if book == None :wx.MessageBox(message=u"Excel文件不能正常读,确认格式,文件名有误!!",caption=u"提示",parent=self)returnsheet1 = book.sheet_by_index(0)#清单行数nrows = sheet1.nrows#清单列数ncols = sheet1.ncolsfor rownum in range(1,nrows):#print ('row',rownum )#print ("行:",rownum + 1,"  ",rowline,"\r")if "%s"%sheet1.cell(rownum,0).value == '---':message = u"遇到换票标识行(---),需要换票,请检查当前发票无误后,重新填写新发票回到'清单填开'界面,点[确定]后继续\r" dlg = wx.MessageDialog(self, message, u"提2示", wx.OK|wx.STAY_ON_TOP)dlg.ShowModal()continuef=Nonetry:f=win32ui.FindWindow(None,"清单填开")except win32ui.error  as e:wx.MessageBox(message=u"提示:请先启动开票软件,并确定打开了'清单填开' 窗口",caption=u"提示",parent=self)return#取开票软件的窗口类名,此开票软件的类名后辍部分会随机的变化。故需动态取后辍,后续用其拼接其它子窗口的类名。cln=win32gui.GetClassName(f.GetSafeHwnd())prex=cln[29:]#print (prex)#get main window handle.win=win32ui.FindWindow("WindowsForms10.Window.8.app.0"+prex,u"清单填开")#get second level window handlewin2=win32ui.FindWindowEx(win,None,"WindowsForms10.Window.8.app.0"+prex,u"清单填开")#get grid's parent windowwin3=win32ui.FindWindowEx(win2,None,"WindowsForms10.Window.8.app.0"+prex,"")#get grid's handlegrid=win32ui.FindWindowEx(win3,None,"WindowsForms10.Window.8.app.0"+prex,"")print 'grid:%x,win3:%x'%(grid.GetSafeHwnd(),win3.GetSafeHwnd())#fill one line of  grid  #move the cursor back to firt cell ,using allow left key grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_LEFT, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_LEFT, 0)#first columngrid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_F2, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_F2, 0)cp1=win32ui.FindWindowEx(grid,None,"WindowsForms10.Window.8.app.0"+prex,"")tb=win32ui.FindWindowEx(cp1,None,"WindowsForms10.EDIT.app.0"+prex,None)print 'tb:%x,cpl:%x'%(tb.GetSafeHwnd(),cp1.GetSafeHwnd())tb.SendMessage(win32con.WM_SETTEXT,sheet1.cell(rownum,0).value.encode('gbk','ignore'))#tb.SendMessage(win32con.WM_SETTEXT,'测试1')#print (sheet1.cell(rownum,0).value)#second  grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_F2, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_F2, 0)print 'grid:%x,cpl:%x'%(grid.GetSafeHwnd(),cp1.GetSafeHwnd())cp2=win32ui.FindWindowEx(grid,cp1,"WindowsForms10.Window.8.app.0"+prex,"")print '2'tb2=win32ui.FindWindowEx(cp2,None,"WindowsForms10.EDIT.app.0"+prex,None)#tb2.SendMessage(win32con.WM_SETTEXT,'测试2')value = sheet1.cell(rownum,1).value.encode('gbk','ignore')if value.endswith(".0"):value = value[:-2]if value.endswith(".00"):value = value[:-3]tb2.SendMessage(win32con.WM_SETTEXT,value)#print (sheet1.cell(rownum,1).value)#3thgrid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_F2, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_F2, 0)cp2=win32ui.FindWindowEx(grid,cp1,"WindowsForms10.Window.8.app.0"+prex,"")tb2=win32ui.FindWindowEx(cp2,None,"WindowsForms10.EDIT.app.0"+prex,None)#tb2.SendMessage(win32con.WM_SETTEXT,'测试3')tb2.SendMessage(win32con.WM_SETTEXT,sheet1.cell(rownum,2).value.encode('gbk','ignore'))#print (sheet1.cell(rownum,2).value)#4thgrid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_F2, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_F2, 0)cp2=win32ui.FindWindowEx(grid,cp1,"WindowsForms10.Window.8.app.0"+prex,"")tb2=win32ui.FindWindowEx(cp2,None,"WindowsForms10.EDIT.app.0"+prex,None)#tb2.SendMessage(win32con.WM_SETTEXT,'4')value = str(sheet1.cell(rownum,3).value).encode('gbk','ignore')if value.endswith(".0"):value = value[:-2]if value.endswith(".00"):value = value[:-3]tb2.SendMessage(win32con.WM_SETTEXT,value)#print (sheet1.cell(rownum,3).value)#5thgrid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_F2, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_F2, 0)cp2=win32ui.FindWindowEx(grid,cp1,"WindowsForms10.Window.8.app.0"+prex,"")tb2=win32ui.FindWindowEx(cp2,None,"WindowsForms10.EDIT.app.0"+prex,None)#tb2.SendMessage(win32con.WM_SETTEXT,'5')tb2.SendMessage(win32con.WM_SETTEXT,str(sheet1.cell(rownum,4).value).encode('gbk','ignore'))#print (sheet1.cell(rownum,4).value)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYDOWN, win32con.VK_TAB, 0)grid.SendMessage(win32con.WM_KEYUP, win32con.VK_TAB, 0)#fill one line of  grid  #move the cursor to next line . using RETURN keyif rownum < ( nrows -1 ):win32api.Sleep(3)grid.PostMessage(win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)grid.PostMessage(win32con.WM_KEYUP, win32con.VK_RETURN, 0)win32api.Sleep(3)class MyApp(wx.App):passif __name__ == '__main__':app=MyApp()frame=MainFrame(None,title=u"开票助手")frame.Show(True)app.MainLoop()

python 通过直接操控窗口实现开票软件的快速辅助输入工具。相关推荐

  1. 抖音短视频发布软件 短视频辅助发布工具

    抖音短视频自动发布软件是一款功能强大.专业性高.易于使用的软件,可以在抖音平台上实现自动发布.批量发布.定时发布等功能,从而提高曝光率和用户关注度,节省大量的人工和成本. 一.多账号发布管理 抖音短视 ...

  2. 百旺智能编码_【百旺】票字版开票软件操作指南已为您备好,请查阅!

    为确保小规模纳税人继续享受税收优惠政策,请广大用户及时对开票软件进行升级~ 按照国家税务总局要求,从增值税发票税控开票软件五月补丁开始,将停止对增值税发票税控开票软件(税控盘版)"税&quo ...

  3. 【Python】利用滑动窗口计算全基因组每个窗口上CNV的拷贝数和Vst

    目录 Vst介绍 计算每个窗口的绝对拷贝数 1.文件准备 2.编写脚本 计算每个窗口的Vst Vst介绍 Vst是通过计算拷贝数的方差来衡量不同群体之间CNV的分化的一个指标,类似于Fst的概念,可以 ...

  4. Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行报错vtkmodules.all、pydicom.encoders.pylibjpeg等错误

    ** Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行时报vtkmodules.all.pydicom.encoders.pylibjpeg.No modul ...

  5. Python GUI之tkinter窗口视窗教程大集合

    Python GUI之tkinter窗口视窗教程大集合 一.前言 二.Tkinter是什么 三.Tkinter 控件详细介绍 1. Tkinter 模块元素简要说明 2. 常用窗口部件及简要说明: 四 ...

  6. python中tkinter模块窗口操作_Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)...

    本篇博文搬到个人博客:[洪卫の博客](https://sunhwee.com)上面去了,想要获得最佳阅读体验,欢迎前往 [https://sunhwee.com](洪卫の博客), 建议用电脑查看教程文 ...

  7. 软件升级|增值税发票税控开票软件(税控盘版)新增改进功能说明(版本号:V2.0.51_ZS_20221031)

    增值税发票税控开票软件 (税控盘版) 新增改进功能说明 (版本号:V2.0.51_ZS_20221031) 2022-10 目录 第1章 概述 1.1 新增改进功能 1.1.1 发票管理功能 1.1. ...

  8. Mac窗口置顶软件Afloat

    2019独角兽企业重金招聘Python工程师标准>>> 原以为找一个Mac里面的窗口置顶软件很简单,没想到折腾了一两个小时,累煞我也! 我找到的软件为Afloat,提供的功能如下: ...

  9. python简单界面实现-python实现的简单窗口倒计时界面实例

    本文实例讲述了python实现的简单窗口倒计时界面.分享给大家供大家参考.具体分析如下: 下面的代码通过Tkinter制作windows窗口界面,然后时间了一个简单的倒计时功能,代码可以直接运行 # ...

最新文章

  1. xml c libxml类库使用
  2. Java 语言 集合架构(Set规则集)
  3. oracle19c怎么创建Scott,Oracle db-sample-schema-19c安装(scott hr oe pm ix sh bi用户创建部署)...
  4. 用java创建一个简单的服务器
  5. conscience ['kɔnʃəns]
  6. 数据结构与算法 -- 栈 ADT
  7. Redis背后的故事
  8. Qt for Android环境配置
  9. 补充 返回泛型指定类的方法 0106
  10. 【OpenCV】OpenCV访问像素点的三种方式
  11. 问题排查证明方式:Unknown column NaN in field list
  12. 获取包名列表android,更多获取app包名方法
  13. ISP模块之RAW DATA去噪(一)
  14. 通用crt更新不适用计算机,KB2999226此更新不适用于您的计算机怎么办
  15. oracel的安装和卸载
  16. java和C程序员工资待遇差别大吗
  17. 面试官问你为什么离开上一家公司该怎么回答?
  18. 计算机文件恢复快捷键,文件变成快捷方式怎么恢复
  19. 央行征信爬虫解决方案
  20. minio-operator部署minio服务,并用Java客户端访问minio

热门文章

  1. Windows 内存详解(三)Windows内存管理
  2. 线性代数笔记3.2线性相关定理
  3. 批判马斯洛需求层次模型
  4. RabbitMQ入门(三)消息应答与发布确认
  5. 【工具推荐】最简单方法创建 README
  6. 骨干网-网络建设特点
  7. 一款团队图片管理系统-欧奥图库
  8. WINDOWS 2008 R2无法安装显卡驱动问题解决
  9. 使用python的tkinter和turtle库函数制作七夕/情人节送对象的礼物
  10. launch计算机上哪个初中,launch是什么意思