diff --git a/src/not_cloud/zcl_excel_converter_alv.clas.abap b/src/not_cloud/zcl_excel_converter_alv.clas.abap index c44a423..8fcff18 100644 --- a/src/not_cloud/zcl_excel_converter_alv.clas.abap +++ b/src/not_cloud/zcl_excel_converter_alv.clas.abap @@ -387,99 +387,126 @@ CLASS zcl_excel_converter_alv IMPLEMENTATION. METHOD get_filter. - DATA: ls_filt TYPE lvc_s_filt, - l_line TYPE i, - ls_filter TYPE zexcel_s_converter_fil. - DATA: lo_addit TYPE REF TO cl_abap_elemdescr, + TYPES: BEGIN OF ts_field_range, + fieldname TYPE lvc_fname, + range_tab TYPE REF TO data, + END OF ts_field_range. + + DATA: ls_filt TYPE lvc_s_filt, + ls_filter TYPE zexcel_s_converter_fil, + lo_addit TYPE REF TO cl_abap_elemdescr, lt_components_tab TYPE cl_abap_structdescr=>component_table, ls_components TYPE abap_componentdescr, lo_table TYPE REF TO cl_abap_tabledescr, lo_struc TYPE REF TO cl_abap_structdescr, - lo_trange TYPE REF TO data, - lo_srange TYPE REF TO data, - lo_ltabdata TYPE REF TO data. + lt_field_range TYPE TABLE OF ts_field_range, + ls_field_range LIKE LINE OF lt_field_range, + lv_fieldname TYPE lvc_fname. FIELD-SYMBOLS: TYPE STANDARD TABLE, - TYPE STANDARD TABLE, TYPE any, TYPE any, - TYPE any, TYPE any, - TYPE STANDARD TABLE. + TYPE STANDARD TABLE, + LIKE LINE OF lt_field_range. - IF ws_option-filter = abap_false. - CLEAR et_filter. + CLEAR et_filter. + IF wt_filt IS INITIAL OR + ws_option-filter = abap_false. RETURN. ENDIF. ASSIGN xo_table->* TO . + READ TABLE ASSIGNING INDEX 1. + IF sy-subrc <> 0. + RETURN. + ENDIF. - CREATE DATA lo_ltabdata LIKE . - ASSIGN lo_ltabdata->* TO . + SORT wt_filt BY fieldname. +* Range creation and range comparison must be done in two steps: +* This is due to the fact, that range values might be applied +* all together at once not value after value for a specific fieldname +* --> Having multiple excluding values is a problem that would otherwise +* occur... + +* 1. Step: Create the combined ranges for each fieldname... LOOP AT wt_filt INTO ls_filt. - LOOP AT ASSIGNING . - l_line = sy-tabix. + IF ls_filt-fieldname <> lv_fieldname. + lv_fieldname = ls_filt-fieldname. + UNASSIGN . ASSIGN COMPONENT ls_filt-fieldname OF STRUCTURE TO . - IF sy-subrc = 0. - IF l_line = 1. - CLEAR lt_components_tab. - ls_components-name = 'SIGN'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-sign ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - ls_components-name = 'OPTION'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-option ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - ls_components-name = 'LOW'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - ls_components-name = 'HIGH'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - "create new line type - TRY. - lo_struc = cl_abap_structdescr=>create( p_components = lt_components_tab - p_strict = abap_false ). - CATCH cx_sy_struct_creation. - CONTINUE. - ENDTRY. - lo_table = cl_abap_tabledescr=>create( lo_struc ). + CHECK sy-subrc = 0. - CREATE DATA lo_trange TYPE HANDLE lo_table. - CREATE DATA lo_srange TYPE HANDLE lo_struc. + IF lt_components_tab IS INITIAL. + ls_components-name = 'SIGN'. + lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-sign ). + ls_components-type = lo_addit. + APPEND ls_components TO lt_components_tab. + ls_components-name = 'OPTION'. + lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-option ). + ls_components-type = lo_addit. + APPEND ls_components TO lt_components_tab. + ELSE. + DELETE lt_components_tab FROM 3. + ENDIF. - ASSIGN lo_trange->* TO . - ASSIGN lo_srange->* TO . - ENDIF. - CLEAR . - ASSIGN COMPONENT 'SIGN' OF STRUCTURE TO . - = ls_filt-sign. - ASSIGN COMPONENT 'OPTION' OF STRUCTURE TO . - = ls_filt-option. - ASSIGN COMPONENT 'LOW' OF STRUCTURE TO . - = ls_filt-low. - ASSIGN COMPONENT 'HIGH' OF STRUCTURE TO . - = ls_filt-high. - INSERT INTO TABLE . - IF IN . - IF ws_option-filter = abap_true. - ls_filter-rownumber = l_line. - ls_filter-columnname = ls_filt-fieldname. - INSERT ls_filter INTO TABLE et_filter. - ELSE. - INSERT INTO TABLE . - ENDIF. + lo_addit ?= cl_abap_typedescr=>describe_by_data( ). + ls_components-type = lo_addit. + + ls_components-name = 'LOW'. + APPEND ls_components TO lt_components_tab. + ls_components-name = 'HIGH'. + APPEND ls_components TO lt_components_tab. + "create new line type + TRY. + lo_struc = cl_abap_structdescr=>create( p_components = lt_components_tab + p_strict = abap_false ). + CATCH cx_sy_struct_creation. + CONTINUE. + ENDTRY. + lo_table = cl_abap_tabledescr=>create( lo_struc ). + + ls_field_range-fieldname = ls_filt-fieldname. + CREATE DATA ls_field_range-range_tab TYPE HANDLE lo_table. + APPEND ls_field_range TO lt_field_range. + + ASSIGN ls_field_range-range_tab->* TO . + ELSE. + CHECK IS ASSIGNED. + ENDIF. + + APPEND INITIAL LINE TO ASSIGNING . + ASSIGN COMPONENT 'SIGN' OF STRUCTURE TO . + = ls_filt-sign. + ASSIGN COMPONENT 'OPTION' OF STRUCTURE TO . + = ls_filt-option. + ASSIGN COMPONENT 'LOW' OF STRUCTURE TO . + = ls_filt-low. + ASSIGN COMPONENT 'HIGH' OF STRUCTURE TO . + = ls_filt-high. + ENDLOOP. + + IF lt_field_range IS INITIAL. + RETURN. + ENDIF. + +* 2. Step: Now apply the fieldname ranges afterwards... + LOOP AT ASSIGNING . + ls_filter-rownumber = sy-tabix. + LOOP AT lt_field_range ASSIGNING . + ASSIGN COMPONENT -fieldname OF STRUCTURE TO . + ASSIGN -range_tab->* TO . + IF IN . + IF ws_option-filter = abap_true. + ls_filter-columnname = -fieldname. + INSERT ls_filter INTO TABLE et_filter. ENDIF. + ELSEIF ws_option-filter = abap_undefined. + DELETE . + EXIT. "--> next xo_table line ENDIF. ENDLOOP. - IF ws_option-filter = abap_undefined. - = . - CLEAR . - ENDIF. ENDLOOP. ENDMETHOD. diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index 6b9434e..b01dd95 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -4212,10 +4212,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. DATA: col_count TYPE int4, lo_autofilters TYPE REF TO zcl_excel_autofilters, lo_autofilter TYPE REF TO zcl_excel_autofilter, - l_autofilter_hidden TYPE flag, lt_values TYPE zexcel_t_autofilter_values, ls_values TYPE zexcel_s_autofilter_values, ls_area TYPE zexcel_s_autofilter_area, + lt_filter_cols TYPE SORTED TABLE OF zexcel_cell_column WITH UNIQUE KEY table_line, + lt_cols2match LIKE lt_filter_cols, lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_table TYPE REF TO zcl_excel_table, @@ -4263,7 +4264,9 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. IF lo_autofilter IS BOUND. lt_values = lo_autofilter->get_values( ) . ls_area = lo_autofilter->get_filter_area( ) . - l_autofilter_hidden = abap_true. " First defautl is not showing + LOOP AT lt_values INTO ls_values. + INSERT ls_values-column INTO TABLE lt_filter_cols. + ENDLOOP. ENDIF. *--------------------------------------------------------------------* *issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - start @@ -4324,16 +4327,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. INSERT ls_sheet_content_empty INTO TABLE io_worksheet->sheet_content. ENDIF. - CLEAR ls_sheet_content. + CLEAR: ls_sheet_content, ls_sheet_content_empty. LOOP AT io_worksheet->sheet_content INTO ls_sheet_content. - IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much - CLEAR l_autofilter_hidden. - ELSE. - READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. - IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. - CLEAR l_autofilter_hidden. - ENDIF. - ENDIF. CLEAR ls_style_mapping. *Create row element *issues #346,#154, #195 - problems when we have information in row_dimension but no cell content in that row @@ -4364,18 +4359,10 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ENDIF. IF ls_last_row-cell_row NE -cell_row. - IF lo_autofilter IS BOUND. - IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header - ls_area-row_end < ls_last_row-cell_row . - CLEAR l_autofilter_hidden. - ENDIF. - ELSE. - CLEAR l_autofilter_hidden. - ENDIF. IF ls_last_row-cell_row IS NOT INITIAL. " Row visibility of previos row. IF lo_row->get_visible( io_worksheet ) = abap_false OR - l_autofilter_hidden = abap_true. + lt_cols2match IS NOT INITIAL. lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ). ENDIF. rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node @@ -4423,16 +4410,29 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_element_2->set_attribute_ns( name = 's' value = lv_value ). lo_element_2->set_attribute_ns( name = 'customFormat' value = '1' ). ENDIF. - IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much - CLEAR l_autofilter_hidden. - ELSE. - l_autofilter_hidden = abap_true. " First default is not showing + IF lo_autofilter IS BOUND. + IF ls_area-row_start < -cell_row AND "One less for header + ls_area-row_end >= -cell_row. + " First default is not showing + lt_cols2match = lt_filter_cols. + ELSE. + CLEAR lt_cols2match. + ENDIF. ENDIF. ELSE. ENDIF. + ls_last_row = . ENDWHILE. + READ TABLE lt_values TRANSPORTING NO FIELDS + WITH KEY column = -cell_column + value = -cell_value + BINARY SEARCH. + IF sy-subrc = 0. + DELETE TABLE lt_cols2match WITH TABLE KEY table_line = -cell_column. + ENDIF. + lo_element_3 = io_document->create_simple_element( name = lc_xml_node_c parent = io_document ). @@ -4537,24 +4537,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ENDIF. lo_element_2->append_child( new_child = lo_element_3 ). " column node - ls_last_row = . ENDLOOP. IF sy-subrc = 0. - READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. - IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. - CLEAR l_autofilter_hidden. - ENDIF. - IF lo_autofilter IS BOUND. - IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header - ls_area-row_end < ls_last_row-cell_row . - CLEAR l_autofilter_hidden. - ENDIF. - ELSE. - CLEAR l_autofilter_hidden. - ENDIF. " Row visibility of previos row. IF lo_row->get_visible( ) = abap_false OR - l_autofilter_hidden = abap_true. + lt_cols2match IS NOT INITIAL. lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ). ENDIF. rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node