在上一篇 python驱动SAP完成数据导出(一)中,我们提到了数据导出前,SAP布局的重要性,如何识别当前布局模式,以及如何切换到想要的布局。本篇小爬将着重讲讲数据导出的注意事项。

我们可以通过如下方式进行导出:

其中方法一与方法三并无本质差别,最终都是可以脚本录制或者快捷键(Ctrl+Shift+F7)得到,点击导出按钮后,界面【选择电子表格】如下:

但是假如用户曾经勾选过上图中的【始终使用选定的格式】,那么则不会弹出上图所示窗口,直接进入如下界面:

注意一:

  如果用户执行操作前没有点击【脚本录制】,则会弹出如下windows【另存为】界面:

由于该界面是windows系统窗体,无法通过脚本录制得到自动化脚本代码,所以我们务必要提前进行脚本录制动作,才能确保文件保存的界面可通过录制脚本得到代码。

注意二:

  如果我们一开始选择的方法二 进行数据导出,则无论用户是否勾选【始终使用选定的格式】选项,SAP均会弹出【选择电子表格】界面。

  因此,为了避免操作界面不一致带来的代码兼容问题,小爬建议大家使用方法二来执行数据导出。

最后的导出界面,用户可以设置保存的路径和文件名,最后基于各自的情况点击【生成】或者【替代】按钮(【替代】按钮,意味着如果设定目录中如果提前有同名文件,则会被新文件覆盖)。

  点击完导出后,SAP会默认调用Excel进程,生成一个Excel文件,持续往该文件中传输值,待传输完毕后,SAP左下角会有消息显示:已传输***个字节。且该Excel文件会被excel自动打开。

  那么问题来了,如果我们要通过脚本批量下载多个报表数据,则SAP会自动创建并打开N个excel文件,此举很有可能导致系统内存紧张甚至excel文件崩溃。因此我们有必要及时自动关闭Excel文件。这该如何处理呢?

显然,我们必须借助于windows系统api来实现,python下就必须依托于pywin32库。同时我们还要借助SPY++提前捕获窗口信息。

  可以看到当系统是否隐藏了文件扩展名,最后窗口标题是有差别的,而FindWindow函数本身不支持基于窗口标题模糊查找,我们代码里不得不特殊化处理。

基于前文提到的方法二导出的,具体的示例代码如下(FB03为例):

 1 import sys, win32com.client,os,win32gui,win32con,time
2 def Main():
3 try:
4 SapGuiAuto = win32com.client.GetObject("SAPGUI")
5 application = SapGuiAuto.GetScriptingEngine
6 connection = application.Children(0)
7 if connection.DisabledByServer == True:
8 print("Scripting is disabled by server")
9 application = None
10 SapGuiAuto = None
11 return
12
13 session = connection.Children(0)
14 if session.Busy == True:
15 print("Session is busy")
16 session = None
17 connection = None
18 application = None
19 SapGuiAuto = None
20 return
21
22 if session.Info.IsLowSpeedConnection == True:
23 print("Connection is low speed")
24 session = None
25 connection = None
26 application = None
27 SapGuiAuto = None
28 return
29
30 session.findById("wnd[0]").maximize()
31 session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").contextMenu()
32 session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectContextMenuItem("&XXL")
33 session.findById("wnd[1]/tbar[0]/btn[0]").press()
34 session.findById("wnd[1]/usr/ctxtDY_PATH").text = os.getcwd() #保存路径
35 session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = "reportList.xlsx" #保存文件名
36 session.findById("wnd[1]/tbar[0]/btn[11]").press() #点击【替代】,覆盖可能的原文件
37 sapInfo=session.findById("wnd[0]/sbar").text #由于SAP脚本自身的特性,当程序读到左下角消息时,意味着数据已经传输完成!
38
39 '''找到打开的excel文件,并自动关闭它'''
40 excelHwnd=0
41 while ExcelHwnd==0:
42 time.sleep(0.2)
43 excelHwnd=max(win32gui.FindWindow("XLMAIN","reportList.XLSX - Excel"),win32gui.FindWindow("XLMAIN","reportList - Excel"))
44
45 '''以防SAP没有完全释放Excel进程,建议等待excel窗口可见后,再关闭它'''
46 isVisible=False
47 while isVisible==False:
48 time.sleep(0.2)
49 isVisible=win32gui.IsWindowVisible(excelHwnd)
50
51 '''关闭excel进程'''
52 win32gui.SendMessage(excelHwnd,win32con.WM_CLOSE,None,None)
53
54
55 except Exception as e:
56 print(e)
57 print(sys.exc_info()[0])
58
59 finally:
60 session = None
61 connection = None
62 application = None
63 SapGuiAuto = None
64
65 Main()

各位筒子,赶快动手试下吧o(* ̄▽ ̄*)ブ

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

