程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

如何利用Python+系統剪貼板實現SAP報表數據高效導出

編輯:Python

用過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代碼來實現方法二中的思路。相信我,成功之後,你會和小爬一樣,收獲滿滿的成就感~~

歡迎掃碼關注我的公眾號 獲取更多爬蟲、數據分析的知識!

 

 

 

 

 

 

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved