diff --git a/src/zcl_excel.clas.abap b/src/zcl_excel.clas.abap
index d04def2..58d8f7f 100644
--- a/src/zcl_excel.clas.abap
+++ b/src/zcl_excel.clas.abap
@@ -21,6 +21,9 @@ public section.
value(RO_AUTOFILTER) type ref to ZCL_EXCEL_AUTOFILTER
raising
ZCX_EXCEL .
+ methods ADD_NEW_COMMENT
+ returning
+ value(EO_COMMENT) type ref to ZCL_EXCEL_COMMENT .
methods ADD_NEW_DRAWING
importing
!IP_TYPE type ZEXCEL_DRAWING_TYPE default ZCL_EXCEL_DRAWING=>TYPE_IMAGE
@@ -160,6 +163,7 @@ private section.
data T_STYLEMAPPING1 type ZEXCEL_T_STYLEMAPPING1 .
data T_STYLEMAPPING2 type ZEXCEL_T_STYLEMAPPING2 .
data THEME type ref to ZCL_EXCEL_THEME .
+ data COMMENTS type ref to ZCL_EXCEL_COMMENTS .
methods GET_STYLE_FROM_GUID
importing
@@ -184,6 +188,13 @@ METHOD add_new_autofilter.
ENDMETHOD.
+METHOD add_new_comment.
+ CREATE OBJECT eo_comment.
+
+ comments->add( eo_comment ).
+ENDMETHOD.
+
+
method ADD_NEW_DRAWING.
* Create default blank worksheet
CREATE OBJECT eo_drawing
@@ -276,6 +287,7 @@ method CONSTRUCTOR.
CREATE OBJECT charts
EXPORTING
ip_type = zcl_excel_drawing=>type_chart.
+ CREATE OBJECT comments.
CREATE OBJECT legacy_palette.
CREATE OBJECT autofilters.
diff --git a/src/zcl_excel_comment.clas.abap b/src/zcl_excel_comment.clas.abap
new file mode 100644
index 0000000..c2a2ffc
--- /dev/null
+++ b/src/zcl_excel_comment.clas.abap
@@ -0,0 +1,71 @@
+class ZCL_EXCEL_COMMENT definition
+ public
+ final
+ create public .
+
+public section.
+ type-pools ABAP .
+
+ methods CONSTRUCTOR .
+ methods GET_NAME
+ returning
+ value(R_NAME) type STRING .
+ methods GET_INDEX
+ returning
+ value(RP_INDEX) type STRING .
+ methods GET_REF
+ returning
+ value(RP_REF) type STRING .
+ methods GET_TEXT
+ returning
+ value(RP_TEXT) type STRING .
+ methods SET_TEXT
+ importing
+ !IP_TEXT type STRING
+ !IP_REF type STRING optional .
+protected section.
+private section.
+
+ data INDEX type STRING .
+ data REF type STRING .
+ data TEXT type STRING .
+ENDCLASS.
+
+
+
+CLASS ZCL_EXCEL_COMMENT IMPLEMENTATION.
+
+
+METHOD constructor.
+
+ ENDMETHOD.
+
+
+METHOD get_index.
+ rp_index = me->index.
+ ENDMETHOD.
+
+
+METHOD get_name.
+
+ ENDMETHOD.
+
+
+METHOD get_ref.
+ rp_ref = me->ref.
+ENDMETHOD.
+
+
+method GET_TEXT.
+ rp_text = me->text.
+endmethod.
+
+
+METHOD set_text.
+ me->text = ip_text.
+
+ IF ip_ref IS SUPPLIED.
+ me->ref = ip_ref.
+ ENDIF.
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/zcl_excel_comment.clas.xml b/src/zcl_excel_comment.clas.xml
new file mode 100644
index 0000000..e0a1672
--- /dev/null
+++ b/src/zcl_excel_comment.clas.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+ ZCL_EXCEL_COMMENT
+ 1
+ E
+ Comment
+ 1
+ X
+ X
+ X
+
+
+
+ ZCL_EXCEL_COMMENT
+ CONSTRUCTOR
+ E
+ CONSTRUCTOR
+
+
+ ZCL_EXCEL_COMMENT
+ GET_INDEX
+ E
+ Get index
+
+
+ ZCL_EXCEL_COMMENT
+ GET_REF
+ E
+ Get reference
+
+
+ ZCL_EXCEL_COMMENT
+ GET_TEXT
+ E
+ Get text
+
+
+ ZCL_EXCEL_COMMENT
+ INDEX
+ E
+ Index in collection
+
+
+ ZCL_EXCEL_COMMENT
+ REF
+ E
+ Reference to cell (eg. 'B13')
+
+
+ ZCL_EXCEL_COMMENT
+ SET_TEXT
+ E
+ Set text
+
+
+ ZCL_EXCEL_COMMENT
+ TEXT
+ E
+ Comment
+
+
+
+
+
diff --git a/src/zcl_excel_comments.clas.abap b/src/zcl_excel_comments.clas.abap
new file mode 100644
index 0000000..a0c8372
--- /dev/null
+++ b/src/zcl_excel_comments.clas.abap
@@ -0,0 +1,100 @@
+class ZCL_EXCEL_COMMENTS definition
+ public
+ final
+ create public .
+
+public section.
+
+ methods ADD
+ importing
+ !IP_COMMENT type ref to ZCL_EXCEL_COMMENT .
+ methods INCLUDE
+ importing
+ !IP_COMMENT type ref to ZCL_EXCEL_COMMENT .
+ methods CLEAR .
+ methods CONSTRUCTOR .
+ methods GET
+ importing
+ !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET
+ returning
+ value(EO_COMMENT) type ref to ZCL_EXCEL_COMMENT .
+ methods GET_ITERATOR
+ returning
+ value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR .
+ methods IS_EMPTY
+ returning
+ value(IS_EMPTY) type FLAG .
+ methods REMOVE
+ importing
+ !IP_COMMENT type ref to ZCL_EXCEL_COMMENT .
+ methods SIZE
+ returning
+ value(EP_SIZE) type I .
+protected section.
+private section.
+
+ data COMMENTS type ref to CL_OBJECT_COLLECTION .
+ENDCLASS.
+
+
+
+CLASS ZCL_EXCEL_COMMENTS IMPLEMENTATION.
+
+
+METHOD add.
+ DATA: lv_index TYPE i.
+
+ comments->add( ip_comment ).
+ lv_index = comments->if_object_collection~size( ).
+
+ENDMETHOD.
+
+
+METHOD clear.
+ comments->clear( ).
+
+ENDMETHOD.
+
+
+METHOD constructor.
+ CREATE OBJECT comments.
+
+ENDMETHOD.
+
+
+method GET.
+ DATA lv_index TYPE i.
+ lv_index = ip_index.
+ eo_comment ?= comments->if_object_collection~get( lv_index ).
+
+endmethod.
+
+
+method GET_ITERATOR.
+
+ eo_iterator ?= comments->if_object_collection~get_iterator( ).
+ endmethod.
+
+
+METHOD include.
+ comments->add( ip_comment ).
+ENDMETHOD.
+
+
+method IS_EMPTY.
+
+ is_empty = comments->if_object_collection~is_empty( ).
+ endmethod.
+
+
+method REMOVE.
+
+ comments->remove( ip_comment ).
+ endmethod.
+
+
+method SIZE.
+
+ ep_size = comments->if_object_collection~size( ).
+ endmethod.
+ENDCLASS.
diff --git a/src/zcl_excel_comments.clas.xml b/src/zcl_excel_comments.clas.xml
new file mode 100644
index 0000000..dd47e6b
--- /dev/null
+++ b/src/zcl_excel_comments.clas.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+ ZCL_EXCEL_COMMENTS
+ 1
+ E
+ Comments collection
+ 1
+ X
+ X
+ X
+
+
+
+ ZCL_EXCEL_COMMENTS
+ ADD
+ E
+ Adds an Element to the Collection
+
+
+ ZCL_EXCEL_COMMENTS
+ CLEAR
+ E
+ Initializes the Collection
+
+
+ ZCL_EXCEL_COMMENTS
+ CONSTRUCTOR
+ E
+ CONSTRUCTOR
+
+
+ ZCL_EXCEL_COMMENTS
+ GET
+ E
+ Gets Element
+
+
+ ZCL_EXCEL_COMMENTS
+ GET_ITERATOR
+ E
+ Returns an iterator
+
+
+ ZCL_EXCEL_COMMENTS
+ INCLUDE
+ E
+ Adds an Element to the Collection
+
+
+ ZCL_EXCEL_COMMENTS
+ IS_EMPTY
+ E
+ Checks whether elements are contained
+
+
+ ZCL_EXCEL_COMMENTS
+ REMOVE
+ E
+ Deletes an Element from the Collection
+
+
+ ZCL_EXCEL_COMMENTS
+ SIZE
+ E
+ Specifies number of contained elements
+
+
+
+
+
diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap
index 02d0a03..e2149e1 100644
--- a/src/zcl_excel_worksheet.clas.abap
+++ b/src/zcl_excel_worksheet.clas.abap
@@ -33,6 +33,9 @@ class ZCL_EXCEL_WORKSHEET definition
data STYLES type ZEXCEL_T_SHEET_STYLE .
data TABCOLOR type ZEXCEL_S_TABCOLOR read-only .
+ methods ADD_COMMENT
+ importing
+ !IP_COMMENT type ref to ZCL_EXCEL_COMMENT .
methods ADD_DRAWING
importing
!IP_DRAWING type ref to ZCL_EXCEL_DRAWING .
@@ -293,11 +296,17 @@ class ZCL_EXCEL_WORKSHEET definition
value(EP_DIMENSION_RANGE) type STRING
raising
ZCX_EXCEL .
+ methods GET_COMMENTS
+ returning
+ value(R_COMMENTS) type ref to ZCL_EXCEL_COMMENTS .
methods GET_DRAWINGS
importing
!IP_TYPE type ZEXCEL_DRAWING_TYPE optional
returning
value(R_DRAWINGS) type ref to ZCL_EXCEL_DRAWINGS .
+ methods GET_COMMENTS_ITERATOR
+ returning
+ value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR .
methods GET_DRAWINGS_ITERATOR
importing
!IP_TYPE type ZEXCEL_DRAWING_TYPE
@@ -575,6 +584,7 @@ methods SET_AREA_STYLE
data DATA_VALIDATIONS type ref to ZCL_EXCEL_DATA_VALIDATIONS .
data DEFAULT_EXCEL_DATE_FORMAT type ZEXCEL_NUMBER_FORMAT .
data DEFAULT_EXCEL_TIME_FORMAT type ZEXCEL_NUMBER_FORMAT .
+ data COMMENTS type ref to ZCL_EXCEL_COMMENTS .
data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS .
data FREEZE_PANE_CELL_COLUMN type ZEXCEL_CELL_COLUMN .
data FREEZE_PANE_CELL_ROW type ZEXCEL_CELL_ROW .
@@ -623,6 +633,11 @@ ENDCLASS.
CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
+ METHOD add_comment.
+ comments->include( ip_comment ).
+ ENDMETHOD.
+
+
method ADD_DRAWING.
case IP_DRAWING->GET_TYPE( ).
when ZCL_EXCEL_DRAWING=>TYPE_IMAGE.
@@ -3724,6 +3739,7 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
ME->ZIF_EXCEL_SHEET_PROTECTION~INITIALIZE( ).
ME->ZIF_EXCEL_SHEET_PROPERTIES~INITIALIZE( ).
create object HYPERLINKS.
+ CREATE OBJECT comments. " (+) Issue #180
* initialize active cell coordinates
ACTIVE_CELL-CELL_ROW = 1.
@@ -3900,6 +3916,27 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
endmethod.
+ METHOD get_comments.
+ DATA: lo_comment TYPE REF TO zcl_excel_comment,
+ lo_iterator TYPE REF TO cl_object_collection_iterator.
+
+ CREATE OBJECT r_comments.
+
+ lo_iterator = comments->get_iterator( ).
+ WHILE lo_iterator->has_next( ) = abap_true.
+ lo_comment ?= lo_iterator->get_next( ).
+ r_comments->include( lo_comment ).
+ ENDWHILE.
+
+ ENDMETHOD.
+
+
+ METHOD get_comments_iterator.
+ eo_iterator = comments->get_iterator( ).
+
+ ENDMETHOD.
+
+
method GET_DATA_VALIDATIONS_ITERATOR.
EO_ITERATOR = ME->DATA_VALIDATIONS->GET_ITERATOR( ).
diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap
index 23336b6..a2f7b17 100644
--- a/src/zcl_excel_writer_2007.clas.abap
+++ b/src/zcl_excel_writer_2007.clas.abap
@@ -31,6 +31,8 @@ protected section.
data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING .
data STYLES_COND_MAPPING type ZEXCEL_T_STYLES_COND_MAPPING .
data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING .
+ constants C_XL_COMMENTS type STRING value 'xl/comments#.xml' ##NO_TEXT.
+ constants CL_XL_DRAWING_FOR_COMMENTS type STRING value 'xl/drawings/vmlDrawing#.vml' ##NO_TEXT.
methods CREATE_XL_SHEET_SHEET_DATA
importing
@@ -71,6 +73,11 @@ protected section.
!IO_DRAWING type ref to ZCL_EXCEL_DRAWING
returning
value(EP_CONTENT) type XSTRING .
+ methods CREATE_XL_COMMENTS
+ importing
+ !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
+ returning
+ value(EP_CONTENT) type XSTRING .
methods CREATE_XL_DRAWINGS
importing
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
@@ -88,6 +95,11 @@ protected section.
!IP_INDEX type I
returning
value(EP_ANCHOR) type ref to IF_IXML_ELEMENT .
+ methods CREATE_XL_DRAWING_FOR_COMMENTS
+ importing
+ !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
+ returning
+ value(EP_CONTENT) type XSTRING .
methods CREATE_XL_RELATIONSHIPS
returning
value(EP_CONTENT) type XSTRING .
@@ -113,6 +125,7 @@ protected section.
importing
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
!IV_DRAWING_INDEX type I
+ !IV_COMMENT_INDEX type I
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_STYLES
@@ -181,17 +194,23 @@ method CREATE.
lo_nested_iterator TYPE REF TO cl_object_collection_iterator,
lo_table TYPE REF TO zcl_excel_table,
lo_drawing TYPE REF TO zcl_excel_drawing,
- lo_drawings TYPE REF TO zcl_excel_drawings.
+ lo_drawings TYPE REF TO zcl_excel_drawings,
+ lo_comment TYPE REF TO zcl_excel_comment, " (+) Issue #180
+ lo_comments TYPE REF TO zcl_excel_comments. " (+) Issue #180
- DATA: lv_content TYPE xstring,
- lv_active TYPE flag,
- lv_xl_sheet TYPE string,
- lv_xl_sheet_rels TYPE string,
- lv_xl_drawing TYPE string,
- lv_xl_drawing_rels TYPE string,
- lv_syindex TYPE string,
- lv_value TYPE string,
- lv_drawing_index TYPE i.
+ DATA: lv_content TYPE xstring,
+ lv_active TYPE flag,
+ lv_xl_sheet TYPE string,
+ lv_xl_sheet_rels TYPE string,
+ lv_xl_drawing_for_comment TYPE string, " (+) Issue #180
+ lv_xl_comment TYPE string, " (+) Issue #180
+ lv_xl_comment_rels TYPE string, " (+) Issue #180
+ lv_xl_drawing TYPE string,
+ lv_xl_drawing_rels TYPE string,
+ lv_syindex TYPE string,
+ lv_value TYPE string,
+ lv_drawing_index TYPE i,
+ lv_comment_index TYPE i. " (+) Issue #180
**********************************************************************
* Start of insertion # issue 139 - Dateretention of cellstyles
@@ -262,6 +281,7 @@ method CREATE.
lo_iterator = me->excel->get_worksheets_iterator( ).
lo_active_worksheet = me->excel->get_active_worksheet( ).
lv_drawing_index = 1.
+ lv_comment_index = 1. " (+) Issue #180
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ).
@@ -273,7 +293,8 @@ method CREATE.
lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet
iv_active = lv_active ).
lv_xl_sheet = me->c_xl_sheet.
- MOVE sy-index TO lv_syindex.
+ MOVE sy-index TO: lv_syindex,
+ lv_comment_index. " (+) Issue #180
SHIFT lv_syindex RIGHT DELETING TRAILING space.
SHIFT lv_syindex LEFT DELETING LEADING space.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex.
@@ -282,7 +303,8 @@ method CREATE.
lv_xl_sheet_rels = me->c_xl_sheet_rels.
lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet
- iv_drawing_index = lv_drawing_index ).
+ iv_drawing_index = lv_drawing_index
+ iv_comment_index = lv_comment_index ). " (+) Issue #180
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex.
lo_zip->add( name = lv_xl_sheet_rels
content = lv_content ).
@@ -299,6 +321,30 @@ method CREATE.
content = lv_content ).
ENDWHILE.
+* Begin - Add - Issue #180
+* Add comments **********************************
+ lo_comments = lo_worksheet->get_comments( ).
+ IF lo_comments->is_empty( ) = abap_false.
+ MOVE lv_comment_index TO lv_syindex.
+ SHIFT lv_syindex RIGHT DELETING TRAILING space.
+ SHIFT lv_syindex LEFT DELETING LEADING space.
+
+ " Create comment itself
+ lv_content = me->create_xl_comments( lo_worksheet ).
+ lv_xl_comment = me->c_xl_comments.
+ REPLACE ALL OCCURRENCES OF '#' IN lv_xl_comment WITH lv_syindex.
+ lo_zip->add( name = lv_xl_comment
+ content = lv_content ).
+
+ " Create vmlDrawing that will host the comment
+ lv_content = me->create_xl_drawing_for_comments( lo_worksheet ).
+ lv_xl_drawing_for_comment = me->cl_xl_drawing_for_comments.
+ REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_for_comment WITH lv_syindex.
+ lo_zip->add( name = lv_xl_drawing_for_comment
+ content = lv_content ).
+ ENDIF.
+* End - Add - Issue #180
+
* Add drawings **********************************
lo_drawings = lo_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
@@ -385,6 +431,7 @@ method CREATE_CONTENT_TYPES.
" Node extension
lc_xml_node_rels_ext TYPE string VALUE 'rels',
lc_xml_node_xml_ext TYPE string VALUE 'xml',
+ lc_xml_node_xml_vml TYPE string VALUE 'vml', " (+) GGAR
" Node partnumber
lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml',
lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml',
@@ -399,12 +446,14 @@ method CREATE_CONTENT_TYPES.
lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',
lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',
lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml',
+ lc_xml_node_vml_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.vmlDrawing',
lc_xml_node_xml_ct TYPE string VALUE 'application/xml',
lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml',
lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',
lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',
lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml',
lc_xml_node_table_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml',
+ lc_xml_node_comments_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml', " (+) GGAR
lc_xml_node_drawings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawing+xml',
lc_xml_node_chart_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'.
@@ -425,6 +474,7 @@ method CREATE_CONTENT_TYPES.
lv_worksheets_numc TYPE numc3,
lv_xml_node_worksheet_pn TYPE string,
lv_value TYPE string,
+ lv_comment_index TYPE i VALUE 1, " (+) GGAR
lv_drawing_index TYPE i VALUE 1,
lv_index_str TYPE string.
@@ -468,6 +518,17 @@ method CREATE_CONTENT_TYPES.
value = lc_xml_node_xml_ct ).
lo_element_root->append_child( new_child = lo_element ).
+* Begin - Add - GGAR
+ " VML node (for comments)
+ lo_element = lo_document->create_simple_element( name = lc_xml_node_default
+ parent = lo_document ).
+ lo_element->set_attribute_ns( name = lc_xml_attr_extension
+ value = lc_xml_node_xml_vml ).
+ lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
+ value = lc_xml_node_vml_ct ).
+ lo_element_root->append_child( new_child = lo_element ).
+* End - Add - GGAR
+
" Theme node
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
@@ -542,6 +603,29 @@ method CREATE_CONTENT_TYPES.
lo_element_root->append_child( new_child = lo_element ).
ENDWHILE.
+* Begin - Add - GGAR
+ " Comments
+ DATA: lo_comments TYPE REF TO zcl_excel_comments.
+
+ lo_comments = lo_worksheet->get_comments( ).
+ IF lo_comments->is_empty( ) = abap_false.
+ lv_index_str = lv_comment_index.
+ CONDENSE lv_index_str NO-GAPS.
+ CONCATENATE '/' me->c_xl_comments INTO lv_value.
+ REPLACE '#' WITH lv_index_str INTO lv_value.
+
+ lo_element = lo_document->create_simple_element( name = lc_xml_node_override
+ parent = lo_document ).
+ lo_element->set_attribute_ns( name = lc_xml_attr_partname
+ value = lv_value ).
+ lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
+ value = lc_xml_node_comments_ct ).
+ lo_element_root->append_child( new_child = lo_element ).
+
+ ADD 1 TO lv_comment_index.
+ ENDIF.
+* End - Add - GGAR
+
" Drawings
DATA: lo_drawings TYPE REF TO zcl_excel_drawings.
@@ -2162,6 +2246,172 @@ METHOD create_xl_charts.
ENDMETHOD.
+METHOD create_xl_comments.
+** Constant node name
+ CONSTANTS: lc_xml_node_comments TYPE string VALUE 'comments',
+ lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
+ " authors
+ lc_xml_node_author TYPE string VALUE 'author',
+ lc_xml_node_authors TYPE string VALUE 'authors',
+ " comments
+ lc_xml_node_commentlist TYPE string VALUE 'commentList',
+ lc_xml_node_comment TYPE string VALUE 'comment',
+ lc_xml_node_text TYPE string VALUE 'text',
+ lc_xml_node_r TYPE string VALUE 'r',
+ lc_xml_node_rpr TYPE string VALUE 'rPr',
+ lc_xml_node_b TYPE string VALUE 'b',
+ lc_xml_node_sz TYPE string VALUE 'sz',
+ lc_xml_node_color TYPE string VALUE 'color',
+ lc_xml_node_rfont TYPE string VALUE 'rFont',
+* lc_xml_node_charset TYPE string VALUE 'charset',
+ lc_xml_node_family TYPE string VALUE 'family',
+ lc_xml_node_t TYPE string VALUE 't',
+ " comments attributes
+ lc_xml_attr_ref TYPE string VALUE 'ref',
+ lc_xml_attr_authorid TYPE string VALUE 'authorId',
+ lc_xml_attr_val TYPE string VALUE 'val',
+ lc_xml_attr_indexed TYPE string VALUE 'indexed',
+ lc_xml_attr_xmlspacing TYPE string VALUE 'xml:space'.
+
+
+ DATA: lo_ixml TYPE REF TO if_ixml,
+ lo_document TYPE REF TO if_ixml_document,
+ lo_element_root TYPE REF TO if_ixml_element,
+ lo_element_authors TYPE REF TO if_ixml_element,
+ lo_element_author TYPE REF TO if_ixml_element,
+ lo_element_commentlist TYPE REF TO if_ixml_element,
+ lo_element_comment TYPE REF TO if_ixml_element,
+ lo_element_text TYPE REF TO if_ixml_element,
+ lo_element_r TYPE REF TO if_ixml_element,
+ lo_element_rpr TYPE REF TO if_ixml_element,
+ lo_element_b TYPE REF TO if_ixml_element,
+ lo_element_sz TYPE REF TO if_ixml_element,
+ lo_element_color TYPE REF TO if_ixml_element,
+ lo_element_rfont TYPE REF TO if_ixml_element,
+* lo_element_charset TYPE REF TO if_ixml_element,
+ lo_element_family TYPE REF TO if_ixml_element,
+ lo_element_t TYPE REF TO if_ixml_element,
+ lo_encoding TYPE REF TO if_ixml_encoding,
+ lo_streamfactory TYPE REF TO if_ixml_stream_factory,
+ lo_ostream TYPE REF TO if_ixml_ostream,
+ lo_renderer TYPE REF TO if_ixml_renderer,
+ lo_iterator TYPE REF TO cl_object_collection_iterator,
+ lo_comments TYPE REF TO zcl_excel_comments,
+ lo_comment TYPE REF TO zcl_excel_comment.
+ DATA: lv_rel_id TYPE i.
+
+ DEFINE add_1_val_child_node.
+* &1: parent element
+* &2: child element
+* &3: element name
+* &4: attribute name
+* &5: attribute value
+
+ &2 = lo_document->create_simple_element( name = &3
+ parent = lo_document ).
+ IF &4 IS NOT INITIAL.
+ &2->set_attribute_ns( name = &4
+ value = &5 ).
+ ENDIF.
+ &1->append_child( new_child = &2 ).
+ END-OF-DEFINITION.
+
+
+**********************************************************************
+* STEP 1: Create [Content_Types].xml into the root of the ZIP
+ lo_ixml = cl_ixml=>create( ).
+
+**********************************************************************
+* STEP 2: Set document attributes
+ lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian
+ character_set = 'utf-8' ).
+ lo_document = lo_ixml->create_document( ).
+ lo_document->set_encoding( lo_encoding ).
+ lo_document->set_standalone( abap_true ).
+
+***********************************************************************
+* STEP 3: Create main node relationships
+ lo_element_root = lo_document->create_simple_element( name = lc_xml_node_comments
+ parent = lo_document ).
+ lo_element_root->set_attribute_ns( name = 'xmlns'
+ value = lc_xml_node_ns ).
+
+**********************************************************************
+* STEP 4: Create authors
+* TO-DO: management of several authors
+ lo_element_authors = lo_document->create_simple_element( name = lc_xml_node_authors
+ parent = lo_document ).
+
+ lo_element_author = lo_document->create_simple_element( name = lc_xml_node_author
+ parent = lo_document ).
+ lo_element_author->set_value( |{ sy-uname }| ).
+
+ lo_element_authors->append_child( new_child = lo_element_author ).
+ lo_element_root->append_child( new_child = lo_element_authors ).
+
+**********************************************************************
+* STEP 5: Create comments
+
+ lo_element_commentlist = lo_document->create_simple_element( name = lc_xml_node_commentlist
+ parent = lo_document ).
+
+ lo_comments = io_worksheet->get_comments( ).
+
+ lo_iterator = lo_comments->get_iterator( ).
+ WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
+ lo_comment ?= lo_iterator->if_object_collection_iterator~get_next( ).
+
+ lo_element_comment = lo_document->create_simple_element( name = lc_xml_node_comment
+ parent = lo_document ).
+ lo_element_comment->set_attribute_ns( name = lc_xml_attr_ref
+ value = lo_comment->get_ref( ) ).
+ lo_element_comment->set_attribute_ns( name = lc_xml_attr_authorid
+ value = '0' ). " TO-DO
+
+ lo_element_text = lo_document->create_simple_element( name = lc_xml_node_text
+ parent = lo_document ).
+ lo_element_r = lo_document->create_simple_element( name = lc_xml_node_r
+ parent = lo_document ).
+ lo_element_rpr = lo_document->create_simple_element( name = lc_xml_node_rpr
+ parent = lo_document ).
+
+ lo_element_b = lo_document->create_simple_element( name = lc_xml_node_b
+ parent = lo_document ).
+ lo_element_rpr->append_child( new_child = lo_element_b ).
+
+ add_1_val_child_node lo_element_rpr: lo_element_sz lc_xml_node_sz lc_xml_attr_val '9',
+ lo_element_color lc_xml_node_color lc_xml_attr_indexed '81',
+ lo_element_rfont lc_xml_node_rfont lc_xml_attr_val 'Tahoma',
+ lo_element_family lc_xml_node_family lc_xml_attr_val '2'
+* lo_element_charset lc_xml_node_charset lc_xml_attr_val '1'
+ .
+
+ lo_element_r->append_child( new_child = lo_element_rpr ).
+
+ lo_element_t = lo_document->create_simple_element( name = lc_xml_node_t
+ parent = lo_document ).
+ lo_element_t->set_attribute_ns( name = lc_xml_attr_xmlspacing
+ value = 'preserve' ).
+ lo_element_t->set_value( lo_comment->get_text( ) ).
+ lo_element_r->append_child( new_child = lo_element_t ).
+
+ lo_element_text->append_child( new_child = lo_element_r ).
+ lo_element_comment->append_child( new_child = lo_element_text ).
+ lo_element_commentlist->append_child( new_child = lo_element_comment ).
+ ENDWHILE.
+
+ lo_element_root->append_child( new_child = lo_element_commentlist ).
+
+**********************************************************************
+* STEP 5: Create xstring stream
+ lo_streamfactory = lo_ixml->create_stream_factory( ).
+ lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ).
+ lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ).
+ lo_renderer->render( ).
+
+ENDMETHOD.
+
+
method CREATE_XL_DRAWINGS.
@@ -2638,6 +2888,266 @@ method CREATE_XL_DRAWING_ANCHOR.
endmethod.
+METHOD create_xl_drawing_for_comments.
+** Constant node name
+ CONSTANTS: lc_xml_node_xml TYPE string VALUE 'xml',
+ lc_xml_node_ns_v TYPE string VALUE 'urn:schemas-microsoft-com:vml',
+ lc_xml_node_ns_o TYPE string VALUE 'urn:schemas-microsoft-com:office:office',
+ lc_xml_node_ns_x TYPE string VALUE 'urn:schemas-microsoft-com:office:excel',
+ " shapelayout
+ lc_xml_node_shapelayout TYPE string VALUE 'o:shapelayout',
+ lc_xml_node_idmap TYPE string VALUE 'o:idmap',
+ " shapetype
+ lc_xml_node_shapetype TYPE string VALUE 'v:shapetype',
+ lc_xml_node_stroke TYPE string VALUE 'v:stroke',
+ lc_xml_node_path TYPE string VALUE 'v:path',
+ " shape
+ lc_xml_node_shape TYPE string VALUE 'v:shape',
+ lc_xml_node_fill TYPE string VALUE 'v:fill',
+ lc_xml_node_shadow TYPE string VALUE 'v:shadow',
+ lc_xml_node_textbox TYPE string VALUE 'v:textbox',
+ lc_xml_node_div TYPE string VALUE 'div',
+ lc_xml_node_clientdata TYPE string VALUE 'x:ClientData',
+ lc_xml_node_movewithcells TYPE string VALUE 'x:MoveWithCells',
+ lc_xml_node_sizewithcells TYPE string VALUE 'x:SizeWithCells',
+ lc_xml_node_anchor TYPE string VALUE 'x:Anchor',
+ lc_xml_node_autofill TYPE string VALUE 'x:AutoFill',
+ lc_xml_node_row TYPE string VALUE 'x:Row',
+ lc_xml_node_column TYPE string VALUE 'x:Column',
+ " attributes,
+ lc_xml_attr_vext TYPE string VALUE 'v:ext',
+ lc_xml_attr_data TYPE string VALUE 'data',
+ lc_xml_attr_id TYPE string VALUE 'id',
+ lc_xml_attr_coordsize TYPE string VALUE 'coordsize',
+ lc_xml_attr_ospt TYPE string VALUE 'o:spt',
+ lc_xml_attr_joinstyle TYPE string VALUE 'joinstyle',
+ lc_xml_attr_path TYPE string VALUE 'path',
+ lc_xml_attr_gradientshapeok TYPE string VALUE 'gradientshapeok',
+ lc_xml_attr_oconnecttype TYPE string VALUE 'o:connecttype',
+ lc_xml_attr_type TYPE string VALUE 'type',
+ lc_xml_attr_style TYPE string VALUE 'style',
+ lc_xml_attr_fillcolor TYPE string VALUE 'fillcolor',
+ lc_xml_attr_oinsetmode TYPE string VALUE 'o:insetmode',
+ lc_xml_attr_color TYPE string VALUE 'color',
+ lc_xml_attr_color2 TYPE string VALUE 'color2',
+ lc_xml_attr_on TYPE string VALUE 'on',
+ lc_xml_attr_obscured TYPE string VALUE 'obscured',
+ lc_xml_attr_objecttype TYPE string VALUE 'ObjectType',
+ " attributes values
+ lc_xml_attr_val_edit TYPE string VALUE 'edit',
+ lc_xml_attr_val_rect TYPE string VALUE 'rect',
+ lc_xml_attr_val_t TYPE string VALUE 't',
+ lc_xml_attr_val_miter TYPE string VALUE 'miter',
+ lc_xml_attr_val_auto TYPE string VALUE 'auto',
+ lc_xml_attr_val_black TYPE string VALUE 'black',
+ lc_xml_attr_val_none TYPE string VALUE 'none',
+ lc_xml_attr_val_msodir TYPE string VALUE 'mso-direction-alt:auto',
+ lc_xml_attr_val_note TYPE string VALUE 'Note'.
+
+
+ DATA: lo_ixml TYPE REF TO if_ixml,
+ lo_document TYPE REF TO if_ixml_document,
+ lo_element_root TYPE REF TO if_ixml_element,
+ "shapelayout
+ lo_element_shapelayout TYPE REF TO if_ixml_element,
+ lo_element_idmap TYPE REF TO if_ixml_element,
+ "shapetype
+ lo_element_shapetype TYPE REF TO if_ixml_element,
+ lo_element_stroke TYPE REF TO if_ixml_element,
+ lo_element_path TYPE REF TO if_ixml_element,
+ "shape
+ lo_element_shape TYPE REF TO if_ixml_element,
+ lo_element_fill TYPE REF TO if_ixml_element,
+ lo_element_shadow TYPE REF TO if_ixml_element,
+ lo_element_textbox TYPE REF TO if_ixml_element,
+ lo_element_div TYPE REF TO if_ixml_element,
+ lo_element_clientdata TYPE REF TO if_ixml_element,
+ lo_element_movewithcells TYPE REF TO if_ixml_element,
+ lo_element_sizewithcells TYPE REF TO if_ixml_element,
+ lo_element_anchor TYPE REF TO if_ixml_element,
+ lo_element_autofill TYPE REF TO if_ixml_element,
+ lo_element_row TYPE REF TO if_ixml_element,
+ lo_element_column TYPE REF TO if_ixml_element,
+ lo_encoding TYPE REF TO if_ixml_encoding,
+ lo_streamfactory TYPE REF TO if_ixml_stream_factory,
+ lo_ostream TYPE REF TO if_ixml_ostream,
+ lo_renderer TYPE REF TO if_ixml_renderer,
+ lo_iterator TYPE REF TO cl_object_collection_iterator,
+ lo_comments TYPE REF TO zcl_excel_comments,
+ lo_comment TYPE REF TO zcl_excel_comment,
+ lv_row TYPE zexcel_cell_row,
+ lv_str_column TYPE zexcel_cell_column_alpha,
+ lv_column TYPE zexcel_cell_column,
+ lv_index TYPE i.
+ DATA: lv_rel_id TYPE i.
+
+ DEFINE add_1_val_child_node.
+* &1: parent element
+* &2: child element
+* &3: element name
+* &4: attribute name
+* &5: attribute value
+
+ &2 = lo_document->create_simple_element( name = &3
+ parent = lo_document ).
+ IF &4 IS NOT INITIAL.
+ &2->set_attribute_ns( name = &4
+ value = &5 ).
+ ENDIF.
+ &1->append_child( new_child = &2 ).
+ END-OF-DEFINITION.
+
+
+**********************************************************************
+* STEP 1: Create XML document
+ lo_ixml = cl_ixml=>create( ).
+ lo_document = lo_ixml->create_document( ).
+
+***********************************************************************
+* STEP 2: Create main node relationships
+ lo_element_root = lo_document->create_simple_element( name = lc_xml_node_xml
+ parent = lo_document ).
+ lo_element_root->set_attribute_ns( : name = 'xmlns:v' value = lc_xml_node_ns_v ),
+ name = 'xmlns:o' value = lc_xml_node_ns_o ),
+ name = 'xmlns:x' value = lc_xml_node_ns_x ).
+
+**********************************************************************
+* STEP 3: Create o:shapeLayout
+* TO-DO: management of several authors
+ lo_element_shapelayout = lo_document->create_simple_element( name = lc_xml_node_shapelayout
+ parent = lo_document ).
+
+ lo_element_shapelayout->set_attribute_ns( name = lc_xml_attr_vext
+ value = lc_xml_attr_val_edit ).
+
+ lo_element_idmap = lo_document->create_simple_element( name = lc_xml_node_idmap
+ parent = lo_document ).
+ lo_element_idmap->set_attribute_ns( : name = lc_xml_attr_vext value = lc_xml_attr_val_edit ),
+ name = lc_xml_attr_data value = '1' ).
+
+ lo_element_shapelayout->append_child( new_child = lo_element_idmap ).
+
+ lo_element_root->append_child( new_child = lo_element_shapelayout ).
+
+**********************************************************************
+* STEP 4: Create v:shapetype
+
+ lo_element_shapetype = lo_document->create_simple_element( name = lc_xml_node_shapetype
+ parent = lo_document ).
+
+ lo_element_shapetype->set_attribute_ns( : name = lc_xml_attr_id value = '_x0000_t202' ),
+ name = lc_xml_attr_coordsize value = '21600,21600' ),
+ name = lc_xml_attr_ospt value = '202' ),
+ name = lc_xml_attr_path value = 'm,l,21600r21600,l21600,xe' ).
+
+ lo_element_stroke = lo_document->create_simple_element( name = lc_xml_node_stroke
+ parent = lo_document ).
+ lo_element_stroke->set_attribute_ns( name = lc_xml_attr_joinstyle value = lc_xml_attr_val_miter ).
+
+ lo_element_path = lo_document->create_simple_element( name = lc_xml_node_path
+ parent = lo_document ).
+ lo_element_path->set_attribute_ns( : name = lc_xml_attr_gradientshapeok value = lc_xml_attr_val_t ),
+ name = lc_xml_attr_oconnecttype value = lc_xml_attr_val_rect ).
+
+ lo_element_shapetype->append_child( : new_child = lo_element_stroke ),
+ new_child = lo_element_path ).
+
+ lo_element_root->append_child( new_child = lo_element_shapetype ).
+
+**********************************************************************
+* STEP 4: Create v:shapetype
+
+ lo_comments = io_worksheet->get_comments( ).
+
+ lo_iterator = lo_comments->get_iterator( ).
+ WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
+ lv_index = sy-index.
+ lo_comment ?= lo_iterator->if_object_collection_iterator~get_next( ).
+
+ zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING i_columnrow = lo_comment->get_ref( )
+ IMPORTING e_column = lv_str_column
+ e_row = lv_row ).
+ lv_column = zcl_excel_common=>convert_column2int( lv_str_column ).
+
+ lo_element_shape = lo_document->create_simple_element( name = lc_xml_node_shape
+ parent = lo_document ).
+
+ lo_element_shape->set_attribute_ns( : name = lc_xml_attr_id value = |_x0000_s{ 1024 + lv_index }| ),
+ name = lc_xml_attr_type value = '#_x0000_t202' ),
+ name = lc_xml_attr_style value = 'size:auto;width:auto;height:auto;position:absolute;margin-left:117pt;margin-top:172.5pt;z-index:1;visibility:hidden' ),
+ name = lc_xml_attr_fillcolor value = '#ffffe1' ),
+ name = lc_xml_attr_oinsetmode value = lc_xml_attr_val_auto ).
+
+ " Fill
+ lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill
+ parent = lo_document ).
+ lo_element_fill->set_attribute_ns( name = lc_xml_attr_color2 value = '#ffffe1' ).
+ lo_element_shape->append_child( new_child = lo_element_fill ).
+ " Shadow
+ lo_element_shadow = lo_document->create_simple_element( name = lc_xml_node_shadow
+ parent = lo_document ).
+ lo_element_shadow->set_attribute_ns( : name = lc_xml_attr_on value = lc_xml_attr_val_t ),
+ name = lc_xml_attr_color value = lc_xml_attr_val_black ),
+ name = lc_xml_attr_obscured value = lc_xml_attr_val_t ).
+ lo_element_shape->append_child( new_child = lo_element_shadow ).
+ " Path
+ lo_element_path = lo_document->create_simple_element( name = lc_xml_node_path
+ parent = lo_document ).
+ lo_element_path->set_attribute_ns( name = lc_xml_attr_oconnecttype value = lc_xml_attr_val_none ).
+ lo_element_shape->append_child( new_child = lo_element_path ).
+ " Textbox
+ lo_element_textbox = lo_document->create_simple_element( name = lc_xml_node_textbox
+ parent = lo_document ).
+ lo_element_textbox->set_attribute_ns( name = lc_xml_attr_style value = lc_xml_attr_val_msodir ).
+ lo_element_div = lo_document->create_simple_element( name = lc_xml_node_div
+ parent = lo_document ).
+ lo_element_div->set_attribute_ns( name = lc_xml_attr_style value = 'text-align:left' ).
+ lo_element_textbox->append_child( new_child = lo_element_div ).
+ lo_element_shape->append_child( new_child = lo_element_textbox ).
+ " ClientData
+ lo_element_clientdata = lo_document->create_simple_element( name = lc_xml_node_clientdata
+ parent = lo_document ).
+ lo_element_clientdata->set_attribute_ns( name = lc_xml_attr_objecttype value = lc_xml_attr_val_note ).
+ lo_element_movewithcells = lo_document->create_simple_element( name = lc_xml_node_movewithcells
+ parent = lo_document ).
+ lo_element_clientdata->append_child( new_child = lo_element_movewithcells ).
+ lo_element_sizewithcells = lo_document->create_simple_element( name = lc_xml_node_sizewithcells
+ parent = lo_document ).
+ lo_element_clientdata->append_child( new_child = lo_element_sizewithcells ).
+ lo_element_anchor = lo_document->create_simple_element( name = lc_xml_node_anchor
+ parent = lo_document ).
+ lo_element_anchor->set_value( '2, 15, 11, 10, 4, 31, 15, 9' ).
+ lo_element_clientdata->append_child( new_child = lo_element_anchor ).
+ lo_element_autofill = lo_document->create_simple_element( name = lc_xml_node_autofill
+ parent = lo_document ).
+ lo_element_autofill->set_value( 'False' ).
+ lo_element_clientdata->append_child( new_child = lo_element_autofill ).
+ lo_element_row = lo_document->create_simple_element( name = lc_xml_node_row
+ parent = lo_document ).
+* lo_element_row->set_value( '12' ).
+ lo_element_row->set_value( |{ lv_row - 1 }| ).
+ lo_element_clientdata->append_child( new_child = lo_element_row ).
+ lo_element_column = lo_document->create_simple_element( name = lc_xml_node_column
+ parent = lo_document ).
+* lo_element_column->set_value( '1' ).
+ lo_element_column->set_value( |{ lv_column - 1 }| ).
+ lo_element_clientdata->append_child( new_child = lo_element_column ).
+
+ lo_element_shape->append_child( new_child = lo_element_clientdata ).
+
+ lo_element_root->append_child( new_child = lo_element_shape ).
+ ENDWHILE.
+
+**********************************************************************
+* STEP 6: Create xstring stream
+ lo_streamfactory = lo_ixml->create_stream_factory( ).
+ lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ).
+ lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ).
+ lo_renderer->render( ).
+
+ENDMETHOD.
+
+
method CREATE_XL_RELATIONSHIPS.
@@ -2976,6 +3486,7 @@ METHOD create_xl_sheet.
lc_xml_node_mergecell TYPE string VALUE 'mergeCell',
lc_xml_node_mergecells TYPE string VALUE 'mergeCells',
lc_xml_node_drawing TYPE string VALUE 'drawing',
+ lc_xml_node_drawing_for_cmt TYPE string VALUE 'legacyDrawing',
lc_xml_node_headerfooter TYPE string VALUE 'headerFooter',
lc_xml_node_oddheader TYPE string VALUE 'oddHeader',
lc_xml_node_oddfooter TYPE string VALUE 'oddFooter',
@@ -4520,6 +5031,27 @@ METHOD create_xl_sheet.
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
+* Begin - Add - Issue #180
+ " (Legacy) drawings for comments
+ DATA: lo_drawing_for_comments TYPE REF TO zcl_excel_comments.
+
+ lo_drawing_for_comments = io_worksheet->get_comments( ).
+ IF lo_drawing_for_comments->is_empty( ) = abap_false.
+ lo_element = lo_document->create_simple_element( name = lc_xml_node_drawing_for_cmt
+ parent = lo_document ).
+ ADD 1 TO lv_relation_id. " +1 for legacyDrawings
+
+ lv_value = lv_relation_id.
+ CONDENSE lv_value.
+ CONCATENATE 'rId' lv_value INTO lv_value.
+ lo_element->set_attribute( name = 'r:id'
+ value = lv_value ).
+ lo_element_root->append_child( new_child = lo_element ).
+
+ ADD 1 TO lv_relation_id. " +1 for comments (not referenced in XL sheet but let's reserve the rId)
+ ENDIF.
+* End - Add - Issue #180
+
* tables
DATA lv_table_count TYPE i.
@@ -4656,11 +5188,13 @@ METHOD create_xl_sheet_rels.
lc_xml_attr_target_mode TYPE string VALUE 'TargetMode',
lc_xml_val_external TYPE string VALUE 'External',
" Node namespace
- lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
- lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table',
- lc_xml_node_rid_printer_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings',
- lc_xml_node_rid_drawing_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
- lc_xml_node_rid_link_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'.
+ lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
+ lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table',
+ lc_xml_node_rid_printer_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings',
+ lc_xml_node_rid_drawing_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
+ lc_xml_node_rid_comment_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', " (+) Issue #180
+ lc_xml_node_rid_drawing_cmt_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', " (+) Issue #180
+ lc_xml_node_rid_link_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'.
DATA: lo_ixml TYPE REF TO if_ixml,
lo_document TYPE REF TO if_ixml_document,
@@ -4754,6 +5288,58 @@ METHOD create_xl_sheet_rels.
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
+* Begin - Add - Issue #180
+ DATA: lo_comments TYPE REF TO zcl_excel_comments.
+
+ lo_comments = io_worksheet->get_comments( ).
+ IF lo_comments->is_empty( ) = abap_false.
+ " Drawing for comment
+ lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
+ parent = lo_document ).
+
+ ADD 1 TO lv_relation_id.
+
+ lv_value = lv_relation_id.
+ CONDENSE lv_value.
+ CONCATENATE 'rId' lv_value INTO lv_value.
+ lo_element->set_attribute_ns( name = lc_xml_attr_id
+ value = lv_value ).
+ lo_element->set_attribute_ns( name = lc_xml_attr_type
+ value = lc_xml_node_rid_drawing_cmt_tp ).
+
+ lv_index_str = iv_comment_index.
+ CONDENSE lv_index_str NO-GAPS.
+ MOVE me->cl_xl_drawing_for_comments TO lv_value.
+ REPLACE 'xl' WITH '..' INTO lv_value.
+ REPLACE '#' WITH lv_index_str INTO lv_value.
+ lo_element->set_attribute_ns( name = lc_xml_attr_target
+ value = lv_value ).
+ lo_element_root->append_child( new_child = lo_element ).
+
+ " Comment
+ lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
+ parent = lo_document ).
+ ADD 1 TO lv_relation_id.
+
+ lv_value = lv_relation_id.
+ CONDENSE lv_value.
+ CONCATENATE 'rId' lv_value INTO lv_value.
+ lo_element->set_attribute_ns( name = lc_xml_attr_id
+ value = lv_value ).
+ lo_element->set_attribute_ns( name = lc_xml_attr_type
+ value = lc_xml_node_rid_comment_tp ).
+
+ lv_index_str = iv_comment_index.
+ CONDENSE lv_index_str NO-GAPS.
+ MOVE me->c_xl_comments TO lv_value.
+ REPLACE 'xl' WITH '..' INTO lv_value.
+ REPLACE '#' WITH lv_index_str INTO lv_value.
+ lo_element->set_attribute_ns( name = lc_xml_attr_target
+ value = lv_value ).
+ lo_element_root->append_child( new_child = lo_element ).
+ ENDIF.
+* End - Add - Issue #180
+
lo_iterator = io_worksheet->get_tables_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ).
diff --git a/src/zdemo_excel_comments.prog.abap b/src/zdemo_excel_comments.prog.abap
new file mode 100644
index 0000000..783b7ec
--- /dev/null
+++ b/src/zdemo_excel_comments.prog.abap
@@ -0,0 +1,63 @@
+*&---------------------------------------------------------------------*
+*& Report ZDEMO_EXCEL_COMMENTS
+*&
+*&---------------------------------------------------------------------*
+*&
+*&
+*&---------------------------------------------------------------------*
+REPORT zdemo_excel_comments.
+
+DATA: lo_excel TYPE REF TO zcl_excel,
+ lo_worksheet TYPE REF TO zcl_excel_worksheet,
+ lo_comment TYPE REF TO zcl_excel_comment,
+ lo_hyperlink TYPE REF TO zcl_excel_hyperlink.
+
+CONSTANTS: gc_save_file_name TYPE string VALUE 'Comments.xlsx'.
+INCLUDE zdemo_excel_outputopt_incl.
+
+
+START-OF-SELECTION.
+ " Creates active sheet
+ CREATE OBJECT lo_excel.
+
+ " Get active sheet
+ lo_worksheet = lo_excel->get_active_worksheet( ).
+* lo_worksheet->set_title( ip_title = 'Sheet1' ).
+ lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ).
+ lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = sy-datum ).
+ lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = sy-uzeit ).
+ lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'http://www.abap2xlsx.org' ).
+ lo_worksheet->set_cell( ip_column = 'B' ip_row = 4 ip_value = 'Click here to visit abap2xlsx homepage' ip_hyperlink = lo_hyperlink ).
+
+ " Comments
+ lo_comment = lo_excel->add_new_comment( ).
+ lo_comment->set_text( ip_ref = 'B13' ip_text = 'This is how it begins to be debug time...' ).
+ lo_worksheet->add_comment( lo_comment ).
+ lo_comment = lo_excel->add_new_comment( ).
+ lo_comment->set_text( ip_ref = 'C18' ip_text = 'Another comment' ).
+ lo_worksheet->add_comment( lo_comment ).
+ lo_comment = lo_excel->add_new_comment( ).
+ lo_comment->set_text( ip_ref = 'F6' ip_text = |A comment split{ cl_abap_char_utilities=>cr_lf }on 2 lines?| ).
+ lo_worksheet->add_comment( lo_comment ).
+
+ " Second sheet
+ lo_worksheet = lo_excel->add_new_worksheet( ).
+ lo_worksheet->set_default_excel_date_format( zcl_excel_style_number_format=>c_format_date_yyyymmdd ).
+ lo_worksheet->set_title( ip_title = 'Sheet2' ).
+ lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Date Format set to YYYYMMDD' ).
+ " Insert current date
+ lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Current Date:' ).
+ lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = sy-datum ).
+
+ lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet3!B2' ).
+ lo_worksheet->set_cell( ip_column = 'A' ip_row = 6 ip_value = 'This is link to the third sheet' ip_hyperlink = lo_hyperlink ).
+
+ lo_comment = lo_excel->add_new_comment( ).
+ lo_comment->set_text( ip_ref = 'A8' ip_text = 'What about a comment on second sheet?' ).
+ " lo_comment->set_text( ip_column = 'A' ip_row = 8 ip_text = 'What about a comment on second sheet?' ).
+ lo_worksheet->add_comment( lo_comment ).
+
+ lo_excel->set_active_sheet_index_by_name( 'Sheet1' ).
+
+*** Create output
+ lcl_output=>output( lo_excel ).
diff --git a/src/zdemo_excel_comments.prog.xml b/src/zdemo_excel_comments.prog.xml
new file mode 100644
index 0000000..0673b53
--- /dev/null
+++ b/src/zdemo_excel_comments.prog.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+ ZDEMO_EXCEL_COMMENTS
+ A
+ X
+ 1
+ T
+ E
+ X
+ X
+
+
+ -
+ S
+ P_PATH
+ .
+ 9
+ D
+
+ -
+ S
+ RB_BACK
+ 17
+
+ -
+ R
+ abap2xlsx Demo: Hello World
+ 28
+
+
+
+
+