mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-05 20:38:25 +08:00

Allow inheritance to support testing of modified classes w/o having to change the original or to allow customer-specific variations Changed objects: ZCL_EXCEL_READER_2007: Added try-catch block to allow reading excelsheets with textfields ( ignore textfields - just read the rest ) ZCL_EXCEL_READER_2007: Added support of reading hyperlinks ZCL_EXCEL_WRITER_2007: Corrected method CREATE_XL_SHEET_RELS to not look at internal hyperlinks ZCL_EXCEL: Allow inheritance to test changes on subobjects w/o changing original ( needed for issue 343 for class ZCL_EXCEL_WORKSHEET ) ZCL_EXCEL_WORKSHEET: Allow inheritance, Changed row-dimensions to hashtable, added tabletype for this, changed method GET_ROW_DIMENSION to use hashtable ZCL_EXCEL_WRITER_XLSM: Allow inheritance ZDEMO_EXCEL_OUTPUTOPT_INCL: Changed default to "Display", Allow using any writerclass that inherits from ZCL_EXCEL_WRITER_2007 ZDEMO_EXCEL37: Allow passthrough of .xlsm files as well. Allow using any reader or writerclass that inherits from the ZCL_EXCEL_READER_2007 or ZCL_EXCEL_WRITER_2007 ZDEMO_EXCEL41: Test inheritance - demo for inherited ZCL_EXCEL or ZCL_EXCEL_WORKSHEET
263 lines
9.7 KiB
XML
263 lines
9.7 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<PROG NAME="ZDEMO_EXCEL37" VARCL="X" SUBC="1" RSTAT="T" RMAND="100" RLOAD="E" FIXPT="X" UCCHECK="X">
|
|
<textPool>
|
|
<language SPRAS="D">
|
|
<textElement ID="R" ENTRY="Xlsx-Datei lesen und dann wieder ausgeben" LENGTH="70 "/>
|
|
<textElement ID="S" KEY="P_UPFILE" ENTRY=" Hochzuladende Datei" LENGTH="27 "/>
|
|
</language>
|
|
<language SPRAS="E">
|
|
<textElement ID="I" KEY="CLS" ENTRY="Choose reader- and writerclass to use" LENGTH="70 "/>
|
|
<textElement ID="R" ENTRY="Read xlsx-file and output" LENGTH="25 "/>
|
|
<textElement ID="S" KEY="LB_READ" ENTRY=" Reader-class" LENGTH="20 "/>
|
|
<textElement ID="S" KEY="LB_WRITE" ENTRY=" Writer-class" LENGTH="20 "/>
|
|
<textElement ID="S" KEY="P_UPFILE" ENTRY=" File to upload" LENGTH="22 "/>
|
|
</language>
|
|
</textPool>
|
|
<source>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_message TYPE string,
|
|
lv_extension TYPE string.
|
|
|
|
|
|
CONSTANTS: gc_save_file_name TYPE string VALUE '37-passthrough.xlsx'.
|
|
|
|
SELECTION-SCREEN BEGIN OF BLOCK blx WITH FRAME.
|
|
PARAMETERS: p_upfile TYPE string DEFAULT 'c:\temp\whatever.xlsx' LOWER CASE.
|
|
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.
|
|
|
|
INITIALIZATION.
|
|
PERFORM setup_listboxes.
|
|
|
|
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_upfile.
|
|
PERFORM f4_p_upfile CHANGING p_upfile.
|
|
|
|
|
|
START-OF-SELECTION.
|
|
|
|
TRY.
|
|
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).
|
|
"Use template for charts
|
|
excel->use_template = abap_true.
|
|
|
|
ENDCASE.
|
|
|
|
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'.
|
|
lcl_output=>output( excel ).
|
|
|
|
WHEN '.XLSM'.
|
|
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.
|
|
|
|
|
|
|
|
*** Create output
|
|
CATCH cx_root INTO go_error.
|
|
MESSAGE 'Error reading excelfile' TYPE 'I'.
|
|
gv_message = go_error->get_text( ).
|
|
IF gv_message IS NOT INITIAL.
|
|
MESSAGE gv_message TYPE 'I'.
|
|
ENDIF.
|
|
ENDTRY.
|
|
|
|
|
|
*&---------------------------------------------------------------------*
|
|
*& 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</source>
|
|
</PROG>
|