内容发布更新时间 : 2025/1/3 23:54:09星期一 下面是文章的全部内容请认真阅读。
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-code SMW0 3. T-code OAOR
FTP顾名思义,就是把文件传到FTP上,然后在运行的时候,直接输入文件服务器的路径,把模版在本地打开填制。
T-code SMW0。实际上这是用于Web的一种文件存储,不过我们也可以借用来存储模版。当然建立之前要维护相应的MIME types(先把文件的类型要注册),方可上传此类型的文件。
一、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: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.“此处调用form gen_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. \
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. \