我们在使用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.
输出效果: