REPORT zdemo_excel37.
DATA: excel TYPE REF TO zcl_excel,
reader TYPE REF TO zif_excel_reader,
go_error TYPE REF TO cx_root,
gv_memid_gr8 TYPE text255,
gv_message TYPE string,
lv_extension TYPE string,
gv_error_program_name TYPE syrepid,
gv_error_include_name TYPE syrepid,
gv_error_line TYPE i.
DATA: gc_save_file_name TYPE string VALUE '37- Read template and output.&'.
SELECTION-SCREEN BEGIN OF BLOCK blx WITH FRAME.
PARAMETERS: p_upfile TYPE string LOWER CASE MEMORY ID gr8.
SELECTION-SCREEN END OF BLOCK blx.
INCLUDE zdemo_excel_outputopt_incl.
SELECTION-SCREEN BEGIN OF BLOCK cls WITH FRAME TITLE text-cls.
PARAMETERS: lb_read TYPE seoclsname AS LISTBOX VISIBLE LENGTH 40 LOWER CASE OBLIGATORY DEFAULT 'Autodetect'(001).
PARAMETERS: lb_write TYPE seoclsname AS LISTBOX VISIBLE LENGTH 40 LOWER CASE OBLIGATORY DEFAULT 'Autodetect'(001).
SELECTION-SCREEN END OF BLOCK cls.
SELECTION-SCREEN BEGIN OF BLOCK bl_err WITH FRAME TITLE text-err.
PARAMETERS: cb_errl AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: cb_dump AS CHECKBOX DEFAULT space.
SELECTION-SCREEN COMMENT (60) cmt_dump FOR FIELD cb_dump.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK bl_err.
INITIALIZATION.
PERFORM setup_listboxes.
cmt_dump = text-dum.
GET PARAMETER ID 'GR8' FIELD gv_memid_gr8.
p_upfile = gv_memid_gr8.
IF p_upfile IS INITIAL.
p_upfile = 'c:\temp\whatever.xlsx'.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_upfile.
PERFORM f4_p_upfile CHANGING p_upfile.
START-OF-SELECTION.
IF cb_dump IS INITIAL.
TRY.
PERFORM read_template.
PERFORM write_template.
*** Create output
CATCH cx_root INTO go_error.
MESSAGE 'Error reading excelfile' TYPE 'I'.
gv_message = go_error->get_text( ).
IF cb_errl = ' '.
IF gv_message IS NOT INITIAL.
MESSAGE gv_message TYPE 'I'.
ENDIF.
ELSE.
go_error->get_source_position( IMPORTING program_name = gv_error_program_name
include_name = gv_error_include_name
source_line = gv_error_line ).
WRITE:/ 'Errormessage:' ,gv_message.
WRITE:/ 'Errorposition:',
AT /10 'Program:' ,gv_error_program_name,
AT /10 'include_name:' ,gv_error_include_name,
AT /10 'source_line:' ,gv_error_line.
ENDIF.
ENDTRY.
ELSE. " This will dump if an error occurs. In some cases the information given in cx_root is not helpful - this will show exactly where the problem is
PERFORM read_template.
PERFORM write_template.
ENDIF.
*&---------------------------------------------------------------------*
*& Form F4_P_UPFILE
*&---------------------------------------------------------------------*
FORM f4_p_upfile CHANGING p_upfile TYPE string.
DATA: lv_repid TYPE syrepid,
lt_fields TYPE dynpread_tabtype,
ls_field LIKE LINE OF lt_fields,
lt_files TYPE filetable,
lv_file_filter TYPE string.
lv_repid = sy-repid.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = lv_repid
dynumb = '1000'
request = 'A'
TABLES
dynpfields = lt_fields
EXCEPTIONS
invalid_abapworkarea = 01
invalid_dynprofield = 02
invalid_dynproname = 03
invalid_dynpronummer = 04
invalid_request = 05
no_fielddescription = 06
undefind_error = 07.
READ TABLE lt_fields INTO ls_field WITH KEY fieldname = 'P_UPFILE'.
p_upfile = ls_field-fieldvalue.
lv_file_filter = 'Excel Files (*.XLSX;*.XLSM)|*.XLSX;*.XLSM'.
cl_gui_frontend_services=>file_open_dialog( EXPORTING
default_filename = p_upfile
file_filter = lv_file_filter
CHANGING
file_table = lt_files
rc = sy-tabix
EXCEPTIONS
OTHERS = 1 ).
READ TABLE lt_files INDEX 1 INTO p_upfile.
ENDFORM. " F4_P_UPFILE
*&---------------------------------------------------------------------*
*& Form SETUP_LISTBOXES
*&---------------------------------------------------------------------*
FORM setup_listboxes .
DATA: lv_id TYPE vrm_id,
lt_values TYPE vrm_values,
lt_implementing_classes TYPE seo_relkeys.
FIELD-SYMBOLS: <ls_implementing_class> LIKE LINE OF lt_implementing_classes,
<ls_value> LIKE LINE OF lt_values.
*--------------------------------------------------------------------*
* Possible READER-Classes
*--------------------------------------------------------------------*
lv_id = 'LB_READ'.
APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>.
<ls_value>-key = 'Autodetect'(001).
<ls_value>-text = 'Autodetect'(001).
PERFORM get_implementing_classds USING 'ZIF_EXCEL_READER'
CHANGING lt_implementing_classes.
CLEAR lt_values.
LOOP AT lt_implementing_classes ASSIGNING <ls_implementing_class>.
APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>.
<ls_value>-key = <ls_implementing_class>-clsname.
<ls_value>-text = <ls_implementing_class>-clsname.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = lv_id
values = lt_values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
*--------------------------------------------------------------------*
* Possible WRITER-Classes
*--------------------------------------------------------------------*
lv_id = 'LB_WRITE'.
APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>.
<ls_value>-key = 'Autodetect'(001).
<ls_value>-text = 'Autodetect'(001).
PERFORM get_implementing_classds USING 'ZIF_EXCEL_WRITER'
CHANGING lt_implementing_classes.
CLEAR lt_values.
LOOP AT lt_implementing_classes ASSIGNING <ls_implementing_class>.
APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>.
<ls_value>-key = <ls_implementing_class>-clsname.
<ls_value>-text = <ls_implementing_class>-clsname.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = lv_id
values = lt_values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
ENDFORM. " SETUP_LISTBOXES
*&---------------------------------------------------------------------*
*& Form GET_IMPLEMENTING_CLASSDS
*&---------------------------------------------------------------------*
FORM get_implementing_classds USING iv_interface_name TYPE clike
CHANGING ct_implementing_classes TYPE seo_relkeys.
DATA: lo_oo_interface TYPE REF TO cl_oo_interface,
lo_oo_class TYPE REF TO cl_oo_class,
lt_implementing_subclasses TYPE seo_relkeys.
FIELD-SYMBOLS: <ls_implementing_class> LIKE LINE OF ct_implementing_classes.
TRY.
lo_oo_interface ?= cl_oo_interface=>get_instance( iv_interface_name ).
CATCH cx_class_not_existent.
RETURN.
ENDTRY.
ct_implementing_classes = lo_oo_interface->get_implementing_classes( ).
LOOP AT ct_implementing_classes ASSIGNING <ls_implementing_class>.
TRY.
lo_oo_class ?= cl_oo_class=>get_instance( <ls_implementing_class>-clsname ).
lt_implementing_subclasses = lo_oo_class->get_subclasses( ).
APPEND LINES OF lt_implementing_subclasses TO ct_implementing_classes.
CATCH cx_class_not_existent.
ENDTRY.
ENDLOOP.
ENDFORM. " GET_IMPLEMENTING_CLASSDS
*&---------------------------------------------------------------------*
*& Form READ_TEMPLATE
*&---------------------------------------------------------------------*
FORM read_template RAISING zcx_excel .
CASE lb_read.
WHEN 'Autodetect'(001).
FIND REGEX '(\.xlsx|\.xlsm)\s*$' IN p_upfile SUBMATCHES lv_extension.
TRANSLATE lv_extension TO UPPER CASE.
CASE lv_extension.
WHEN '.XLSX'.
CREATE OBJECT reader TYPE zcl_excel_reader_2007.
excel = reader->load_file( p_upfile ).
"Use template for charts
excel->use_template = abap_true.
WHEN '.XLSM'.
CREATE OBJECT reader TYPE zcl_excel_reader_xlsm.
excel = reader->load_file( p_upfile ).
"Use template for charts
excel->use_template = abap_true.
WHEN OTHERS.
MESSAGE 'Unsupported filetype' TYPE 'I'.
RETURN.
ENDCASE.
WHEN OTHERS.
CREATE OBJECT reader TYPE (lb_read).
excel = reader->load_file( p_upfile ).
"Use template for charts
excel->use_template = abap_true.
ENDCASE.
ENDFORM. " READ_TEMPLATE
*&---------------------------------------------------------------------*
*& Form WRITE_TEMPLATE
*&---------------------------------------------------------------------*
FORM write_template RAISING zcx_excel.
CASE lb_write.
WHEN 'Autodetect'(001).
FIND REGEX '(\.xlsx|\.xlsm)\s*$' IN p_upfile SUBMATCHES lv_extension.
TRANSLATE lv_extension TO UPPER CASE.
CASE lv_extension.
WHEN '.XLSX'.
REPLACE '&' IN gc_save_file_name WITH 'xlsx'. " Pass extension for standard writer
lcl_output=>output( excel ).
WHEN '.XLSM'.
REPLACE '&' IN gc_save_file_name WITH 'xlsm'. " Pass extension for macro-writer
lcl_output=>output( cl_excel = excel
iv_writerclass_name = 'ZCL_EXCEL_WRITER_XLSM' ).
WHEN OTHERS.
MESSAGE 'Unsupported filetype' TYPE 'I'.
RETURN.
ENDCASE.
WHEN OTHERS.
lcl_output=>output( cl_excel = excel
iv_writerclass_name = lb_write ).
ENDCASE.
ENDFORM. " WRITE_TEMPLATE