天天看點

使用ABAP操作Excel的幾種方法

這篇文章本來不在我計劃之内,因為最近一個朋友微信上問到我這個問題,但我平時在研究院工作中從沒遇到過需要用ABAP操作Excel的需求,是以也沒有太多技術實作細節可以分享給大家,隻能泛泛寫一些。

用ABAP操作Excel這個需求算是比較常見,是以Jerry希望這篇文章能起到抛磚引玉的效果,在這個話題上有多年工作經驗的朋友們,歡迎留言,指出Jerry文章中不足或者錯誤之處。

在GUI裡根據關鍵字OLE搜尋,能找到通過ABAP操作Excel的一種辦法:

這段文檔說的比較清楚,微軟的Word和Excel這種Office應用,提供了一種所謂automation的接口,暴露的公有類的方法和屬性可以被其他應用消費。

作為ABAP應用開發人員,我們通過調用OLE對象的方法CALL METHOD, GET PROPERTY,SET PROPERTY等來通路微軟Word和Excel的automation接口,代碼看起來像這樣:

上面這個函數RH_START_EXCEL_DATA_OLE調用微軟Excel的automation接口,建立一個Excel workbook,然後準備把ABAP内表裡的資料寫到Excel裡。

你也許會問,我咋知道Excel裡有哪些公有的類和方法可以被ABAP調用呢?

在Excel裡點選右鍵,選擇View Code:

打開Microsoft Visual Basic Object Brower,所有可用的類和方法都列在這裡了,上面ABAP代碼第218行調用的workbook的open方法在清單裡也能找到。

這個解決方案隻在windows平台有效,并且需要運作GUI的Presentation Server上安裝有微軟的Excel應用。

我們采用OLE的方式操作Excel時,打開Windows作業系統的任務管理器,會發現一個以/automation -Embedding參數啟動的Excel程序。

這裡的-Embedding參數,來自OLE的全稱:Object Linking and Embedding裡的一部分。OLE是微軟的一項非常古老的技術了。

微軟和兩位大佬,Bill Gates和Hasso Plattner 1993年的照片:

關于OLE,Jerry知道的就這麼點了,在研究院裡如今我們還是會和微軟的技術打交道,比如微軟的Azure.

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-IzZC3bhH-1575963016967)(

https://user-images.githubusercontent.com/5669954/70382678-9abda800-199a-11ea-964b-b9c9a3736acd.png)]

如果Jerry沒記錯的話, 微軟Office從2007版本開始, 采用新的支援Office Open XML标準的格式來管理Excel和Word等檔案。Jerry 2014年在成都研究院CRM開發團隊負責CRM Document Builder這個子產品,當時編寫過使用ABAP操作Word文檔的代碼。

以Word為例,下圖是我建立了一個最簡單的Word文檔,包含了一個Header區域,一個由三行彩色文字組成的段落,還有一張圖檔。

我們把這個Word文檔的擴充名從.docx改成.zip, 然後輕按兩下,就可以用解壓軟體比如winrar打開。

于是發現這一個最簡單的按照Office Open XML協定實作的Word文檔,實際上由如此多的xml和檔案夾構成。

使用标準的類CL_DOCX_DOCUMENT讀取Word檔案内容:

上述代碼的簡要說明:

(1) 将word文檔的二進制内容傳入方法cl_docx_document=>load_document,得到一個文檔對象引用,然後就可以借助該對象引用調用各種方法了。

(2) word文檔的建立者,建立時間,最後修改時間等資訊都存儲在所謂的“Core property part”内,可以通過方法lo_document->get_corepropertiespart獲得"Core property part"的引用,再使用該引用調用方法get_data獲得實際内容。

下圖是get_data傳回的内容的一個例子,可以看出是xml格式。

(3) 現在我們準備讀取Word文檔的正文了。使用方法lo_document->get_maindocumentpart得到Word文檔正文,文字的字型類型,顔色也包含在内。如下圖所示:

(4) Word文檔裡插入的圖檔的二進制内容當然也是可以讀取出來的。使用方法:lo_image_parts->get_part傳回。

Excel的例子我沒有動手做過,不過原理類似,大家可以用開發包S_OOXML_CORE裡的CL_XLSX_DOCUMENT來操作格式為xlsx的Excel文檔。

除此之外,還有一個著名的開源項目,

abap2xlsx

, Jerry沒有試過,感興趣的朋友可以試試。

最後,大家在SE24裡使用關鍵字XSLX以及SE38裡搜尋_OLE,

可以從搜尋清單裡選一些點進去,參考标準程式是如何操作Excel文檔的。

希望這些内容對大家有用,感謝閱讀。

本文來自雲栖社群合作夥伴“汪子熙”,了解相關資訊可以關注微信公衆号"汪子熙"。