ABAP操作EXCEL
1、EXCEL导入内表
方式1:
调用function,’F4_FILENAME’获取文件名。通过屏幕元素Prameter的帮助事件,弹出文件选择框,获取选择文件名。
调用function,’TEXT_CONVERT_XLS_TO_SAP’,将选择excel数据放入内表。
示例:
TYPE-POOLS truxs.
DATA:it_raw TYPE truxs_t_text_data.
"定义一个内表来存储数据,内表的列数和要传得数据的列数要相同,其按照列来匹配传值
DATA: BEGIN OF gt_data OCCURS 0,
col1 TYPE char10,
col2 TYPE char10,
END OF gt_data.
PARAMETERS:p_file TYPE rlgrap-filename.
"调用F4_FILENAME,点击输入框后小方块弹出文件选择框
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CLEAR p_file.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_file."返回文件名
*Excel传值
START-OF-SELECTION.
PERFORM exceltotab.
FORM exceltotab .
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR = ' ' "分隔符?
i_line_header = 'X' "是否去掉首行
i_tab_raw_data = it_raw "WORK TABLE
i_filename = p_file
TABLES
i_tab_converted_data = gt_data[] "ACTUAL DATA
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
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. "exceltotab
方式2:
直接弹出文件选择弹窗,获取文件路径
data: ts_files type filetable,
rc type i.
refresh ts_files.
DATA:filename(1024) type C.
"调用方法,弹出文件选择框,获取选中文件路径
call method cl_gui_frontend_services=>file_open_dialog
exporting
window_title = 'Select File'
default_extension = '*.xls'
multiselection = ' ' " Only one file
changing
file_table = ts_files
rc = rc
exceptions
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
others = 5.
read table ts_files into filename index 1.
自定义function:‘ALSM_EXCEL_TO_INTERNAL_TABLE’
Structure:ALSMEX_TABLINE,其中VALUE字段类型为CHAR50,如果上传字段长度超过CHAR50,那么上传数据就会不全,所以我们需要自定义Function,修改ALSMEX_TABLINE的VALUE字段。
自定义步骤:
1.复制Sturcture:ALSMEX_TABLINE,自定义名字TEST_ALSMEX_TABLINE修改VALUE的数据类型,定义为需求长度;
2.复制function:ALSM_EXCEL_TO_INTERNAL_TABLE,复制之前先创建目标Function group,不然会复制失败;
3.在新建Function Group创建include: LZTEST_EXCELF01,将ALSMEX下,includes:LALSMEXF01内容复制到新建include。
4.将ALSMEX下,includes:LALSMEXTOP内容复制到新建Function Group的includes:LZTEST_EXCELTOP中,然后检查,激活。
示例:
* value of excel-cell
TYPES: ty_d_itabvalue TYPE alsmex_tabline-value,
* internal table containing the excel data
ty_t_itab TYPE alsmex_tabline OCCURS 0,
5.修改TEST_EXCEL_TO_INTERNAL_TABLE,将INTERN参数对应数据类型修改为自定义的TEST_ALSMEX_TABLINE,将LZTEST_EXCELTOP中的ty_d_itabvalue和ty_t_itab对应的数据类型也修改为自定义类型。
6.程序中调用function即可。
示例:
"将excel读取到内表'ALSM_EXCEL_TO_INTERNAL_TABLE'
DATA :exceltab like alsmex_tabline OCCURS 10 WITH HEADER LINE.
Data :filetest like rlgrap-filename VALUE 'D:test.xlsx'.
* CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
CALL FUNCTION 'TEST_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = fileTest
i_begin_col = 1
i_begin_row = 1
i_end_col = 20
i_end_row = 20000
TABLES
intern = exceltab
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
others = 3.
2、OLE2操作EXCEL
使用ABAP程序操作EXCEL,将内表数据写出到EXCEL
OLE2方式操作EXCEL,OLE是将所有EXCEL中组成结构封装成一个ole2的类。通过ole2对象方法来操作Excel。
1、类对象:lo_application:一个Excel;
通过create object语句创建一个excel对象,
CREATE OBJECT lo_application 'Excel.Application'. "创建excel对象
设置EXCEL的属性,是否可见:
SET PROPERTY OF lo_application 'Visible' = 1. "设置excel可见
SET PROPERTY OF lo_application 'SheetsInNewWorkbook' = 1.
2、类对象:lo_workbooks :工作簿集合;
通过创建的excel对象,调用Workbooks方法,创建他的工作薄集,
CALL METHOD OF lo_application 'Workbooks' = lo_workbooks. "调用lo_application的'Workbooks'创建工作簿集
3、类对象:lo_workbook:工作簿;
通过创建的工作薄集对象,调用add方法,创建他的工作薄,
CALL METHOD OF lo_workbooks 'Add' = lo_workbook. "调用lo_workbooks 的方法'Add' ,创建工作薄
4、类对象:lo_worksheets:工作表,sheet集合;
通过EXCEL对象的Sheets方法,创建sheet集合对象
"创建一个sheet集合
CALL METHOD OF lo_application 'Sheets' = lo_worksheets .
"通过sheet集合对象,调用add方法,可以创建多个sheet对象。创建出的sheet对象调用Activate方法,可以激活。
"创建新的work sheet. "默认创建的最新的sheet,处于active状态
CALL METHOD OF lo_worksheets 'Add' = new_worksheet.
*CALL METHOD OF new_worksheet 'Activate'. "激活当前新的sheet
5、类对象:lo_worksheet:工作表,sheet;
通过EXCEL对象的Activesheet属性,可以获取到当前活动的sheet,这个sheet就是创建初始时,默认存在的sheet。
GET PROPERTY OF lo_application 'ACTIVESHEET' = lo_worksheet. "获取当前活动sheet,初始创建时,只有一个sheet,且active
设置sheet的名称,设置sheet的属性name:
SET PROPERTY OF lo_worksheet 'Name' = 'first sheet'. "设置sheet名
6、类对象:lo_cell:excel单元格;
通过sheet对象,调用方法Cells方法,在当前sheet中创建单元格对象。
"创建单元格
CALL METHOD OF lo_worksheet 'Cells' = lo_cell
EXPORTING
# = 1 "Row
# = 1. "Column
设置单元格对象属性value,为单元格赋值:
SET PROPERTY OF lo_cell 'value' = '天'. "设置单元个值
设置单元格对象属性NumberFormat,设置单元格数据格式:
"设置单元格值格式,支持excel中的格式
*SET PROPERTY OF lo_cell 'NumberFormat' = '0.00'.
SET PROPERTY OF lo_cell 'NumberFormat' = 'm/d/yy'.
设置单元格自动换列
"特别长文字,自动换列,看到全部文字
SET PROPERTY OF lo_cell 'WrapText' = 1.
设置水平对齐方式
"设置水平对齐方式
"center = -4108
"left = -4131
"right = -4152
"top = -4160
SET PROPERTY OF lo_cell 'HorizontalAlignment' = -4108.
类对象:lo_font:字体设置对象,调用单元格对象的font方法,获取font对象,通过font对象设置单元格字体。
"设置单元格字体
CALL METHOD OF lo_cell 'font' = lo_font.
"EXCEL支持的字体名
*SET PROPERTY OF lo_font 'Name' = 'Agency FB'. "字体名
SET PROPERTY OF lo_font 'Name' = '微软正黑体'. "字体名
SET PROPERTY OF lo_font 'Size' = 15. "大小
"颜色数字规则?
SET PROPERTY OF lo_font 'Color' = -12123441. "颜色
SET PROPERTY OF lo_font 'TintAndShade' = 0. "明亮度-1~1,1完全透明
SET PROPERTY OF lo_font 'Bold' = 0. "是否粗体字 0 :false 1:true
SET PROPERTY OF lo_font 'Italic' = 1. "是否斜体 0:false 1:true
SET PROPERTY OF lo_font 'Underline' = 2. "xlUnderlineStyleSingle = 2,下划线
类对象lo_interior,单元格背景;
示例:
通过单元格对象获取lo_interior对象,设置Color或者ColorIndex属性,设置背景颜色,两种方式都可。对应颜色值不清楚?
"设置单元格背景
DATA:lo_interior TYPE ole2_object.
CALL METHOD OF lo_cell 'interior' = lo_interior.
SET PROPERTY OF lo_interior 'Color' = 12123441.
SET PROPERTY OF lo_interior 'ColorIndex' = 43.
8、类对象:lo_range:多个单元格集合;
选择多个单元格集合。
示例:
选择单元格(1,1)到(3,3)这部分区域:
"选择Ranges of cells
CALL METHOD OF lo_worksheet 'Cells' = lo_cellstart
EXPORTING
# = 1 "row
# = 1. "column
CALL METHOD OF lo_worksheet 'Cells' = lo_cellend
EXPORTING
# = 3 "row
# = 3. "column
"选中一个区域Cell
CALL METHOD OF lo_worksheet 'RANGE' = lo_range
EXPORTING
# = lo_cellstart
# = lo_cellend.
也可以选中一行或者一列单元格:
类对象:lo_column:excel行
"选择列
CALL METHOD OF lo_worksheet 'Columns' = lo_column
EXPORTING
# = 1.
类对象:lo_row:excel列
"选择行
CALL METHOD OF lo_worksheet 'Row' = lo_row
EXPORTING
# = 2.
如果要操作选择部分区域需要lo_selection对象
类对象:lo_selection,选中操作对象
"获取选中区域selection
CALL METHOD OF lo_row 'Select'.
CALL METHOD OF lo_application 'selection' = lo_selection.
9、类对象:lo_validation:验证操作validation对象;
示例:测试失败?
"添加验证
"选中(4,4)
CALL METHOD OF lo_worksheet 'Cells' = lo_cell
EXPORTING
# = 4
# = 4.
"获取选中区域selection
CALL METHOD OF lo_cell 'Select'.
CALL METHOD OF lo_application 'selection' = lo_selection.
"获取验证对象lo_validation
CALL METHOD OF lo_selection 'Validation' = lo_validation.
"添加验证规则
CALL METHOD OF lo_validation 'Add'
EXPORTING
#1 = 4 "验证类型Type 4 = xlValidateDate,验证日期
#2 = 1 "验证弹窗类型AlertStype 1 = xlValidAlertStop
#3 = 1 "操作类型,Operator 1 = xlBetween,在之间
#4 = '1/1/2000' "Formula1
#5 = '1/1/2010'. "Formula2
"设置错误信息
SET PROPERTY OF lo_validation 'ErrorMessage' = 'Enter a valid date'.
10、使用复制粘贴方式将内表数数据写入EXCEL
示例:
"复制粘贴方式将数据写入EXCEL
CALL METHOD OF lo_worksheet 'Activate'. "激活当前新的sheet
DATA:test_spfli LIKE TABLE OF spfli WITH HEADER LINE.
TYPES: ty_data(1500) TYPE c.
DATA: lt_data TYPE ty_data OCCURS 0 WITH HEADER LINE.
DATA:lv_cont TYPE I.
FIELD-SYMBOLS: TYPE ANY.
SELECT * FROM spfli INTO TABLE test_spfli.
* Prepare the data before copy to clipboard;
LOOP AT test_spfli.
lv_cont = 1.
* Write for example 5 columns per row.
DO 5 TIMES.
ASSIGN COMPONENT lv_cont OF STRUCTURE test_spfli TO .
"使用#将数据链接起来,数据格式#xxx#xxxx#xxxx
CONCATENATE lt_data INTO lt_data SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
ADD 1 TO lv_cont.
ENDDO.
"去掉开始#号
SHIFT lt_data BY 1 PLACES LEFT.
APPEND lt_data.
CLEAR lt_data.
ENDLOOP.
* Copy to clipboard into ABAP
CALL FUNCTION 'CONTROL_FLUSH'
EXCEPTIONS
OTHERS = 3.
CALL FUNCTION 'CLPB_EXPORT'
TABLES
data_tab = lt_data
EXCEPTIONS
clpb_error = 1
OTHERS = 2.
* Select the cell A1
CALL METHOD OF
lo_worksheet
'Cells' = lo_cell
EXPORTING
#1 = 1 "Row
#2 = 1. "Column
* Paste clipboard from cell A1
CALL METHOD OF
lo_cell
'SELECT'.
CALL METHOD OF
lo_worksheet
'PASTE'.
"调用lo_workbook 'SaveAs' 方法保存excel
CALL METHOD OF lo_workbook 'SaveAs'
EXPORTING
# = lv_complete_path.
if sy-subrc = 0.
MESSAGE 'File downloaded successfully' TYPE 'S'.
ELSE.
MESSAGE 'Error downloading the file' TYPE 'E'.
ENDIF.
完整示例:
TYPE-POOLS: soi,ole2.
DATA: lo_application TYPE ole2_object, "代表excel对象
lo_workbook TYPE ole2_object, "代表excel工作薄
lo_workbooks TYPE ole2_object, "代表excel工作薄集合
lo_range TYPE ole2_object, "代表多个单元格集合
lo_worksheet TYPE ole2_object, "代表excel工作表sheet
lo_worksheets TYPE ole2_object, "代表excel工作表sheet集合
lo_column TYPE ole2_object, "代表excel列
lo_row TYPE ole2_object, "代表excel行
lo_cell TYPE ole2_object, "代表excel单元格
lo_font TYPE ole2_object. "代表字体
DATA: lo_cellstart TYPE ole2_object,
lo_cellend TYPE ole2_object,
lo_selection TYPE ole2_object,
lo_validation TYPE ole2_object.
DATA: lv_selected_folder TYPE string,
lv_complete_path TYPE char256,
lv_titulo TYPE string . "弹窗描述
DATA: new_worksheet TYPE ole2_object. "新sheet
"调用文件路径选择框,默认路径C:\
CALL METHOD cl_gui_frontend_services=>directory_browse
EXPORTING
window_title = lv_titulo "弹窗最上方,可以添加描述信息,不是弹窗标题
initial_folder = 'C:\' "初始化选择路径
CHANGING
selected_folder = lv_selected_folder "返回选择路径
EXCEPTIONS
cntl_error = 0
error_no_gui = 1
OTHERS = 2.
"检查是否获取到路径
CHECK NOT lv_selected_folder IS INITIAL.
DATA:str_len TYPE I.
DATA:temp_sign(1) TYPE C.
str_len = STRLEN( lv_selected_folder ) - 1.
temp_sign = lv_selected_folder+str_len(1).
if temp_sign = '\'.
"确定保存路径
CONCATENATE lv_selected_folder 'Test' INTO lv_complete_path.
else.
"确定保存路径
CONCATENATE lv_selected_folder '\Test' INTO lv_complete_path.
ENDIF.
"创建excel对象
CREATE OBJECT lo_application 'Excel.Application'. "创建excel对象
SET PROPERTY OF lo_application 'Visible' = 1. "设置excel可见
SET PROPERTY OF lo_application 'SheetsInNewWorkbook' = 1.
"创建workbook
CALL METHOD OF lo_application 'Workbooks' = lo_workbooks. "调用lo_application的'Workbooks'创建工作簿集
CALL METHOD OF lo_workbooks 'Add' = lo_workbook. "调用lo_workbooks 的方法'Add' ,创建工作薄
GET PROPERTY OF lo_application 'ACTIVESHEET' = lo_worksheet. "获取当前活动sheet,初始创建时,只有一个sheet,且active
SET PROPERTY OF lo_worksheet 'Name' = 'first sheet'. "设置sheet名
"创建一个sheet集合
CALL METHOD OF lo_application 'Sheets' = lo_worksheets .
"创建新的work sheet. "默认创建的最新的sheet,处于active状态
CALL METHOD OF lo_worksheets 'Add' = new_worksheet.
*CALL METHOD OF new_worksheet 'Activate'. "激活当前新的sheet
SET PROPERTY OF new_worksheet 'Name' = 'second sheet'. "设置sheet名
"lo_application默认sheet,设置值
"创建单元个
CALL METHOD OF lo_worksheet 'Cells' = lo_cell
EXPORTING
# = 1 "Row
# = 1. "Column
SET PROPERTY OF lo_cell 'value' = '天'. "设置单元个值
"设置单元格字体
CALL METHOD OF lo_cell 'font' = lo_font.
"EXCEL支持的字体名
*SET PROPERTY OF lo_font 'Name' = 'Agency FB'. "字体名
SET PROPERTY OF lo_font 'Name' = '微软正黑体'. "字体名
SET PROPERTY OF lo_font 'Size' = 15. "大小
"创建单元个
CALL METHOD OF lo_worksheet 'Cells' = lo_cell
EXPORTING
# = 1 "Row
# = 2. "Column
SET PROPERTY OF lo_cell 'value' = '12/03/2010'. "设置单元个值
"设置单元格值格式,支持excel中的格式
*SET PROPERTY OF lo_cell 'NumberFormat' = '0.00'.
SET PROPERTY OF lo_cell 'NumberFormat' = 'm/d/yy'.
"设置单元格字体
CALL METHOD OF lo_cell 'font' = lo_font.
"颜色数字规则?
SET PROPERTY OF lo_font 'Color' = -12123441. "颜色
SET PROPERTY OF lo_font 'TintAndShade' = 0. "明亮度-1~1,1完全透明
SET PROPERTY OF lo_font 'Bold' = 0. "是否粗体字 0 :false 1:true
SET PROPERTY OF lo_font 'Italic' = 1. "是否斜体 0:false 1:true
SET PROPERTY OF lo_font 'Underline' = 2. "xlUnderlineStyleSingle = 2,下划线
"设置单元格背景
DATA:lo_interior TYPE ole2_object.
CALL METHOD OF lo_cell 'interior' = lo_interior.
SET PROPERTY OF lo_interior 'Color' = 12123441.
"设置单元格边框
DATA:lo_borders TYPE ole2_object.
"获取边框对象,输入参数‘7’:左边框xlEdgeLeft;‘8’:上边框xlEdgeTop;‘9’:下边框xlEdgeBottom;‘10’:右边框xlEdgeRight
CALL METHOD OF lo_cell 'borders' = lo_borders
EXPORTING
# = 7.
SET PROPERTY OF lo_borders 'LineStyle' = 1."xlContinuous='1'
SET PROPERTY OF lo_borders 'Weight' = 4."xlThick = 4
"在对应new sheet设置单元格值
"创建单元个
CALL METHOD OF new_worksheet 'Cells' = lo_cell
EXPORTING
# = 1 "Row
# = 1. "Column
SET PROPERTY OF lo_cell 'value' = 'hello2'. "设置单元个值
"创建单元个
CALL METHOD OF new_worksheet 'Cells' = lo_cell
EXPORTING
# = 1 "Row
# = 2. "Column
SET PROPERTY OF lo_cell 'value' = 'welcome2'. "设置单元个值
*"选择Ranges of cells
*CALL METHOD OF lo_worksheet 'Cells' = lo_cellstart
* EXPORTING
* # = 1 "row
* # = 1. "column
*
*CALL METHOD OF lo_worksheet 'Cells' = lo_cellend
* EXPORTING
* # = 3 "row
* # = 3. "column
*
*"选中一个区域Cell
*CALL METHOD OF lo_worksheet 'RANGE' = lo_range
* EXPORTING
* # = lo_cellstart
* # = lo_cellend.
*
"选择列
*CALL METHOD OF lo_worksheet 'Columns' = lo_column
* EXPORTING
* # = 1.
*"选择行
*CALL METHOD OF lo_worksheet 'Row' = lo_row
* EXPORTING
* # = 2.
*
*"获取选中区域selection
*CALL METHOD OF lo_row 'Select'.
*CALL METHOD OF lo_application 'selection' = lo_selection.
*"添加验证
*"选中(4,4)
*CALL METHOD OF lo_worksheet 'Cells' = lo_cell
* EXPORTING
* # = 4
* # = 4.
*"获取选中区域selection
*CALL METHOD OF lo_cell 'Select'.
*CALL METHOD OF lo_application 'selection' = lo_selection.
*"获取验证对象lo_validation
*CALL METHOD OF lo_selection 'Validation' = lo_validation.
*"添加验证规则
*CALL METHOD OF lo_validation 'Add'
* EXPORTING
* #1 = 4 "验证类型Type 4 = xlValidateDate,验证日期
* #2 = 1 "验证弹窗类型AlertStype 1 = xlValidAlertStop
* #3 = 1 "操作类型,Operator 1 = xlBetween,在之间
* #4 = '1/1/2000' "Formula1
* #5 = '1/1/2010'. "Formula2
*"设置错误信息
*SET PROPERTY OF lo_validation 'ErrorMessage' = 'Enter a valid date'.
"调用lo_workbook 'SaveAs' 方法保存excel
CALL METHOD OF lo_workbook 'SaveAs'
EXPORTING
# = lv_complete_path.
if sy-subrc = 0.
MESSAGE 'File downloaded successfully' TYPE 'S'.
ELSE.
MESSAGE 'Error downloading the file' TYPE 'E'.
ENDIF.
CALL METHOD OF lo_application 'QUIT'. "退出excel
"释放资源
FREE OBJECT lo_worksheet.
FREE OBJECT new_worksheet.
FREE OBJECT lo_workbook.
FREE OBJECT lo_workbooks.
FREE OBJECT lo_application.
3、DOI操作EXCEL
DOI:Desktop Office Integretion
四个对象:
container: 存放excel电子表格(spreadsheet)的容器。
展示spreadsheet肯定需要一个容器来存放。这个容器一般在dialog screen中定义,也可以直接使用ABAP程序默认的screen(即screen号码为1000的屏幕)。
container control: 容器中用于创建和管理其他Office集成所需要的对象。container control是一个接口,类型是i_oi_container_control。
document proxy: 每一个document proxy的实例代表用office application打开的文档,可以是excel,也可以是word。如果想打开多个文档,需要定义多个实例。document proxy是一个接口,类型为i_oi_document_proxy。
spreadsheet: spreadsheet接口,代表最终要操作的excel文档。spreadhseet的类型是i_oi_spreadsheet
通过Tcode:OAOR,可以将本地文档模板上传到服务器行,通过对应类读取到ABAP程序中进行操作。
如果读取服务器上的文档模板,需要cl_bds_document_set类:
business document set: bds是business document set的缩写。
business document set用于管理后续要操作的文档,可以包含一个或多个文档。
示例:
"容器对象
DATA:gr_container type ref to cl_gui_container.
"管理Excel或其他文档对象
DATA:gr_control type ref to i_oi_container_control.
"文档对象,打开保存文档操作
DATA:gr_document type ref to i_oi_document_proxy.
"sheet操作接口对象
DATA:gr_spreadsheet type ref to i_oi_spreadsheet.
"sheet中选择操作区域range
DATA:gr_ranges type SOI_RANGE_LIST.
DATA:gr_ranges_item TYPE SOI_RANGE_ITEM.
"对应range的填充内容
DATA:gr_contents TYPE SOI_GENERIC_TABLE.
DATA:gr_contents_item TYPE SOI_GENERIC_ITEM.
start-of-selection.
perform main.
*get container
form get_container.
"获取容器对象,实例化
gr_container = cl_gui_container=>screen0."screen0 代表当前1000默认屏幕
endform. "get_container
* create container control
form create_container_control.
"调用方法,创建管理对象control
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = gr_control.
"初始化control对象
* initialize control
CALL METHOD gr_control->init_control
EXPORTING
inplace_enabled = 'X' "嵌入屏幕显示‘x’
inplace_scroll_documents = 'X' "可滚动
register_on_close_event = 'X'
register_on_custom_event = 'X'
r3_application_name = 'DOI demo'
parent = gr_container.
endform.
"create excel document
form create_excel_document.
CALL METHOD gr_control->get_document_proxy
EXPORTING
document_type = 'Excel.Sheet'
no_flush = 'X'
IMPORTING
document_proxy = gr_document.
"open_inplace参数控制excel文档是独立显示还是在SAP GUI中嵌入显示。
"如果嵌入显示,gr_control的init_control方法中,inplace_enabled参数要设为X
CALL METHOD gr_document->create_document
EXPORTING
document_title = 'DOI test'
no_flush = ''
open_inplace = ''.
endform. "create_excel_document
"使用spreedsheet填充数据
form fill_data.
"sheet的名字
DATA:sheetname(20) TYPE C .
DATA:error TYPE REF TO I_OI_ERROR.
DATA:retcode TYPE SOI_RET_STRING.
"调用document的方法,获取sheet对象
CALL METHOD gr_document->get_spreadsheet_interface
EXPORTING
no_flush = ''
IMPORTING
sheet_interface = gr_spreadsheet
error = error.
"spreadsheet可以获取当前活动sheetname
CALL METHOD gr_spreadsheet->get_active_sheet
EXPORTING
no_flush = ''
IMPORTING
sheetname = sheetname
error = error
retcode = retcode.
"获取当前活动sheet指定ranges区域
CALL METHOD gr_spreadsheet->insert_range_dim
EXPORTING
no_flush = ''
name = 'range1'
left = 1
top = 1
rows = 1
columns = 2
* updating = 1
* sheetname = 'sheet1'
IMPORTING
error = error
retcode = retcode.
* "修改range的名字,范围
* CALL METHOD gr_spreadsheet->change_range
* EXPORTING
* rangename = 'range1'
* newname = 'range1'
* rows = 1
* columns = 1
** updating = 1 "默认-1
* IMPORTING
* error = error
* retcode = retcode.
"设置ranges区域字体
CALL METHOD gr_spreadsheet->set_font
EXPORTING
rangename = 'range1' "range的名字
family = 'Times New Roman'
size = 9
bold = 0 "加粗
italic = 0 "斜体
align = 0 "水平居中
IMPORTING
error = error
retcode = retcode.
"设置ranges区域格式
CALL METHOD gr_spreadsheet->set_format
EXPORTING
rangename = 'range1'
typ = 0
currency = 'RMB'
decimals = 1
IMPORTING
error = error
retcode = retcode.
"设置ranges区域
gr_ranges_item-name = 'range1'.
gr_ranges_item-rows = 1.
gr_ranges_item-columns = 2.
APPEND gr_ranges_item TO gr_ranges.
"设置内容,value 256长度
gr_contents_item-row = 1.
gr_contents_item-column = 1.
gr_contents_item-value = '112'.
APPEND gr_contents_item TO gr_contents.
gr_contents_item-row = 1.
gr_contents_item-column = 2.
gr_contents_item-value = '113'.
APPEND gr_contents_item TO gr_contents.
"设置sheet中的内容
CALL METHOD gr_spreadsheet->set_ranges_data
EXPORTING
no_flush = ''
ranges = gr_ranges "选中区域
contents = gr_contents "填充内容
* updating = ''
* rangesdef = ''
IMPORTING
retcode = retcode
error = error.
* "创建一个新的sheet
* call method gr_spreadsheet->add_sheet
* exporting
* name = 'sheet1'
* no_flush = ''
* importing
* error = error
* retcode = retcode.
* "删除一个sheet
* call method gr_spreadsheet->delete_sheet
* exporting
* name = 'sheet1'
* no_flush = ''
* importing
* error = error
* retcode = retcode.
"active指定name的sheet
* CALL METHOD gr_spreadsheet->select_sheet
* EXPORTING
* name = 'sheet1'
* no_flush = ''
* IMPORTING
* error = error
* retcode = retcode.
* "修改sheet名字
* CALL METHOD gr_spreadsheet->set_sheet_name
* EXPORTING
* newname = 'sheet1'
* oldname = sheetname
* no_flush = ''
* IMPORTING
* error = error
* retcode = retcode.
endform.
"保存文档
form save_doc.
DATA:error TYPE REF TO I_OI_ERROR.
DATA:retcode TYPE SOI_RET_STRING.
"保存的文件路径
DATA:file_name(20) TYPE C VALUE 'D:\test.xls'.
"只传文件名,不设置路径,该方法会自动默认保存到c盘用户文件下的文档文件夹中)
CALL METHOD gr_document->save_as
EXPORTING
file_name = file_name
prompt_user = ''
IMPORTING
error = error
retcode = retcode.
endform.
"释放资源
form free_source.
"关闭文档
CALL METHOD gr_document->close_document.
"释放容器
CALL METHOD gr_container->free.
"关闭文档管理
CALL METHOD gr_control->destroy_control.
FREE gr_control.
LEAVE PROGRAM.
endform.
form main.
* skip 1.
perform get_container.
perform create_container_control.
perform create_excel_document.
Perform fill_data.
perform save_doc.
perform free_source.
endform.
带模板的DOI操作:
1、使用Tcode:OAOR,上传指定格式的文档;、
2、通过调用cl_bds_document_set=>get_with_url方法,获取我们上传文档的URL;
3、然后通过gr_document->open_document,将获取的URL传入,打开的就是我们上传的模板文档;
使用OAOR,上传模板。Class name:HRFPM_EXCEL_STANDARD;Class Type:OT;Object Key:可以自己定义,访问时也是通过这个找到我们文件,示例:DOI_EXCEL_TEXT。
可以选择我们要上传的文档类型。这里我们选中excel,双击会弹出一个文件选择框,选择我们要上传的模板文件就可以了。
修改一下描述,或者默认,点击确认就可以了。
我们可以看到已经上传成功。
使用代码访问到我们上传的文档,获取文档的URL
示例:
*business document system
data: gr_bds_documents type ref to cl_bds_document_set,
g_classname type sbdst_classname,
g_classtype type sbdst_classtype,
g_objectkey type sbdst_object_key,
g_doc_components type sbdst_components,
g_doc_signature type sbdst_signature.
* template url
data: gt_bds_uris type sbdst_uri,
gs_bds_url like line of gt_bds_uris,
g_template_url(256) type c.
g_classname = 'HRFPM_EXCEL_STANDARD'.
g_classtype = 'OT'.
g_objectkey = 'DOI_EXCEL_TEST'.
form get_template_url.
CREATE OBJECT gr_bds_documents.
CALL METHOD cl_bds_document_set=>get_info
EXPORTING
classname = g_classname
classtype = g_classtype
object_key = g_objectkey
CHANGING
components = g_doc_components
signature = g_doc_signature.
CALL METHOD cl_bds_document_set=>get_with_url
EXPORTING
classname = g_classname
classtype = g_classtype
object_key = g_objectkey
CHANGING
uris = gt_bds_uris
signature = g_doc_signature.
free gr_bds_documents.
read table gt_bds_uris into gs_bds_url index 1.
g_template_url = gs_bds_url-uri.
endform. "get_template_url
"通过URL获取模板文档
call method gr_document->open_document
exporting open_inplace = 'X'
document_url = g_template_url.
4、常见文档MIME Type
{".3gp", "video/3gpp"},
{".apk", "application/vnd.android.package-archive"},
{".asf", "video/x-ms-asf"},
{".avi", "video/x-msvideo"},
{".bin", "application/octet-stream"},
{".bmp", "image/bmp"},
{".c", "text/plain"},
{".class", "application/octet-stream"},
{".conf", "text/plain"},
{".cpp", "text/plain"},
{".doc", "application/msword"},
{".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
{".xls", "application/vnd.ms-excel"},
{".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{".exe", "application/octet-stream"},
{".gif", "image/gif"},
{".gtar", "application/x-gtar"},
{".gz", "application/x-gzip"},
{".h", "text/plain"},
{".htm", "text/html"},
{".html", "text/html"},
{".jar", "application/java-archive"},
{".java", "text/plain"},
{".jpeg", "image/jpeg"},
{".jpg", "image/jpeg"},
{".js", "application/x-javascript"},
{".log", "text/plain"},
{".m3u", "audio/x-mpegurl"},
{".m4a", "audio/mp4a-latm"},
{".m4b", "audio/mp4a-latm"},
{".m4p", "audio/mp4a-latm"},
{".m4u", "video/vnd.mpegurl"},
{".m4v", "video/x-m4v"},
{".mov", "video/quicktime"},
{".mp2", "audio/x-mpeg"},
{".mp3", "audio/x-mpeg"},
{".mp4", "video/mp4"},
{".mpc", "application/vnd.mpohun.certificate"},
{".mpe", "video/mpeg"},
{".mpeg", "video/mpeg"},
{".mpg", "video/mpeg"},
{".mpg4", "video/mp4"},
{".mpga", "audio/mpeg"},
{".msg", "application/vnd.ms-outlook"},
{".ogg", "audio/ogg"},
{".pdf", "application/pdf"},
{".png", "image/png"},
{".pps", "application/vnd.ms-powerpoint"},
{".ppt", "application/vnd.ms-powerpoint"},
{".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
{".prop", "text/plain"},
{".rc", "text/plain"},
{".rmvb", "audio/x-pn-realaudio"},
{".rtf", "application/rtf"},
{".sh", "text/plain"},
{".tar", "application/x-tar"},
{".tgz", "application/x-compressed"},
{".txt", "text/plain"},
{".wav", "audio/x-wav"},
{".wma", "audio/x-ms-wma"},
{".wmv", "audio/x-ms-wmv"},
{".wps", "application/vnd.ms-works"},
{".xml", "text/plain"},
{".z", "application/x-compress"},
{".zip", "application/x-zip-compressed"},
{"", "*/*"}