diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 70a717e..83b5c69 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -106,8 +106,8 @@ - - + + method ZIF_EXCEL_READER~CAN_READ_FILE. @@ -120,7 +120,7 @@ *--------------------------------------------------------------------* * For now always Unknown r_readable = abap_undefined. -endmethod. + endmethod. method ZIF_EXCEL_READER~LOAD. @@ -186,7 +186,7 @@ endmethod. *--------------------------------------------------------------------* * issue#234 - error reading xlsx written by libre office - me->zif_excel_reader~gv_use_alternate_zip = iv_use_alternate_zip. + me->zif_excel_reader~gv_use_alternate_zip = i_use_alternate_zip. *--------------------------------------------------------------------* @@ -223,10 +223,10 @@ endmethod. ENDWHILE. -endmethod. + endmethod. - method ZIF_EXCEL_READER~LOAD_FILE. + METHOD zif_excel_reader~load_file. *--------------------------------------------------------------------* * ToDos: * 2do§1 decision whether to load from frontend or backend @@ -255,126 +255,24 @@ endmethod. * changes: passing new optional input parameter to private attribute *--------------------------------------------------------------------* - CONSTANTS: lcv_load_from_frontend TYPE char1 VALUE 'F', - lcv_load_from_backend TYPE char1 VALUE 'B'. + DATA: lv_excel_data TYPE xstring. - DATA: lv_load_from_source TYPE char1, +* issue#234 - error reading xlsx written by libre office + me->zif_excel_reader~gv_use_alternate_zip = i_use_alternate_zip. - lv_filelength TYPE i, - lt_binary_data TYPE STANDARD TABLE OF x255 WITH NON-UNIQUE DEFAULT KEY, - ls_binary_data LIKE LINE OF lt_binary_data, -* Background processing - lv_max_length_line TYPE i, - lv_actual_length_line TYPE i, - - lv_errormessage TYPE string, " Can't pass '...'(abc) to exception-class - lv_excel_data TYPE xstring. " Binary content of .xlsx file - - -*--------------------------------------------------------------------* -* ToDos: 2do§1 Decision whether to load from frontend or backend -*--------------------------------------------------------------------* + IF i_from_applserver = abap_true. + lv_excel_data = me->read_from_applserver( i_filename = i_filename ). + ELSE. + lv_excel_data = me->read_from_local_file( i_filename = i_filename ). + ENDIF. *--------------------------------------------------------------------* * issue#234 - error reading xlsx written by libre office - me->zif_excel_reader~gv_use_alternate_zip = iv_use_alternate_zip. + r_excel = me->zif_excel_reader~load( i_excel2007 = lv_excel_data + i_use_alternate_zip = i_use_alternate_zip ). *--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* Autodecide on frontend or backend reading -* Background-processing --> backend reading -* Online-processing --> frontend reading -*--------------------------------------------------------------------* - IF sy-batch = abap_true. - lv_load_from_source = lcv_load_from_backend. - ELSE. - lv_load_from_source = lcv_load_from_frontend. - ENDIF. - - CASE lv_load_from_source. - -*--------------------------------------------------------------------* -* Read from backend -*--------------------------------------------------------------------* - WHEN lcv_load_from_backend. - DESCRIBE FIELD ls_binary_data LENGTH lv_max_length_line IN BYTE MODE. - OPEN DATASET i_filename FOR INPUT IN BINARY MODE. - IF sy-subrc <> 0. - lv_errormessage = 'A problem occured when reading the file'(001). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - WHILE sy-subrc = 0. - - READ DATASET i_filename INTO ls_binary_data MAXIMUM LENGTH lv_max_length_line ACTUAL LENGTH lv_actual_length_line. - APPEND ls_binary_data TO lt_binary_data. - lv_filelength = lv_filelength + lv_actual_length_line. - - ENDWHILE. - CLOSE DATASET i_filename. - -*--------------------------------------------------------------------* -* Read from frontend -*--------------------------------------------------------------------* - WHEN lcv_load_from_frontend. - cl_gui_frontend_services=>gui_upload( EXPORTING - filename = i_filename - filetype = 'BIN' " We are basically working with zipped directories --> force binary read - IMPORTING - filelength = lv_filelength - CHANGING - data_tab = lt_binary_data - EXCEPTIONS - file_open_error = 1 - file_read_error = 2 - no_batch = 3 - gui_refuse_filetransfer = 4 - invalid_type = 5 - no_authority = 6 - unknown_error = 7 - bad_data_format = 8 - header_not_allowed = 9 - separator_not_allowed = 10 - header_too_long = 11 - unknown_dp_error = 12 - access_denied = 13 - dp_out_of_memory = 14 - disk_full = 15 - dp_timeout = 16 - not_supported_by_gui = 17 - error_no_gui = 18 - OTHERS = 19 ). - IF sy-subrc <> 0. - lv_errormessage = 'A problem occured when reading the file'(001). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - ENDCASE. - - -*--------------------------------------------------------------------* -* Binary data needs to be provided as XSTRING for further processing -*--------------------------------------------------------------------* - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_filelength - IMPORTING - buffer = lv_excel_data - TABLES - binary_tab = lt_binary_data. - -*--------------------------------------------------------------------* -* issue#234 - error reading xlsx written by libre office - r_excel = me->zif_excel_reader~load( i_excel2007 = lv_excel_data - iv_use_alternate_zip = iv_use_alternate_zip ). -*--------------------------------------------------------------------* - - -endmethod. + ENDMETHOD. @@ -425,7 +323,7 @@ endmethod. ENDWHILE. -endmethod. + endmethod. @@ -551,7 +449,7 @@ endmethod. * issue#234 - end of insertion *--------------------------------------------------------------------* -endmethod. + endmethod. @@ -597,7 +495,7 @@ endmethod. lo_parser->set_validating( mode = if_ixml_parser=>co_no_validation ). lo_parser->parse( ). -endmethod. + endmethod. @@ -749,7 +647,7 @@ endmethod. lo_drawing->load_chart_attributes( rel_drawing-content_xml ). endif. -endmethod. + endmethod. @@ -868,7 +766,7 @@ endmethod. lo_node_si ?= lo_node_si->get_next( ). ENDWHILE. -endmethod. + endmethod. @@ -1107,7 +1005,7 @@ endmethod. ENDWHILE. ENDIF. -endmethod. + endmethod. @@ -1237,7 +1135,7 @@ endmethod. ENDWHILE. -endmethod. + endmethod. @@ -1355,7 +1253,7 @@ endmethod. ENDWHILE. -endmethod. + endmethod. @@ -1481,7 +1379,7 @@ endmethod. ENDWHILE. -endmethod. + endmethod. @@ -1594,13 +1492,13 @@ endmethod. * 2do§1 Is 49 really the last predefined format? -endmethod. + endmethod. - METHOD load_workbook. + method LOAD_WORKBOOK. *--------------------------------------------------------------------* * ToDos: * 2do§1 Move macro-reading from zcl_excel_reader_xlsm to this class @@ -2013,13 +1911,13 @@ endmethod. ENDWHILE. -ENDMETHOD. + endmethod. - METHOD load_worksheet. + method LOAD_WORKSHEET. *--------------------------------------------------------------------* * ToDos: * 2do§1 Header/footer @@ -2134,6 +2032,7 @@ ENDMETHOD. END OF lty_datavalidation. + CONSTANTS: lc_xml_attr_true TYPE string VALUE 'true', lc_xml_attr_true_int TYPE string VALUE '1', lc_rel_drawing TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', @@ -2227,7 +2126,6 @@ ENDMETHOD. lv_datavalidation_range TYPE string, lt_datavalidation_range TYPE TABLE OF string. - *--------------------------------------------------------------------* * §2 We need to read the the file "\\_rels\.rels" because it tells * us where in this folder structure the data for the workbook @@ -2666,7 +2564,6 @@ ENDMETHOD. " End fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 " Start fix 276 Read data validations - "Add merge cell information lo_ixml_datavalidations = lo_ixml_worksheet->get_elements_by_tag_name( name = 'dataValidation' ). lo_ixml_iterator = lo_ixml_datavalidations->create_iterator( ). lo_ixml_datavalidation_elem ?= lo_ixml_iterator->get_next( ). @@ -2717,7 +2614,7 @@ ENDMETHOD. ENDWHILE. " End fix 276 Read data validations -ENDMETHOD. + endmethod. @@ -2787,11 +2684,6 @@ ENDMETHOD. path2 = path. zcl_excel_common=>split_file( EXPORTING ip_file = path2 IMPORTING ep_extension = file_ext2 ). -* CALL FUNCTION 'CV120_SPLIT_FILE' -* EXPORTING -* pf_file = path2 -* IMPORTING -* pfx_extension = file_ext2. rel_drawing-file_ext = file_ext2. "-------------Added by Alessandro Iannacci - Should load graph xml @@ -2841,7 +2733,110 @@ ENDMETHOD. ENDDO. -endmethod. + endmethod. + + + + + METHOD read_from_applserver. + + DATA: lv_filelength TYPE i, + lt_binary_data TYPE STANDARD TABLE OF x255 WITH NON-UNIQUE DEFAULT KEY, + ls_binary_data LIKE LINE OF lt_binary_data, + lv_filename TYPE string, + lv_max_length_line TYPE i, + lv_actual_length_line TYPE i, + lv_errormessage TYPE string. + + MOVE i_filename TO lv_filename. + + DESCRIBE FIELD ls_binary_data LENGTH lv_max_length_line IN BYTE MODE. + OPEN DATASET lv_filename FOR INPUT IN BINARY MODE. + IF sy-subrc <> 0. + lv_errormessage = 'A problem occured when reading the file'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + WHILE sy-subrc = 0. + + READ DATASET lv_filename INTO ls_binary_data MAXIMUM LENGTH lv_max_length_line ACTUAL LENGTH lv_actual_length_line. + APPEND ls_binary_data TO lt_binary_data. + lv_filelength = lv_filelength + lv_actual_length_line. + + ENDWHILE. + CLOSE DATASET lv_filename. + +*--------------------------------------------------------------------* +* Binary data needs to be provided as XSTRING for further processing +*--------------------------------------------------------------------* + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filelength + IMPORTING + buffer = r_excel_data + TABLES + binary_tab = lt_binary_data. + ENDMETHOD. + + + + + METHOD read_from_local_file. + DATA: lv_filelength TYPE i, + lt_binary_data TYPE STANDARD TABLE OF x255 WITH NON-UNIQUE DEFAULT KEY, + ls_binary_data LIKE LINE OF lt_binary_data, + lv_filename TYPE string, + lv_errormessage TYPE string. + + MOVE i_filename TO lv_filename. + + cl_gui_frontend_services=>gui_upload( EXPORTING + filename = lv_filename + filetype = 'BIN' " We are basically working with zipped directories --> force binary read + IMPORTING + filelength = lv_filelength + CHANGING + data_tab = lt_binary_data + EXCEPTIONS + file_open_error = 1 + file_read_error = 2 + no_batch = 3 + gui_refuse_filetransfer = 4 + invalid_type = 5 + no_authority = 6 + unknown_error = 7 + bad_data_format = 8 + header_not_allowed = 9 + separator_not_allowed = 10 + header_too_long = 11 + unknown_dp_error = 12 + access_denied = 13 + dp_out_of_memory = 14 + disk_full = 15 + dp_timeout = 16 + not_supported_by_gui = 17 + error_no_gui = 18 + OTHERS = 19 ). + IF sy-subrc <> 0. + lv_errormessage = 'A problem occured when reading the file'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + +*--------------------------------------------------------------------* +* Binary data needs to be provided as XSTRING for further processing +*--------------------------------------------------------------------* + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filelength + IMPORTING + buffer = r_excel_data + TABLES + binary_tab = lt_binary_data. + + ENDMETHOD. @@ -2885,10 +2880,10 @@ endmethod. REPLACE REGEX '[^/]*/\.\./' IN rp_result WITH ``. -endmethod. + endmethod. - METHOD resolve_referenced_formulae. + method RESOLVE_REFERENCED_FORMULAE. TYPES: BEGIN OF ty_referenced_cells, sheet TYPE REF TO zcl_excel_worksheet, si TYPE i, @@ -2984,6 +2979,6 @@ endmethod. ENDLOOP. ENDLOOP. -ENDMETHOD. + endmethod.