python驱动SAP完成数据导出(二)的更多相关文章

  1. python驱动SAP完成数据导出(一)

    写在前面 我们使用Python驱动SAP时,经常会需要导出一些SAP报表数据至本地Excel文件.这个看似简单的问题背后,其实暗藏玄机,今天小爬就带各位同学好好捋捋. 以事务代码FB03(凭证清单)为 ...

  2. Python 把数据库的数据导出到excel表

    import io,xlwt def export_excel(request): """导出数据到excel表""" list_obj = ...

  3. python selenium中Excel数据维护(二)

    接着python里面的xlrd模块详解(一)中我们我们来举一个实例: 我们来举一个从Excel中读取账号和密码的例子并调用: ♦1.制作Excel我们要对以上输入的用户名和密码进行参数化,使得这些数据 ...

  4. VBA驱动SAP GUI实现办公自动化(一)

    小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...

  5. 【基于WinForm+Access局域网共享数据库的项目总结】之篇二:WinForm开发扇形图统计和Excel数据导出

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  6. API例子:用Python驱动Firefox采集网页数据

    1,引言 本文讲解怎样用Python驱动Firefox浏览器写一个简易的网页数据采集器.开源Python即时网络爬虫项目将与Scrapy(基于twisted的异步网络框架)集成,所以本例将使用Scra ...

  7. Matlab处理数据导出Paraview可读的vtk文件(二)

    由于我在用SPH方法仿真时用的是FORTRAN语言,并且没有找到直接输出vtk文件的代码,因此偷懒通过MATLAB转换一下数据. 用到的Matlab子程序可通过一下链接找到. Matlab处理数据导出 ...

  8. Neo4j 第十二篇:使用Python驱动访问Neo4j

    neo4j官方驱动支持Python语言,驱动程序主要包含Driver类型和Session类型.Driver对象包含Neo4j数据库的详细信息,包括主机url.安全验证等配置,还管理着连接池(Conne ...

  9. python打造漏洞数据导出工具

    功能 [x] 支持导出的数据:IP地址.漏洞名称.风险等级.整改建议.漏洞描述.漏洞CVE编号.漏洞对应端口.漏洞对应协议.漏洞对应服务等. [x] 导出不同端口的同一个漏洞,也就是一个端口对应一个漏 ...

随机推荐

  1. 度量驱动的DevOps实现

    目录 一.简介 二.度量是什么 三.实践 四.QA问答 一.简介 Wiki上讲:DevOps(Development和Operations的组合词)是一种重视"软件开发人员(Dev)&quo ...

  2. react功能实现-组件创建

    这里主要从两个角度来分析创建一个组件需要怎么做,一个是元素,一个是数据.整理向,大量借鉴,非原创. 1.渲染组件. 我们先明确一点,所有的元素都必须通过render方法来输出渲染.所有,每个组件类最终 ...

  3. Node.js 中文乱码解决

    Node.js 中文乱码解决 Node.js 支持中文不太好(实际上是Javascript支持),见<Node.js开发指南>. 要想Node.js正常显示中文,需要两点: 1.js文件保 ...

  4. SpringBoot Redis 发布订阅模式 Pub/Sub

    SpringBoot Redis 发布订阅模式 Pub/Sub 注意:redis的发布订阅模式不可以将消息进行持久化,订阅者发生网络断开.宕机等可能导致错过消息. Redis命令行下使用发布订阅 pu ...

  5. PowerDotNet平台化软件架构设计与实现系列(07):数据同步平台

    上文介绍定时任务调度平台的时候提到,定时任务调度平台的类模式一般用于处理耗时较长的任务.但是根据经验,有些耗时较长的任务,可以通过简化业务逻辑.分页.批量多次处理,改造为耗时较小的适合使用RESTfu ...

  6. CF46B T-shirts from Sponsor 题解

    Content 有一家服装店,有 \(\texttt{S}\) 码的衣服 \(n_S\) 件.\(\texttt{M}\) 码的衣服 \(n_M\) 件,\(\texttt{L}\) 码的衣服 \(n ...

  7. 电压-电流转换(一):4-20mA电流环

    在仪表电路中,直流信号通常用作物理测量值的模拟表示,例如温度.压力.流量.重量和运动.最常见的是,直流电流信号优先于直流电压信号使用,因为在从电源(测量设备)到负载(指示器.记录仪或控制器)的整个串联 ...

  8. c++设计模式概述之外观

    类写的不够规范,目的是缩短篇幅,请实际中不要这样做. 1.概述 了解外观模式相关概念后,一下子想到的是主板, 主板上有各种元器件,各种指示灯,各种电容,各种电路.然而,主板供电的接口就一个,其他元器件 ...

  9. 【LeetCode】409. Longest Palindrome 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:字典统计次数 方法二:HashSet 方法三 ...

  10. C. The Meaningless Game

    C. The Meaningless Game 题目链接 题意 给你两个数,开始都为1,然后每轮可以任选一个k,一边可以乘以\(k\),另一边乘以\(k^2\),然后问你最终是否可以得到所给的两个数a ...