前面介绍了OLE输出EXCEL有个最大的特点就是慢,因为其是基于单元格层次的一个个操作去填充数据,而DOI技术采用面向对象的方法实现,解决了这个问题。至于为什么能解决,有兴趣的可以慢慢研究。

既然是使用面向对象的方法实现,当然离不开类与接口,下面介绍DOI中最常用的4种类与接口。

1.容器类:目前作者常用的两种类是CL_GUI_CONTAINER和CL_GUI_CUSTOMER_CONTAINER,在不画屏幕容器,直接使用整个屏幕作为容器时使用CL_GUI_CONTAINER创建容器实例,在画屏幕容器时使用CL_GUI_CUSTOM_CONTAINER创建容器实例。

2.控制器接口:I_OI_CONTAINER_CONTROL,这个接口的实例主要用来与屏幕容器绑定和创建参照接口I_OI_DOCUMENT_PROXY 的实例。

3.文档接口:I_OI_DOCUMENT_PROXY ,参照这个接口的实例主要用来打开和保存文件,还有创建参照接口I_OI_SPREADSHEET 的实例。

4.SHEET页接口:I_OI_SPREADSHEET,参照这个接口的实例主要用来在SHEET页层级填充数据,设置格式等。

最后给出一个简单的DEMO。

输出目标:

创建的屏幕100:

源代码:

*&---------------------------------------------------------------------*
*& Report Z15540_DOI1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z15540_DOI1.
TYPE-POOLS:SOI.
"数据定义
DATA:BEGIN OF GS_DATA,WERKS TYPE MARD-WERKS,LGORT TYPE MARD-LGORT,MATNR TYPE MARD-MATNR,MAKTX TYPE MAKT-MAKTX,LABST TYPE MARD-LABST,MEINS TYPE MARA-MEINS,END OF GS_DATA.
DATA GT_DATA LIKE TABLE OF GS_DATA.
"DOI相关定义
DATA:LCL_CONTAINER  TYPE REF TO CL_GUI_CONTAINER, "容器引用对象LCL_CONTROL    TYPE REF TO I_OI_CONTAINER_CONTROL, "容器控制器引用对象LCL_DOCUMENT   TYPE REF TO I_OI_DOCUMENT_PROXY, "对应EXCEL文档层次引用对象LCL_SHEET      TYPE REF TO I_OI_SPREADSHEET. "对应SHEET层次操作的接口引用对象START-OF-SELECTION.CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Form FRM_CONTAINER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CONTAINER ."将CL_GUI_CONTAINER的静态属性SCREEN0付给LCL_CONTAINER,相当于以当前系统显示的整个屏幕创建一个容器实例,该例中则以屏幕100创建实例LCL_CONTAINER = CL_GUI_CONTAINER=>SCREEN0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CONTAINER_CONTROL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CONTAINER_CONTROL ."实例化容器控制器CALL METHOD C_OI_CONTAINER_CONTROL_CREATOR=>GET_CONTAINER_CONTROLIMPORTINGCONTROL = LCL_CONTROL."绑定容器与容器控制器,并初始化控制器设定CALL METHOD LCL_CONTROL->INIT_CONTROLEXPORTING
*     DYNPRO_NR                = SY-DYNNR
*     GUI_CONTAINER            = ' 'INPLACE_ENABLED          = 'X' "EXCEL可嵌入容器
*     INPLACE_MODE             = 0
*     INPLACE_RESIZE_DOCUMENTS = ' 'INPLACE_SCROLL_DOCUMENTS = 'X' "可滚动
*     INPLACE_SHOW_TOOLBARS    = 'X' "是否展示工具栏以上
*     NO_FLUSH                 = 'X'
*     PARENT_ID                = cl_gui_cfw=>dynpro_0R3_APPLICATION_NAME      = 'DOI TEST'REGISTER_ON_CLOSE_EVENT  = 'X' "注册关闭事件REGISTER_ON_CUSTOM_EVENT = 'X' "注册定制事件
*     REP_ID                   = SY-REPID
*     SHELL_STYLE              = 1384185856PARENT                   = LCL_CONTAINER
*     NAME                     =
*     AUTOALIGN                = 'x'
*  IMPORTING
*     ERROR                    =
*     RETCODE                  =EXCEPTIONSJAVABEANNOTSUPPORTED     = 1OTHERS                   = 2.IF SY-SUBRC <> 0.
* Implement suitable error handling hereENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CREATE_EXCEL ."实例化LCL_DOCUMENTCALL METHOD LCL_CONTROL->GET_DOCUMENT_PROXYEXPORTING
*     DOCUMENT_FORMAT    = 'NATIVE'DOCUMENT_TYPE  = 'EXCEL.SHEET' "应用类型NO_FLUSH       = 'X'
*     REGISTER_CONTAINER = ' 'IMPORTINGDOCUMENT_PROXY = LCL_DOCUMENT
*     ERROR          =
*     RETCODE        =
    ."创建EXCEL文件CALL METHOD LCL_DOCUMENT->CREATE_DOCUMENTEXPORTING
