SAP-ABAP 内表数据转换为十六进制字符串并利用服务器转储

函数:SOTR_SERV_TABLE_TO_STRING 

           SCMS_STRING_TO_XSTRING

类 IF_HTTP_RESPONSE

内表数据转换为16进制存储需要先把表体内容转换成一定的格式,再通过字符串去转换

 拼接表头数据和标题数据 CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB单元格分割,CL_ABAP_CHAR_UTILITIES=>NEWLINE行转换

    LOOP AT <DYN_TABLE> ASSIGNING FIELD-SYMBOL(<DYN_WA>).
      LR_DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( <DYN_WA> ).
      "拼接表头数据,转文本描述
      IF LV_HEADER_FLAG IS INITIAL.
        LOOP AT LR_DESCR_REF->COMPONENTS INTO DATA(LS_COM).
          READ TABLE IT_SELECT INTO DATA(LV_SELECT) WITH KEY TABLE_LINE = LS_COM-NAME.
          IF SY-SUBRC EQ 0 .
            READ TABLE LT_HEADER INTO LS_HEADER WITH KEY FIELDNAME = LS_COM-NAME .
            IF SY-SUBRC EQ 0 .
              CONCATENATE LS_TEXT_TAB-LINE LS_HEADER-FIELDTEXT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
                INTO LS_TEXT_TAB-LINE SEPARATED BY ''.
            ENDIF.
          ENDIF.
        ENDLOOP.
        "换行处理
        CONCATENATE LS_TEXT_TAB-LINE CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LS_TEXT_TAB-LINE
         SEPARATED BY '' .
        APPEND LS_TEXT_TAB TO LT_TEXT_TAB .
        CLEAR LS_TEXT_TAB .
        LV_HEADER_FLAG = 'X'.
      ENDIF.

      "拼接表体数据,把每一行数据转为string类型
      CLEAR LS_COM .
      LOOP AT LR_DESCR_REF->COMPONENTS INTO LS_COM.
        READ TABLE IT_SELECT INTO LV_SELECT WITH KEY TABLE_LINE = LS_COM-NAME.
        IF SY-SUBRC EQ 0 .
          ASSIGN COMPONENT LS_COM-NAME OF STRUCTURE <DYN_WA> TO FIELD-SYMBOL(<FS_FIELD>) .
          IF SY-SUBRC EQ 0.
            LV_FIELD = <FS_FIELD> ."类型转换
            CONCATENATE LS_TEXT_TAB-LINE LV_FIELD CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO LS_TEXT_TAB-LINE
             SEPARATED BY '' .
          ENDIF.
        ENDIF .
      ENDLOOP.
      "换行处理
      CONCATENATE LS_TEXT_TAB-LINE CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LS_TEXT_TAB-LINE
       SEPARATED BY '' .
      APPEND LS_TEXT_TAB TO LT_TEXT_TAB .
      CLEAR LS_TEXT_TAB .
    ENDLOOP.

内表数据转string

    "把内表数据转为string类型
    CALL FUNCTION 'SOTR_SERV_TABLE_TO_STRING'
      EXPORTING
*       FLAG_NO_LINE_BREAKS       = 'X'
*       LINE_LENGTH               =
        LANGU    = SY-LANGU
      IMPORTING
        TEXT     = LV_TEXT
      TABLES
        TEXT_TAB = LT_TEXT_TAB.

STRING转XSTRING,8404防乱码

    "string类型-> XSTRING
    CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
      EXPORTING
        TEXT     = LV_TEXT
        MIMETYPE = 'xls'
        ENCODING = '8404' "防止中文乱码
      IMPORTING
        BUFFER   = LV_BUFFER
      EXCEPTIONS
        FAILED   = 1
        OTHERS   = 2.

 压缩文件转储虚拟服务器

    CREATE OBJECT LO_CACHED_RESPONSE
      TYPE
      CL_HTTP_RESPONSE
      EXPORTING
        ADD_C_MSG = 1.

*      ***set the data and the headers
    LO_CACHED_RESPONSE->SET_DATA( LV_BUFFER ).
    LV_APP_TYPE = 'APPLICATION/MSEXCEL; charset=utf-8'.
    LO_CACHED_RESPONSE->SET_HEADER_FIELD( NAME = IF_HTTP_HEADER_FIELDS=>CONTENT_TYPE
                                          VALUE = LV_APP_TYPE ).

