三步搞定ABAP DOI操作EXCEL

1 篇文章 0 订阅

---------------------------------------------------前言---------------------------------------------------------------------------------

ABAP可以使用OLE与DOI两种方式实现操作EXCEL。使用OLE时,每个单元格的值和样式都需要写代码实现,特别是对于不规则的格式, 代码量巨大. 而DOI是从服务器已经上传的EXCEL模板中下载模板然后打开修改实现数据保存。当然,也可以直接创建新的EXCEL文件往里面传递数据并设置格式(这样好像又走回老路了,不是我们要的, OLE与DOI的区别就好像是面向过程与面向对象的区别).

简单来说,DOI操作EXCEL主要有以下几步:

准备工作:上传Excel模板

第一步:下载Excel到本地

第二步:打开Excel文档

第三步:   写入数据

 ----------------------------------------------------正文-------------------------------------------------------------------------------------

准备工作:上传Excel模板:

1.输入Tcode: smw0 如图所示:


2.选择二进制数据选择,回车后进入查询界面,包: MI


3.点击执行:进入显示列表,点击新建图标:


4.输入对象名称与描述后点击打开文件选择框,,选择文件后,会提示选择包,

 

好了,可以写代码了(复制可以直接运行,前提是已经上传模板),

REPORT  zr04_ole_templet.

DATA:c_export_filename_xls   TYPE string VALUE 'ZRRFQ01_1.XLS', "导出模板默认文件名 '数据导入模板'
           c_objid_xls                      
TYPE wwwdatatab-objid VALUE 'ZRRFQ01_1.XLS'.   "存放模板的对象id

DATA:  lo_objdata                       LIKE wwwdatatab,                                "Excel模板对象
             ls_destination               
LIKE rlgrap-filename                           ,"下载保存的目标路径
             lc_path                           
TYPE string,        "存储路径
             lc_fullpath                      
TYPE string,       "文件完整路径
             li_rc                                 
LIKE sy-subrc.   "返回值

DATA: excel_obj                         TYPE ole2_object,
           book_obj                         
TYPE ole2_object,
           sheet_obj                       
TYPE ole2_object,
           cell_obj                           
TYPE ole2_object.

START-OF-SELECTION.

第一步: 下载Excel到本地
  
PERFORM download_xls_template.

第二步:打开Excel文档
  
PERFORM open_excel.

第三步:   写入数据
  
PERFORM write_excel.

*&---------------------------------------------------------------------*
*&      Form  download_xls_template
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM download_xls_template.

* 获取保存路径
  
CALL METHOD cl_gui_frontend_services=>get_desktop_directory
    
CHANGING
      desktop_directory 
lc_path.
  
IF lc_path IS INITIAL.
    lc_path 
= 'C:\TEMP'.
  
ENDIF.
  
CONCATENATE lc_path '\' c_export_filename_xls INTO lc_fullpath.

*  检查模板是否存在
  
SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata
  
WHERE srtf2 = 0 AND relid = 'MI' AND objid c_objid_xls.
  
IF sy-subrc NE 0 OR lo_objdata-objid EQ space.
    
MESSAGE e000(zpp001) WITH c_export_filename_xls.
  
ENDIF.

*  下载模板
  ls_destination 
lc_fullpath.
  
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    
EXPORTING
      
key         = lo_objdata
      destination 
ls_destination
    
IMPORTING
      rc          
li_rc.
  
IF li_rc NE 0.
    
MESSAGE e001(zpp001) WITH c_export_filename_xls.
  
ENDIF.
ENDFORM.                    "download_xls_template


*&---------------------------------------------------------------------*
*&      Form  open_excel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM open_excel.

  
CREATE OBJECT excel_obj 'excel.APPLICATION'.
  
IF sy-subrc NE 0.
    
MESSAGE 'EXCEL创建错误' TYPE 'S' DISPLAY LIKE 'E'.
    
STOP.
  
ENDIF.
  
CALL METHOD OF excel_obj 'WORKBOOKS' = book_obj.
  
SET PROPERTY OF excel_obj 'VISIBLE' = 1.
  
SET PROPERTY OF excel_obj 'SheetsInNewWorkbook' = 1.

*  打开excel文件 , (新建使用:CALL METHOD OF book_obj 'Add'   = sheet_obj)
  
