diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..63bce7d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,3 @@ +# Reporting Security Issues + +To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/abap2xlsx/abap2xlsx/security/advisories/new) tab. diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index d8cbd40..e4266e5 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -996,25 +996,31 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. *--------------------------------------------------------------------* CLEAR: lv_current_offset. WHILE lo_node_si_child IS BOUND. " actually these children of are -tags - CLEAR: ls_rtf. + lv_tag_name = lo_node_si_child->get_name( ). + IF lv_tag_name = 'r'. - " extracting rich text formating data - lo_node_r_child_rpr ?= lo_node_si_child->find_from_name_ns( name = 'rPr' uri = namespace-main ). - IF lo_node_r_child_rpr IS BOUND. - lo_font = load_style_font( lo_node_r_child_rpr ). - ls_rtf-font = lo_font->get_structure( ). - ENDIF. - ls_rtf-offset = lv_current_offset. - " extract the ... part of each -tag - lo_node_r_child_t ?= lo_node_si_child->find_from_name_ns( name = 't' uri = namespace-main ). - IF lo_node_r_child_t IS BOUND. - lv_node_value = unescape_string_value( lo_node_r_child_t->get_value( ) ). - CONCATENATE -value lv_node_value INTO -value RESPECTING BLANKS. - ls_rtf-length = strlen( lv_node_value ). - ENDIF. + CLEAR: ls_rtf. - lv_current_offset = strlen( -value ). - APPEND ls_rtf TO -rtf. + " extracting rich text formating data + lo_node_r_child_rpr ?= lo_node_si_child->find_from_name_ns( name = 'rPr' uri = namespace-main ). + IF lo_node_r_child_rpr IS BOUND. + lo_font = load_style_font( lo_node_r_child_rpr ). + ls_rtf-font = lo_font->get_structure( ). + ENDIF. + ls_rtf-offset = lv_current_offset. + " extract the ... part of each -tag + lo_node_r_child_t ?= lo_node_si_child->find_from_name_ns( name = 't' uri = namespace-main ). + IF lo_node_r_child_t IS BOUND. + lv_node_value = unescape_string_value( lo_node_r_child_t->get_value( ) ). + CONCATENATE -value lv_node_value INTO -value RESPECTING BLANKS. + ls_rtf-length = strlen( lv_node_value ). + + IF ls_rtf-length > 0. + lv_current_offset = strlen( -value ). + APPEND ls_rtf TO -rtf. + ENDIF. + ENDIF. + ENDIF. lo_node_si_child ?= lo_node_si_child->get_next( ). diff --git a/src/zcl_excel_table.clas.abap b/src/zcl_excel_table.clas.abap index 6887e3f..d6ecbea 100644 --- a/src/zcl_excel_table.clas.abap +++ b/src/zcl_excel_table.clas.abap @@ -174,8 +174,10 @@ CLASS zcl_excel_table IMPLEMENTATION. METHOD get_reference. - DATA: lv_column TYPE zexcel_cell_column, + DATA: lv_start_column TYPE zexcel_cell_column, + lv_end_column TYPE zexcel_cell_column, lv_table_lines TYPE i, + lv_left_column TYPE zexcel_cell_column_alpha, lv_right_column TYPE zexcel_cell_column_alpha, ls_field_catalog TYPE zexcel_s_fieldcatalog, lv_bottom_row TYPE zexcel_cell_row, @@ -185,13 +187,12 @@ CLASS zcl_excel_table IMPLEMENTATION. FIELD-SYMBOLS: TYPE STANDARD TABLE. *column - lv_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). + lv_start_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). lv_table_lines = 0. LOOP AT fieldcat INTO ls_field_catalog WHERE dynpfld EQ abap_true. ADD 1 TO lv_table_lines. ENDLOOP. - lv_column = lv_column + lv_table_lines - 1. - lv_right_column = zcl_excel_common=>convert_column2alpha( lv_column ). + lv_end_column = lv_start_column + lv_table_lines - 1. *row ASSIGN table_data->* TO . @@ -208,7 +209,9 @@ CLASS zcl_excel_table IMPLEMENTATION. lv_top_row_string = zcl_excel_common=>number_to_excel_string( settings-top_left_row ). lv_bottom_row_string = zcl_excel_common=>number_to_excel_string( lv_bottom_row ). - CONCATENATE settings-top_left_column lv_top_row_string + lv_left_column = zcl_excel_common=>convert_column2alpha( lv_start_column ). + lv_right_column = zcl_excel_common=>convert_column2alpha( lv_end_column ). + CONCATENATE lv_left_column lv_top_row_string ':' lv_right_column lv_bottom_row_string INTO ov_reference. diff --git a/src/zcl_excel_writer_csv.clas.abap b/src/zcl_excel_writer_csv.clas.abap index 7aa976b..4c0dbc8 100644 --- a/src/zcl_excel_writer_csv.clas.abap +++ b/src/zcl_excel_writer_csv.clas.abap @@ -30,6 +30,12 @@ CLASS zcl_excel_writer_csv DEFINITION CLASS-METHODS set_initial_ext_date IMPORTING !ip_value TYPE char10 DEFAULT c_default . + CLASS-METHODS set_skip_hidden_rows + IMPORTING + !ip_value TYPE abap_bool. + CLASS-METHODS set_skip_hidden_columns + IMPORTING + !ip_value TYPE abap_bool. *"* protected components of class ZCL_EXCEL_WRITER_CSV *"* do not include other source files here!!! PROTECTED SECTION. @@ -45,6 +51,8 @@ CLASS zcl_excel_writer_csv DEFINITION CLASS-DATA worksheet_name TYPE zexcel_worksheets_name . CLASS-DATA worksheet_index TYPE zexcel_active_worksheet . CLASS-DATA initial_ext_date TYPE char10 VALUE c_default. + CLASS-DATA skip_hidden_rows TYPE abap_bool. + CLASS-DATA skip_hidden_columns TYPE abap_bool. METHODS create RETURNING @@ -91,6 +99,9 @@ CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. DATA: lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_worksheet TYPE REF TO zcl_excel_worksheet. + DATA: lo_autofilter TYPE REF TO zcl_excel_autofilter. + DATA: lv_row_hidden TYPE abap_bool. + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, lv_row TYPE i, lv_col TYPE i, @@ -113,8 +124,9 @@ CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. * --- Retrieve SAP date format CLEAR ls_format. SELECT ddtext INTO ls_format-attvalue FROM dd07t WHERE domname = 'XUDATFM' - AND ddlanguage = sy-langu. + AND ( ddlanguage = sy-langu OR ddlanguage = 'E' ). ls_format-cmpname = 'DATE'. + ls_format-attvalue = ls_format-attvalue(10). " Ignore description, only use pattern CONDENSE ls_format-attvalue. CONCATENATE '''' ls_format-attvalue '''' INTO ls_format-attvalue. APPEND ls_format TO lt_format. @@ -151,11 +163,54 @@ CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. SORT lt_cell_data BY cell_row cell_column. + + IF skip_hidden_rows = abap_true. +* --- Retrieve autofilters (to identify hidden rows) + lo_autofilter = excel->get_autofilters_reference( )->get( io_worksheet = lo_worksheet ). + IF lo_autofilter IS NOT INITIAL. + lo_autofilter->get_filter_area( ). " trigger filter area validation + ENDIF. + ENDIF. + lv_row = 1. lv_col = 1. CLEAR lv_string. LOOP AT lt_cell_data ASSIGNING . +* --- Check, if row is hidden + AT NEW cell_row. + IF lo_autofilter IS NOT INITIAL. + lv_row_hidden = lo_autofilter->is_row_hidden( iv_row = -cell_row ). + ENDIF. + ENDAT. + +* --- Add empty rows + WHILE lv_row < -cell_row. + CONCATENATE lv_string zcl_excel_writer_csv=>eol INTO lv_string. + lv_row = lv_row + 1. + lv_col = 1. + ENDWHILE. + +* --- Skip hidden rows + IF lv_row_hidden = abap_true. + lv_row = -cell_row + 1. + lv_col = 1. + CONTINUE. + ENDIF. + +* --- Add empty columns + WHILE lv_col < -cell_column. + CONCATENATE lv_string zcl_excel_writer_csv=>delimiter INTO lv_string. + lv_col = lv_col + 1. + ENDWHILE. + +* --- Skip hidden columns + IF skip_hidden_columns = abap_true AND + lo_worksheet->get_column( ip_column = -cell_column )->get_visible( ) = abap_false. + lv_col = -cell_column + 1. + CONTINUE. + ENDIF. + * --- Retrieve Cell Style format and data type CLEAR ls_numfmt. IF -data_type IS INITIAL AND -cell_style IS NOT INITIAL. @@ -210,19 +265,6 @@ CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. ENDIF. " lv_attrname IS NOT INITIAL. ENDIF. " -data_type IS INITIAL AND ls_numfmt IS NOT INITIAL. -* --- Add empty rows - WHILE lv_row < -cell_row. - CONCATENATE lv_string zcl_excel_writer_csv=>eol INTO lv_string. - lv_row = lv_row + 1. - lv_col = 1. - ENDWHILE. - -* --- Add empty columns - WHILE lv_col < -cell_column. - CONCATENATE lv_string zcl_excel_writer_csv=>delimiter INTO lv_string. - lv_col = lv_col + 1. - ENDWHILE. - * ----- Use format to determine the data type and display format. CASE -data_type. @@ -318,6 +360,16 @@ CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. ENDMETHOD. + METHOD set_skip_hidden_rows. + skip_hidden_rows = ip_value. + ENDMETHOD. + + + METHOD set_skip_hidden_columns. + skip_hidden_columns = ip_value. + ENDMETHOD. + + METHOD zif_excel_writer~write_file. me->excel = io_excel. ep_file = me->create( ).