diff --git a/docs/contributing/publishing-a-new-release.md b/docs/contributing/publishing-a-new-release.md index 269d952..6db8e4d 100644 --- a/docs/contributing/publishing-a-new-release.md +++ b/docs/contributing/publishing-a-new-release.md @@ -1,17 +1,21 @@ # Publishing a new release Let's create a release from time to time, every 1 or 2 months for instance, to contain enough changes, but not too much. +Before beginning, you should ensure that ZDEMO_EXCEL_CHECKER (in the demos repo) shows all green checkmarks. -Below are the notes taken while publishing the release `7.15.0`. +Below are the notes taken while publishing the release `7.16.0`. Version numbering is based on [Semantic Versioning 2.0.0](https://semver.org/): - `7`: a major release. NB: it will probably not change as we don't want to "make incompatible API changes". -- `15`: a minor release +- `16`: a minor release - `0`: patch level (bug fixes) -Create a branch for this new release, change `zcl_excel_version` to indicate the new version number and push the changes to the repository +Working directly on the upstream repository: +- create a branch for this new release; suggested naming for the branch: your own prefix - slash - release - number. For example: abo/release7.16.0 OR sandraros/release7.16.0 +- change `version` in `zcl_excel` to indicate the new version number +- push the changes to this new release branch -With GitHub Desktop (or any Git console or Git user interface), [add the tag](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/managing-commits/managing-tags) `7.15.0` to this branch. +With GitHub Desktop (or any Git console or Git user interface), [add the (lightweight) tag](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/managing-commits/managing-tags) `v7.16.0` to this branch; suggested naming for version-related tags is v + version number. Do a pull request. @@ -21,7 +25,7 @@ Now [create the release in GitHub](https://docs.github.com/en/repositories/relea - Click "Releases" - Click "Draft a new release" - Click "Choose a tag" -- Type the title, click "Auto-generate release notes" and click "Preview" to verify; you should have a list with the following items, edit as required: +- Type the title, select the previous tag, click "Auto-generate release notes" and click "Preview" to verify; you should have a list with the changes from the previous release, edit as required and remember to include the list below as explanation: - `+`: new feature - `*`: bug fix - `!`: feature modification @@ -29,3 +33,6 @@ Now [create the release in GitHub](https://docs.github.com/en/repositories/relea - Click "Publish release" - It's done, zip and tar.gz files are automatically assigned to the release - The new release appears in the Code home page, with the changelog in the release page itself. + +Now create a release for the [demos](https://github.com/abap2xlsx/demos) repository as well: use the same process and tag the latest commit available at the time the main library is released, to ensure users will always have a matching set of demo programs. + diff --git a/src/zcl_excel.clas.abap b/src/zcl_excel.clas.abap index dfc9e56..e52a699 100644 --- a/src/zcl_excel.clas.abap +++ b/src/zcl_excel.clas.abap @@ -13,7 +13,7 @@ CLASS zcl_excel DEFINITION DATA legacy_palette TYPE REF TO zcl_excel_legacy_palette READ-ONLY . DATA security TYPE REF TO zcl_excel_security . DATA use_template TYPE abap_bool . - CONSTANTS version TYPE c LENGTH 10 VALUE '7.15.0'. "#EC NOTEXT + CONSTANTS version TYPE c LENGTH 10 VALUE '7.16.0'. "#EC NOTEXT METHODS add_new_autofilter IMPORTING diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index b82577b..0c4a3ab 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -666,7 +666,30 @@ CLASS zcl_excel_worksheet DEFINITION !ip_is_internal TYPE abap_bool RAISING zcx_excel . + "! excel upload, counterpart to BIND_TABLE + "! @parameter it_field_catalog | field catalog, used to derive correct types + "! @parameter iv_begin_row | starting row, by default 2 to skip header + "! @parameter et_data | generic internal table, there may be conversion losses + "! @parameter er_data | ref to internal table of string columns, to get raw data without conversion losses. + METHODS convert_to_table + IMPORTING + !it_field_catalog TYPE zexcel_t_fieldcatalog OPTIONAL + !iv_begin_row TYPE int4 DEFAULT 2 + EXPORTING + !et_data TYPE STANDARD TABLE + !er_data TYPE REF TO data + 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 @@ -1049,14 +1072,20 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. IF -style_header IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int - ip_value = -scrtext_l + ip_value = -column_name ip_style = -style_header ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int - ip_value = -scrtext_l ). + ip_value = -column_name ). ENDIF. + me->set_table_reference( ip_column = lv_column_int + ip_row = lv_row_int + ir_table = lo_table + ip_fieldname = -fieldname + ip_header = abap_true ). + IF -column_formula IS NOT INITIAL. ls_column_formula-id = lines( column_formulas ) + 1. ls_column_formula-column = lv_column_int. @@ -1167,7 +1196,7 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. " totals *--------------------------------------------------------------------* IF -totals_function IS NOT INITIAL. - lv_formula = lo_table->get_totals_formula( ip_column = -scrtext_l ip_function = -totals_function ). + lv_formula = lo_table->get_totals_formula( ip_column = -column_name ip_function = -totals_function ). IF -style_total IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int @@ -2038,6 +2067,281 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. ENDMETHOD. "CONSTRUCTOR + METHOD convert_to_table. + + TYPES: + BEGIN OF ts_field_conv, + fieldname TYPE x031l-fieldname, + convexit TYPE x031l-convexit, + END OF ts_field_conv, + BEGIN OF ts_style_conv, + cell_style TYPE zexcel_s_cell_data-cell_style, + abap_type TYPE abap_typekind, + END OF ts_style_conv. + + DATA: + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_field_catalog TYPE zexcel_s_fieldcatalog, + lv_value TYPE string, + lv_maxcol TYPE i, + lv_maxrow TYPE i, + lt_field_conv TYPE TABLE OF ts_field_conv, + lt_comp TYPE abap_component_tab, + ls_comp TYPE abap_componentdescr, + lo_line_type TYPE REF TO cl_abap_structdescr, + lo_tab_type TYPE REF TO cl_abap_tabledescr, + lr_data TYPE REF TO data, + lt_comp_view TYPE abap_component_view_tab, + ls_comp_view TYPE abap_simple_componentdescr, + lt_ddic_object TYPE dd_x031l_table, + lt_ddic_object_comp TYPE dd_x031l_table, + ls_ddic_object TYPE x031l, + lt_style_conv TYPE TABLE OF ts_style_conv, + ls_style_conv TYPE ts_style_conv, + ls_stylemapping TYPE zexcel_s_stylemapping, + lv_format_code TYPE zexcel_number_format, + lv_float TYPE f, + lt_map_excel_row TYPE TABLE OF i, + lv_index TYPE i, + lv_index_col TYPE i. + + FIELD-SYMBOLS: + TYPE STANDARD TABLE, + TYPE data, + TYPE data, + TYPE STANDARD TABLE, + TYPE data, + TYPE data, + TYPE ts_field_conv, + TYPE x031l, + TYPE zexcel_s_cell_data. + + CLEAR: et_data, er_data. + + lv_maxcol = get_highest_column( ). + lv_maxrow = get_highest_row( ). + + + " Field catalog + lt_field_catalog = it_field_catalog. + IF lt_field_catalog IS INITIAL. + IF et_data IS SUPPLIED. + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = et_data ). + ELSE. + DO lv_maxcol TIMES. + ls_field_catalog-position = sy-index. + ls_field_catalog-fieldname = 'COL_' && sy-index. + ls_field_catalog-dynpfld = abap_true. + APPEND ls_field_catalog TO lt_field_catalog. + ENDDO. + ENDIF. + ENDIF. + + SORT lt_field_catalog BY position. + DELETE lt_field_catalog WHERE dynpfld NE abap_true. + CHECK: lt_field_catalog IS NOT INITIAL. + + + " Create dynamic table string columns + ls_comp-type = cl_abap_elemdescr=>get_string( ). + LOOP AT lt_field_catalog INTO ls_field_catalog. + ls_comp-name = ls_field_catalog-fieldname. + APPEND ls_comp TO lt_comp. + ENDLOOP. + lo_line_type = cl_abap_structdescr=>create( lt_comp ). + lo_tab_type = cl_abap_tabledescr=>create( lo_line_type ). + CREATE DATA er_data TYPE HANDLE lo_tab_type. + ASSIGN er_data->* TO . + + + " Collect field conversion rules + IF et_data IS SUPPLIED. +* lt_ddic_object = get_ddic_object( et_data ). + lo_tab_type ?= cl_abap_tabledescr=>describe_by_data( et_data ). + lo_line_type ?= lo_tab_type->get_table_line_type( ). + lo_line_type->get_ddic_object( + RECEIVING + p_object = lt_ddic_object + EXCEPTIONS + OTHERS = 3 + ). + IF lt_ddic_object IS INITIAL. + lt_comp_view = lo_line_type->get_included_view( ). + LOOP AT lt_comp_view INTO ls_comp_view. + ls_comp_view-type->get_ddic_object( + RECEIVING + p_object = lt_ddic_object_comp + EXCEPTIONS + OTHERS = 3 + ). + IF lt_ddic_object_comp IS NOT INITIAL. + READ TABLE lt_ddic_object_comp INTO ls_ddic_object INDEX 1. + ls_ddic_object-fieldname = ls_comp_view-name. + APPEND ls_ddic_object TO lt_ddic_object. + ENDIF. + ENDLOOP. + ENDIF. + + SORT lt_ddic_object BY fieldname. + LOOP AT lt_field_catalog INTO ls_field_catalog. + APPEND INITIAL LINE TO lt_field_conv ASSIGNING . + MOVE-CORRESPONDING ls_field_catalog TO . + READ TABLE lt_ddic_object ASSIGNING WITH KEY fieldname = -fieldname BINARY SEARCH. + CHECK: sy-subrc EQ 0. + CASE -exid. + WHEN cl_abap_typedescr=>typekind_int + OR cl_abap_typedescr=>typekind_int1 + OR cl_abap_typedescr=>typekind_int8 + OR cl_abap_typedescr=>typekind_int2 + OR cl_abap_typedescr=>typekind_packed + OR cl_abap_typedescr=>typekind_decfloat + OR cl_abap_typedescr=>typekind_decfloat16 + OR cl_abap_typedescr=>typekind_decfloat34 + OR cl_abap_typedescr=>typekind_float. + " Numbers + -convexit = cl_abap_typedescr=>typekind_float. + WHEN OTHERS. + -convexit = -convexit. + ENDCASE. + ENDLOOP. + ENDIF. + + " Date & Time in excel style + LOOP AT me->sheet_content ASSIGNING WHERE cell_style IS NOT INITIAL AND data_type IS INITIAL. + ls_style_conv-cell_style = -cell_style. + APPEND ls_style_conv TO lt_style_conv. + ENDLOOP. + IF lt_style_conv IS NOT INITIAL. + SORT lt_style_conv BY cell_style. + DELETE ADJACENT DUPLICATES FROM lt_style_conv COMPARING cell_style. + + LOOP AT lt_style_conv INTO ls_style_conv. + + ls_stylemapping = me->excel->get_style_to_guid( ls_style_conv-cell_style ). + lv_format_code = ls_stylemapping-complete_style-number_format-format_code. + " https://support.microsoft.com/en-us/office/number-format-codes-5026bbd6-04bc-48cd-bf33-80f18b4eae68 + IF lv_format_code CS ';'. + lv_format_code = lv_format_code(sy-fdpos). + ENDIF. + CHECK: lv_format_code NA '#?'. + + " Remove color pattern + REPLACE ALL OCCURRENCES OF REGEX '\[\L[^]]*\]' IN lv_format_code WITH ''. + + IF lv_format_code CA 'yd' OR lv_format_code EQ zcl_excel_style_number_format=>c_format_date_std. + " DATE = yyyymmdd + ls_style_conv-abap_type = cl_abap_typedescr=>typekind_date. + ELSEIF lv_format_code CA 'hs'. + " TIME = hhmmss + ls_style_conv-abap_type = cl_abap_typedescr=>typekind_time. + ELSE. + DELETE lt_style_conv. + CONTINUE. + ENDIF. + + MODIFY lt_style_conv FROM ls_style_conv TRANSPORTING abap_type. + + ENDLOOP. + ENDIF. + + +*--------------------------------------------------------------------* +* Start of convert content +*--------------------------------------------------------------------* + READ TABLE me->sheet_content TRANSPORTING NO FIELDS WITH KEY cell_row = iv_begin_row. + IF sy-subrc EQ 0. + lv_index = sy-tabix. + ENDIF. + + LOOP AT me->sheet_content ASSIGNING FROM lv_index. + AT NEW cell_row. + " New line + APPEND INITIAL LINE TO ASSIGNING . + lv_index = sy-tabix. + ENDAT. + + IF -cell_value IS NOT INITIAL. + ASSIGN COMPONENT -cell_column OF STRUCTURE TO . + IF sy-subrc EQ 0. + " value + = -cell_value. + + " field conversion + READ TABLE lt_field_conv ASSIGNING INDEX -cell_column. + IF sy-subrc EQ 0 AND -convexit IS NOT INITIAL. + CASE -convexit. + WHEN cl_abap_typedescr=>typekind_float. + lv_float = zcl_excel_common=>excel_string_to_number( -cell_value ). + = |{ lv_float NUMBER = RAW }|. + WHEN 'ALPHA'. + CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' + EXPORTING + input = -cell_value + IMPORTING + output = . + ENDCASE. + ENDIF. + + " style conversion + IF -cell_style IS NOT INITIAL. + READ TABLE lt_style_conv INTO ls_style_conv WITH KEY cell_style = -cell_style BINARY SEARCH. + IF sy-subrc EQ 0. + CASE ls_style_conv-abap_type. + WHEN cl_abap_typedescr=>typekind_date. + = zcl_excel_common=>excel_string_to_date( -cell_value ). + WHEN cl_abap_typedescr=>typekind_time. + = zcl_excel_common=>excel_string_to_time( -cell_value ). + ENDCASE. + ENDIF. + ENDIF. + + " condense + CONDENSE . + ENDIF. + ENDIF. + + AT END OF cell_row. + " Delete empty line + IF IS INITIAL. + DELETE INDEX lv_index. + ELSE. + APPEND -cell_row TO lt_map_excel_row. + ENDIF. + ENDAT. + ENDLOOP. +*--------------------------------------------------------------------* +* End of convert content +*--------------------------------------------------------------------* + + + IF et_data IS SUPPLIED. +* MOVE-CORRESPONDING TO et_data. + LOOP AT ASSIGNING . + APPEND INITIAL LINE TO et_data ASSIGNING . + MOVE-CORRESPONDING TO . + ENDLOOP. + ENDIF. + + " Apply conversion exit. + LOOP AT lt_field_conv ASSIGNING + WHERE convexit = 'ALPHA'. + LOOP AT et_data ASSIGNING . + ASSIGN COMPONENT -fieldname OF STRUCTURE TO . + CHECK: sy-subrc EQ 0 AND IS NOT INITIAL. + CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' + EXPORTING + input = + IMPORTING + output = . + ENDLOOP. + ENDLOOP. + + ENDMETHOD. + + METHOD create_data_conv_exit_length. DATA: lo_addit TYPE REF TO cl_abap_elemdescr, ls_dfies TYPE dfies, @@ -2072,11 +2376,8 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. lv_column = zcl_excel_common=>convert_column2int( ip_cell_column ). 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 ). - + WHERE row_from <= ip_cell_row AND row_to >= ip_cell_row + AND col_from <= lv_column AND col_to >= lv_column. DELETE me->mt_merged_cells. EXIT. ENDLOOP. @@ -2965,7 +3266,7 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, lv_value_lowercase TYPE string, - lv_scrtext_l_initial TYPE scrtext_l, + lv_scrtext_l_initial TYPE zexcel_column_name, lv_long_text TYPE string, lv_max_length TYPE i, lv_temp_length TYPE i, @@ -2984,39 +3285,42 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. LOOP AT lt_field_catalog ASSIGNING WHERE dynpfld EQ abap_true. - CASE iv_default_descr. - WHEN 'M'. - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_s TO . - ASSIGN -scrtext_l TO . - WHEN 'S'. - ASSIGN -scrtext_s TO . - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_l TO . - WHEN 'L'. - ASSIGN -scrtext_l TO . - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_s TO . - WHEN OTHERS. - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_s TO . - ASSIGN -scrtext_l TO . - ENDCASE. + IF -column_name IS INITIAL. - IF IS NOT INITIAL. - -scrtext_l = . - ELSEIF IS NOT INITIAL. - -scrtext_l = . - ELSEIF IS NOT INITIAL. - -scrtext_l = . - ELSE. - -scrtext_l = 'Column'. " default value as Excel does + CASE iv_default_descr. + WHEN 'M'. + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_s TO . + ASSIGN -scrtext_l TO . + WHEN 'S'. + ASSIGN -scrtext_s TO . + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_l TO . + WHEN 'L'. + ASSIGN -scrtext_l TO . + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_s TO . + WHEN OTHERS. + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_s TO . + ASSIGN -scrtext_l TO . + ENDCASE. + + IF IS NOT INITIAL. + -column_name = . + ELSEIF IS NOT INITIAL. + -column_name = . + ELSEIF IS NOT INITIAL. + -column_name = . + ELSE. + -column_name = 'Column'. " default value as Excel does + ENDIF. ENDIF. - lv_scrtext_l_initial = -scrtext_l. - DESCRIBE FIELD -scrtext_l LENGTH lv_max_length IN CHARACTER MODE. + lv_scrtext_l_initial = -column_name. + DESCRIBE FIELD -column_name LENGTH lv_max_length IN CHARACTER MODE. DO. - lv_value_lowercase = -scrtext_l. + lv_value_lowercase = -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. @@ -3026,11 +3330,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. - -scrtext_l = lv_long_text. + -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 -scrtext_l. + CONCATENATE lv_scrtext_l_initial lv_syindex INTO -column_name. ENDIF. ENDIF. ENDDO. @@ -3500,7 +3804,7 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. TYPE simple, TYPE abap_typekind. FIELD-SYMBOLS: TYPE mty_s_column_formula. - + FIELD-SYMBOLS: TYPE zexcel_s_fieldcatalog. IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED @@ -3643,6 +3947,16 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. ENDCASE. ENDIF. + IF IS ASSIGNED AND -table_header IS NOT INITIAL AND lv_value IS NOT INITIAL. + READ TABLE -table->fieldcat ASSIGNING WITH KEY fieldname = -table_fieldname. + IF sy-subrc = 0. + -column_name = lv_value. + IF -column_name <> lv_value. + zcx_excel=>raise_text( 'Cell is table column header - this value is not allowed' ). + ENDIF. + ENDIF. + ENDIF. + ENDIF. IF ip_hyperlink IS BOUND. @@ -3813,6 +4127,23 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION. ENDMETHOD. "SET_CELL_STYLE + METHOD set_table_reference. + + FIELD-SYMBOLS: TYPE zexcel_s_cell_data. + + READ TABLE sheet_content ASSIGNING WITH KEY cell_row = ip_row + cell_column = ip_column. + IF sy-subrc = 0. + -table = ir_table. + -table_fieldname = ip_fieldname. + -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. diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index a5a1580..46154e7 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -7432,7 +7432,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. SHIFT lv_value LEFT DELETING LEADING '0'. lo_element2->set_attribute_ns( name = 'id' value = lv_value ). - lv_value = ls_fieldcat-scrtext_l. + + 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. @@ -7469,8 +7470,8 @@ 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 ). diff --git a/src/zexcel_column_name.dtel.xml b/src/zexcel_column_name.dtel.xml new file mode 100644 index 0000000..835a522 --- /dev/null +++ b/src/zexcel_column_name.dtel.xml @@ -0,0 +1,24 @@ + + + + + + ZEXCEL_COLUMN_NAME + E + 15 + 10 + 11 + 16 + Cell Column + Column Name + ColumnName + Column Name + Column Name + E + CHAR + 000255 + 000255 + + + + diff --git a/src/zexcel_s_cell_data.tabl.xml b/src/zexcel_s_cell_data.tabl.xml index 124995e..377f0a9 100644 --- a/src/zexcel_s_cell_data.tabl.xml +++ b/src/zexcel_s_cell_data.tabl.xml @@ -71,6 +71,29 @@ TTYPL L + + TABLE + ZCL_EXCEL_TABLE + 0 + REF + REF RC + R + C + + + TABLE_FIELDNAME + ZEXCEL_FIELDNAME + 0 + E + + + TABLE_HEADER + FLAG + 0 + X + F + E + diff --git a/src/zexcel_s_fieldcatalog.tabl.xml b/src/zexcel_s_fieldcatalog.tabl.xml index 78dbd1f..b7958b7 100644 --- a/src/zexcel_s_fieldcatalog.tabl.xml +++ b/src/zexcel_s_fieldcatalog.tabl.xml @@ -111,6 +111,12 @@ STRG Column Formula + + COLUMN_NAME + ZEXCEL_COLUMN_NAME + 0 + E +