*      ***Set the Response Status

    LO_CACHED_RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).

*      ***Set the Cache Timeout – 60 seconds – we only need this in the cache

*      ***long enough to build the page

    LO_CACHED_RESPONSE->SERVER_CACHE_EXPIRE_REL( EXPIRES_REL = 60 ).

*      ***Create a unique URL for the object and export URL

    CONCATENATE IV_ENTITYNAME '_' SY-DATUM SY-UZEIT INTO LS_FILE_NAME.

    CONCATENATE  '/sap/public/ping/'  LS_FILE_NAME  '.' 'xls' INTO EV_XTRING.

*      ***Cache the URL
    CL_HTTP_SERVER=>SERVER_CACHE_UPLOAD( URL     = EV_XTRING
                                         RESPONSE = LO_CACHED_RESPONSE ).

完整测试用例

  METHOD ZCREATE_XSLX_XSTRING.
    FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE.
    DATA: LV_FILENAME       TYPE RLGRAP-FILENAME,
          LT_CONVERTED_DATA TYPE TRUXS_T_TEXT_DATA,
          LV_BUFFER         TYPE XSTRING,
          LV_TEXT           TYPE STRING,
          LV_FIELD          TYPE STRING.
    DATA LR_DESCR_REF TYPE REF TO CL_ABAP_STRUCTDESCR .
    DATA LS_ZSNRCONFIG01 TYPE ZSNRCONFIG01 .
    DATA LV_HEADER_FLAG TYPE C .

    DATA :LV_APP_TYPE        TYPE STRING,
          LV_GUID            TYPE GUID_32,
          LO_CACHED_RESPONSE TYPE REF TO IF_HTTP_RESPONSE,
          LS_AIRPORT_STRING  TYPE STRING,
          LS_AIRPORT_XSTRING TYPE XSTRING,
          LT_AIRPORT         TYPE STANDARD TABLE OF SAIRPORT,
          LS_AIRPORT         LIKE LINE OF LT_AIRPORT,
          LS_FILE_NAME       TYPE STRING.
    ASSIGN IV_DATA->*  TO <DYN_TABLE>.

    TYPES: BEGIN OF TEXT_TABLE,
             LINE TYPE SOTR_TXT,
           END OF TEXT_TABLE.
    DATA  LV_ENTITYNAME TYPE DDOBJNAME .
    DATA: LT_TEXT_TAB TYPE TABLE OF TEXT_TABLE .
    DATA: LS_TEXT_TAB TYPE TEXT_TABLE .
    DATA: LT_HEADER TYPE ZDTFIES,
          LS_HEADER LIKE LINE OF LT_HEADER.

    "拼接表头
    LV_ENTITYNAME = IV_ENTITYNAME .
    CALL FUNCTION 'DDIF_FIELDINFO_GET'
      EXPORTING
        TABNAME        = LV_ENTITYNAME
*       FIELDNAME      = ' '
        LANGU          = SY-LANGU
*       LFIELDNAME     = ' '
*       ALL_TYPES      = ' '
*       GROUP_NAMES    = ' '
*       UCLEN          =
*       DO_NOT_WRITE   = ' '
*     IMPORTING
*       X030L_WA       =
*       DDOBJTYPE      =
*       DFIES_WA       =
*       LINES_DESCR    =
      TABLES
        DFIES_TAB      = LT_HEADER
