配合SMW0使用,先下载模板并填充;
EXCEL的模板是可以合并单元格的,程序中的列是EXCEL真实的列,不是合并单元格之后的列;
1.下载模板
css
DATA: lv_destination LIKE rlgrap-filename."模板导出路径
DATA: ls_objdata LIKE wwwdatatab,
lv_objid TYPE wwwdatatab-objid,
lv_rc TYPE sy-subrc.
CLEAR: lv_destination.
PERFORM frm_get_savefullpath USING text-017 'XLS' CHANGING lv_destination."备件交货单
CHECK lv_destination IS NOT INITIAL.
CLEAR:ls_objdata,lv_objid,lv_rc.
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_objdata
WHERE srtf2 = 0
AND objid = 'ZSD0GHW' "导入模板时输入的对象名称
AND relid = 'MI'.
IF sy-subrc = 0.
CLEAR: lv_rc.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' "#EC *
EXPORTING
key = ls_objdata
destination = lv_destination
IMPORTING
rc = lv_rc.
IF lv_rc NE 0.
MESSAGE text-014 TYPE 'E'."该数据模板不存在!
ELSE.
MESSAGE text-015 TYPE 'S'."模板下载成功
ENDIF.
ELSE.
MESSAGE text-014 TYPE 'E'."该数据模板不存在!
ENDIF.
FORM frm_get_savefullpath USING filename TYPE string
extension TYPE string
CHANGING destination LIKE rlgrap-filename.
DATA:
lv_fullpath TYPE string,
lv_user_action TYPE i,
lv_path TYPE string,
lv_filename TYPE string.
CLEAR: destination.
* 获取模板保存路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
* window_title =
default_extension = extension
default_file_name = filename
* with_encoding =
* file_filter =
initial_directory = lv_path
* prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_action
* file_encoding =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
IF lv_user_action <> 9.
destination = lv_fullpath.
ENDIF.
ENDIF.
ENDFORM.
2.填充
替换代码中路径:C:\test.xlsx 即可;
css
DATA: excelobj TYPE ole2_object,
wbookobj TYPE ole2_object,
wsheetobj TYPE ole2_object,
cellobj TYPE ole2_object,
sheetobj TYPE ole2_object,
cell TYPE ole2_object,
sheet(30) TYPE c.
sheet = 'Sheet1'.
CREATE OBJECT excelobj 'Excel.Application'.
IF sy-subrc NE 0.
WRITE: / 'Excel 初始化失败,错误码是 ', sy-subrc.
EXIT.
ELSE.
* Set excel visible
SET PROPERTY OF excelobj 'Visible' = 1.
* Create workbook object
CALL METHOD OF
excelobj
'Workbooks' = wbookobj.
CALL METHOD OF
wbookobj
'Open' = wbookobj
EXPORTING
#1 = 'C:\test.xlsx'.
* Create wsheet object
CALL METHOD OF
wbookobj
'Worksheets' = wsheetobj
EXPORTING
#1 = sheet.
CALL METHOD OF
wsheetobj
'Activate'.
PERFORM frm_fill_xls USING 1 1 '11'.
PERFORM frm_fill_xls USING 1 2 '12'.
PERFORM frm_fill_xls USING 2 1 '21'.
PERFORM frm_fill_xls USING 2 2 '22'.
FREE OBJECT wsheetobj.
FREE OBJECT wbookobj.
FREE OBJECT excelobj.
ENDIF.
*----------------------------------------------------------------------*
* -->PR_ROW 行号
* -->PR_COL 列号
* -->PR_DAT 数值
*----------------------------------------------------------------------*
FORM frm_fill_xls USING value(pr_row)
value(pr_col)
value(pr_dat).
CALL METHOD OF
wsheetobj
'Cells' = cellobj
EXPORTING
#1 = pr_row
#2 = pr_col.
SET PROPERTY OF cellobj 'value' = pr_dat.
ENDFORM. "frm_fill_xls
剪切板方式填充案例--速度明显提升
css
DATA: lv_destination LIKE rlgrap-filename."模板导出路径
DEFINE cut_downexcel.
call method cl_gui_frontend_services=>clipboard_export
importing
data = lt_cutdata_rows
changing
rc = t_rc
exceptions
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
others = 4.
*选择其开始粘贴的单元格
call method of wsheetobj 'cells' = cellobj
exporting
#1 = g_begin_row "Row
#2 = 1. "Column
*粘贴剪贴板
call method of cellobj 'SELECT'.
call method of wsheetobj 'PASTE'.
clear: ls_cutdata, lt_cutdata_rows[].
free lt_cutdata_rows.
END-OF-DEFINITION.
DATA: excelobj TYPE ole2_object,
wbookobj TYPE ole2_object,
wsheetobj TYPE ole2_object,
cellobj TYPE ole2_object,
sheetobj TYPE ole2_object,
cell TYPE ole2_object,
sheet(30) TYPE c VALUE 'Sheet1'.
DATA:g_begin_row TYPE i,
t_row TYPE i,
t_rc TYPE i,
t_cutrow TYPE i.
CONSTANTS: c_cutdata_len TYPE i VALUE 2000. "下载EXCEL每行所有字段总长度
TYPES: BEGIN OF cutdata_t,
cutdata TYPE c LENGTH c_cutdata_len,
END OF cutdata_t.
DATA: lt_cutdata TYPE STANDARD TABLE OF cutdata_t,
lt_cutdata_rows TYPE STANDARD TABLE OF cutdata_t,
ls_cutdata TYPE cutdata_t.
DATA: t_char200(200)."下载时兼容数字字段的字符串拼接
START-OF-SELECTION.
"先下载模板
PERFORM frm_down_temp.
"向模板里填充数据
PERFORM frm_export_temp.
*&---------------------------------------------------------------------*
*& Form frm_down_temp
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_down_temp.
DATA: ls_objdata LIKE wwwdatatab,
lv_objid TYPE wwwdatatab-objid,
lv_rc TYPE sy-subrc.
CLEAR: lv_destination.
PERFORM frm_get_savefullpath USING 'test' 'xlsx' CHANGING lv_destination."开票信息导出
CHECK lv_destination IS NOT INITIAL.
CLEAR:ls_objdata,lv_objid,lv_rc.
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_objdata
WHERE srtf2 = 0
AND objid = 'ZYSZK02' "导入模板时输入的对象名称
AND relid = 'MI'.
IF sy-subrc = 0.
CLEAR: lv_rc.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' "#EC *
EXPORTING
key = ls_objdata
destination = lv_destination
IMPORTING
rc = lv_rc.
IF lv_rc NE 0.
MESSAGE '该数据模板不存在' TYPE 'E'.
ELSE.
MESSAGE '模板下载成功' TYPE 'S'.
ENDIF.
ELSE.
MESSAGE '该数据模板不存在' TYPE 'E'.
ENDIF.
ENDFORM. "frm_down_temp
*&---------------------------------------------------------------------*
*& Form frm_export_temp
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_export_temp.
DATA: l_row TYPE i VALUE 3."excel输出的行号
CREATE OBJECT excelobj 'Excel.Application'.
IF sy-subrc NE 0.
MESSAGE text-042 TYPE 'E'."Excel初始化失败
EXIT.
ELSE.
CALL METHOD OF
excelobj
'Workbooks' = wbookobj.
"新建excel 不是使用模版
* CALL METHOD OF
* wbookobj
* 'Add' = wbookobj.
"打开下载的模版
CALL METHOD OF
wbookobj
'Open' = wbookobj
EXPORTING
#1 = lv_destination.
SET PROPERTY OF excelobj 'VISIBLE' = 0. "不显示窗口
GET PROPERTY OF excelobj 'ACTIVESHEET' = wsheetobj.
"剪贴板方式下载数据
* LOOP AT gt_zyszk02.
* CONCATENATE ls_cutdata gt_zyszk02-zgj INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
* CONCATENATE ls_cutdata gt_zyszk02-zxyz INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
* CONCATENATE ls_cutdata gt_zyszk02-zxq INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
*
* SHIFT ls_cutdata BY 1 PLACES LEFT.
* APPEND ls_cutdata TO lt_cutdata.
* CLEAR ls_cutdata.
* ENDLOOP.
DO 2 TIMES.
CONCATENATE ls_cutdata 'name' INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
CONCATENATE ls_cutdata 'value' INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
SHIFT ls_cutdata BY 1 PLACES LEFT.
APPEND ls_cutdata TO lt_cutdata.
CLEAR ls_cutdata.
ENDDO.
t_row = 1."内容从第三行开始插入
g_begin_row = 2.
LOOP AT lt_cutdata INTO ls_cutdata.
t_row = t_row + 1.
t_cutrow = t_cutrow + 1.
APPEND ls_cutdata TO lt_cutdata_rows.
IF t_cutrow = 10000.
cut_downexcel.
g_begin_row = t_row + 1.
t_cutrow = 0.
ENDIF.
ENDLOOP.
"粘贴剩下不超过1W的数据
IF lt_cutdata_rows[] IS NOT INITIAL.
cut_downexcel.
ENDIF.
"打开下载的模版
CALL METHOD OF wbookobj 'Save' "工作簿保存
"新建excel 不是使用模版
"CALL METHOD OF wbookobj 'SaveAS' "工作簿保存
EXPORTING
#1 = lv_destination
#2 = 1.
SET PROPERTY OF excelobj 'DisplayAlerts' = 'false'. "屏蔽是否另存为提示框
CALL METHOD OF wbookobj 'CLOSE'. "关闭工作簿
CALL METHOD OF excelobj 'QUIT'. "
FREE OBJECT wsheetobj.
FREE OBJECT wbookobj.
FREE OBJECT excelobj.
ENDIF.
ENDFORM. "frm_export_temp
*&---------------------------------------------------------------------*
*& Form frm_get_savefullpath
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->FILENAME text
* -->EXTENSION text
* -->DESTINATION text
*----------------------------------------------------------------------*
FORM frm_get_savefullpath USING filename TYPE string
extension TYPE string
CHANGING destination LIKE rlgrap-filename.
DATA:
lv_fullpath TYPE string,
lv_user_action TYPE i,
lv_path TYPE string,
lv_filename TYPE string.
CLEAR: destination.
* 获取模板保存路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
* window_title =
default_extension = extension
default_file_name = filename
* with_encoding =
* file_filter =
initial_directory = lv_path
* prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_action
* file_encoding =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
IF lv_user_action <> 9.
destination = lv_fullpath.
ENDIF.
ENDIF.
ENDFORM. "frm_get_savefullpath
tips
1.xls格式最大行项目是65536行,256列 ; xlsx最大行项目是1048576行,16384列;
2.使用模板和新建Excel的区别点:
