This commit is contained in:
Rüdiger Plantiko 2025-05-04 21:19:35 +02:00 committed by GitHub
commit ad5a7fc676
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 1397 additions and 1022 deletions

View File

@ -5,9 +5,42 @@ CLASS zcl_excel_comment DEFINITION
PUBLIC SECTION.
CONSTANTS default_right_column TYPE i VALUE 4. "#EC NOTEXT
CONSTANTS default_bottom_row TYPE i VALUE 15. "#EC NOTEXT
TYPES:
BEGIN OF ty_rtf_fragment.
INCLUDE TYPE zexcel_s_style_font AS rtf.
TYPES:
text TYPE string,
END OF ty_rtf_fragment .
TYPES:
ty_rtf_fragments TYPE STANDARD TABLE OF ty_rtf_fragment
WITH NON-UNIQUE DEFAULT KEY .
TYPES:
BEGIN OF ty_box,
left_column TYPE i,
left_offset TYPE i,
top_row TYPE i,
top_offset TYPE i,
right_column TYPE i,
right_offset TYPE i,
bottom_row TYPE i,
bottom_offset TYPE i,
END OF ty_box .
CONSTANTS:
BEGIN OF gc_default_box,
left_column TYPE i VALUE 2,
left_offset TYPE i VALUE 15,
top_row TYPE i VALUE 11,
top_offset TYPE i VALUE 10,
right_column TYPE i VALUE 4,
right_offset TYPE i VALUE 31,
bottom_row TYPE i VALUE 15,
bottom_offset TYPE i VALUE 9,
END OF gc_default_box .
CLASS-METHODS get_default_style
RETURNING
VALUE(es_default) TYPE zexcel_s_style_font .
METHODS constructor .
METHODS get_bottom_offset
RETURNING
@ -45,38 +78,47 @@ CLASS zcl_excel_comment DEFINITION
METHODS get_top_row
RETURNING
VALUE(rp_result) TYPE i .
METHODS set_box
IMPORTING
!is_box TYPE ty_box .
METHODS set_text
IMPORTING
!ip_text TYPE string
!ip_text TYPE string OPTIONAL
!is_style TYPE zexcel_s_style_font OPTIONAL
!ip_ref TYPE string OPTIONAL
!ip_left_column TYPE i DEFAULT 2
!ip_left_offset TYPE i DEFAULT 15
!ip_top_row TYPE i DEFAULT 11
!ip_top_offset TYPE i DEFAULT 10
!ip_right_column TYPE i DEFAULT default_right_column
!ip_right_offset TYPE i DEFAULT 31
!ip_bottom_row TYPE i DEFAULT default_bottom_row
!ip_bottom_offset TYPE i DEFAULT 9.
!ip_left_column TYPE i DEFAULT gc_default_box-left_column
!ip_left_offset TYPE i DEFAULT gc_default_box-left_offset
!ip_top_row TYPE i DEFAULT gc_default_box-top_row
!ip_top_offset TYPE i DEFAULT gc_default_box-top_offset
!ip_right_column TYPE i DEFAULT gc_default_box-right_column
!ip_right_offset TYPE i DEFAULT gc_default_box-right_offset
!ip_bottom_row TYPE i DEFAULT gc_default_box-bottom_row
!ip_bottom_offset TYPE i DEFAULT gc_default_box-bottom_offset .
METHODS get_text_rtf
RETURNING
VALUE(et_rtf) TYPE ty_rtf_fragments .
METHODS set_text_rtf
IMPORTING
!it_rtf TYPE ty_rtf_fragments OPTIONAL
!ip_ref TYPE string OPTIONAL
!is_box TYPE ty_box OPTIONAL .
PROTECTED SECTION.
PRIVATE SECTION.
DATA bottom_offset TYPE i .
DATA bottom_row TYPE i .
DATA index TYPE string .
DATA ref TYPE string .
DATA left_column TYPE i .
DATA left_offset TYPE i .
DATA right_column TYPE i .
DATA right_offset TYPE i .
DATA text TYPE string .
DATA top_offset TYPE i .
DATA top_row TYPE i .
DATA gt_rtf TYPE ty_rtf_fragments .
DATA gs_box TYPE ty_box .
METHODS add_text
IMPORTING
!ip_text TYPE string
!is_style TYPE zexcel_s_style_font .
ENDCLASS.
CLASS zcl_excel_comment IMPLEMENTATION.
CLASS ZCL_EXCEL_COMMENT IMPLEMENTATION.
METHOD constructor.
@ -85,12 +127,12 @@ CLASS zcl_excel_comment IMPLEMENTATION.
METHOD get_bottom_offset.
rp_result = bottom_offset.
rp_result = gs_box-bottom_offset.
ENDMETHOD.
METHOD get_bottom_row.
rp_result = bottom_row.
rp_result = gs_box-bottom_row.
ENDMETHOD.
@ -100,12 +142,12 @@ CLASS zcl_excel_comment IMPLEMENTATION.
METHOD get_left_column.
rp_result = left_column.
rp_result = gs_box-left_column.
ENDMETHOD.
METHOD get_left_offset.
rp_result = left_offset.
rp_result = gs_box-left_offset.
ENDMETHOD.
@ -120,56 +162,112 @@ CLASS zcl_excel_comment IMPLEMENTATION.
METHOD get_right_column.
rp_result = right_column.
rp_result = gs_box-right_column.
ENDMETHOD.
METHOD get_right_offset.
rp_result = right_offset.
rp_result = gs_box-right_offset.
ENDMETHOD.
METHOD get_text.
rp_text = me->text.
FIELD-SYMBOLS: <ls_rtf> LIKE LINE OF gt_rtf.
LOOP AT gt_rtf ASSIGNING <ls_rtf>.
CONCATENATE rp_text <ls_rtf>-text INTO rp_text.
ENDLOOP.
ENDMETHOD.
METHOD get_top_offset.
rp_result = top_offset.
rp_result = gs_box-top_offset.
ENDMETHOD.
METHOD get_top_row.
rp_result = top_row.
rp_result = gs_box-top_row.
ENDMETHOD.
METHOD set_text.
me->text = ip_text.
IF ip_ref IS SUPPLIED.
me->ref = ip_ref.
ref = ip_ref.
ENDIF.
me->left_column = ip_left_column.
me->left_offset = ip_left_offset.
me->top_row = ip_top_row.
me->top_offset = ip_top_offset.
IF ip_right_column IS NOT INITIAL.
me->right_column = ip_right_column.
ELSE.
me->right_column = default_right_column.
* Add a simple text with parameter IP_TEXT and style IS_STYLE
IF ip_text IS NOT INITIAL.
add_text(
ip_text = ip_text
is_style = is_style ).
ENDIF.
me->right_offset = ip_right_offset.
IF ip_bottom_row IS NOT INITIAL.
me->bottom_row = ip_bottom_row.
ELSE.
me->bottom_row = default_bottom_row.
ENDIF.
me->bottom_offset = ip_bottom_offset.
* Parameters of the containing box
DATA ls_box TYPE ty_box.
ls_box-left_column = ip_left_column.
ls_box-left_offset = ip_left_offset.
ls_box-top_row = ip_top_row.
ls_box-top_offset = ip_top_offset.
ls_box-right_column = ip_right_column.
ls_box-right_offset = ip_right_offset.
ls_box-bottom_row = ip_bottom_row.
ls_box-bottom_offset = ip_bottom_offset.
set_box( ls_box ).
ENDMETHOD.
METHOD set_box.
gs_box = is_box.
ENDMETHOD.
METHOD add_text.
DATA ls_rtf LIKE LINE OF gt_rtf.
ls_rtf-text = ip_text.
IF is_style IS INITIAL.
ls_rtf-rtf = get_default_style( ).
ELSE.
ls_rtf-rtf = is_style.
ENDIF.
APPEND ls_rtf TO gt_rtf.
ENDMETHOD.
METHOD get_default_style.
es_default-bold = abap_true.
es_default-size = 9.
es_default-color-indexed = 81.
es_default-color-theme = zcl_excel_style_color=>c_theme_not_set.
es_default-name = `Tahoma`.
es_default-family = 2.
ENDMETHOD.
METHOD get_text_rtf.
et_rtf = gt_rtf.
ENDMETHOD.
METHOD set_text_rtf.
* Set a text, consisting of differently styled parts
gt_rtf = it_rtf.
IF ip_ref IS SUPPLIED.
ref = ip_ref.
ENDIF.
* Parameters of the containing box
IF is_box IS SUPPLIED.
set_box( is_box ).
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -17,21 +17,31 @@
<LANGU>E</LANGU>
<DESCRIPT>CONSTRUCTOR</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>GET_DEFAULT_STYLE</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Default style for formatted parts of comment</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>GET_INDEX</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Get index</DESCRIPT>
<DESCRIPT>Get index (in commentlist zcl_excel_comments)</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>GET_REF</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Get reference</DESCRIPT>
<DESCRIPT>Get cell reference</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>GET_TEXT</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Get text</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>GET_TEXT_RTF</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Get text consisting of styled parts</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>INDEX</CMPNAME>
<LANGU>E</LANGU>
@ -42,17 +52,72 @@
<LANGU>E</LANGU>
<DESCRIPT>Reference to cell (eg. &apos;B13&apos;)</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>SET_BOX</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Set box for display</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>SET_TEXT</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Set text</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>TEXT</CMPNAME>
<CMPNAME>SET_TEXT_RTF</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Comment</DESCRIPT>
<DESCRIPT>Set text consisting of styled parts</DESCRIPT>
</SEOCOMPOTX>
</DESCRIPTIONS>
<DESCRIPTIONS_SUB>
<SEOSUBCOTX>
<CMPNAME>ADD_TEXT</CMPNAME>
<SCONAME>IS_STYLE</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Style</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>GET_DEFAULT_STYLE</CMPNAME>
<SCONAME>ES_DEFAULT</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Cell Font</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>SET_TEXT</CMPNAME>
<SCONAME>IP_REF</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Cell reference (e.g. &apos;A1&apos;)</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>SET_TEXT</CMPNAME>
<SCONAME>IP_TEXT</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Text as string</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>SET_TEXT</CMPNAME>
<SCONAME>IS_STYLE</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Style (for richt text comment)</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>SET_TEXT_RTF</CMPNAME>
<SCONAME>IP_REF</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Cell reference (e.g. &apos;A1&apos;)</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>SET_TEXT_RTF</CMPNAME>
<SCONAME>IS_BOX</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Bounding box (optional)</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>SET_TEXT_RTF</CMPNAME>
<SCONAME>IT_RTF</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Comment with differently styled parts</DESCRIPT>
</SEOSUBCOTX>
</DESCRIPTIONS_SUB>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -5,6 +5,12 @@ CLASS zcl_excel_comments DEFINITION
PUBLIC SECTION.
TYPES:
ty_boxes TYPE STANDARD TABLE OF zcl_excel_comment=>ty_box
WITH NON-UNIQUE DEFAULT KEY .
DATA gv_full_vml TYPE string READ-ONLY .
METHODS add
IMPORTING
!ip_comment TYPE REF TO zcl_excel_comment .
@ -12,7 +18,9 @@ CLASS zcl_excel_comments DEFINITION
IMPORTING
!ip_comment TYPE REF TO zcl_excel_comment .
METHODS clear .
METHODS constructor .
METHODS constructor
IMPORTING
!io_from TYPE REF TO zcl_excel_comments OPTIONAL .
METHODS get
IMPORTING
!ip_index TYPE zexcel_active_worksheet
@ -30,15 +38,20 @@ CLASS zcl_excel_comments DEFINITION
METHODS size
RETURNING
VALUE(ep_size) TYPE i .
METHODS set_boxes
IMPORTING
!it_boxes TYPE ty_boxes OPTIONAL
!iv_full_vml TYPE string OPTIONAL .
PROTECTED SECTION.
PRIVATE SECTION.
DATA comments TYPE REF TO zcl_excel_collection .
DATA gt_boxes TYPE ty_boxes .
ENDCLASS.
CLASS zcl_excel_comments IMPLEMENTATION.
CLASS ZCL_EXCEL_COMMENTS IMPLEMENTATION.
METHOD add.
@ -57,7 +70,15 @@ CLASS zcl_excel_comments IMPLEMENTATION.
METHOD constructor.
IF io_from IS INITIAL.
CREATE OBJECT comments.
ELSE.
* Copy constructor: copy attributes from original
comments = io_from->comments.
gt_boxes = io_from->gt_boxes.
gv_full_vml = io_from->gv_full_vml.
ENDIF.
ENDMETHOD.
@ -97,4 +118,37 @@ CLASS zcl_excel_comments IMPLEMENTATION.
ep_size = comments->size( ).
ENDMETHOD.
METHOD set_boxes.
DATA:
lo_comments TYPE REF TO zcl_excel_collection_iterator,
lo_comment TYPE REF TO zcl_excel_comment.
FIELD-SYMBOLS:
<ls_box> TYPE zcl_excel_comment=>ty_box.
IF it_boxes IS NOT INITIAL.
gt_boxes = it_boxes.
ENDIF.
IF iv_full_vml IS NOT INITIAL.
gv_full_vml = iv_full_vml.
ENDIF.
IF gt_boxes IS NOT INITIAL.
lo_comments = comments->get_iterator( ).
WHILE lo_comments->has_next( ) EQ abap_true.
READ TABLE gt_boxes INDEX 1 ASSIGNING <ls_box>.
CHECK sy-subrc EQ 0.
lo_comment ?= lo_comments->get_next( ).
lo_comment->set_box( <ls_box> ).
DELETE gt_boxes INDEX 1.
ENDWHILE.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -37,6 +37,11 @@
<LANGU>E</LANGU>
<DESCRIPT>Returns an iterator</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>GV_FULL_VML</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Full VML with graphics information for the comment boxes</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>INCLUDE</CMPNAME>
<LANGU>E</LANGU>
@ -52,12 +57,25 @@
<LANGU>E</LANGU>
<DESCRIPT>Deletes an Element from the Collection</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>SET_BOXES</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Propagate dimensions of the info boxes to the comments</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>SIZE</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Specifies number of contained elements</DESCRIPT>
</SEOCOMPOTX>
</DESCRIPTIONS>
<DESCRIPTIONS_SUB>
<SEOSUBCOTX>
<CMPNAME>CONSTRUCTOR</CMPNAME>
<SCONAME>IO_FROM</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Create new instance from this original</DESCRIPT>
</SEOSUBCOTX>
</DESCRIPTIONS_SUB>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -118,6 +118,29 @@ CLASS zcl_excel_reader_2007 DEFINITION
DATA styles TYPE t_style_refs .
DATA mt_ref_formulae TYPE tyt_ref_formulae .
DATA mt_dxf_styles TYPE zexcel_t_styles_cond_mapping .
CONSTANTS:
BEGIN OF namespace,
x14ac TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac',
vba_project TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', "#EC NEEDED for future incorporation of XLSM-reader
c TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/chart',
a TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/main',
xdr TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',
mc TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006',
r TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
drawing TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
office_document TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',
printer_settings TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings',
shared_strings TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',
styles TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
theme TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
worksheet TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',
relationships TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
core_properties TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
main TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
END OF namespace .
METHODS fill_row_outlines
IMPORTING
@ -240,8 +263,8 @@ CLASS zcl_excel_reader_2007 DEFINITION
zcx_excel .
METHODS load_comments
IMPORTING
ip_path TYPE string
io_worksheet TYPE REF TO zcl_excel_worksheet
!ip_path TYPE string
!io_worksheet TYPE REF TO zcl_excel_worksheet
RAISING
zcx_excel .
METHODS load_worksheet_hyperlinks
@ -265,8 +288,8 @@ CLASS zcl_excel_reader_2007 DEFINITION
zcx_excel .
METHODS load_worksheet_autofilter
IMPORTING
io_ixml_worksheet TYPE REF TO if_ixml_document
io_worksheet TYPE REF TO zcl_excel_worksheet
!io_ixml_worksheet TYPE REF TO if_ixml_document
!io_worksheet TYPE REF TO zcl_excel_worksheet
RAISING
zcx_excel .
METHODS load_worksheet_pagemargins
@ -278,10 +301,10 @@ CLASS zcl_excel_reader_2007 DEFINITION
"! <p class="shorttext synchronized" lang="en">Load worksheet tables</p>
METHODS load_worksheet_tables
IMPORTING
io_ixml_worksheet TYPE REF TO if_ixml_document
io_worksheet TYPE REF TO zcl_excel_worksheet
iv_dirname TYPE string
it_tables TYPE t_tables
!io_ixml_worksheet TYPE REF TO if_ixml_document
!io_worksheet TYPE REF TO zcl_excel_worksheet
!iv_dirname TYPE string
!it_tables TYPE t_tables
RAISING
zcx_excel .
CLASS-METHODS resolve_path
@ -292,7 +315,7 @@ CLASS zcl_excel_reader_2007 DEFINITION
METHODS resolve_referenced_formulae .
METHODS unescape_string_value
IMPORTING
i_value TYPE string
!i_value TYPE string
RETURNING
VALUE(result) TYPE string .
METHODS get_dxf_style_guid
@ -303,7 +326,7 @@ CLASS zcl_excel_reader_2007 DEFINITION
VALUE(rv_style_guid) TYPE zexcel_cell_style .
METHODS load_theme
IMPORTING
iv_path TYPE string
!iv_path TYPE string
!ip_excel TYPE REF TO zcl_excel
RAISING
zcx_excel .
@ -312,35 +335,22 @@ CLASS zcl_excel_reader_2007 DEFINITION
!value TYPE string
RETURNING
VALUE(is_escaped) TYPE abap_bool .
CONSTANTS: BEGIN OF namespace,
x14ac TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac',
vba_project TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', "#EC NEEDED for future incorporation of XLSM-reader
c TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/chart',
a TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/main',
xdr TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',
mc TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006',
r TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
drawing TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
office_document TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',
printer_settings TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings',
shared_strings TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',
styles TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
theme TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
worksheet TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',
relationships TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
core_properties TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
main TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
END OF namespace.
METHODS load_comment_boxes
IMPORTING
!ip_path TYPE string
!io_worksheet TYPE REF TO zcl_excel_worksheet
RAISING
zcx_excel .
PRIVATE SECTION.
DATA zip TYPE REF TO lcl_zip_archive .
DATA: gid TYPE i.
DATA gid TYPE i .
METHODS load_single_comment
IMPORTING
!io_node_comment TYPE REF TO if_ixml_element
RETURNING
VALUE(eo_comment) TYPE REF TO zcl_excel_comment .
METHODS create_zip_archive
IMPORTING
!i_xlsx_binary TYPE xstring
@ -367,7 +377,7 @@ ENDCLASS.
CLASS zcl_excel_reader_2007 IMPLEMENTATION.
CLASS ZCL_EXCEL_READER_2007 IMPLEMENTATION.
METHOD create_zip_archive.
@ -2338,13 +2348,14 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
CONSTANTS: lc_xml_attr_true TYPE string VALUE 'true',
lc_xml_attr_true_int TYPE string VALUE '1',
lc_rel_drawing TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
lc_rel_hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
lc_rel_comments TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
lc_rel_printer TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'.
CONSTANTS lc_rel_table TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'.
CONSTANTS: lc_xml_attr_true TYPE string VALUE `true`,
lc_xml_attr_true_int TYPE string VALUE `1`,
lc_rel_drawing TYPE string VALUE `http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing`,
lc_rel_vmldrawing TYPE string VALUE `http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing`,
lc_rel_hyperlink TYPE string VALUE `http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink`,
lc_rel_comments TYPE string VALUE `http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments`,
lc_rel_printer TYPE string VALUE `http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings`.
CONSTANTS lc_rel_table TYPE string VALUE `http://schemas.openxmlformats.org/officeDocument/2006/relationships/table`.
DATA: lo_ixml_worksheet TYPE REF TO if_ixml_document,
lo_ixml_cells TYPE REF TO if_ixml_node_collection,
@ -2497,6 +2508,15 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
CATCH zcx_excel. "--> then ignore it
ENDTRY.
WHEN lc_rel_vmldrawing.
* This file contains the dimensions of the boxes in which comments are displayed
TRY.
me->load_comment_boxes( ip_path = lv_path
io_worksheet = io_worksheet ).
CATCH zcx_excel. "--> then ignore it (boxes will get default values)
ENDTRY.
WHEN lc_rel_printer.
" Read Printer settings
@ -3669,48 +3689,31 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDMETHOD.
METHOD load_comments.
DATA: lo_comments_xml TYPE REF TO if_ixml_document,
DATA:
lo_comments_xml TYPE REF TO if_ixml_document,
lo_node_comment TYPE REF TO if_ixml_element,
lo_node_comment_child TYPE REF TO if_ixml_element,
lo_node_r_child_t TYPE REF TO if_ixml_element,
lo_attr TYPE REF TO if_ixml_attribute,
lo_comment TYPE REF TO zcl_excel_comment,
lv_comment_text TYPE string,
lv_node_value TYPE string,
lv_attr_value TYPE string.
lo_comment TYPE REF TO zcl_excel_comment.
lo_comments_xml = me->get_ixml_from_zip_archive( ip_path ).
lo_node_comment ?= lo_comments_xml->find_from_name_ns( name = 'comment' uri = namespace-main ).
lo_comments_xml = get_ixml_from_zip_archive( i_filename = ip_path is_normalizing = abap_false ).
lo_node_comment = lo_comments_xml->find_from_name_ns( name = 'comment' uri = namespace-main ).
WHILE lo_node_comment IS BOUND.
CLEAR lv_comment_text.
lo_attr = lo_node_comment->get_attribute_node_ns( name = 'ref' ).
lv_attr_value = lo_attr->get_value( ).
lo_node_comment_child ?= lo_node_comment->get_first_child( ).
WHILE lo_node_comment_child IS BOUND.
" There will be rPr nodes here, but we do not support them
" in comments right now; see 'load_shared_strings' for handling.
" Extract the <t>...</t> part of each <r>-tag
lo_node_r_child_t ?= lo_node_comment_child->find_from_name_ns( name = 't' uri = namespace-main ).
IF lo_node_r_child_t IS BOUND.
lv_node_value = lo_node_r_child_t->get_value( ).
CONCATENATE lv_comment_text lv_node_value INTO lv_comment_text RESPECTING BLANKS.
ENDIF.
lo_node_comment_child ?= lo_node_comment_child->get_next( ).
ENDWHILE.
CREATE OBJECT lo_comment.
lo_comment->set_text( ip_ref = lv_attr_value ip_text = lv_comment_text ).
lo_comment = load_single_comment( lo_node_comment ).
io_worksheet->add_comment( lo_comment ).
lo_node_comment ?= lo_node_comment->get_next( ).
ENDWHILE.
* If the comment boxes had been loaded before the comments themselves,
* the box dimensions have to be propagated now into the individual comments
io_worksheet->set_comment_boxes( ).
ENDMETHOD.
METHOD load_worksheet_hyperlinks.
DATA: lo_ixml_hyperlinks TYPE REF TO if_ixml_node_collection,
@ -4459,6 +4462,8 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
iv_zcl_excel_classname = iv_zcl_excel_classname ).
ENDMETHOD.
METHOD provided_string_is_escaped.
"Check if passed value is really an escaped Character
@ -4474,4 +4479,143 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDIF.
ENDMETHOD.
METHOD load_comment_boxes.
CONSTANTS:
BEGIN OF lc_namespace,
vml TYPE string VALUE `urn:schemas-microsoft-com:vml`,
excel TYPE string VALUE `urn:schemas-microsoft-com:office:excel`,
END OF lc_namespace.
DATA:
lo_anchor TYPE REF TO if_ixml_element,
lo_shape TYPE REF TO if_ixml_element,
lo_shapes TYPE REF TO if_ixml_node_collection,
lo_vml TYPE REF TO if_ixml_document,
lv_vml TYPE string,
ls_box TYPE zcl_excel_comment=>ty_box,
lt_boxes TYPE zcl_excel_comments=>ty_boxes,
lt_dims TYPE stringtab,
lv_dims TYPE string,
lv_dim TYPE string,
lv_shape_index TYPE i,
lv_total_shapes TYPE i.
FIELD-SYMBOLS:
<lv_dim> TYPE i.
lo_vml = get_ixml_from_zip_archive( ip_path ).
lo_shapes = lo_vml->get_elements_by_tag_name_ns(
name = `shape`
uri = lc_namespace-vml
).
lv_total_shapes = lo_shapes->get_length( ).
WHILE lv_shape_index < lv_total_shapes.
lo_shape ?= lo_shapes->get_item( lv_shape_index ).
CLEAR ls_box.
lo_anchor ?= lo_shape->find_from_name_ns( name = `Anchor` uri = lc_namespace-excel ).
IF lo_anchor IS BOUND.
lv_dims = lo_anchor->get_value( ).
SPLIT lv_dims AT `,` INTO TABLE lt_dims.
LOOP AT lt_dims INTO lv_dim.
ASSIGN COMPONENT sy-tabix OF STRUCTURE ls_box TO <lv_dim>.
CHECK sy-subrc EQ 0.
TRY.
<lv_dim> = lv_dim.
CATCH cx_sy_conversion_error.
ENDTRY.
ENDLOOP.
APPEND ls_box TO lt_boxes.
ENDIF.
ADD 1 TO lv_shape_index.
ENDWHILE.
* Serialize lo_vml into a string lv_vml and pass it to the comments object
CALL TRANSFORMATION id
SOURCE XML lo_vml
RESULT XML lv_vml.
IF lt_boxes IS NOT INITIAL.
io_worksheet->set_comment_boxes( it_boxes = lt_boxes iv_full_vml = lv_vml ).
ENDIF.
ENDMETHOD.
METHOD load_single_comment.
* Example
*
* <comment ref="A1" authorId="0" shapeId="0" xr:uid="{F71DF43B-AD16-449F-8E98-D378C5CB6E57}">
* <text>
* <r>
* <rPr>
* <b/>
* <sz val="9"/>
* <color indexed="81"/>
* <rFont val="Segoe UI"/>
* <family val="2"/>
* </rPr>
* <t>Info:</t>
* </r>
* <r>
* <rPr>
* <sz val="9"/>
* <color indexed="81"/>
* <rFont val="Segoe UI"/>
* <family val="2"/>
* </rPr>
* <t xml:space="preserve"> Demo Text </t>
* </r>
* ...
DATA:
lo_attr TYPE REF TO if_ixml_attribute,
lv_comment_text TYPE string,
lv_ref TYPE string.
CREATE OBJECT eo_comment.
lo_attr = io_node_comment->get_attribute_node_ns( name = 'ref' ).
lv_ref = lo_attr->get_value( ).
DATA:
lo_rs TYPE REF TO if_ixml_node_collection,
lo_r TYPE REF TO if_ixml_element,
lo_t TYPE REF TO if_ixml_element,
lo_rpr TYPE REF TO if_ixml_element,
lo_font TYPE REF TO zcl_excel_style_font,
ls_rtf TYPE zcl_excel_comment=>ty_rtf_fragment,
lt_rtf TYPE zcl_excel_comment=>ty_rtf_fragments,
lv_r_index TYPE i,
lv_total_r TYPE i.
lo_rs = io_node_comment->get_elements_by_tag_name_ns( name = `r` uri = namespace-main ).
lv_total_r = lo_rs->get_length( ).
WHILE lv_r_index < lv_total_r.
CLEAR:
ls_rtf.
lo_r ?= lo_rs->get_item( lv_r_index ).
lo_rpr ?= lo_r->find_from_name_ns( name = `rPr` uri = namespace-main ).
IF lo_rpr IS BOUND.
lo_font = load_style_font( lo_rpr ).
ls_rtf-rtf = lo_font->get_structure( ).
ENDIF.
lo_t ?= lo_r->find_from_name_ns( name = `t` uri = namespace-main ).
IF lo_t IS BOUND.
ls_rtf-text = lo_t->get_value( ).
ENDIF.
APPEND ls_rtf TO lt_rtf.
ADD 1 TO lv_r_index.
ENDWHILE.
eo_comment->set_text_rtf( ip_ref = lv_ref it_rtf = lt_rtf ).
ENDMETHOD.
ENDCLASS.

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
@ -73,6 +73,11 @@
<LANGU>E</LANGU>
<DESCRIPT>Table with external hyperlinks</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>LOAD_COMMENT_BOXES</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Loads worksheet drawings</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>LOAD_DRAWING_ANCHOR</CMPNAME>
<LANGU>E</LANGU>
@ -234,6 +239,20 @@
<DESCRIPT>Zip Utility</DESCRIPT>
</SEOCOMPOTX>
</DESCRIPTIONS>
<DESCRIPTIONS_SUB>
<SEOSUBCOTX>
<CMPNAME>LOAD_SINGLE_COMMENT</CMPNAME>
<SCONAME>EO_COMMENT</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Comment</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>LOAD_SINGLE_COMMENT</CMPNAME>
<SCONAME>IO_NODE_COMMENT</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Element of an XML Document</DESCRIPT>
</SEOSUBCOTX>
</DESCRIPTIONS_SUB>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -3,13 +3,13 @@ CLASS zcl_excel_worksheet DEFINITION
CREATE PUBLIC .
PUBLIC SECTION.
*"* public components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!!
INTERFACES zif_excel_sheet_printsettings .
INTERFACES zif_excel_sheet_properties .
INTERFACES zif_excel_sheet_protection .
@ -21,7 +21,8 @@ CLASS zcl_excel_worksheet DEFINITION
row_to TYPE i,
collapsed TYPE abap_bool,
END OF mty_s_outline_row .
TYPES: mty_ts_outlines_row TYPE SORTED TABLE OF mty_s_outline_row WITH UNIQUE KEY primary_key COMPONENTS row_from row_to
TYPES:
mty_ts_outlines_row TYPE SORTED TABLE OF mty_s_outline_row WITH UNIQUE KEY primary_key COMPONENTS row_from row_to
WITH NON-UNIQUE SORTED KEY row_to COMPONENTS row_to collapsed .
TYPES:
BEGIN OF mty_s_ignored_errors,
@ -75,7 +76,6 @@ CLASS zcl_excel_worksheet DEFINITION
END OF mty_merge .
TYPES:
mty_ts_merge TYPE SORTED TABLE OF mty_merge WITH UNIQUE KEY table_line .
TYPES:
ty_area TYPE c LENGTH 1 .
@ -694,6 +694,10 @@ CLASS zcl_excel_worksheet DEFINITION
!er_data TYPE REF TO data
RAISING
zcx_excel .
METHODS set_comment_boxes
IMPORTING
!it_boxes TYPE zcl_excel_comments=>ty_boxes OPTIONAL
!iv_full_vml TYPE string OPTIONAL .
PROTECTED SECTION.
METHODS set_table_reference
IMPORTING
@ -857,7 +861,7 @@ ENDCLASS.
CLASS zcl_excel_worksheet IMPLEMENTATION.
CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
METHOD add_comment.
@ -2612,16 +2616,11 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
METHOD get_comments.
DATA: lo_comment TYPE REF TO zcl_excel_comment,
lo_iterator TYPE REF TO zcl_excel_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.
* Create a copy of the comments attribute
CREATE OBJECT r_comments
EXPORTING
io_from = comments.
ENDMETHOD. "get_comments
@ -4869,4 +4868,9 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
METHOD zif_excel_sheet_vba_project~set_codename_pr.
me->zif_excel_sheet_vba_project~codename_pr = ip_codename_pr.
ENDMETHOD. "ZIF_EXCEL_SHEET_VBA_PROJECT~SET_CODENAME_PR
METHOD set_comment_boxes.
comments->set_boxes( it_boxes = it_boxes iv_full_vml = iv_full_vml ).
ENDMETHOD.
ENDCLASS.

