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.

相关推荐
骄马之死5 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
sbjdhjd6 小时前
Redis 主从复制、哨兵高可用与 Cluster 集群部署实验手册
运维·前端·redis·云原生·开源·bootstrap·html
乐兮创想 小林6 小时前
企业官网移动端性能优化实战:从 Core Web Vitals 到图片/CDN/响应式的工程清单
前端·性能优化·网站建设·北京网站建设公司
AOwhisky6 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
小红卒6 小时前
mysql之udf提权
数据库·mysql·网络安全
前端一小卒6 小时前
不手写代码的第 30 天,我才明白前端这个岗位还剩什么
前端·javascript·ai编程
Ajie'Blog7 小时前
Copilot Agent Tasks API 开放:AI 编程开始进入后台任务时代
服务器·前端·javascript·人工智能·copilot·ai编程
郑洁文7 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
Trouvaille ~7 小时前
【Redis篇】Redis 哨兵(Sentinel):高可用自动故障转移
数据库·redis·缓存·中间件·sentinel·高可用·哨兵
qfljg7 小时前
oracle 迁移到postgres
数据库·oracle