事务: OAOR :上传模板

abap案例
gui:STA_0100

屏幕: 100

效果:

TYPE-POOLS: slis,
ole2,
vrm.
DATA: go_container TYPE REF TO cl_gui_container,
go_splitter TYPE REF TO cl_gui_splitter_container,
go_control TYPE REF TO i_oi_container_control,
go_document TYPE REF TO i_oi_document_proxy,
go_spreadsheet TYPE REF TO i_oi_spreadsheet,
go_error TYPE REF TO i_oi_error.
CONSTANTS: gc_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION',
gc_classtype TYPE sbdst_classtype VALUE 'OT',
gc_object_key TYPE sbdst_object_key VALUE 'DOITEST',
gc_pwd TYPE char30 VALUE 'DOITEST',
gc_top TYPE i VALUE 6, "数据开始行
gc_column_left TYPE i VALUE 4, "固定列
gc_column_right TYPE i VALUE 9. "固定列
DATA: gs_handle TYPE cntl_handle,
gs_sheet TYPE ole2_object,
gs_rows TYPE ole2_object,
gs_rows1 TYPE ole2_object,
gs_columns TYPE ole2_object,
gs_columns1 TYPE ole2_object,
gs_cells TYPE ole2_object,
gs_cells1 TYPE ole2_object,
gs_range TYPE ole2_object,
gs_validation TYPE ole2_object.
DATA: gv_code TYPE sy-ucomm,
ok_code TYPE sy-ucomm,
gv_mode TYPE flag,
gv_return TYPE flag.
DATA: gs_error LIKE go_error,
gt_error LIKE TABLE OF go_error.
START-OF-SELECTION.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
DATA: lt_extab TYPE slis_t_extab,
lv_title TYPE string.
SET PF-STATUS 'STA_0100' EXCLUDING lt_extab.
SET TITLEBAR 'TIT_0100' WITH lv_title.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module PBO_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE pbo_0100 OUTPUT.
IF go_spreadsheet IS INITIAL.
PERFORM progress_indicator USING 60 '正在打开Excel......' .
PERFORM create_doi. "创建DOI对象
PERFORM progress_indicator USING 80 '正在向Excel中写入数据......' .
PERFORM fill_sheet. "填写SHEET数据
PERFORM progress_indicator USING 90 '正在显示Excel......' .
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module EXIT_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE exit_0100 INPUT.
IF go_spreadsheet IS NOT INITIAL.
CALL METHOD go_spreadsheet->clear_all_ranges( ).
FREE go_spreadsheet.
ENDIF.
IF NOT go_document IS INITIAL.
CALL METHOD go_document->close_document.
CALL METHOD go_document->release_document.
FREE go_document.
ENDIF.
IF NOT go_control IS INITIAL.
CALL METHOD go_control->release_all_documents.
CALL METHOD go_control->destroy_control.
FREE go_control .
ENDIF.
IF go_container IS NOT INITIAL.
CALL METHOD go_container->free.
FREE go_container.
ENDIF.
IF go_splitter IS NOT INITIAL.
CALL METHOD go_splitter->free.
FREE go_splitter.
ENDIF.
FREE: gt_error.
LEAVE TO SCREEN 0.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
DATA: lv_answer TYPE char01.
CLEAR: gv_code.
gv_code = ok_code.
CASE gv_code.
WHEN 'EXPORT'. "导出
PERFORM unprotect.
PERFORM export_data USING '导出表格'.
PERFORM protect.
WHEN '&F03' OR '&F12' OR '&F15'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
CLEAR: ok_code.
ENDMODULE.
FORM export_data USING pa_fname.
DATA: lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
lv_file_name TYPE char256,
lv_desktop_path TYPE char100.
" 获取桌面信息
CALL FUNCTION 'GUI_GET_DESKTOP_INFO'
EXPORTING
type = 11
CHANGING
return = lv_desktop_path.
lv_path = lv_desktop_path.
lv_filename = |{ pa_fname }.XLS|.
" 获取保存文件路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
file_filter = cl_gui_frontend_services=>filetype_excel
initial_directory = lv_path
default_file_name = lv_filename
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF lv_fullpath IS INITIAL.
MESSAGE s000(zfi01) WITH '您已取消操作'.
RETURN.
ENDIF.
lv_file_name = lv_fullpath.
go_document->save_as(
EXPORTING
file_name = lv_file_name
no_flush = ''
IMPORTING
error = go_error ).
MESSAGE s000(zfi01) WITH '导出成功'.
ENDFORM.
FORM protect .
CALL METHOD OF
gs_sheet
'PROTECT'
EXPORTING
#1 = gc_pwd
#2 = 1
#3 = 1
#4 = 1
#5 = 1
#6 = 1
#7 = 1
#8 = 1
#9 = 0
#10 = 0
#11 = 0
#12 = 0
#13 = 0
#14 = 0
#15 = 0.
ENDFORM.
FORM unprotect .
CALL METHOD OF
gs_sheet
'UNPROTECT'
EXPORTING
#1 = gc_pwd.
ENDFORM.
FORM create_doi .
DATA: lv_available TYPE i,
lv_url TYPE text256.
"创建DOI CONTROL
c_oi_container_control_creator=>get_container_control(
IMPORTING
control = go_control
error = go_error ).
"CHECK NO ERRORS OCCURED
go_error->raise_message( type = 'E' ).
"创建CONTIANER
CREATE OBJECT go_splitter
EXPORTING
parent = cl_gui_container=>screen0
rows = 1
columns = 1.
go_splitter->set_border( border = cl_gui_cfw=>false ).
go_container = go_splitter->get_container( row = 1 column = 1 ).
go_control->init_control(
EXPORTING
r3_application_name = 'DOITEST'
* r3_application_name = 'TEST'
inplace_enabled = 'X'
inplace_scroll_documents = 'X'
parent = go_container
register_on_close_event = 'X'
register_on_custom_event = 'X'
no_flush = 'X'
IMPORTING
error = go_error ).
APPEND go_error TO gt_error.
CALL METHOD cl_gui_cfw=>dispatch.
PERFORM doi_get_template CHANGING lv_url.
"获得EXCEL应用
go_control->get_document_proxy(
EXPORTING
document_type = 'EXCEL.SHEET'
no_flush = 'X'
register_container = 'X'
IMPORTING
document_proxy = go_document
error = go_error ).
APPEND go_error TO gt_error.
* SET PROPERTY OF gs_handle-obj 'VISIBLE' = 0.
"打开EXCEL
go_document->open_document(
EXPORTING
open_inplace = 'X'
no_flush = 'X'
document_url = lv_url
IMPORTING
error = go_error ).
APPEND go_error TO gt_error.
go_document->has_spreadsheet_interface(
EXPORTING
no_flush = 'X'
IMPORTING
is_available = lv_available
error = go_error ).
APPEND go_error TO gt_error.
go_document->get_spreadsheet_interface(
EXPORTING
no_flush = ''
IMPORTING
sheet_interface = go_spreadsheet
error = go_error ).
APPEND go_error TO gt_error.
go_document->get_document_handle(
EXPORTING
no_flush = 'X'
IMPORTING
handle = gs_handle
error = go_error ).
APPEND go_error TO gt_error.
* SET PROPERTY OF gs_handle-obj 'VISIBLE' = 0.
LOOP AT gt_error INTO gs_error.
gs_error->raise_message( type = 'E' ).
CLEAR: gs_error.
ENDLOOP.
IF go_spreadsheet IS INITIAL.
MESSAGE '打开EXCEL失败,请删除任务管理器中的EXCEL进程再执行' TYPE 'S' DISPLAY LIKE 'E'.
REJECT.
ENDIF.
ENDFORM.
FORM doi_get_template CHANGING pc_url TYPE text256.
DATA: ls_uri TYPE bapiuri,
lt_uris TYPE sbdst_uri.
cl_bds_document_set=>get_with_url(
EXPORTING
classname = gc_classname
classtype = gc_classtype
object_key = gc_object_key
CHANGING
uris = lt_uris ).
SORT lt_uris BY doc_count DESCENDING.
READ TABLE lt_uris INTO ls_uri INDEX 1.
pc_url = ls_uri-uri.
ENDFORM.
FORM fill_sheet .
"SHEET1.资产负债
PERFORM select_sheet USING 'Sheet1'.
"填充数据
PERFORM frm_write_single USING '1' '7' sy-uname.
PERFORM frm_write_single USING '2' '7' sy-datum.
"SHEET2.利润
PERFORM select_sheet USING 'Sheet2'.
"填充数据
PERFORM frm_write_single USING '2' '7' sy-datum.
"锁
PERFORM protect.
ENDFORM.
FORM frm_write_single USING p_row p_col p_value.
DATA : lt_ranges TYPE soi_range_list,
ls_ranges TYPE soi_range_item,
lt_contents TYPE soi_generic_table,
ls_contents TYPE soi_generic_item.
CLEAR :lt_ranges,ls_ranges,lt_contents,ls_contents.
"写入数据
ls_contents-column = 1.
ls_contents-row = 1.
ls_contents-value = p_value.
APPEND ls_contents TO lt_contents.
"ranges
ls_ranges-name = 'cell' .//自定义名称
ls_ranges-columns = 1. //和lt_contents列数相关
ls_ranges-rows = 1.//和lt_contents行数相关
ls_ranges-code = 4.//固定
APPEND ls_ranges TO lt_ranges.
"每次只写一行一列
CALL METHOD go_spreadsheet->insert_range_dim
EXPORTING
name = 'cell'
no_flush = 'X'
top = p_row //从第几行开始
left = p_col //从第几列开始
rows = 1 //有多少行
columns = 1.//有多少列
//写入
CALL METHOD go_spreadsheet->set_ranges_data
EXPORTING
ranges = lt_ranges
contents = lt_contents
no_flush = 'X'.
ENDFORM.
FORM progress_indicator USING pa_percentage
pa_text.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = pa_percentage
text = pa_text.
ENDFORM.
FORM select_sheet USING pa_sheet_name.
go_spreadsheet->select_sheet(
EXPORTING
name = pa_sheet_name
IMPORTING
error = go_error ).
GET PROPERTY OF gs_handle-obj 'ACTIVESHEET' = gs_sheet.
ENDFORM.
tips:
多个sheet的写入:这里的 sheet页名 = OAOR上传模板的sheet页名

居中:
go_spreadsheet->fit_widest(
EXPORTING
no_flush = 'X'
name = ''
IMPORTING
error = go_error ).
写入:
尽量分区域填充;

1584

被折叠的 条评论
为什么被折叠?



