zoukankan      html  css  js  c++  java
  • ABAP学习(8):操作EXCEL

    ABAP操作EXCEL

    1、EXCEL导入内表

    方式1:

        调用function,’F4_FILENAME’获取文件名。通过屏幕元素Prameter的帮助事件,弹出文件选择框,获取选择文件名。

        调用function,’TEXT_CONVERT_XLS_TO_SAP’,将选择excel数据放入内表。

    示例:

    TYPE-POOLS truxs.
    DATA:it_raw TYPE truxs_t_text_data.
    "定义一个内表来存储数据,内表的列数和要传得数据的列数要相同,其按照列来匹配传值
    DATA: BEGIN OF gt_data OCCURS 0,
         col1 TYPE char10,
         col2 TYPE char10,
          END OF gt_data.
    PARAMETERS:p_file TYPE rlgrap-filename.
    "调用F4_FILENAME,点击输入框后小方块弹出文件选择框
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
      CLEAR p_file.
      CALL FUNCTION 'F4_FILENAME'
        IMPORTING
          file_name = p_file."返回文件名
    
    *Excel传值
    START-OF-SELECTION.
      PERFORM exceltotab.
    
    FORM exceltotab .
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
      EXPORTING
    *  I_FIELD_SEPERATOR = ' '     "分隔符?
      i_line_header = 'X'         "是否去掉首行
      i_tab_raw_data = it_raw     "WORK TABLE
      i_filename = p_file
      TABLES
      i_tab_converted_data = gt_data[] "ACTUAL DATA
      EXCEPTIONS
      conversion_failed = 1
      OTHERS = 2.
    
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDFORM.                    "exceltotab

    方式2

    直接弹出文件选择弹窗,获取文件路径

    data: ts_files type filetable,
              rc         type i.
     refresh ts_files.
     DATA:filename(1024) type C.
    
     "调用方法,弹出文件选择框,获取选中文件路径
      call method  cl_gui_frontend_services=>file_open_dialog
        exporting
          window_title            = 'Select File'
          default_extension       = '*.xls'
          multiselection          = ' '    " Only one file
        changing
          file_table              = ts_files
          rc                      = rc
        exceptions
          file_open_dialog_failed = 1
          cntl_error              = 2
          error_no_gui            = 3
          not_supported_by_gui    = 4
          others                  = 5.
      read table ts_files into filename index 1

    自定义function:‘ALSM_EXCEL_TO_INTERNAL_TABLE’

     

    Structure:ALSMEX_TABLINE,其中VALUE字段类型为CHAR50,如果上传字段长度超过CHAR50,那么上传数据就会不全,所以我们需要自定义Function,修改ALSMEX_TABLINE的VALUE字段。

    自定义步骤:

    1.复制Sturcture:ALSMEX_TABLINE,自定义名字TEST_ALSMEX_TABLINE修改VALUE的数据类型,定义为需求长度;

    2.复制function:ALSM_EXCEL_TO_INTERNAL_TABLE,复制之前先创建目标Function group,不然会复制失败;

     

    3.在新建Function Group创建include: LZTEST_EXCELF01,将ALSMEX下,includes:LALSMEXF01内容复制到新建include。

     

     4.将ALSMEX下,includes:LALSMEXTOP内容复制到新建Function Group的includes:LZTEST_EXCELTOP中,然后检查,激活。

    示例:

    *      value of excel-cell
    TYPES: ty_d_itabvalue             TYPE alsmex_tabline-value,
    *      internal table containing the excel data
           ty_t_itab                  TYPE alsmex_tabline   OCCURS 0,

    5.修改TEST_EXCEL_TO_INTERNAL_TABLE,将INTERN参数对应数据类型修改为自定义的TEST_ALSMEX_TABLINE,将LZTEST_EXCELTOP中的ty_d_itabvalue和ty_t_itab对应的数据类型也修改为自定义类型。

     

    6.程序中调用function即可。

    示例:

     "将excel读取到内表'ALSM_EXCEL_TO_INTERNAL_TABLE'
      DATA :exceltab like alsmex_tabline OCCURS 10 WITH HEADER LINE.
      Data :filetest like rlgrap-filename VALUE 'D:test.xlsx'.
    *  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
      CALL FUNCTION 'TEST_EXCEL_TO_INTERNAL_TABLE'
        EXPORTING
          filename                = fileTest
          i_begin_col             = 1
          i_begin_row             = 1
          i_end_col               = 20
          i_end_row               = 20000
        TABLES
          intern                  = exceltab
        EXCEPTIONS
          inconsistent_parameters = 1
          upload_ole              = 2
          others                  = 3.

    2、OLE2操作EXCEL

    使用ABAP程序操作EXCEL,将内表数据写出到EXCEL

    OLE2方式操作EXCEL,OLE是将所有EXCEL中组成结构封装成一个ole2的类。通过ole2对象方法来操作Excel。

    1、类对象:lo_application:一个Excel;

    通过create object语句创建一个excel对象,

    CREATE OBJECT lo_application 'Excel.Application'.  "创建excel对象

    设置EXCEL的属性,是否可见:

    SET PROPERTY OF lo_application 'Visible' = 1.  "设置excel可见
    SET PROPERTY OF lo_application 'SheetsInNewWorkbook' = 1.

    2、类对象:lo_workbooks :工作簿集合;

    通过创建的excel对象,调用Workbooks方法,创建他的工作薄集,

    CALL METHOD OF lo_application 'Workbooks'  = lo_workbooks. "调用lo_application的'Workbooks'创建工作簿集

    3、类对象:lo_workbook:工作簿;

    通过创建的工作薄集对象,调用add方法,创建他的工作薄,

    CALL METHOD OF lo_workbooks   'Add'        = lo_workbook.  "调用lo_workbooks 的方法'Add' ,创建工作薄

    4、类对象:lo_worksheets:工作表,sheet集合;

        通过EXCEL对象的Sheets方法,创建sheet集合对象

    "创建一个sheet集合
    CALL METHOD OF lo_application 'Sheets' = lo_worksheets .
    "通过sheet集合对象,调用add方法,可以创建多个sheet对象。创建出的sheet对象调用Activate方法,可以激活。
    "创建新的work sheet. "默认创建的最新的sheet,处于active状态
    CALL METHOD OF lo_worksheets 'Add' = new_worksheet.
    *CALL METHOD OF new_worksheet 'Activate'.   "激活当前新的sheet

    5、类对象:lo_worksheet:工作表,sheet;

        通过EXCEL对象的Activesheet属性,可以获取到当前活动的sheet,这个sheet就是创建初始时,默认存在的sheet。

    GET PROPERTY OF lo_application 'ACTIVESHEET' = lo_worksheet.  "获取当前活动sheet,初始创建时,只有一个sheet,且active

         设置sheet的名称,设置sheet的属性name:

    SET PROPERTY OF lo_worksheet 'Name' = 'first sheet'. "设置sheet名

    6、类对象:lo_cell:excel单元格;

        通过sheet对象,调用方法Cells方法,在当前sheet中创建单元格对象。

    "创建单元格
    CALL METHOD OF lo_worksheet 'Cells' = lo_cell
       EXPORTING
       # = 1  "Row
       # = 1. "Column

        设置单元格对象属性value,为单元格赋值:

    SET PROPERTY OF lo_cell 'value' = ''.   "设置单元个值

       设置单元格对象属性NumberFormat,设置单元格数据格式:

    "设置单元格值格式,支持excel中的格式
    *SET PROPERTY OF lo_cell 'NumberFormat' = '0.00'.
    SET PROPERTY OF lo_cell 'NumberFormat' = 'm/d/yy'.

      设置单元格自动换列

    "特别长文字,自动换列,看到全部文字
     SET PROPERTY OF lo_cell 'WrapText' = 1.

      设置水平对齐方式

    "设置水平对齐方式
    "center =  -4108
    "left =  -4131
    "right =  -4152
    "top = -4160
    SET PROPERTY OF lo_cell 'HorizontalAlignment' = -4108.

    类对象:lo_font:字体设置对象,调用单元格对象的font方法,获取font对象,通过font对象设置单元格字体。

    "设置单元格字体
    CALL METHOD OF lo_cell 'font' = lo_font.
    "EXCEL支持的字体名
    *SET PROPERTY OF lo_font 'Name' = 'Agency FB'.   "字体名
    SET PROPERTY OF lo_font 'Name' = '微软正黑体'.   "字体名
    SET PROPERTY OF lo_font 'Size' = 15.        "大小
    "颜色数字规则?
    SET PROPERTY OF lo_font 'Color' = -12123441. "颜色
    SET PROPERTY OF lo_font 'TintAndShade' = 0. "明亮度-1~1,1完全透明
    SET PROPERTY OF lo_font 'Bold' = 0.  "是否粗体字 0 :false 1:true
    SET PROPERTY OF lo_font 'Italic' = 1. "是否斜体 0:false 1:true
    SET PROPERTY OF lo_font 'Underline' = 2. "xlUnderlineStyleSingle = 2,下划线

    类对象lo_interior,单元格背景;

    示例:

    通过单元格对象获取lo_interior对象,设置Color或者ColorIndex属性,设置背景颜色,两种方式都可。对应颜色值不清楚?

    "设置单元格背景
    DATA:lo_interior TYPE ole2_object.
    CALL METHOD OF lo_cell 'interior' = lo_interior.
    SET PROPERTY OF lo_interior 'Color' = 12123441.
    SET PROPERTY OF lo_interior 'ColorIndex' = 43.

    8、类对象:lo_range:多个单元格集合;

    选择多个单元格集合。

    示例:

    选择单元格(1,1)到(3,3)这部分区域:

    "选择Ranges of cells
    CALL METHOD OF lo_worksheet 'Cells' = lo_cellstart
      EXPORTING
        # = 1 "row
        # = 1. "column
    CALL METHOD OF lo_worksheet 'Cells' = lo_cellend
      EXPORTING
        # = 3 "row
        # = 3. "column
    "选中一个区域Cell
    CALL METHOD OF lo_worksheet 'RANGE' = lo_range
      EXPORTING
        # = lo_cellstart
        # = lo_cellend.

    也可以选中一行或者一列单元格:

    类对象:lo_column:excel行

    "选择列
    CALL METHOD OF lo_worksheet 'Columns' = lo_column
      EXPORTING
        # = 1.

    类对象:lo_row:excel列

    "选择行
    CALL METHOD OF lo_worksheet 'Row' = lo_row
      EXPORTING
        # = 2.

    如果要操作选择部分区域需要lo_selection对象

    类对象:lo_selection,选中操作对象

    "获取选中区域selection
    CALL METHOD OF lo_row 'Select'.
    CALL METHOD OF lo_application 'selection' = lo_selection.

    9、类对象:lo_validation:验证操作validation对象;

    示例:测试失败?

    "添加验证
    "选中(4,4)
    CALL METHOD OF lo_worksheet 'Cells' = lo_cell
      EXPORTING
        # = 4
        # = 4.
    "获取选中区域selection
    CALL METHOD OF lo_cell 'Select'.
    CALL METHOD OF lo_application 'selection' = lo_selection.
    "获取验证对象lo_validation
    CALL METHOD OF lo_selection 'Validation' = lo_validation.
    "添加验证规则
    CALL METHOD OF lo_validation 'Add'
      EXPORTING
        #1 = 4 "验证类型Type 4 = xlValidateDate,验证日期
        #2 = 1 "验证弹窗类型AlertStype  1 = xlValidAlertStop
        #3 = 1 "操作类型,Operator  1 = xlBetween,在之间
        #4 = '1/1/2000'   "Formula1
        #5 = '1/1/2010'.  "Formula2
    
    "设置错误信息
    SET PROPERTY OF lo_validation 'ErrorMessage' = 'Enter a valid date'.

    10、使用复制粘贴方式将内表数数据写入EXCEL

    示例:

    "复制粘贴方式将数据写入EXCEL
    CALL METHOD OF lo_worksheet 'Activate'.   "激活当前新的sheet
    DATA:test_spfli LIKE TABLE OF spfli WITH HEADER LINE.
    TYPES: ty_data(1500) TYPE c.
    DATA: lt_data TYPE ty_data OCCURS 0 WITH HEADER LINE.
    DATA:lv_cont TYPE I.
    FIELD-SYMBOLS: <field>  TYPE ANY.
    SELECT * FROM spfli INTO TABLE test_spfli.
    * Prepare the data before copy to clipboard;
    LOOP AT test_spfli.
      lv_cont = 1.
    *    Write for example 5 columns per row.
      DO 5 TIMES.
        ASSIGN COMPONENT lv_cont OF STRUCTURE test_spfli TO <field>.
        "使用#将数据链接起来,数据格式#xxx#xxxx#xxxx
        CONCATENATE lt_data <field> INTO lt_data SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
        ADD 1 TO lv_cont.
      ENDDO.
    
      "去掉开始#号
      SHIFT lt_data BY 1 PLACES LEFT.
      APPEND lt_data.
      CLEAR lt_data.
    ENDLOOP.
    * Copy to clipboard into ABAP
    CALL FUNCTION 'CONTROL_FLUSH'
      EXCEPTIONS
        OTHERS = 3.
    CALL FUNCTION 'CLPB_EXPORT'
      TABLES
        data_tab   = lt_data
      EXCEPTIONS
        clpb_error = 1
        OTHERS     = 2.
    * Select the cell A1
    CALL METHOD OF
        lo_worksheet
        'Cells'      = lo_cell
      EXPORTING
        #1           = 1  "Row
        #2           = 1. "Column
    * Paste clipboard from cell A1
    CALL METHOD OF
        lo_cell
        'SELECT'.
    CALL METHOD OF
        lo_worksheet
        'PASTE'.
    
    "调用lo_workbook 'SaveAs' 方法保存excel
    CALL METHOD OF lo_workbook 'SaveAs'
      EXPORTING
        # = lv_complete_path.
    if sy-subrc = 0.
      MESSAGE 'File downloaded successfully' TYPE 'S'.
    ELSE.
      MESSAGE 'Error downloading the file' TYPE 'E'.
    ENDIF.

    完整示例:

    TYPE-POOLS: soi,ole2.
    DATA: lo_application TYPE  ole2_object,  "代表excel对象
       lo_workbook   TYPE  ole2_object,  "代表excel工作薄
       lo_workbooks TYPE  ole2_object,  "代表excel工作薄集合
       lo_range TYPE  ole2_object,  "代表多个单元格集合
       lo_worksheet TYPE ole2_object,  "代表excel工作表sheet
       lo_worksheets TYPE ole2_object,  "代表excel工作表sheet集合
       lo_column  TYPE  ole2_object,  "代表excel列
       lo_row   TYPE  ole2_object,  "代表excel行
       lo_cell  TYPE  ole2_object,  "代表excel单元格
       lo_font  TYPE  ole2_object.  "代表字体
    
    DATA: lo_cellstart      TYPE ole2_object,
          lo_cellend        TYPE ole2_object,
          lo_selection      TYPE ole2_object,
          lo_validation     TYPE ole2_object.
    
    DATA: lv_selected_folder TYPE string,
          lv_complete_path   TYPE char256,
          lv_titulo          TYPE string .  "弹窗描述
    
    DATA: new_worksheet TYPE ole2_object. "新sheet
    
    "调用文件路径选择框,默认路径C:\
    CALL METHOD cl_gui_frontend_services=>directory_browse
      EXPORTING
        window_title    = lv_titulo   "弹窗最上方,可以添加描述信息,不是弹窗标题
        initial_folder  = 'C:\'       "初始化选择路径
      CHANGING
        selected_folder = lv_selected_folder  "返回选择路径
      EXCEPTIONS
        cntl_error      = 0
        error_no_gui    = 1
        OTHERS          = 2.
    "检查是否获取到路径
    CHECK NOT lv_selected_folder IS INITIAL.
    
    DATA:str_len TYPE I.
    DATA:temp_sign(1) TYPE C.
    str_len = STRLEN( lv_selected_folder ) - 1.
    temp_sign = lv_selected_folder+str_len(1).
    
    if temp_sign = '\'.
      "确定保存路径
      CONCATENATE lv_selected_folder 'Test' INTO lv_complete_path.
    else.
      "确定保存路径
      CONCATENATE lv_selected_folder '\Test' INTO lv_complete_path.
    ENDIF.
    
    
    "创建excel对象
    CREATE OBJECT lo_application 'Excel.Application'.  "创建excel对象
    SET PROPERTY OF lo_application 'Visible' = 1.  "设置excel可见
    SET PROPERTY OF lo_application 'SheetsInNewWorkbook' = 1.
    
    "创建workbook
    CALL METHOD OF lo_application 'Workbooks'  = lo_workbooks. "调用lo_application的'Workbooks'创建工作簿集
    CALL METHOD OF lo_workbooks   'Add'        = lo_workbook.  "调用lo_workbooks 的方法'Add' ,创建工作薄
    
    GET PROPERTY OF lo_application 'ACTIVESHEET' = lo_worksheet.  "获取当前活动sheet,初始创建时,只有一个sheet,且active
    SET PROPERTY OF lo_worksheet 'Name' = 'first sheet'. "设置sheet名
    
    "创建一个sheet集合
    CALL METHOD OF lo_application 'Sheets' = lo_worksheets .
    
    "创建新的work sheet. "默认创建的最新的sheet,处于active状态
    CALL METHOD OF lo_worksheets 'Add' = new_worksheet.
    *CALL METHOD OF new_worksheet 'Activate'.   "激活当前新的sheet
    SET PROPERTY OF new_worksheet 'Name' = 'second sheet'. "设置sheet名
    
    "lo_application默认sheet,设置值
    "创建单元个
    CALL METHOD OF lo_worksheet 'Cells' = lo_cell
       EXPORTING
       # = 1  "Row
       # = 1. "Column
    SET PROPERTY OF lo_cell 'value' = ''.   "设置单元个值
    
    "设置单元格字体
    CALL METHOD OF lo_cell 'font' = lo_font.
    "EXCEL支持的字体名
    *SET PROPERTY OF lo_font 'Name' = 'Agency FB'.   "字体名
    SET PROPERTY OF lo_font 'Name' = '微软正黑体'.   "字体名
    SET PROPERTY OF lo_font 'Size' = 15.        "大小
    
    "创建单元个
    CALL METHOD OF lo_worksheet 'Cells' = lo_cell
       EXPORTING
       # = 1  "Row
       # = 2. "Column
    SET PROPERTY OF lo_cell 'value' = '12/03/2010'.   "设置单元个值
    "设置单元格值格式,支持excel中的格式
    *SET PROPERTY OF lo_cell 'NumberFormat' = '0.00'.
    SET PROPERTY OF lo_cell 'NumberFormat' = 'm/d/yy'.
    
    "设置单元格字体
    CALL METHOD OF lo_cell 'font' = lo_font.
    "颜色数字规则?
    SET PROPERTY OF lo_font 'Color' = -12123441. "颜色
    SET PROPERTY OF lo_font 'TintAndShade' = 0. "明亮度-1~1,1完全透明
    SET PROPERTY OF lo_font 'Bold' = 0.  "是否粗体字 0 :false 1:true
    SET PROPERTY OF lo_font 'Italic' = 1. "是否斜体 0:false 1:true
    SET PROPERTY OF lo_font 'Underline' = 2. "xlUnderlineStyleSingle = 2,下划线
    
    "设置单元格背景
    DATA:lo_interior TYPE ole2_object.
    CALL METHOD OF lo_cell 'interior' = lo_interior.
    SET PROPERTY OF lo_interior 'Color' = 12123441.
    
    "设置单元格边框
    DATA:lo_borders TYPE ole2_object.
    "获取边框对象,输入参数‘7’:左边框xlEdgeLeft;‘8’:上边框xlEdgeTop;‘9’:下边框xlEdgeBottom;‘10’:右边框xlEdgeRight
    CALL METHOD OF lo_cell 'borders' = lo_borders
      EXPORTING
        # = 7.
    SET PROPERTY OF lo_borders 'LineStyle' = 1."xlContinuous='1'
    SET PROPERTY OF lo_borders 'Weight' = 4."xlThick = 4
    
    "在对应new sheet设置单元格值
    "创建单元个
    CALL METHOD OF new_worksheet 'Cells' = lo_cell
       EXPORTING
       # = 1  "Row
       # = 1. "Column
    SET PROPERTY OF lo_cell 'value' = 'hello2'.   "设置单元个值
    
    "创建单元个
    CALL METHOD OF new_worksheet 'Cells' = lo_cell
       EXPORTING
       # = 1  "Row
       # = 2. "Column
    SET PROPERTY OF lo_cell 'value' = 'welcome2'.   "设置单元个值
    
    
    *"选择Ranges of cells
    *CALL METHOD OF lo_worksheet 'Cells' = lo_cellstart
    *  EXPORTING
    *    # = 1 "row
    *    # = 1. "column
    *
    *CALL METHOD OF lo_worksheet 'Cells' = lo_cellend
    *  EXPORTING
    *    # = 3 "row
    *    # = 3. "column
    *
    *"选中一个区域Cell
    *CALL METHOD OF lo_worksheet 'RANGE' = lo_range
    *  EXPORTING
    *    # = lo_cellstart
    *    # = lo_cellend.
    *
    "选择列
    *CALL METHOD OF lo_worksheet 'Columns' = lo_column
    *  EXPORTING
    *    # = 1.
    *"选择行
    *CALL METHOD OF lo_worksheet 'Row' = lo_row
    *  EXPORTING
    *    # = 2.
    *
    *"获取选中区域selection
    *CALL METHOD OF lo_row 'Select'.
    *CALL METHOD OF lo_application 'selection' = lo_selection.
    
    *"添加验证
    *"选中(4,4)
    *CALL METHOD OF lo_worksheet 'Cells' = lo_cell
    *  EXPORTING
    *    # = 4
    *    # = 4.
    *"获取选中区域selection
    *CALL METHOD OF lo_cell 'Select'.
    *CALL METHOD OF lo_application 'selection' = lo_selection.
    *"获取验证对象lo_validation
    *CALL METHOD OF lo_selection 'Validation' = lo_validation.
    *"添加验证规则
    *CALL METHOD OF lo_validation 'Add'
    *  EXPORTING
    *    #1 = 4 "验证类型Type 4 = xlValidateDate,验证日期
    *    #2 = 1 "验证弹窗类型AlertStype  1 = xlValidAlertStop
    *    #3 = 1 "操作类型,Operator  1 = xlBetween,在之间
    *    #4 = '1/1/2000'   "Formula1
    *    #5 = '1/1/2010'.  "Formula2
    *"设置错误信息
    *SET PROPERTY OF lo_validation 'ErrorMessage' = 'Enter a valid date'.
    
    
    "调用lo_workbook 'SaveAs' 方法保存excel
    CALL METHOD OF lo_workbook 'SaveAs'
      EXPORTING
        # = lv_complete_path.
    if sy-subrc = 0.
      MESSAGE 'File downloaded successfully' TYPE 'S'.
    ELSE.
      MESSAGE 'Error downloading the file' TYPE 'E'.
    ENDIF.
    
    CALL METHOD OF  lo_application  'QUIT'.   "退出excel
    
    "释放资源
    FREE OBJECT lo_worksheet.
    FREE OBJECT new_worksheet.
    FREE OBJECT lo_workbook.
    FREE OBJECT lo_workbooks.
    FREE OBJECT lo_application.

    3、DOI操作EXCEL

    DOI:Desktop Office Integretion

    四个对象:

    container: 存放excel电子表格(spreadsheet)的容器。

    展示spreadsheet肯定需要一个容器来存放。这个容器一般在dialog screen中定义,也可以直接使用ABAP程序默认的screen(即screen号码为1000的屏幕)。

    container control: 容器中用于创建和管理其他Office集成所需要的对象。container control是一个接口,类型是i_oi_container_control。

    document proxy: 每一个document proxy的实例代表用office application打开的文档,可以是excel,也可以是word。如果想打开多个文档,需要定义多个实例。document proxy是一个接口,类型为i_oi_document_proxy。

    spreadsheet: spreadsheet接口,代表最终要操作的excel文档。spreadhseet的类型是i_oi_spreadsheet

    通过Tcode:OAOR,可以将本地文档模板上传到服务器行,通过对应类读取到ABAP程序中进行操作。

    如果读取服务器上的文档模板,需要cl_bds_document_set类:

    business document set: bds是business document set的缩写。

    business document set用于管理后续要操作的文档,可以包含一个或多个文档。

    示例:

    "容器对象
    DATA:gr_container type ref to cl_gui_container.
    "管理Excel或其他文档对象
    DATA:gr_control type ref to i_oi_container_control.
    "文档对象,打开保存文档操作
    DATA:gr_document type ref to i_oi_document_proxy.
    "sheet操作接口对象
    DATA:gr_spreadsheet type ref to i_oi_spreadsheet.
    
    "sheet中选择操作区域range
    DATA:gr_ranges type SOI_RANGE_LIST.
    DATA:gr_ranges_item TYPE SOI_RANGE_ITEM.
    "对应range的填充内容
    DATA:gr_contents TYPE SOI_GENERIC_TABLE.
    DATA:gr_contents_item TYPE SOI_GENERIC_ITEM.
    
    start-of-selection.
      perform main.
    
    *get container
    form get_container.
      "获取容器对象,实例化
      gr_container = cl_gui_container=>screen0."screen0 代表当前1000默认屏幕
    endform.                    "get_container
    
    * create container control
    form create_container_control.
      "调用方法,创建管理对象control
      CALL METHOD c_oi_container_control_creator=>get_container_control
        IMPORTING
          control = gr_control.
    
      "初始化control对象
    * initialize control
      CALL METHOD gr_control->init_control
        EXPORTING
          inplace_enabled          = 'X'  "嵌入屏幕显示‘x’
          inplace_scroll_documents = 'X'  "可滚动
          register_on_close_event  = 'X'
          register_on_custom_event = 'X'
          r3_application_name      = 'DOI demo'
          parent                   = gr_container.
    endform.
    
    "create excel document
    form create_excel_document.
      CALL METHOD gr_control->get_document_proxy
        EXPORTING
          document_type  = 'Excel.Sheet'
          no_flush       = 'X'
        IMPORTING
          document_proxy = gr_document.
    
      "open_inplace参数控制excel文档是独立显示还是在SAP GUI中嵌入显示。
      "如果嵌入显示,gr_control的init_control方法中,inplace_enabled参数要设为X
      CALL METHOD gr_document->create_document
        EXPORTING
          document_title = 'DOI test'
          no_flush       = ''
          open_inplace   = ''.
    
    endform.         "create_excel_document
    
    "使用spreedsheet填充数据
    form fill_data.
      "sheet的名字
      DATA:sheetname(20) TYPE C .
      DATA:error TYPE REF TO I_OI_ERROR.
      DATA:retcode TYPE SOI_RET_STRING.
    
      "调用document的方法,获取sheet对象
      CALL METHOD gr_document->get_spreadsheet_interface
        EXPORTING
          no_flush        = ''
        IMPORTING
          sheet_interface = gr_spreadsheet
          error           = error.
    
      "spreadsheet可以获取当前活动sheetname
      CALL METHOD gr_spreadsheet->get_active_sheet
        EXPORTING
          no_flush  = ''
        IMPORTING
          sheetname = sheetname
          error     = error
          retcode   = retcode.
    
      "获取当前活动sheet指定ranges区域
      CALL METHOD gr_spreadsheet->insert_range_dim
        EXPORTING
          no_flush  = ''
          name      = 'range1'
          left      = 1
          top       = 1
          rows      = 1
          columns   = 2
    *     updating  = 1
    *     sheetname = 'sheet1'
        IMPORTING
          error     = error
          retcode   = retcode.
    
    *  "修改range的名字,范围
    *  CALL METHOD gr_spreadsheet->change_range
    *    EXPORTING
    *      rangename = 'range1'
    *      newname = 'range1'
    *      rows = 1
    *      columns = 1
    **     updating = 1 "默认-1
    *    IMPORTING
    *      error = error
    *      retcode = retcode.
    
      "设置ranges区域字体
      CALL METHOD gr_spreadsheet->set_font
        EXPORTING
          rangename = 'range1'  "range的名字
          family    = 'Times New Roman'
          size      = 9
          bold      = 0    "加粗
          italic    = 0    "斜体
          align     = 0    "水平居中
        IMPORTING
          error     = error
          retcode   = retcode.
    
      "设置ranges区域格式
      CALL METHOD gr_spreadsheet->set_format
        EXPORTING
          rangename = 'range1'
          typ       = 0
          currency  = 'RMB'
          decimals  = 1
        IMPORTING
          error     = error
          retcode   = retcode.
    
      "设置ranges区域
      gr_ranges_item-name = 'range1'.
      gr_ranges_item-rows = 1.
      gr_ranges_item-columns = 2.
      APPEND gr_ranges_item TO gr_ranges.
    
      "设置内容,value 256长度
      gr_contents_item-row = 1.
      gr_contents_item-column = 1.
      gr_contents_item-value = '112'.
      APPEND gr_contents_item TO gr_contents.
    
      gr_contents_item-row = 1.
      gr_contents_item-column = 2.
      gr_contents_item-value = '113'.
      APPEND gr_contents_item TO gr_contents.
    
      "设置sheet中的内容
      CALL METHOD gr_spreadsheet->set_ranges_data
        EXPORTING
          no_flush  = ''
          ranges    = gr_ranges   "选中区域
          contents  = gr_contents "填充内容
    *     updating  = ''
    *     rangesdef = ''
        IMPORTING
          retcode   = retcode
          error     = error.
    
    *  "创建一个新的sheet
    *  call method gr_spreadsheet->add_sheet
    *    exporting
    *      name = 'sheet1'
    *      no_flush = ''
    *    importing
    *      error = error
    *      retcode = retcode.
    *  "删除一个sheet
    *  call method gr_spreadsheet->delete_sheet
    *    exporting
    *      name = 'sheet1'
    *      no_flush = ''
    *    importing
    *      error = error
    *      retcode = retcode.
      "active指定name的sheet
    *  CALL METHOD gr_spreadsheet->select_sheet
    *    EXPORTING
    *      name = 'sheet1'
    *      no_flush  = ''
    *    IMPORTING
    *      error     = error
    *      retcode   = retcode.
    *   "修改sheet名字
    *   CALL METHOD gr_spreadsheet->set_sheet_name
    *      EXPORTING
    *        newname = 'sheet1'
    *        oldname = sheetname
    *        no_flush  = ''
    *      IMPORTING
    *        error = error
    *        retcode = retcode.
    endform.
    
    "保存文档
    form save_doc.
      DATA:error TYPE REF TO I_OI_ERROR.
      DATA:retcode TYPE SOI_RET_STRING.
      "保存的文件路径
      DATA:file_name(20) TYPE C VALUE 'D:\test.xls'.
    
      "只传文件名,不设置路径,该方法会自动默认保存到c盘用户文件下的文档文件夹中)
      CALL METHOD gr_document->save_as
        EXPORTING
          file_name   = file_name
          prompt_user = ''
        IMPORTING
          error       = error
          retcode     = retcode.
    
    endform.
    
    "释放资源
    form free_source.
      "关闭文档
      CALL METHOD gr_document->close_document.
      "释放容器
      CALL METHOD gr_container->free.
      "关闭文档管理
      CALL METHOD gr_control->destroy_control.
      FREE gr_control.
    
      LEAVE PROGRAM.
    endform.
    
    form main.
    *  skip 1.
      perform get_container.
      perform create_container_control.
      perform create_excel_document.
      Perform fill_data.
      perform save_doc.
      perform free_source.
    endform.

    带模板的DOI操作:

    1、使用Tcode:OAOR,上传指定格式的文档;、

    2、通过调用cl_bds_document_set=>get_with_url方法,获取我们上传文档的URL;

    3、然后通过gr_document->open_document,将获取的URL传入,打开的就是我们上传的模板文档;

     

    使用OAOR,上传模板。Class name:HRFPM_EXCEL_STANDARD;Class Type:OT;Object Key:可以自己定义,访问时也是通过这个找到我们文件,示例:DOI_EXCEL_TEXT。

     

        可以选择我们要上传的文档类型。这里我们选中excel,双击会弹出一个文件选择框,选择我们要上传的模板文件就可以了。

     

        修改一下描述,或者默认,点击确认就可以了。

     

      我们可以看到已经上传成功。

    使用代码访问到我们上传的文档,获取文档的URL

    示例:

    *business document system
    data: gr_bds_documents type ref to cl_bds_document_set,
          g_classname type sbdst_classname,
          g_classtype type sbdst_classtype,
          g_objectkey type sbdst_object_key,
          g_doc_components type sbdst_components,
          g_doc_signature type sbdst_signature.
    * template url
    data: gt_bds_uris type sbdst_uri,
          gs_bds_url like line of gt_bds_uris,
          g_template_url(256) type c.
    g_classname = 'HRFPM_EXCEL_STANDARD'.
    g_classtype = 'OT'.
    g_objectkey = 'DOI_EXCEL_TEST'.
    
    form get_template_url.
      CREATE OBJECT gr_bds_documents.
      CALL METHOD cl_bds_document_set=>get_info
        EXPORTING
          classname  = g_classname
          classtype  = g_classtype
          object_key = g_objectkey
        CHANGING
          components = g_doc_components
          signature  = g_doc_signature.
      CALL METHOD cl_bds_document_set=>get_with_url
        EXPORTING
          classname  = g_classname
          classtype  = g_classtype
          object_key = g_objectkey
        CHANGING
          uris       = gt_bds_uris
          signature  = g_doc_signature.
    
      free gr_bds_documents.
      read table gt_bds_uris into gs_bds_url index 1.
      g_template_url = gs_bds_url-uri.
    endform.                    "get_template_url
    
    "通过URL获取模板文档
    call method gr_document->open_document
         exporting open_inplace = 'X'
                   document_url = g_template_url.

    4、常见文档MIME Type

    {".3gp",    "video/3gpp"},  

    {".apk",    "application/vnd.android.package-archive"},  

    {".asf",    "video/x-ms-asf"},  

    {".avi",    "video/x-msvideo"},  

    {".bin",    "application/octet-stream"},  

    {".bmp",    "image/bmp"},  

    {".c",  "text/plain"},  

    {".class",  "application/octet-stream"},  

    {".conf",   "text/plain"},  

    {".cpp",    "text/plain"},  

    {".doc",    "application/msword"},  

    {".docx",   "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},  

    {".xls",    "application/vnd.ms-excel"},   

    {".xlsx",   "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},  

    {".exe",    "application/octet-stream"},  

    {".gif",    "image/gif"},  

    {".gtar",   "application/x-gtar"},  

    {".gz", "application/x-gzip"},  

    {".h",  "text/plain"},  

    {".htm",    "text/html"},  

    {".html",   "text/html"},  

    {".jar",    "application/java-archive"},  

    {".java",   "text/plain"},  

    {".jpeg",   "image/jpeg"},  

    {".jpg",    "image/jpeg"},  

    {".js", "application/x-javascript"},  

    {".log",    "text/plain"},  

    {".m3u",    "audio/x-mpegurl"},  

    {".m4a",    "audio/mp4a-latm"},  

    {".m4b",    "audio/mp4a-latm"},  

    {".m4p",    "audio/mp4a-latm"},  

    {".m4u",    "video/vnd.mpegurl"},  

    {".m4v",    "video/x-m4v"},   

    {".mov",    "video/quicktime"},  

    {".mp2",    "audio/x-mpeg"},  

    {".mp3",    "audio/x-mpeg"},  

    {".mp4",    "video/mp4"},  

    {".mpc",    "application/vnd.mpohun.certificate"},         

    {".mpe",    "video/mpeg"},    

    {".mpeg",   "video/mpeg"},    

    {".mpg",    "video/mpeg"},    

    {".mpg4",   "video/mp4"},      

    {".mpga",   "audio/mpeg"},  

    {".msg",    "application/vnd.ms-outlook"},  

    {".ogg",    "audio/ogg"},  

    {".pdf",    "application/pdf"},  

    {".png",    "image/png"},  

    {".pps",    "application/vnd.ms-powerpoint"},  

    {".ppt",    "application/vnd.ms-powerpoint"},  

    {".pptx",   "application/vnd.openxmlformats-officedocument.presentationml.presentation"},  

    {".prop",   "text/plain"},  

    {".rc", "text/plain"},  

    {".rmvb",   "audio/x-pn-realaudio"},  

    {".rtf",    "application/rtf"},  

    {".sh", "text/plain"},  

    {".tar",    "application/x-tar"},     

    {".tgz",    "application/x-compressed"},   

    {".txt",    "text/plain"},  

    {".wav",    "audio/x-wav"},  

    {".wma",    "audio/x-ms-wma"},  

    {".wmv",    "audio/x-ms-wmv"},  

    {".wps",    "application/vnd.ms-works"},  

    {".xml",    "text/plain"},  

    {".z",  "application/x-compress"},  

    {".zip",    "application/x-zip-compressed"},  

    {"",        "*/*"}

  • 相关阅读:
    HTTP协议入门
    TCP/IP的分层管理
    TCP与UDP
    如何处理某个Web页面的HTTP请求
    AGC005D ~K Perm Counting
    “玲珑杯” 线上赛Round #17 B 震惊,99%+的中国人都会算错的问题
    bzoj4455 [Zjoi2016]小星星
    AGC010F Tree Game
    AGC016E Poor Turkeys
    AGC003E Sequential operations on Sequence
  • 原文地址:https://www.cnblogs.com/tangToms/p/11824522.html
Copyright © 2011-2022 走看看