如何在ABAP中使用Document Viewer显示Word文档?
问题:SAP Document Viewer无法内嵌展示.doc文档,触发下载压缩包
数据库表中存储着以xstring格式保存的各类文档,需通过SAP Document Viewer展示。目前PDF文档可正常显示,但.doc文档无法直接展示,会弹出类似浏览器的下载窗口,下载包含Word文档内容的压缩包。以下是简化后的测试代码(跳过数据库读取步骤,直接本地上传文档),问题依旧复现:
TYPE-POOLS: soi. TYPES: ty_daten(2550) TYPE c. DATA: custom_container TYPE REF TO cl_gui_custom_container, document_viewer TYPE REF TO i_oi_document_viewer. DATA: t_daten TYPE STANDARD TABLE OF ty_daten WITH NON-UNIQUE DEFAULT KEY. DATA: filesize TYPE i. END-OF-SELECTION. CREATE OBJECT custom_container EXPORTING container_name = 'CONTAINER100'. CALL METHOD c_oi_container_control_creator=>get_document_viewer IMPORTING viewer = document_viewer. CALL METHOD document_viewer->init_viewer EXPORTING parent = custom_container. CALL FUNCTION 'UPLOAD' EXPORTING filename = 'c:\temp\test.doc' filetype = 'BIN' IMPORTING filesize = filesize TABLES data_tab = t_daten EXCEPTIONS conversion_error = 1 invalid_table_width = 2 invalid_type = 3 no_batch = 4 unknown_error = 5 gui_refuse_filetransfer = 6 OTHERS = 7. IF sy-subrc <> 0. WRITE:/ 'Fehler',sy-subrc. STOP. ENDIF. CALL METHOD document_viewer->view_document_from_table EXPORTING type = soi_type_application subtype = soi_doctype_word_document size = filesize show_inplace = 'X' CHANGING document_table = t_daten EXCEPTIONS cntl_error = 1 not_initialized = 2 dp_error_general = 3 invalid_parameter = 4 dp_invalid_parameter = 5. CALL SCREEN 100. CALL METHOD document_viewer->destroy_viewer. CALL METHOD custom_container->free. FREE: document_viewer, custom_container.
问题原因及解决方案
核心问题
旧的UPLOAD函数在处理二进制文档时,可能因字符编码转换导致数据损坏,使得Document Viewer无法识别正确的Word文档格式,最终触发下载行为。此外,直接传递字符表时,需确保二进制数据的完整性未被破坏。
修正步骤
- 用
CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD替代UPLOAD函数,直接读取文档为xstring格式,避免编码转换问题。 - 通过
SCMS_XSTRING_TO_BINARY将xstring转换为符合要求的字符表,确保二进制数据完整传递给Viewer。 - 确认文档类型参数传递正确,
soi_type_application和soi_doctype_word_document是标准Word文档的正确标识,但需确保文档本身是合规的.doc格式。
修正后的代码
TYPE-POOLS: soi. TYPES: ty_daten(2550) TYPE c. DATA: custom_container TYPE REF TO cl_gui_custom_container, document_viewer TYPE REF TO i_oi_document_viewer. DATA: t_daten TYPE STANDARD TABLE OF ty_daten, lv_xstring TYPE xstring, filesize TYPE i. END-OF-SELECTION. " 创建自定义容器 CREATE OBJECT custom_container EXPORTING container_name = 'CONTAINER100'. " 获取文档Viewer实例 CALL METHOD c_oi_container_control_creator=>get_document_viewer IMPORTING viewer = document_viewer. " 初始化Viewer CALL METHOD document_viewer->init_viewer EXPORTING parent = custom_container. " 用GUI_UPLOAD读取二进制文档到XSTRING CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = 'c:\temp\test.doc' filetype = 'BIN' has_field_separator = abap_false IMPORTING filelength = filesize CHANGING data_tab = lv_xstring EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 dp_out_of_memory = 14 disk_full = 15 dp_timeout = 16 OTHERS = 17. IF sy-subrc <> 0. WRITE:/ 'Fehler', sy-subrc. STOP. ENDIF. " 将XSTRING转换为字符表(适配Document Viewer的参数要求) CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_xstring TABLES binary_tab = t_daten EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. WRITE:/ 'XSTRING转换失败', sy-subrc. STOP. ENDIF. " 调用Viewer展示文档 CALL METHOD document_viewer->view_document_from_table EXPORTING type = soi_type_application subtype = soi_doctype_word_document size = filesize show_inplace = 'X' CHANGING document_table = t_daten EXCEPTIONS cntl_error = 1 not_initialized = 2 dp_error_general = 3 invalid_parameter = 4 dp_invalid_parameter = 5. IF sy-subrc <> 0. WRITE:/ 'Viewer展示失败', sy-subrc. ENDIF. CALL SCREEN 100. " 清理资源 CALL METHOD document_viewer->destroy_viewer. CALL METHOD custom_container->free. FREE: document_viewer, custom_container.
额外检查项
- 确保屏幕100中已创建名为
CONTAINER100的自定义容器控件,尺寸足够展示文档。 - 检查SAP系统是否安装了对应的Word OLE组件,确保Document Viewer可以调用本地Office组件进行内嵌展示。
- 如果是从数据库读取xstring,直接使用
SCMS_XSTRING_TO_BINARY转换为字符表即可,无需经过上传步骤。
内容的提问来源于stack exchange,提问作者SBECK1
相关产品推荐
相关产品推荐

