You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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文档格式,最终触发下载行为。此外,直接传递字符表时,需确保二进制数据的完整性未被破坏。

修正步骤

  1. 用CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD替代UPLOAD函数,直接读取文档为xstring格式,避免编码转换问题。
  2. 通过SCMS_XSTRING_TO_BINARY将xstring转换为符合要求的字符表,确保二进制数据完整传递给Viewer。
  3. 确认文档类型参数传递正确,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:25:06