ABAP上传EXCEL模板并将内表内容存到两个sheet中

FORM frm_down_cwpd .

PERFORM frm_save_dialog.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_save_dialog
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*

FORM frm_save_dialog .
* 选择文件。

DATA: l_name LIKE wwwdatatab,

l_mine LIKE w3mime OCCURS 10,

l_title TYPE string,

l_filename TYPE string,

l_path TYPE string,

l_fullpath TYPE rlgrap-filename.
* " 工厂描述

SELECT a~werks ,name1,butxt

FROM t001w

JOIN t001 ON t001~bukrs = t001w~bwkey

JOIN @gt_data AS a ON a~werks = t001w~werks

INTO TABLE @DATA(lt_werks_des).

SORT lt_werks_des BY werks.

LOOP AT gt_data INTO DATA(gs_data) WHERE checkbox = 'X' GROUP BY ( iblnr = gs_data-iblnr ) .

CLEAR:gt_data_cp,gt_data_ycl.

CLEAR:l_name ,

l_mine ,

l_title ,

l_filename,

l_path ,

l_fullpath.

LOOP AT gt_data INTO DATA(gs_data_cp) WHERE checkbox = 'X' AND iblnr = gs_data-iblnr AND zcwph+0(2) = 'CP' GROUP BY ( iblnr = gs_data-iblnr ).

LOOP AT GROUP gs_data_cp INTO DATA(gv_data_cp).

MOVE-CORRESPONDING gv_data_cp TO lv_data_cp.

COLLECT lv_data_cp INTO gt_data_cp.

ENDLOOP.
* APPEND gs_data_cp TO gt_data_cp.

ENDLOOP.

LOOP AT gt_data INTO DATA(gs_data_ycl) WHERE checkbox = 'X' AND iblnr = gs_data-iblnr AND zcwph+0(2) = 'CJ' GROUP BY ( iblnr = gs_data-iblnr ).

LOOP AT GROUP gs_data_ycl INTO DATA(gv_data_ycl).

MOVE-CORRESPONDING gv_data_ycl TO lv_data_ycl.

COLLECT lv_data_ycl INTO gt_data_ycl.

ENDLOOP.
* APPEND gs_data_ycl TO gt_data_ycl.

ENDLOOP.
* LOOP AT gt_data INTO DATA(gs_data_cp) WHERE checkbox = 'X' AND iblnr = gs_data-iblnr AND zcwph+0(2) = 'CP'.
* APPEND gs_data_cp TO gt_data_cp.
* ENDLOOP.
* LOOP AT gt_data INTO DATA(gs_data_ycl) WHERE checkbox = 'X' AND iblnr = gs_data-iblnr AND zcwph+0(2) = 'CJ'.
* APPEND gs_data_ycl TO gt_data_ycl.
* ENDLOOP.

READ TABLE lt_werks_des INTO DATA(ls_werks_des) WITH KEY werks = gs_data-werks BINARY SEARCH.

PERFORM frm_open USING '财务盘点导出' 'ZMMRP0159' l_fullpath.
*-- 打开excel模板

PERFORM frm_open_excel USING l_fullpath.
*-- 向excel写入成品信息

PERFORM frm_write_excel_cp_sheet USING ls_werks_des-butxt gs_data." 向EXCEL中写入数据
* 写入原材料信息

PERFORM frm_write_excel_ycl_sheet USING ls_werks_des-butxt gs_data." 向EXCEL中写入数据

* 设置单元格边框。
* PERFORM frm_range_borders.

SET PROPERTY OF gv_excel 'Visible' = 1.
* 保存数据并释放对象。

PERFORM frm_save_excel USING l_fullpath.

ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_open
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*& --> P_
*& --> L_FULLPATH
*&---------------------------------------------------------------------*

FORM frm_open USING VALUE(p_value1) VALUE(p_value2) p_value3 TYPE rlgrap-filename.

DATA: lo_objdata LIKE wwwdatatab,

lc_filename TYPE string,

lc_fullpath TYPE string,

lc_path TYPE string,

ls_destination LIKE rlgrap-filename,

ls_objnam TYPE string,

li_rc LIKE sy-subrc,

ls_errtxt TYPE string.

DATA:p_objid TYPE wwwdatatab-objid,

p_dest LIKE sapb-sappfad.

DATA lv_xstring TYPE xstring.

p_objid = p_value2. " 此处为EXCEL模板名称d

CONCATENATE p_value1 sy-datum '-' sy-uzeit'.XLS' INTO lc_filename.

CALL METHOD cl_gui_frontend_services=>file_save_dialog " 调用保存对话框

