add column_name to fcat and link cell to table

add column_name char 255 to table fieldcat - this is used as table name and cell value
link cell to table and fieldcat
This commit is contained in:
Domi Bigl 2022-07-28 14:06:46 +00:00
parent c6e5ad6ee6
commit 2221cb145a
6 changed files with 175 additions and 87 deletions

View File

@ -37,10 +37,8 @@ CLASS zcl_excel_table DEFINITION
CONSTANTS builtinstyle_light11 TYPE zexcel_table_style VALUE 'TableStyleLight11'. "#EC NOTEXT
CONSTANTS totals_function_sum TYPE zexcel_table_totals_function VALUE 'sum'. "#EC NOTEXT
CONSTANTS builtinstyle_light12 TYPE zexcel_table_style VALUE 'TableStyleLight12'. "#EC NOTEXT
DATA fieldcat TYPE zexcel_t_fieldcatalog .
CONSTANTS builtinstyle_light13 TYPE zexcel_table_style VALUE 'TableStyleLight13'. "#EC NOTEXT
CONSTANTS builtinstyle_light14 TYPE zexcel_table_style VALUE 'TableStyleLight14'. "#EC NOTEXT
DATA settings TYPE zexcel_s_table_settings .
CONSTANTS builtinstyle_light15 TYPE zexcel_table_style VALUE 'TableStyleLight15'. "#EC NOTEXT
CONSTANTS builtinstyle_light16 TYPE zexcel_table_style VALUE 'TableStyleLight16'. "#EC NOTEXT
CONSTANTS builtinstyle_light17 TYPE zexcel_table_style VALUE 'TableStyleLight17'. "#EC NOTEXT
@ -74,6 +72,8 @@ CLASS zcl_excel_table DEFINITION
CONSTANTS builtinstyle_medium24 TYPE zexcel_table_style VALUE 'TableStyleMedium24'. "#EC NOTEXT
CONSTANTS builtinstyle_medium25 TYPE zexcel_table_style VALUE 'TableStyleMedium26'. "#EC NOTEXT
CONSTANTS builtinstyle_medium27 TYPE zexcel_table_style VALUE 'TableStyleMedium27'. "#EC NOTEXT
DATA fieldcat TYPE zexcel_t_fieldcatalog.
DATA settings TYPE zexcel_s_table_settings.
METHODS get_totals_formula
IMPORTING

View File

