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.FTP2.T-codeSMW03.T-codeOAORFTP顾名思义,就是把文件传到FTP上,然后在运行的时候,直接输入文件服务器的路径,把模版在本地打开填制。T-codeSMW0。实际上这是用于Web的一种文件存储,不过我们也可以借用来存储模版。当然建立之前要维护相应的MIMEtypes(先把文件的类型要注册),方可上传此类型的文件。一、OLEABAP通过OLE的方式导出EXCEL,由于数据时一条一条的生成,速度较慢,不适合内表数据较多的场景使用,但是其实现起来比较简单。REPORTZTEST1.TABLES:ZWYM.“自定义的一张表TYPE-POOLS:SLIS,ole2.“需要用到OLE2DATA:excelTYPEole2_object,workbookTYPEole2_object,sheetTYPEole2_object,cellTYPEole2_object.DATA:applicationTYPEole2_object,bookTYPEole2_object,booksTYPEole2_object.DATA:ole_bookTYPEole2_object.DATA:FILENAME(100)TYPECVALUE'D:\data\test.xls'.“定义文件导出的路径DATA:GT_ITABLIKETABLEOFZWYMWITHHEADERLINE.DATA:BEGINOFGT_ITABOCCURS0,“定义内表INCLUDESTRUCTUREZWYM.ENDOFGT_ITAB.SELECTION-SCREEN:BEGINOFBLOCKB1WITHFRAMETITLETEXT-001.“查询条件SELECT-OPTIONS:S_MATNRFORZWYM-MATNR.SELECTION-SCREEN:ENDOFBLOCKB1.START-OF-SELECTION.PERFORMGET_DATA.END-OF-SELECTION.PERFORMgen_excel.FORMGET_DATA.SELECT*INTOCORRESPONDINGFIELDSOFTABLEGT_ITABFROMZWYMWHEREMATNRINS_MATNR.ENDFORM.“GET_DATA.FORMgen_excel.CREATEOBJECTexcel'EXCEL.APPLICATION'.IFsy-subrcNE0.MESSAGE'不能生成EXCEL对象,检查系统是否安装MSEXCEL。'TYPE'E'.STOP.ENDIF.SETPROPERTYOFexcel'DisplayAlerts'=0.CALLMETHODOFexcel'WORKBOOKS'=workbook.*PutExcelinbackgroundSETPROPERTYOFexcel'VISIBLE'=1.*CreateworksheetSETPROPERTYOFexcel'SheetsInNewWorkbook'=1.CALLMETHODOFworkbook'ADD'.PERFORMgen_item.“此处调用formgen_item显示EXCEL明细GETPROPERTYOFexcel'ActiveSheet'=sheet.FREEOBJECTsheet.FREEOBJECTworkbook.GETPROPERTYOFexcel'ActiveWorkbook'=workbook.CALLMETHODOFworkbook'SAVEAS'EXPORTING#1=filename“保存路径#2=1.FREEOBJECTsheet.FREEOBJECTworkbook.FREEOBJECTexcel.ENDFORM.gen_excelFORMgen_item.CALLMETHODOFexcel'WORKSHEETS'=sheet.CALLMETHODOFsheet'ADD'.FREEOBJECTsheet.CALLMETHODOFexcel'WORKSHEETS'=sheetEXPORTING#1=1.CALLMETHODOFsheet'ACTIVATE'.SETPROPERTYOFsheet'NAME'='btdata'.“导出的EXCEL表单名FREEOBJECTsheet.OKDEFINEc_cell.callmethodofexcel'CELLS'=cell“定义在excel的位置1为行2为列EXPORTING#1=&1#2=&2.END-OF-DEFINITION.DEFINEs_cell.setpropertyofcell&1=&2.“填充值1为VALUE2为填充内容END-OF-DEFINITION.*写标题行c_cell11.s_cell'VALUE''物料号'.c_cell12.s_cell'VALUE''工厂'.c_cell13.s_cell'VALUE''网格值'.c_cell14.s_cell'VALUE''产品名称'.c_cell15.s_cell'VALUE''颜色'.c_cell16.s_cell'VALUE''尺码'.DATA:lineTYPEiVALUE1.*写内容行LOOPATGT_ITAB.line=line+1.c_cellline1.s_cell:'NumberFormatLocal''@','VALUE'GT_ITAB-matnr.c_cellline2.s_cell:'NumberFormatLocal''@','VALUE'GT_ITAB-werks.c_cellline3.s_cell:'NumberFormatLocal''@','VALUE'GT_ITAB-J_3ASIZE.c_cellline4.s_cell'VALUE'GT_ITAB-MAKTX.c_cellline5.s_cell:'NumberFormatLocal''@','VALUE'GT_ITAB-J_3AKORD1.c_cellline6.s_cell:'NumberFormatLocal''@','VALUE'GT_ITAB-J_3AKORD2.ENDLOOP.ENDFORM.二、DOIABAP通过DOI可以处理对EXCEL有特殊要求格式的需求。DOI的功能很强大,关于OLE和DOI的区别可以参考@126/blog/static/1651261562010529103946880/的博客内容。DOI实现起来分为两步1.上载EXCEL模板TCODE:OAOR下面的可以不用填写进去之后如下图:左下角点击“创建”选项卡—“标准文档类型”—“Tabletemplate”双击“Tabletemplate”弹出文旦导航选择文件之后在主界面左上角3会显示上载的模板excel模板如下之后就是代码以下是网上下载的代码可以运行(需要在SE51上面创建一个编号100的屏幕屏幕里面建一个CONTAINER,SE41创建STATUS“SA1”)REPORTZTEST2.TABLES:T001.TYPE-POOLS:SLIS,VRM,SBDST,SOI.引入必要的类型组CONSTANTSDOCUMENT_NAME(30)VALUE'temp'.模板名字CONSTANTSINPLACEVALUE'X'.控制参数,在GUI中显示ExcelDATA:FLAG.DATA:CONTAINERTYPEREFTOCL_GUI_CUSTOM_CONTAINER,容器实例CONTROLTYPEREFTOI_OI_CONTAINER_CONTROL,控制器实例DOCUMENTTYPEREFTOI_OI_DOCUMENT_PROXY,文档操作对象SPREADSHEETTYPEREFTOI_OI_SPREADSHEET,分隔符对象ERRORTYPEREFTOI_OI_ERROR,错误信息ERRORSTYPEREFTOI_OI_ERROROCCURS0WITHHEADERLINE.错误信息*spreadsheetinterfacestructuresforExceldatainputDATA:RANGEITEMTYPESOI_RANGE_ITEM.DATA:RANGESTYPESOI_RANGE_LIST.DATA:EXCEL_INPUTTYPESOI_GENERIC_TABLE.DATA:EXCEL_INPUT_WATYPESOI_GENERIC_ITEM.DATA:INITIALIZED(1),RETCODETYPESOI_RET_STRING.DATA:ITEM_URL(256).存放模板的UrlDATADOCUMENT_TYPE(80).文档类型DATA:EXCEL(80)VALUE'Excel.Sheet'.DATA:LINE_COUNTTYPEI,COLUMN_COUNTTYPEI.DATA:OK_CODETYPESY-UCOMM,SAVE_OKTYPESY-UCOMM.CLASSC_OI_ERRORSDEFINITIONLOAD.DATA:BEGINOFITABOCCURS0.INCLUDESTRUCTURET001.DATA:ENDOFITAB.SELECT-OPTIONSBUKRSFORT001-BUKRS.START-OF-SELECTION.PERFORMGETDATA.CALLSCREEN100.*&---------------------------------------------------------------------**&Formgetdata*&---------------------------------------------------------------------**text*----------------------------------------------------------------------**--p1text*--p2text*------------------------------------------------------