EXPORTING

default_extension = 'XLS'

default_file_name = lc_filename

CHANGING

filename = lc_filename

path = lc_path

fullpath = lc_fullpath

EXCEPTIONS

cntl_error = 1

error_no_gui = 2

not_supported_by_gui = 3

OTHERS = 4.

IF lc_fullpath = ''.

MESSAGE '不能打开excel' TYPE 'E'.

ENDIF.

IF sy-subrc = 0.

p_dest = lc_fullpath.
* concatenate p_objid '.XLS' into ls_objnam.

CONDENSE ls_objnam NO-GAPS.

SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata

WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.

* 检查表wwwdata中是否存在所指定的模板文件

IF sy-subrc NE 0 OR lo_objdata-objid EQ space. " 如果不存在,则给出错误提示

MESSAGE '模板文件' && ls_objnam && '不存在' TYPE 'E'.

ENDIF.

ls_destination = p_dest. " 保存路径

*2. 如果存在,调用DOWNLOAD_WEB_OBJECT 函数下载模板到路径下

CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'

EXPORTING

key = lo_objdata

destination = ls_destination

IMPORTING

rc = li_rc.

IF li_rc NE 0.
* MESSAGE e045 WITH ls_objnam ." 模板文件:' ls_objnam '下载失败

ENDIF.

p_value3 = ls_destination.

ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_open_excel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> L_FULLPATH
*&---------------------------------------------------------------------*

FORM frm_open_excel USING pa_path.
* 创建应用程序对象

CREATE OBJECT gv_excel 'Excel.Application'.
* 创建工作簿

CALL METHOD OF

gv_excel

'Workbooks' = gv_book.
* 打开指定路径的工作簿。

CALL METHOD OF

gv_book

'Open' = gv_book

EXPORTING

#1 = pa_path.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_write_excel_cp_sheet
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_WERKS_DES_NAME1
*& --> GS_DATA
*&---------------------------------------------------------------------*

FORM frm_write_excel_cp_sheet USING p_werks_des p_head TYPE ty_data.
* TYPES BEGIN OF ty_cp.
* TYPES:werks TYPE ztmm0105-werks,
* zzsyb TYPE mara-zzsyb, " 事业部
* crnam TYPE ztmm0105-crnam, " 盘点人
* zcwph TYPE ztmm0105-zcwph, " 财务盘点编号
* matnr TYPE ztmm0105-matnr, "
* matnr_txt TYPE makt-maktx, "
* mes_batch TYPE ztmm0105-mes_batch, "
* lgort TYPE ztmm0105-lgort, "
* zzsyb_txt TYPE ztmm0001-zsybm, "
* meins TYPE ztmm0105-meins, "
* clabs TYPE mchb-clabs,
* ceinm TYPE mchb-ceinm,
* labst TYPE ztmm0105-labst,
* dimng TYPE ztmm0105-dimng.
* TYPES END OF ty_cp.
* DATA:lw_cp_tab TYPE ty_cp.
* DATA:lt_cp_tab TYPE TABLE OF ty_cp.
* DATA(lt_data) = gt_data_cp.
* DELETE lt_data WHERE checkbox IS INITIAL.
* MOVE-CORRESPONDING lt_data TO lt_cp_tab.
* 获取人员信息SHEET页签

DATA:l_num TYPE int4.

CALL METHOD OF

gv_book

'Sheets' = gv_sheet

EXPORTING

#1 = 1.
*-- 设置excel可见

CALL METHOD OF

gv_excel

'Worksheets' = gv_sheet

EXPORTING

#1 = 1.

CALL METHOD OF

gv_sheet

'Activate'.

l_num = 6.

IF p_werks_des IS NOT INITIAL.

PERFORM frm_write_cell USING 1 1 p_werks_des .

ENDIF.

DATA lv_cell_02 TYPE string.

DATA lv_cell_03 TYPE string.

CLEAR:lv_cell_02,lv_cell_03.

lv_cell_02 = '2025年中(' && p_head-crdat+4(2) &&'月)盘点表 表单编号:' && p_head-iblnr.

lv_cell_03 = '数据截止日期:' && p_head-crdat && '-' && p_head-crtim+0(2) && ':' && p_head-crtim+2(2) && ':'&& p_head-crtim+4(2) && ' 盘点对象:' && p_head-zzsyb_txt.

PERFORM frm_write_cell USING 2 1 lv_cell_02 .

PERFORM frm_write_cell USING 3 1 lv_cell_03 .

LOOP AT gt_data_cp INTO DATA(lw_cp_tab).

