使用FIELD SYMBOL 动态指定OLE的输出值

我们在使用OLE输出EXCEL时,如果内表的字段不是很多,通常会用宏对每一个列进行单独定义,但如果在内表的字段很多的情况下,上面的方法就会显得很麻烦,这种情况下使用FIELD SYMBOL对OLE的输出值进行动态指定是不错的选择。

FORM fom_call_ole .

*  创建excel对象
  CREATE OBJECT v_excel 'EXCEL.APPLICATION'.

* 创建workbook对象
  CALL METHOD OF v_excel 'WORKBOOKS' = v_workbook ."把 v_excel中的 WORKBOOK方法分配给v_workbook对象

* 设置为前台可见
  SET PROPERTY OF v_excel 'VISIBLE' = 1 ."1 前台 2 后台

* 增加workbook(增加一个文件)
  CALL METHOD OF v_workbook 'ADD' = v_workbook ."调用 v_workbook 中的 ADD 方法 增加一个页面

* 使用激活方法
  CALL METHOD OF v_workbook 'ACTIVATE' ."

* 把对应的单元格指定给v_cell对象(用#标明横竖向的位置)
  CALL METHOD OF v_excel 'CELLS' = v_cell
    EXPORTING
      #1 = 1
      #2 = 1 .

* 给单元格赋值
  SET PROPERTY OF v_cell 'VALUE' = '可用在库量' .

* 设置单元格字体样式
  CALL METHOD OF v_cell 'FONT' = v_font .

* bold,size 20
  SET PROPERTY OF v_font 'BOLD'  = 1 .
  SET PROPERTY OF v_font 'SIZE'  = 20.

* 居中
  SET PROPERTY OF v_cell 'HORIZONTALALIGNMENT' = -4108 ."-4108 指居横向中
*  SET PROPERTY OF v_cell 'VERTICALALIGNMENT'   = 10 ."-4108 指纵向居中

*指定合并单元格的范围(设置和并范围横纵列从A1到F2)
  CALL METHOD OF v_excel 'RANGE' = v_range
    EXPORTING
      #1 = 'A1'
      #2 = 'F2'.

*合并单元格(先选中在合并)
  CALL METHOD OF v_range 'SELECT' .
  SET PROPERTY OF v_range 'MERGECELLS' = 1 .
  FREE OBJECT v_range .

  %%set_cell: 3  1  '下载日期' 1  11  ' ',
              3  2  sy-datum   0  11  ' ',
              3  5  '下载人'   1  11  ' ',
              3  6  sy-uname   0  11  ' ',
              4  1  '工厂'     1  11  'X',
              4  2  '仓库'     1  11  'X',
              4  3  '物料'     1  11  'X',
              4  4  '物料描述' 1  11  'X',
              4  5  '数量'     1  11  'X',
              4  6  '单位'     1  11  'X'.
*  表单内容输出

  DATA lv_row TYPE i .
  lv_row = 4 .
  LOOP AT gt_alv INTO gs_alv.
    lv_row = lv_row + 1 .
    %%set_cell: lv_row  1  gs_alv-werks  0  11  ' ',
                lv_row  2  gs_alv-lgort  0  11  ' ',
                lv_row  3  gs_alv-matnr  0  11  ' ',
                lv_row  4  gs_alv-maktx  0  11  ' ',
                lv_row  5  gs_alv-labst  0  11  ' ',
                lv_row  6  gs_alv-meins  0  11  ' '.

  ENDLOOP.

ENDFORM.

以上代码如果用动态指定的方式则需要如下处理

DO 6 TIMES.
*设置列
      lv_col = sy-index . "低级次循环就在第几次输出
      lv_scol = sy-index + 2 . "低级次循环就在第几次输出

*设置值
*将当前循环次数的那个列的字段assign给FS
      ASSIGN COMPONENT lv_scol OF STRUCTURE gs_alv TO <fs_field> .
      lv_value = <fs_field> .
      %%set_cell: lv_row  lv_col  lv_value  0  11  ' '.
    ENDDO.

注:由于此程序的内表中加入了导航字段和checkbox所以sy-index + 2为当前应输出列,要特别注意字段在内表中的位置。

修改后的代码为:

ENDFORM. "FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FOM_CALL_OLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM fom_call_ole .

*  创建excel对象
  CREATE OBJECT v_excel 'EXCEL.APPLICATION'.

* 创建workbook对象
  CALL METHOD OF v_excel 'WORKBOOKS' = v_workbook ."把 v_excel中的 WORKBOOK方法分配给v_workbook对象

* 设置为前台可见
  SET PROPERTY OF v_excel 'VISIBLE' = 1 ."1 前台 2 后台

* 增加workbook(增加一个文件)
  CALL METHOD OF v_workbook 'ADD' = v_workbook ."调用 v_workbook 中的 ADD 方法 增加一个页面

* 使用激活方法
  CALL METHOD OF v_workbook 'ACTIVATE' ."

* 把对应的单元格指定给v_cell对象(用#标明横竖向的位置)
  CALL METHOD OF v_excel 'CELLS' = v_cell
    EXPORTING
      #1 = 1
      #2 = 1 .

* 给单元格赋值
  SET PROPERTY OF v_cell 'VALUE' = '可用在库量' .

* 设置单元格字体样式
  CALL METHOD OF v_cell 'FONT' = v_font .

* 加粗BOLE,size 20
  SET PROPERTY OF v_font 'BOLD'  = 1 .
  SET PROPERTY OF v_font 'SIZE'  = 20.

* 居中
  SET PROPERTY OF v_cell 'HORIZONTALALIGNMENT' = -4108 ."-4108 指居横向中
*  SET PROPERTY OF v_cell 'VERTICALALIGNMENT'   = 10 ."-4108 指纵向居中

*指定合并单元格的范围(设置和并范围横纵列从A1到F2)
  CALL METHOD OF v_excel 'RANGE' = v_range
    EXPORTING
      #1 = 'A1'
      #2 = 'F2'.

*合并单元格(先选中在合并)
  CALL METHOD OF v_range 'SELECT' .
  SET PROPERTY OF v_range 'MERGECELLS' = 1 .
  FREE OBJECT v_range .

  %%set_cell: 3  1  '下载日期' 1  11  ' ',
              3  2  sy-datum   0  11  ' ',
              3  5  '下载人'   1  11  ' ',
              3  6  sy-uname   0  11  ' ',
              4  1  '工厂'     1  11  'X',
              4  2  '仓库'     1  11  'X',
              4  3  '物料'     1  11  'X',
              4  4  '物料描述' 1  11  'X',
              4  5  '数量'     1  11  'X',
              4  6  '单位'     1  11  'X'.
*  表单内容输出

  DATA lv_row TYPE i .
  DATA lv_col TYPE i .
  DATA lv_scol TYPE i .
  DATA lv_value TYPE c LENGTH 50 .
  FIELD-SYMBOLS <fs_field> TYPE any .

  lv_row = 4 .
  LOOP AT gt_alv INTO gs_alv.
    lv_row = lv_row + 1 .
*    %%set_cell: lv_row  1  gs_alv-werks  0  11  ' ',
*                lv_row  2  gs_alv-lgort  0  11  ' ',
*                lv_row  3  gs_alv-matnr  0  11  ' ',
*                lv_row  4  gs_alv-maktx  0  11  ' ',
*                lv_row  5  gs_alv-labst  0  11  ' ',
*                lv_row  6  gs_alv-meins  0  11  ' '.

*  使用FIELD SYMBOL将当前行的所有字段输出到excel中

    DO 6 TIMES.
*设置列
      lv_col = sy-index . "第级次循环就在第几次输出
      lv_scol = sy-index + 2 . "低级次循环就在第几次输出

*设置值
*将当前循环次数的那个列的字段assign给FS
      ASSIGN COMPONENT lv_scol OF STRUCTURE gs_alv TO <fs_field> .
      lv_value = <fs_field> .
      %%set_cell: lv_row  lv_col  lv_value  0  11  ' '.
    ENDDO.

  ENDLOOP.

ENDFORM.

输出效果:

猜你喜欢

转载自blog.csdn.net/Sundam/article/details/78331593