From e8ec7e89c5c64abf3a0f5c6d31e51c3779d9429a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schm=C3=B6cker?= Date: Mon, 13 Jul 2015 22:54:06 +0200 Subject: [PATCH] Fixed issue #231: Reader does not read drawings correctly Basically only the size was miscalulated. Added new method to Drawing class to convert from emu to pixel and use this on reading a drawing. Probable still not working when using different dpi then standard - but I have to see this before I can tackle it. --- ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk | 100 ++++++++++++++++++ ZA2X/CLAS/ZCL_EXCEL.slnk | 6 +- ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk | 36 +++++-- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 120 ++++++++++++---------- 4 files changed, 193 insertions(+), 69 deletions(-) create mode 100644 ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk diff --git a/ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk b/ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk new file mode 100644 index 0000000..2038e10 --- /dev/null +++ b/ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk @@ -0,0 +1,100 @@ + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + METHOD add. + + DATA: ls_autofilter LIKE LINE OF me->mt_autofilters. + + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + READ TABLE me->mt_autofilters ASSIGNING <ls_autofilter> WITH TABLE KEY worksheet = io_sheet. + IF sy-subrc = 0. + RAISE EXCEPTION TYPE zcx_excel. " adding another autofilter to sheet is not allowed + ENDIF. + + CREATE OBJECT ro_autofilter + EXPORTING + io_sheet = io_sheet. + + ls_autofilter-worksheet = io_sheet. + ls_autofilter-autofilter = ro_autofilter. + INSERT ls_autofilter INTO TABLE me->mt_autofilters. + + +ENDMETHOD. + + + METHOD clear. + + CLEAR me->mt_autofilters. + +ENDMETHOD. + + + + + + METHOD get. + + DATA: ls_autofilter LIKE LINE OF me->mt_autofilters. + + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + READ TABLE me->mt_autofilters ASSIGNING <ls_autofilter> WITH TABLE KEY worksheet = io_worksheet. + IF sy-subrc = 0. + ro_autofilter = <ls_autofilter>-autofilter. + ELSE. + CLEAR ro_autofilter. + ENDIF. + +ENDMETHOD. + + + + METHOD is_empty. + IF me->mt_autofilters IS INITIAL. + r_empty = abap_true. + ENDIF. +ENDMETHOD. + + + + METHOD remove. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet. + + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + DELETE TABLE me->mt_autofilters WITH TABLE KEY worksheet = lo_worksheet. + +ENDMETHOD. + + + + METHOD size. + DESCRIBE TABLE me->mt_autofilters LINES r_size. +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL.slnk b/ZA2X/CLAS/ZCL_EXCEL.slnk index ced9521..db60250 100644 --- a/ZA2X/CLAS/ZCL_EXCEL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL.slnk @@ -181,7 +181,7 @@ ENDMETHOD. - + method ADD_NEW_DRAWING. DATA: lv_guid TYPE guid_16. @@ -443,10 +443,10 @@ ENDMETHOD. IF sy-subrc <> 0. style-complete_style = ip_cstyle_complete. style-complete_stylex = ip_cstylex_complete. -* CALL FUNCTION 'GUID_CREATE' +* CALL FUNCTION 'GUID_CREATE' " del issue #379 - function is outdated in newer releases * IMPORTING * ev_guid_16 = style-guid. - style-guid = zcl_excel_obsolete_func_wrap=>guid_create( ). + style-guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call INSERT style INTO TABLE me->t_stylemapping1. INSERT style INTO TABLE me->t_stylemapping2. diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk index 8e292bf..4922614 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk @@ -44,7 +44,7 @@ - + METHOD constructor. * CALL FUNCTION 'GUID_CREATE' " del issue #379 - function is outdated in newer releases @@ -78,6 +78,22 @@ ENDMETHOD. CONDENSE media_name NO-GAPS. endmethod. + + + + + METHOD emu2pixel. +* suppose 96 DPI + IF ip_dpi IS SUPPLIED. +* r_emu = ip_pixel * 914400 / ip_dpi. + r_pixel = ip_emu * ip_dpi / 914400. + ELSE. +* suppose 96 DPI +* r_emu = ip_pixel * 914400 / 96. + r_pixel = ip_emu * 96 / 914400. + ENDIF. +ENDMETHOD. + method GET_FROM_COL. @@ -105,7 +121,7 @@ ENDMETHOD. CONDENSE r_height NO-GAPS. endmethod. - + method GET_INDEX. rp_index = me->index. @@ -193,7 +209,7 @@ ENDMETHOD. r_name = title. endmethod. - + method GET_POSITION. rp_position-anchor = anchor. @@ -214,7 +230,7 @@ ENDMETHOD. r_to_row = me->to_loc-row. endmethod. - + method GET_TYPE. rp_type = me->type. @@ -227,7 +243,7 @@ ENDMETHOD. CONDENSE r_width NO-GAPS. endmethod. - + method LOAD_CHART_ATTRIBUTES. DATA: node TYPE REF TO if_ixml_element. @@ -927,7 +943,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -946,7 +962,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -972,7 +988,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -996,7 +1012,7 @@ ENDMETHOD. size-height = ip_height. endmethod. - + @@ -1013,7 +1029,7 @@ ENDMETHOD. anchor = anchor_one_cell. endmethod. - + diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 43568bd..ee55120 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -736,52 +736,52 @@ ENDMETHOD. - method LOAD_DRAWING_ANCHOR. + METHOD load_drawing_anchor. TYPES: BEGIN OF t_c_nv_pr, - name TYPE string, - id TYPE string, - END OF t_c_nv_pr. + name TYPE string, + id TYPE string, + END OF t_c_nv_pr. TYPES: BEGIN OF t_blip, - cstate TYPE string, - embed TYPE string, - END OF t_blip. + cstate TYPE string, + embed TYPE string, + END OF t_blip. TYPES: BEGIN OF t_chart, - id TYPE string, - END OF t_chart. + id TYPE string, + END OF t_chart. TYPES: BEGIN OF t_ext, - cx TYPE string, - cy TYPE string, - END OF t_ext. + cx TYPE string, + cy TYPE string, + END OF t_ext. - CONSTANTS: lc_xml_attr_true TYPE string VALUE 'true', - lc_xml_attr_true_int TYPE string VALUE '1'. - CONSTANTS: lc_rel_chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', - lc_rel_image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'. + CONSTANTS: lc_xml_attr_true TYPE string VALUE 'true', + lc_xml_attr_true_int TYPE string VALUE '1'. + CONSTANTS: lc_rel_chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', + lc_rel_image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'. - DATA: lo_drawing TYPE REF TO zcl_excel_drawing, - node TYPE REF TO if_ixml_element, - node2 TYPE REF TO if_ixml_element, - node3 TYPE REF TO if_ixml_element, - node4 TYPE REF TO if_ixml_element, + DATA: lo_drawing TYPE REF TO zcl_excel_drawing, + node TYPE REF TO if_ixml_element, + node2 TYPE REF TO if_ixml_element, + node3 TYPE REF TO if_ixml_element, + node4 TYPE REF TO if_ixml_element, - ls_upper TYPE zexcel_drawing_location, - ls_lower TYPE zexcel_drawing_location, - ls_size TYPE zexcel_drawing_size, - ext TYPE t_ext, - lv_content TYPE xstring, - lv_relation_id TYPE string, - lv_title TYPE zexcel_sheet_title, + ls_upper TYPE zexcel_drawing_location, + ls_lower TYPE zexcel_drawing_location, + ls_size TYPE zexcel_drawing_size, + ext TYPE t_ext, + lv_content TYPE xstring, + lv_relation_id TYPE string, + lv_title TYPE string, - cnvpr TYPE t_c_nv_pr, - blip TYPE t_blip, - chart TYPE t_chart, - drawing_type TYPE zexcel_drawing_type, + cnvpr TYPE t_c_nv_pr, + blip TYPE t_blip, + chart TYPE t_chart, + drawing_type TYPE zexcel_drawing_type, - rel_drawing TYPE t_rel_drawing. + rel_drawing TYPE t_rel_drawing. node ?= io_anchor_element->find_from_name( name = 'from' namespace = 'xdr' ). CHECK node IS NOT INITIAL. @@ -801,6 +801,14 @@ ENDMETHOD. me->fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = ext ). ls_size-width = ext-cx. ls_size-height = ext-cy. + TRY. + ls_size-width = zcl_excel_drawing=>emu2pixel( ls_size-width ). + CATCH cx_root. + ENDTRY. + TRY. + ls_size-height = zcl_excel_drawing=>emu2pixel( ls_size-height ). + CATCH cx_root. + ENDTRY. ENDIF. node ?= io_anchor_element->find_from_name( name = 'to' namespace = 'xdr' ). @@ -877,12 +885,12 @@ ENDMETHOD. ip_width = ls_size-width ip_height = ls_size-height ). - if drawing_type = zcl_excel_drawing=>type_chart. + IF drawing_type = zcl_excel_drawing=>type_chart. "-------------Added by Alessandro Iannacci - Should load chart attributes lo_drawing->load_chart_attributes( rel_drawing-content_xml ). - endif. + ENDIF. - endmethod. +ENDMETHOD.