mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-05 06:16:14 +08:00
329 lines
13 KiB
XML
329 lines
13 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="I" KEY="CLS" ENTRY="Auswahl der Reader- und Writerklasse" LENGTH="70 "/>
|
|
<textElement ID="I" KEY="DUM" ENTRY="Dump bei unbeh. Exception. Man weiß wenn man das braucht" LENGTH="60 "/>
|
|
<textElement ID="I" KEY="ERR" ENTRY="Besondere Schalter" LENGTH="60 "/>
|
|
<textElement ID="R" ENTRY="Xlsx-Datei lesen und dann wieder ausgeben = Arbeiten mit Templates" LENGTH="70 "/>
|
|
<textElement ID="S" KEY="CB_DUMP" ENTRY=" Dump bei unbeh. Exceptions" LENGTH="36 "/>
|
|
<textElement ID="S" KEY="CB_ERRL" ENTRY=" Exceptionposition anzeigen" LENGTH="34 "/>
|
|
<textElement ID="S" KEY="LB_READ" ENTRY=" Reader-Klasse" LENGTH="21 "/>
|
|
<textElement ID="S" KEY="LB_WRITE" ENTRY=" Writer-Klasse" LENGTH="21 "/>
|
|
<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="I" KEY="DUM" ENTRY="Dump on uncaught exception - you'll know when you need this" LENGTH="60 "/>
|
|
<textElement ID="I" KEY="ERR" ENTRY="Special switches" LENGTH="60 "/>
|
|
<textElement ID="R" ENTRY="Read xlsx-file and output = using templates" LENGTH="43 "/>
|
|
<textElement ID="S" KEY="CB_DUMP" ENTRY=" Dump for uncaught exceptions" LENGTH="36 "/>
|
|
<textElement ID="S" KEY="CB_ERRL" ENTRY=" Show position of exception" LENGTH="34 "/>
|
|
<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.
|
|
|
|
TYPE-POOLS: vrm.
|
|
|
|
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</source>
|
|
</PROG>
|