mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-06 07:01:02 +08:00
Merge branch 'main' into main
This commit is contained in:
commit
de3a01ecc7
|
@ -1,17 +1,21 @@
|
||||||
# Publishing a new release
|
# 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.
|
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/):
|
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".
|
- `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)
|
- `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.
|
Do a pull request.
|
||||||
|
|
||||||
|
@ -21,7 +25,7 @@ Now [create the release in GitHub](https://docs.github.com/en/repositories/relea
|
||||||
- Click "Releases"
|
- Click "Releases"
|
||||||
- Click "Draft a new release"
|
- Click "Draft a new release"
|
||||||
- Click "Choose a tag"
|
- 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
|
- `+`: new feature
|
||||||
- `*`: bug fix
|
- `*`: bug fix
|
||||||
- `!`: feature modification
|
- `!`: feature modification
|
||||||
|
@ -29,3 +33,6 @@ Now [create the release in GitHub](https://docs.github.com/en/repositories/relea
|
||||||
- Click "Publish release"
|
- Click "Publish release"
|
||||||
- It's done, zip and tar.gz files are automatically assigned to the 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.
|
- 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.
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ CLASS zcl_excel DEFINITION
|
||||||
DATA legacy_palette TYPE REF TO zcl_excel_legacy_palette READ-ONLY .
|
DATA legacy_palette TYPE REF TO zcl_excel_legacy_palette READ-ONLY .
|
||||||
DATA security TYPE REF TO zcl_excel_security .
|
DATA security TYPE REF TO zcl_excel_security .
|
||||||
DATA use_template TYPE abap_bool .
|
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
|
METHODS add_new_autofilter
|
||||||
IMPORTING
|
IMPORTING
|
||||||
|
|
|
@ -664,7 +664,30 @@ CLASS zcl_excel_worksheet DEFINITION
|
||||||
!ip_is_internal TYPE abap_bool
|
!ip_is_internal TYPE abap_bool
|
||||||
RAISING
|
RAISING
|
||||||
zcx_excel .
|
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.
|
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 SECTION.
|
||||||
|
|
||||||
*"* private components of class ZCL_EXCEL_WORKSHEET
|
*"* private components of class ZCL_EXCEL_WORKSHEET
|
||||||
|
@ -1047,14 +1070,20 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
IF <ls_field_catalog>-style_header IS NOT INITIAL.
|
IF <ls_field_catalog>-style_header IS NOT INITIAL.
|
||||||
me->set_cell( ip_column = lv_column_alpha
|
me->set_cell( ip_column = lv_column_alpha
|
||||||
ip_row = lv_row_int
|
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 ).
|
ip_style = <ls_field_catalog>-style_header ).
|
||||||
ELSE.
|
ELSE.
|
||||||
me->set_cell( ip_column = lv_column_alpha
|
me->set_cell( ip_column = lv_column_alpha
|
||||||
ip_row = lv_row_int
|
ip_row = lv_row_int
|
||||||
ip_value = <ls_field_catalog>-scrtext_l ).
|
ip_value = <ls_field_catalog>-column_name ).
|
||||||
ENDIF.
|
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.
|
IF <ls_field_catalog>-column_formula IS NOT INITIAL.
|
||||||
ls_column_formula-id = lines( column_formulas ) + 1.
|
ls_column_formula-id = lines( column_formulas ) + 1.
|
||||||
ls_column_formula-column = lv_column_int.
|
ls_column_formula-column = lv_column_int.
|
||||||
|
@ -1165,7 +1194,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
" totals
|
" totals
|
||||||
*--------------------------------------------------------------------*
|
*--------------------------------------------------------------------*
|
||||||
IF <ls_field_catalog>-totals_function IS NOT INITIAL.
|
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 ).
|
lv_formula = lo_table->get_totals_formula( ip_column = <ls_field_catalog>-column_name ip_function = <ls_field_catalog>-totals_function ).
|
||||||
IF <ls_field_catalog>-style_total IS NOT INITIAL.
|
IF <ls_field_catalog>-style_total IS NOT INITIAL.
|
||||||
me->set_cell( ip_column = lv_column_alpha
|
me->set_cell( ip_column = lv_column_alpha
|
||||||
ip_row = lv_row_int
|
ip_row = lv_row_int
|
||||||
|
@ -2036,6 +2065,281 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
ENDMETHOD. "CONSTRUCTOR
|
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:
|
||||||
|
<lt_data> TYPE STANDARD TABLE,
|
||||||
|
<ls_data> TYPE data,
|
||||||
|
<lv_data> TYPE data,
|
||||||
|
<lt_data2> TYPE STANDARD TABLE,
|
||||||
|
<ls_data2> TYPE data,
|
||||||
|
<lv_data2> TYPE data,
|
||||||
|
<ls_field_conv> TYPE ts_field_conv,
|
||||||
|
<ls_ddic_object> TYPE x031l,
|
||||||
|
<ls_sheet_content> 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 <lt_data>.
|
||||||
|
|
||||||
|
|
||||||
|
" 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 <ls_field_conv>.
|
||||||
|
MOVE-CORRESPONDING ls_field_catalog TO <ls_field_conv>.
|
||||||
|
READ TABLE lt_ddic_object ASSIGNING <ls_ddic_object> WITH KEY fieldname = <ls_field_conv>-fieldname BINARY SEARCH.
|
||||||
|
CHECK: sy-subrc EQ 0.
|
||||||
|
CASE <ls_ddic_object>-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
|
||||||
|
<ls_field_conv>-convexit = cl_abap_typedescr=>typekind_float.
|
||||||
|
WHEN OTHERS.
|
||||||
|
<ls_field_conv>-convexit = <ls_ddic_object>-convexit.
|
||||||
|
ENDCASE.
|
||||||
|
ENDLOOP.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
" Date & Time in excel style
|
||||||
|
LOOP AT me->sheet_content ASSIGNING <ls_sheet_content> WHERE cell_style IS NOT INITIAL AND data_type IS INITIAL.
|
||||||
|
ls_style_conv-cell_style = <ls_sheet_content>-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 <ls_sheet_content> FROM lv_index.
|
||||||
|
AT NEW cell_row.
|
||||||
|
" New line
|
||||||
|
APPEND INITIAL LINE TO <lt_data> ASSIGNING <ls_data>.
|
||||||
|
lv_index = sy-tabix.
|
||||||
|
ENDAT.
|
||||||
|
|
||||||
|
IF <ls_sheet_content>-cell_value IS NOT INITIAL.
|
||||||
|
ASSIGN COMPONENT <ls_sheet_content>-cell_column OF STRUCTURE <ls_data> TO <lv_data>.
|
||||||
|
IF sy-subrc EQ 0.
|
||||||
|
" value
|
||||||
|
<lv_data> = <ls_sheet_content>-cell_value.
|
||||||
|
|
||||||
|
" field conversion
|
||||||
|
READ TABLE lt_field_conv ASSIGNING <ls_field_conv> INDEX <ls_sheet_content>-cell_column.
|
||||||
|
IF sy-subrc EQ 0 AND <ls_field_conv>-convexit IS NOT INITIAL.
|
||||||
|
CASE <ls_field_conv>-convexit.
|
||||||
|
WHEN cl_abap_typedescr=>typekind_float.
|
||||||
|
lv_float = zcl_excel_common=>excel_string_to_number( <ls_sheet_content>-cell_value ).
|
||||||
|
<lv_data> = |{ lv_float NUMBER = RAW }|.
|
||||||
|
WHEN 'ALPHA'.
|
||||||
|
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
|
||||||
|
EXPORTING
|
||||||
|
input = <ls_sheet_content>-cell_value
|
||||||
|
IMPORTING
|
||||||
|
output = <lv_data>.
|
||||||
|
ENDCASE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
" style conversion
|
||||||
|
IF <ls_sheet_content>-cell_style IS NOT INITIAL.
|
||||||
|
READ TABLE lt_style_conv INTO ls_style_conv WITH KEY cell_style = <ls_sheet_content>-cell_style BINARY SEARCH.
|
||||||
|
IF sy-subrc EQ 0.
|
||||||
|
CASE ls_style_conv-abap_type.
|
||||||
|
WHEN cl_abap_typedescr=>typekind_date.
|
||||||
|
<lv_data> = zcl_excel_common=>excel_string_to_date( <ls_sheet_content>-cell_value ).
|
||||||
|
WHEN cl_abap_typedescr=>typekind_time.
|
||||||
|
<lv_data> = zcl_excel_common=>excel_string_to_time( <ls_sheet_content>-cell_value ).
|
||||||
|
ENDCASE.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
" condense
|
||||||
|
CONDENSE <lv_data>.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
AT END OF cell_row.
|
||||||
|
" Delete empty line
|
||||||
|
IF <ls_data> IS INITIAL.
|
||||||
|
DELETE <lt_data> INDEX lv_index.
|
||||||
|
ELSE.
|
||||||
|
APPEND <ls_sheet_content>-cell_row TO lt_map_excel_row.
|
||||||
|
ENDIF.
|
||||||
|
ENDAT.
|
||||||
|
ENDLOOP.
|
||||||
|
*--------------------------------------------------------------------*
|
||||||
|
* End of convert content
|
||||||
|
*--------------------------------------------------------------------*
|
||||||
|
|
||||||
|
|
||||||
|
IF et_data IS SUPPLIED.
|
||||||
|
* MOVE-CORRESPONDING <lt_data> TO et_data.
|
||||||
|
LOOP AT <lt_data> ASSIGNING <ls_data>.
|
||||||
|
APPEND INITIAL LINE TO et_data ASSIGNING <ls_data2>.
|
||||||
|
MOVE-CORRESPONDING <ls_data> TO <ls_data2>.
|
||||||
|
ENDLOOP.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
" Apply conversion exit.
|
||||||
|
LOOP AT lt_field_conv ASSIGNING <ls_field_conv>
|
||||||
|
WHERE convexit = 'ALPHA'.
|
||||||
|
LOOP AT et_data ASSIGNING <ls_data>.
|
||||||
|
ASSIGN COMPONENT <ls_field_conv>-fieldname OF STRUCTURE <ls_data> TO <lv_data>.
|
||||||
|
CHECK: sy-subrc EQ 0 AND <lv_data> IS NOT INITIAL.
|
||||||
|
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
|
||||||
|
EXPORTING
|
||||||
|
input = <lv_data>
|
||||||
|
IMPORTING
|
||||||
|
output = <lv_data>.
|
||||||
|
ENDLOOP.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
METHOD create_data_conv_exit_length.
|
METHOD create_data_conv_exit_length.
|
||||||
DATA: lo_addit TYPE REF TO cl_abap_elemdescr,
|
DATA: lo_addit TYPE REF TO cl_abap_elemdescr,
|
||||||
ls_dfies TYPE dfies,
|
ls_dfies TYPE dfies,
|
||||||
|
@ -2070,11 +2374,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
lv_column = zcl_excel_common=>convert_column2int( ip_cell_column ).
|
lv_column = zcl_excel_common=>convert_column2int( ip_cell_column ).
|
||||||
|
|
||||||
LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS
|
LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS
|
||||||
WHERE
|
WHERE row_from <= ip_cell_row AND row_to >= ip_cell_row
|
||||||
( row_from <= ip_cell_row AND row_to >= ip_cell_row )
|
AND col_from <= lv_column AND col_to >= lv_column.
|
||||||
AND
|
|
||||||
( col_from <= lv_column AND col_to >= lv_column ).
|
|
||||||
|
|
||||||
DELETE me->mt_merged_cells.
|
DELETE me->mt_merged_cells.
|
||||||
EXIT.
|
EXIT.
|
||||||
ENDLOOP.
|
ENDLOOP.
|
||||||
|
@ -2963,7 +3264,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
|
|
||||||
DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog,
|
DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog,
|
||||||
lv_value_lowercase TYPE string,
|
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_long_text TYPE string,
|
||||||
lv_max_length TYPE i,
|
lv_max_length TYPE i,
|
||||||
lv_temp_length TYPE i,
|
lv_temp_length TYPE i,
|
||||||
|
@ -2982,39 +3283,42 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
|
|
||||||
LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true.
|
LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true.
|
||||||
|
|
||||||
CASE iv_default_descr.
|
IF <ls_field_catalog>-column_name IS INITIAL.
|
||||||
WHEN 'M'.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
|
||||||
WHEN 'S'.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt1>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
|
||||||
WHEN 'L'.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt1>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt3>.
|
|
||||||
WHEN OTHERS.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
|
||||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
|
||||||
ENDCASE.
|
|
||||||
|
|
||||||
IF <scrtxt1> IS NOT INITIAL.
|
CASE iv_default_descr.
|
||||||
<ls_field_catalog>-scrtext_l = <scrtxt1>.
|
WHEN 'M'.
|
||||||
ELSEIF <scrtxt2> IS NOT INITIAL.
|
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
||||||
<ls_field_catalog>-scrtext_l = <scrtxt2>.
|
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
||||||
ELSEIF <scrtxt3> IS NOT INITIAL.
|
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||||
<ls_field_catalog>-scrtext_l = <scrtxt3>.
|
WHEN 'S'.
|
||||||
ELSE.
|
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt1>.
|
||||||
<ls_field_catalog>-scrtext_l = 'Column'. " default value as Excel does
|
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
||||||
|
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||||
|
WHEN 'L'.
|
||||||
|
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt1>.
|
||||||
|
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
||||||
|
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt3>.
|
||||||
|
WHEN OTHERS.
|
||||||
|
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
||||||
|
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
||||||
|
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||||
|
ENDCASE.
|
||||||
|
|
||||||
|
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.
|
ENDIF.
|
||||||
|
|
||||||
lv_scrtext_l_initial = <ls_field_catalog>-scrtext_l.
|
lv_scrtext_l_initial = <ls_field_catalog>-column_name.
|
||||||
DESCRIBE FIELD <ls_field_catalog>-scrtext_l LENGTH lv_max_length IN CHARACTER MODE.
|
DESCRIBE FIELD <ls_field_catalog>-column_name LENGTH lv_max_length IN CHARACTER MODE.
|
||||||
DO.
|
DO.
|
||||||
lv_value_lowercase = <ls_field_catalog>-scrtext_l.
|
lv_value_lowercase = <ls_field_catalog>-column_name.
|
||||||
TRANSLATE lv_value_lowercase TO LOWER CASE.
|
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.
|
READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH.
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
|
@ -3024,11 +3328,11 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
lv_syindex = sy-index.
|
lv_syindex = sy-index.
|
||||||
CONCATENATE lv_scrtext_l_initial lv_syindex INTO lv_long_text.
|
CONCATENATE lv_scrtext_l_initial lv_syindex INTO lv_long_text.
|
||||||
IF strlen( lv_long_text ) <= lv_max_length.
|
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.
|
ELSE.
|
||||||
lv_temp_length = strlen( lv_scrtext_l_initial ) - 1.
|
lv_temp_length = strlen( lv_scrtext_l_initial ) - 1.
|
||||||
lv_scrtext_l_initial = substring( val = lv_scrtext_l_initial len = lv_temp_length ).
|
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.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
ENDDO.
|
ENDDO.
|
||||||
|
@ -3498,7 +3802,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
<fs_value> TYPE simple,
|
<fs_value> TYPE simple,
|
||||||
<fs_typekind_int8> TYPE abap_typekind.
|
<fs_typekind_int8> TYPE abap_typekind.
|
||||||
FIELD-SYMBOLS: <fs_column_formula> TYPE mty_s_column_formula.
|
FIELD-SYMBOLS: <fs_column_formula> TYPE mty_s_column_formula.
|
||||||
|
FIELD-SYMBOLS: <ls_fieldcat> TYPE zexcel_s_fieldcatalog.
|
||||||
|
|
||||||
IF ip_value IS NOT SUPPLIED
|
IF ip_value IS NOT SUPPLIED
|
||||||
AND ip_formula IS NOT SUPPLIED
|
AND ip_formula IS NOT SUPPLIED
|
||||||
|
@ -3641,6 +3945,16 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
ENDCASE.
|
ENDCASE.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
|
IF <fs_sheet_content> IS ASSIGNED AND <fs_sheet_content>-table_header IS NOT INITIAL AND lv_value IS NOT INITIAL.
|
||||||
|
READ TABLE <fs_sheet_content>-table->fieldcat ASSIGNING <ls_fieldcat> WITH KEY fieldname = <fs_sheet_content>-table_fieldname.
|
||||||
|
IF sy-subrc = 0.
|
||||||
|
<ls_fieldcat>-column_name = lv_value.
|
||||||
|
IF <ls_fieldcat>-column_name <> lv_value.
|
||||||
|
zcx_excel=>raise_text( 'Cell is table column header - this value is not allowed' ).
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
IF ip_hyperlink IS BOUND.
|
IF ip_hyperlink IS BOUND.
|
||||||
|
@ -3811,6 +4125,23 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
|
||||||
ENDMETHOD. "SET_CELL_STYLE
|
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.
|
METHOD set_column_width.
|
||||||
DATA: lo_column TYPE REF TO zcl_excel_column.
|
DATA: lo_column TYPE REF TO zcl_excel_column.
|
||||||
DATA: width TYPE f.
|
DATA: width TYPE f.
|
||||||
|
|
|
@ -7432,7 +7432,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
|
||||||
SHIFT lv_value LEFT DELETING LEADING '0'.
|
SHIFT lv_value LEFT DELETING LEADING '0'.
|
||||||
lo_element2->set_attribute_ns( name = 'id'
|
lo_element2->set_attribute_ns( name = 'id'
|
||||||
value = lv_value ).
|
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
|
" 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.
|
" 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.
|
ENDLOOP.
|
||||||
|
|
||||||
|
|
||||||
lo_element = lo_document->create_simple_element( name = 'tableStyleInfo'
|
lo_element = lo_document->create_simple_element( name = 'tableStyleInfo'
|
||||||
parent = lo_element_root ).
|
parent = lo_element_root ).
|
||||||
|
|
||||||
lo_element->set_attribute_ns( name = 'name'
|
lo_element->set_attribute_ns( name = 'name'
|
||||||
value = io_table->settings-table_style ).
|
value = io_table->settings-table_style ).
|
||||||
|
|
24
src/zexcel_column_name.dtel.xml
Normal file
24
src/zexcel_column_name.dtel.xml
Normal 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>
|
|
@ -71,6 +71,29 @@
|
||||||
<MASK> TTYPL</MASK>
|
<MASK> TTYPL</MASK>
|
||||||
<COMPTYPE>L</COMPTYPE>
|
<COMPTYPE>L</COMPTYPE>
|
||||||
</DD03P>
|
</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>
|
</DD03P_TABLE>
|
||||||
</asx:values>
|
</asx:values>
|
||||||
</asx:abap>
|
</asx:abap>
|
||||||
|
|
|
@ -111,6 +111,12 @@
|
||||||
<MASK> STRG</MASK>
|
<MASK> STRG</MASK>
|
||||||
<DDTEXT>Column Formula</DDTEXT>
|
<DDTEXT>Column Formula</DDTEXT>
|
||||||
</DD03P>
|
</DD03P>
|
||||||
|
<DD03P>
|
||||||
|
<FIELDNAME>COLUMN_NAME</FIELDNAME>
|
||||||
|
<ROLLNAME>ZEXCEL_COLUMN_NAME</ROLLNAME>
|
||||||
|
<ADMINFIELD>0</ADMINFIELD>
|
||||||
|
<COMPTYPE>E</COMPTYPE>
|
||||||
|
</DD03P>
|
||||||
</DD03P_TABLE>
|
</DD03P_TABLE>
|
||||||
</asx:values>
|
</asx:values>
|
||||||
</asx:abap>
|
</asx:abap>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user