Fix issue 1013 part1 (#1039)

* Replace pass by value with reference

#1013

* Possible sequential read on sorted/hashed table

#1014

* Update src/not_cloud/zcl_excel_converter.clas.locals_def.abap

Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>

* remove comments and old coding

* fix UT errors

* remove more comments and old coding

* Improvements / Fix aesthetic regression on XML

---------

Co-authored-by: Lars Hvam <larshp@hotmail.com>
Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>
Co-authored-by: Domi Bigl <dominik.bigl@cadaxo.com>
Co-authored-by: Abo <andrea@borgia.bo.it>
Co-authored-by: sandraros <sandra.rossi@gmail.com>
This commit is contained in:
pksingh78 2025-03-08 23:53:02 +05:30 committed by GitHub
parent ca6fda29ed
commit 9fde3924bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 115 additions and 94 deletions

View File

@ -524,8 +524,7 @@ CLASS zcl_excel_converter IMPLEMENTATION.
METHOD create_color_style.
DATA: ls_styles TYPE ts_styles.
DATA: lo_style TYPE REF TO zcl_excel_style.
READ TABLE wt_styles INTO ls_styles WITH KEY guid = i_style.
READ TABLE wt_styles INTO ls_styles WITH KEY guid COMPONENTS guid = i_style.
IF sy-subrc = 0.
lo_style = wo_excel->add_new_style( ).
lo_style->font->bold = ls_styles-style->font->bold.
@ -1370,7 +1369,7 @@ CLASS zcl_excel_converter IMPLEMENTATION.
IF l_line <= 1.
CLEAR l_hidden.
ELSE.
LOOP AT wt_sort_values INTO ls_sort_values WHERE is_collapsed = abap_false.
LOOP AT wt_sort_values INTO ls_sort_values USING KEY collapsed WHERE is_collapsed = abap_false.
IF l_hidden < ls_sort_values-sort_level.
l_hidden = ls_sort_values-sort_level.
ENDIF.
@ -1418,7 +1417,7 @@ CLASS zcl_excel_converter IMPLEMENTATION.
<fs_sortval> = <fs_fldval>.
<fs_sortv>-new = abap_false.
l_line = <fs_sortv>-sort_level.
LOOP AT wt_sort_values ASSIGNING <fs_sortv> WHERE sort_level >= l_line.
LOOP AT wt_sort_values ASSIGNING <fs_sortv> WHERE sort_level >= l_line. "#EC CI_HASHSEQ
<fs_sortv>-row_int = l_row_int.
ENDLOOP.
ENDIF.

View File

@ -4,46 +4,48 @@
TYPES ty_style_type TYPE c LENGTH 1.
TYPES: BEGIN OF ts_alv_types,
seoclass TYPE seoclsname,
clsname TYPE seoclsname,
END OF ts_alv_types,
tt_alv_types TYPE HASHED TABLE OF ts_alv_types WITH UNIQUE KEY seoclass.
TYPES: BEGIN OF ts_alv_types,
seoclass TYPE seoclsname,
clsname TYPE seoclsname,
END OF ts_alv_types,
tt_alv_types TYPE HASHED TABLE OF ts_alv_types WITH UNIQUE KEY seoclass.
TYPES: BEGIN OF ts_sort_values,
fieldname TYPE fieldname,
row_int TYPE zexcel_cell_row,
value TYPE REF TO data,
new TYPE flag,
sort_level TYPE int4,
is_collapsed TYPE flag,
END OF ts_sort_values,
TYPES: BEGIN OF ts_sort_values,
fieldname TYPE fieldname,
row_int TYPE zexcel_cell_row,
value TYPE REF TO data,
new TYPE flag,
sort_level TYPE int4,
is_collapsed TYPE flag,
END OF ts_sort_values,
tt_sort_values TYPE HASHED TABLE OF ts_sort_values WITH UNIQUE KEY fieldname.
TYPES: BEGIN OF ts_subtotal_rows,
row_int TYPE zexcel_cell_row,
row_int_start TYPE zexcel_cell_row,
columnname TYPE fieldname,
END OF ts_subtotal_rows,
tt_sort_values TYPE HASHED TABLE OF ts_sort_values WITH UNIQUE KEY primary_key COMPONENTS fieldname
WITH NON-UNIQUE SORTED KEY collapsed COMPONENTS is_collapsed fieldname
##TABKEY[PRIMARY_KEY][COLLAPSED].
TYPES: BEGIN OF ts_subtotal_rows,
row_int TYPE zexcel_cell_row,
row_int_start TYPE zexcel_cell_row,
columnname TYPE fieldname,
END OF ts_subtotal_rows,
tt_subtotal_rows TYPE HASHED TABLE OF ts_subtotal_rows WITH UNIQUE KEY row_int.
tt_subtotal_rows TYPE HASHED TABLE OF ts_subtotal_rows WITH UNIQUE KEY row_int.
TYPES: BEGIN OF ts_styles,
type TYPE ty_style_type,
alignment TYPE zexcel_alignment,
inttype TYPE abap_typekind,
decimals TYPE int1,
style TYPE REF TO zcl_excel_style,
guid TYPE zexcel_cell_style,
END OF ts_styles,
TYPES: BEGIN OF ts_styles,
type TYPE ty_style_type,
alignment TYPE zexcel_alignment,
inttype TYPE abap_typekind,
decimals TYPE int1,
style TYPE REF TO zcl_excel_style,
guid TYPE zexcel_cell_style,
END OF ts_styles,
tt_styles TYPE HASHED TABLE OF ts_styles WITH UNIQUE KEY primary_key COMPONENTS type alignment inttype decimals
WITH NON-UNIQUE SORTED KEY guid COMPONENTS guid .
tt_styles TYPE HASHED TABLE OF ts_styles WITH UNIQUE KEY type alignment inttype decimals.
TYPES: BEGIN OF ts_color_styles,
guid_old TYPE zexcel_cell_style,
fontcolor TYPE zexcel_style_color_argb,
fillcolor TYPE zexcel_style_color_argb,
style_new TYPE REF TO zcl_excel_style,
END OF ts_color_styles,
TYPES: BEGIN OF ts_color_styles,
guid_old TYPE zexcel_cell_style,
fontcolor TYPE zexcel_style_color_argb,
fillcolor TYPE zexcel_style_color_argb,
style_new TYPE REF TO zcl_excel_style,
END OF ts_color_styles,
tt_color_styles TYPE HASHED TABLE OF ts_color_styles WITH UNIQUE KEY guid_old fontcolor fillcolor.
tt_color_styles TYPE HASHED TABLE OF ts_color_styles WITH UNIQUE KEY guid_old fontcolor fillcolor.

View File

@ -269,7 +269,7 @@ CLASS zcl_excel IMPLEMENTATION.
<style2> LIKE LINE OF t_stylemapping2.
DATA: style TYPE REF TO zcl_excel_style.
LOOP AT me->t_stylemapping1 ASSIGNING <style1> WHERE added_to_iterator IS INITIAL.
LOOP AT me->t_stylemapping1 ASSIGNING <style1> USING KEY added_to_iterator WHERE added_to_iterator IS INITIAL.
READ TABLE me->t_stylemapping2 ASSIGNING <style2> WITH TABLE KEY guid = <style1>-guid.
CHECK sy-subrc = 0. " Should always be true since these tables are being filled parallel

View File

@ -18,8 +18,8 @@ CLASS zcl_excel_autofilter DEFINITION
logical_operator TYPE tv_logical_operator,
tr_textfilter2 TYPE RANGE OF string,
END OF ts_filter .
TYPES:
tt_filters TYPE SORTED TABLE OF ts_filter WITH UNIQUE KEY column .
TYPES: tt_filters TYPE SORTED TABLE OF ts_filter WITH UNIQUE KEY column
WITH NON-UNIQUE SORTED KEY rule COMPONENTS rule.
DATA filter_area TYPE zexcel_s_autofilter_area .
CONSTANTS mc_filter_rule_single_values TYPE tv_filter_rule VALUE 'single_values'. "#EC NOTEXT
@ -192,7 +192,7 @@ CLASS zcl_excel_autofilter IMPLEMENTATION.
DATA: ls_filter LIKE LINE OF rt_filter.
LOOP AT me->mt_filters ASSIGNING <ls_filter> WHERE rule = mc_filter_rule_single_values.
LOOP AT me->mt_filters ASSIGNING <ls_filter> USING KEY rule WHERE rule = mc_filter_rule_single_values.
ls_filter-column = <ls_filter>-column.
LOOP AT <ls_filter>-t_values ASSIGNING <ls_value>.
@ -223,7 +223,7 @@ CLASS zcl_excel_autofilter IMPLEMENTATION.
LOOP AT mt_filters ASSIGNING <ls_filter> WHERE column >= me->filter_area-col_start
AND column <= me->filter_area-col_end.
AND column <= me->filter_area-col_end. "#EC CI_SORTSEQ
CASE <ls_filter>-rule.

View File

@ -192,7 +192,7 @@ CLASS zcl_excel_fill_template IMPLEMENTATION.
* update merged cells before range
LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from >= lv_start_row AND row_to <= lv_stop_row.
LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from >= lv_start_row AND row_to <= lv_stop_row. "#EC CI_SORTSEQ
ls_merged_cell-row_from = ls_merged_cell-row_from + cv_diff.
ls_merged_cell-row_to = ls_merged_cell-row_to + cv_diff.
@ -216,7 +216,7 @@ CLASS zcl_excel_fill_template IMPLEMENTATION.
APPEND ls_cell TO lt_tmp_cells_template.
ENDLOOP.
LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from >= <ls_range>-start AND row_to <= <ls_range>-stop.
LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from >= <ls_range>-start AND row_to <= <ls_range>-stop. "#EC CI_SORTSEQ
APPEND ls_merged_cell TO lt_tmp_merged_cells_template.
ENDLOOP.
@ -271,7 +271,7 @@ CLASS zcl_excel_fill_template IMPLEMENTATION.
ct_cells = lt_cells_result.
LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from > <ls_range>-stop.
LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from > <ls_range>-stop. "#EC CI_SORTSEQ
ls_merged_cell-row_from = ls_merged_cell-row_from + cv_diff.
ls_merged_cell-row_to = ls_merged_cell-row_to + cv_diff.

View File

@ -392,9 +392,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
DATA: lt_row_data TYPE ltt_row_data,
ls_row_data LIKE LINE OF lt_row_data,
lt_collapse_rows TYPE HASHED TABLE OF i WITH UNIQUE KEY table_line,
lv_collapsed TYPE abap_bool,
lv_outline_level TYPE i,
lv_next_consecutive_row TYPE i,
lt_outline_rows TYPE zcl_excel_worksheet=>mty_ts_outlines_row,
@ -428,7 +426,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lv_outline_level = sy-index.
CLEAR lv_next_consecutive_row.
CLEAR ls_outline_row.
LOOP AT lt_row_data ASSIGNING <ls_row_data> WHERE outline_level >= lv_outline_level.
LOOP AT lt_row_data ASSIGNING <ls_row_data> WHERE outline_level >= lv_outline_level. "#EC CI_SORTSEQ
IF lv_next_consecutive_row <> <ls_row_data>-row " A gap --> close all open outlines
AND lv_next_consecutive_row IS NOT INITIAL. " First time in loop.
@ -4232,7 +4230,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
*--------------------------------------------------------------------*
* Get referenced Cells, Build ranges for easy lookup
*--------------------------------------------------------------------*
LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref <> space.
LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref <> space. "#EC CI_HASHSEQ
CLEAR ls_referenced_cell.
ls_referenced_cell-sheet = ls_ref_formula-sheet.
@ -4268,7 +4266,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
* For each referencing cell determine the referenced cell
* and resolve the formula
*--------------------------------------------------------------------*
LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref = space.
LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref = space. "#EC CI_HASHSEQ
CLEAR lv_current_cell.

View File

@ -116,8 +116,9 @@ CLASS zcl_excel_row IMPLEMENTATION.
ELSE.
lv_previous_row = me->row_index - 1.
lt_row_outlines = io_worksheet->get_row_outlines( ).
READ TABLE lt_row_outlines TRANSPORTING NO FIELDS WITH KEY row_to = lv_previous_row " last line of an outline
collapsed = abap_true. " that is collapsed
READ TABLE lt_row_outlines TRANSPORTING NO FIELDS WITH KEY row_to COMPONENTS row_to = lv_previous_row " last line of an outline
collapsed = abap_true. " that is collapsed
ENDIF.
CHECK sy-subrc = 0. " ok - we found it
r_collapsed = abap_true.
@ -140,11 +141,10 @@ CLASS zcl_excel_row IMPLEMENTATION.
CHECK io_worksheet IS BOUND.
lt_row_outlines = io_worksheet->get_row_outlines( ).
LOOP AT lt_row_outlines ASSIGNING <ls_row_outline> WHERE row_from <= me->row_index
AND row_to >= me->row_index.
AND row_to >= me->row_index. "#EC CI_SORTSEQ
ADD 1 TO r_outline_level.
ENDLOOP.
ENDMETHOD.
@ -168,19 +168,18 @@ CLASS zcl_excel_row IMPLEMENTATION.
METHOD get_visible.
DATA: lt_row_outlines TYPE zcl_excel_worksheet=>mty_ts_outlines_row.
FIELD-SYMBOLS: <ls_row_outline> LIKE LINE OF lt_row_outlines.
r_visible = me->visible.
CHECK r_visible = abap_true. " Currently visible --> but maybe the new outline methodology will hide it implicitly
CHECK io_worksheet IS BOUND. " But we have to see the worksheet to make sure
lt_row_outlines = io_worksheet->get_row_outlines( ).
LOOP AT lt_row_outlines ASSIGNING <ls_row_outline> WHERE row_from <= me->row_index
AND row_to >= me->row_index
AND collapsed = abap_true. " row is in a collapsed outline --> not visible
CLEAR r_visible.
RETURN. " one hit is enough to ensure invisibility
LOOP AT lt_row_outlines TRANSPORTING NO FIELDS WHERE row_from <= me->row_index
AND row_to >= me->row_index
AND collapsed = abap_true. "#EC CI_SORTSEQ
CLEAR r_visible.
RETURN. " one hit is enough to ensure invisibility
ENDLOOP.
ENDMETHOD.

View File

@ -21,8 +21,8 @@ CLASS zcl_excel_worksheet DEFINITION
row_to TYPE i,
collapsed TYPE abap_bool,
END OF mty_s_outline_row .
TYPES:
mty_ts_outlines_row TYPE SORTED TABLE OF mty_s_outline_row WITH UNIQUE KEY row_from row_to .
TYPES: mty_ts_outlines_row TYPE SORTED TABLE OF mty_s_outline_row WITH UNIQUE KEY primary_key COMPONENTS row_from row_to
WITH NON-UNIQUE SORTED KEY row_to COMPONENTS row_to collapsed.
TYPES:
BEGIN OF mty_s_ignored_errors,
"! Cell reference (e.g. "A1") or list like "A1 A2" or range "A1:G1"
@ -2270,7 +2270,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDIF.
" Date & Time in excel style
LOOP AT me->sheet_content ASSIGNING <ls_sheet_content> WHERE cell_style IS NOT INITIAL AND data_type IS INITIAL.
LOOP AT me->sheet_content ASSIGNING <ls_sheet_content> WHERE cell_style IS NOT INITIAL AND data_type IS INITIAL. "#EC CI_SORTSEQ
ls_style_conv-cell_style = <ls_sheet_content>-cell_style.
APPEND ls_style_conv TO lt_style_conv.
ENDLOOP.
@ -2442,7 +2442,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS
WHERE row_from <= ip_cell_row AND row_to >= ip_cell_row
AND col_from <= lv_column AND col_to >= lv_column.
AND col_from <= lv_column AND col_to >= lv_column. "#EC CI_SORTSEQ
DELETE me->mt_merged_cells.
EXIT.
ENDLOOP.
@ -4320,7 +4320,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS WHERE NOT ( row_from > ls_merge-row_to
OR row_to < ls_merge-row_from
OR col_from > ls_merge-col_to
OR col_to < ls_merge-col_from ).
OR col_to < ls_merge-col_from ). "#EC CI_SORTSEQ
lv_errormessage = 'Overlapping merges'(404).
zcx_excel=>raise_text( lv_errormessage ).

