abap2xlsx/ZA2X/PROG/ZDEMO_EXCEL37.slnk
StefanSchmoecker e5c352c6d5 Fixes for issues: 339,340,343
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
2014-12-29 17:20:09 +01:00

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 &apos;37-passthrough.xlsx&apos;.
SELECTION-SCREEN BEGIN OF BLOCK blx WITH FRAME.
PARAMETERS: p_upfile TYPE string DEFAULT &apos;c:\temp\whatever.xlsx&apos; 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 &apos;Autodetect&apos;(001).
PARAMETERS: lb_write TYPE seoclsname AS LISTBOX VISIBLE LENGTH 40 LOWER CASE OBLIGATORY DEFAULT &apos;Autodetect&apos;(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 &apos;Autodetect&apos;(001).
FIND REGEX &apos;(\.xlsx|\.xlsm)\s*$&apos; IN p_upfile SUBMATCHES lv_extension.
TRANSLATE lv_extension TO UPPER CASE.
CASE lv_extension.
WHEN &apos;.XLSX&apos;.
CREATE OBJECT reader TYPE zcl_excel_reader_2007.
excel = reader-&gt;load_file( p_upfile ).
&quot;Use template for charts
excel-&gt;use_template = abap_true.
WHEN &apos;.XLSM&apos;.
CREATE OBJECT reader TYPE zcl_excel_reader_xlsm.
excel = reader-&gt;load_file( p_upfile ).
&quot;Use template for charts
excel-&gt;use_template = abap_true.
WHEN OTHERS.
MESSAGE &apos;Unsupported filetype&apos; TYPE &apos;I&apos;.
RETURN.
ENDCASE.
WHEN OTHERS.
CREATE OBJECT reader TYPE (lb_read).
&quot;Use template for charts
excel-&gt;use_template = abap_true.
ENDCASE.
CASE lb_write.
WHEN &apos;Autodetect&apos;(001).
FIND REGEX &apos;(\.xlsx|\.xlsm)\s*$&apos; IN p_upfile SUBMATCHES lv_extension.
TRANSLATE lv_extension TO UPPER CASE.
CASE lv_extension.
WHEN &apos;.XLSX&apos;.
lcl_output=&gt;output( excel ).
WHEN &apos;.XLSM&apos;.
lcl_output=&gt;output( cl_excel = excel
iv_writerclass_name = &apos;ZCL_EXCEL_WRITER_XLSM&apos; ).
WHEN OTHERS.
MESSAGE &apos;Unsupported filetype&apos; TYPE &apos;I&apos;.
RETURN.
ENDCASE.
WHEN OTHERS.
lcl_output=&gt;output( cl_excel = excel
iv_writerclass_name = lb_write ).
ENDCASE.
*** Create output
CATCH cx_root INTO go_error.
MESSAGE &apos;Error reading excelfile&apos; TYPE &apos;I&apos;.
gv_message = go_error-&gt;get_text( ).
IF gv_message IS NOT INITIAL.
MESSAGE gv_message TYPE &apos;I&apos;.
ENDIF.
ENDTRY.
*&amp;---------------------------------------------------------------------*
*&amp; Form F4_P_UPFILE
*&amp;---------------------------------------------------------------------*
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 &apos;DYNP_VALUES_READ&apos;
EXPORTING
dyname = lv_repid
dynumb = &apos;1000&apos;
request = &apos;A&apos;
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 = &apos;P_UPFILE&apos;.
p_upfile = ls_field-fieldvalue.
lv_file_filter = &apos;Excel Files (*.XLSX;*.XLSM)|*.XLSX;*.XLSM&apos;.
cl_gui_frontend_services=&gt;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. &quot; F4_P_UPFILE
*&amp;---------------------------------------------------------------------*
*&amp; Form SETUP_LISTBOXES
*&amp;---------------------------------------------------------------------*
FORM setup_listboxes .
DATA: lv_id TYPE vrm_id,
lt_values TYPE vrm_values,
lt_implementing_classes TYPE seo_relkeys.
FIELD-SYMBOLS: &lt;ls_implementing_class&gt; LIKE LINE OF lt_implementing_classes,
&lt;ls_value&gt; LIKE LINE OF lt_values.
*--------------------------------------------------------------------*
* Possible READER-Classes
*--------------------------------------------------------------------*
lv_id = &apos;LB_READ&apos;.
APPEND INITIAL LINE TO lt_values ASSIGNING &lt;ls_value&gt;.
&lt;ls_value&gt;-key = &apos;Autodetect&apos;(001).
&lt;ls_value&gt;-text = &apos;Autodetect&apos;(001).
PERFORM get_implementing_classds USING &apos;ZIF_EXCEL_READER&apos;
CHANGING lt_implementing_classes.
CLEAR lt_values.
LOOP AT lt_implementing_classes ASSIGNING &lt;ls_implementing_class&gt;.
APPEND INITIAL LINE TO lt_values ASSIGNING &lt;ls_value&gt;.
&lt;ls_value&gt;-key = &lt;ls_implementing_class&gt;-clsname.
&lt;ls_value&gt;-text = &lt;ls_implementing_class&gt;-clsname.
ENDLOOP.
CALL FUNCTION &apos;VRM_SET_VALUES&apos;
EXPORTING
id = lv_id
values = lt_values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
*--------------------------------------------------------------------*
* Possible WRITER-Classes
*--------------------------------------------------------------------*
lv_id = &apos;LB_WRITE&apos;.
APPEND INITIAL LINE TO lt_values ASSIGNING &lt;ls_value&gt;.
&lt;ls_value&gt;-key = &apos;Autodetect&apos;(001).
&lt;ls_value&gt;-text = &apos;Autodetect&apos;(001).
PERFORM get_implementing_classds USING &apos;ZIF_EXCEL_WRITER&apos;
CHANGING lt_implementing_classes.
CLEAR lt_values.
LOOP AT lt_implementing_classes ASSIGNING &lt;ls_implementing_class&gt;.
APPEND INITIAL LINE TO lt_values ASSIGNING &lt;ls_value&gt;.
&lt;ls_value&gt;-key = &lt;ls_implementing_class&gt;-clsname.
&lt;ls_value&gt;-text = &lt;ls_implementing_class&gt;-clsname.
ENDLOOP.
CALL FUNCTION &apos;VRM_SET_VALUES&apos;
EXPORTING
id = lv_id
values = lt_values
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
ENDFORM. &quot; SETUP_LISTBOXES
*&amp;---------------------------------------------------------------------*
*&amp; Form GET_IMPLEMENTING_CLASSDS
*&amp;---------------------------------------------------------------------*
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: &lt;ls_implementing_class&gt; LIKE LINE OF ct_implementing_classes.
TRY.
lo_oo_interface ?= cl_oo_interface=&gt;get_instance( iv_interface_name ).
CATCH cx_class_not_existent.
RETURN.
ENDTRY.
ct_implementing_classes = lo_oo_interface-&gt;get_implementing_classes( ).
LOOP AT ct_implementing_classes ASSIGNING &lt;ls_implementing_class&gt;.
TRY.
lo_oo_class ?= cl_oo_class=&gt;get_instance( &lt;ls_implementing_class&gt;-clsname ).
lt_implementing_subclasses = lo_oo_class-&gt;get_subclasses( ).
APPEND LINES OF lt_implementing_subclasses TO ct_implementing_classes.
CATCH cx_class_not_existent.
ENDTRY.
ENDLOOP.
ENDFORM. &quot; GET_IMPLEMENTING_CLASSDS</source>
</PROG>