ABAP內表匯出為EXCEL格式的幾種方法(轉)
目錄
正文
這是一篇轉載文章,本人修改了其中的幾個錯字病句
內表資料下載到EXCEL的幾種方法
1. 函式: GUI_DOWNLOAD
這是一種最基本的方法,對應 CLASS: CL_GUI_FRONTEND_SERVICES 的方法 GUI_DOWNLOAD
注意FILENAME引數的副檔名應為XLS,這樣在儲存時可以儲存為EXCEL格式。 示例如下:
1 DATA:itab LIKE TABLE OF mara WITH HEADER LINE.
3DATA:BEGINOF t_fieldnames OCCURS0, 4 5 name TYPE char20, 6 7 END OF t_fieldnames. 8 9 START-OF-SELECTION. 10 11 SELECT * FROM mara INTO TABLE itab UP TO 10 ROWS. 12 13 t_fieldnames-name = '公司程式碼'. 14 15 APPEND t_fieldnames. 16 17 t_fieldnames-name = '功能範圍'. 18 19 APPEND t_fieldnames. 20 21 CALL FUNCTION 'GUI_DOWNLOAD' 22 EXPORTING 23 filename = 'C:\1234.xls' 24 filetype = 'DAT' 25 "這裡一般用DAT,如果用ASC則1000-不會顯示為-1000,而dat會顯示為-1000,如果用DBF則不會有縮排,即字元前面的空格會被除去,而且字元的前導0也會輸出。 26 codepage = '8404' 27 TABLES 28 data_tab = itab 29 fieldnames = t_fieldnames.
這個函式雖然比較簡單,但當FILETYPE為DAT和ASC時,生成的檔案用EXCEL開啟時會彈出如下的對話方塊:
原因: 以DAT和ASC格式存的表格其實是TXT格式,與EXCEL格式不一致,將副檔名改為TXT,會很容易看出這一點。
2. 函式:SAP_CONVERT_TO_XLS_FORMAT
這個FM功能與GUI_DOWNLOAD類似,支援xlsx格式:
SELECT * FROM sflight INTO TABLE @DATA(gt_temp) UP TO 10 ROWS. CALL FUNCTION 'SAP_CONVERT_TO_XLS_FORMAT' EXPORTING i_filename = 'C:\SAP\QQ1.XLSX' TABLES i_tab_sap_data = gt_temp EXCEPTIONS conversion_failed = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.
3. 函式: MS_EXCEL_OLE_STANDARD_DAT
同時也會直接開啟EXCEL檔案。這個FM不僅僅能把資料傳到EXCEL,
但是這個函式有一個缺點:當要把中文資料匯入到EXCEL時就必有登陸中文的GUI執行程式,否則中文就會變成'#'號。
1 DATA:BEGIN OF it_fieldnames OCCURS 0, 2 3 name TYPE char20, 4 5 END OF it_fieldnames. 6 7 it_fieldnames-name = 'Company Code'. 8 9 APPEND it_fieldnames. 10 11 it_fieldnames-name = 'Function Area'. 12 13 APPEND it_fieldnames. 14 15 it_fieldnames-name = '5'. "針對非C、N、D、T型別列的列名,函式有Bug 16 17 APPEND it_fieldnames. 18 19 CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT' 20 EXPORTING 21 file_name = 'C:\johnson.XLSX' 22 * CREATE_PIVOT = 0 23 * DATA_SHEET_NAME = ' ' 24 * PIVOT_SHEET_NAME = ' ' 25 * PASSWORD = ' ' 26 * pASSWORD_OPTION = 0 27 TABLES 28 * PIVOT_FIELD_TAB = 29 data_tab = itab 30 fieldnames = it_fieldnames 31 * EXCEPTIONS 32 * FILE_NOT_EXIST = 1 33 * FILENAME_EXPECTED = 2 34 * cOMMUNICATION_ERROR = 3 35 * oLE_OBJECT_METHOD_ERROR = 4 36 * OLE_OBJECT_PROPERTY_ERROR = 5 37 * INVALID_PIVOT_FIELDS = 6 38 * DOWNLOAD_PROBLEM = 7 39 * OTHERS = 8 40 .
說明:應用這個FM時要注意的問題:
1、Fieldname資料型別會被強制轉變為對應列的型別,如果轉換失敗則Dump
2、如果連續兩次或兩次以上以上呼叫,列名會跑到資料區
還有一個函式似乎是它的前身,名字是 EXCEL_OLE_STANDARD_DAT ,實現方法相似。不過這個函式對某些表會報"data can't converted in unicode program" 的錯誤,所以還是建議採用最新的函式。
4. OLE
這種方式與上面幾種比較優點在於能夠定製EXCEL格式,不過比較麻煩。
5. 函式: XXL_FULL_API
同樣能實現EXCEL格式,並且速度上較OLE有優勢。SE38有幾個參考示例: XXLTTEST, XXLSTEST, XXLFTEST
6. ABAP2XLSX
這是一個類包,是一群愛好者開發的一個專門用於將ABAP資料匯入到EXCEL的類,包括對齊,合併,字型,著色等的設定,因為是面向物件的,相比OLE方式要簡單,編寫程式也就比較省力。
一般用於需要定製EXCEL格式的情況。
具體可參考此文章
7. XLSX Workbench
一種視覺化表單生成工具,相比複雜的OLE,可以用少量程式碼+一些拖拽和配置來生成EXCEL報表,效能更好。按XLSX Workbench的文件介紹,它有九大特性:
- 無需ABAP程式設計技能
- 視覺化設計方式
- 高效能
- 支援後臺處理
- 強大的表單格式特性支援
- 支援公式
- 支援圖片
- 支援圖表
- 支援樹
XLSX Workbench是我眼中的首選方案,因為它的視覺化編輯工具真的很方便。通過這個工具,開發者只需要簡單地將資料放入設計好的context結構,並且在視覺化工具中將context繫結到具體的單元格,就可以生成EXCEL檔案了:
DATA: l_data TYPE zcontext. CALL FUNCTION 'ZXLWB_CALLFORM' EXPORTING iv_formname = 'ZXLWBFORM' iv_context_ref = l_data EXCEPTIONS OTHERS = 2. IF sy-subrc NE 0 . MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 . ENDIF .