View File

@ -3368,18 +3368,18 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
DATA:
ld_1 TYPE string,
ld_2 TYPE string,
ld_3 TYPE string,
ld_4 TYPE string,
ld_5 TYPE string,
ld_7 TYPE string,
ld_1 TYPE string,
ld_2 TYPE string,
ld_3 TYPE string,
ld_4 TYPE string,
ld_5 TYPE string,
ld_7 TYPE string,
ls_odd_header TYPE zexcel_s_worksheet_head_foot,
ls_odd_footer TYPE zexcel_s_worksheet_head_foot,
ls_even_header TYPE zexcel_s_worksheet_head_foot,
ls_even_footer TYPE zexcel_s_worksheet_head_foot,
lv_content TYPE string.
ls_odd_header TYPE zexcel_s_worksheet_head_foot,
ls_odd_footer TYPE zexcel_s_worksheet_head_foot,
ls_even_header TYPE zexcel_s_worksheet_head_foot,
ls_even_footer TYPE zexcel_s_worksheet_head_foot,
lv_content TYPE string.
* INIT_RESULT
@ -3737,13 +3737,13 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
METHOD create_xl_sheet.
** Constant node name
DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet',
DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet',
" Node namespace
lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006',
lc_xml_node_comp_pref TYPE string VALUE 'x14ac',
lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'.
lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006',
lc_xml_node_comp_pref TYPE string VALUE 'x14ac',
lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'.
DATA: lo_document TYPE REF TO if_ixml_document,
lo_element_root TYPE REF TO if_ixml_element,
@ -4039,9 +4039,9 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_table TYPE REF TO zcl_excel_table,
lo_link TYPE REF TO zcl_excel_hyperlink.
DATA: lv_value TYPE string,
lv_relation_id TYPE i,
lv_index_str TYPE string.
DATA: lv_value TYPE string,
lv_relation_id TYPE i,
lv_index_str TYPE string.
**********************************************************************
* STEP 1: Create [Content_Types].xml into the root of the ZIP
@ -4453,7 +4453,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
LOOP AT lt_table_areas TRANSPORTING NO FIELDS WHERE top <= <ls_sheet_content>-cell_row
AND bottom >= <ls_sheet_content>-cell_row
AND left <= <ls_sheet_content>-cell_column
AND right >= <ls_sheet_content>-cell_column.
AND right >= <ls_sheet_content>-cell_column. "#EC CI_SORTSEQ
EXIT.
ENDLOOP.
IF sy-subrc = 0.
@ -4550,8 +4550,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDIF.
rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node
ENDIF.
DELETE io_worksheet->sheet_content WHERE cell_value = lc_dummy_cell_content. " Get rid of dummyentries
DELETE io_worksheet->sheet_content WHERE cell_value = lc_dummy_cell_content. "#EC CI_SORTSEQ " Get rid of dummyentries
ENDMETHOD.

