SAP_DOi测试_操作实现与程序设计_获得EXCEL选中cell的数据
2014-08-17 12:33
253 查看
SAP中DOI获得Excel选中CELL的数据
我的实现操作步骤:
DOI导出excel操作文档
By 程旺
目录
1技术说明...
1
步骤总览...
1
2技术实现...
2
2.1 上传模板到系统中...
2
3程序设计...
4
3.1.top模块...
4
3.2 screen 模块...
6
3.3 form模块...
6
3.5 PAI模块...
13
4.程序运行测试...
14
1技术说明
Desktop Office Integration(doi) 是用来集成支持OLE2的应用程序到SAP系统中.它提供了OO的操作方法对应用程序如EXCEL,WORLD等进行打开,修改等操作.目前在一个报表中使用EXCEL作为模板上传,然后将数据填充到EXCEL模板中的指定位置中. 本文档讲述我的第一个doi测试过程。[在此测试中,需要创建一个屏幕,再将控件导入,然后通过class的方法填充模板]2技术实现
2.1 上传模板到系统中 t_code:oaor
图2.1.1设置相应导入信息[程序中需要的参数]这里注意:
CLASS NAME: HRFPM_EXCEL_STANDARD(一般sap有的,可以自己定义 T-CODE:SBDSV1)
我自己在BP6上也定义了一个,但是,我还是用系统的。
如果选择自定义class 步骤如下:
T-CODE:SBDSV1
图2.1.2 自定义class
点击新条目
图2.1.3设置好后保存
图2.1.4选择导入[回到图2.1选择运行后进入]
图2.1.5 导入成功
双击table template如果能够出现模板文件,那么就是导入木板成功了。如下图
然后编写相应的程序程序运行后:
3程序设计
3.1.top模块
相关变量/类型/内表的定义*&---------------------------------------------------------------------*
*& 包括 Z2014CW_TESTDOI_TOP
*&---------------------------------------------------------------------*
TABLES: MAKT."测试表
*&---------------------------------------------------------------------*
*& 定义相关变量
*&---------------------------------------------------------------------*
DATA: DOCUMENT_NAME(30) VALUE '程旺_DOI测试',
ACTIVE_SHEET(50) VALUE 'Sheet1'.
CONSTANTS INPLACE VALUE 'X'.
"定义必须的几个内表/变量--》参考系统结构【在后面的各个方法需要】
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.
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), ALREADY_DONE, NEWNAME(40).
DATA DOCUMENT_TYPE(80).
DATA: EXCEL(80) VALUE 'Excel.Sheet'.
DATA: LINE_COUNT TYPE I,
COLUMN_COUNT TYPE I.
DATA: OK_CODE LIKE SY-UCOMM.
"定义测试内表
DATA: BEGIN OF GT_MAKT OCCURS 0.
INCLUDE STRUCTURE MAKT.
DATA: END OF GT_MAKT.
3.2 screen 模块
*&---------------------------------------------------------------------**& 包括 Z2014CW_TESTDOI_SCREEN
*&---------------------------------------------------------------------*
START-OF-SELECTION.
SELECT-OPTIONS MATNR FOR MAKT-MATNR.
CALL SCREEN 100.
3.3 form模块
*&---------------------------------------------------------------------**& 包括 Z2014CW_TESTDOI_FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GETDATA.
SELECT *
FROM MAKT
INTO TABLE GT_MAKT
WHERE MAKT~MATNR IN MATNR.
ENDFORM. " getdata
*———————————————————————*
* FORM create_basic_objects 将用到的模板参数都传入
*———————————————————————*
FORM CREATE_BASIC_OBJECTS USING P_APP_NAME
P_CLASSNAME
P_CLASSTYPE
P_OBJ_KEY
P_DOCNAME.
DATA L_APP_NAME(200).
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.
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 'Z2014CW_WORK013'.
CHECK INITIALIZED IS INITIAL.
* 处理参数
IF P_APP_NAME IS INITIAL.
L_APP_NAME = 'R/3 Reporter'.
ELSE.
L_APP_NAME = P_APP_NAME.
ENDIF.
"如果已经在pbo中重新设置三个参数
IF NOT ( P_CLASSNAME IS INITIAL OR P_CLASSTYPE IS INITIAL
OR P_OBJ_KEY IS INITIAL ).
"
DOC_CLASSNAME = P_CLASSNAME.
DOC_CLASSTYPE = P_CLASSTYPE.
DOC_OBJECT_KEY = P_OBJ_KEY.
ENDIF.
"没有重新设定参数
* 创建容器控制器实例
CALL METHOD C_OI_CONTAINER_CONTROL_CREATOR=>GET_CONTAINER_CONTROL
IMPORTING
CONTROL = CONTROL "CONTROL TYPE REF TO I_OI_CONTAINER_CONTROL,
ERROR = ERROR.
CALL METHOD ERROR->RAISE_MESSAGE
EXPORTING
TYPE = 'E'.
*&--------------------------------------------------------------------*
*&* 创建屏幕上的容器对象
*&--------------------------------------------------------------------*
CREATE OBJECT CONTAINER
EXPORTING
CONTAINER_NAME = 'SCREEN_DOI'."创建的屏幕容器实例
* 初始化容器控制器
CALL METHOD CONTROL->INIT_CONTROL
EXPORTING
R3_APPLICATION_NAME = L_APP_NAME "文件名传入
INPLACE_ENABLED = INPLACE "X
INPLACE_SCROLL_DOCUMENTS = 'X'
PARENT = CONTAINER "容器实例
REGISTER_ON_CLOSE_EVENT = 'X'
REGISTER_ON_CUSTOM_EVENT = 'X'
NO_FLUSH = 'X'
IMPORTING
ERROR = ERRORS. "返回错误消息【type I_OI_ERROR】
APPEND ERRORS.
CLEAR ITEM_URL.
WA_DOC_SIGNATURE-PROP_NAME = 'DESCRIPTION'.
DOCUMENT_TYPE = EXCEL.
WA_DOC_SIGNATURE-PROP_VALUE = P_DOCNAME.
APPEND WA_DOC_SIGNATURE TO DOC_SIGNATURE.
* BDS对象实例化
CREATE OBJECT BDS_INSTANCE.
* 读取BDS内容(模板) ”将三个参数传入--》HRFPM_EXCEL_STANDARD 、 OT 、 Z2014CW_WORK013
CALL METHOD BDS_INSTANCE->GET_INFO
EXPORTING
CLASSNAME = DOC_CLASSNAME
CLASSTYPE = DOC_CLASSTYPE
OBJECT_KEY = DOC_OBJECT_KEY
CHANGING
COMPONENTS = DOC_COMPONENTS
SIGNATURE = DOC_SIGNATURE.
* 读取BDS的URL
CALL METHOD BDS_INSTANCE->GET_WITH_URL
EXPORTING
CLASSNAME = DOC_CLASSNAME
CLASSTYPE = DOC_CLASSTYPE
OBJECT_KEY = DOC_OBJECT_KEY
CHANGING
URIS = DOC_URIS
SIGNATURE = DOC_SIGNATURE.
FREE BDS_INSTANCE.
READ TABLE DOC_URIS INTO WA_DOC_URIS INDEX 1.
ITEM_URL = WA_DOC_URIS-URI.
* ask the SAP DOI container for a i_oi_document_proxy for Excel
* 容器控制器获得一个EXCEL文档代理
CALL METHOD CONTROL->GET_DOCUMENT_PROXY
EXPORTING
DOCUMENT_TYPE = 'Excel.Sheet'
NO_FLUSH = 'X'
IMPORTING
DOCUMENT_PROXY = DOCUMENT
ERROR = ERRORS.
APPEND ERRORS.
* open a document saved in business document service.
* 容器控制器中打开指定BDS返回的文档
CALL METHOD DOCUMENT->OPEN_DOCUMENT
EXPORTING
OPEN_INPLACE = INPLACE
DOCUMENT_URL = ITEM_URL.
DATA: HAS TYPE I.
CALL METHOD DOCUMENT->HAS_SPREADSHEET_INTERFACE
EXPORTING
NO_FLUSH = ''
IMPORTING
IS_AVAILABLE = HAS
ERROR = ERRORS.
APPEND ERRORS.
CALL METHOD DOCUMENT->GET_SPREADSHEET_INTERFACE
EXPORTING
NO_FLUSH = ' '
IMPORTING
SHEET_INTERFACE = SPREADSHEET
ERROR = ERRORS.
APPEND ERRORS.
* Activate sheet
CALL METHOD SPREADSHEET->SELECT_SHEET
EXPORTING
NAME = ACTIVE_SHEET
NO_FLUSH = ''
IMPORTING
ERROR = ERRORS.
APPEND ERRORS.
*错误处理
LOOP AT ERRORS.
CALL METHOD ERRORS->RAISE_MESSAGE
EXPORTING
TYPE = 'S'.
ENDLOOP.
FREE ERRORS.
INITIALIZED = 'X'.
ENDFORM. "' CREATE_BASIC_OBJECTS
*———————————————————————*
* FORM output_to_excel excel导出 *
*———————————————————————*
FORM OUTPUT_TO_EXCEL.
PERFORM GETDATA.
"---------------------9月1日 0:07我注释的
"测试的时候,可以把哪一列要显示什么参数设置
*DATA: TMPDATE(10) TYPE C.
*COLUMN_COUNT = 2."第二列
*
* LINE_COUNT = 2."第二行
* PERFORM FILL_CELL USING LINE_COUNT
* COLUMN_COUNT
* 'TEST1'.
* LINE_COUNT = LINE_COUNT + 1."第三行
* PERFORM FILL_CELL USING LINE_COUNT
* COLUMN_COUNT
* 'TEST2'.
* COLUMN_COUNT = COLUMN_COUNT + 1."第三列
* PERFORM FILL_CELL USING LINE_COUNT
* COLUMN_COUNT
* 'ljc'.
"--------------------------------
* call METHOD spreadsheet->PROTECT【这里需要注释】
* EXPORTING
* protect = 'X'.
"=============================
DATA: TMPDATE(10) TYPE C.
" COLUMN_COUNT = 1."第1列
LINE_COUNT = 1."第二行开始 注意行列
"DATA NUM TYPE I VALUE 1.
LOOP AT GT_MAKT."这里我用的是带表头的内表 type structure makt
LINE_COUNT = LINE_COUNT + SY-TABIX.
PERFORM FILL_CELL USING LINE_COUNT 1 GT_MAKT-MATNR.
PERFORM FILL_CELL USING LINE_COUNT 2 GT_MAKT-SPRAS.
PERFORM FILL_CELL USING LINE_COUNT 3 GT_MAKT-MAKTX.
PERFORM FILL_CELL USING LINE_COUNT 4 GT_MAKT-MAKTG.
LINE_COUNT = 1.
ENDLOOP.
ENDFORM. "output_to_excel
*———————————————————————*
* FORM fill_cell
* txt 对excel行列数据在form OUTPUT_TO_EXCEL进行设置后 在这里填充 *
*———————————————————————*
FORM FILL_CELL USING I J VAL.
DATA: COLUMNS_NUMBER TYPE I,
ROWS_NUMBER TYPE I.
COLUMNS_NUMBER = 1.
ROWS_NUMBER = 1.
CALL METHOD SPREADSHEET->INSERT_RANGE_DIM
EXPORTING
NAME = 'cell'
NO_FLUSH = 'X'
TOP = I
LEFT = J
ROWS = ROWS_NUMBER
COLUMNS = COLUMNS_NUMBER
IMPORTING
ERROR = ERRORS.
APPEND ERRORS.
REFRESH: RANGES, EXCEL_INPUT.
RANGEITEM-NAME = 'cell'.
RANGEITEM-COLUMNS = 1.
RANGEITEM-ROWS = 1.
APPEND RANGEITEM TO RANGES.
EXCEL_INPUT_WA-COLUMN = 1.
EXCEL_INPUT_WA-ROW = 1.
EXCEL_INPUT_WA-VALUE = VAL.
APPEND EXCEL_INPUT_WA TO EXCEL_INPUT.
* 设置数据
CALL METHOD SPREADSHEET->SET_RANGES_DATA
EXPORTING
RANGES = RANGES
CONTENTS = EXCEL_INPUT
NO_FLUSH = 'X'
IMPORTING
ERROR = ERRORS.
APPEND ERRORS.
CALL METHOD SPREADSHEET->FIT_WIDEST
EXPORTING
NAME = SPACE
NO_FLUSH = 'X'.
REFRESH: RANGES, EXCEL_INPUT.
ENDFORM. "fill_cell
3.4 PBO模块
*&-------------------------------------------------------------------
*& 包括 Z2014CW_TESTDOI_PBO
*&-------------------------------------------------------------------
*&——————————————————————-
*& Module OUTPUT_TO_EXCEL OUTPUT
*&——————————————————————-
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'CW_GUI_DOI'.
* 创建EXCEL模板
PERFORM CREATE_BASIC_OBJECTS USING '' '' '' '' DOCUMENT_NAME.
* 输出EXCEL
PERFORM OUTPUT_TO_EXCEL.
ENDMODULE. "' OUTPUT_TO_EXCEL OUTPUT
3.5 PAI模块
*&-------------------------------------------------------------------*& 包括 Z2014CW_TESTDOI_PAI
*&-------------------------------------------------------------------
*&———————————————————————*
*& Module EXIT INPUT
*&———————————————————————*
MODULE USER_COMMAND_0100 INPUT.
*释放对象
IF NOT DOCUMENT IS INITIAL.
CALL METHOD DOCUMENT->CLOSE_DOCUMENT.
FREE DOCUMENT. "type I_OI_DOCUMENT_PROXY
ENDIF.
IF NOT CONTROL IS INITIAL.
CALL METHOD CONTROL->DESTROY_CONTROL.
FREE CONTROL. "type I_OI_CONTAINER_CONTROL
ENDIF.
SET SCREEN 0 .
ENDMODULE. " EXIT INPUT
4.程序运行测试
测试后,那么我们就用doi已经把Excel窗口当作一个片屏幕空间放入了屏幕的容器中。还有很多不足,大家可以通过
http://help.sap.com/saphelp_nw70/helpdata/en/78/6e5ba3994b11d1bcb3080009b4534c/content.htm?frameset=/en/e0/9424f2f16e11d2bdd8080009b4534c/frameset.htm¤t_toc=/en/e9/0bee9f408e11d1893b0000e8323c4f/plain.htm&node_id=5
查看有些概念。希望大家共同学习与完善。
相关文章推荐
- ThinkPHP 整合 PHPExcel ,数据导出功能实现,解决Invalid cell coordinate PHPExcel想必大家都不陌生,是用来操作Office Excel 文档的一个PHP
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表
- javascript实现客户端用户操作Excel文档数据导出
- sap doi技术操作excel的方法
- java操作Excel之POI(6)使用POI实现使用模板批量添加数据
- R语言实现Excel数据的读取操作
- BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
- php操作EXCLE(通过phpExcle实现向excel写数据)
- 从excel文件中获得数据,实现网站的批量查询数据功能
- java操作Excel之POI(4)利用POI实现数据的批量导出
- POI实现超大数据的Excel的读写操作,支持Excel最大行数。
- php操作EXCLE(通过phpExcle实现读excel数据)
- 单元测试、自动化测试、接口测试过程中的Excel数据驱动(java实现)
- java操作Excel之POI(5)利用POI实现使用模板批量导出数据
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表
- 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
- 基于半边数据结构(翼边数据结构)的Eular操作来实现扫成 通过OpenGL进行CAD实体建模 经测试可直接运行
- C#实现几十万级数据导出Excel及Excel各种操作实例
- Java程序员从笨鸟到菜鸟之(一百零五)java操作office和pdf文件(三)利用jxl实现数据导出excel报表以及与POI的区别
- python实现对excel进行数据剔除操作实例