@ -665,6 +665,15 @@ CLASS zcl_excel_worksheet DEFINITION
RAISING
zcx_excel .
PROTECTED SECTION.
METHODS set_table_reference
IMPORTING
!ip_column TYPE zexcel_cell_column
!ip_row TYPE zexcel_cell_row
!ir_table type ref to zcl_excel_table
!ip_fieldname type zexcel_fieldname
!ip_header type abap_bool
RAISING
zcx_excel .
PRIVATE SECTION.
*"* private components of class ZCL_EXCEL_WORKSHEET
@ -994,7 +1003,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDIF.
IF it_field_catalog IS NOT SUPPLIED.
lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table
lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table
ip_conv_exit_length = ip_conv_exit_length ).
ELSE.
lt_field_catalog = it_field_catalog.
@ -1018,8 +1027,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDWHILE.
check_table_overlapping(
is_table_settings = ls_settings
it_other_table_settings = lt_other_table_settings ).
is_table_settings = ls_settings
it_other_table_settings = lt_other_table_settings ).
* Start filling the table
@ -1035,8 +1044,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
lv_row_int = ls_settings-top_left_row.
lt_field_catalog = normalize_column_heading_texts(
iv_default_descr = iv_default_descr
it_field_catalog = lt_field_catalog ).
iv_default_descr = iv_default_descr
it_field_catalog = lt_field_catalog ).
* It is better to loop column by column (only visible column)
LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true.
@ -1047,14 +1056,20 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
IF <ls_field_catalog>-style_header IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <ls_field_catalog>-scrtext_l
ip_value = <ls_field_catalog>-column_name
ip_style = <ls_field_catalog>-style_header ).
ELSE.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <ls_field_catalog>-scrtext_l ).
ip_value = <ls_field_catalog>-column_name ).
ENDIF.
me->set_table_reference( ip_column = lv_column_int
ip_row = lv_row_int
ir_table = lo_table
ip_fieldname = <ls_field_catalog>-fieldname
ip_header = abap_true ).
IF <ls_field_catalog>-column_formula IS NOT INITIAL.
ls_column_formula-id = lines( column_formulas ) + 1.
ls_column_formula-column = lv_column_int.
@ -1074,26 +1089,26 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
IF <ls_field_catalog>-formula EQ abap_true.
IF <ls_field_catalog>-style IS NOT INITIAL.
IF <ls_field_catalog>-abap_type IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval>
ip_abap_type = <ls_field_catalog>-abap_type
ip_style = <ls_field_catalog>-style ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval>
ip_abap_type = <ls_field_catalog>-abap_type
ip_style = <ls_field_catalog>-style ).
ELSE.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval>
ip_style = <ls_field_catalog>-style ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval>
ip_style = <ls_field_catalog>-style ).
ENDIF.
ELSEIF <ls_field_catalog>-abap_type IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval>
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval>
ip_abap_type = <ls_field_catalog>-abap_type ).
ELSE.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval> ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = <fs_fldval> ).
ENDIF.
ELSEIF <ls_field_catalog>-column_formula IS NOT INITIAL.
" Column formulas
@ -1111,10 +1126,10 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ip_style = <ls_field_catalog>-style ).
ENDIF.
ELSEIF <ls_field_catalog>-abap_type IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_column_formula_id = ls_column_formula-id
ip_abap_type = <ls_field_catalog>-abap_type ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_column_formula_id = ls_column_formula-id
ip_abap_type = <ls_field_catalog>-abap_type ).
ELSE.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
@ -1123,30 +1138,30 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ELSE.
IF <ls_field_catalog>-style IS NOT INITIAL.
IF <ls_field_catalog>-abap_type IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <fs_fldval>
ip_abap_type = <ls_field_catalog>-abap_type
ip_style = <ls_field_catalog>-style
ip_conv_exit_length = ip_conv_exit_length ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <fs_fldval>
ip_abap_type = <ls_field_catalog>-abap_type
ip_style = <ls_field_catalog>-style
ip_conv_exit_length = ip_conv_exit_length ).
ELSE.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <fs_fldval>
ip_style = <ls_field_catalog>-style
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <fs_fldval>
ip_style = <ls_field_catalog>-style
ip_conv_exit_length = ip_conv_exit_length ).
ENDIF.
ELSE.
IF <ls_field_catalog>-abap_type IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_abap_type = <ls_field_catalog>-abap_type
ip_value = <fs_fldval>
ip_conv_exit_length = ip_conv_exit_length ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_abap_type = <ls_field_catalog>-abap_type
ip_value = <fs_fldval>
ip_conv_exit_length = ip_conv_exit_length ).
ELSE.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <fs_fldval>
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_value = <fs_fldval>
ip_conv_exit_length = ip_conv_exit_length ).
ENDIF.
ENDIF.
@ -1167,14 +1182,14 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
IF <ls_field_catalog>-totals_function IS NOT INITIAL.
lv_formula = lo_table->get_totals_formula( ip_column = <ls_field_catalog>-scrtext_l ip_function = <ls_field_catalog>-totals_function ).
IF <ls_field_catalog>-style_total IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = lv_formula
ip_style = <ls_field_catalog>-style_total ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = lv_formula
ip_style = <ls_field_catalog>-style_total ).
ELSE.
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = lv_formula ).
me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int
ip_formula = lv_formula ).
ENDIF.
ENDIF.
@ -1188,10 +1203,10 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header
lv_last_row = ls_settings-bottom_right_row.
lo_style_cond = me->get_style_cond( <ls_field_catalog>-style_cond ).
lo_style_cond->set_range( ip_start_column = lv_column_alpha
ip_start_row = lv_first_row
ip_stop_column = lv_column_alpha
ip_stop_row = lv_last_row ).
lo_style_cond->set_range( ip_start_column = lv_column_alpha
ip_start_row = lv_first_row
ip_stop_column = lv_column_alpha
ip_stop_row = lv_last_row ).
ENDIF.
ENDLOOP.
@ -3001,20 +3016,22 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
ENDCASE.
IF <scrtxt1> IS NOT INITIAL.
<ls_field_catalog>-scrtext_l = <scrtxt1>.
ELSEIF <scrtxt2> IS NOT INITIAL.
<ls_field_catalog>-scrtext_l = <scrtxt2>.
ELSEIF <scrtxt3> IS NOT INITIAL.
<ls_field_catalog>-scrtext_l = <scrtxt3>.
ELSE.
<ls_field_catalog>-scrtext_l = 'Column'. " default value as Excel does
IF <ls_field_catalog>-column_name IS INITIAL.
IF <scrtxt1> IS NOT INITIAL.
<ls_field_catalog>-column_name = <scrtxt1>.
ELSEIF <scrtxt2> IS NOT INITIAL.
<ls_field_catalog>-column_name = <scrtxt2>.
ELSEIF <scrtxt3> IS NOT INITIAL.
<ls_field_catalog>-column_name = <scrtxt3>.
ELSE.
<ls_field_catalog>-column_name = 'Column'. " default value as Excel does
ENDIF.
ENDIF.
lv_scrtext_l_initial = <ls_field_catalog>-scrtext_l.
DESCRIBE FIELD <ls_field_catalog>-scrtext_l LENGTH lv_max_length IN CHARACTER MODE.
lv_scrtext_l_initial = <ls_field_catalog>-column_name.
DESCRIBE FIELD <ls_field_catalog>-column_name LENGTH lv_max_length IN CHARACTER MODE.
DO.
lv_value_lowercase = <ls_field_catalog>-scrtext_l.
lv_value_lowercase = <ls_field_catalog>-column_name.
TRANSLATE lv_value_lowercase TO LOWER CASE.
READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH.
IF sy-subrc <> 0.
@ -3024,11 +3041,11 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
lv_syindex = sy-index.
CONCATENATE lv_scrtext_l_initial lv_syindex INTO lv_long_text.
IF strlen( lv_long_text ) <= lv_max_length.
<ls_field_catalog>-scrtext_l = lv_long_text.
<ls_field_catalog>-column_name = lv_long_text.
ELSE.
lv_temp_length = strlen( lv_scrtext_l_initial ) - 1.
lv_scrtext_l_initial = substring( val = lv_scrtext_l_initial len = lv_temp_length ).
CONCATENATE lv_scrtext_l_initial lv_syindex INTO <ls_field_catalog>-scrtext_l.
CONCATENATE lv_scrtext_l_initial lv_syindex INTO <ls_field_catalog>-column_name.
ENDIF.
ENDIF.
ENDDO.
@ -3811,6 +3828,23 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDMETHOD. "SET_CELL_STYLE
METHOD set_table_reference.
FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data.
READ TABLE sheet_content ASSIGNING <ls_sheet_content> WITH KEY cell_row = ip_row
cell_column = ip_column.
IF sy-subrc = 0.
<ls_sheet_content>-table = ir_table.
<ls_sheet_content>-table_fieldname = ip_fieldname.
<ls_sheet_content>-table_header = ip_header.
ELSE.
zcx_excel=>raise_text( 'Cell not found' ).
ENDIF.
ENDMETHOD.
METHOD set_column_width.
DATA: lo_column TYPE REF TO zcl_excel_column.
DATA: width TYPE f.

