Options to skip hidden rows and columns for CSV format (#1268)

* Options to skip hidden rows and columns for CSV format

Add options to skip hidden rows and columns when saving the data in CSV format. This is especially useful, when converting an ALV to an Excel object and saving it as CSV file. ALV layouts often display only selected columns.

* Adding missing data definition

Adding missing data definition for lo_autofilter.

* Fix dates not converterted to external format

Method get_default_excel_date_format of class zcl_excel_worksheet uses language "E" (English) to determine the date format from domain XUDATFM. 
Method create_csv of class zcl_excel_writer_csv has a logic to determine the field type from the number format. For this also the values from domain XUDATFM are used. But here they are read with sy-langu. Due to this, fields are not correctly identified as "date" when the user language is not English.

Solution: Additionally read domain values with language "E".

* Trigger filter area validation

Trigger filter area validation

* Fix date identification logic for newer AS ABAP versions

The texts of domain XUDATFM changed in newer systems:
NW 7.40: DD.MM.YYYY
NW 7.52: DD.MM.YYYY (Gregorian Date)

This breaks the date identification logic.

New logic copied from get_date_format_des of class cl_abap_datfm, which is called in method get_default_excel_date_format of class zcl_excel_worksheet to get the users default date pattern.

* Performance improvement for skip hidden rows

Performance improvement for skip hidden rows

---------

Co-authored-by: Domi Bigl <dominik.bigl@cadaxo.com>
Co-authored-by: sandraros <34005250+sandraros@users.noreply.github.com>
This commit is contained in:
Oliver Hütköper 2025-01-05 15:16:30 +01:00 committed by GitHub
parent bae673121b
commit 4eb3df1611
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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 <fs_sheet_content>.
* --- 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 = <fs_sheet_content>-cell_row ).
ENDIF.
ENDAT.
* --- Add empty rows
WHILE lv_row < <fs_sheet_content>-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 = <fs_sheet_content>-cell_row + 1.
lv_col = 1.
CONTINUE.
ENDIF.
* --- Add empty columns
WHILE lv_col < <fs_sheet_content>-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 = <fs_sheet_content>-cell_column )->get_visible( ) = abap_false.
lv_col = <fs_sheet_content>-cell_column + 1.
CONTINUE.
ENDIF.
* --- Retrieve Cell Style format and data type
CLEAR ls_numfmt.
IF <fs_sheet_content>-data_type IS INITIAL AND <fs_sheet_content>-cell_style IS NOT INITIAL.
@ -210,19 +265,6 @@ CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION.
ENDIF. " lv_attrname IS NOT INITIAL.
ENDIF. " <fs_sheet_content>-data_type IS INITIAL AND ls_numfmt IS NOT INITIAL.
* --- Add empty rows
WHILE lv_row < <fs_sheet_content>-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 < <fs_sheet_content>-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 <fs_sheet_content>-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( ).