IF lw_cp_tab-zmeng IS NOT INITIAL. " 无条码

DATA(lv_sp) = lw_cp_tab-zmeng.

ELSEIF lw_cp_tab-scmng IS NOT INITIAL." 抽盘

lv_sp = lw_cp_tab-scmng.

ELSEIF lw_cp_tab-remng IS NOT INITIAL." 复盘

lv_sp = lw_cp_tab-remng.

ELSEIF lw_cp_tab-itmng IS NOT INITIAL." 初盘

lv_sp = lw_cp_tab-itmng.

ENDIF.

* 向EXCEL中写数据。

PERFORM frm_write_cell USING l_num 1 lw_cp_tab-zcwph .

PERFORM frm_write_cell USING l_num 2 lw_cp_tab-matnr ."

PERFORM frm_write_cell USING l_num 3 lw_cp_tab-matnr_txt .

PERFORM frm_write_cell USING l_num 4 lw_cp_tab-mes_batch .

PERFORM frm_write_cell USING l_num 5 lw_cp_tab-werks .

PERFORM frm_write_cell USING l_num 6 lw_cp_tab-lgort .

PERFORM frm_write_cell USING l_num 7 lw_cp_tab-zzsyb_txt .

PERFORM frm_write_cell USING l_num 8 lw_cp_tab-meins .

PERFORM frm_write_cell USING l_num 9 lw_cp_tab-clabs .

PERFORM frm_write_cell USING l_num 10 lw_cp_tab-ceinm .

PERFORM frm_write_cell USING l_num 11 lw_cp_tab-labst .

PERFORM frm_write_cell USING l_num 12 lv_sp .

PERFORM frm_write_cell USING l_num 13 lw_cp_tab-dimng .

l_num = l_num + 1.

ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_write_excel_ycl_sheet
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_WERKS_DES_NAME1
*& --> GS_DATA
*&---------------------------------------------------------------------*

FORM frm_write_excel_ycl_sheet USING p_werks_des p_head TYPE ty_data.
* TYPES BEGIN OF ty_cp.
* TYPES:werks TYPE ztmm0105-werks,
* zzsyb TYPE mara-zzsyb, " 事业部
* crnam TYPE ztmm0105-crnam, " 盘点人
* zcwph TYPE ztmm0105-zcwph, " 财务盘点编号
* matnr TYPE ztmm0105-matnr, "
* matnr_txt TYPE makt-maktx, "
* mes_batch TYPE ztmm0105-mes_batch, "
* lgort TYPE ztmm0105-lgort, "
* zzsyb_txt TYPE ztmm0001-zsybm, "
* meins TYPE ztmm0105-meins, "
* clabs TYPE mchb-clabs,
* ceinm TYPE mchb-ceinm,
* labst TYPE ztmm0105-labst,
* dimng TYPE ztmm0105-dimng.
* TYPES END OF ty_cp.
* DATA:lw_cp_tab TYPE ty_cp.
* DATA:lt_cp_tab TYPE TABLE OF ty_cp.
* DATA(lt_data) = gt_data_ycl.
* DELETE lt_data WHERE checkbox IS INITIAL.
* MOVE-CORRESPONDING lt_data TO lt_cp_tab.
* 获取人员信息SHEET页签

DATA:l_num TYPE int4.

CALL METHOD OF

gv_book

'Sheets' = gv_sheet

EXPORTING

#1 = 2.
*-- 设置excel可见

CALL METHOD OF

gv_excel

'Worksheets' = gv_sheet

EXPORTING

#1 = 2.

CALL METHOD OF

gv_sheet

'Activate'.

l_num = 6.

IF p_werks_des IS NOT INITIAL.

PERFORM frm_write_cell USING 1 1 p_werks_des .

ENDIF.

DATA lv_cell_02 TYPE string.

DATA lv_cell_03 TYPE string.

CLEAR:lv_cell_02,lv_cell_03.

lv_cell_02 = '2025年中(' && p_werks_des+0(2) &&')盘点表 表单编号:' && p_head-iblnr.

lv_cell_03 = '数据截止日期:' && p_head-crdat && '-' && p_head-crtim+0(2) && ':' && p_head-crtim+2(2) && ':'&& p_head-crtim+4(2) && ' 类型:原材料类型' .

PERFORM frm_write_cell USING 2 1 lv_cell_02 .

PERFORM frm_write_cell USING 3 1 lv_cell_03 .

LOOP AT gt_data_ycl INTO DATA(lw_cp_tab).

IF lw_cp_tab-zmeng IS NOT INITIAL. " 无条码

