SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx

上传人:b****5 文档编号:8202276 上传时间:2023-01-29 格式:DOCX 页数:18 大小:324.46KB
下载 相关 举报
SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx_第1页
第1页 / 共18页
SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx_第2页
第2页 / 共18页
SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx_第3页
第3页 / 共18页
SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx_第4页
第4页 / 共18页
SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx

《SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx》由会员分享,可在线阅读,更多相关《SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx(18页珍藏版)》请在冰豆网上搜索。

SAP日记ABAP导出EXCEL的两种方式OLEDOI.docx

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_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1