*       FIXED_VALUES   =
      EXCEPTIONS
        NOT_FOUND      = 1
        INTERNAL_ERROR = 2
        OTHERS         = 3.
    LOOP AT <DYN_TABLE> ASSIGNING FIELD-SYMBOL(<DYN_WA>).
      LR_DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( <DYN_WA> ).
      "拼接表头数据,转文本描述
      IF LV_HEADER_FLAG IS INITIAL.
        LOOP AT LR_DESCR_REF->COMPONENTS INTO DATA(LS_COM).
          READ TABLE IT_SELECT INTO DATA(LV_SELECT) WITH KEY TABLE_LINE = LS_COM-NAME.
          IF SY-SUBRC EQ 0 .
            READ TABLE LT_HEADER INTO LS_HEADER WITH KEY FIELDNAME = LS_COM-NAME .
            IF SY-SUBRC EQ 0 .
              CONCATENATE LS_TEXT_TAB-LINE LS_HEADER-FIELDTEXT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
                INTO LS_TEXT_TAB-LINE SEPARATED BY ''.
            ENDIF.
          ENDIF.
        ENDLOOP.
        "换行处理
        CONCATENATE LS_TEXT_TAB-LINE CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LS_TEXT_TAB-LINE
         SEPARATED BY '' .
        APPEND LS_TEXT_TAB TO LT_TEXT_TAB .
        CLEAR LS_TEXT_TAB .
        LV_HEADER_FLAG = 'X'.
      ENDIF.

      "拼接表体数据,把每一行数据转为string类型
      CLEAR LS_COM .
      LOOP AT LR_DESCR_REF->COMPONENTS INTO LS_COM.
        READ TABLE IT_SELECT INTO LV_SELECT WITH KEY TABLE_LINE = LS_COM-NAME.
        IF SY-SUBRC EQ 0 .
          ASSIGN COMPONENT LS_COM-NAME OF STRUCTURE <DYN_WA> TO FIELD-SYMBOL(<FS_FIELD>) .
          IF SY-SUBRC EQ 0.
            LV_FIELD = <FS_FIELD> ."类型转换
            CONCATENATE LS_TEXT_TAB-LINE LV_FIELD CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO LS_TEXT_TAB-LINE
             SEPARATED BY '' .
          ENDIF.
        ENDIF .
      ENDLOOP.
      "换行处理
      CONCATENATE LS_TEXT_TAB-LINE CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LS_TEXT_TAB-LINE
       SEPARATED BY '' .
      APPEND LS_TEXT_TAB TO LT_TEXT_TAB .
      CLEAR LS_TEXT_TAB .
    ENDLOOP.

    "把内表数据转为string类型
    CALL FUNCTION 'SOTR_SERV_TABLE_TO_STRING'
      EXPORTING
*       FLAG_NO_LINE_BREAKS       = 'X'
*       LINE_LENGTH               =
        LANGU    = SY-LANGU
      IMPORTING
        TEXT     = LV_TEXT
      TABLES
        TEXT_TAB = LT_TEXT_TAB.
    "string类型-> XSTRING
    CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
      EXPORTING
        TEXT     = LV_TEXT
        MIMETYPE = 'xls'
        ENCODING = '8404' "防止中文乱码
      IMPORTING
        BUFFER   = LV_BUFFER
      EXCEPTIONS
        FAILED   = 1
        OTHERS   = 2.
    IF SY-SUBRC EQ 0.

    ENDIF.
    CREATE OBJECT LO_CACHED_RESPONSE
      TYPE
      CL_HTTP_RESPONSE
      EXPORTING
        ADD_C_MSG = 1.

*      ***set the data and the headers
    LO_CACHED_RESPONSE->SET_DATA( LV_BUFFER ).
    LV_APP_TYPE = 'APPLICATION/MSEXCEL; charset=utf-8'.
    LO_CACHED_RESPONSE->SET_HEADER_FIELD( NAME = IF_HTTP_HEADER_FIELDS=>CONTENT_TYPE
                                          VALUE = LV_APP_TYPE ).

*      ***Set the Response Status

    LO_CACHED_RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).

*      ***Set the Cache Timeout – 60 seconds – we only need this in the cache

*      ***long enough to build the page

    LO_CACHED_RESPONSE->SERVER_CACHE_EXPIRE_REL( EXPIRES_REL = 60 ).

*      ***Create a unique URL for the object and export URL

    CONCATENATE IV_ENTITYNAME '_' SY-DATUM SY-UZEIT INTO LS_FILE_NAME.

    CONCATENATE  '/sap/public/ping/'  LS_FILE_NAME  '.' 'xls' INTO EV_XTRING.

*      ***Cache the URL
    CL_HTTP_SERVER=>SERVER_CACHE_UPLOAD( URL     = EV_XTRING
                                         RESPONSE = LO_CACHED_RESPONSE ).

    LS_ZSNRCONFIG01-UNAME  = SY-UNAME .
    LS_ZSNRCONFIG01-ENTITY = IV_ENTITYNAME .
    LS_ZSNRCONFIG01-URI    = EV_XTRING .

    MODIFY ZSNRCONFIG01 FROM LS_ZSNRCONFIG01 .

  ENDMETHOD.

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值