diff --git a/src/demos/zdemo_excel48.prog.abap b/src/demos/zdemo_excel48.prog.abap
new file mode 100644
index 0000000..61cf8fa
--- /dev/null
+++ b/src/demos/zdemo_excel48.prog.abap
@@ -0,0 +1,116 @@
+*&---------------------------------------------------------------------*
+*& Report zdemo_excel48
+*&---------------------------------------------------------------------*
+*&
+*&---------------------------------------------------------------------*
+REPORT zdemo_excel48.
+
+DATA:
+ lo_excel TYPE REF TO zcl_excel,
+ lo_worksheet TYPE REF TO zcl_excel_worksheet,
+ lo_style_1 TYPE REF TO zcl_excel_style,
+ lo_style_2 TYPE REF TO zcl_excel_style,
+ lv_style_1_guid TYPE zexcel_cell_style,
+ lv_style_2_guid TYPE zexcel_cell_style,
+ lv_value TYPE string,
+ ls_rtf TYPE zexcel_s_rtf,
+ lt_rtf TYPE zexcel_t_rtf.
+
+
+CONSTANTS:
+ gc_save_file_name TYPE string VALUE '48_MultipleStylesInOneCell.xlsx'.
+
+INCLUDE zdemo_excel_outputopt_incl.
+
+
+START-OF-SELECTION.
+
+ CREATE OBJECT lo_excel.
+
+ lo_worksheet = lo_excel->get_active_worksheet( ).
+
+ lo_style_1 = lo_excel->add_new_style( ).
+ lo_style_1->font->color-rgb = 'FF000000'.
+
+ lv_value = 'normal red underline normal red-underline bold italic bigger Times-New-Roman'.
+
+ " red
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->color-rgb = 'FFFF0000'.
+ ls_rtf-offset = 7.
+ ls_rtf-length = 3.
+ ls_rtf-font = lo_style_2->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE lt_rtf.
+
+ " underline
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->underline = abap_true.
+ lo_style_2->font->underline_mode = lo_style_2->font->c_underline_single.
+ ls_rtf-offset = 11.
+ ls_rtf-length = 9.
+ ls_rtf-font = lo_style_2->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE lt_rtf.
+
+ " red and underline
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->color-rgb = 'FFFF0000'.
+ lo_style_2->font->underline = abap_true.
+ lo_style_2->font->underline_mode = lo_style_2->font->c_underline_single.
+ ls_rtf-offset = 28.
+ ls_rtf-length = 13.
+ ls_rtf-font = lo_style_2->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE lt_rtf.
+
+ " bold
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->bold = abap_true.
+ ls_rtf-offset = 42.
+ ls_rtf-length = 4.
+ ls_rtf-font = lo_style_2->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE lt_rtf.
+
+ " italic
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->italic = abap_true.
+ ls_rtf-offset = 47.
+ ls_rtf-length = 6.
+ ls_rtf-font = lo_style_2->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE lt_rtf.
+
+ " bigger
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->size = 28.
+ ls_rtf-offset = 54.
+ ls_rtf-length = 6.
+ ls_rtf-font = lo_style_2->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE lt_rtf.
+
+ " Times-New-Roman
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->name = zcl_excel_style_font=>c_name_roman.
+ lo_style_2->font->scheme = zcl_excel_style_font=>c_scheme_none.
+ lo_style_2->font->family = zcl_excel_style_font=>c_family_roman.
+
+ " Create an underline double style
+ lo_style_2 = lo_excel->add_new_style( ).
+ lo_style_2->font->underline = abap_true.
+ lo_style_2->font->underline_mode = zcl_excel_style_font=>c_underline_double.
+ lo_style_2->font->name = zcl_excel_style_font=>c_name_roman.
+ lo_style_2->font->scheme = zcl_excel_style_font=>c_scheme_none.
+ lo_style_2->font->family = zcl_excel_style_font=>c_family_roman.
+ lv_style_2_guid = lo_style_2->get_guid( ).
+ ls_rtf-offset = 61.
+ ls_rtf-length = 15.
+ ls_rtf-font = lo_style_2->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE lt_rtf.
+
+ lv_style_1_guid = lo_style_1->get_guid( ).
+ lo_worksheet->set_cell(
+ ip_column = 'B'
+ ip_row = 2
+ ip_style = lo_style_1->get_guid( )
+ ip_value = lv_value
+ it_rtf = lt_rtf ).
+
+*** Create output
+ lcl_output=>output( lo_excel ).
diff --git a/src/demos/zdemo_excel48.prog.xml b/src/demos/zdemo_excel48.prog.xml
new file mode 100644
index 0000000..6e6c3c2
--- /dev/null
+++ b/src/demos/zdemo_excel48.prog.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+ ZDEMO_EXCEL48
+ S
+ D$
+ 1
+ X
+ D$S
+ X
+
+
+ -
+ R
+ abap2xlsx Demo: multiple styles in one cell
+ 43
+
+
+
+
+
diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap
index 39e0641..b4aab67 100644
--- a/src/zcl_excel_reader_2007.clas.abap
+++ b/src/zcl_excel_reader_2007.clas.abap
@@ -100,8 +100,15 @@ CLASS zcl_excel_reader_2007 DEFINITION
END OF ty_ref_formulae .
TYPES:
tyt_ref_formulae TYPE HASHED TABLE OF ty_ref_formulae WITH UNIQUE KEY sheet row column .
+ TYPES:
+ BEGIN OF t_shared_string,
+ value TYPE string,
+ rtf TYPE zexcel_t_rtf,
+ END OF t_shared_string .
+ TYPES:
+ t_shared_strings TYPE STANDARD TABLE OF t_shared_string WITH DEFAULT KEY .
- DATA shared_strings TYPE stringtab .
+ DATA shared_strings TYPE t_shared_strings .
DATA styles TYPE t_style_refs .
DATA mt_ref_formulae TYPE tyt_ref_formulae .
DATA mt_dxf_styles TYPE zexcel_t_styles_cond_mapping .
@@ -865,10 +872,14 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lo_node_si TYPE REF TO if_ixml_element,
lo_node_si_child TYPE REF TO if_ixml_element,
lo_node_r_child_t TYPE REF TO if_ixml_element,
+ lo_node_r_child_rPr TYPE REF TO if_ixml_element,
+ lo_font TYPE REF TO zcl_excel_style_font,
+ ls_rtf TYPE zexcel_s_rtf,
+ lv_current_offset TYPE int2,
lv_tag_name TYPE string,
lv_node_value TYPE string.
- FIELD-SYMBOLS: LIKE LINE OF me->shared_strings.
+ FIELD-SYMBOLS: LIKE LINE OF me->shared_strings.
*--------------------------------------------------------------------*
@@ -921,7 +932,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lo_node_si ?= lo_shared_strings_xml->find_from_name( 'si' ).
WHILE lo_node_si IS BOUND.
- APPEND INITIAL LINE TO me->shared_strings ASSIGNING . " Each -entry in the xml-file must lead to an entry in our stringtable
+ APPEND INITIAL LINE TO me->shared_strings ASSIGNING . " Each -entry in the xml-file must lead to an entry in our stringtable
lo_node_si_child ?= lo_node_si->get_first_child( ).
IF lo_node_si_child IS BOUND.
lv_tag_name = lo_node_si_child->get_name( ).
@@ -930,7 +941,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
* §1.1 - "simple" strings
* Example: see above
*--------------------------------------------------------------------*
- = lo_node_si_child->get_value( ).
+ -value = lo_node_si_child->get_value( ).
ELSE.
*--------------------------------------------------------------------*
* §1.2 - rich text formatted strings
@@ -938,14 +949,26 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
* as long as rich text formatting is not supported (2do§1) ignore all info about formatting
* Example: see above
*--------------------------------------------------------------------*
+ CLEAR: lv_current_offset.
WHILE lo_node_si_child IS BOUND. " actually these children of are -tags
+ CLEAR: ls_rtf.
+ lo_node_r_child_rpr ?= lo_node_si_child->find_from_name( 'rPr' ). " extracting rich text formating data
+ 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.
lo_node_r_child_t ?= lo_node_si_child->find_from_name( 't' ). " extract the ... part of each -tag
IF lo_node_r_child_t IS BOUND.
lv_node_value = lo_node_r_child_t->get_value( ).
- CONCATENATE lv_node_value INTO RESPECTING BLANKS.
+ CONCATENATE -value lv_node_value INTO -value RESPECTING BLANKS.
+ ls_rtf-length = strlen( lv_node_value ).
ENDIF.
+ lv_current_offset = strlen( -value ).
+ APPEND ls_rtf TO -rtf.
+
lo_node_si_child ?= lo_node_si_child->get_next( ).
ENDWHILE.
@@ -1546,6 +1569,11 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lo_node2 = lo_node_font->find_from_name( 'name' ).
IF lo_node2 IS BOUND.
lo_font->name = lo_node2->get_attribute( 'val' ).
+ ELSE.
+ lo_node2 = lo_node_font->find_from_name( 'rFont' ).
+ IF lo_node2 IS BOUND.
+ lo_font->name = lo_node2->get_attribute( 'val' ).
+ ENDIF.
ENDIF.
*--------------------------------------------------------------------*
@@ -2342,8 +2370,12 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lo_data_validation TYPE REF TO zcl_excel_data_validation,
lv_datavalidation_range TYPE string,
lt_datavalidation_range TYPE TABLE OF string,
+ lt_rtf TYPE zexcel_t_rtf,
ex TYPE REF TO cx_root.
+ FIELD-SYMBOLS:
+ TYPE t_shared_string.
+
*--------------------------------------------------------------------*
* §2 We need to read the the file "\\_rels\.rels" because it tells
* us where in this folder structure the data for the workbook
@@ -2483,7 +2515,11 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
WHEN 's'. " String values are stored as index in shared string table
IF lo_ixml_value_elem IS BOUND.
lv_index = lo_ixml_value_elem->get_value( ) + 1.
- READ TABLE shared_strings INTO lv_cell_value INDEX lv_index.
+ READ TABLE shared_strings ASSIGNING INDEX lv_index.
+ IF sy-subrc = 0.
+ lv_cell_value = -value.
+ lt_rtf = -rtf.
+ ENDIF.
ENDIF.
WHEN 'inlineStr'. " inlineStr values are kept in special node
lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name( name = 'is' ).
@@ -2560,7 +2596,8 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ip_value = lv_cell_value " cell_elem Value
ip_formula = lv_cell_formula
ip_data_type = ls_cell-t
- ip_style = lv_style_guid ).
+ ip_style = lv_style_guid
+ it_rtf = lt_rtf ).
ENDIF.
lo_ixml_cell_elem ?= lo_ixml_iterator2->get_next( ).
ENDWHILE.
diff --git a/src/zcl_excel_reader_huge_file.clas.abap b/src/zcl_excel_reader_huge_file.clas.abap
index ba411f3..1a2c9ed 100644
--- a/src/zcl_excel_reader_huge_file.clas.abap
+++ b/src/zcl_excel_reader_huge_file.clas.abap
@@ -141,14 +141,16 @@ CLASS zcl_excel_reader_huge_file IMPLEMENTATION.
METHOD get_shared_string.
DATA: lv_tabix TYPE i,
lv_error TYPE string.
+ FIELD-SYMBOLS: TYPE t_shared_string.
lv_tabix = iv_index + 1.
- READ TABLE shared_strings INTO ev_value INDEX lv_tabix.
+ READ TABLE shared_strings ASSIGNING INDEX lv_tabix.
IF sy-subrc NE 0.
CONCATENATE 'Entry ' iv_index ' not found in Shared String Table' INTO lv_error.
RAISE EXCEPTION TYPE lcx_not_found
EXPORTING
error = lv_error.
ENDIF.
+ ev_value = -value.
ENDMETHOD.
@@ -190,10 +192,17 @@ CLASS zcl_excel_reader_huge_file IMPLEMENTATION.
METHOD load_shared_strings.
DATA: lo_reader TYPE REF TO if_sxml_reader.
+ DATA: lt_shared_strings TYPE TABLE OF string,
+ ls_shared_string TYPE t_shared_string.
+ FIELD-SYMBOLS: TYPE string.
lo_reader = get_sxml_reader( ip_path ).
- shared_strings = read_shared_strings( lo_reader ).
+ lt_shared_strings = read_shared_strings( lo_reader ).
+ LOOP AT lt_shared_strings ASSIGNING .
+ ls_shared_string-value = .
+ APPEND ls_shared_string TO shared_strings.
+ ENDLOOP.
ENDMETHOD.
diff --git a/src/zcl_excel_reader_huge_file.clas.testclasses.abap b/src/zcl_excel_reader_huge_file.clas.testclasses.abap
index 909833d..25cfe88 100644
--- a/src/zcl_excel_reader_huge_file.clas.testclasses.abap
+++ b/src/zcl_excel_reader_huge_file.clas.testclasses.abap
@@ -51,8 +51,11 @@ class lcl_test implementation.
*
method test_shared_string.
data lo_reader type ref to if_sxml_reader.
- append `Test1` to out->shared_strings.
- append `Test2` to out->shared_strings.
+ data: ls_shared_string type zcl_excel_reader_huge_file=>t_shared_string.
+ ls_shared_string-value = `Test1`.
+ append ls_shared_string to out->shared_strings.
+ ls_shared_string-value = `Test2`.
+ append ls_shared_string to out->shared_strings.
lo_reader = get_reader(
`1`
).
@@ -66,7 +69,9 @@ class lcl_test implementation.
data: lo_reader type ref to if_sxml_reader,
lo_ex type ref to lcx_not_found,
lv_text type string.
- append `Test` to out->shared_strings.
+ data: ls_shared_string type zcl_excel_reader_huge_file=>t_shared_string.
+ ls_shared_string-value = `Test`.
+ append ls_shared_string to out->shared_strings.
lo_reader = get_reader(
`1`
).
@@ -118,8 +123,11 @@ class lcl_test implementation.
* There is no need to store an empty cell in the ABAP worksheet structure
data: lo_reader type ref to if_sxml_reader.
- append `` to out->shared_strings.
- append `t` to out->shared_strings.
+ data: ls_shared_string type zcl_excel_reader_huge_file=>t_shared_string.
+ ls_shared_string-value = ``.
+ append ls_shared_string to out->shared_strings.
+ ls_shared_string-value = `t`.
+ append ls_shared_string to out->shared_strings.
lo_reader = get_reader(
`0` &
`` &
diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap
index 029418d..3d74467 100644
--- a/src/zcl_excel_worksheet.clas.abap
+++ b/src/zcl_excel_worksheet.clas.abap
@@ -317,6 +317,7 @@ CLASS zcl_excel_worksheet DEFINITION
!ep_style TYPE REF TO zcl_excel_style
!ep_guid TYPE zexcel_cell_style
!ep_formula TYPE zexcel_cell_formula
+ !et_rtf TYPE zexcel_t_rtf
RAISING
zcx_excel .
METHODS get_column
@@ -462,6 +463,7 @@ CLASS zcl_excel_worksheet DEFINITION
!ip_hyperlink TYPE REF TO zcl_excel_hyperlink OPTIONAL
!ip_data_type TYPE zexcel_cell_data_type OPTIONAL
!ip_abap_type TYPE abap_typekind OPTIONAL
+ !it_rtf TYPE zexcel_t_rtf OPTIONAL
!ip_column_formula_id TYPE mty_s_column_formula-id OPTIONAL
RAISING
zcx_excel .
@@ -697,6 +699,14 @@ CLASS zcl_excel_worksheet DEFINITION
ip_column TYPE zexcel_cell_column
RAISING
zcx_excel.
+ METHODS check_rtf
+ IMPORTING
+ !ip_value TYPE simple
+ VALUE(ip_style) TYPE zexcel_cell_style OPTIONAL
+ CHANGING
+ !ct_rtf TYPE zexcel_t_rtf
+ RAISING
+ zcx_excel .
METHODS generate_title
RETURNING
VALUE(ep_title) TYPE zexcel_sheet_title .
@@ -1831,6 +1841,62 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDMETHOD.
+ METHOD check_rtf.
+
+ DATA: lo_style TYPE REF TO zcl_excel_style,
+ lo_iterator TYPE REF TO cl_object_collection_iterator,
+ lv_next_rtf_offset TYPE i,
+ lv_tabix TYPE i,
+ lv_value TYPE string,
+ lv_val_length TYPE i,
+ ls_rtf LIKE LINE OF ct_rtf.
+ FIELD-SYMBOLS: LIKE LINE OF ct_rtf.
+
+ IF ip_style IS NOT SUPPLIED.
+ ip_style = excel->get_default_style( ).
+ ENDIF.
+
+ lo_iterator = excel->get_styles_iterator( ).
+ WHILE lo_iterator->has_next( ) = abap_true.
+ lo_style ?= lo_iterator->get_next( ).
+ IF lo_style->get_guid( ) = ip_style.
+ EXIT.
+ ENDIF.
+ CLEAR lo_style.
+ ENDWHILE.
+
+ lv_next_rtf_offset = 0.
+ LOOP AT ct_rtf ASSIGNING .
+ lv_tabix = sy-tabix.
+ IF lv_next_rtf_offset < -offset.
+ ls_rtf-offset = lv_next_rtf_offset.
+ ls_rtf-length = -offset - lv_next_rtf_offset.
+ ls_rtf-font = lo_style->font->get_structure( ).
+ INSERT ls_rtf INTO ct_rtf INDEX lv_tabix.
+ ELSEIF lv_next_rtf_offset > -offset.
+ RAISE EXCEPTION TYPE zcx_excel
+ EXPORTING
+ error = 'Gaps or overlaps in RTF data offset/length specs'.
+ ENDIF.
+ lv_next_rtf_offset = -offset + -length.
+ ENDLOOP.
+
+ lv_value = ip_value.
+ lv_val_length = strlen( lv_value ).
+ IF lv_val_length > lv_next_rtf_offset.
+ ls_rtf-offset = lv_next_rtf_offset.
+ ls_rtf-length = lv_val_length - lv_next_rtf_offset.
+ ls_rtf-font = lo_style->font->get_structure( ).
+ INSERT ls_rtf INTO TABLE ct_rtf.
+ ELSEIF lv_val_length > lv_next_rtf_offset.
+ RAISE EXCEPTION TYPE zcx_excel
+ EXPORTING
+ error = 'RTF specs length is not equal to value length'.
+ ENDIF.
+
+ ENDMETHOD.
+
+
METHOD class_constructor.
c_messages-formula_id_only_is_possible = |{ 'If Formula ID is used, value and formula must be empty'(008) }|.
@@ -2010,6 +2076,9 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ep_value = ls_sheet_content-cell_value.
ep_guid = ls_sheet_content-cell_style. " issue 139 - added this to be used for columnwidth calculation
ep_formula = ls_sheet_content-cell_formula.
+ IF et_rtf IS SUPPLIED AND ls_sheet_content-rtf_tab IS NOT INITIAL.
+ et_rtf = ls_sheet_content-rtf_tab.
+ ENDIF.
" Addition to solve issue #120, contribution by Stefan Schmöcker
DATA: style_iterator TYPE REF TO cl_object_collection_iterator,
@@ -3017,6 +3086,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
lv_value_type TYPE abap_typekind,
lv_style_guid TYPE zexcel_cell_style,
lo_addit TYPE REF TO cl_abap_elemdescr,
+ lt_rtf TYPE zexcel_t_rtf,
lo_value TYPE REF TO data,
lo_value_new TYPE REF TO data.
@@ -3213,6 +3283,14 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDIF.
+ IF ip_formula IS INITIAL AND lv_value IS NOT INITIAL AND it_rtf IS NOT INITIAL.
+ lt_rtf = it_rtf.
+ check_rtf( EXPORTING ip_value = lv_value
+ ip_style = lv_style_guid
+ CHANGING ct_rtf = lt_rtf ).
+ -rtf_tab = lt_rtf.
+ ENDIF.
+
* Begin of change issue #152 - don't touch exisiting style if only value is passed
* For Date- or Timefields change the formatcode if nothing is set yet
* Enhancement option: Check if existing formatcode is a date/ or timeformat
diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap
index ba8fb15..f59e0bd 100644
--- a/src/zcl_excel_writer_2007.clas.abap
+++ b/src/zcl_excel_writer_2007.clas.abap
@@ -155,7 +155,8 @@ CLASS zcl_excel_writer_2007 DEFINITION
IMPORTING
!io_document TYPE REF TO if_ixml_document
!io_parent TYPE REF TO if_ixml_element
- !is_font TYPE zexcel_s_style_font .
+ !is_font TYPE zexcel_s_style_font
+ !iv_use_rtf TYPE abap_bool DEFAULT abap_false .
METHODS create_xl_table
IMPORTING
!io_table TYPE REF TO zcl_excel_table
@@ -170,6 +171,7 @@ CLASS zcl_excel_writer_2007 DEFINITION
METHODS get_shared_string_index
IMPORTING
!ip_cell_value TYPE zexcel_cell_value
+ !it_rtf TYPE zexcel_t_rtf OPTIONAL
RETURNING
VALUE(ep_index) TYPE int4 .
METHODS create_xl_drawings_vml
@@ -3546,6 +3548,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
DATA: lc_xml_node_sst TYPE string VALUE 'sst',
lc_xml_node_si TYPE string VALUE 'si',
lc_xml_node_t TYPE string VALUE 't',
+ lc_xml_node_r TYPE string VALUE 'r',
+ lc_xml_node_rpr TYPE string VALUE 'rPr',
" Node attributes
lc_xml_attr_count TYPE string VALUE 'count',
lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount',
@@ -3556,10 +3560,14 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_element_root TYPE REF TO if_ixml_element,
lo_element TYPE REF TO if_ixml_element,
lo_sub_element TYPE REF TO if_ixml_element,
+ lo_sub2_element TYPE REF TO if_ixml_element,
+ lo_font_element TYPE REF TO if_ixml_element,
lo_iterator TYPE REF TO cl_object_collection_iterator,
lo_worksheet TYPE REF TO zcl_excel_worksheet.
DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted,
+ lt_cell_data_rtf TYPE zexcel_t_cell_data_unsorted,
+ lv_value TYPE string,
ls_shared_string TYPE zexcel_s_shared_string,
lv_count_str TYPE string,
lv_uniquecount_str TYPE string,
@@ -3568,6 +3576,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lv_uniquecount TYPE i.
FIELD-SYMBOLS: TYPE zexcel_s_cell_data,
+ TYPE zexcel_s_rtf,
TYPE zexcel_s_shared_string.
**********************************************************************
@@ -3584,12 +3593,25 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
DESCRIBE TABLE lt_cell_data LINES lv_count.
MOVE lv_count TO lv_count_str.
+ " separating plain and rich text format strings
+ lt_cell_data_rtf = lt_cell_data.
+ DELETE lt_cell_data WHERE rtf_tab IS NOT INITIAL.
+ DELETE lt_cell_data_rtf WHERE rtf_tab IS INITIAL.
+
SHIFT lv_count_str RIGHT DELETING TRAILING space.
SHIFT lv_count_str LEFT DELETING LEADING space.
SORT lt_cell_data BY cell_value data_type.
DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value data_type.
+ " leave unique rich text format strings
+ SORT lt_cell_data_rtf BY cell_value rtf_tab.
+ DELETE ADJACENT DUPLICATES FROM lt_cell_data_rtf COMPARING cell_value rtf_tab.
+ " merge into single list
+ APPEND LINES OF lt_cell_data_rtf TO lt_cell_data.
+ SORT lt_cell_data BY cell_value rtf_tab.
+ FREE lt_cell_data_rtf.
+
DESCRIBE TABLE lt_cell_data LINES lv_uniquecount.
MOVE lv_uniquecount TO lv_uniquecount_str.
@@ -3603,6 +3625,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
MOVE lv_sytabix TO ls_shared_string-string_no.
MOVE -cell_value TO ls_shared_string-string_value.
MOVE -data_type TO ls_shared_string-string_type.
+ ls_shared_string-rtf_tab = -rtf_tab.
INSERT ls_shared_string INTO TABLE shared_strings.
ADD 1 TO lv_count.
ENDLOOP.
@@ -3628,6 +3651,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
LOOP AT shared_strings ASSIGNING .
lo_element = lo_document->create_simple_element( name = lc_xml_node_si
parent = lo_document ).
+ IF -rtf_tab IS INITIAL.
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t
parent = lo_document ).
IF boolc( contains( val = -string_value start = ` ` ) ) = abap_true
@@ -3635,6 +3659,34 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_sub_element->set_attribute( name = 'space' namespace = 'xml' value = 'preserve' ).
ENDIF.
lo_sub_element->set_value( value = -string_value ).
+ ELSE.
+ LOOP AT -rtf_tab ASSIGNING .
+ lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_r
+ parent = lo_element ).
+ TRY.
+ lv_value = substring( val = -string_value
+ off = -offset
+ len = -length ).
+ CATCH cx_sy_range_out_of_bounds.
+ EXIT.
+ ENDTRY.
+ IF -font IS NOT INITIAL.
+ lo_font_element = lo_document->create_simple_element( name = lc_xml_node_rpr
+ parent = lo_sub_element ).
+ create_xl_styles_font_node( io_document = lo_document
+ io_parent = lo_font_element
+ is_font = -font
+ iv_use_rtf = abap_true ).
+ ENDIF.
+ lo_sub2_element = lo_document->create_simple_element( name = lc_xml_node_t
+ parent = lo_sub_element ).
+ IF boolc( contains( val = lv_value start = ` ` ) ) = abap_true
+ OR boolc( contains( val = lv_value end = ` ` ) ) = abap_true.
+ lo_sub2_element->set_attribute( name = 'space' namespace = 'xml' value = 'preserve' ).
+ ENDIF.
+ lo_sub2_element->set_value( lv_value ).
+ ENDLOOP.
+ ENDIF.
lo_element->append_child( new_child = lo_sub_element ).
lo_element_root->append_child( new_child = lo_element ).
ENDLOOP.
@@ -6227,7 +6279,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
parent = io_document ).
IF -data_type EQ 's' OR -data_type EQ 's_leading_blanks'.
- lv_value = me->get_shared_string_index( -cell_value ).
+ lv_value = me->get_shared_string_index( ip_cell_value = -cell_value
+ it_rtf = -rtf_tab ).
CONDENSE lv_value.
lo_element_4->set_value( value = lv_value ).
ELSE.
@@ -7231,6 +7284,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough
lc_xml_node_sz TYPE string VALUE 'sz',
lc_xml_node_name TYPE string VALUE 'name',
+ lc_xml_node_rfont TYPE string VALUE 'rFont',
lc_xml_node_family TYPE string VALUE 'family',
lc_xml_node_scheme TYPE string VALUE 'scheme',
lc_xml_attr_val TYPE string VALUE 'val'.
@@ -7284,8 +7338,13 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
is_color = ls_font-color ).
"name
+ IF iv_use_rtf = abap_false.
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name
parent = lo_document ).
+ ELSE.
+ lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_rfont
+ parent = lo_document ).
+ ENDIF.
lv_value = ls_font-name.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_val
value = lv_value ).
@@ -7845,8 +7904,17 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
DATA ls_shared_string TYPE zexcel_s_shared_string.
* READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value BINARY SEARCH.
+ IF it_rtf IS INITIAL.
READ TABLE shared_strings INTO ls_shared_string WITH TABLE KEY string_value = ip_cell_value.
ep_index = ls_shared_string-string_no.
+ ELSE.
+ LOOP AT shared_strings INTO ls_shared_string WHERE string_value = ip_cell_value
+ AND rtf_tab = it_rtf.
+
+ ep_index = ls_shared_string-string_no.
+ EXIT.
+ ENDLOOP.
+ ENDIF.
ENDMETHOD.
diff --git a/src/zcl_excel_writer_huge_file.clas.abap b/src/zcl_excel_writer_huge_file.clas.abap
index b8bce81..0ad113d 100644
--- a/src/zcl_excel_writer_huge_file.clas.abap
+++ b/src/zcl_excel_writer_huge_file.clas.abap
@@ -804,7 +804,8 @@ CLASS zcl_excel_writer_huge_file IMPLEMENTATION.
-formula = -cell_formula.
-type = -data_type.
IF -type = 's'.
- -value = me->get_shared_string_index( -cell_value ).
+ -value = me->get_shared_string_index( ip_cell_value = -cell_value
+ ir_rtf = -rtf_tab ).
ELSE.
-value = -cell_value.
ENDIF.
diff --git a/src/zexcel_s_cell_data.tabl.xml b/src/zexcel_s_cell_data.tabl.xml
index f498d92..124995e 100644
--- a/src/zexcel_s_cell_data.tabl.xml
+++ b/src/zexcel_s_cell_data.tabl.xml
@@ -63,6 +63,14 @@
INT4
Column Formula ID
+
+ RTF_TAB
+ ZEXCEL_T_RTF
+ 0
+ TTYP
+ TTYPL
+ L
+
diff --git a/src/zexcel_s_rtf.tabl.xml b/src/zexcel_s_rtf.tabl.xml
new file mode 100644
index 0000000..515e2cf
--- /dev/null
+++ b/src/zexcel_s_rtf.tabl.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+ ZEXCEL_S_RTF
+ E
+ INTTAB
+ Rich Text Formating Data Record
+ 4
+
+
+
+ OFFSET
+ INT2
+ 0
+ E
+
+
+ LENGTH
+ INT2
+ 0
+ E
+
+
+ FONT
+ ZEXCEL_S_STYLE_FONT
+ 0
+ STRU
+ STRUS
+ S
+
+
+
+
+
diff --git a/src/zexcel_s_shared_string.tabl.xml b/src/zexcel_s_shared_string.tabl.xml
index d3a1fee..f784fad 100644
--- a/src/zexcel_s_shared_string.tabl.xml
+++ b/src/zexcel_s_shared_string.tabl.xml
@@ -7,6 +7,7 @@
E
INTTAB
Shared strings
+ E
1
@@ -28,6 +29,14 @@
0
E
+
+ RTF_TAB
+ ZEXCEL_T_RTF
+ 0
+ TTYP
+ TTYPL
+ L
+
diff --git a/src/zexcel_t_rtf.ttyp.xml b/src/zexcel_t_rtf.ttyp.xml
new file mode 100644
index 0000000..d5c0335
--- /dev/null
+++ b/src/zexcel_t_rtf.ttyp.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+ ZEXCEL_T_RTF
+ E
+ ZEXCEL_S_RTF
+ S
+ STRU
+ S
+ K
+ U
+ 0001
+ Rich Text Formating Data
+
+
+
+ ZEXCEL_T_RTF
+ 0001
+ 0001
+ OFFSET
+
+
+
+
+
| | | | | |