program xz.

types
   : tt_string TYPE STANDARD TABLE OF string
   .

TABLES
  : TADIR
  .

data
      : gt_outtab type table of TADIR
      , it_source TYPE TABLE OF string
      , code type CPCODEPAGE
      , CODEPAGE TYPE  ABAP_ENCODING

      .


* 
select * from TADIR into table gt_outtab up to 5 rows.

*  XML
PERFORM export_to_excel TABLES it_source USING 'Z_TEST_EXPORT_TO_EXCEL'.

*  
CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
  EXPORTING
    external_name = 'utf-8'
    kind          = 'H'
  IMPORTING
    sap_codepage  = code
  EXCEPTIONS
    not_found     = 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.
ELSE.
  WRITE code TO codepage.
ENDIF.

*  
CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
    filename                = 'c:\temp\123.xls'
    filetype                = 'DAT'
    codepage                = codepage
  TABLES
    data_tab                = it_source
  EXCEPTIONS
    file_write_error        = 1
    no_batch                = 2
    gui_refuse_filetransfer = 3
    invalid_type            = 4
    no_authority            = 5
    unknown_error           = 6
    header_not_allowed      = 7
    separator_not_allowed   = 8
    filesize_not_allowed    = 9
    header_too_long         = 10
    dp_error_create         = 11
    dp_error_send           = 12
    dp_error_write          = 13
    unknown_dp_error        = 14
    access_denied           = 15
    dp_out_of_memory        = 16
    disk_full               = 17
    dp_timeout              = 18
    file_not_found          = 19
    dataprovider_exception  = 20
    control_flush_error     = 21
    others                  = 22.
if sy-subrc <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.


form export_to_excel TABLES it_source type tt_string  using IV_OBJID TYPE  W3OBJID .

  data

        : KEY               type WWWDATATAB
        , HTML              LIKE W3HTML OCCURS 100 WITH HEADER LINE
        , MIME              LIKE W3mime OCCURS 100 WITH HEADER LINE
        , lv_tabname        type string
        , lt_bufer          TYPE TABLE OF string WITH HEADER LINE
        , wa_bufer          type string
        , lt_string         TYPE TABLE OF string
        , lv_str            TYPE string
        , lv_str2           TYPE string
        , lv_str3           TYPE string
        , lv_string         type string

        .

CONSTANTS
  : lc_lt(4) VALUE '&lt;'
  , lc_gt(4) VALUE '&gt;'
  .

FIELD-SYMBOLS
               : <field>
               , <table> TYPE ANY TABLE
               , <wa>
               .

  define process_buffer.

    LOOP AT lt_bufer INTO wa_bufer .

      find REGEX '(\$#(.*)\$#)' in wa_bufer SUBMATCHES lv_str  lv_str2.
      IF sy-subrc = 0.

        REPLACE  lc_lt in lv_str2 WITH '<'.
        REPLACE  lc_gt in lv_str2 WITH '>'.

        ASSIGN (lv_str2) to <field>.
        lv_str3 = <field>.

        REPLACE REGEX '(\$#(.*)\$#)' in wa_bufer WITH lv_str3.
        APPEND wa_bufer to it_source.

      else.

        APPEND wa_bufer to it_source.

      ENDIF.

    ENDLOOP.

  end-of-DEFINITION.

  define flush.

    " if tabname defined - loop at table
    IF  lv_tabname is not INITIAL.

      ASSIGN (lv_tabname)  to <table>.

      LOOP AT <table>  ASSIGNING <wa>.
        process_buffer.
      ENDLOOP.

    else.

       process_buffer.

    ENDIF.

    clear  lv_tabname.
    REFRESH lt_bufer.

  end-of-DEFINITION.


  " get key of object
  SELECT single * FROM WWWDATA AS F INNER JOIN TADIR AS P
                ON F~OBJID = P~OBJ_NAME
                INTO  CORRESPONDING FIELDS OF KEY
                WHERE F~SRTF2 = 0
                AND   F~RELID = 'MI'
                AND   P~PGMID    = 'R3TR'
                AND   P~OBJECT   = 'W3MI'
                AND   P~OBJ_NAME = IV_OBJID .


  " get object
  CALL FUNCTION 'WWWDATA_IMPORT'
    EXPORTING
      KEY    = KEY
    TABLES
      HTML   = HTML
      MIME   = MIME
    EXCEPTIONS
      OTHERS = 1.

  " convert raw data to string
  CALL FUNCTION 'WSI_RAW_TO_STRING'
    IMPORTING
      OUTPUT             = lv_string
    TABLES
      INPUT              = MIME
    EXCEPTIONS
      CONVERTION_FAILURE = 1
      OTHERS             = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


  SPLIT lv_string at CL_ABAP_CHAR_UTILITIES=>CR_LF INTO TABLE lt_string.


  " process template
  REFRESH it_source.

  LOOP AT lt_string INTO lv_string .

    REPLACE ALL OCCURRENCES OF '''' IN lv_string WITH ''''''.

    find regex '(ss:ExpandedRowCount="\d+")' in lv_string SUBMATCHES lv_str  lv_str2.
    IF sy-subrc = 0.
      REPLACE REGEX '(ss:ExpandedRowCount="\d+")' in lv_string WITH ''.
    ENDIF.

    " find table name
    find REGEX '(\$!\$(.*)\$!\$)' in lv_string SUBMATCHES lv_str  lv_str2.
    IF sy-subrc = 0.
      REPLACE REGEX '(\$!\$(.*)\$!\$)' in lv_string WITH ''.
      lv_tabname = lv_str2.
    ENDIF.

    " new row occured, process buffer
    find regex '(<Row)' in lv_string .
    IF sy-subrc = 0.
       flush.
    ENDIF.

    "reach end of row, add last line to buffer and process buffer
    find regex '(</Row>)' in lv_string.
    IF sy-subrc = 0.
      APPEND lv_string to lt_bufer.
       flush.
    else.
      APPEND lv_string to lt_bufer.
    ENDIF.

  ENDLOOP.

   flush.

endform.