*     CREATE_VIEW_DATA = ' 'DOCUMENT_TITLE = 'DOI TEST'
*     NO_FLUSH       = 'X'OPEN_INPLACE   = 'X' "嵌入显示
*     OPEN_READONLY  = 'X' "只读
*     ONSAVE_MACRO   = 'X'
*     STARTUP_MACRO  = 'X'
*  IMPORTING
*     ERROR          =
*     RETCODE        =
    .ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_DATA .DATA LV_ROW TYPE I."填充数据的行数DATA:LS_RANGE       TYPE SOI_RANGE_ITEM,LT_RANGE       TYPE TABLE OF SOI_RANGE_ITEM, "为SET_RANGE_DATA方法标明填充数据的范围名及其行列数LS_CONTENT     TYPE SOI_GENERIC_ITEM,LT_CONTENT     TYPE TABLE OF SOI_GENERIC_ITEM, "为SET_RANGE_DATA方法提供填充数据LS_FORMATTABLE TYPE  SOI_FORMAT_ITEM, "设置范围格式LT_FORMATTABLE TYPE TABLE OF SOI_FORMAT_ITEM. "设置范围格式DATA LV_COUNT_ROW TYPE I."当前行DATA LV_LABST TYPE C LENGTH 18.FIELD-SYMBOLS:<FS_DATA_FILED>,<FS_CONTENT_FIELD>.SELECT MARD~WERKS,MARD~LGORT,MARD~MATNR,MAKT~MAKTX,MARD~LABST,MARA~MEINSINTO TABLE @GT_DATA UP TO 200 ROWSFROM MARD INNER JOIN MARAON MARD~MATNR = MARA~MATNRLEFT OUTER JOIN MAKTON MARD~MATNR = MAKT~MATNRWHERE MAKT~SPRAS = @SY-LANGU.DESCRIBE TABLE GT_DATA LINES LV_ROW."填充数据行数DATA A1 TYPE I.CALL METHOD LCL_DOCUMENT->HAS_SPREADSHEET_INTERFACEEXPORTINGNO_FLUSH     = 'X'IMPORTING
*     ERROR        =IS_AVAILABLE = A1
*     RETCODE      =
    ."实例化SHEET对象CALL METHOD LCL_DOCUMENT->GET_SPREADSHEET_INTERFACEEXPORTINGNO_FLUSH        = 'X'IMPORTING
*     ERROR           =SHEET_INTERFACE = LCL_SHEET
*     RETCODE         =
    ."选中SHEET1CALL METHOD LCL_SHEET->SELECT_SHEETEXPORTINGNAME     = 'Sheet1'NO_FLUSH = 'X'
*  IMPORTING
*     ERROR    =
*     RETCODE  =
    .
