下面介绍一下如何在webdynpro中上载excel文件。
网上查了一下,大多数的帖子是用函数HR_KR_XSTRING_TO_STRING上载,但是经过测试,很遗憾这个函数并不能上载真正意义上扩展名为.xlsx的excel,xstring转换成string后是乱码,有人说这个FM只对CSV格式文件有效,懒得再去实验,因为发现SAP还提供了一个类CL_FDT_XL_SPREADSHEET,可以完美实现Excel OpenXML的上载。
Excel OpenXML就是它。。。
下面一步一步讲解一下。
1,创建Webdynpro组件
2,插入FILE_UPLOAD元素
在视图MAIN中插入一个file_upload标准元素,这个使用来指定上载文件路径的element,
创建完发现upload_file元素property中data的值红了,看来需要binding一下,这个data就是保存excel上载后字符串的,
为了binding,需要在view的context中创建属性(attribute),
首先创建一个节点(Node),目的是分门别类,方便管理。
然后在刚创建好的FILE节点下创建attribute,
输入属性名字File_data以及类型Xstring,
然后再创建一个属性file_name用来绑定excel文件路径的,调用CL_FDT_XL_SPREADSHEET时会用到。
属性创建完了,回到视图main中,在file_upload的property中,开始binding data,
然后再把fileName也绑了,结果如下:
3,插入按钮元素
在file_upload之后再插入一个button,这个按钮用来触发上载file_upload中指定的excel文件的代码,
输入button上显示的文本Upload,
4,onAction代码
点击onAction"创建"图标创建action,然后再进入到代码编辑中,
加入代码,上载excel,完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
DATA lo_nd_file TYPE REF TO if_wd_context_node. DATA lo_el_file TYPE REF TO if_wd_context_element. DATA ls_file TYPE wd_this->element_file. DATA:lv_string TYPE string, lv_msg TYPE string, lt_worksheets TYPE STANDARD TABLE OF string, ls_worksheets TYPE string. DATA:lo_excel TYPE REF TO cl_fdt_xl_spreadsheet, lo_excel_core TYPE REF TO cx_fdt_excel_core, lo_data TYPE REF TO data, lo_dref TYPE REF TO data. FIELD-SYMBOLS: <fs_table> TYPE table. * 读取FILE节点 lo_nd_file = wd_context->get_child_node( name = wd_this->wdctx_file ). * 读取节点下的元素 lo_el_file = lo_nd_file->get_element( ). * 读取节点下属性值,也就是excel内容和文件路径,这个路径是个假路径并不是本地电脑上的那个路径 lo_el_file->get_static_attributes( IMPORTING static_attributes = ls_file ). TRY. * 创建读取excel文件的类对象 CREATE OBJECT lo_excel EXPORTING document_name = ls_file-file_name xdocument = ls_file-file_data. CATCH cx_fdt_excel_core INTO lo_excel_core. CLEAR lv_msg. * 读取错误消息 CALL METHOD lo_excel_core->if_message~get_text RECEIVING result = lv_msg. RETURN. ENDTRY. * 读取excelsheet页 lo_excel->if_fdt_doc_spreadsheet~get_worksheet_names( IMPORTING worksheet_names = lt_worksheets ). IF lt_worksheets IS NOT INITIAL. * 由于本例子只有一个sheet页,所以使用index 1 READ TABLE lt_worksheets INDEX 1 INTO ls_worksheets. ELSE. RETURN. ENDIF. * 读取sheet页内容对象 lo_data = lo_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet( ls_worksheets ). * 将内容赋值到field symbol中 ASSIGN lo_data->* TO <fs_table>. IF <fs_table> IS NOT ASSIGNED. * 如果excel没有值,就返回 RETURN. ENDIF. |
5,测试
创建webdynpro应用程序,
加一个断点,
运行webdynpro应用程序Ytest_upload
输入上载excel,然后点击upload按钮,
文件内容,
断点停下后,内表中的内容:
6,其他
如果在 CREATE OBJECT lo_excel时报错,可以先检查一下excel文件是否是openxml格式,方法入下:
将excel文件加上.zip后缀,然后用压缩工具打开,
在_rels文件夹中,打开.rels文件,
查看是否有下面的type,没有则不能使用类CL_FDT_XL_SPREADSHEET
1 |
http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument |
有的office软件用的不是openxml会显示成下面这样,
type是以package开头的,而不是officeDocument
1 |
http://schemas.openxmlformats.org/package/2006/relationships/ |
类中代码:
以上。
发表评论