CALL METHOD OF  book_obj 'Open'   = sheet_obj
        
   EXPORTING  #1       ls_destination.
  
CALL METHOD OF  sheet_obj 'ACTIVATE'.
  
FREE OBJECT sheet_obj.  "OK
ENDFORM.                    "open_excel

*&---------------------------------------------------------------------*
*&      Form  write_excel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write_excel.
  
DATA: it_spfli LIKE spfli OCCURS 10 WITH HEADER LINE.
  
DATA: TYPE i. "行号
*取数据
  
SELECT FROM spfli INTO TABLE it_spfli UP TO 10 ROWS.
* 输出Excel表头,自定义格式的列等
  
PERFORM fill_cell USING 1 1 1 'Flug'(001).
  
PERFORM fill_cell USING 1 2 1 'Nr'(002).
  
PERFORM fill_cell USING 1 3 1 'Von'(003).
  
PERFORM fill_cell USING 1 4 1 'Nach'(004).
  
PERFORM fill_cell USING 1 5 1 'Zeit'(005).
* 复制数据到Excel,针对固定格式
  
LOOP AT it_spfli.
    h 
sy-tabix + 1.
    
PERFORM fill_cell USING 1 0 it_spfli-carrid.
    
PERFORM fill_cell USING 2 0 it_spfli-connid.
    
PERFORM fill_cell USING 3 0 it_spfli-cityfrom.
    
PERFORM fill_cell USING 4 0 it_spfli-cityto.
    
PERFORM fill_cell USING 5 0 it_spfli-deptime.
  
ENDLOOP.
  
FREE OBJECT cell_obj.
ENDFORM.                    "write_excel

*&---------------------------------------------------------------------*
*&      Form  FILL_CELL
*&---------------------------------------------------------------------*
*   row:  行号,
*   col:  列号,
*   bold: 字体是否加粗,0,否,1是.
*   val:  填充值
*----------------------------------------------------------------------*
FORM fill_cell  USING row col bold val.
  
CALL METHOD OF  excel_obj 'CELLS'   = cell_obj
    
EXPORTING  #1        = row  #2        = col.
  
SET PROPERTY OF cell_obj 'VALUE' = val.
  
FREE OBJECT cell_obj.
ENDFORM.                    "FILL_CELL


效果图:



  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我可以为您提供一个ABAP DOI输出Excel文件的完整示例代码。 在这个示例中,我们将使用ABAP DOI创建一个数据对象并将其导出到Excel文件中。下面是示例代码: ``` DATA: lo_doi TYPE REF TO if_doi, lo_obj TYPE REF TO zcl_my_data_object, lt_data TYPE STANDARD TABLE OF zcl_my_data_object, lr_excel TYPE REF TO cl_bcs_convert=>type_excel, ls_excel TYPE bcs_excel, lv_file TYPE string. * 创建 ABAP DOI 对象 CREATE OBJECT lo_doi. * 创建数据对象 lo_obj = lo_doi->create_transient( iv_class_name = 'ZCL_MY_DATA_OBJECT' iv_properties = VALUE #( ( name = 'ID' value = '001' ) ( name = 'TEXT' value = 'This is a sample text for my data object' ) ) ). * 将数据对象添加到内部表中 APPEND lo_obj TO lt_data. * 将数据导出到 Excel 文件 lr_excel = cl_bcs_convert=>create( cl_bcs_convert=>type_excel ). ls_excel-data = lt_data. ls_excel-sheetname = 'My Data Object'. lr_excel->add_data( ls_excel ). lv_file = 'C:\temp\my_data_object.xlsx'. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = lv_file TABLES data_tab = lr_excel->get_data( ). ``` 在这个示例中,首先创建了一个ABAP DOI对象lo_doi。然后定义了一个数据对象类型zcl_my_data_object,并使用create_transient方法创建了一个数据对象lo_obj,并设置了ID和TEXT属性的值。 接着将数据对象lo_obj添加到内部表lt_data中。然后使用CL_BCS_CONVERT类创建一个Excel导出对象lr_excel,并设置Excel文件名和工作表名称。 最后,将内部表lt_data导出到Excel文件中,并保存到本地磁盘上的文件lv_file中。这里使用了GUI_DOWNLOAD函数来实现文件下载。 希望这个示例能够帮助您理解如何使用ABAP DOI输出Excel文件。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值