*CALL METHOD LCL_SHEET->GET_ACTIVE_SHEET
*  EXPORTING
*    NO_FLUSH  = 'X'
**  IMPORTING
**    SHEETNAME =
**    ERROR     =
**    RETCODE   =
*    ."创建一个左上角为第一行第一列,共计6列200行,名叫RANGE1的范围对象CALL METHOD LCL_SHEET->INSERT_RANGE_DIMEXPORTINGNO_FLUSH = 'X'NAME     = 'RANGE1'LEFT     = 1TOP      = 1ROWS     = LV_ROWCOLUMNS  = 6
*     UPDATING = -1
*     SHEETNAME = ''
*  IMPORTING
*     ERROR    =
*     RETCODE  =
    .LT_RANGE = VALUE #( ( NAME = 'RANGE1' ROWS = LV_ROW COLUMNS = '6' ) ).LOOP AT GT_DATA INTO GS_DATA.LV_COUNT_ROW = SY-TABIX.DO 6 TIMES.ASSIGN COMPONENT SY-INDEX OF STRUCTURE GS_DATA TO <FS_DATA_FILED>.LS_CONTENT-ROW = LV_COUNT_ROW.LS_CONTENT-COLUMN = SY-INDEX.IF SY-INDEX = 5.LV_LABST = <FS_DATA_FILED>.CONDENSE LV_LABST NO-GAPS.LS_CONTENT-VALUE = LV_LABST.ELSE.LS_CONTENT-VALUE = <FS_DATA_FILED>.ENDIF.APPEND LS_CONTENT TO LT_CONTENT.CLEAR LS_CONTENT.ENDDO.CLEAR GS_DATA.ENDLOOP."填充数据CALL METHOD LCL_SHEET->SET_RANGES_DATAEXPORTINGNO_FLUSH = 'X'RANGES   = LT_RANGECONTENTS = LT_CONTENT
*     UPDATING = -1
*     RANGESDEF =
*    IMPORTING
*     ERROR    =
*     RETCODE  =
    ."设置范围字体格式LT_FORMATTABLE = VALUE #( ( NAME = 'RANGE1' SIZE = 11 BOLD = 1 ALIGN = 1 ) )."RANGE1字体大小11 加粗 水平居中CALL METHOD LCL_SHEET->SET_RANGES_FORMATEXPORTINGFORMATTABLE = LT_FORMATTABLENO_FLUSH    = 'X'
*     UPDATING    = -1
*    IMPORTING
*     ERROR       =
*     RETCODE     =
    ."设置范围边框格式CALL METHOD LCL_SHEET->SET_FRAMEEXPORTINGRANGENAME = 'RANGE1'TYP       = '127'COLOR     = 1
*     NO_FLUSH  = ' '
*    IMPORTING
*     ERROR     =
*     RETCODE   =
    ."设置列自动优化CALL METHOD LCL_SHEET->FIT_WIDESTEXPORTINGNO_FLUSH = 'X'NAME     = 'RANGE1'
*    IMPORTING
*     ERROR    =
*     RETCODE  =
    ."更改SHEET名称CALL METHOD LCL_SHEET->SET_SHEET_NAMEEXPORTINGNEWNAME  = '可用库存清单'OLDNAME  = 'Sheet1'NO_FLUSH = 'X'
*    IMPORTING
*     ERROR    =
*     RETCODE  =
    ."保存文件(该方法会自动默认保存到c盘用户文件下的文档文件夹中)CALL METHOD LCL_DOCUMENT->SAVE_ASEXPORTINGFILE_NAME = '可用库存清单'NO_FLUSH  = 'X'
*     PROMPT_USER = ' '
*     IMPORTING
*     ERROR     =
*     RETCODE   =
    .ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.SET PF-STATUS 'STANDARD'.SET TITLEBAR 'DOI TEST'."实例化容器PERFORM FRM_CONTAINER."创建容器控制器PERFORM FRM_CONTAINER_CONTROL."创建EXCEL文档PERFORM FRM_CREATE_EXCEL."填充数据PERFORM FRM_SET_DATA.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
"退出时释放实例。IF LCL_DOCUMENT IS NOT INITIAL.CALL METHOD LCL_DOCUMENT->CLOSE_DOCUMENT.ENDIF.IF LCL_CONTAINER IS NOT INITIAL.CALL METHOD LCL_CONTAINER->FREE.ENDIF.IF LCL_CONTROL IS NOT INITIAL.CALL METHOD LCL_CONTROL->DESTROY_CONTROL.FREE LCL_CONTROL.ENDIF.LEAVE PROGRAM.
ENDMODULE.

转载于:https://www.cnblogs.com/jianglaizhen/p/8779036.html