View File

@ -503,6 +503,11 @@
<LANGU>E</LANGU>
<DESCRIPT>Set column width</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>SET_COMMENT_BOXES</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Set dimensions of info boxes for comments</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>SET_DEFAULT_EXCEL_DATE_FORMAT</CMPNAME>
<LANGU>E</LANGU>

View File

@ -11,36 +11,39 @@ CLASS zcl_excel_writer_2007 DEFINITION
PROTECTED SECTION.
TYPES:
*"* protected components of class ZCL_EXCEL_WRITER_2007
*"* do not include other source files here!!!
TYPES: BEGIN OF mty_column_formula_used,
BEGIN OF mty_column_formula_used,
id TYPE zexcel_s_cell_data-column_formula_id,
si TYPE string,
"! type: shared, etc.
t TYPE string,
END OF mty_column_formula_used,
END OF mty_column_formula_used .
TYPES:
mty_column_formulas_used TYPE HASHED TABLE OF mty_column_formula_used WITH UNIQUE KEY id .
CONSTANTS c_content_types TYPE string VALUE '[Content_Types].xml'. "#EC NOTEXT
CONSTANTS c_docprops_app TYPE string VALUE 'docProps/app.xml'. "#EC NOTEXT
CONSTANTS c_docprops_core TYPE string VALUE 'docProps/core.xml'. "#EC NOTEXT
CONSTANTS c_relationships TYPE string VALUE '_rels/.rels'. "#EC NOTEXT
CONSTANTS c_xl_calcchain TYPE string VALUE 'xl/calcChain.xml'. "#EC NOTEXT
CONSTANTS c_xl_drawings TYPE string VALUE 'xl/drawings/drawing#.xml'. "#EC NOTEXT
CONSTANTS c_xl_drawings_rels TYPE string VALUE 'xl/drawings/_rels/drawing#.xml.rels'. "#EC NOTEXT
CONSTANTS c_xl_relationships TYPE string VALUE 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT
CONSTANTS c_xl_sharedstrings TYPE string VALUE 'xl/sharedStrings.xml'. "#EC NOTEXT
CONSTANTS c_xl_sheet TYPE string VALUE 'xl/worksheets/sheet#.xml'. "#EC NOTEXT
CONSTANTS c_xl_sheet_rels TYPE string VALUE 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT
CONSTANTS c_xl_styles TYPE string VALUE 'xl/styles.xml'. "#EC NOTEXT
CONSTANTS c_xl_theme TYPE string VALUE 'xl/theme/theme1.xml'. "#EC NOTEXT
CONSTANTS c_xl_workbook TYPE string VALUE 'xl/workbook.xml'. "#EC NOTEXT
CONSTANTS c_content_types TYPE string VALUE '[Content_Types].xml' ##NO_TEXT.
CONSTANTS c_docprops_app TYPE string VALUE 'docProps/app.xml' ##NO_TEXT.
CONSTANTS c_docprops_core TYPE string VALUE 'docProps/core.xml' ##NO_TEXT.
CONSTANTS c_relationships TYPE string VALUE '_rels/.rels' ##NO_TEXT.
CONSTANTS c_xl_calcchain TYPE string VALUE 'xl/calcChain.xml' ##NO_TEXT.
CONSTANTS c_xl_drawings TYPE string VALUE 'xl/drawings/drawing#.xml' ##NO_TEXT.
CONSTANTS c_xl_drawings_rels TYPE string VALUE 'xl/drawings/_rels/drawing#.xml.rels' ##NO_TEXT.
CONSTANTS c_xl_relationships TYPE string VALUE 'xl/_rels/workbook.xml.rels' ##NO_TEXT.
CONSTANTS c_xl_sharedstrings TYPE string VALUE 'xl/sharedStrings.xml' ##NO_TEXT.
CONSTANTS c_xl_sheet TYPE string VALUE 'xl/worksheets/sheet#.xml' ##NO_TEXT.
CONSTANTS c_xl_sheet_rels TYPE string VALUE 'xl/worksheets/_rels/sheet#.xml.rels' ##NO_TEXT.
CONSTANTS c_xl_styles TYPE string VALUE 'xl/styles.xml' ##NO_TEXT.
CONSTANTS c_xl_theme TYPE string VALUE 'xl/theme/theme1.xml' ##NO_TEXT.
CONSTANTS c_xl_workbook TYPE string VALUE 'xl/workbook.xml' ##NO_TEXT.
DATA excel TYPE REF TO zcl_excel .
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'. "#EC NOTEXT
CONSTANTS cl_xl_drawing_for_comments TYPE string VALUE 'xl/drawings/vmlDrawing#.vml'. "#EC NOTEXT
CONSTANTS c_xl_drawings_vml_rels TYPE string VALUE 'xl/drawings/_rels/vmlDrawing#.vml.rels'. "#EC NOTEXT
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.
CONSTANTS c_xl_drawings_vml_rels TYPE string VALUE 'xl/drawings/_rels/vmlDrawing#.vml.rels' ##NO_TEXT.
DATA ixml TYPE REF TO if_ixml .
DATA control_characters TYPE string .
@ -132,9 +135,9 @@ CLASS zcl_excel_writer_2007 DEFINITION
zcx_excel .
METHODS create_xl_sheet_ignored_errors
IMPORTING
io_worksheet TYPE REF TO zcl_excel_worksheet
io_document TYPE REF TO if_ixml_document
io_element_root TYPE REF TO if_ixml_element.
!io_worksheet TYPE REF TO zcl_excel_worksheet
!io_document TYPE REF TO if_ixml_document
!io_element_root TYPE REF TO if_ixml_element .
METHODS create_xl_sheet_pagebreaks
IMPORTING
!io_document TYPE REF TO if_ixml_document
@ -226,44 +229,53 @@ CLASS zcl_excel_writer_2007 DEFINITION
VALUE(ro_document) TYPE REF TO if_ixml_document .
METHODS render_xml_document
IMPORTING
io_document TYPE REF TO if_ixml_document
!io_document TYPE REF TO if_ixml_document OPTIONAL
!iv_document_as_string TYPE string OPTIONAL
PREFERRED PARAMETER io_document
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_sheet_column_formula
IMPORTING
io_document TYPE REF TO if_ixml_document
it_column_formulas TYPE zcl_excel_worksheet=>mty_th_column_formula
is_sheet_content TYPE zexcel_s_cell_data
!io_document TYPE REF TO if_ixml_document
!it_column_formulas TYPE zcl_excel_worksheet=>mty_th_column_formula
!is_sheet_content TYPE zexcel_s_cell_data
EXPORTING
eo_element TYPE REF TO if_ixml_element
!eo_element TYPE REF TO if_ixml_element
CHANGING
ct_column_formulas_used TYPE mty_column_formulas_used
cv_si TYPE i
!ct_column_formulas_used TYPE mty_column_formulas_used
!cv_si TYPE i
RAISING
zcx_excel .
METHODS is_formula_shareable
IMPORTING
ip_formula TYPE string
!ip_formula TYPE string
RETURNING
VALUE(ep_shareable) TYPE abap_bool
RAISING
zcx_excel .
PRIVATE SECTION.
TYPES:
tv_charbool TYPE c LENGTH 5 .
*"* private components of class ZCL_EXCEL_WRITER_2007
*"* do not include other source files here!!!
CONSTANTS c_off TYPE string VALUE '0'. "#EC NOTEXT
CONSTANTS c_on TYPE string VALUE '1'. "#EC NOTEXT
CONSTANTS c_xl_printersettings TYPE string VALUE 'xl/printerSettings/printerSettings#.bin'. "#EC NOTEXT
TYPES: tv_charbool TYPE c LENGTH 5.
CONSTANTS c_off TYPE string VALUE '0' ##NO_TEXT.
CONSTANTS c_on TYPE string VALUE '1' ##NO_TEXT.
CONSTANTS c_xl_printersettings TYPE string VALUE 'xl/printerSettings/printerSettings#.bin' ##NO_TEXT.
METHODS get_comment_anchor
IMPORTING
!io_comment TYPE REF TO zcl_excel_comment
RETURNING
VALUE(ev_anchor) TYPE string .
METHODS add_1_val_child_node
IMPORTING
io_document TYPE REF TO if_ixml_document
io_parent TYPE REF TO if_ixml_element
iv_elem_name TYPE string
iv_attr_name TYPE string
iv_attr_value TYPE string.
!io_document TYPE REF TO if_ixml_document
!io_parent TYPE REF TO if_ixml_element
!iv_elem_name TYPE string
!iv_attr_name TYPE string
!iv_attr_value TYPE string .
METHODS flag2bool
IMPORTING
!ip_flag TYPE flag
@ -278,7 +290,7 @@ ENDCLASS.
CLASS zcl_excel_writer_2007 IMPLEMENTATION.
CLASS ZCL_EXCEL_WRITER_2007 IMPLEMENTATION.
METHOD add_1_val_child_node.
@ -2338,132 +2350,99 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
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_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_iterator TYPE REF TO zcl_excel_collection_iterator,
DATA:
lo_comment TYPE REF TO zcl_excel_comment,
lo_comments TYPE REF TO zcl_excel_comments,
lo_comment TYPE REF TO zcl_excel_comment.
DATA: lv_rel_id TYPE i,
lo_document TYPE REF TO if_ixml_document,
lo_element_author TYPE REF TO if_ixml_element,
lo_element_authors TYPE REF TO if_ixml_element,
lo_element_comment TYPE REF TO if_ixml_element,
lo_element_commentlist TYPE REF TO if_ixml_element,
lo_element_r TYPE REF TO if_ixml_element,
lo_element_root TYPE REF TO if_ixml_element,
lo_element_rpr TYPE REF TO if_ixml_element,
lo_element_t TYPE REF TO if_ixml_element,
lo_element_text TYPE REF TO if_ixml_element,
lo_iterator TYPE REF TO zcl_excel_collection_iterator,
lv_author TYPE string.
**********************************************************************
* STEP 1: Create [Content_Types].xml into the root of the ZIP
lo_document = create_xml_document( ).
***********************************************************************
* STEP 3: Create main node relationships
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_comments
lo_element_root = lo_document->create_simple_element( name = `comments`
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_ns ).
lo_element_root->set_attribute_ns( name = `xmlns`
value = `http://schemas.openxmlformats.org/spreadsheetml/2006/main` ).
**********************************************************************
* 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_authors = lo_document->create_simple_element( name = `authors`
parent = lo_element_root ).
lo_element_author = lo_document->create_simple_element( name = lc_xml_node_author
parent = lo_document ).
lo_element_author = lo_document->create_simple_element( name = `author`
parent = lo_element_authors ).
lv_author = sy-uname.
lo_element_author->set_value( lv_author ).
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_element_commentlist = lo_document->create_simple_element( name = `commentList`
parent = lo_element_root ).
lo_comments = io_worksheet->get_comments( ).
DATA:
lt_rtf TYPE zcl_excel_comment=>ty_rtf_fragments.
FIELD-SYMBOLS:
<ls_rtf> TYPE zcl_excel_comment=>ty_rtf_fragment.
lo_iterator = lo_comments->get_iterator( ).
WHILE lo_iterator->has_next( ) EQ abap_true.
lo_comment ?= lo_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
lo_element_comment = lo_document->create_simple_element( name = `comment`
parent = lo_element_commentlist ).
lo_element_comment->set_attribute_ns( name = `ref`
value = lo_comment->get_ref( ) ).
lo_element_comment->set_attribute_ns( name = lc_xml_attr_authorid
value = '0' ). " TO-DO
lo_element_comment->set_attribute_ns( name = `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_text = lo_document->create_simple_element( name = `text`
parent = lo_element_comment ).
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 ).
lt_rtf = lo_comment->get_text_rtf( ).
add_1_val_child_node( io_document = lo_document io_parent = lo_element_rpr iv_elem_name = lc_xml_node_sz iv_attr_name = lc_xml_attr_val iv_attr_value = '9' ).
add_1_val_child_node( io_document = lo_document io_parent = lo_element_rpr iv_elem_name = lc_xml_node_color iv_attr_name = lc_xml_attr_indexed iv_attr_value = '81' ).
add_1_val_child_node( io_document = lo_document io_parent = lo_element_rpr iv_elem_name = lc_xml_node_rfont iv_attr_name = lc_xml_attr_val iv_attr_value = 'Tahoma' ).
add_1_val_child_node( io_document = lo_document io_parent = lo_element_rpr iv_elem_name = lc_xml_node_family iv_attr_name = lc_xml_attr_val iv_attr_value = '2' ).
LOOP AT lt_rtf ASSIGNING <ls_rtf>.
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_r = lo_document->create_simple_element( name = `r`
parent = lo_element_text ).
lo_element_rpr = lo_document->create_simple_element( name = `rPr`
parent = lo_element_r ).
create_xl_styles_font_node(
io_document = lo_document
io_parent = lo_element_rpr
is_font = <ls_rtf>-rtf
iv_use_rtf = abap_true " generate <rFont>, not <name> element for font
).
lo_element_t = lo_document->create_simple_element( name = `t`
parent = lo_element_r ).
lo_element_t->set_attribute_ns( name = `xml:space`
value = `preserve` ).
lo_element_t->set_value( <ls_rtf>-text ).
ENDLOOP.
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
ep_content = render_xml_document( lo_document ).
@ -3096,61 +3075,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
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_document TYPE REF TO if_ixml_document,
lo_element_root TYPE REF TO if_ixml_element,
@ -3175,6 +3099,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_element_row TYPE REF TO if_ixml_element,
lo_element_column TYPE REF TO if_ixml_element,
lo_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_anchors TYPE REF TO if_ixml_node_collection,
lo_anchor TYPE REF TO if_ixml_element,
lo_comments TYPE REF TO zcl_excel_comments,
lo_comment TYPE REF TO zcl_excel_comment,
lv_row TYPE zexcel_cell_row,
@ -3184,18 +3110,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lv_attr_id_index TYPE i,
lv_attr_id TYPE string,
lv_int_value TYPE i,
lv_int_value_string TYPE string.
DATA: lv_rel_id TYPE i.
DATA lv_anchor TYPE string.
DATA lv_bottom_row TYPE i.
DATA lv_right_column TYPE i.
DATA lv_bottom_row_str TYPE string.
DATA lv_right_column_str TYPE string.
DATA lv_top_row TYPE i.
DATA lv_left_column TYPE i.
DATA lv_top_row_str TYPE string.
DATA lv_left_column_str TYPE string.
lv_int_value_string TYPE string,
lv_anchor TYPE string.
lo_comments = io_worksheet->get_comments( ).
IF lo_comments->gv_full_vml IS INITIAL.
**********************************************************************
* STEP 1: Create XML document
@ -3203,59 +3122,48 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
***********************************************************************
* 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 ).
lo_element_root->set_attribute_ns( name = 'xmlns:o' value = lc_xml_node_ns_o ).
lo_element_root->set_attribute_ns( name = 'xmlns:x' value = lc_xml_node_ns_x ).
lo_element_root = lo_document->create_simple_element( name = `xml` parent = lo_document ).
lo_element_root->set_attribute_ns( name = `xmlns:v` value = `urn:schemas-microsoft-com:vml` ).
lo_element_root->set_attribute_ns( name = `xmlns:o` value = `urn:schemas-microsoft-com:office:office` ).
lo_element_root->set_attribute_ns( name = `xmlns:x` value = `urn:schemas-microsoft-com:office:excel` ).
**********************************************************************
* 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 = lo_document->create_simple_element( name = `o:shapelayout`
parent = lo_element_root ).
lo_element_shapelayout->set_attribute_ns( name = lc_xml_attr_vext
value = lc_xml_attr_val_edit ).
lo_element_shapelayout->set_attribute_ns( name = `v:ext`
value = `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 ).
lo_element_idmap->set_attribute_ns( 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 ).
lo_element_idmap = lo_document->create_simple_element( name = `o:idmap`
parent = lo_element_shapelayout ).
lo_element_idmap->set_attribute_ns( name = `v:ext` value = `edit` ).
lo_element_idmap->set_attribute_ns( name = `data` value = `1` ).
**********************************************************************
* STEP 4: Create v:shapetype
lo_element_shapetype = lo_document->create_simple_element( name = lc_xml_node_shapetype
parent = lo_document ).
lo_element_shapetype = lo_document->create_simple_element( name = `v:shapetype`
parent = lo_element_root ).
lo_element_shapetype->set_attribute_ns( name = lc_xml_attr_id value = '_x0000_t202' ).
lo_element_shapetype->set_attribute_ns( name = lc_xml_attr_coordsize value = '21600,21600' ).
lo_element_shapetype->set_attribute_ns( name = lc_xml_attr_ospt value = '202' ).
lo_element_shapetype->set_attribute_ns( name = lc_xml_attr_path value = 'm,l,21600r21600,l21600,xe' ).
lo_element_shapetype->set_attribute_ns( name = `id` value = `_x0000_t202` ).
lo_element_shapetype->set_attribute_ns( name = `coordsize` value = `21600,21600` ).
lo_element_shapetype->set_attribute_ns( name = `o:spt` value = `202` ).
lo_element_shapetype->set_attribute_ns( name = `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_stroke = lo_document->create_simple_element( name = `v:stroke`
parent = lo_element_shapetype ).
lo_element_stroke->set_attribute_ns( name = `joinstyle` value = `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 ).
lo_element_path->set_attribute_ns( name = lc_xml_attr_oconnecttype value = lc_xml_attr_val_rect ).
lo_element_shapetype->append_child( new_child = lo_element_stroke ).
lo_element_shapetype->append_child( new_child = lo_element_path ).
lo_element_root->append_child( new_child = lo_element_shapetype ).
lo_element_path = lo_document->create_simple_element( name = `v:path`
parent = lo_element_shapetype ).
lo_element_path->set_attribute_ns( name = `gradientshapeok` value = `t` ).
lo_element_path->set_attribute_ns( name = `o:connecttype` value = `rect` ).
**********************************************************************
* STEP 4: Create v:shapetype
lo_comments = io_worksheet->get_comments( ).
lo_iterator = lo_comments->get_iterator( ).
WHILE lo_iterator->has_next( ) EQ abap_true.
@ -3267,56 +3175,54 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
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 = lo_document->create_simple_element( name = `v:shape`
parent = lo_element_root ).
lv_attr_id_index = 1024 + lv_index.
lv_attr_id = lv_attr_id_index.
CONCATENATE '_x0000_s' lv_attr_id INTO lv_attr_id.
lo_element_shape->set_attribute_ns( name = lc_xml_attr_id value = lv_attr_id ).
lo_element_shape->set_attribute_ns( name = lc_xml_attr_type value = '#_x0000_t202' ).
lo_element_shape->set_attribute_ns( 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' ).
lo_element_shape->set_attribute_ns( name = lc_xml_attr_fillcolor value = '#ffffe1' ).
lo_element_shape->set_attribute_ns( name = lc_xml_attr_oinsetmode value = lc_xml_attr_val_auto ).
CONCATENATE `_x0000_s` lv_attr_id INTO lv_attr_id.
lo_element_shape->set_attribute_ns( name = `id` value = lv_attr_id ).
lo_element_shape->set_attribute_ns( name = `type` value = `#_x0000_t202` ).
lo_element_shape->set_attribute_ns( name = `style` value = `size:auto;width:auto;height:auto;position:absolute;margin-left:117pt;margin-top:172.5pt;z-index:1;visibility:hidden` ).
lo_element_shape->set_attribute_ns( name = `fillcolor` value = `#ffffe1` ).
lo_element_shape->set_attribute_ns( name = `o:insetmode` value = `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 ).
lo_element_fill = lo_document->create_simple_element( name = `v:fill`
parent = lo_element_shape ).
lo_element_fill->set_attribute_ns( name = `color2` value = `#ffffe1` ).
" 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 ).
lo_element_shadow->set_attribute_ns( name = lc_xml_attr_color value = lc_xml_attr_val_black ).
lo_element_shadow->set_attribute_ns( name = lc_xml_attr_obscured value = lc_xml_attr_val_t ).
lo_element_shape->append_child( new_child = lo_element_shadow ).
lo_element_shadow = lo_document->create_simple_element( name = `v:shadow`
parent = lo_element_shape ).
lo_element_shadow->set_attribute_ns( name = `on` value = `t` ).
lo_element_shadow->set_attribute_ns( name = `color` value = `black` ).
lo_element_shadow->set_attribute_ns( name = `obscured` value = `t` ).
" 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 ).
lo_element_path = lo_document->create_simple_element( name = `v:path`
parent = lo_element_shape ).
lo_element_path->set_attribute_ns( name = `o:connecttype` value = `none` ).
" 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 ).
lo_element_textbox = lo_document->create_simple_element( name = `v:textbox`
parent = lo_element_shape ).
lo_element_textbox->set_attribute_ns( name = `style` value = `mso-direction-alt:auto` ).
lo_element_div = lo_document->create_simple_element( name = `div`
parent = lo_element_div ).
lo_element_div->set_attribute_ns( name = `style` value = `text-align:left` ).
" 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_clientdata = lo_document->create_simple_element( name = `x:ClientData`
parent = lo_element_shape ).
lo_element_clientdata->set_attribute_ns( name = `ObjectType` value = `Note` ).
lo_element_movewithcells = lo_document->create_simple_element( name = `x:MoveWithCells`
parent = lo_element_clientdata ).
lo_element_sizewithcells = lo_document->create_simple_element( name = `x:SizeWithCells`
parent = lo_element_clientdata ).
lo_element_anchor = lo_document->create_simple_element( name = `x:Anchor`
parent = lo_element_clientdata ).
" Anchor represents 4 pairs of numbers:
" ( left column, left offset ), ( top row, top offset ),
@ -3324,43 +3230,60 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
" Offsets are a number of pixels.
" Reference: Anchor Class at
" https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.vml.spreadsheet.anchor?view=openxml-3.0.1
lv_anchor = number2string( lo_comment->get_left_column( ) )
&& `, ` && number2string( lo_comment->get_left_offset( ) )
&& `, ` && number2string( lo_comment->get_top_row( ) )
&& `, ` && number2string( lo_comment->get_top_offset( ) )
&& `, ` && number2string( lo_comment->get_right_column( ) )
&& `, ` && number2string( lo_comment->get_right_offset( ) )
&& `, ` && number2string( lo_comment->get_bottom_row( ) )
&& `, ` && number2string( lo_comment->get_bottom_offset( ) ).
lv_anchor = get_comment_anchor( lo_comment ).
lo_element_anchor->set_value( lv_anchor ).
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_autofill = lo_document->create_simple_element( name = `x:AutoFill`
parent = lo_element_clientdata ).
lo_element_autofill->set_value( `False` ).
lo_element_row = lo_document->create_simple_element( name = `x:Row`
parent = lo_element_clientdata ).
lv_int_value = lv_row - 1.
lv_int_value_string = lv_int_value.
lo_element_row->set_value( lv_int_value_string ).
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 = lo_document->create_simple_element( name = `x:Column`
parent = lo_element_clientdata ).
lv_int_value = lv_column - 1.
lv_int_value_string = lv_int_value.
lo_element_column->set_value( lv_int_value_string ).
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
ep_content = render_xml_document( lo_document ).
ELSE.
* Replace the eight numbers in <x:Anchor> with the current values
* (they may have been changed before calling the writer
lo_document = ixml->create_document( ).
CALL TRANSFORMATION id
SOURCE XML lo_comments->gv_full_vml
RESULT XML lo_document.
lo_anchors = lo_document->get_elements_by_tag_name_ns(
name = `anchor`
uri = `urn:schemas-microsoft-com:office:excel`
).
lo_iterator = lo_comments->get_iterator( ).
WHILE lo_iterator->has_next( ) EQ abap_true.
lo_anchor ?= lo_anchors->get_item( sy-index - 1 ).
IF lo_anchor IS NOT BOUND.
EXIT.
ENDIF.
lo_comment ?= lo_iterator->get_next( ).
lv_anchor = get_comment_anchor( lo_comment ).
lo_anchor->set_value( lv_anchor ).
ENDWHILE.
ep_content = render_xml_document( lo_document ).
ENDIF.
ENDMETHOD.
@ -4430,8 +4353,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_element_2->set_attribute_ns( name = 's' value = lv_value ).
lo_element_2->set_attribute_ns( name = 'customFormat' value = '1' ).
ENDIF.
ELSE.
ENDIF.
ENDWHILE.
@ -6254,10 +6175,14 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
" and then to convert the STRING variable to UTF-8 using method CL_ABAP_CODEPAGE=>CONVERT_TO.
" 1) RENDER TO XML STRING
IF io_document IS BOUND.
lo_streamfactory = me->ixml->create_stream_factory( ).
lo_ostream = lo_streamfactory->create_ostream_cstring( string = lv_string ).
lo_renderer = me->ixml->create_renderer( ostream = lo_ostream document = io_document ).
lo_renderer->render( ).
ELSE.
lv_string = iv_document_as_string.
ENDIF.
" 2) CONVERT IT TO UTF-8
"-----------------
@ -6571,4 +6496,17 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ep_file = me->create( ).
ENDMETHOD.
METHOD get_comment_anchor.
ev_anchor = number2string( io_comment->get_left_column( ) )
&& `, ` && number2string( io_comment->get_left_offset( ) )
&& `, ` && number2string( io_comment->get_top_row( ) )
&& `, ` && number2string( io_comment->get_top_offset( ) )
&& `, ` && number2string( io_comment->get_right_column( ) )
&& `, ` && number2string( io_comment->get_right_offset( ) )
&& `, ` && number2string( io_comment->get_bottom_row( ) )
&& `, ` && number2string( io_comment->get_bottom_offset( ) ).
CONDENSE ev_anchor.
ENDMETHOD.
ENDCLASS.

View File

@ -53,6 +53,11 @@
<LANGU>E</LANGU>
<DESCRIPT>Create &apos;xl/charts/chart1.xml&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>CREATE_XL_COMMENTS</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create &apos;xl/comments1.xml&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>CREATE_XL_DRAWINGS</CMPNAME>
<LANGU>E</LANGU>
@ -83,6 +88,11 @@
<LANGU>E</LANGU>
<DESCRIPT>Create &apos;xl/drawings/drawing1.xml&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>CREATE_XL_DRAWING_FOR_COMMENTS</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create &apos;xl/drawings/vmlDrawing1.vml&apos; (style for comments)</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>CREATE_XL_RELATIONSHIPS</CMPNAME>
<LANGU>E</LANGU>
@ -269,6 +279,26 @@
<DESCRIPT>Styles mapping</DESCRIPT>
</SEOCOMPOTX>
</DESCRIPTIONS>
<DESCRIPTIONS_SUB>
<SEOSUBCOTX>
<CMPNAME>GET_COMMENT_ANCHOR</CMPNAME>
<SCONAME>IO_COMMENT</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Comment</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>RENDER_XML_DOCUMENT</CMPNAME>
<SCONAME>IO_DOCUMENT</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>XML Doc as object</DESCRIPT>
</SEOSUBCOTX>
<SEOSUBCOTX>
<CMPNAME>RENDER_XML_DOCUMENT</CMPNAME>
<SCONAME>IV_DOCUMENT_AS_STRING</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>XML Doc as string</DESCRIPT>
</SEOSUBCOTX>
</DESCRIPTIONS_SUB>
</asx:values>
</asx:abap>
</abapGit>