(原创)不带模板的DOI输出EXCEL
前面介绍了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相关推荐
- DOI输出excel单元格的填充颜色修改
DOI输出excel单元格的时候修改填充颜色. *定义部分 DATA: GV_ITEM_URL(256), " 存放模板的URL .GV_INPLACE TYPE C VALUE 'X',G ...
- doi输出Excel的demo
需求是通过doi的方式,输出报表,代码如下. REPORT ZFIR_015 NO STANDARD PAGE HEADING LINE-SIZE 120 MESSAGE-ID ZFI_01.INCL ...
- MFC输出EXCEL文档的过程总结
于目前的工作内容涉及到了几处需要输出EXCEL表格的内容,因此在网上也查找了些资料,在下面总结下,以方便使用: 1.当你输出的内容已经在输出的时候全部知道,并且输出格式已经固定,那么你就可以使用下面的 ...
- 三步搞定ABAP DOI操作EXCEL
---------------------------------------------------前言----------------------------------------------- ...
- java手动/按模板生成word与excel
目录 一.前言 二.生成word 1.使用Apache poi手动生成一个word (1)导入依赖 (2)手动生成一个包含表格的word 2.使用Apache poi 按模板生成一个简单的word ( ...
- C#基于Npoi通过特性的方式导出简单数据到Excel或基于特性以及基于Excel模板导出数据到Excel以及从Excel中把数据导入到对象中
导出数据到Excel表格以及从Excel表格中读取数据是我们日常开发很多情况都会遇到的,这里或许只是导出一些简单的数据到excel,这里或许会按照一定的模板导出数据到excel,这里也可能需要从Exc ...
- 迪杰斯特拉--- 模板(求最短路径/输出路径/所有路径都可以走的做法)
迪杰斯特拉--- 模板(求最短路径/输出路径/所有路径都可以走的做法) 1.0版 #include <iostream> using namespace std;const int max ...
- java导出数据到excel模板_springboot+jxls 根据Excel模板 填写数据并导出
项目结构 pom.xml net.sf.jxls jxls-core 1.0.6compile 学生信息表模板: ExcelUtiles package cn.bdqn.utils;import ne ...
- Asp.net输出Excel文件并且下载该文件以及某些细节问题解决
使用asp.net输出Excel文件并且下载,网上资源很多 我也是参照网上资源写的 简单流程,就是页面上方一个datagrid控件或者gridview控件,后来绑定数据到控件上,然后输出控件呈现的ht ...
最新文章
- 计算机视觉系列最新论文(附简介)
- 零知识证明实践教程,第一部分
- 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
- 【消息中间件】Spring整合RabbitMQ
- 计算机视觉与深度学习 | ORB特征匹配:基于OpenCV+Python(暴力匹配、FLANN)
- 牛腩新闻发布系统——初探CSS
- [李景山php]每天TP5-20170111|thinkphp5-Model.php-4
- 微信封杀百度红包;刘强东新开公司;库克“iPhone 表现不好”| 极客头条
- 【开发随笔】以强化学习环境 gym 库为例:为什么日常中我应该试图标准化接口?
- js调整数组某些元素到指定位置顺序_如何在JS数组特定索引处指定位置插入元素?...
- POJ 2488 A Knight's Journey
- 中国首个“微信身份证”是怎么做到人脸识别误判率百万分之一的?
- 解决click事件在移动端操作延迟300ms问题和点击时穿透问题
- java获取京东token_京东宙斯平台使用方法(accesstoken,appkey,appsecret参数和SDK的获取)...
- 艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?
- 【SLAM】SLAM如何发论文?做SLAM怎么发论文
- 开题报告写作攻略--概述及国内外研究现状
- 约瑟夫环代码展示,以及理解约瑟夫环
- 论文pytorch-CycleGAN-and-pix2pix
- SolidWorks添加焊件库的方法