Skip to Content

This document explains how to download contents to .xlsx file in ABAP Web Dynpro. It explains downloading the file contents into .xlsx file by code snippets. Following are the steps explaining the procedure:-

  1. Define a Web Dynpro component with name for example ‘ZZDEV_WD_TEST’.
  2. Define a Button UI element in the main view with name ‘Download File’.
  3. Create a context node having attributes as structure of download file. Here I am taking structure ZSTRUCT_DOWNLOAD_XLSX for example. Users can define this node using their download file structure.

Untitled.jpg   4.  Bind the contents to be downloaded to the context node defined in step3.

   5.  On action of button UI element defined in step 2, read this context node having file contents to be downloaded into an internal table. Follow below                       mentioned code to download this contents to .xlsx file.

* Internal tables declaration

  DATA:

        lt_file_download                                    TYPE wd_this->elements_file_download,

        ls_file_download                                   TYPE wd_this->element_file_download,

        lt_column                                             TYPE if_fdt_doc_spreadsheet=>t_column.

* Structures declaration

  DATA:

        ls_column                                             TYPE LINE OF if_fdt_doc_spreadsheet=>t_column.

* Local variables declaration

  DATA:

        lv_proceed                                            TYPE boolean VALUE abap_true,

        lv_xstring                                              TYPE xstring.

* References declaration

  DATA:

        lo_nd_file_download                              TYPE REF TO if_wd_context_node,

        lref_string                                             TYPE REF TO cl_abap_datadescr,

        lref_data                                               TYPE REF TO data.

* Field symbols declaration

  FIELD-SYMBOLS:

        <fs_contents>                                       TYPE STANDARD TABLE,

        <fs_header>                                          TYPE any,

        <fs_comp>                                 TYPE any.

* Create data object

  CREATE DATA lref_data TYPE TABLE OF zstruct_download_xlsx.

* navigate from <CONTEXT> to <FILE_DOWNLOAD> via lead selection

  lo_nd_file_download = wd_context->get_child_node( name = wd_this->wdctx_file_download ).

lo_nd_file_download->get_static_attributes_table( IMPORTING table = lt_file_download ).

* Assign download contents to field symbol

  ASSIGN lref_data->* TO <fs_contents>.

  ASSIGN ls_file_download TO <fs_header>.

* Pass contents to field symbol

  <fs_contents> = lt_file_download.

* Read first row which is header

  READ TABLE <fs_contents> INTO <fs_header> INDEX 1.

  DELETE <fs_contents> INDEX 1.

* Display error message if file has no records

  IF <fs_contents> IS INITIAL.

*<< Display error message >>

*   Return without furthur processing when error encountered

    RETURN.

  ENDIF.

* Loop to prepare column header text table

  WHILE lv_proceed = abap_true.

*   Read columnwise entries

    ASSIGN COMPONENT sy-index OF STRUCTURE <fs_header> TO <fs_comp>.

*   Check if the field is the last column

    IF <fs_comp> IS NOT ASSIGNED.

*     Set loop flag

      lv_proceed = abap_false.

*     Exit the loop when a row ends

      EXIT.

    ELSE.

*     Read reference of column field name text

      lref_string ?= cl_abap_datadescr=>describe_by_data( <fs_comp> ).

*     Prepare structure for header text

      ls_column-id           = sy-index.

      ls_column-name         = <fs_comp>.

      ls_column-display_name = <fs_comp>.

      ls_column-is_result    = abap_true.

      ls_column-type         = lref_string.

*     Append structure prepared to internal table

      APPEND ls_column TO lt_column.

    ENDIF.

*   Unassign field symbol

    UNASSIGN <fs_comp>.

  ENDWHILE.

* Call class method to convert data to be downloaded to .xlsx compatible xstring

cl_fdt_xl_spreadsheet=>if_fdt_doc_spreadsheet~create_document(

      EXPORTING

        itab         = lref_data

        iv_call_type = 1

        columns      = lt_column

      RECEIVING

        xdocument    = lv_xstring ).

* Call class method to download contents in .xlsx format

cl_wd_runtime_services=>attach_file_to_response(

    EXPORTING i_filename      = ‘errors.xlsx’

              i_content       = lv_xstring

              i_mime_type     = ‘APPLICATION/XLSX’

              i_in_new_window = abap_false ).

   6. After executing this code a pop-up windows dialog box appears asking to open or save the .xlsx file. Click on the button as required.

To report this post you need to login first.

12 Comments

You must be Logged on to comment or reply to a post.

  1. Anil Maddhirala

    Hi Devesh,

      Does it support multisheet XLSX download and upload, I checked API most the useful methods are private, can you post the solution for multisheet XLSX.

    BR,

    Anil

    (0) 
      1. Devesh Singh Post author

        Hello Rama Krishna,

        Please put a debugger at

        ASSIGN ls_file_download TO <fs_header>.

        and look if there are any values assigned to <fs_header>.

        If not, make a SE11 structure for ls_file_download and specify field labels.

        Please let me know if the problem persists.

        Thanks and Regards,

        Devesh Singh

        (0) 
  2. Abhilash Pradhan

    Hi Devesh,

    There are some extra sheets being displayed while creating using this way. Is there any way to avoid this ?

    Also we can use the below code to create the header.

      lo_strc ?= cl_abap_structdescr=>describe_by_name( p_name = ‘ZABHI_HEADER_FIELDS’ ).

      LOOP AT lo_strc->components

        ASSIGNING <l_components>.

        APPEND INITIAL LINE TO lt_column ASSIGNING <l_column>.

        IF  <l_column> IS ASSIGNED..

          MOVE: sy-tabix            TO <l_column>-id,

                <l_components>-name TO <l_column>-name,

                <l_components>-name TO <l_column>-display_name,

                 abap_true          TO <l_column>-is_result.

          CLEAR lo_datadescr.

          ASSIGN COMPONENT <l_column>-name

            OF STRUCTURE <l_header> TO <l_comp>.

          lo_datadescr ?= cl_abap_datadescr=>describe_by_data( <l_comp> ).

          MOVE: lo_datadescr TO <l_column>-type.

        ENDIF.

      ENDLOOP.

    (0) 
  3. SAP SAP SAP

    Hello Experts,

    I copied the code and its working fine, but some extra unwanted sheets are creating (for example, Decision table, Column Details….), pl. let us know is there any way to avoid creating of these unwanted sheets, we want just first sheet

    Thank you

    (0) 
  4. April Zuo

    hello Expert,

    would u tell me why this is not supported for  EXCEL 2003 with Chinese words. This is SAP limit or is there something I missed.

    Thanks a lot!

    (0) 
  5. Lavanya A

    Hello experts,

    I am using a Simple Transformation to get a formatted xml data. How can I use that xml data to download into XLSX file??

    Regards

    Lavanya

    (0) 
  6. Rohith Brungi

    Hi Guys,

    Thanks for the valuable document, I have tried the same as mentioned in document.

    It is working fine for small amount of records but I am getting time out error for records around 11000.

    Please advice any alternative solution.

    (0) 
  7. Felipe Zanettini

    Hi Devesh,

    Thank you for the great document.

    Do you have any recommendations on a feasible maximum number of records that one internal table could have in order to avoid processing time outs due to the converting of the data to xstring?

    Regards,

    Felipe

    (0) 

Leave a Reply