DATA(lv_sp) = lw_cp_tab-zmeng.

ELSEIF lw_cp_tab-scmng IS NOT INITIAL." 抽盘

lv_sp = lw_cp_tab-scmng.

ELSEIF lw_cp_tab-remng IS NOT INITIAL." 复盘

lv_sp = lw_cp_tab-remng.

ELSEIF lw_cp_tab-itmng IS NOT INITIAL." 初盘

lv_sp = lw_cp_tab-itmng.

ENDIF.

* 向EXCEL中写数据。

PERFORM frm_write_cell USING l_num 1 lw_cp_tab-zcwph .

PERFORM frm_write_cell USING l_num 2 lw_cp_tab-werks ."

PERFORM frm_write_cell USING l_num 3 lw_cp_tab-lgort .

PERFORM frm_write_cell USING l_num 4 lw_cp_tab-lgort_txt .

PERFORM frm_write_cell USING l_num 5 lw_cp_tab-matnr .

PERFORM frm_write_cell USING l_num 6 lw_cp_tab-matnr_txt .

PERFORM frm_write_cell USING l_num 7 lw_cp_tab-bin .

PERFORM frm_write_cell USING l_num 8 lw_cp_tab-zgyspc .

PERFORM frm_write_cell USING l_num 9 lw_cp_tab-meins .

PERFORM frm_write_cell USING l_num 10 lw_cp_tab-clabs .

PERFORM frm_write_cell USING l_num 11 lw_cp_tab-ceinm .

PERFORM frm_write_cell USING l_num 12 lw_cp_tab-labst .

PERFORM frm_write_cell USING l_num 13 lv_sp .

PERFORM frm_write_cell USING l_num 14 lw_cp_tab-dimng .

CLEAR:lv_sp.

l_num = l_num + 1.

ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_write_cell
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_1
*& --> P_1
*& --> P_WERKS_DES
*&---------------------------------------------------------------------*

FORM frm_write_cell USING pa_row

pa_col

pa_val.

CALL METHOD OF

gv_excel

'Cells' = gv_cell

EXPORTING

#1 = pa_row

#2 = pa_col.

SET PROPERTY OF gv_cell 'Value' = pa_val.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_save_excel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> L_FULLPATH
*&---------------------------------------------------------------------*

FORM frm_save_excel USING p_l_fullpath.

SET PROPERTY OF gv_excel 'DisplayAlerts' = 0.

DATA: lv_codepage TYPE cpcodepage.
* CALL METHOD OF
* gv_book
* 'SAVE'
* EXPORTING
* #1 = pa_fullpath.
* CALL METHOD OF
* gv_book
* 'SAVE'.

lv_codepage = '4110'.

CALL METHOD OF gv_book 'SaveAs'

EXPORTING

#1 = p_l_fullpath.
* #2 = -4143 " xlWorkbookNormal
* #3 = 0 " No password
* #4 = 1 " No write reservation password
* #5 = 0 " No read-only recommended
* #6 = 0 " No create backup
* #7 = 1 " Add to MRU
* #8 = lv_codepage. " 指定编码

CALL METHOD OF

gv_book

'Exit' = gv_book.

CALL METHOD OF gv_book 'Close'

EXPORTING

#1 = 0.
* 退出应用程序

CALL METHOD OF gv_excel 'QUIT'.
* 释放用到的对象

FREE OBJECT gv_cell.

FREE OBJECT gv_range.

FREE OBJECT gv_borders.

FREE OBJECT gv_rows. "not used

FREE OBJECT gv_sheet.

FREE OBJECT gv_book.

FREE OBJECT gv_excel.

ENDFORM.

相关推荐
手揽回忆怎么睡3 小时前
分卷打包命令
java
openinstall全渠道统计3 小时前
电商App推广统计方案有哪些?从广告到下单追踪解析
java·eclipse·教育电商
夕除3 小时前
spring boot 8
java·开发语言
humors2213 小时前
免费云服务清单
服务器·网络·数据库·免费·云服务·网站·带宽
lolo大魔王3 小时前
Go 语言数据库操作|GORM 实现 CRUD 超详细实战
数据库·golang
网管NO.13 小时前
SQL 是什么?
数据库·sql
June`3 小时前
多线程redis项目之rdb
数据库·redis·缓存
usdoc文档预览3 小时前
国产化踩坑:Vue3 / React / 小程序如何免插件实现 OFD 及复杂 Office 文档同屏预览
前端·javascript·react.js·小程序·pdf·word·office文件在线预览
王翼鹏3 小时前
claude 配置Luma MCP 图像识别mcp
java·linux·服务器