View File

@ -7349,11 +7349,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
**********************************************************************
* STEP 3: Create main node table
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table
parent = lo_document ).
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_table_ns ).
value = lc_xml_node_table_ns ).
lv_id = io_table->get_id( ).
lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_id ).
@ -7388,10 +7388,10 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
value = lv_ref ).
IF io_table->has_totals( ) = abap_true.
lo_element_root->set_attribute_ns( name = 'totalsRowCount'
value = '1' ).
value = '1' ).
ELSE.
lo_element_root->set_attribute_ns( name = lc_xml_attr_totals
value = '0' ).
value = '0' ).
ENDIF.
**********************************************************************
@ -7426,13 +7426,14 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true.
lo_element2 = lo_document->create_simple_element_ns( name = 'tableColumn'
parent = lo_element ).
parent = lo_element ).
lv_value = ls_fieldcat-position.
SHIFT lv_value LEFT DELETING LEADING '0'.
lo_element2->set_attribute_ns( name = 'id'
value = lv_value ).
lv_value = ls_fieldcat-scrtext_l.
value = lv_value ).
lv_value = ls_fieldcat-column_name.
" The text "_x...._", with "_x" not "_X", with exactly 4 ".", each being 0-9 a-f or A-F (case insensitive), is interpreted
" like Unicode character U+.... (e.g. "_x0041_" is rendered like "A") is for characters.
@ -7449,11 +7450,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN lv_value WITH '_x0009_'.
lo_element2->set_attribute_ns( name = 'name'
value = lv_value ).
value = lv_value ).
IF ls_fieldcat-totals_function IS NOT INITIAL.
lo_element2->set_attribute_ns( name = 'totalsRowFunction'
value = ls_fieldcat-totals_function ).
value = ls_fieldcat-totals_function ).
ENDIF.
IF ls_fieldcat-column_formula IS NOT INITIAL.
@ -7469,17 +7470,17 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDLOOP.
lo_element = lo_document->create_simple_element( name = 'tableStyleInfo'
parent = lo_element_root ).
lo_element = lo_document->create_simple_element( name = 'tableStyleInfo'
parent = lo_element_root ).
lo_element->set_attribute_ns( name = 'name'
value = io_table->settings-table_style ).
value = io_table->settings-table_style ).
lo_element->set_attribute_ns( name = 'showFirstColumn'
value = '0' ).
value = '0' ).
lo_element->set_attribute_ns( name = 'showLastColumn'
value = '0' ).
value = '0' ).
IF io_table->settings-show_row_stripes = abap_true.
lv_value = '1'.
@ -7488,7 +7489,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDIF.
lo_element->set_attribute_ns( name = 'showRowStripes'
value = lv_value ).
value = lv_value ).
IF io_table->settings-show_column_stripes = abap_true.
lv_value = '1'.
@ -7497,7 +7498,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDIF.
lo_element->set_attribute_ns( name = 'showColumnStripes'
value = lv_value ).
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_COLUMN_NAME</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<HEADLEN>15</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>11</SCRLEN2>
<SCRLEN3>16</SCRLEN3>
<DDTEXT>Cell Column</DDTEXT>
<REPTEXT>Column Name</REPTEXT>
<SCRTEXT_S>ColumnName</SCRTEXT_S>
<SCRTEXT_M>Column Name</SCRTEXT_M>
<SCRTEXT_L>Column Name</SCRTEXT_L>
<DTELMASTER>E</DTELMASTER>
<DATATYPE>CHAR</DATATYPE>
<LENG>000255</LENG>
<OUTPUTLEN>000255</OUTPUTLEN>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -71,6 +71,29 @@
<MASK> TTYPL</MASK>
<COMPTYPE>L</COMPTYPE>
</DD03P>
<DD03P>
<FIELDNAME>TABLE</FIELDNAME>
<ROLLNAME>ZCL_EXCEL_TABLE</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<DATATYPE>REF</DATATYPE>
<MASK> REF RC</MASK>
<COMPTYPE>R</COMPTYPE>
<REFTYPE>C</REFTYPE>
</DD03P>
<DD03P>
<FIELDNAME>TABLE_FIELDNAME</FIELDNAME>
<ROLLNAME>ZEXCEL_FIELDNAME</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE>
</DD03P>
<DD03P>
<FIELDNAME>TABLE_HEADER</FIELDNAME>
<ROLLNAME>FLAG</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<VALEXI>X</VALEXI>
<SHLPORIGIN>F</SHLPORIGIN>
<COMPTYPE>E</COMPTYPE>
</DD03P>
</DD03P_TABLE>
</asx:values>
</asx:abap>

View File

@ -111,6 +111,12 @@
<MASK> STRG</MASK>
<DDTEXT>Column Formula</DDTEXT>
</DD03P>
<DD03P>
<FIELDNAME>COLUMN_NAME</FIELDNAME>
<ROLLNAME>ZEXCEL_COLUMN_NAME</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE>
</DD03P>
</DD03P_TABLE>
</asx:values>
</asx:abap>