ABAP操作EXCEL (号称超级版)
【转自http://www.cnblogs.com/VerySky/articles/2170014.html】
*----------------------------------------------------------------------*
* Program Name <程序名称> : Z_FI_DCV_0001 *
* Purpose <程序用途> : 资产负债表导出为EXCEL *
* Project Name <项目名称> : ITG-TRAINING *
* Created by <代码编写人> : YANGMIN *
* Create on <创建日期> : 20071207 *
* Functional Consultant <顾问> : *
* Description <功能描述> : 从服务器下载EXCEL到用户本地, *
* 打开本地EXCEL,将CELL内公式转换为参数 *
* 根据参数调用函数,返回结果回写入CELL *
*----------------------------------------------------------------------*
* Modification Log <程序修改日志> *
*Date Programmer Corr. # Description *
*2007.12.07 YANGMIN Initial pgm dev *
*----------------------------------------------------------------------*
REPORT z_fi_dcv_0001.
*&---------------------------------------------------------------------*
*& 变量声明 *---服务器上文件路径,客户端临时文件夹声明
*&---------------------------------------------------------------------*
DATA: g_user_file_path(60) TYPE c."存放登陆用户的系统临时文件夹路径
INCLUDE ole2incl.
DATA: excel TYPE ole2_object,
workbook TYPE ole2_object, " Workbook object
book TYPE ole2_object,
sheet TYPE ole2_object, " Worksheet object
range TYPE ole2_object, " Range object
cell TYPE ole2_object. " Cell object
DATA: sheet_name(20) VALUE 'SHEET1'. "Excel文件里的sheet name
DATA local_file LIKE rcgfiletr-ftfront."下载文件类型
DATA: gt_data TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE. "便历EXCEL 所有数据
DATA: gchange_data TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE."存放需要修改的单元格数据
DATA: g_sql TYPE string."测试拼接SQL语句
DATA: str_name TYPE string."存放本地的EXCEL名字
*****传递给函数的内表 结构 参考zsfagl****************************************
data: new_table_to_function LIKE zsfagl OCCURS 0 WITH HEADER LINE.
DATA: xin_table_to_function LIKE new_table_to_function OCCURS 0 WITH HEADER LINE."传递给函数的内表参数
DATA: t1 LIKE SY-UZEIT,"运行开始时间
t2 LIKE SY-UZEIT,"运行结束
t3 LIKE SY-UZEIT."运行时间差
t1 = SY-UZEIT.
***********定义屏幕元素********************************************************************************************************
*&---------------------------------------------------------------------*
*& Select-OPTIONS
*&---------------------------------------------------------------------*
SelectION-SCREEN BEGIN OF BLOCK zblock003 WITH FRAME TITLE text-001.
PARAMETERS:p_bukrs LIKE ekko-bukrs,"公司代码
p_gjahr LIKE bkpf-gjahr,"会计凭证年度
p_rpmax LIKE faglflext-rpmax,"起始 月份
p_xend LIKE faglflext-rpmax."终止 月份
*****选择报表类型 下拉GRID 方式1*****************************
TABLES: ZTFIBBK.
DATA:
filepath_real(60) TYPE c,"通过SQL语句再获得 真实路径
lc_filepath LIKE zfitable00-filepath,
ltab_fields LIKE help_value OCCURS 0 WITH HEADER LINE,
BEGIN OF ltab_values OCCURS 0,
feld(40) TYPE c,
END OF ltab_values.
PARAMETERS: filepath(60) TYPE c OBLIGATORY."获得文件名
SelectION-SCREEN END OF BLOCK zblock003.
AT SelectION-SCREEN ON VALUE-REQUEST FOR filepath.
*获得文件名
PERFORM get_path_value USING filepath text-006.
*------调用事件----------------------------------------
*INITIALIZATION."初始化事件
INITIALIZATION .
ltab_fields-tabname = 'ZTFIBBK '."'ZFITABLE00'.
ltab_fields-fieldname = 'BBMC'."'TABLENAME'.
ltab_fields-selectflag = 'X'.
APPEND ltab_fields.
ltab_fields-tabname = 'ZTFIBBK'.
ltab_fields-fieldname = 'FILEPATH'.
ltab_fields-selectflag = space.
APPEND ltab_fields.
Select * FROM ZTFIBBK.
ltab_values-feld = ZTFIBBK-BBMC.
APPEND ltab_values.
ltab_values-feld = ZTFIBBK-filepath.
APPEND ltab_values.
ENDSelect.
*----------------------------------------------------------------------*
*START-OF-SelectION
*----------------------------------------------------------------------*
START-OF-SelectION.
*获得用户TEMP路径
PERFORM get_user_info USING g_user_file_path.
*根据选择的 会计表名,查找出表名真实路径
Select SINGLE filepath FROM ZTFIBBK
INTO filepath_real
Where bbmc = filepath.
*读本地服务器文件到本地
PERFORM read_serverfile_to_local USING filepath_real str_name.
*把STRING类型 赋值给 rcgfiletr-ftfront 类型,否则函数参数类型不同
local_file = str_name.
PERFORM get_data_to_innertable TABLES gt_data USING local_file." 从本地文件local_file 读 EXCEL模版单元格到内表gt_data
*PERFORM display TABLES gt_data."测试显示结果 取的表名,字段名
* gt_data放初始EXCEL内表, table_to_function 为处理后内表
* PERFORM processdata_to_function TABLES gt_data table_to_function.
PERFORM processdata_to_function TABLES gt_data xin_table_to_function.
* 调用庄闽程序 暂时缺少输出结果表参数
PERFORM call_new TABLES xin_table_to_function USING p_bukrs p_gjahr p_rpmax p_xend.
* PERFORM CALL_SECOND TABLES
* 将函数结果表传递给要更新的内表
* PERFORM processdata_from_function TABLES table_from_function gchange_data .
* 根据内表数据 替换本地EXCEL数据
PERFORM write_to_local_excel TABLES gchange_data USING local_file ."将需要替换的数据 写回EXCEL相应单元格
*更新启群的 模版路径表
PERFORM process_data_test.
*将屏幕元素写入EXCEL
*PERFORM fill_fix_value_to_innertable.
t2 = SY-UZEIT.
t3 = t2 - t1.
WRITE:'程序运行时间为:',t3.
*&---------------------------------------------------------------------*
*& Form read_serverfile_to_local
*&---------------------------------------------------------------------*
* text 读读服务器上文件并下载到本地
*----------------------------------------------------------------------*
* -->F_NAME text 服务器路径+文件名
* -->F_DIR text 本地文件名 利用CHARGING 回写 f_local_file
*----------------------------------------------------------------------*
FORM read_serverfile_to_local USING f_server_file TYPE c CHANGING f_local_file TYPE string .
DATA: f_itab TYPE TABLE OF x WITH HEADER LINE.
DATA: f_length TYPE i.
DATA:f_name LIKE epsf-epsfilnam, "类型参考 函数 EPS_GET_FILE_ATTRIBUTES
f_dir LIKE epsf-epsdirnam.
DATA:o_dir TYPE string,
o_name TYPE string.
DATA: f_11 TYPE sy-fdpos.
DATA: f_itabnew TYPE TABLE OF string.
SPLIT f_server_file AT '\' INTO TABLE f_itabnew."分离字符串到内表
LOOP AT f_itabnew INTO o_name."读到最后一个 \
* WRITE / o_name.
ENDLOOP.
SEARCH f_server_file FOR o_name.
IF sy-subrc = 0.
f_11 = sy-fdpos.
o_dir = f_server_file+0(f_11).
ENDIF.
f_dir = o_dir."请注意本步转换
f_name = o_name.
****读服务器上文件到内表********************
OPEN DATASET f_server_file FOR INPUT IN BINARY MODE.
DO.
READ DATASET f_server_file INTO f_itab.
IF sy-subrc <> 0 .
EXIT.
ENDIF.
APPEND f_itab.
ENDDO.
****计算下载文件大小********************
CALL FUNCTION 'EPS_GET_FILE_ATTRIBUTES'
EXPORTING
file_name = f_name "str_name_new " '出口统计.xls' "类型:epsf-epsfilnam
dir_name = f_dir "str_dir_new " "'\usr\sap\ids\dvebmgs00\log\' "类型:epsf-epsdirnam
IMPORTING
file_size = f_length
* FILE_OWNER =
* FILE_MODE =
* FILE_TYPE =
* FILE_MTIME =
* FILE_SIZE_LONG =
EXCEPTIONS
read_directory_failed = 1
read_attributes_failed = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*连接字符串组成文件路径 用户本地TEMP路径+文件名
CONCATENATE g_user_file_path '\' o_name INTO o_name.
f_local_file = o_name.
g_sql = f_local_file.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = f_length "56018
filename = f_local_file "'d:\9_new.xls' "str_name "
filetype = 'BIN'
TABLES
data_tab = f_itab
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
***************************************************************************
ENDFORM. "read_serverfile_to_local
*& Form write_to_local_excel
*&---------------------------------------------------------------------*
* text 打开EXCEL,并将将数据写回EXCEL
* f_table 存放需要替换的内容组成的内表 f_local_file 本地指定的EXCEL文件
*----------------------------------------------------------------------*
FORM write_to_local_excel TABLES f_table STRUCTURE alsmex_tabline USING f_local_file LIKE rcgfiletr-ftfront.
Create OBJECT excel 'EXCEL.APPLICATION'. "Create EXCEL OBJECT
IF sy-subrc NE 0.
EXIT.
ENDIF.
SET PROPERTY OF excel 'Visible' = 1. "是否显示EXCEL
CALL METHOD OF excel 'Workbooks' = workbook.
DATA h TYPE i.
CALL METHOD OF workbook 'Open'
EXPORTING
#1 = f_local_file.
CALL METHOD OF excel 'Sheets' = sheet
EXPORTING
#1 = 1.
CALL METHOD OF sheet 'Select' .
WRITE:/,'写入固定数据'.
*填充
* PERFORM fill_range USING 8 1 g_sql ."'100'. "第8行第1列
* PERFORM fill_range USING 2 1 '20' ."'100'. "第2行第1列
* PERFORM fill_range USING 2 2 '-4' ."'100'. "第2行第2列
LOOP AT f_table.
PERFORM fill_range USING f_table-row f_table-col f_table-value ." "在这框的下面10列显示结果
WRITE:/,'写入数据:','行:',f_table-row ,'列:',f_table-col,'值',f_table-value.
ENDLOOP.
GET PROPERTY OF excel 'ActiveWorkbook' = sheet.
* CALL METHOD OF sheet 'printout'. "打印
* CALL METHOD OF excel 'SAVE'. "保存
* CALL METHOD OF excel 'Quit'. "退出
FREE OBJECT cell.
FREE OBJECT range.
FREE OBJECT sheet.
FREE OBJECT workbook.
FREE OBJECT excel.
ENDFORM. "write_to_local_excel
*&---------------------------------------------------------------------*
*& Form fill_range
*&---------------------------------------------------------------------*
* text 填充EXCEL 单元格
*----------------------------------------------------------------------*
* -->VALUE(F_ROW) text
* -->VALUE(F_COL) text
* -->VALUE(F_VALUE) text
*----------------------------------------------------------------------*
FORM fill_range USING value(f_row)
value(f_col)
value(f_value).
DATA:
row TYPE i,
col TYPE i.
row = f_row.
col = f_col.
CALL METHOD OF excel 'CELLS' = cell
EXPORTING
#1 = row
#2 = col.
SET PROPERTY OF cell 'VALUE' = f_value.
ENDFORM. "fill_range
*&---------------------------------------------------------------------*
*& Form Get_data_to_innerTable
*&---------------------------------------------------------------------*
* text 打开本地EXCEL文件 并传递到内表
*----------------------------------------------------------------------*
FORM get_data_to_innertable TABLES f_tab STRUCTURE alsmex_tabline USING f_file_name LIKE rlgrap-filename.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = f_file_name
i_begin_col = 1
i_begin_row = 1
i_end_col = 100
i_end_row = 30000
TABLES
intern = f_tab"gt_data
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
SORT gt_data BY row col value."按行,列排序
ENDFORM. "Get_data_to_innerTable
*&---------------------------------------------------------------------*
*& Form ProcessData_to_function
*&---------------------------------------------------------------------*
* text 将EXCEL读出的内表 筛选为传递参数内表
*----------------------------------------------------------------------*
*FORM processdata_to_function TABLES f_table STRUCTURE alsmex_tabline f_table_to_function STRUCTURE type_table_to_function.
FORM processdata_to_function TABLES f_table STRUCTURE alsmex_tabline f_table_to_function STRUCTURE new_table_to_function.
DATA: f_1 TYPE sy-fdpos,
f_2 TYPE sy-fdpos,
f_3 TYPE sy-fdpos.",
* f_4 TYPE sy-fdpos,
* f_5 TYPE sy-fdpos,
* f_6 TYPE sy-fdpos.
DATA: s_1 TYPE char10,
s_1_new LIKE s_1,
s_2 TYPE char20,
s_2_new LIKE s_2,
s_3 TYPE char10,
s_3_new LIKE s_2.",
* s_4 TYPE char10,
* s_4_new LIKE s_2,
* s_5 TYPE char10,
* s_5_new LIKE s_2,
* s_6 TYPE char10,
* s_6_new TYPE char10.
DATA: ln_spaces TYPE i.
ln_spaces = 1.
DATA: new_col LIKE alsmex_tabline-col.
DATA: new_row LIKE alsmex_tabline-row.
DATA: s_sql TYPE string.
DATA: s_value TYPE f.
DATA: flag TYPE i."单元格正负
ULINE.
WRITE:/,'EXCEL 中初始数据为:'.
LOOP AT f_table.
*去除前面的0,否则显示 1,4单元格 为0001,0004
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = f_table-row
IMPORTING
output = f_table-row.
*去除前面的0
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = f_table-col
IMPORTING
output = f_table-col.
WRITE:/,'行:',f_table-row,'列:',f_table-col,'值:',f_table-value.
*~defined(zcfz营业收入)_bq
**************
SEARCH f_table-value FOR '('. "先搜索 ( 号
IF sy-subrc = 0. "如果找到
f_1 = sy-fdpos.
SEARCH f_table-value FOR '_'.
IF sy-subrc = 0 .
f_2 = sy-fdpos.
* 找到 营业收入
f_3 = f_1 + 5."
s_3 = f_table-value+f_3(4).
WRITE:'取得的项目名为:',s_3."营业收入
f_1 = f_1 + 1."现在假设表名字为ZCFZ + 5. "(ZCFZ 共5个字符
s_1 = f_table-value+f_1(4). "zcfz 4个字符 "营业收入 4个字符
WRITE:'取得的表名为:',s_1."zcfz
f_2 = f_2 + 1.
s_2 = f_table-value+f_2(2).
WRITE:'取得的期间为:',s_2. "bq 2个字符
s_2_new+ln_spaces = s_2 ."补充前面空格
s_1_new+ln_spaces = s_1.
**********形成传递给庄闽的结果内表********************************************************
* f_table_to_function-row = f_table-row.
* f_table_to_function-col = f_table-col.
* f_table_to_function-old_value = f_table-value.
* f_table_to_function-xiangmu = s_3.
* f_table_to_function-qijian = s_2.
* APPEND f_table_to_function.
* item type char50,
* qsff TYPE char10,
* wrbtr LIKE bseg-wrbtr ,
* rtcur LIKE bseg-PSWSL,
** exrow TYPE numeric,
** excol TYPE numeric,
* exrow TYPE i,
* excol TYPE i,
* olval TYPE char50,
f_table_to_function-exrow = f_table-row.
f_table_to_function-excol = f_table-col.
f_table_to_function-olval = f_table-value.
f_table_to_function-item = s_3.
f_table_to_function-qsff = s_2.
APPEND f_table_to_function.
ENDIF.
ENDIF.
ENDLOOP.
*PERFORM fill_fix_value_to_innertable.
*****测试传给庄闽的内表数据**********************************
WRITE:/,'******这是向庄闽传递的内表参数*******'.
LOOP AT f_table_to_function.
* WRITE:/,'row',f_table_to_function-row,'col',f_table_to_function-col,'old_value',f_table_to_function-old_value,'xiangmu',f_table_to_function-xiangmu,'qijian',f_table_to_function-qijian.
WRITE:/,'row',f_table_to_function-exrow,'col',f_table_to_function-excol,'old_value',f_table_to_function-olval,'xiangmu',f_table_to_function-item,'qijian',f_table_to_function-qsff.
ENDLOOP.
ENDFORM. "ProcessData_to_function
*&---------------------------------------------------------------------*
*& Form ProcessData_from_function
*&---------------------------------------------------------------------*
* text 从函数取回结果内表附加到需要修改的内表
*----------------------------------------------------------------------*
FORM processdata_from_function TABLES f_table STRUCTURE new_table_to_function f_outab STRUCTURE alsmex_tabline.
DATA: flag TYPE i.
ULINE.
WRITE:/,'函数传递来的结果内表为:'.
LOOP AT f_table.
flag = 1."默认CELL单元格数值为正
SEARCH f_table-olval FOR ':=-1*'.
IF sy-subrc = 0.
flag = 0. "进行标记 CELL 中添充结果为负
ENDIF.
IF flag = 0.
f_outab-value = f_table-wrbtr.
ELSEIF flag = 1.
* f_table-b = f_table-b * -1. "这样写 传递到EXCEL竟然成了 12-
f_outab-value = f_table-wrbtr.
CONCATENATE '-' f_outab-value INTO f_outab-value.
ENDIF.
f_outab-row = f_table-exrow.
f_outab-col = f_table-excol.
APPEND f_outab.
ENDLOOP.
* MODIFY f_outab."因为是引用传递,所以这里不能用MODIFY 否则有BUG
*****测试庄闽函数传出的内表数据**********************************
WRITE:/,'******这是要替换EXCEL内容的内表*******'.
LOOP AT f_outab.
WRITE:/,'row:',f_outab-row,'col:',f_outab-col,'NEW_value:',f_outab-value.
ENDLOOP.
PERFORM fill_fix_value_to_innertable.
ENDFORM. "ProcessData_from_function
*&---------------------------------------------------------------------*
*& Form fill_fix_value_to_innertable
*&---------------------------------------------------------------------*
* text 写入固定数据到内表
*----------------------------------------------------------------------*
FORM fill_fix_value_to_innertable.
*****屏幕元素写入指定单元格*************************************
gchange_data-row = 12 .
gchange_data-col = 1 .
gchange_data-value = '系统当前日期为:' .
WRITE:/,'追加数据:','行:',gchange_data-row ,'列:',gchange_data-col,'值',gchange_data-value.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 2 .
gchange_data-value = sy-datum .
WRITE:/,'追加数据:','行:',gchange_data-row ,'列:',gchange_data-col,'值',gchange_data-value.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 3 .
gchange_data-value = '当前时间:'.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 4 .
gchange_data-value = sy-uzeit .
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 5 .
gchange_data-value = '当前用户为:'.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 6 .
gchange_data-value = sy-uname .
APPEND gchange_data.
gchange_data-row = 13 .
gchange_data-col = 1 .
gchange_data-value = '屏幕选择的公司代码为'.
APPEND gchange_data.
gchange_data-row = 13 .
gchange_data-col = 2 .
gchange_data-value = p_bukrs .
APPEND gchange_data.
* s_GJAHR LIKE BKPF-GJAHR,"会计凭证年度
* S_RPMAX LIKE FAGLFLEXT-RPMAX."期间 月份
gchange_data-row = 14 .
gchange_data-col = 1 .
gchange_data-value = '屏幕选择的会计年度为'.
APPEND gchange_data.
gchange_data-row = 14 .
gchange_data-col = 2 .
gchange_data-value = p_gjahr .
APPEND gchange_data.
gchange_data-row = 15 .
gchange_data-col = 1 .
gchange_data-value = '屏幕选择的期间为'.
APPEND gchange_data.
gchange_data-row = 15 .
gchange_data-col = 2 .
gchange_data-value = p_rpmax .
APPEND gchange_data.
gchange_data-row = 16 .
gchange_data-col = 1 .
gchange_data-value = '1 选择的文件为:'.
APPEND gchange_data.
gchange_data-row = 16 .
gchange_data-col = 2 .
gchange_data-value = filepath .
APPEND gchange_data.
* gchange_data-row = 17 .
* gchange_data-col = 1 .
* gchange_data-value = '2 选择的文件路径为:'.
* APPEND gchange_data.
* gchange_data-row = 17 .
* gchange_data-col = 2 .
* gchange_data-value = ps_parm .
* APPEND gchange_data.
ENDFORM. "fill_fix_value_to_innertable
*&---------------------------------------------------------------------*
*& Form get_path_value
*&---------------------------------------------------------------------*
* text 文件路径 自定义搜索帮助
*----------------------------------------------------------------------*
* -->P_WERKS text
* -->P_TEXT_006 text
*----------------------------------------------------------------------*
FORM get_path_value USING p_table
p_text_006.
CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE'
EXPORTING
fieldname = 'BBMC' "'TABLENAME' "'WERKS'
tabname = 'ZTFIBBK'" 'ZFITABLE00' "'T001W'
title_in_values_list = 'Select a value'
IMPORTING
select_value = p_table "p_werks
TABLES
fields = ltab_fields
valuetab = ltab_values
EXCEPTIONS
field_not_in_ddic = 01
more_then_one_selectfield = 02
no_selectfield = 03.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_user_info
*&---------------------------------------------------------------------*
* text 得到用户 TEMP路径
*----------------------------------------------------------------------*
* -->F_TEMP_INFO text
*----------------------------------------------------------------------*
FORM get_user_info CHANGING f_temp_info TYPE c.
* DATA: f_temp_info(255) TYPE C.
CALL FUNCTION 'GUI_GET_DESKTOP_INFO'
EXPORTING
type = '4'
CHANGING
return = f_temp_info.
ENDFORM. "get_user_info
*&---------------------------------------------------------------------*
*& Form DISPLAY
*&---------------------------------------------------------------------*
* text 纯粹测试无其他意义
*----------------------------------------------------------------------*
FORM display TABLES f_table STRUCTURE alsmex_tabline .
DATA: f_1 TYPE sy-fdpos,
f_2 TYPE sy-fdpos,
f_3 TYPE sy-fdpos,
f_4 TYPE sy-fdpos,
f_5 TYPE sy-fdpos,
f_6 TYPE sy-fdpos.
DATA: s_1 TYPE char10,
s_1_new LIKE s_1,
s_2 TYPE char20,
s_2_new LIKE s_2,
s_3 TYPE char10,
s_3_new LIKE s_2,
s_4 TYPE char10,
s_4_new LIKE s_2,
s_5 TYPE char10,
s_5_new LIKE s_2,
s_6 TYPE char10,
s_6_new TYPE char10.
DATA: ln_spaces TYPE i.
ln_spaces = 1.
DATA: new_col LIKE alsmex_tabline-col.
DATA: new_row LIKE alsmex_tabline-row.
DATA: s_sql TYPE string.
DATA: s_value TYPE f.
DATA: flag TYPE i."单元格正负
*****测试写参数表 并传递给庄闽的函数*************************************************
DATA: BEGIN OF f_table_to_function OCCURS 0,
row TYPE i,
col TYPE i,
old_value TYPE char50,
xiangmu TYPE char20,
qijian TYPE char20,
* new_value TYPE char50, "新的结果值要等 庄闽返回结果内表 去找
END OF f_table_to_function.
f_table_to_function-row = 20.
f_table_to_function-col = 1.
f_table_to_function-old_value = '~defined(zcfz营业收入)_bq'.
f_table_to_function-xiangmu = '营业收入'.
f_table_to_function-qijian = 'bq'.
* f_table_to_Function-new_value = '209556.89'.
APPEND f_table_to_function.
****************************************************************
*****测试读 庄闽返回的结果内表*************************************************
DATA: BEGIN OF zcfz OCCURS 0,
a TYPE string,
b TYPE i,
c TYPE string,
END OF zcfz.
zcfz-a = 'test1'.
zcfz-b = 12.
zcfz-c = '~defined(zcfz营业收入)_bq'.
APPEND zcfz.
zcfz-a = '内表中存的数据:test2'.
zcfz-b = 24.
zcfz-c = '~defined(ZCFZ销售费用_bq)~'.
APPEND zcfz.
****************************************************************
ULINE.
WRITE:/,'EXCEL 中初始数据为:'.
LOOP AT f_table.
flag = 1."默认CELL单元格数值为正
SEARCH f_table-value FOR ':=-1*'.
IF sy-subrc = 0.
flag = 0. "进行标记 CELL 中添充结果为负
ENDIF.
*去除前面的0,否则显示 1,4单元格 为0001,0004
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = f_table-row
IMPORTING
output = f_table-row.
*去除前面的0
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = f_table-col
IMPORTING
output = f_table-col.
WRITE:/,'行:',f_table-row,'列:',f_table-col,'值:',f_table-value.
*~defined(zcfz营业收入)_bq
**************
SEARCH f_table-value FOR '('. "先搜索 ( 号
IF sy-subrc = 0. "如果找到
f_1 = sy-fdpos.
SEARCH f_table-value FOR '_'.
IF sy-subrc = 0 .
f_2 = sy-fdpos.
* 找到 营业收入
f_3 = f_1 + 5."
s_3 = f_table-value+f_3(4).
WRITE:'取得的项目名为:',s_3."营业收入
f_1 = f_1 + 1."现在假设表名字为ZCFZ + 5. "(ZCFZ 共5个字符
s_1 = f_table-value+f_1(4). "zcfz 4个字符 "营业收入 4个字符
WRITE:'取得的表名为:',s_1."zcfz
f_2 = f_2 + 1.
s_2 = f_table-value+f_2(2).
WRITE:'取得的期间为:',s_2. "bq 2个字符
s_2_new+ln_spaces = s_2 ."补充前面空格
s_1_new+ln_spaces = s_1.
**********形成传递给庄闽的结果内表********************************************************
f_table_to_function-row = f_table-row.
f_table_to_function-col = f_table-col.
f_table_to_function-old_value = f_table-value.
f_table_to_function-xiangmu = s_3.
f_table_to_function-qijian = s_2.
APPEND f_table_to_function.
****************************************************************
** CONCATENATE ' select' s_2_new ' from' s_1_new INTO g_sql. "且该命令忽略被连接的各个字符串的尾部空格 注意是尾部!!
* CONCATENATE 'READ TABLE ' s_1_new ' INDEX 1' INTO g_sql. "且该命令忽略被连接的各个字符串的尾部空格 注意是尾部!!
* WRITE:/,'SQL IS:',g_sql.
* 测试从庄闽传递来的记过内表中 检索出数据 插入要替换的内表 ************************************
CLEAR g_sql.
READ TABLE zcfz WITH KEY a = 'test1' . "b = 100.
IF sy-subrc = 0.
g_sql = zcfz-b.
* CONCATENATE '=-1*' g_sql INTO g_sql.
IF flag = 0. "FALG 为 0 时表负数
CONCATENATE '=-1*' g_sql INTO g_sql.
ENDIF.
ENDIF.
WRITE:/,'现在从内表中读到的数据为:',g_sql.
* 将需要转换的单元格汇总,加载到 需要修改数据的内表
CLEAR s_sql.
s_sql = g_sql.
new_col = f_table-col. " + 4.
* new_row = f_table-row + 10.
new_row = f_table-row + 1.
gchange_data-row = new_row .
gchange_data-col = new_col .
gchange_data-value = s_sql .
WRITE:/,'追加数据:','行:',gchange_data-row ,'列:',gchange_data-col,'值',gchange_data-value.
APPEND gchange_data.
ENDIF.
ENDIF.
ENDLOOP.
*****屏幕元素写入指定单元格*************************************
gchange_data-row = 12 .
gchange_data-col = 1 .
gchange_data-value = '系统当前日期为:' .
WRITE:/,'追加数据:','行:',gchange_data-row ,'列:',gchange_data-col,'值',gchange_data-value.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 2 .
gchange_data-value = sy-datum .
WRITE:/,'追加数据:','行:',gchange_data-row ,'列:',gchange_data-col,'值',gchange_data-value.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 3 .
gchange_data-value = '当前时间:'.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 4 .
gchange_data-value = sy-uzeit .
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 5 .
gchange_data-value = '当前用户为:'.
APPEND gchange_data.
gchange_data-row = 12 .
gchange_data-col = 6 .
gchange_data-value = sy-uname .
APPEND gchange_data.
gchange_data-row = 13 .
gchange_data-col = 1 .
gchange_data-value = '屏幕选择的公司代码为'.
APPEND gchange_data.
gchange_data-row = 13 .
gchange_data-col = 2 .
gchange_data-value = p_bukrs .
APPEND gchange_data.
* s_GJAHR LIKE BKPF-GJAHR,"会计凭证年度
* S_RPMAX LIKE FAGLFLEXT-RPMAX."期间 月份
gchange_data-row = 14 .
gchange_data-col = 1 .
gchange_data-value = '屏幕选择的会计年度为'.
APPEND gchange_data.
gchange_data-row = 14 .
gchange_data-col = 2 .
gchange_data-value = p_gjahr .
APPEND gchange_data.
gchange_data-row = 15 .
gchange_data-col = 1 .
gchange_data-value = '屏幕选择的期间为'.
APPEND gchange_data.
gchange_data-row = 15 .
gchange_data-col = 2 .
gchange_data-value = p_rpmax .
APPEND gchange_data.
gchange_data-row = 16 .
gchange_data-col = 1 .
gchange_data-value = '1 选择的文件为:'.
APPEND gchange_data.
gchange_data-row = 16 .
gchange_data-col = 2 .
gchange_data-value = filepath .
APPEND gchange_data.
* gchange_data-row = 17 .
* gchange_data-col = 1 .
* gchange_data-value = '2 选择的文件路径为:'.
* APPEND gchange_data.
* gchange_data-row = 17 .
* gchange_data-col = 2 .
* gchange_data-value = ps_parm .
* APPEND gchange_data.
*****测试传给庄闽的内表数据**********************************
WRITE:/,'******这是向庄闽传递的内表参数*******'.
LOOP AT f_table_to_function.
WRITE:/,'row',f_table_to_function-row,'col',f_table_to_function-col,'old_value',f_table_to_function-old_value,'xiangmu',f_table_to_function-xiangmu,'qijian',f_table_to_function-qijian.
ENDLOOP.
ENDFORM. "DISPLAY
*&---------------------------------------------------------------------*
*& Form call_new
*&---------------------------------------------------------------------*
* text 调用庄闽函数 输入,输出同为 f_tab表,不知是否可行
*----------------------------------------------------------------------*
* -->F_TAB text
* -->F_BUKRS text
* -->F_YEAR text
* -->F_FR text
* -->F_TO text
*----------------------------------------------------------------------*
*FORM call_new TABLES f_tab STRUCTURE type_table_to_function USING f_bukrs LIKE ekko-bukrs f_year LIKE bkpf-gjahr f_fr LIKE faglflext-rpmax f_to LIKE faglflext-rpmax .
FORM call_new TABLES f_tab STRUCTURE new_table_to_function USING f_bukrs LIKE ekko-bukrs f_year LIKE bkpf-gjahr f_fr LIKE faglflext-rpmax f_to LIKE faglflext-rpmax .
CALL FUNCTION 'Z_FI_FAGL_RPT_ITEM'
EXPORTING
i_ryear = f_year
i_bukrs = f_bukrs
i_frper = f_fr
i_toper = f_to
TABLES
t_fitab = f_tab.
LOOP AT f_tab.
gchange_data-row = f_tab-exrow.
gchange_data-col = f_tab-excol.
gchange_data-value = f_tab-wrbtr.
APPEND gchange_data.
ENDLOOP.
ENDFORM. "call_new
*&---------------------------------------------------------------------*
*& Form process_data_test
*&---------------------------------------------------------------------*
* text 测试表添加,修改,删除 主要与新同事交流用
*----------------------------------------------------------------------*
FORM process_data_test.
***测试删除数据*****************
Delete FROM zfitable00 Where bukrs <> '1000'.
* Delete sflight FROM TABLE sflight_key_tab. "另外一种删除表的语法
***测试添加数据******
* DATA: z_temp LIKE zfitable00 OCCURS 0 WITH HEADER LINE.
* z_temp-bukrs = '1000'.
* z_temp-tablename = 'A05'.
* z_temp-uname = 'YANGMIN'.
* z_temp-filepath = '\usr\sap\ids\dvebmgs00\log\9.xls'.
** Insert line INTO TABLE itab.
* Insert into zfitable00 values z_temp .
*****测试更新数据*************
Update ztfibbk" zfitable00
SET filepath = '\usr\sap\ids\dvebmgs00\log\资产负债表.xls'
* tablename = '资产负债表'
Where bbdm = 'A01'.
Update ztfibbk" zfitable00
SET filepath = '\usr\sap\ids\dvebmgs00\log\利润表.xls'
* tablename = '资产负债表'
Where bbdm = 'A03'.
* Select *
* FROM zfitable00
* INTO TABLE z_temp.
*
** modify zfitable00 from z_temp .
*
* LOOP AT z_temp.
* WRITE:/,'TABLENAME:',z_temp-tablename,'path:',z_temp-filepath.
* ENDLOOP.
ENDFORM. "process_data_test
ABAP操作EXCEL (号称超级版)的更多相关文章
- 使用ABAP操作Excel的几种方法
这篇文章本来不在我计划之内,因为最近一个朋友微信上问到我这个问题,但我平时在SAP研究院工作中从没遇到过需要用ABAP操作Excel的需求,因此也没有太多技术实现细节可以分享给大家,只能泛泛写一些. ...
- NPOI操作Excel 005:写入空Excel(Winform版)
前文写了一个BS版本号的导出Excel的样例(http://blog.csdn.net/yysyangyangyangshan/article/details/47904119).对于CS版在保存的地 ...
- POI操作Excel
POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...
- JAVA的POI操作Excel
1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- 用DELPHI操作EXCEL Word
用DELPHI操作EXCEL 在DELPHI中显示EXCEL文件,可用以下简单代码做到.但要实用,则需进一步完善. var Form1: TForm1; EApp:variant;implemen ...
- OLE-DB 操作excel 基本
1 方法用例 *&---------------------------------------------------------------------* *& 本程序总结了常 ...
- Apache POI组件操作Excel,制作报表(一)
Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和Po ...
- C++中利用libxl操作Excel表格
libxl是一款操作excel的商业库,支持C.C++.C#和Delphi.下文利用libxl在C++中实现了从excel文档的表1中随机挑选记录,保存到新建的表中.以下为代码: #include & ...
随机推荐
- python实现大文件分割与合并
小U盘传大电影时可以免去用winrar分割文件时的压缩和解压缩过程. file.py import sys from os.path import exists fileCount = 0 def s ...
- Unity3D的脚本-script入门
来自:http://blog.163.com/shininglore@126/blog/static/961841802013412101454833/ Unity3D的基本操作很容易就能掌握了,接下 ...
- Android学习(七) Android实现计算器
前台页面代码,通过线性布局方式实现计算器页面:如图所示 color.xml,自定义颜色values: <?xml version="1.0" encoding="u ...
- 快速构建大数据存储分析平台-ELK平台安装
一.概述 ELK是由Elastic公司开发的Elasticsearch.Logstash.Kibana三款开源软件的缩写(但不限于这三款软件). 为什么使用ELK? 在目前流行的微服务架构中,一个大型 ...
- Android Studio加入插件(Genymotion)
官方模拟器的龟速已让我们无力吐槽.幸好有genymotion这款逆天的Android虚拟机,它有着高速的开启速度,良好的交互界面. 是Android开发必备的良品.甚至有些玩家已经用genymotio ...
- 无法将“Update-Database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的问题
原因: 没有引用EntityFramework命令 解决: 在程序包管理器控制台执行如下命令:Import-Module 项目路径\packages\EntityFramework.6.1.3(EF版 ...
- 获取bundle文件下的资源
NSBundle* bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle].resourcePath stringByAppendingPat ...
- List of CentOS Mirrors
From:https://www.centos.org/download/mirrors/ CentOS welcomes new mirror sites. If you are consideri ...
- Element type "Resource" must be followed by either attribute specifications, ">" or "/>".
在xml中配置没有问题的情况下.检查是否有单词中间缺少 空格 .2个单词靠的太近的情况! 试了一下情况解决!
- 【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】
[114-Flatten Binary Tree to Linked List(二叉树转单链表)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...