View File

@ -11,7 +11,7 @@
<ACCESSMODE>H</ACCESSMODE>
<KEYDEF>K</KEYDEF>
<KEYKIND>U</KEYKIND>
<KEYFDCOUNT>0003</KEYFDCOUNT>
<KEYFDCOUNT>0005</KEYFDCOUNT>
<DDTEXT>Stylemapping: Values -&gt; GUID</DDTEXT>
</DD40V>
<DD42V>
@ -21,12 +21,26 @@
<ROWTYPEPOS>0001</ROWTYPEPOS>
<KEYFIELD>DYNAMIC_STYLE_GUID</KEYFIELD>
</DD42V>
<DD42V>
<TYPENAME>ZEXCEL_T_STYLEMAPPING1</TYPENAME>
<SECKEYNAME>ADDED_TO_ITERATOR</SECKEYNAME>
<KEYFDPOS>0001</KEYFDPOS>
<ROWTYPEPOS>0193</ROWTYPEPOS>
<KEYFIELD>ADDED_TO_ITERATOR</KEYFIELD>
</DD42V>
<DD42V>
<TYPENAME>ZEXCEL_T_STYLEMAPPING1</TYPENAME>
<KEYFDPOS>0002</KEYFDPOS>
<ROWTYPEPOS>0097</ROWTYPEPOS>
<KEYFIELD>COMPLETE_STYLEX</KEYFIELD>
</DD42V>
<DD42V>
<TYPENAME>ZEXCEL_T_STYLEMAPPING1</TYPENAME>
<SECKEYNAME>ADDED_TO_ITERATOR</SECKEYNAME>
<KEYFDPOS>0002</KEYFDPOS>
<ROWTYPEPOS>0192</ROWTYPEPOS>
<KEYFIELD>GUID</KEYFIELD>
</DD42V>
<DD42V>
<TYPENAME>ZEXCEL_T_STYLEMAPPING1</TYPENAME>
<KEYFDPOS>0003</KEYFDPOS>
@ -34,6 +48,16 @@
<KEYFIELD>COMPLETE_STYLE</KEYFIELD>
</DD42V>
</DD42V>
<DD43V>
<DD43V>
<TYPENAME>ZEXCEL_T_STYLEMAPPING1</TYPENAME>
<SECKEYNAME>ADDED_TO_ITERATOR</SECKEYNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<ACCESSMODE>S</ACCESSMODE>
<KIND>K</KIND>
<KEYDESCRIPTION>added_to_iterator</KEYDESCRIPTION>
</DD43V>
</DD43V>
</asx:values>
</asx:abap>
</abapGit>