用过SAP的人都知道,它的报表导出功能非常强大,它支持多种导出格式,我们最常用的自然是导出为excel文件。不过SAP导出excel文件后,总是很好心地帮我们自动打开了导出的报表,这种【好心】却无形中给我们的办公自动化带来了难题。我们利用python做很多SAP自动化办公场景中,导出的数据往往需要利用pandas等库二次加工。因此,我们不希望文件在调用时已经被excel打开了,这会带来文件占用等权限问题。
那么,如果我们想要关闭【SAP自动打开导出的excel文件】这个默认功能,有好的办法吗?必须得有,小爬这里提供两种可行的思路。
方法一:利用Windows API关闭打开的报表
具体来说,导出文件的指令发送到SAP GUI后,我们可以利用sap scripting API拿到SAP的左下角消息(如下图所示)文本:
进而判断SAP的数据已经传输成功,短时间后,SAP会自动打开该表格。我们可以利用windows user32 API中的FindWindow,IsVisible等方法后台遍历窗口,直到捕获到打开且为显示状态的Excel文件,再利用SendMessage方法给Excel发送窗口消息,关闭该Excel文件。
PS:好多人是在Excel VBA中写脚本驱动SAP,这里需要注意的是:SAP在数据导出到excel过程中,是新建了一个Excel进程,最后在该进程下打开的报表,该进程与我们当前VBA中的Application对象显然不在同一个进程中,因此我们无法利用如下代码来轻松关闭这些Excel报表文件,放弃这种幻想吧,骚年:
For Each wb in Workbooks If wb.name=reportFileName then wb.close False End IF Next
方法二:利用SAP的导出文件至剪贴板功能,将剪贴板内容还原成Excel文件
具体到操作上,我们先要利用SAP原生的方法:导出至【本地文件】-【将列表保存在剪贴板中】。经过这两个操作后,我们的报表内容已经传输到windows 剪贴板了。此时,我们便可以利用python pywin32库大展拳脚。Pywin32库中封装了几乎所有的有助于windows UI自动化需要的API方法。比如,我们可以利用win32clipboard模块来提取剪贴板内容,代码示例如下:
import win32clipboard as w def get_text(): w.OpenClipboard() copy_text=w.GetClipboardData(win32con.CF_UNICODETEXT) w.CloseClipboard() return copy_text
有了这个get_text方法之后,我们可以观察SAP存入剪贴板的内容(长字符串)长啥格式,我们如何去提取报表的标题字段和对应的每行数据。再然后,我们就可以利用Xlsxwriter库实例化一个Workbook对象,然后将表格标题和行数据分别写入该对象,最后保存,也就实现了整个数据导出至Excel过程。
需要强调的是,通过该方法,Excel报表文件显然不会自动打开。我们也可以灵活的把剪贴板内容解析后,直接存入一个pandas DataFrame对象,再利用DataFrame对象的to_excel方法,轻松导出Excel文件,也可以直接利用pandas来实现后续的数据加工,灵活又方便。
感兴趣的童鞋,不妨用python代码来实现方法二中的思路。相信我,成功之后,你会和小爬一样,收获满满的成就感~~
欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/278057.html