From aaad50440de638a5c86d9bdb4a6a041df7000366 Mon Sep 17 00:00:00 2001 From: Gregor Wolf Date: Wed, 23 Jan 2019 15:23:09 +0100 Subject: [PATCH] Support for comments (Issue #180) (#583) * Read UTF-8 input file correctly * Classes for cell coments As contributed by guillaumegarcia13 * Support for comments (Issue #180) As contributed by guillaumegarcia13 --- src/zcl_excel.clas.abap | 12 + src/zcl_excel_comment.clas.abap | 71 ++++ src/zcl_excel_comment.clas.xml | 67 +++ src/zcl_excel_comments.clas.abap | 100 +++++ src/zcl_excel_comments.clas.xml | 73 ++++ src/zcl_excel_worksheet.clas.abap | 37 ++ src/zcl_excel_writer_2007.clas.abap | 620 +++++++++++++++++++++++++++- src/zdemo_excel_comments.prog.abap | 63 +++ src/zdemo_excel_comments.prog.xml | 36 ++ 9 files changed, 1062 insertions(+), 17 deletions(-) create mode 100644 src/zcl_excel_comment.clas.abap create mode 100644 src/zcl_excel_comment.clas.xml create mode 100644 src/zcl_excel_comments.clas.abap create mode 100644 src/zcl_excel_comments.clas.xml create mode 100644 src/zdemo_excel_comments.prog.abap create mode 100644 src/zdemo_excel_comments.prog.xml 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 + + + + +