ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何利用Python+系统剪贴板实现SAP报表数据高效导出

2022-07-31 17:36:21  阅读:179  来源: 互联网

标签:文件 剪贴板 报表 Python 导出 Excel SAP


  用过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代码来实现方法二中的思路。相信我,成功之后,你会和小爬一样,收获满满的成就感~~

  欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!

 

 

 

 

 

 

  

 

标签:文件,剪贴板,报表,Python,导出,Excel,SAP
来源: https://www.cnblogs.com/new-june/p/16537577.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有