(原创)不带模板的DOI输出EXCEL相关推荐

  1. DOI输出excel单元格的填充颜色修改

    DOI输出excel单元格的时候修改填充颜色. *定义部分 DATA: GV_ITEM_URL(256), " 存放模板的URL .GV_INPLACE TYPE C VALUE 'X',G ...

  2. doi输出Excel的demo

    需求是通过doi的方式,输出报表,代码如下. REPORT ZFIR_015 NO STANDARD PAGE HEADING LINE-SIZE 120 MESSAGE-ID ZFI_01.INCL ...

  3. MFC输出EXCEL文档的过程总结

    于目前的工作内容涉及到了几处需要输出EXCEL表格的内容,因此在网上也查找了些资料,在下面总结下,以方便使用: 1.当你输出的内容已经在输出的时候全部知道,并且输出格式已经固定,那么你就可以使用下面的 ...

  4. 三步搞定ABAP DOI操作EXCEL

    ---------------------------------------------------前言----------------------------------------------- ...

  5. java手动/按模板生成word与excel

    目录 一.前言 二.生成word 1.使用Apache poi手动生成一个word (1)导入依赖 (2)手动生成一个包含表格的word 2.使用Apache poi 按模板生成一个简单的word ( ...

  6. C#基于Npoi通过特性的方式导出简单数据到Excel或基于特性以及基于Excel模板导出数据到Excel以及从Excel中把数据导入到对象中

    导出数据到Excel表格以及从Excel表格中读取数据是我们日常开发很多情况都会遇到的,这里或许只是导出一些简单的数据到excel,这里或许会按照一定的模板导出数据到excel,这里也可能需要从Exc ...

  7. 迪杰斯特拉--- 模板(求最短路径/输出路径/所有路径都可以走的做法)

    迪杰斯特拉--- 模板(求最短路径/输出路径/所有路径都可以走的做法) 1.0版 #include <iostream> using namespace std;const int max ...

  8. java导出数据到excel模板_springboot+jxls 根据Excel模板 填写数据并导出

    项目结构 pom.xml net.sf.jxls jxls-core 1.0.6compile 学生信息表模板: ExcelUtiles package cn.bdqn.utils;import ne ...

  9. Asp.net输出Excel文件并且下载该文件以及某些细节问题解决

    使用asp.net输出Excel文件并且下载,网上资源很多 我也是参照网上资源写的 简单流程,就是页面上方一个datagrid控件或者gridview控件,后来绑定数据到控件上,然后输出控件呈现的ht ...

最新文章

  1. 计算机视觉系列最新论文(附简介)
  2. 零知识证明实践教程,第一部分
  3. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
  4. 【消息中间件】Spring整合RabbitMQ
  5. 计算机视觉与深度学习 | ORB特征匹配:基于OpenCV+Python(暴力匹配、FLANN)
  6. 牛腩新闻发布系统——初探CSS
  7. [李景山php]每天TP5-20170111|thinkphp5-Model.php-4
  8. 微信封杀百度红包;刘强东新开公司;库克“iPhone 表现不好”| 极客头条
  9. 【开发随笔】以强化学习环境 gym 库为例:为什么日常中我应该试图标准化接口?
  10. js调整数组某些元素到指定位置顺序_如何在JS数组特定索引处指定位置插入元素?...
  11. POJ 2488 A Knight's Journey
  12. 中国首个“微信身份证”是怎么做到人脸识别误判率百万分之一的?
  13. 解决click事件在移动端操作延迟300ms问题和点击时穿透问题
  14. java获取京东token_京东宙斯平台使用方法(accesstoken,appkey,appsecret参数和SDK的获取)...
  15. 艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?
  16. 【SLAM】SLAM如何发论文?做SLAM怎么发论文
  17. 开题报告写作攻略--概述及国内外研究现状
  18. 约瑟夫环代码展示,以及理解约瑟夫环
  19. 论文pytorch-CycleGAN-and-pix2pix
  20. SolidWorks添加焊件库的方法

热门文章

  1. 使用openssl给web站点颁发证书
  2. 从易于扩展扩展的角度来设计FizzBuzzWhizz
  3. 浅谈 PHP 神盾的解密过程
  4. 程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理 - by Glede
  5. jdbc连接oracle rac服务器
  6. 被国人误解了千年的七句话之相濡以沫
  7. 味道不错的NBearLite查询语法
  8. CVT1100 错误的修复 2009-10-12 11:38
  9. MAC配置DNS服务器
  10. [模板]tarjan求强连通分量