*--------------------------------------------------------------------*
* REPORT  ZDEMO_EXCEL32
* Demo for export options from ALV GRID:
* export data from ALV (CL_GUI_ALV_GRID) object or cl_salv_table object
* to Excel.
*--------------------------------------------------------------------*
REPORT zdemo_excel32.

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS:
      on_user_command FOR EVENT added_function OF cl_salv_events
        IMPORTING e_salv_function.
ENDCLASS.                    "lcl_handle_events DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
    PERFORM user_command." using e_salv_function text-i08.
  ENDMETHOD.                    "on_user_command
ENDCLASS.                     "lcl_handle_events IMPLEMENTATION

*--------------------------------------------------------------------*
* DATA DECLARATION
*--------------------------------------------------------------------*

DATA: lo_excel          TYPE REF TO zcl_excel,
      lo_worksheet      TYPE REF TO zcl_excel_worksheet,
      lo_salv           TYPE REF TO cl_salv_table,
      gr_events         TYPE REF TO lcl_handle_events,
      lr_events         TYPE REF TO cl_salv_events_table,
      gt_sbook          TYPE TABLE OF sbook.

DATA: l_path            TYPE string,  " local dir
      lv_workdir        TYPE string,
      lv_file_separator TYPE c.

CONSTANTS:
      lv_default_file_name TYPE string VALUE '32_Export_ALV.xlsx',
      lv_default_file_name2 TYPE string VALUE '32_Export_Convert.xlsx'.
*--------------------------------------------------------------------*
*START-OF-SELECTION
*--------------------------------------------------------------------*

START-OF-SELECTION.

* get data
* ------------------------------------------

  SELECT *
      INTO TABLE gt_sbook[]
      FROM sbook                                        "#EC CI_NOWHERE
      UP TO 100 ROWS.

* Display ALV
* ------------------------------------------

  TRY.
      cl_salv_table=>factory(
        EXPORTING
          list_display = abap_false
        IMPORTING
          r_salv_table = lo_salv
        CHANGING
          t_table      = gt_sbook[] ).
    CATCH cx_salv_msg .
  ENDTRY.

  TRY.
      lo_salv->set_screen_status(
        EXPORTING
          report        = sy-repid
          pfstatus      = 'ALV_STATUS'
          set_functions = lo_salv->c_functions_all ).
    CATCH cx_salv_msg .
  ENDTRY.

  lr_events = lo_salv->get_event( ).
  CREATE OBJECT gr_events.
  SET HANDLER gr_events->on_user_command FOR lr_events.

  lo_salv->display( ).


*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*      ALV user command
*--------------------------------------------------------------------*
FORM user_command .

* get save file path
      cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = l_path ).
      cl_gui_cfw=>flush( ).
      cl_gui_frontend_services=>directory_browse(
        EXPORTING initial_folder = l_path
        CHANGING selected_folder = l_path ).

      IF l_path IS INITIAL.
        cl_gui_frontend_services=>get_sapgui_workdir(
          CHANGING sapworkdir = lv_workdir ).
        l_path = lv_workdir.
      ENDIF.

      cl_gui_frontend_services=>get_file_separator(
        CHANGING file_separator = lv_file_separator ).



* export file to save file path
  CASE sy-ucomm.
    WHEN 'EXCELBIND'.
      CONCATENATE l_path lv_file_separator lv_default_file_name
                  INTO l_path.
      PERFORM export_to_excel_bind.

    WHEN 'EXCELCONV'.

      CONCATENATE l_path lv_file_separator lv_default_file_name2
                  INTO l_path.
      PERFORM export_to_excel_conv.

  ENDCASE.
ENDFORM.                    " USER_COMMAND
*--------------------------------------------------------------------*
* FORM EXPORT_TO_EXCEL_CONV
*--------------------------------------------------------------------*
* This subroutine is principal demo session
*--------------------------------------------------------------------*
FORM export_to_excel_conv RAISING zcx_excel.
  DATA: lo_converter TYPE REF TO zcl_excel_converter.

  CREATE OBJECT lo_converter.
*TRY.
  lo_converter->convert(
    EXPORTING
      io_alv        = lo_salv
      it_table      = gt_sbook
      i_row_int     = 2
      i_column_int  = 2
*    i_table       =
*    i_style_table =
*    io_worksheet  =
*  CHANGING
*    co_excel      =
         ).
* CATCH zcx_excel .
*ENDTRY.
  lo_converter->write_file( i_path = l_path ).

ENDFORM.                    "EXPORT_TO_EXCEL_CONV

*--------------------------------------------------------------------*
* FORM EXPORT_TO_EXCEL_BIND
*--------------------------------------------------------------------*
* This subroutine is principal demo session
*--------------------------------------------------------------------*
FORM export_to_excel_bind RAISING zcx_excel.
* create zcl_excel_worksheet object
  CREATE OBJECT lo_excel.
  lo_worksheet = lo_excel->get_active_worksheet( ).
  lo_worksheet->set_title( ip_title = 'Sheet1' ).

* write to excel using method Bin_object
*try.
  lo_worksheet->bind_alv(
      io_alv      = lo_salv
      it_table    = gt_sbook
      i_top       = 2
      i_left      = 1
         ).
* catch zcx_excel .
*endtry.


  PERFORM write_file.

ENDFORM.                    "EXPORT_TO_EXCEL_BIND
*&---------------------------------------------------------------------*
*&      Form  WRITE_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM write_file .
  DATA: lt_file	    TYPE solix_tab,
        l_bytecount	TYPE i,
        l_file      TYPE xstring.

  DATA: lo_excel_writer         TYPE REF TO zif_excel_writer.

  DATA: ls_seoclass TYPE seoclass.

  CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007.
  l_file = lo_excel_writer->write_file( lo_excel ).

  SELECT SINGLE * INTO ls_seoclass
    FROM seoclass
    WHERE clsname = 'CL_BCS_CONVERT'.

  IF sy-subrc = 0.
    CALL METHOD (ls_seoclass-clsname)=>xstring_to_solix
      EXPORTING
        iv_xstring = l_file
      RECEIVING
        et_solix   = lt_file.

    l_bytecount = XSTRLEN( l_file ).
  ELSE.
    " Convert to binary
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        = l_file
      IMPORTING
        output_length = l_bytecount
      TABLES
        binary_tab    = lt_file.
  ENDIF.

  cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = l_bytecount
                                                    filename     = l_path
                                                    filetype     = 'BIN'
                                           CHANGING data_tab     = lt_file ).

ENDFORM.                    " WRITE_FILE
