SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx
《SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx》由会员分享,可在线阅读,更多相关《SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx(18页珍藏版)》请在冰豆网上搜索。
SAP日记ABAP导出EXCEL的两种方式OLEDOI
SAP日记——ABAP导出EXCEL的两种方法
提到OLE&DOI,我们不得不先说说两者这间的关系。
OLE是SAP早期与微软Office集成的工具,而DOI是它的替代技术。
在实际项目中使用到OLE&DOI的场合多是EXCEL表格的读入或是填制。
有些需要自动画表格及填数据,有的只是要求在原有的模版上填制数据。
根据不同的场合可以选用不同的技术。
(有些公司用EXCEL的打印来替代FORM)
下面主要讲一下,OLE&DOI关于EXCEL的处理。
OLE实际上是类EXCEL中VBA的一种写法。
有一种简单的方法,就是你可以在EXCEL中把要实现的动作录制成宏,然后根据宏的代码把它改成OLE。
OLE同时也支持直接调用EXCEL宏程序(没有禁宏的前提下)。
DOI完全用类实现。
特点是,你不用再去记那些繁琐的VBA语言了,DOI都给你包装成类的方法了。
同时作为一个控件,已经集成在了SAP的GUI中了,你就可以在SAP的屏幕中写Office的东西了,不用再跳出一个窗口来了,减少一些误操作。
当然DOI也是支持调用EXCEL宏程序的,前提是宏没有被禁。
两种方法在实际项目中都有使用,有时候就要看实施顾问擅长于那个了,当然本人还是推荐用新的,但也不要丢了老的(有时候要维护一些老程序或许用得着)。
因为两种在技术上并没有什么难点,只有熟练度的差别。
我可记不住那么多的方法和类名,一般常备两份模版两份手册在身,边写边查,在项目进度之内完工就OK。
我读取EXCEL还是比较简单的,这里不再讲了。
既然,EXCEL的填制有自动画表格和填制模版之分,而自动画表格,显然就是什么都要自己写,工程量比较大,需要大量的调试(字体、表格宽度、颜色等),没有什么捷径,捧着手册慢慢写吧!
对于填制模版,那自然要将模版上传到服务器,程序执行的时候再下载使用。
我使用的一般有3中:
1.FTP
2.T-codeSMW0
3.T-codeOAOR
FTP顾名思义,就是把文件传到FTP上,然后在运行的时候,直接输入文件服务器的路径,把模版在本地打开填制。
T-codeSMW0。
实际上这是用于Web的一种文件存储,不过我们也可以借用来存储模版。
当然建立之前要维护相应的MIMEtypes(先把文件的类型要注册),方可上传此类型的文件。
一、OLE
ABAP通过OLE的方式导出EXCEL,由于数据时一条一条的生成,速度较慢,不适合内表数据较多的场景使用,但是其实现起来比较简单。
REPORT ZTEST1.
TABLES:
ZWYM.“自定义的一张表
TYPE-POOLS:
SLIS,ole2.“需要用到OLE2
DATA:
excel TYPE ole2_object,
workbook TYPE ole2_object,
sheet TYPE ole2_object,
cell TYPE ole2_object.
DATA:
application TYPE ole2_object,
book TYPE ole2_object,
books TYPE ole2_object.
DATA:
ole_book TYPE ole2_object.
DATA:
FILENAME(100) TYPE C VALUE 'D:
\data\test.xls'.“定义文件导出的路径
"DATA:
GT_ITAB LIKE TABLE OF ZWYM WITH HEADER LINE.
DATA:
BEGIN OF GT_ITAB OCCURS 0,“定义内表
INCLUDE STRUCTURE ZWYM.
END OF GT_ITAB.
SELECTION-SCREEN:
BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.“查询条件
SELECT-OPTIONS:
S_MATNR FOR ZWYM-MATNR.
SELECTION-SCREEN:
END OF BLOCK B1.
START-OF-SELECTION.
PERFORM GET_DATA.
END-OF-SELECTION.
PERFORM gen_excel.
FORM GET_DATA.
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_ITAB FROM ZWYM WHERE MATNR IN S_MATNR.
ENDFORM.“GET_DATA.
FORM gen_excel.
CREATE OBJECT excel 'EXCEL.APPLICATION'.
IF sy-subrc NE 0 .
MESSAGE '不能生成EXCEL对象,检查系统是否安装 MS EXCEL。
' TYPE 'E'.
STOP.
ENDIF.
SET PROPERTY OF excel 'DisplayAlerts' = 0.
CALL METHOD OF excel 'WORKBOOKS' = workbook .
* Put Excel in background
SET PROPERTY OF excel 'VISIBLE' = 1.
* Create worksheet
SET PROPERTY OF excel 'SheetsInNewWorkbook' = 1.
CALL METHOD OF workbook 'ADD'.
PERFORM gen_item.“此处调用formgen_item显示EXCEL明细
GET PROPERTY OF excel 'ActiveSheet' = sheet.
FREE OBJECT sheet.
FREE OBJECT workbook.
GET PROPERTY OF excel 'ActiveWorkbook' = workbook.
CALL METHOD OF workbook 'SAVEAS'
EXPORTING
#1 = filename“保存路径
#2 = 1.
FREE OBJECT sheet.
FREE OBJECT workbook.
FREE OBJECT excel.
ENDFORM. "gen_excel
FORM gen_item.
CALL METHOD OF excel 'WORKSHEETS' = sheet.
CALL METHOD OF sheet 'ADD'.
FREE OBJECT sheet.
CALL METHOD OF excel 'WORKSHEETS' = sheet
EXPORTING
#1 = 1.
CALL METHOD OF sheet 'ACTIVATE'.
SET PROPERTY OF sheet 'NAME' = 'btdata'.“导出的EXCEL表单名
FREE OBJECT sheet. "OK
DEFINE c_cell.
call method of excel 'CELLS' = cell“定义在excel的位置1为行2为列
EXPORTING
#1 = &1
#2 = &2.
END-OF-DEFINITION.
DEFINE s_cell.
set property of cell &1 = &2.“填充值1为VALUE2为填充内容
END-OF-DEFINITION.
* 写标题行
c_cell 1 1. s_cell 'VALUE' '物料号'.
c_cell 1 2. s_cell 'VALUE' '工厂'.
c_cell 1 3. s_cell 'VALUE' '网格值'.
c_cell 1 4. s_cell 'VALUE' '产品名称'.
c_cell 1 5. s_cell 'VALUE' '颜色'.
c_cell 1 6. s_cell 'VALUE' '尺码'.
DATA:
line TYPE i VALUE 1.
* 写内容行
LOOP AT GT_ITAB.
line = line + 1.
c_cell line 1. s_cell:
'NumberFormatLocal' '@','VALUE' GT_ITAB-matnr.
c_cell line 2. s_cell:
'NumberFormatLocal' '@','VALUE' GT_ITAB-werks.
c_cell line 3. s_cell:
'NumberFormatLocal' '@','VALUE' GT_ITAB-J_3ASIZE.
c_cell line 4. s_cell 'VALUE' GT_ITAB-MAKTX.
c_cell line 5. s_cell:
'NumberFormatLocal' '@','VALUE' GT_ITAB-J_3AKORD1.
c_cell line 6. s_cell:
'NumberFormatLocal' '@','VALUE' GT_ITAB-J_3AKORD2.
ENDLOOP.
ENDFORM.
二、DOI
ABAP通过DOI可以处理对EXCEL有特殊要求格式的需求。
DOI的功能很强大,关于OLE和DOI的区别可以参考
DOI实现起来分为两步
1.上载EXCEL模板
TCODE:
OAOR
下面的可以不用填写
进去之后如下图:
左下角点击“创建”选项卡—>“标准文档类型”—>“Tabletemplate”
双击“Tabletemplate”弹出文旦导航选择文件
之后在主界面左上角3会显示上载的模板
excel模板如下
之后就是代码
以下是网上下载的代码
可以运行(需要在SE51上面创建一个编号100的屏幕屏幕里面建一个CONTAINER,SE41创建STATUS“SA1”)
REPORT ZTEST2.
TABLES:
T001.
TYPE-POOLS:
SLIS,VRM, SBDST, SOI."引入必要的类型组
CONSTANTS DOCUMENT_NAME(30) VALUE 'temp'."模板名字
CONSTANTS INPLACE VALUE 'X'."控制参数,在GUI中显示Excel
DATA:
FLAG .
DATA:
CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,"容器实例
CONTROL TYPE REF TO I_OI_CONTAINER_CONTROL,"控制器实例
DOCUMENT TYPE REF TO I_OI_DOCUMENT_PROXY,"文档操作对象
SPREADSHEET TYPE REF TO I_OI_SPREADSHEET,"分隔符对象
ERROR TYPE REF TO I_OI_ERROR,"错误信息
ERRORS TYPE REF TO I_OI_ERROR OCCURS 0 WITH HEADER LINE."错误信息
* spreadsheet interface structures for Excel data input
DATA:
RANGEITEM TYPE SOI_RANGE_ITEM.
DATA:
RANGES TYPE SOI_RANGE_LIST.
DATA:
EXCEL_INPUT TYPE SOI_GENERIC_TABLE.
DATA:
EXCEL_INPUT_WA TYPE SOI_GENERIC_ITEM.
DATA:
INITIALIZED
(1), RETCODE TYPE SOI_RET_STRING.
DATA:
ITEM_URL(256)."存放模板的Url
DATA DOCUMENT_TYPE(80)."文档类型
DATA:
EXCEL(80) VALUE 'Excel.Sheet'.
DATA:
LINE_COUNT TYPE I,
COLUMN_COUNT TYPE I.
DATA:
OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
CLASS C_OI_ERRORS DEFINITION LOAD.
DATA:
BEGIN OF ITAB OCCURS 0.
INCLUDE STRUCTURE T001.
DATA:
END OF ITAB.
SELECT-OPTIONS BUKRS FOR T001-BUKRS.
START-OF-SELECTION.
PERFORM GETDATA.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GETDATA .
SELECT *
FROM T001
INTO TABLE ITAB
WHERE BUKRS IN BUKRS.
ENDFORM. " getdata
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'SA1'.
IF FLAG = SPACE .
PERFORM CREATE_BASIC_OBJECTS USING '' '' '' '' DOCUMENT_NAME.
PERFORM OUTPUT_TO_EXCEL.
ENDIF.
ENDMODULE. "STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
FLAG = 'X'.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCLE' .
IF NOT DOCUMENT IS INITIAL.
CALL METHOD DOCUMENT->CLOSE_DOCUMENT."关闭文档
FREE DOCUMENT.
ENDIF.
IF NOT CONTROL IS INITIAL.
CALL METHOD CONTROL->DESTROY_CONTROL.
FREE CONTROL.
ENDIF.
LEAVE PROGRAM.
WHEN 'BACK' .
IF NOT DOCUMENT IS INITIAL.
CALL METHOD DOCUMENT->CLOSE_DOCUMENT.
FREE DOCUMENT.
ENDIF.
IF NOT CONTROL IS INITIAL.
CALL METHOD CONTROL->DESTROY_CONTROL.
FREE CONTROL.
ENDIF.
SET SCREEN 0. " quit the program
"set screen 1000.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form CREATE_BASIC_OBJECTS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_APP_NAME text
* -->P_CLASSNAME text
* -->P_CLASSTYPE text
* -->P_OBJ_KEY text
* -->P_DOCNAME text
*----------------------------------------------------------------------*
FORM CREATE_BASIC_OBJECTS USING P_APP_NAME
P_CLASSNAME
P_CLASSTYPE
P_OBJ_KEY
P_DOCNAME.
CHECK INITIALIZED IS INITIAL.
* 获取SAP DOI的控制器接口
CALL METHOD
C_OI_CONTAINER_CONTROL_CREATOR=>GET_CONTAINER_CONTROL
IMPORTING
CONTROL = CONTROL
ERROR = ERROR.
* check no errors occured
CALL METHOD ERROR->RAISE_MESSAGE
EXPORTING
TYPE = 'E'.
"实例化容器实例
CREATE OBJECT CONTAINER
EXPORTING
CONTAINER_NAME = 'CONTAINER'.
DATA L_APP_NAME(200).
IF P_APP_NAME IS INITIAL.
L_APP_NAME = 'TEST'.
ELSE.
L_APP_NAME = P_APP_NAME.
ENDIF.
"初始化控制器的接口
CALL METHOD CONTROL->INIT_CONTROL
EXPORTING
R3_APPLICATION_NAME = L_APP_NAME
INPLACE_ENABLED = INPLACE
INPLACE_SCROLL_DOCUMENTS = 'X'
PARENT = CONTAINER
REGISTER_ON_CLOSE_EVENT = 'X'
REGISTER_ON_CUSTOM_EVENT = 'X'
NO_FLUSH = 'X'
IMPORTING
ERROR = ERRORS.
* save error object in collection
APPEND ERRORS.
CLEAR ITEM_URL.
"定义BDS实例变量,用于设置文档信息
DATA:
BDS_INSTANCE TYPE REF TO CL_BDS_DOCUMENT_SET.
DATA:
DOC_SIGNATURE TYPE SBDST_SIGNATURE,
WA_DOC_SIGNATURE LIKE LINE OF DOC_SIGNATURE,
DOC_COMPONENTS TYPE SBDST_COMPONENTS,
DOC_URIS TYPE SBDST_URI,
WA_DOC_URIS LIKE LINE OF DOC_URIS.
*以下三个值为Tcode:
OAOR里面新建模板文件的参数
DATA:
DOC_CLASSNAME TYPE SBDST_CLASSNAME VALUE 'HRFPM_EXCEL_STANDARD',
DOC_CLASSTYPE TYPE SBDST_CLASSTYPE VALUE 'OT',
DOC_OBJECT_KEY TYPE SBDST_OBJECT_KEY VALUE 'TEMP'.
WA_DOC_SIGNATURE-PROP_NAME = 'DESCRIPTION'.
DOCUMENT_TYPE = EXCEL.
WA_DOC_SIGNATURE-PROP_VALUE = P_