class ZCL_EXCEL_WRITER_2007 definition
public
create public .
public section.
*"* public components of class ZCL_EXCEL_WRITER_2007
*"* do not include other source files here!!!
interfaces ZIF_EXCEL_WRITER .protected section.
*"* protected components of class ZCL_EXCEL_WRITER_2007
*"* do not include other source files here!!!
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_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
data EXCEL type ref to ZCL_EXCEL .
methods CREATE
returning
value(EP_EXCEL) type XSTRING .
methods CREATE_CONTENT_TYPES
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_DOCPROPS_APP
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_DOCPROPS_CORE
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_RELATIONSHIPS
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_DRAWINGS
importing
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_DRAWINGS_RELS
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 .
methods CREATE_XL_SHAREDSTRINGS
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_SHEET
importing
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
!IV_ACTIVE type FLAG default ''
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_SHEET_RELS
importing
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
!IV_DRAWING_INDEX type I
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_STYLES_COLOR_NODE
importing
!IO_DOCUMENT type ref to IF_IXML_DOCUMENT
!IO_PARENT type ref to IF_IXML_ELEMENT
!IV_COLOR_ELEM_NAME type STRING default 'color'
!IS_COLOR type ZEXCEL_S_STYLE_COLOR .
methods CREATE_XL_STYLES
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_TABLE
importing
!IO_TABLE type ref to ZCL_EXCEL_TABLE
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_THEME
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_WORKBOOK
returning
value(EP_CONTENT) type XSTRING .private section.
*"* 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
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 .
methods FLAG2BOOL
importing
!IP_FLAG type FLAG
returning
value(EP_BOOLEAN) type CHAR5 .
methods GET_SHARED_STRING_INDEX
importing
!IP_CELL_VALUE type ZEXCEL_CELL_VALUE
returning
value(EP_INDEX) type INT4 .*"* local class implementation for public class
*"* use this source file for the implementation part of
*"* local helper classes*"* use this source file for any type declarations (class
*"* definitions, interfaces or data types) you need for method
*"* implementation or private method's signature*"* use this source file for any macro definitions you need
*"* in the implementation part of the classmethod ZIF_EXCEL_WRITER~WRITE_FILE.
me->excel = io_excel.
ep_file = me->create( ).
endmethod.method CREATE.
* Office 2007 file format is a cab of several xml files with extension .xlsx
DATA: lo_zip TYPE REF TO cl_abap_zip,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_active_worksheet TYPE REF TO zcl_excel_worksheet,
lo_iterator TYPE REF TO cl_object_collection_iterator,
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.
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.
**********************************************************************
* STEP 1: Create archive object file (ZIP)
CREATE OBJECT lo_zip.
**********************************************************************
* STEP 2: Add [Content_Types].xml to zip
lv_content = me->create_content_types( ).
lo_zip->add( name = me->c_content_types
content = lv_content ).
**********************************************************************
* STEP 3: Add _rels/.rels to zip
lv_content = me->create_relationships( ).
lo_zip->add( name = me->c_relationships
content = lv_content ).
**********************************************************************
* STEP 4: Add docProps/app.xml to zip
lv_content = me->create_docprops_app( ).
lo_zip->add( name = me->c_docprops_app
content = lv_content ).
**********************************************************************
* STEP 5: Add docProps/core.xml to zip
lv_content = me->create_docprops_core( ).
lo_zip->add( name = me->c_docprops_core
content = lv_content ).
**********************************************************************
* STEP 6: Add xl/_rels/workbook.xml.rels to zip
lv_content = me->create_xl_relationships( ).
lo_zip->add( name = me->c_xl_relationships
content = lv_content ).
**********************************************************************
* STEP 6: Add xl/_rels/workbook.xml.rels to zip
lv_content = me->create_xl_theme( ).
lo_zip->add( name = me->c_xl_theme
content = lv_content ).
**********************************************************************
* STEP 7: Add xl/workbook.xml to zip
lv_content = me->create_xl_workbook( ).
lo_zip->add( name = me->c_xl_workbook
content = lv_content ).
**********************************************************************
* STEP 8: Add xl/workbook.xml to zip
* lv_content = me->create_xl_styles_static( ).
lv_content = me->create_xl_styles( ).
lo_zip->add( name = me->c_xl_styles
content = lv_content ).
**********************************************************************
* STEP 9: Add sharedStrings.xml to zip
lv_content = me->create_xl_sharedstrings( ).
lo_zip->add( name = me->c_xl_sharedstrings
content = lv_content ).
**********************************************************************
* STEP 10: Add sheet#.xml and drawing#.xml to zip
lo_iterator = me->excel->get_worksheets_iterator( ).
lo_active_worksheet = me->excel->get_active_worksheet( ).
lv_drawing_index = 1.
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ).
IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ).
lv_active = abap_true.
ELSE.
lv_active = abap_false.
ENDIF.
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.
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.
lo_zip->add( name = lv_xl_sheet
content = lv_content ).
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 ).
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex.
lo_zip->add( name = lv_xl_sheet_rels
content = lv_content ).
lo_nested_iterator = lo_worksheet->get_tables_iterator( ).
WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ).
lv_content = me->create_xl_table( lo_table ).
lv_value = lo_table->get_name( ).
CONCATENATE 'xl/tables/' lv_value '.xml' INTO lv_value.
lo_zip->add( name = lv_value
content = lv_content ).
ENDWHILE.
* Add drawings **********************************
lo_drawings = lo_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
MOVE lv_drawing_index TO lv_syindex.
SHIFT lv_syindex RIGHT DELETING TRAILING space.
SHIFT lv_syindex LEFT DELETING LEADING space.
lv_content = me->create_xl_drawings( lo_worksheet ).
lv_xl_drawing = me->c_xl_drawings.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_syindex.
lo_zip->add( name = lv_xl_drawing
content = lv_content ).
lv_content = me->create_xl_drawings_rels( lo_worksheet ).
lv_xl_drawing_rels = me->c_xl_drawings_rels.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_syindex.
lo_zip->add( name = lv_xl_drawing_rels
content = lv_content ).
ADD 1 TO lv_drawing_index.
ENDIF.
ENDWHILE.
**********************************************************************
* STEP 11: Add media
lo_iterator = me->excel->get_drawings_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
lv_content = lo_drawing->get_media( ).
lv_value = lo_drawing->get_media_name( ).
CONCATENATE 'xl/media/' lv_value INTO lv_value.
lo_zip->add( name = lv_value
content = lv_content ).
ENDWHILE.
**********************************************************************
* STEP 12: Create the final zip
ep_excel = lo_zip->save( ).
endmethod.method CREATE_CONTENT_TYPES.
** Constant node name
DATA: lc_xml_node_types TYPE string VALUE 'Types',
lc_xml_node_override TYPE string VALUE 'Override',
lc_xml_node_default TYPE string VALUE 'Default',
" Node attributes
lc_xml_attr_partname TYPE string VALUE 'PartName',
lc_xml_attr_extension TYPE string VALUE 'Extension',
lc_xml_attr_contenttype TYPE string VALUE 'ContentType',
" Node namespace
lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types',
" Node extension
lc_xml_node_rels_ext TYPE string VALUE 'rels',
lc_xml_node_xml_ext TYPE string VALUE 'xml',
" 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',
lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml',
lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml',
lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml',
lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml',
lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml',
" Node contentType
lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml',
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_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_drawings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawing+xml'.
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 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_worksheet TYPE REF TO zcl_excel_worksheet,
lo_iterator TYPE REF TO cl_object_collection_iterator,
lo_nested_iterator TYPE REF TO cl_object_collection_iterator,
lo_table TYPE REF TO zcl_excel_table.
DATA: lv_worksheets_num TYPE i,
lv_worksheets_numc TYPE numc3,
lv_xml_node_worksheet_pn TYPE string,
lv_xml_size TYPE i,
lv_value TYPE string,
lv_drawing_index TYPE i VALUE 1,
lv_index_str TYPE string.
**********************************************************************
* 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 types
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_types_ns ).
**********************************************************************
* STEP 4: Create subnodes
" rels node
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_rels_ext ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_rels_ct ).
lo_element_root->append_child( new_child = lo_element ).
" extension node
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_ext ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_xml_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Theme node
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 = lc_xml_node_theme_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_theme_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Styles node
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 = lc_xml_node_styles_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_styles_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Workbook node
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 = lc_xml_node_workb_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_workb_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Properties node
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 = lc_xml_node_props_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_props_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Worksheet node
lv_worksheets_num = excel->get_worksheets_size( ).
DO lv_worksheets_num TIMES.
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
MOVE sy-index TO lv_worksheets_numc.
SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'.
lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc.
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lv_xml_node_worksheet_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_worksheet_ct ).
lo_element_root->append_child( new_child = lo_element ).
ENDDO.
lo_iterator = me->excel->get_worksheets_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ).
lo_nested_iterator = lo_worksheet->get_tables_iterator( ).
WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ).
lv_value = lo_table->get_name( ).
CONCATENATE '/xl/tables/' lv_value '.xml' 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_table_ct ).
lo_element_root->append_child( new_child = lo_element ).
ENDWHILE.
" Drawings
DATA: lo_drawings TYPE REF TO zcl_excel_drawings.
lo_drawings = lo_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
lv_index_str = lv_drawing_index.
CONDENSE lv_index_str NO-GAPS.
CONCATENATE '/' me->c_xl_drawings 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_drawings_ct ).
lo_element_root->append_child( new_child = lo_element ).
ADD 1 TO lv_drawing_index.
ENDIF.
ENDWHILE.
" media mimes
DATA: lo_drawing TYPE REF TO zcl_excel_drawing,
lt_media_type TYPE TABLE OF mimetypes-extension,
lv_media_type TYPE mimetypes-extension,
lv_mime_type TYPE mimetypes-type.
lo_iterator = me->excel->get_drawings_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) = abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
lv_media_type = lo_drawing->get_media_type( ).
COLLECT lv_media_type INTO lt_media_type.
ENDWHILE.
LOOP AT lt_media_type INTO lv_media_type.
CALL FUNCTION 'SDOK_MIMETYPE_GET'
EXPORTING
extension = lv_media_type
IMPORTING
mimetype = lv_mime_type.
lo_element = lo_document->create_simple_element( name = lc_xml_node_default
parent = lo_document ).
lv_value = lv_media_type.
lo_element->set_attribute_ns( name = lc_xml_attr_extension
value = lv_value ).
lv_value = lv_mime_type.
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
ENDLOOP.
" Strings node
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 = lc_xml_node_strings_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_strings_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Strings node
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 = lc_xml_node_core_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_core_ct ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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_DOCPROPS_APP.
** Constant node name
DATA: lc_xml_node_properties TYPE string VALUE 'Properties',
lc_xml_node_application TYPE string VALUE 'Application',
lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity',
lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop',
lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs',
lc_xml_node_vector TYPE string VALUE 'vector',
lc_xml_node_variant TYPE string VALUE 'variant',
lc_xml_node_lpstr TYPE string VALUE 'lpstr',
lc_xml_node_i4 TYPE string VALUE 'i4',
lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts',
lc_xml_node_company TYPE string VALUE 'Company',
lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate',
lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc',
lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged',
lc_xml_node_appversion TYPE string VALUE 'AppVersion',
" Namespace prefix
lc_vt_ns TYPE string VALUE 'vt',
lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties',
lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',
" Node attributes
lc_xml_attr_size TYPE string VALUE 'size',
lc_xml_attr_basetype TYPE string VALUE 'baseType'.
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 TYPE REF TO if_ixml_element,
lo_sub_element_vector TYPE REF TO if_ixml_element,
lo_sub_element_variant TYPE REF TO if_ixml_element,
lo_sub_element_lpstr TYPE REF TO if_ixml_element,
lo_sub_element_i4 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_worksheet TYPE REF TO zcl_excel_worksheet.
DATA: lv_value TYPE string.
**********************************************************************
* 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 properties
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_props_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:vt'
value = lc_xml_node_props_vt_ns ).
**********************************************************************
* STEP 4: Create subnodes
" Application
lo_element = lo_document->create_simple_element( name = lc_xml_node_application
parent = lo_document ).
lv_value = excel->properties->application.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" DocSecurity
lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity
parent = lo_document ).
lv_value = excel->properties->docsecurity.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" ScaleCrop
lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop
parent = lo_document ).
lv_value = me->flag2bool( excel->properties->scalecrop ).
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" HeadingPairs
lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs
parent = lo_document ).
" * vector node
lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector
prefix = lc_vt_ns
parent = lo_document ).
lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size
value = '2' ).
lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype
value = lc_xml_node_variant ).
" ** variant node
lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant
prefix = lc_vt_ns
parent = lo_document ).
" *** lpstr node
lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr
prefix = lc_vt_ns
parent = lo_document ).
lv_value = excel->get_worksheets_name( ).
lo_sub_element_lpstr->set_value( value = lv_value ).
lo_sub_element_variant->append_child( new_child = lo_sub_element_lpstr ). " lpstr node
lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node
" ** variant node
lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant
prefix = lc_vt_ns
parent = lo_document ).
" *** i4 node
lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4
prefix = lc_vt_ns
parent = lo_document ).
lv_value = excel->get_worksheets_size( ).
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_sub_element_i4->set_value( value = lv_value ).
lo_sub_element_variant->append_child( new_child = lo_sub_element_i4 ). " lpstr node
lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node
lo_element->append_child( new_child = lo_sub_element_vector ). " vector node
lo_element_root->append_child( new_child = lo_element ). " HeadingPairs
" TitlesOfParts
lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts
parent = lo_document ).
" * vector node
lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector
prefix = lc_vt_ns
parent = lo_document ).
lv_value = excel->get_worksheets_size( ).
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size
value = lv_value ).
lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype
value = lc_xml_node_lpstr ).
lo_iterator = excel->get_worksheets_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
" ** lpstr node
lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr
prefix = lc_vt_ns
parent = lo_document ).
lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ).
lv_value = lo_worksheet->get_title( ).
lo_sub_element_lpstr->set_value( value = lv_value ).
lo_sub_element_vector->append_child( new_child = lo_sub_element_lpstr ). " lpstr node
ENDWHILE.
lo_element->append_child( new_child = lo_sub_element_vector ). " vector node
lo_element_root->append_child( new_child = lo_element ). " TitlesOfParts
" Company
lo_element = lo_document->create_simple_element( name = lc_xml_node_company
parent = lo_document ).
lv_value = excel->properties->company.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" LinksUpToDate
lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate
parent = lo_document ).
lv_value = me->flag2bool( excel->properties->linksuptodate ).
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" SharedDoc
lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc
parent = lo_document ).
lv_value = me->flag2bool( excel->properties->shareddoc ).
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" HyperlinksChanged
lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged
parent = lo_document ).
lv_value = me->flag2bool( excel->properties->hyperlinkschanged ).
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" AppVersion
lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion
parent = lo_document ).
lv_value = excel->properties->appversion.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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_DOCPROPS_CORE.
** Constant node name
DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties',
lc_xml_node_creator TYPE string VALUE 'creator',
lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy',
lc_xml_node_created TYPE string VALUE 'created',
lc_xml_node_modified TYPE string VALUE 'modified',
" Node attributes
lc_xml_attr_type TYPE string VALUE 'type',
lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF',
" Node namespace
lc_cp_ns TYPE string VALUE 'cp',
lc_dc_ns TYPE string VALUE 'dc',
lc_dcterms_ns TYPE string VALUE 'dcterms',
lc_dcmitype_ns TYPE string VALUE 'dcmitype',
lc_xsi_ns TYPE string VALUE 'xsi',
lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties',
lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/',
lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/',
lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/',
lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'.
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 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.
DATA: lv_value TYPE string.
**********************************************************************
* 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 coreProperties
lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties
prefix = lc_cp_ns
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns:cp'
value = lc_xml_node_cp_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:dc'
value = lc_xml_node_dc_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:dcterms'
value = lc_xml_node_dcterms_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype'
value = lc_xml_node_dcmitype_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:xsi'
value = lc_xml_node_xsi_ns ).
**********************************************************************
* STEP 4: Create subnodes
" Creator node
lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator
prefix = lc_dc_ns
parent = lo_document ).
lv_value = excel->properties->creator.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" lastModifiedBy node
lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby
prefix = lc_cp_ns
parent = lo_document ).
lv_value = excel->properties->lastmodifiedby.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" Created node
lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created
prefix = lc_dcterms_ns
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
prefix = lc_xsi_ns
value = lc_xml_attr_target ).
lv_value = excel->properties->created.
lv_value = '2010-07-04T14:58:53Z'.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" Modified node
lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified
prefix = lc_dcterms_ns
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
prefix = lc_xsi_ns
value = lc_xml_attr_target ).
lv_value = excel->properties->modified.
lv_value = '2010-07-04T14:58:53Z'.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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_RELATIONSHIPS.
** Constant node name
DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships',
lc_xml_node_relationship TYPE string VALUE 'Relationship',
" Node attributes
lc_xml_attr_id TYPE string VALUE 'Id',
lc_xml_attr_type TYPE string VALUE 'Type',
lc_xml_attr_target TYPE string VALUE 'Target',
" Node namespace
lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
" Node id
lc_xml_node_rId1_id TYPE string VALUE 'rId1',
lc_xml_node_rId2_id TYPE string VALUE 'rId2',
lc_xml_node_rId3_id TYPE string VALUE 'rId3',
" Node type
lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',
lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',
" Node target
lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml',
lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml',
lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'.
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 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.
**********************************************************************
* 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_relationships
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_rels_ns ).
**********************************************************************
* STEP 4: Create subnodes
" Theme node
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lc_xml_node_rId3_id ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rId3_tp ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lc_xml_node_rId3_tg ).
lo_element_root->append_child( new_child = lo_element ).
" Styles node
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lc_xml_node_rId2_id ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rId2_tp ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lc_xml_node_rId2_tg ).
lo_element_root->append_child( new_child = lo_element ).
" rels node
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lc_xml_node_rId1_id ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rId1_tp ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lc_xml_node_rId1_tg ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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.
** Constant node name
CONSTANTS: lc_xml_node_wsdr TYPE string VALUE 'xdr:wsDr',
lc_xml_node_ns_xdr TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',
lc_xml_node_ns_a TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/main',
lc_xml_node_onecellanchor TYPE string VALUE 'xdr:oneCellAnchor',
lc_xml_node_from TYPE string VALUE 'xdr:from',
lc_xml_node_to TYPE string VALUE 'xdr:to',
lc_xml_node_pic TYPE string VALUE 'xdr:pic',
lc_xml_node_ext TYPE string VALUE 'xdr:ext',
lc_xml_node_clientdata TYPE string VALUE 'xdr:clientData',
lc_xml_node_col TYPE string VALUE 'xdr:col',
lc_xml_node_coloff TYPE string VALUE 'xdr:colOff',
lc_xml_node_row TYPE string VALUE 'xdr:row',
lc_xml_node_rowoff TYPE string VALUE 'xdr:rowOff',
lc_xml_node_nvpicpr TYPE string VALUE 'xdr:nvPicPr',
lc_xml_node_cnvpr TYPE string VALUE 'xdr:cNvPr',
lc_xml_node_cnvpicpr TYPE string VALUE 'xdr:cNvPicPr',
lc_xml_node_piclocks TYPE string VALUE 'a:picLocks',
lc_xml_node_sppr TYPE string VALUE 'xdr:spPr',
lc_xml_node_apgeom TYPE string VALUE 'a:prstGeom',
lc_xml_node_aavlst TYPE string VALUE 'a:avLst',
lc_xml_node_blipfill TYPE string VALUE 'xdr:blipFill',
lc_xml_node_ablip TYPE string VALUE 'a:blip',
lc_xml_node_astretch TYPE string VALUE 'a:stretch',
lc_xml_node_ns_r TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'.
CONSTANTS: lc_on TYPE string VALUE '1',
lc_off TYPE string VALUE '0'.
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 TYPE REF TO if_ixml_element,
lo_element2 TYPE REF TO if_ixml_element,
lo_element3 TYPE REF TO if_ixml_element,
lo_element_onecellanchor TYPE REF TO if_ixml_element,
lo_element_from TYPE REF TO if_ixml_element,
lo_element_ext TYPE REF TO if_ixml_element,
lo_element_pic TYPE REF TO if_ixml_element,
lo_element_clientdata 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_drawing TYPE REF TO zcl_excel_drawing,
lv_col TYPE string, " zexcel_cell_column,
lv_row TYPE string, " zexcel_cell_row.
lv_counter TYPE i VALUE 0,
lv_value TYPE string.
**********************************************************************
* 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_wsdr
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns:xdr'
value = lc_xml_node_ns_xdr ).
lo_element_root->set_attribute_ns( name = 'xmlns:a'
value = lc_xml_node_ns_a ).
**********************************************************************
* STEP 4: Create drawings
lo_iterator = io_worksheet->get_drawings_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
lo_element_onecellanchor = lo_document->create_simple_element( name = lc_xml_node_onecellanchor
parent = lo_document ).
* from cell ******************************
lo_element_from = lo_document->create_simple_element( name = lc_xml_node_from
parent = lo_document ).
lv_col = lo_drawing->get_from_col( ).
lv_row = lo_drawing->get_from_row( ).
CONDENSE lv_col NO-GAPS.
CONDENSE lv_row NO-GAPS.
lo_element = lo_document->create_simple_element( name = lc_xml_node_col
parent = lo_document ).
lo_element->set_value( value = lv_col ).
lo_element_from->append_child( new_child = lo_element ).
lo_element = lo_document->create_simple_element( name = lc_xml_node_coloff
parent = lo_document ).
lo_element->set_value( value = `0` ).
lo_element_from->append_child( new_child = lo_element ).
lo_element = lo_document->create_simple_element( name = lc_xml_node_row
parent = lo_document ).
lo_element->set_value( value = lv_row ).
lo_element_from->append_child( new_child = lo_element ).
lo_element = lo_document->create_simple_element( name = lc_xml_node_rowoff
parent = lo_document ).
lo_element->set_value( value = `1` ).
lo_element_from->append_child( new_child = lo_element ).
* ext ******************************
lo_element_ext = lo_document->create_simple_element( name = lc_xml_node_ext
parent = lo_document ).
lv_value = lo_drawing->get_width_emu_str( ).
lo_element_ext->set_attribute_ns( name = 'cx'
value = lv_value ).
lv_value = lo_drawing->get_height_emu_str( ).
lo_element_ext->set_attribute_ns( name = 'cy'
value = lv_value ).
* pic **********************************
lo_element_pic = lo_document->create_simple_element( name = lc_xml_node_pic
parent = lo_document ).
* nvPicPr
lo_element = lo_document->create_simple_element( name = lc_xml_node_nvpicpr
parent = lo_document ).
* cNvPr
lo_element2 = lo_document->create_simple_element( name = lc_xml_node_cnvpr
parent = lo_document ).
lv_value = sy-index.
CONDENSE lv_value.
lo_element2->set_attribute_ns( name = 'id'
value = lv_value ).
lo_element2->set_attribute_ns( name = 'name'
value = 'Image 1' ).
lo_element->append_child( new_child = lo_element2 ).
* cNvPicPr
lo_element2 = lo_document->create_simple_element( name = lc_xml_node_cnvpicpr
parent = lo_document ).
* picLocks
lo_element3 = lo_document->create_simple_element( name = lc_xml_node_piclocks
parent = lo_document ).
lo_element3->set_attribute_ns( name = 'noChangeAspect'
value = '1' ).
lo_element2->append_child( new_child = lo_element3 ).
lo_element->append_child( new_child = lo_element2 ).
lo_element_pic->append_child( new_child = lo_element ).
* blipFill
ADD 1 TO lv_counter.
lv_value = lv_counter.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_blipfill
parent = lo_document ).
lo_element2 = lo_document->create_simple_element( name = lc_xml_node_ablip
parent = lo_document ).
lo_element2->set_attribute_ns( name = 'xmlns:r'
value = lc_xml_node_ns_r ).
lo_element2->set_attribute_ns( name = 'r:embed'
value = lv_value ).
lo_element->append_child( new_child = lo_element2 ).
lo_element2 = lo_document->create_simple_element( name = lc_xml_node_astretch
parent = lo_document ).
lo_element->append_child( new_child = lo_element2 ).
lo_element_pic->append_child( new_child = lo_element ).
* spPr
lo_element = lo_document->create_simple_element( name = lc_xml_node_sppr
parent = lo_document ).
lo_element2 = lo_document->create_simple_element( name = lc_xml_node_apgeom
parent = lo_document ).
lo_element2->set_attribute_ns( name = 'prst'
value = 'rect' ).
lo_element3 = lo_document->create_simple_element( name = lc_xml_node_aavlst
parent = lo_document ).
lo_element2->append_child( new_child = lo_element3 ).
lo_element->append_child( new_child = lo_element2 ).
lo_element_pic->append_child( new_child = lo_element ).
* client data ***************************
lo_element_clientdata = lo_document->create_simple_element( name = lc_xml_node_clientdata
parent = lo_document ).
lo_element_onecellanchor->append_child( new_child = lo_element_from ).
lo_element_onecellanchor->append_child( new_child = lo_element_ext ).
lo_element_onecellanchor->append_child( new_child = lo_element_pic ).
lo_element_onecellanchor->append_child( new_child = lo_element_clientdata ).
lo_element_root->append_child( new_child = lo_element_onecellanchor ).
ENDWHILE.
**********************************************************************
* 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_RELS.
** Constant node name
DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships',
lc_xml_node_relationship TYPE string VALUE 'Relationship',
" Node attributes
lc_xml_attr_id TYPE string VALUE 'Id',
lc_xml_attr_type TYPE string VALUE 'Type',
lc_xml_attr_target TYPE string VALUE 'Target',
" Node namespace
lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
lc_xml_node_rid_image_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'.
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 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_drawing TYPE REF TO zcl_excel_drawing.
DATA: lv_value TYPE string,
lv_counter TYPE i.
**********************************************************************
* 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_relationships
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_rels_ns ).
**********************************************************************
* STEP 4: Create subnodes
" Add sheet Relationship nodes here
lv_counter = 0.
lo_iterator = io_worksheet->get_drawings_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
ADD 1 TO lv_counter.
lv_value = lv_counter.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
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_image_tp ).
lv_value = lo_drawing->get_media_name( ).
CONCATENATE '../media/' lv_value 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 ).
ENDWHILE.
**********************************************************************
* 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_RELATIONSHIPS.
** Constant node name
DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships',
lc_xml_node_relationship TYPE string VALUE 'Relationship',
" Node attributes
lc_xml_attr_id TYPE string VALUE 'Id',
lc_xml_attr_type TYPE string VALUE 'Type',
lc_xml_attr_target TYPE string VALUE 'Target',
" Node namespace
lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
" Node id
lc_xml_node_ridx_id TYPE string VALUE 'rId#',
" Node type
lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',
lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',
" Node target
lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml',
lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml',
lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml',
lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml'.
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 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.
DATA: lv_xml_node_ridx_tg TYPE string,
lv_xml_node_ridx_id TYPE string,
lv_size TYPE i,
lv_syindex(2) TYPE c.
**********************************************************************
* 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_relationships
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_rels_ns ).
**********************************************************************
* STEP 4: Create subnodes
lv_size = excel->get_worksheets_size( ).
" Relationship node
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lv_size = lv_size + 2.
lv_syindex = lv_size.
SHIFT lv_syindex RIGHT DELETING TRAILING space.
SHIFT lv_syindex LEFT DELETING LEADING space.
lv_xml_node_ridx_id = lc_xml_node_ridx_id.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex.
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lv_xml_node_ridx_id ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_styles_tp ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lc_xml_node_rid_styles_tg ).
lo_element_root->append_child( new_child = lo_element ).
" Relationship node
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lv_size = lv_size - 1.
lv_syindex = lv_size.
SHIFT lv_syindex RIGHT DELETING TRAILING space.
SHIFT lv_syindex LEFT DELETING LEADING space.
lv_xml_node_ridx_id = lc_xml_node_ridx_id.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex.
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lv_xml_node_ridx_id ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_theme_tp ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lc_xml_node_rid_theme_tg ).
lo_element_root->append_child( new_child = lo_element ).
lv_size = excel->get_worksheets_size( ).
DO lv_size TIMES.
" Relationship node
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lv_xml_node_ridx_id = lc_xml_node_ridx_id.
lv_xml_node_ridx_tg = lc_xml_node_ridx_tg.
lv_syindex = sy-index.
SHIFT lv_syindex RIGHT DELETING TRAILING space.
SHIFT lv_syindex LEFT DELETING LEADING space.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex.
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lv_xml_node_ridx_id ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_sheet_tp ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lv_xml_node_ridx_tg ).
lo_element_root->append_child( new_child = lo_element ).
ENDDO.
" Relationship node
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
ADD 3 TO lv_size.
lv_syindex = lv_size.
SHIFT lv_syindex RIGHT DELETING TRAILING space.
SHIFT lv_syindex LEFT DELETING LEADING space.
lv_xml_node_ridx_id = lc_xml_node_ridx_id.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex.
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lv_xml_node_ridx_id ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_shared_tp ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lc_xml_node_rid_shared_tg ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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_SHAREDSTRINGS.
** Constant node name
DATA: lc_xml_node_sst TYPE string VALUE 'sst',
lc_xml_node_si TYPE string VALUE 'si',
lc_xml_node_t TYPE string VALUE 't',
" Node attributes
lc_xml_attr_count TYPE string VALUE 'count',
lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount',
" Node namespace
lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'.
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 TYPE REF TO if_ixml_element,
lo_sub_element 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_worksheet TYPE REF TO zcl_excel_worksheet.
DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted,
ls_shared_string TYPE zexcel_s_shared_string,
lv_value TYPE string,
lv_count_str TYPE string,
lv_uniquecount_str TYPE string,
lv_sytabix TYPE sytabix,
lv_count TYPE i,
lv_uniquecount TYPE i.
FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data,
<fs_sheet_string> TYPE zexcel_s_shared_string.
**********************************************************************
* STEP 1: Collect strings from each worksheet
lo_iterator = excel->get_worksheets_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ).
APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data.
ENDWHILE.
DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content
DESCRIBE TABLE lt_cell_data LINES lv_count.
MOVE lv_count TO lv_count_str.
SHIFT lv_count_str RIGHT DELETING TRAILING space.
SHIFT lv_count_str LEFT DELETING LEADING space.
SORT lt_cell_data BY cell_value.
DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value.
DESCRIBE TABLE lt_cell_data LINES lv_uniquecount.
MOVE lv_uniquecount TO lv_uniquecount_str.
SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space.
SHIFT lv_uniquecount_str LEFT DELETING LEADING space.
LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>.
lv_sytabix = sy-tabix - 1.
MOVE lv_sytabix TO ls_shared_string-string_no.
MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value.
APPEND ls_shared_string TO shared_strings.
ENDLOOP.
**********************************************************************
* 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
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_ns ).
lo_element_root->set_attribute_ns( name = lc_xml_attr_count
value = lv_count_str ).
lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount
value = lv_uniquecount_str ).
**********************************************************************
* STEP 4: Create subnode
LOOP AT shared_strings ASSIGNING <fs_sheet_string>.
lo_element = lo_document->create_simple_element( name = lc_xml_node_si
parent = lo_document ).
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t
parent = lo_document ).
lo_sub_element->set_value( value = <fs_sheet_string>-string_value ).
lo_element->append_child( new_child = lo_sub_element ).
lo_element_root->append_child( new_child = lo_element ).
ENDLOOP.
**********************************************************************
* 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_SHEET.
TYPES: BEGIN OF cfvo,
value TYPE zexcel_conditional_value,
type TYPE zexcel_conditional_type,
END OF cfvo.
** Constant node name
DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet',
lc_xml_node_sheetpr TYPE string VALUE 'sheetPr',
lc_xml_node_outlinepr TYPE string VALUE 'outlinePr',
lc_xml_node_dimension TYPE string VALUE 'dimension',
lc_xml_node_sheetviews TYPE string VALUE 'sheetViews',
lc_xml_node_sheetview TYPE string VALUE 'sheetView',
lc_xml_node_selection TYPE string VALUE 'selection',
lc_xml_node_pane TYPE string VALUE 'pane',
lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr',
lc_xml_node_cols TYPE string VALUE 'cols',
lc_xml_node_col TYPE string VALUE 'col',
lc_xml_node_sheetdata TYPE string VALUE 'sheetData',
lc_xml_node_row TYPE string VALUE 'row',
lc_xml_node_c TYPE string VALUE 'c',
lc_xml_node_v TYPE string VALUE 'v',
lc_xml_node_f TYPE string VALUE 'f',
lc_xml_node_sheetprotection TYPE string VALUE 'sheetProtection',
lc_xml_node_pagemargins TYPE string VALUE 'pageMargins',
lc_xml_node_pagesetup TYPE string VALUE 'pageSetup',
lc_xml_node_pagesetuppr TYPE string VALUE 'pageSetUpPr',
lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting',
lc_xml_node_cfrule TYPE string VALUE 'cfRule',
lc_xml_node_iconset TYPE string VALUE 'iconSet',
lc_xml_node_cfvo TYPE string VALUE 'cfvo',
lc_xml_node_formula TYPE string VALUE 'formula',
lc_xml_node_datavalidations TYPE string VALUE 'dataValidations',
lc_xml_node_datavalidation TYPE string VALUE 'dataValidation',
lc_xml_node_formula1 TYPE string VALUE 'formula1',
lc_xml_node_formula2 TYPE string VALUE 'formula2',
lc_xml_node_mergecell TYPE string VALUE 'mergeCell',
lc_xml_node_mergecells TYPE string VALUE 'mergeCells',
lc_xml_node_drawing TYPE string VALUE 'drawing',
" Node attributes
lc_xml_attr_ref TYPE string VALUE 'ref',
lc_xml_attr_summarybelow TYPE string VALUE 'summaryBelow',
lc_xml_attr_summaryright TYPE string VALUE 'summaryRight',
lc_xml_attr_tabselected TYPE string VALUE 'tabSelected',
lc_xml_attr_showzeros TYPE string VALUE 'showZeros',
lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId',
lc_xml_attr_showgridlines TYPE string VALUE 'showGridLines',
lc_xml_attr_gridlines TYPE string VALUE 'gridLines',
lc_xml_attr_showrowcolheaders TYPE string VALUE 'showRowColHeaders',
lc_xml_attr_activecell TYPE string VALUE 'activeCell',
lc_xml_attr_sqref TYPE string VALUE 'sqref',
lc_xml_attr_min TYPE string VALUE 'min',
lc_xml_attr_max TYPE string VALUE 'max',
lc_xml_attr_hidden TYPE string VALUE 'hidden',
lc_xml_attr_width TYPE string VALUE 'width',
lc_xml_attr_defaultwidth TYPE string VALUE '9.10',
lc_xml_attr_style TYPE string VALUE 'style',
lc_xml_attr_true TYPE string VALUE 'true',
lc_xml_attr_bestfit TYPE string VALUE 'bestFit',
lc_xml_attr_customheight TYPE string VALUE 'customHeight',
lc_xml_attr_customwidth TYPE string VALUE 'customWidth',
lc_xml_attr_collapsed TYPE string VALUE 'collapsed',
lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight',
lc_xml_attr_defaultcolwidth TYPE string VALUE 'defaultColWidth',
lc_xml_attr_outlinelevelrow TYPE string VALUE 'x14ac:outlineLevelRow',
lc_xml_attr_outlinelevelcol TYPE string VALUE 'x14ac:outlineLevelCol',
lc_xml_attr_outlinelevel TYPE string VALUE 'outlineLevel',
lc_xml_attr_r TYPE string VALUE 'r',
lc_xml_attr_s TYPE string VALUE 's',
lc_xml_attr_spans TYPE string VALUE 'spans',
lc_xml_attr_t TYPE string VALUE 't',
lc_xml_attr_password TYPE string VALUE 'password',
lc_xml_attr_sheet TYPE string VALUE 'sheet',
lc_xml_attr_objects TYPE string VALUE 'objects',
lc_xml_attr_scenarios TYPE string VALUE 'scenarios',
lc_xml_attr_autofilter TYPE string VALUE 'autoFilter',
lc_xml_attr_deletecolumns TYPE string VALUE 'deleteColumns',
lc_xml_attr_deleterows TYPE string VALUE 'deleteRows',
lc_xml_attr_formatcells TYPE string VALUE 'formatCells',
lc_xml_attr_formatcolumns TYPE string VALUE 'formatColumns',
lc_xml_attr_formatrows TYPE string VALUE 'formatRows',
lc_xml_attr_insertcolumns TYPE string VALUE 'insertColumns',
lc_xml_attr_inserthyperlinks TYPE string VALUE 'insertHyperlinks',
lc_xml_attr_insertrows TYPE string VALUE 'insertRows',
lc_xml_attr_pivottables TYPE string VALUE 'pivotTables',
lc_xml_attr_selectlockedcells TYPE string VALUE 'selectLockedCells',
lc_xml_attr_selectunlockedcell TYPE string VALUE 'selectUnlockedCells',
lc_xml_attr_sort TYPE string VALUE 'sort',
lc_xml_attr_left TYPE string VALUE 'left',
lc_xml_attr_right TYPE string VALUE 'right',
lc_xml_attr_top TYPE string VALUE 'top',
lc_xml_attr_bottom TYPE string VALUE 'bottom',
lc_xml_attr_header TYPE string VALUE 'header',
lc_xml_attr_footer TYPE string VALUE 'footer',
lc_xml_attr_type TYPE string VALUE 'type',
lc_xml_attr_iconset TYPE string VALUE 'iconSet',
lc_xml_attr_showvalue TYPE string VALUE 'showValue',
lc_xml_attr_val TYPE string VALUE 'val',
lc_xml_attr_dxfid TYPE string VALUE 'dxfId',
lc_xml_attr_priority TYPE string VALUE 'priority',
lc_xml_attr_operator TYPE string VALUE 'operator',
lc_xml_attr_allowblank TYPE string VALUE 'allowBlank',
lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage',
lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage',
lc_xml_attr_errortitle TYPE string VALUE 'errorTitle',
lc_xml_attr_error TYPE string VALUE 'error',
lc_xml_attr_prompttitle TYPE string VALUE 'promptTitle',
lc_xml_attr_prompt TYPE string VALUE 'prompt',
lc_xml_attr_count TYPE string VALUE 'count',
lc_xml_attr_blackandwhite TYPE string VALUE 'blackAndWhite',
lc_xml_attr_cellcomments TYPE string VALUE 'cellComments',
lc_xml_attr_copies TYPE string VALUE 'copies',
lc_xml_attr_draft TYPE string VALUE 'draft',
lc_xml_attr_errors TYPE string VALUE 'errors',
lc_xml_attr_firstpagenumber TYPE string VALUE 'firstPageNumber',
lc_xml_attr_fittopage TYPE string VALUE 'fitToPage',
lc_xml_attr_fittoheight TYPE string VALUE 'fitToHeight',
lc_xml_attr_fittowidth TYPE string VALUE 'fitToWidth',
lc_xml_attr_horizontaldpi TYPE string VALUE 'horizontalDpi',
lc_xml_attr_orientation TYPE string VALUE 'orientation',
lc_xml_attr_pageorder TYPE string VALUE 'pageOrder',
lc_xml_attr_paperheight TYPE string VALUE 'paperHeight',
lc_xml_attr_papersize TYPE string VALUE 'paperSize',
lc_xml_attr_paperwidth TYPE string VALUE 'paperWidth',
lc_xml_attr_scale TYPE string VALUE 'scale',
lc_xml_attr_usefirstpagenumber TYPE string VALUE 'useFirstPageNumber',
lc_xml_attr_useprinterdefaults TYPE string VALUE 'usePrinterDefaults',
lc_xml_attr_verticaldpi TYPE string VALUE 'verticalDpi',
" Node namespace
lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006',
lc_xml_node_comp_pref TYPE string VALUE 'x14ac',
lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'.
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 TYPE REF TO if_ixml_element,
lo_element_2 TYPE REF TO if_ixml_element,
lo_element_3 TYPE REF TO if_ixml_element,
lo_element_4 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_style_conditional TYPE REF TO zcl_excel_style_conditional,
lo_data_validation TYPE REF TO zcl_excel_data_validation,
lo_table TYPE REF TO zcl_excel_table,
row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi,
default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime,
default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi.
DATA: lv_value TYPE string,
t_range_merge TYPE string_table,
lv_merge TYPE string,
lv_column_p TYPE zexcel_cell_column_alpha,
lv_column TYPE zexcel_cell_column,
lv_style_guid TYPE zexcel_cell_style,
lv_flag TYPE c,
ls_iconset TYPE zexcel_conditional_iconset,
ls_cellis TYPE zexcel_conditional_cellis,
ls_expression TYPE zexcel_conditional_expression,
lt_cfvo TYPE TABLE OF cfvo,
ls_cfvo TYPE cfvo,
lv_cell_row_s TYPE string,
ls_last_row TYPE zexcel_s_cell_data,
ls_style_mapping TYPE zexcel_s_styles_mapping,
lv_freeze_cell_row TYPE zexcel_cell_row,
lv_freeze_cell_column TYPE zexcel_cell_column,
lv_freeze_cell_column_alpha TYPE zexcel_cell_column_alpha,
column_dimensions TYPE zexcel_t_worksheet_columndime,
row_dimensions TYPE zexcel_t_worksheet_rowdimensio,
ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping,
lv_relation_id TYPE i VALUE 0,
outline_level_row TYPE i VALUE 0,
outline_level_col TYPE i VALUE 0,
col_count TYPE int4,
merge_count TYPE int4,
write_current_row TYPE boolean.
FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data,
<fs_range_merge> LIKE LINE OF t_range_merge,
<column_dimension> TYPE zexcel_s_worksheet_columndime,
<row_dimension> TYPE zexcel_s_worksheet_rowdimensio.
**********************************************************************
* 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_worksheet
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:r'
value = lc_xml_node_r_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:mc'
value = lc_xml_node_comp_ns ).
lo_element_root->set_attribute_ns( name = 'mc:Ignorable'
value = lc_xml_node_comp_pref ).
lo_element_root->set_attribute_ns( name = 'xmlns:x14ac'
value = lc_xml_node_ig_ns ).
**********************************************************************
* STEP 4: Create subnodes
" sheetPr
lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetpr
parent = lo_document ).
" TODO tabColor
" outlinePr
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_outlinepr
parent = lo_document ).
" TODO read attribute summaryBelow and set the attribute to 0
lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow
value = '1' ).
" TODO read attribute summaryRight and set the attribute to 0
lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright
value = '1' ).
lo_element->append_child( new_child = lo_element_2 ).
IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL.
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_pagesetuppr
parent = lo_document ).
lo_element_2->set_attribute_ns( name = lc_xml_attr_fittopage
value = `1` ).
lo_element->append_child( new_child = lo_element_2 ). " pageSetupPr node
ENDIF.
lo_element_root->append_child( new_child = lo_element ).
" dimension node
lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension
parent = lo_document ).
lv_value = io_worksheet->get_dimension_range( ).
lo_element->set_attribute_ns( name = lc_xml_attr_ref
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" sheetViews node
lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews
parent = lo_document ).
" sheetView node
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview
parent = lo_document ).
IF io_worksheet->zif_excel_sheet_properties~show_zeros EQ abap_false.
lo_element_2->set_attribute_ns( name = lc_xml_attr_showzeros
value = '0' ).
ENDIF.
IF iv_active EQ abap_true.
lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected
value = '1' ).
ELSE.
lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected
value = '0' ).
ENDIF.
lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid
value = '0' ).
" showGridLines attribute
IF io_worksheet->show_gridlines = abap_true.
lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines
value = '1' ).
ELSE.
lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines
value = '0' ).
ENDIF.
" showRowColHeaders attribute
IF io_worksheet->show_rowcolheaders = abap_true.
lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders
value = '1' ).
ELSE.
lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders
value = '0' ).
ENDIF.
" freeze panes
io_worksheet->get_freeze_cell( IMPORTING ep_row = lv_freeze_cell_row
ep_column = lv_freeze_cell_column ).
IF lv_freeze_cell_row IS NOT INITIAL AND lv_freeze_cell_column IS NOT INITIAL.
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_pane
parent = lo_element_2 ).
IF lv_freeze_cell_row > 1.
lv_value = lv_freeze_cell_row - 1.
CONDENSE lv_value.
lo_element_3->set_attribute_ns( name = 'ySplit'
value = lv_value ).
ENDIF.
IF lv_freeze_cell_column > 1.
lv_value = lv_freeze_cell_column - 1.
CONDENSE lv_value.
lo_element_3->set_attribute_ns( name = 'xSplit'
value = lv_value ).
ENDIF.
lv_freeze_cell_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_freeze_cell_column ).
lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_freeze_cell_row ).
CONCATENATE lv_freeze_cell_column_alpha lv_value INTO lv_value.
lo_element_3->set_attribute_ns( name = 'topLeftCell'
value = lv_value ).
lo_element_3->set_attribute_ns( name = 'activePane'
value = 'bottomRight' ).
lo_element_3->set_attribute_ns( name = 'state'
value = 'frozen' ).
lo_element_2->append_child( new_child = lo_element_3 ).
ENDIF.
" selection node
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection
parent = lo_document ).
lv_value = io_worksheet->get_active_cell( ).
lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell
value = lv_value ).
lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref
value = lv_value ).
lo_element_2->append_child( new_child = lo_element_3 ). " sheetView node
lo_element->append_child( new_child = lo_element_2 ). " sheetView node
lo_element_root->append_child( new_child = lo_element ). " sheetViews node
column_dimensions[] = io_worksheet->get_column_dimensions( ).
" Calculate col
IF NOT column_dimensions IS INITIAL.
io_worksheet->calculate_column_widths( ).
column_dimensions[] = io_worksheet->get_column_dimensions( ).
ENDIF.
row_dimensions[] = io_worksheet->get_row_dimensions( ).
" sheetFormatPr node
lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr
parent = lo_document ).
" defaultRowHeight
default_row_dimension = io_worksheet->get_default_row_dimension( ).
IF default_row_dimension IS BOUND.
IF default_row_dimension->get_row_height( ) >= 0.
lo_element->set_attribute_ns( name = lc_xml_attr_customheight
value = lc_xml_attr_true ).
lv_value = default_row_dimension->get_row_height( ).
ELSE.
lv_value = '12.75'.
ENDIF.
ELSE.
lv_value = '12.75'.
ENDIF.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight
value = lv_value ).
" defaultColWidth
default_col_dimension = io_worksheet->get_default_column_dimension( ).
IF default_col_dimension IS BOUND.
IF default_col_dimension->get_width( ) >= 0.
lv_value = default_col_dimension->get_width( ).
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_defaultcolwidth
value = lv_value ).
ENDIF.
ENDIF.
" outlineLevelRow
LOOP AT row_dimensions ASSIGNING <row_dimension>.
IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row.
outline_level_row = <row_dimension>-row_dimension->get_outline_level( ).
ENDIF.
ENDLOOP.
lv_value = outline_level_row.
lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelrow
value = lv_value ).
" outlineLevelCol
LOOP AT column_dimensions ASSIGNING <column_dimension>.
IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col.
outline_level_col = <column_dimension>-column_dimension->get_outline_level( ).
ENDIF.
ENDLOOP.
lv_value = outline_level_col.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelcol
value = lv_value ).
* lv_value = 0.
* SHIFT lv_value RIGHT DELETING TRAILING space.
* SHIFT lv_value LEFT DELETING LEADING space.
* lo_element->set_attribute_ns( name = lc_xml_attr_dydescent
* value = lv_value ).
lo_element_root->append_child( new_child = lo_element ). " sheetFormatPr node
IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL OR NOT column_dimensions IS INITIAL.
" cols node
lo_element = lo_document->create_simple_element( name = lc_xml_node_cols
parent = lo_document ).
" This code have to be enhanced in order to manage also column style properties
" Now it is an out/out
IF NOT column_dimensions IS INITIAL.
LOOP AT column_dimensions ASSIGNING <column_dimension>.
" col node
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col
parent = lo_document ).
lv_value = <column_dimension>-column_dimension->get_column_index( ).
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_2->set_attribute_ns( name = lc_xml_attr_min
value = lv_value ).
lo_element_2->set_attribute_ns( name = lc_xml_attr_max
value = lv_value ).
" Width
IF <column_dimension>-column_dimension->get_width( ) < 0.
lo_element_2->set_attribute_ns( name = lc_xml_attr_width
value = lc_xml_attr_defaultwidth ).
ELSE.
lv_value = <column_dimension>-column_dimension->get_width( ).
lo_element_2->set_attribute_ns( name = lc_xml_attr_width
value = lv_value ).
ENDIF.
" Column visibility
IF <column_dimension>-column_dimension->get_visible( ) = abap_false.
lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden
value = lc_xml_attr_true ).
ENDIF.
" Auto size?
IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true.
lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit
value = lc_xml_attr_true ).
ENDIF.
" Custom width?
IF default_col_dimension IS BOUND.
IF <column_dimension>-column_dimension->get_width( )
<> default_col_dimension->get_width( ).
lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth
value = lc_xml_attr_true ).
ENDIF.
ELSE.
lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth
value = lc_xml_attr_true ).
ENDIF.
" Collapsed
IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true.
lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed
value = lc_xml_attr_true ).
ENDIF.
" outlineLevel
IF <column_dimension>-column_dimension->get_outline_level( ) > 0.
lv_value = <column_dimension>-column_dimension->get_outline_level( ).
lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel
value = lv_value ).
ENDIF.
" Style
lv_value = <column_dimension>-column_dimension->get_xf_index( ).
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_2->set_attribute_ns( name = lc_xml_attr_style
value = lv_value ).
lo_element->append_child( new_child = lo_element_2 ). " col node
ENDLOOP.
ELSE.
IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL.
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col
parent = lo_document ).
lv_value = zcl_excel_common=>c_excel_sheet_min_col.
CONDENSE lv_value.
lo_element_2->set_attribute_ns( name = lc_xml_attr_min
value = lv_value ).
lv_value = zcl_excel_common=>c_excel_sheet_max_col.
CONDENSE lv_value.
lo_element_2->set_attribute_ns( name = lc_xml_attr_max
value = lv_value ).
lo_element_2->set_attribute_ns( name = lc_xml_attr_width
value = lc_xml_attr_defaultwidth ).
lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ).
READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid.
lv_value = ls_style_mapping-style.
CONDENSE lv_value.
lo_element_2->set_attribute_ns( name = lc_xml_attr_style
value = lv_value ).
lo_element->append_child( new_child = lo_element_2 ). " col node
ENDIF.
ENDIF.
lo_element_root->append_child( new_child = lo_element ). " cols node
ENDIF.
" sheetData node
lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata
parent = lo_document ).
" Get column count
col_count = io_worksheet->get_highest_column( ).
LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>.
CLEAR ls_style_mapping.
IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row.
" Add new row
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row
parent = lo_document ).
" r
lv_value = <ls_sheet_content>-cell_row.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_2->set_attribute_ns( name = lc_xml_attr_r
value = lv_value ).
" Spans
lv_value = col_count.
CONCATENATE '1:' lv_value INTO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_2->set_attribute_ns( name = lc_xml_attr_spans
value = lv_value ).
row_dimension = io_worksheet->get_row_dimension( <ls_sheet_content>-cell_row ).
" Do we need the row dimension attributes?
IF row_dimension->get_row_height( ) >= 0 OR
row_dimension->get_visible( ) = abap_false OR
row_dimension->get_collapsed( ) = abap_true OR
row_dimension->get_outline_level( ) > 0 OR
row_dimension->get_xf_index( ) <> 0.
" Row dimensions
IF row_dimension->get_row_height( ) >= 0.
lo_element_2->set_attribute_ns( name = 'customHeight' value = '1').
lv_value = row_dimension->get_row_height( ).
lo_element_2->set_attribute_ns( name = 'ht' value = lv_value ).
ENDIF.
" Row visibility
IF row_dimension->get_visible( ) = abap_false.
lo_element_2->set_attribute_ns( name = 'hidden' value = 'true').
ENDIF.
" Collapsed
IF row_dimension->get_collapsed( ) = abap_true.
lo_element_2->set_attribute_ns( name = 'collapsed' value = 'true').
ENDIF.
" Outline level
IF row_dimension->get_outline_level( ) > 0.
lv_value = row_dimension->get_outline_level( ).
lo_element_2->set_attribute_ns( name = 'outlineLevel' value = lv_value ).
ENDIF.
" Style
IF row_dimension->get_xf_index( ) <> 0.
lv_value = row_dimension->get_xf_index( ).
lo_element_2->set_attribute_ns( name = 's' value = lv_value ).
lo_element_2->set_attribute_ns( name = 'customFormat' value = '1').
ENDIF.
ENDIF.
ENDIF.
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c
parent = lo_document ).
lo_element_3->set_attribute_ns( name = lc_xml_attr_r
value = <ls_sheet_content>-cell_coords ).
IF <ls_sheet_content>-cell_style IS NOT INITIAL.
READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style.
lv_value = ls_style_mapping-style.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_3->set_attribute_ns( name = lc_xml_attr_s
value = lv_value ).
ENDIF.
" For cells with formula ignore the value - Excel will calculate it
IF <ls_sheet_content>-cell_formula IS NOT INITIAL.
" fomula node
lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f
parent = lo_document ).
lv_value = <ls_sheet_content>-cell_formula.
lo_element_4->set_value( value = lv_value ).
lo_element_3->append_child( new_child = lo_element_4 ). " fomula node
ELSEIF <ls_sheet_content>-cell_value IS NOT INITIAL. "cell can have just style or formula
IF <ls_sheet_content>-data_type IS NOT INITIAL.
lo_element_3->set_attribute_ns( name = lc_xml_attr_t
value = <ls_sheet_content>-data_type ).
ENDIF.
" value node
lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v
parent = lo_document ).
IF <ls_sheet_content>-data_type EQ 's'.
lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ).
lo_element_4->set_value( value = lv_value ).
ELSE.
lv_value = <ls_sheet_content>-cell_value.
lo_element_4->set_value( value = lv_value ).
ENDIF.
lo_element_3->append_child( new_child = lo_element_4 ). " value node
ENDIF.
lo_element_2->append_child( new_child = lo_element_3 ). " column node
IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row.
lo_element->append_child( new_child = lo_element_2 ). " row node
ls_last_row = <ls_sheet_content>.
ENDIF.
ENDLOOP.
lo_element_root->append_child( new_child = lo_element ). " sheetData node
IF io_worksheet->zif_excel_sheet_protection~protected EQ abap_true.
" sheetProtection node
lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetprotection
parent = lo_document ).
MOVE io_worksheet->zif_excel_sheet_protection~password TO lv_value.
IF lv_value IS NOT INITIAL.
lo_element->set_attribute_ns( name = lc_xml_attr_password
value = lv_value ).
ENDIF.
lv_value = io_worksheet->zif_excel_sheet_protection~auto_filter.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_autofilter
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~delete_columns.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_deletecolumns
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~delete_rows.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_deleterows
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~format_cells.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_formatcells
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~format_columns.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_formatcolumns
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~format_rows.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_formatrows
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~insert_columns.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_insertcolumns
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~insert_hyperlinks.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_inserthyperlinks
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~insert_rows.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_insertrows
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~objects.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_objects
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~pivot_tables.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_pivottables
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~scenarios.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_scenarios
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~select_locked_cells.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_selectlockedcells
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~select_unlocked_cells.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_selectunlockedcell
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~sheet.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_sheet
value = lv_value ).
lv_value = io_worksheet->zif_excel_sheet_protection~sort.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_sort
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
" Merged cells
t_range_merge = io_worksheet->get_merge( ).
IF t_range_merge IS NOT INITIAL.
lo_element = lo_document->create_simple_element( name = lc_xml_node_mergecells
parent = lo_document ).
DESCRIBE TABLE t_range_merge LINES merge_count.
lv_value = merge_count.
CONDENSE lv_value.
lo_element->set_attribute_ns( name = lc_xml_attr_count
value = lv_value ).
LOOP AT t_range_merge ASSIGNING <fs_range_merge>.
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_mergecell
parent = lo_document ).
lo_element_2->set_attribute_ns( name = lc_xml_attr_ref
value = <fs_range_merge> ).
lo_element->append_child( new_child = lo_element_2 ).
lo_element_root->append_child( new_child = lo_element ).
io_worksheet->delete_merge( ).
ENDLOOP.
ENDIF.
" Conditional formatting node
lo_iterator = io_worksheet->get_cond_styles_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_style_conditional ?= lo_iterator->if_object_collection_iterator~get_next( ).
IF lo_style_conditional->rule IS INITIAL.
CONTINUE.
ENDIF.
lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting
parent = lo_document ).
lv_value = lo_style_conditional->get_dimension_range( ) .
lo_element->set_attribute_ns( name = lc_xml_attr_sqref
value = lv_value ).
" cfRule node
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule
parent = lo_document ).
lv_value = lo_style_conditional->rule.
lo_element_2->set_attribute_ns( name = lc_xml_attr_type
value = lv_value ).
lv_value = lo_style_conditional->priority.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_2->set_attribute_ns( name = lc_xml_attr_priority
value = lv_value ).
CASE lo_style_conditional->rule.
WHEN zcl_excel_style_conditional=>c_rule_iconset.
ls_iconset = lo_style_conditional->mode_iconset.
CLEAR lt_cfvo.
" iconset node
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset
parent = lo_document ).
IF ls_iconset-iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights.
lv_value = ls_iconset-iconset.
lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset
value = lv_value ).
ENDIF.
" Set the showValue attribute
lv_value = ls_iconset-showvalue.
lo_element_3->set_attribute_ns( name = lc_xml_attr_showvalue
value = lv_value ).
CASE ls_iconset-iconset.
WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR
zcl_excel_style_conditional=>c_iconset_3arrows OR
zcl_excel_style_conditional=>c_iconset_3arrowsgray OR
zcl_excel_style_conditional=>c_iconset_3flags OR
zcl_excel_style_conditional=>c_iconset_3signs OR
zcl_excel_style_conditional=>c_iconset_3symbols OR
zcl_excel_style_conditional=>c_iconset_3symbols2 OR
zcl_excel_style_conditional=>c_iconset_3trafficlights OR
zcl_excel_style_conditional=>c_iconset_3trafficlights2.
MOVE ls_iconset-cfvo1_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo1_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo2_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo2_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo3_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo3_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR
zcl_excel_style_conditional=>c_iconset_4arrowsgray OR
zcl_excel_style_conditional=>c_iconset_4rating OR
zcl_excel_style_conditional=>c_iconset_4redtoblack OR
zcl_excel_style_conditional=>c_iconset_4trafficlights.
MOVE ls_iconset-cfvo1_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo1_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo2_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo2_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo3_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo3_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo4_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo4_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR
zcl_excel_style_conditional=>c_iconset_5arrowsgray OR
zcl_excel_style_conditional=>c_iconset_5quarters OR
zcl_excel_style_conditional=>c_iconset_5rating.
MOVE ls_iconset-cfvo1_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo1_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo2_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo2_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo3_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo3_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo4_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo4_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
MOVE ls_iconset-cfvo5_value TO ls_cfvo-value.
MOVE ls_iconset-cfvo5_type TO ls_cfvo-type.
APPEND ls_cfvo TO lt_cfvo.
WHEN OTHERS.
CLEAR lt_cfvo.
ENDCASE.
LOOP AT lt_cfvo INTO ls_cfvo.
" cfvo node
lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo
parent = lo_document ).
lv_value = ls_cfvo-type.
lo_element_4->set_attribute_ns( name = lc_xml_attr_type
value = lv_value ).
lv_value = ls_cfvo-value.
lo_element_4->set_attribute_ns( name = lc_xml_attr_val
value = lv_value ).
lo_element_3->append_child( new_child = lo_element_4 ). " cfvo node
ENDLOOP.
lo_element_2->append_child( new_child = lo_element_3 ). " iconset node
WHEN zcl_excel_style_conditional=>c_rule_cellis.
ls_cellis = lo_style_conditional->mode_cellis.
READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_cellis-cell_style.
lv_value = ls_style_cond_mapping-dxf.
CONDENSE lv_value.
lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid
value = lv_value ).
lv_value = ls_cellis-operator.
lo_element_2->set_attribute_ns( name = lc_xml_attr_operator
value = lv_value ).
" formula node
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula
parent = lo_document ).
lv_value = ls_cellis-formula.
lo_element_3->set_value( value = lv_value ).
lo_element_2->append_child( new_child = lo_element_3 ). " formula node
WHEN zcl_excel_style_conditional=>c_rule_expression.
ls_expression = lo_style_conditional->mode_expression.
READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_expression-cell_style.
lv_value = ls_style_cond_mapping-dxf.
CONDENSE lv_value.
lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid
value = lv_value ).
" formula node
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula
parent = lo_document ).
lv_value = ls_expression-formula.
lo_element_3->set_value( value = lv_value ).
lo_element_2->append_child( new_child = lo_element_3 ). " formula node
ENDCASE.
lo_element->append_child( new_child = lo_element_2 ). " cfRule node
lo_element_root->append_child( new_child = lo_element ). " Conditional formatting node
ENDWHILE.
IF io_worksheet->get_data_validations_size( ) GT 0.
" dataValidations node
lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations
parent = lo_document ).
" Conditional formatting node
lo_iterator = io_worksheet->get_data_validations_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_data_validation ?= lo_iterator->if_object_collection_iterator~get_next( ).
" dataValidation node
lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation
parent = lo_document ).
lv_value = lo_data_validation->type.
lo_element_2->set_attribute_ns( name = lc_xml_attr_type
value = lv_value ).
IF NOT lo_data_validation->operator IS INITIAL.
lv_value = lo_data_validation->operator.
lo_element_2->set_attribute_ns( name = lc_xml_attr_operator
value = lv_value ).
ENDIF.
IF lo_data_validation->allowblank EQ abap_true.
lv_value = '1'.
ELSE.
lv_value = '0'.
ENDIF.
lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank
value = lv_value ).
IF lo_data_validation->showinputmessage EQ abap_true.
lv_value = '1'.
ELSE.
lv_value = '0'.
ENDIF.
lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage
value = lv_value ).
IF lo_data_validation->showerrormessage EQ abap_true.
lv_value = '1'.
ELSE.
lv_value = '0'.
ENDIF.
lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage
value = lv_value ).
IF NOT lo_data_validation->errortitle IS INITIAL.
lv_value = lo_data_validation->errortitle.
lo_element_2->set_attribute_ns( name = lc_xml_attr_errortitle
value = lv_value ).
ENDIF.
IF NOT lo_data_validation->error IS INITIAL.
lv_value = lo_data_validation->error.
lo_element_2->set_attribute_ns( name = lc_xml_attr_error
value = lv_value ).
ENDIF.
IF NOT lo_data_validation->prompttitle IS INITIAL.
lv_value = lo_data_validation->prompttitle.
lo_element_2->set_attribute_ns( name = lc_xml_attr_prompttitle
value = lv_value ).
ENDIF.
IF NOT lo_data_validation->prompt IS INITIAL.
lv_value = lo_data_validation->prompt.
lo_element_2->set_attribute_ns( name = lc_xml_attr_prompt
value = lv_value ).
ENDIF.
lv_cell_row_s = lo_data_validation->cell_row.
CONDENSE lv_cell_row_s.
CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value.
IF lo_data_validation->cell_row_to IS NOT INITIAL.
lv_cell_row_s = lo_data_validation->cell_row_to.
CONDENSE lv_cell_row_s.
CONCATENATE lv_value ':' lo_data_validation->cell_column_to lv_cell_row_s INTO lv_value.
ENDIF.
lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref
value = lv_value ).
" formula1 node
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1
parent = lo_document ).
lv_value = lo_data_validation->formula1.
lo_element_3->set_value( value = lv_value ).
lo_element_2->append_child( new_child = lo_element_3 ). " formula1 node
" formula2 node
IF NOT lo_data_validation->formula2 IS INITIAL.
lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula2
parent = lo_document ).
lv_value = lo_data_validation->formula2.
lo_element_3->set_value( value = lv_value ).
lo_element_2->append_child( new_child = lo_element_3 ). " formula2 node
ENDIF.
lo_element->append_child( new_child = lo_element_2 ). " dataValidation node
ENDWHILE.
lo_element_root->append_child( new_child = lo_element ). " dataValidations node
ENDIF.
" Hyperlinks
DATA: lv_hyperlinks_count TYPE i,
lo_link TYPE REF TO zcl_excel_hyperlink.
lv_hyperlinks_count = io_worksheet->get_hyperlinks_size( ).
IF lv_hyperlinks_count > 0.
lo_element = lo_document->create_simple_element( name = 'hyperlinks'
parent = lo_document ).
lo_iterator = io_worksheet->get_hyperlinks_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_link ?= lo_iterator->if_object_collection_iterator~get_next( ).
lo_element_2 = lo_document->create_simple_element( name = 'hyperlink'
parent = lo_element ).
lv_value = lo_link->get_ref( ).
lo_element_2->set_attribute_ns( name = 'ref'
value = lv_value ).
IF lo_link->is_internal( ) = abap_true.
lv_value = lo_link->get_url( ).
lo_element_2->set_attribute_ns( name = 'location'
value = lv_value ).
ELSE.
ADD 1 TO lv_relation_id.
lv_value = lv_relation_id.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element_2->set_attribute_ns( name = 'r:id'
value = lv_value ).
ENDIF.
lo_element->append_child( new_child = lo_element_2 ).
ENDWHILE.
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
" PrintOptions
IF io_worksheet->print_gridlines = abap_true OR
io_worksheet->sheet_setup->vertical_centered = abap_true OR
io_worksheet->sheet_setup->vertical_centered = abap_true.
lo_element = lo_document->create_simple_element( name = 'printOptions'
parent = lo_document ).
IF io_worksheet->print_gridlines = abap_true.
lo_element->set_attribute_ns( name = lc_xml_attr_gridlines
value = 'true' ).
ENDIF.
IF io_worksheet->sheet_setup->horizontal_centered = abap_true.
lo_element->set_attribute_ns( name = 'horizontalCentered'
value = 'true' ).
ENDIF.
IF io_worksheet->sheet_setup->vertical_centered = abap_true.
lo_element->set_attribute_ns( name = 'verticalCentered'
value = 'true' ).
ENDIF.
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
" pageMargins node
lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins
parent = lo_document ).
lv_value = io_worksheet->sheet_setup->margin_left.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_left
value = lv_value ).
lv_value = io_worksheet->sheet_setup->margin_right.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_right
value = lv_value ).
lv_value = io_worksheet->sheet_setup->margin_top.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_top
value = lv_value ).
lv_value = io_worksheet->sheet_setup->margin_bottom.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_bottom
value = lv_value ).
lv_value = io_worksheet->sheet_setup->margin_header.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_header
value = lv_value ).
lv_value = io_worksheet->sheet_setup->margin_footer.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_footer
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ). " pageMargins node
* pageSetup node
lo_element = lo_document->create_simple_element( name = lc_xml_node_pagesetup
parent = lo_document ).
IF io_worksheet->sheet_setup->black_and_white IS NOT INITIAL.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_blackandwhite
value = `1` ).
ENDIF.
IF io_worksheet->sheet_setup->cell_comments IS NOT INITIAL.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_cellcomments
value = io_worksheet->sheet_setup->cell_comments ).
ENDIF.
IF io_worksheet->sheet_setup->copies IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->copies.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_copies
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->draft IS NOT INITIAL.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_draft
value = `1` ).
ENDIF.
IF io_worksheet->sheet_setup->errors IS NOT INITIAL.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_errors
value = io_worksheet->sheet_setup->errors ).
ENDIF.
IF io_worksheet->sheet_setup->first_page_number IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->first_page_number.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_firstpagenumber
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->fit_to_height.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_fittoheight
value = lv_value ).
lv_value = io_worksheet->sheet_setup->fit_to_width.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_fittowidth
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->horizontal_dpi IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->horizontal_dpi.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_horizontaldpi
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->orientation IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->orientation.
lo_element->set_attribute_ns( name = lc_xml_attr_orientation
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->page_order IS NOT INITIAL.
lo_element->set_attribute_ns( name = lc_xml_attr_pageorder
value = io_worksheet->sheet_setup->page_order ).
ENDIF.
IF io_worksheet->sheet_setup->paper_height IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->paper_height.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_paperheight
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->paper_size IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->paper_size.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_papersize
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->paper_width IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->paper_width.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_paperwidth
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->scale IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->scale.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_scale
value = lv_value ).
ENDIF.
IF io_worksheet->sheet_setup->use_first_page_num IS NOT INITIAL.
lo_element->set_attribute_ns( name = lc_xml_attr_usefirstpagenumber
value = `1` ).
ENDIF.
IF io_worksheet->sheet_setup->use_printer_defaults IS NOT INITIAL.
lo_element->set_attribute_ns( name = lc_xml_attr_useprinterdefaults
value = `1` ).
ENDIF.
IF io_worksheet->sheet_setup->vertical_dpi IS NOT INITIAL.
lv_value = io_worksheet->sheet_setup->vertical_dpi.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_verticaldpi
value = lv_value ).
ENDIF.
lo_element_root->append_child( new_child = lo_element ). " pageSetup node
* drawing
DATA: lo_drawings TYPE REF TO zcl_excel_drawings.
lo_drawings = io_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
lo_element = lo_document->create_simple_element( name = lc_xml_node_drawing
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( name = 'r:id'
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
* tables
DATA lv_table_count TYPE i.
lv_table_count = io_worksheet->get_tables_size( ).
IF lv_table_count > 0.
lo_element = lo_document->create_simple_element( name = 'tableParts'
parent = lo_document ).
lv_value = lv_table_count.
CONDENSE lv_value.
lo_element->set_attribute_ns( name = 'count'
value = lv_value ).
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( ).
ADD 1 TO lv_relation_id.
lv_value = lv_relation_id.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element_2 = lo_document->create_simple_element( name = 'tablePart'
parent = lo_element ).
lo_element_2->set_attribute_ns( name = 'r:id'
value = lv_value ).
lo_element->append_child( new_child = lo_element_2 ).
ENDWHILE.
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
**********************************************************************
* 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_SHEET_RELS.
** Constant node name
DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships',
lc_xml_node_relationship TYPE string VALUE 'Relationship',
" Node attributes
lc_xml_attr_id TYPE string VALUE 'Id',
lc_xml_attr_type TYPE string VALUE 'Type',
lc_xml_attr_target TYPE string VALUE 'Target',
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_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'.
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 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_table TYPE REF TO zcl_excel_table,
lo_link TYPE REF TO zcl_excel_hyperlink.
DATA: lv_value TYPE string,
lv_relation_id TYPE i,
lv_index_str TYPE string.
**********************************************************************
* 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_relationships
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_rels_ns ).
**********************************************************************
* STEP 4: Create subnodes
" Add sheet Relationship nodes here
lv_relation_id = 0.
lo_iterator = io_worksheet->get_hyperlinks_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_link ?= lo_iterator->if_object_collection_iterator~get_next( ).
ADD 1 TO lv_relation_id.
lv_value = lv_relation_id.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
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_link_tp ).
lv_value = lo_link->get_url( ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lv_value ).
lo_element->set_attribute_ns( name = lc_xml_attr_target_mode
value = lc_xml_val_external ).
lo_element_root->append_child( new_child = lo_element ).
ENDWHILE.
* drawing
DATA: lo_drawings TYPE REF TO zcl_excel_drawings.
lo_drawings = io_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
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_tp ).
lv_index_str = iv_drawing_index.
CONDENSE lv_index_str NO-GAPS.
MOVE me->c_xl_drawings 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.
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( ).
ADD 1 TO lv_relation_id.
lv_value = lv_relation_id.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
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_table_tp ).
lv_value = lo_table->get_name( ).
CONCATENATE '../tables/' lv_value '.xml' 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 ).
ENDWHILE.
**********************************************************************
* 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_styles.
** Constant node name
CONSTANTS: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet',
" font
lc_xml_node_fonts TYPE string VALUE 'fonts',
lc_xml_node_font TYPE string VALUE 'font',
lc_xml_node_b TYPE string VALUE 'b', "bold
lc_xml_node_i TYPE string VALUE 'i', "italic
lc_xml_node_u TYPE string VALUE 'u', "underline
lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough
lc_xml_node_sz TYPE string VALUE 'sz',
lc_xml_node_color TYPE string VALUE 'color',
lc_xml_node_name TYPE string VALUE 'name',
lc_xml_node_family TYPE string VALUE 'family',
lc_xml_node_scheme TYPE string VALUE 'scheme',
" fill
lc_xml_node_fills TYPE string VALUE 'fills',
lc_xml_node_fill TYPE string VALUE 'fill',
lc_xml_node_patternfill TYPE string VALUE 'patternFill',
lc_xml_node_fgcolor TYPE string VALUE 'fgColor',
lc_xml_node_bgcolor TYPE string VALUE 'bgColor',
lc_xml_node_gradientfill TYPE string VALUE 'gradientFill',
lc_xml_node_stop TYPE string VALUE 'stop',
" borders
lc_xml_node_borders TYPE string VALUE 'borders',
lc_xml_node_border TYPE string VALUE 'border',
lc_xml_node_left TYPE string VALUE 'left',
lc_xml_node_right TYPE string VALUE 'right',
lc_xml_node_top TYPE string VALUE 'top',
lc_xml_node_bottom TYPE string VALUE 'bottom',
lc_xml_node_diagonal TYPE string VALUE 'diagonal',
" numfmt
lc_xml_node_numfmts TYPE string VALUE 'numFmts',
lc_xml_node_numfmt TYPE string VALUE 'numFmt',
" Styles
lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs',
lc_xml_node_xf TYPE string VALUE 'xf',
lc_xml_node_cellxfs TYPE string VALUE 'cellXfs',
lc_xml_node_cellstyles TYPE string VALUE 'cellStyles',
lc_xml_node_cellstyle TYPE string VALUE 'cellStyle',
lc_xml_node_dxfs TYPE string VALUE 'dxfs',
lc_xml_node_dxf TYPE string VALUE 'dxf',
lc_xml_node_tablestyles TYPE string VALUE 'tableStyles',
" Colors
lc_xml_node_colors TYPE string VALUE 'colors',
lc_xml_node_mrucolors TYPE string VALUE 'mruColors',
" Alignment
lc_xml_node_alignment TYPE string VALUE 'alignment',
" Protection
lc_xml_node_protection TYPE string VALUE 'protection',
" Node attributes
lc_xml_attr_count TYPE string VALUE 'count',
lc_xml_attr_val TYPE string VALUE 'val',
lc_xml_attr_theme TYPE string VALUE 'theme',
lc_xml_attr_rgb TYPE string VALUE 'rgb',
lc_xml_attr_indexed TYPE string VALUE 'indexed',
lc_xml_attr_tint TYPE string VALUE 'tint',
lc_xml_attr_style TYPE string VALUE 'style',
lc_xml_attr_position TYPE string VALUE 'position',
lc_xml_attr_degree TYPE string VALUE 'degree',
lc_xml_attr_patterntype TYPE string VALUE 'patternType',
lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId',
lc_xml_attr_fontid TYPE string VALUE 'fontId',
lc_xml_attr_fillid TYPE string VALUE 'fillId',
lc_xml_attr_borderid TYPE string VALUE 'borderId',
lc_xml_attr_xfid TYPE string VALUE 'xfId',
lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat',
lc_xml_attr_applyprotection TYPE string VALUE 'applyProtection',
lc_xml_attr_applyfont TYPE string VALUE 'applyFont',
lc_xml_attr_applyfill TYPE string VALUE 'applyFill',
lc_xml_attr_applyborder TYPE string VALUE 'applyBorder',
lc_xml_attr_name TYPE string VALUE 'name',
lc_xml_attr_builtinid TYPE string VALUE 'builtinId',
lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle',
lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle',
lc_xml_attr_applyalignment TYPE string VALUE 'applyAlignment',
lc_xml_attr_horizontal TYPE string VALUE 'horizontal',
lc_xml_attr_formatcode TYPE string VALUE 'formatCode',
lc_xml_attr_vertical TYPE string VALUE 'vertical',
lc_xml_attr_wraptext TYPE string VALUE 'wrapText',
lc_xml_attr_textrotation TYPE string VALUE 'textRotation',
lc_xml_attr_shrinktofit TYPE string VALUE 'shrinkToFit',
lc_xml_attr_indent TYPE string VALUE 'indent',
lc_xml_attr_locked TYPE string VALUE 'locked',
lc_xml_attr_hidden TYPE string VALUE 'hidden',
lc_xml_attr_diagonalup TYPE string VALUE 'diagonalUp',
lc_xml_attr_diagonaldown TYPE string VALUE 'diagonalDown',
" Node namespace
lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'.
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_fonts TYPE REF TO if_ixml_element,
lo_element_font TYPE REF TO if_ixml_element,
lo_element_fills TYPE REF TO if_ixml_element,
lo_element_fill TYPE REF TO if_ixml_element,
lo_element_borders TYPE REF TO if_ixml_element,
lo_element_border TYPE REF TO if_ixml_element,
lo_element_numfmts TYPE REF TO if_ixml_element,
lo_element_numfmt TYPE REF TO if_ixml_element,
lo_element_cellxfs TYPE REF TO if_ixml_element,
lo_element TYPE REF TO if_ixml_element,
lo_sub_element TYPE REF TO if_ixml_element,
lo_sub_element_2 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_iterator2 TYPE REF TO cl_object_collection_iterator,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_style_conditional TYPE REF TO zcl_excel_style_conditional,
lo_style TYPE REF TO zcl_excel_style.
DATA: lt_fonts TYPE zexcel_t_style_font,
ls_font TYPE zexcel_s_style_font,
lt_fills TYPE zexcel_t_style_fill,
ls_fill TYPE zexcel_s_style_fill,
lt_borders TYPE zexcel_t_style_border,
ls_border TYPE zexcel_s_style_border,
lt_numfmts TYPE zexcel_t_style_numfmt,
ls_numfmt TYPE zexcel_s_style_numfmt,
lt_protections TYPE zexcel_t_style_protection,
ls_protection TYPE zexcel_s_style_protection,
lt_alignments TYPE zexcel_t_style_alignment,
ls_alignment TYPE zexcel_s_style_alignment,
lt_cellxfs TYPE zexcel_t_cellxfs,
ls_cellxfs TYPE zexcel_s_cellxfs,
ls_styles_mapping TYPE zexcel_s_styles_mapping,
ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping,
ls_cellis TYPE zexcel_conditional_cellis,
ls_expression TYPE zexcel_conditional_expression.
DATA: lv_value TYPE string,
lv_dfx_count TYPE i,
lv_fonts_count TYPE i,
lv_fills_count TYPE i,
lv_borders_count TYPE i,
lv_cellxfs_count TYPE i,
lv_align_flag TYPE c.
**********************************************************************
* 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_stylesheet
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_ns ).
**********************************************************************
* STEP 4: Create subnodes
lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts
parent = lo_document ).
lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills
parent = lo_document ).
lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders
parent = lo_document ).
lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs
parent = lo_document ).
lo_element_numfmts = lo_document->create_simple_element( name = lc_xml_node_numfmts
parent = lo_document ).
* Compress styles
lo_iterator = excel->get_styles_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_style ?= lo_iterator->if_object_collection_iterator~get_next( ).
ls_font = lo_style->font->get_structure( ).
ls_fill = lo_style->fill->get_structure( ).
ls_border = lo_style->borders->get_structure( ).
ls_alignment = lo_style->alignment->get_structure( ).
ls_protection = lo_style->protection->get_structure( ).
ls_numfmt = lo_style->number_format->get_structure( ).
CLEAR ls_cellxfs.
* Compress fonts
READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
ls_cellxfs-fontid = sy-tabix.
ELSE.
APPEND ls_font TO lt_fonts.
DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid.
ENDIF.
SUBTRACT 1 FROM ls_cellxfs-fontid.
* Compress alignment
READ TABLE lt_alignments FROM ls_alignment TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
ls_cellxfs-alignmentid = sy-tabix.
ELSE.
APPEND ls_alignment TO lt_alignments.
DESCRIBE TABLE lt_alignments LINES ls_cellxfs-alignmentid.
ENDIF.
SUBTRACT 1 FROM ls_cellxfs-alignmentid.
* Compress fills
READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
ls_cellxfs-fillid = sy-tabix.
ELSE.
APPEND ls_fill TO lt_fills.
DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid.
ENDIF.
SUBTRACT 1 FROM ls_cellxfs-fillid.
* Compress borders
READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
ls_cellxfs-borderid = sy-tabix.
ELSE.
APPEND ls_border TO lt_borders.
DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid.
ENDIF.
SUBTRACT 1 FROM ls_cellxfs-borderid.
* Compress protection
IF ls_protection-locked EQ c_on AND ls_protection-hidden EQ c_off.
ls_cellxfs-applyprotection = 0.
ELSE.
READ TABLE lt_protections FROM ls_protection TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
ls_cellxfs-protectionid = sy-tabix.
ELSE.
APPEND ls_protection TO lt_protections.
DESCRIBE TABLE lt_protections LINES ls_cellxfs-protectionid.
ENDIF.
ls_cellxfs-applyprotection = 1.
ENDIF.
SUBTRACT 1 FROM ls_cellxfs-protectionid.
* Compress number formats
IF ls_numfmt IS NOT INITIAL.
READ TABLE lt_numfmts FROM ls_numfmt TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
ls_cellxfs-numfmtid = sy-tabix.
ELSE.
APPEND ls_numfmt TO lt_numfmts.
DESCRIBE TABLE lt_numfmts LINES ls_cellxfs-numfmtid.
ENDIF.
ADD zcl_excel_common=>c_excel_numfmt_offset TO ls_cellxfs-numfmtid. " Add OXML offset for custom styles
ls_cellxfs-applynumberformat = 1.
ELSE.
ls_cellxfs-applynumberformat = 0.
ENDIF.
IF ls_cellxfs-fontid NE 0.
ls_cellxfs-applyfont = 1.
ELSE.
ls_cellxfs-applyfont = 0.
ENDIF.
IF ls_cellxfs-alignmentid NE 0.
ls_cellxfs-applyalignment = 1.
ELSE.
ls_cellxfs-applyalignment = 0.
ENDIF.
IF ls_cellxfs-fillid NE 0.
ls_cellxfs-applyfill = 1.
ELSE.
ls_cellxfs-applyfill = 0.
ENDIF.
IF ls_cellxfs-borderid NE 0.
ls_cellxfs-applyborder = 1.
ELSE.
ls_cellxfs-applyborder = 0.
ENDIF.
* Remap styles
READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
ls_styles_mapping-style = sy-tabix.
ELSE.
APPEND ls_cellxfs TO lt_cellxfs.
DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style.
ENDIF.
SUBTRACT 1 FROM ls_styles_mapping-style.
ls_styles_mapping-guid = lo_style->get_guid( ).
APPEND ls_styles_mapping TO me->styles_mapping.
ENDWHILE.
" create numfmt elements
LOOP AT lt_numfmts INTO ls_numfmt.
lo_element_numfmt = lo_document->create_simple_element( name = lc_xml_node_numfmt
parent = lo_document ).
lv_value = sy-tabix + zcl_excel_common=>c_excel_numfmt_offset.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid
value = lv_value ).
lv_value = ls_numfmt-numfmt.
lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_formatcode
value = lv_value ).
lo_element_numfmts->append_child( new_child = lo_element_numfmt ).
ENDLOOP.
" create font elements
LOOP AT lt_fonts INTO ls_font.
lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font
parent = lo_document ).
IF ls_font-bold EQ abap_true.
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b
parent = lo_document ).
lo_element_font->append_child( new_child = lo_sub_element ).
ENDIF.
IF ls_font-italic EQ abap_true.
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i
parent = lo_document ).
lo_element_font->append_child( new_child = lo_sub_element ).
ENDIF.
IF ls_font-underline EQ abap_true.
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u
parent = lo_document ).
lv_value = ls_font-underline_mode.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_val
value = lv_value ).
lo_element_font->append_child( new_child = lo_sub_element ).
ENDIF.
IF ls_font-strikethrough EQ abap_true.
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike
parent = lo_document ).
lo_element_font->append_child( new_child = lo_sub_element ).
ENDIF.
"size
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz
parent = lo_document ).
lv_value = ls_font-size.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_val
value = lv_value ).
lo_element_font->append_child( new_child = lo_sub_element ).
"color
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_element_font
is_color = ls_font-color ).
"name
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name
parent = lo_document ).
lv_value = ls_font-name.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_val
value = lv_value ).
lo_element_font->append_child( new_child = lo_sub_element ).
"family
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family
parent = lo_document ).
lv_value = ls_font-family.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_val
value = lv_value ).
lo_element_font->append_child( new_child = lo_sub_element ).
"scheme
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme
parent = lo_document ).
lv_value = ls_font-scheme.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_val
value = lv_value ).
lo_element_font->append_child( new_child = lo_sub_element ).
lo_element_fonts->append_child( new_child = lo_element_font ).
ENDLOOP.
" create fill elements
LOOP AT lt_fills INTO ls_fill.
lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill
parent = lo_document ).
"pattern
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill
parent = lo_document ).
lv_value = ls_fill-filltype.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype
value = lv_value ).
" fgcolor
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element
is_color = ls_fill-fgcolor
iv_color_elem_name = lc_xml_node_fgcolor ).
" bgcolor
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element
is_color = ls_fill-bgcolor
iv_color_elem_name = lc_xml_node_bgcolor ).
lo_element_fill->append_child( new_child = lo_sub_element )."pattern
lo_element_fills->append_child( new_child = lo_element_fill ).
ENDLOOP.
" create border elements
LOOP AT lt_borders INTO ls_border.
lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border
parent = lo_document ).
IF ls_border-diagonalup IS NOT INITIAL.
lv_value = ls_border-diagonalup.
CONDENSE lv_value.
lo_element_border->set_attribute_ns( name = lc_xml_attr_diagonalup
value = lv_value ).
ENDIF.
IF ls_border-diagonaldown IS NOT INITIAL.
lv_value = ls_border-diagonaldown.
CONDENSE lv_value.
lo_element_border->set_attribute_ns( name = lc_xml_attr_diagonaldown
value = lv_value ).
ENDIF.
"left
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left
parent = lo_document ).
IF ls_border-left_style IS NOT INITIAL.
lv_value = ls_border-left_style.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_style
value = lv_value ).
ENDIF.
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element
is_color = ls_border-left_color ).
lo_element_border->append_child( new_child = lo_sub_element ).
"right
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right
parent = lo_document ).
IF ls_border-right_style IS NOT INITIAL.
lv_value = ls_border-right_style.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_style
value = lv_value ).
ENDIF.
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element
is_color = ls_border-right_color ).
lo_element_border->append_child( new_child = lo_sub_element ).
"top
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top
parent = lo_document ).
IF ls_border-top_style IS NOT INITIAL.
lv_value = ls_border-top_style.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_style
value = lv_value ).
ENDIF.
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element
is_color = ls_border-top_color ).
lo_element_border->append_child( new_child = lo_sub_element ).
"bottom
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom
parent = lo_document ).
IF ls_border-bottom_style IS NOT INITIAL.
lv_value = ls_border-bottom_style.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_style
value = lv_value ).
ENDIF.
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element
is_color = ls_border-bottom_color ).
lo_element_border->append_child( new_child = lo_sub_element ).
"diagonal
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal
parent = lo_document ).
IF ls_border-diagonal_style IS NOT INITIAL.
lv_value = ls_border-diagonal_style.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_style
value = lv_value ).
ENDIF.
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element
is_color = ls_border-diagonal_color ).
lo_element_border->append_child( new_child = lo_sub_element ).
lo_element_borders->append_child( new_child = lo_element_border ).
ENDLOOP.
" update attribute "count"
DESCRIBE TABLE lt_fonts LINES lv_fonts_count.
MOVE lv_fonts_count TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count
value = lv_value ).
DESCRIBE TABLE lt_fills LINES lv_fills_count.
MOVE lv_fills_count TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_fills->set_attribute_ns( name = lc_xml_attr_count
value = lv_value ).
DESCRIBE TABLE lt_borders LINES lv_borders_count.
MOVE lv_borders_count TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_borders->set_attribute_ns( name = lc_xml_attr_count
value = lv_value ).
DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count.
MOVE lv_cellxfs_count TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count
value = lv_value ).
" Append to root node
lo_element_root->append_child( new_child = lo_element_numfmts ).
lo_element_root->append_child( new_child = lo_element_fonts ).
lo_element_root->append_child( new_child = lo_element_fills ).
lo_element_root->append_child( new_child = lo_element_borders ).
" cellstylexfs node
lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_count
value = '1' ).
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf
parent = lo_document ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid
value = c_off ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid
value = c_off ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid
value = c_off ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid
value = c_off ).
lo_element->append_child( new_child = lo_sub_element ).
lo_element_root->append_child( new_child = lo_element ).
LOOP AT lt_cellxfs INTO ls_cellxfs.
lo_element = lo_document->create_simple_element( name = lc_xml_node_xf
parent = lo_document ).
MOVE ls_cellxfs-numfmtid TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid
value = lv_value ).
MOVE ls_cellxfs-fontid TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_fontid
value = lv_value ).
MOVE ls_cellxfs-fillid TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_fillid
value = lv_value ).
MOVE ls_cellxfs-borderid TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_borderid
value = lv_value ).
MOVE ls_cellxfs-xfid TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_xfid
value = lv_value ).
IF ls_cellxfs-applynumberformat EQ 1.
MOVE ls_cellxfs-applynumberformat TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat
value = lv_value ).
ENDIF.
IF ls_cellxfs-applyfont EQ 1.
MOVE ls_cellxfs-applyfont TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_applyfont
value = lv_value ).
ENDIF.
IF ls_cellxfs-applyfill EQ 1.
MOVE ls_cellxfs-applyfill TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_applyfill
value = lv_value ).
ENDIF.
IF ls_cellxfs-applyborder EQ 1.
MOVE ls_cellxfs-applyborder TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_applyborder
value = lv_value ).
ENDIF.
IF ls_cellxfs-applyalignment EQ 1. " depends on each style not for all the sheet
MOVE ls_cellxfs-applyalignment TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_element->set_attribute_ns( name = lc_xml_attr_applyalignment
value = lv_value ).
lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_alignment
parent = lo_document ).
ADD 1 TO ls_cellxfs-alignmentid. "Table index starts from 1
READ TABLE lt_alignments INTO ls_alignment INDEX ls_cellxfs-alignmentid.
SUBTRACT 1 FROM ls_cellxfs-alignmentid.
IF ls_alignment-horizontal IS NOT INITIAL.
MOVE ls_alignment-horizontal TO lv_value.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_horizontal
value = lv_value ).
ENDIF.
IF ls_alignment-vertical IS NOT INITIAL.
MOVE ls_alignment-vertical TO lv_value.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_vertical
value = lv_value ).
ENDIF.
IF ls_alignment-wraptext EQ abap_true.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_wraptext
value = c_on ).
ENDIF.
IF ls_alignment-textrotation IS NOT INITIAL.
MOVE ls_alignment-textrotation TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_textrotation
value = lv_value ).
ENDIF.
IF ls_alignment-shrinktofit EQ abap_true.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_shrinktofit
value = c_on ).
ENDIF.
IF ls_alignment-indent IS NOT INITIAL.
MOVE ls_alignment-indent TO lv_value.
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indent
value = lv_value ).
ENDIF.
lo_element->append_child( new_child = lo_sub_element_2 ).
ENDIF.
IF ls_cellxfs-applyprotection EQ 1.
MOVE ls_cellxfs-applyprotection TO lv_value.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_applyprotection
value = lv_value ).
lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_protection
parent = lo_document ).
ADD 1 TO ls_cellxfs-protectionid. "Table index starts from 1
READ TABLE lt_protections INTO ls_protection INDEX ls_cellxfs-protectionid.
SUBTRACT 1 FROM ls_cellxfs-protectionid.
IF ls_protection-locked IS NOT INITIAL.
MOVE ls_protection-locked TO lv_value.
CONDENSE lv_value.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_locked
value = lv_value ).
ENDIF.
IF ls_protection-hidden IS NOT INITIAL.
MOVE ls_protection-hidden TO lv_value.
CONDENSE lv_value.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_hidden
value = lv_value ).
ENDIF.
lo_element->append_child( new_child = lo_sub_element_2 ).
ENDIF.
lo_element_cellxfs->append_child( new_child = lo_element ).
ENDLOOP.
lo_element_root->append_child( new_child = lo_element_cellxfs ).
" cellStyles node
lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_count
value = '1' ).
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle
parent = lo_document ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_name
value = 'Normal' ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid
value = c_off ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid
value = c_off ).
lo_element->append_child( new_child = lo_sub_element ).
lo_element_root->append_child( new_child = lo_element ).
" dxfs node
lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs
parent = lo_document ).
lo_iterator = me->excel->get_worksheets_iterator( ).
" get sheets
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ).
" Conditional formatting styles into exch sheet
lo_iterator2 = lo_worksheet->get_cond_styles_iterator( ).
WHILE lo_iterator2->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_style_conditional ?= lo_iterator2->if_object_collection_iterator~get_next( ).
CASE lo_style_conditional->rule.
WHEN zcl_excel_style_conditional=>c_rule_cellis.
"if style defined
ls_cellis = lo_style_conditional->mode_cellis.
IF ls_cellis-cell_style IS INITIAL.
CONTINUE.
ENDIF.
READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = ls_cellis-cell_style.
ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0
READ TABLE lt_cellxfs INTO ls_cellxfs INDEX ls_styles_mapping-style.
ADD 1 TO ls_cellxfs-fillid. " the numbering starts from 0
" Style already mapped?
READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY style = ls_styles_mapping-style.
IF sy-subrc EQ 0.
ls_style_cond_mapping-guid = ls_cellis-cell_style.
APPEND ls_style_cond_mapping TO me->styles_cond_mapping.
ELSE.
ls_style_cond_mapping-guid = ls_cellis-cell_style.
ls_style_cond_mapping-style = ls_styles_mapping-style.
ls_style_cond_mapping-dxf = lv_dfx_count.
APPEND ls_style_cond_mapping TO me->styles_cond_mapping.
ADD 1 TO lv_dfx_count.
" dxf node
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_dxf
parent = lo_document ).
READ TABLE lt_fills INTO ls_fill INDEX ls_cellxfs-fillid.
IF ls_fill IS NOT INITIAL.
" fill properties
lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill
parent = lo_document ).
"pattern
lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_patternfill
parent = lo_document ).
lv_value = ls_fill-filltype.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_patterntype
value = lv_value ).
" fgcolor
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element_2
is_color = ls_fill-fgcolor
iv_color_elem_name = lc_xml_node_fgcolor ).
" bgcolor
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element_2
is_color = ls_fill-bgcolor
iv_color_elem_name = lc_xml_node_bgcolor ).
lo_element_fill->append_child( new_child = lo_sub_element_2 ). "pattern
lo_sub_element->append_child( new_child = lo_element_fill ).
ENDIF.
ENDIF.
lo_element->append_child( new_child = lo_sub_element ).
WHEN zcl_excel_style_conditional=>c_rule_expression.
"if style defined
ls_expression = lo_style_conditional->mode_expression.
IF ls_expression-cell_style IS INITIAL.
CONTINUE.
ENDIF.
READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = ls_expression-cell_style.
ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0
READ TABLE lt_cellxfs INTO ls_cellxfs INDEX ls_styles_mapping-style.
ADD 1 TO ls_cellxfs-fillid. " the numbering starts from 0
READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY style = ls_styles_mapping-style.
IF sy-subrc EQ 0.
ls_style_cond_mapping-guid = ls_expression-cell_style.
APPEND ls_style_cond_mapping TO me->styles_cond_mapping.
ELSE.
ls_style_cond_mapping-guid = ls_expression-cell_style.
ls_style_cond_mapping-style = ls_styles_mapping-style.
ls_style_cond_mapping-dxf = lv_dfx_count.
APPEND ls_style_cond_mapping TO me->styles_cond_mapping.
ADD 1 TO lv_dfx_count.
" dxf node
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_dxf
parent = lo_document ).
READ TABLE lt_fills INTO ls_fill INDEX ls_cellxfs-fillid.
IF ls_fill IS NOT INITIAL.
" fill properties
lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill
parent = lo_document ).
"pattern
lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_patternfill
parent = lo_document ).
lv_value = ls_fill-filltype.
lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_patterntype
value = lv_value ).
" fgcolor
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element_2
is_color = ls_fill-fgcolor
iv_color_elem_name = lc_xml_node_fgcolor ).
" bgcolor
create_xl_styles_color_node(
io_document = lo_document
io_parent = lo_sub_element_2
is_color = ls_fill-bgcolor
iv_color_elem_name = lc_xml_node_bgcolor ).
lo_element_fill->append_child( new_child = lo_sub_element_2 ). "pattern
lo_sub_element->append_child( new_child = lo_element_fill ).
ENDIF.
ENDIF.
lo_element->append_child( new_child = lo_sub_element ).
WHEN OTHERS.
CONTINUE.
ENDCASE.
ENDWHILE.
ENDWHILE.
lv_value = lv_dfx_count.
CONDENSE lv_value.
lo_element->set_attribute_ns( name = lc_xml_attr_count
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" tableStyles node
lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_count
value = '0' ).
lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle
value = zcl_excel_table=>builtinstyle_medium9 ).
lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle
value = zcl_excel_table=>builtinstyle_pivot_light16 ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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_STYLES_COLOR_NODE.
DATA: lo_sub_element TYPE REF TO if_ixml_element,
lv_value TYPE string.
CONSTANTS: lc_xml_attr_theme TYPE string VALUE 'theme',
lc_xml_attr_rgb TYPE string VALUE 'rgb',
lc_xml_attr_indexed TYPE string VALUE 'indexed',
lc_xml_attr_tint TYPE string VALUE 'tint'.
"add node only if at least one attribute is set
CHECK is_color-rgb IS NOT INITIAL OR
is_color-indexed <> zcl_excel_style_color=>c_indexed_not_set OR
is_color-theme <> zcl_excel_style_color=>c_theme_not_set OR
is_color-tint IS NOT INITIAL.
lo_sub_element = io_document->create_simple_element(
name = iv_color_elem_name
parent = io_parent ).
IF is_color-rgb IS NOT INITIAL.
lv_value = is_color-rgb.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb
value = lv_value ).
ENDIF.
IF is_color-indexed <> zcl_excel_style_color=>c_indexed_not_set.
lv_value = zcl_excel_common=>number_to_excel_string( is_color-indexed ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_indexed
value = lv_value ).
ENDIF.
IF is_color-theme <> zcl_excel_style_color=>c_theme_not_set.
lv_value = zcl_excel_common=>number_to_excel_string( is_color-theme ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_theme
value = lv_value ).
ENDIF.
IF is_color-tint IS NOT INITIAL.
lv_value = zcl_excel_common=>number_to_excel_string( is_color-tint ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_tint
value = lv_value ).
ENDIF.
io_parent->append_child( new_child = lo_sub_element ).
endmethod.method CREATE_XL_TABLE.
DATA: lc_xml_node_table TYPE string VALUE 'table',
lc_xml_node_relationship TYPE string VALUE 'Relationship',
" Node attributes
lc_xml_attr_id TYPE string VALUE 'id',
lc_xml_attr_name TYPE string VALUE 'name',
lc_xml_attr_display_name TYPE string VALUE 'displayName',
lc_xml_attr_ref TYPE string VALUE 'ref',
lc_xml_attr_totals TYPE string VALUE 'totalsRowShown',
" Node namespace
lc_xml_node_table_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
" Node id
lc_xml_node_ridx_id TYPE string VALUE 'rId#'.
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 TYPE REF TO if_ixml_element,
lo_element2 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,
lv_table_name TYPE string,
lv_id TYPE i,
lv_syindex TYPE char3,
lv_ref TYPE string,
lv_value TYPE string,
lo_iterator TYPE REF TO cl_object_collection_iterator,
lv_num_columns TYPE i,
ls_fieldcat TYPE zexcel_s_fieldcatalog.
**********************************************************************
* STEP 1: Create xml
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 table
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_table_ns ).
lv_id = io_table->get_id( ).
lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_id ).
lo_element_root->set_attribute_ns( name = lc_xml_attr_id
value = lv_value ).
lv_table_name = io_table->get_name( ).
lo_element_root->set_attribute_ns( name = lc_xml_attr_name
value = lv_table_name ).
lo_element_root->set_attribute_ns( name = lc_xml_attr_display_name
value = lv_table_name ).
lv_ref = io_table->get_reference( ).
lo_element_root->set_attribute_ns( name = lc_xml_attr_ref
value = lv_ref ).
IF io_table->has_totals( ) = abap_true.
lo_element_root->set_attribute_ns( name = 'totalsRowCount'
value = '1' ).
ELSE.
lo_element_root->set_attribute_ns( name = lc_xml_attr_totals
value = '0' ).
ENDIF.
**********************************************************************
* STEP 4: Create subnodes
" autoFilter
lo_element = lo_document->create_simple_element( name = 'autoFilter'
parent = lo_document ).
lv_ref = io_table->get_reference( ip_include_totals_row = abap_false ).
lo_element->set_attribute_ns( name = 'ref'
value = lv_ref ).
lo_element_root->append_child( new_child = lo_element ).
"columns
lo_element = lo_document->create_simple_element( name = 'tableColumns'
parent = lo_document ).
* lo_columns = io_table->get_columns( ).
LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true.
ADD 1 TO lv_num_columns.
ENDLOOP.
lv_value = lv_num_columns.
CONDENSE lv_value.
lo_element->set_attribute_ns( name = 'count'
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true.
lo_element2 = lo_document->create_simple_element_ns( name = 'tableColumn'
parent = lo_element ).
lv_value = ls_fieldcat-position.
SHIFT lv_value LEFT DELETING LEADING '0'.
lo_element2->set_attribute_ns( name = 'id'
value = lv_value ).
lv_value = ls_fieldcat-scrtext_m.
lo_element2->set_attribute_ns( name = 'name'
value = lv_value ).
IF ls_fieldcat-totals_function IS NOT INITIAL.
lo_element2->set_attribute_ns( name = 'totalsRowFunction'
value = ls_fieldcat-totals_function ).
ENDIF.
lo_element->append_child( new_child = lo_element2 ).
ENDLOOP.
lo_element = lo_document->create_simple_element( name = 'tableStyleInfo'
parent = lo_element_root ).
lo_element->set_attribute_ns( name = 'name'
value = io_table->settings-table_style ).
lo_element->set_attribute_ns( name = 'showFirstColumn'
value = '0' ).
lo_element->set_attribute_ns( name = 'showLastColumn'
value = '0' ).
IF io_table->settings-show_row_stripes = abap_true.
lv_value = '1'.
ELSE.
lv_value = '0'.
ENDIF.
lo_element->set_attribute_ns( name = 'showRowStripes'
value = lv_value ).
IF io_table->settings-show_column_stripes = abap_true.
lv_value = '1'.
ELSE.
lv_value = '0'.
ENDIF.
lo_element->set_attribute_ns( name = 'showColumnStripes'
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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_THEME.
* @TODO *
DATA: lv_xl_theme TYPE string,
lv_xl_theme_01 TYPE string,
lv_xl_theme_02 TYPE string,
lv_xl_theme_03 TYPE string,
lv_xl_theme_04 TYPE string,
lv_xl_theme_05 TYPE string,
lv_xl_theme_06 TYPE string,
lv_xl_theme_07 TYPE string,
lv_xl_theme_08 TYPE string,
lv_xl_theme_09 TYPE string,
lv_xl_theme_10 TYPE string,
lv_xl_theme_11 TYPE string,
lv_xl_theme_12 TYPE string,
lv_xl_theme_13 TYPE string,
lv_xl_theme_14 TYPE string,
lv_xl_theme_15 TYPE string,
lv_xl_theme_16 TYPE string,
lv_xl_theme_17 TYPE string,
lv_xl_theme_18 TYPE string,
lv_xl_theme_19 TYPE string,
lv_xl_theme_20 TYPE string,
lv_xl_theme_21 TYPE string,
lv_xl_theme_22 TYPE string,
lv_xl_theme_23 TYPE string,
lv_xl_theme_24 TYPE string,
lv_xl_theme_25 TYPE string,
lv_xl_theme_26 TYPE string,
lv_xl_theme_27 TYPE string,
lv_xl_theme_28 TYPE string,
lv_xl_theme_29 TYPE string,
lv_xl_theme_30 TYPE string,
lv_xl_theme_31 TYPE string,
lv_xl_theme_32 TYPE string.
lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'.
lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '.
lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '.
lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'.
lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'.
lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '.
lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '.
lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '.
lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '.
lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '.
lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'.
lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '.
lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '.
lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '.
lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '.
lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '.
lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'.
lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '.
lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'.
lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '.
lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '.
lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '.
lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'.
lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'.
lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '.
lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '.
lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'.
lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '.
lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '.
lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '.
lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'.
lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'.
CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15
lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30
lv_xl_theme_31 lv_xl_theme_32
INTO lv_xl_theme SEPARATED BY space.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_xl_theme
IMPORTING
buffer = ep_content.
endmethod.method CREATE_XL_WORKBOOK.
** Constant node name
DATA: lc_xml_node_workbook TYPE string VALUE 'workbook',
lc_xml_node_fileversion TYPE string VALUE 'fileVersion',
lc_xml_node_workbookpr TYPE string VALUE 'workbookPr',
lc_xml_node_bookviews TYPE string VALUE 'bookViews',
lc_xml_node_workbookview TYPE string VALUE 'workbookView',
lc_xml_node_sheets TYPE string VALUE 'sheets',
lc_xml_node_sheet TYPE string VALUE 'sheet',
lc_xml_node_calcpr TYPE string VALUE 'calcPr',
lc_xml_node_workbookprotection TYPE string VALUE 'workbookProtection',
lc_xml_node_definednames TYPE string VALUE 'definedNames',
lc_xml_node_definedname TYPE string VALUE 'definedName',
" Node attributes
lc_xml_attr_appname TYPE string VALUE 'appName',
lc_xml_attr_lastedited TYPE string VALUE 'lastEdited',
lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited',
lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild',
lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion',
lc_xml_attr_xwindow TYPE string VALUE 'xWindow',
lc_xml_attr_ywindow TYPE string VALUE 'yWindow',
lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth',
lc_xml_attr_windowheight TYPE string VALUE 'windowHeight',
lc_xml_attr_activetab TYPE string VALUE 'activeTab',
lc_xml_attr_name TYPE string VALUE 'name',
lc_xml_attr_sheetid TYPE string VALUE 'sheetId',
lc_xml_attr_state TYPE string VALUE 'state',
lc_xml_attr_id TYPE string VALUE 'id',
lc_xml_attr_calcid TYPE string VALUE 'calcId',
lc_xml_attr_lockrevision TYPE string VALUE 'lockRevision',
lc_xml_attr_lockstructure TYPE string VALUE 'lockStructure',
lc_xml_attr_lockwindows TYPE string VALUE 'lockWindows',
lc_xml_attr_revisionspassword TYPE string VALUE 'revisionsPassword',
lc_xml_attr_workbookpassword TYPE string VALUE 'workbookPassword',
" Node namespace
lc_r_ns TYPE string VALUE 'r',
lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
" Node id
lc_xml_node_ridx_id TYPE string VALUE 'rId#'.
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 TYPE REF TO if_ixml_element,
lo_sub_element 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_worksheet TYPE REF TO zcl_excel_worksheet,
lo_range TYPE REF TO zcl_excel_range.
DATA: lv_xml_node_ridx_id TYPE string,
lv_value TYPE string,
lv_syindex TYPE string,
lv_active_sheet TYPE zexcel_active_worksheet.
**********************************************************************
* 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
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:r'
value = lc_xml_node_r_ns ).
**********************************************************************
* STEP 4: Create subnode
" fileVersion node
lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_appname
value = 'xl' ).
lo_element->set_attribute_ns( name = lc_xml_attr_lastedited
value = '4' ).
lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited
value = '4' ).
lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild
value = '4506' ).
lo_element_root->append_child( new_child = lo_element ).
" fileVersion node
lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_themeversion
value = '124226' ).
lo_element_root->append_child( new_child = lo_element ).
" workbookProtection node
IF me->excel->zif_excel_book_protection~protected EQ abap_true.
lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookprotection
parent = lo_document ).
MOVE me->excel->zif_excel_book_protection~workbookpassword TO lv_value.
IF lv_value IS NOT INITIAL.
lo_element->set_attribute_ns( name = lc_xml_attr_workbookpassword
value = lv_value ).
ENDIF.
MOVE me->excel->zif_excel_book_protection~revisionspassword TO lv_value.
IF lv_value IS NOT INITIAL.
lo_element->set_attribute_ns( name = lc_xml_attr_revisionspassword
value = lv_value ).
ENDIF.
MOVE me->excel->zif_excel_book_protection~lockrevision TO lv_value.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_lockrevision
value = lv_value ).
MOVE me->excel->zif_excel_book_protection~lockstructure TO lv_value.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_lockstructure
value = lv_value ).
MOVE me->excel->zif_excel_book_protection~lockwindows TO lv_value.
CONDENSE lv_value NO-GAPS.
lo_element->set_attribute_ns( name = lc_xml_attr_lockwindows
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
" bookviews node
lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews
parent = lo_document ).
" bookview node
lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview
parent = lo_document ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow
value = '120' ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow
value = '120' ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth
value = '19035' ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight
value = '8445' ).
" Set Active Sheet
lv_active_sheet = excel->get_active_sheet_index( ).
IF lv_active_sheet > 1.
lv_active_sheet = lv_active_sheet - 1.
lv_value = lv_active_sheet.
CONDENSE lv_value.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_activetab
value = lv_value ).
ENDIF.
lo_element->append_child( new_child = lo_sub_element )." bookview node
lo_element_root->append_child( new_child = lo_element )." bookviews node
" sheets node
lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets
parent = lo_document ).
lo_iterator = excel->get_worksheets_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
" sheet node
lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet
parent = lo_document ).
lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ).
lv_value = lo_worksheet->get_title( ).
lv_syindex = sy-index.
SHIFT lv_syindex RIGHT DELETING TRAILING space.
SHIFT lv_syindex LEFT DELETING LEADING space.
lv_xml_node_ridx_id = lc_xml_node_ridx_id.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_name
value = lv_value ).
lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid
value = lv_syindex ).
IF lo_worksheet->zif_excel_sheet_properties~hidden EQ abap_true.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_state
value = 'hidden' ).
ENDIF.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_id
prefix = lc_r_ns
value = lv_xml_node_ridx_id ).
lo_element->append_child( new_child = lo_sub_element ). " sheet node
ENDWHILE.
lo_element_root->append_child( new_child = lo_element )." sheets node
" ranges node
lo_element = lo_document->create_simple_element( name = lc_xml_node_definednames
parent = lo_document ).
lo_iterator = excel->get_ranges_iterator( ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
" range node
lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedname
parent = lo_document ).
lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ).
lv_value = lo_range->name.
lo_sub_element->set_attribute_ns( name = lc_xml_attr_name
value = lv_value ).
lv_value = lo_range->get_value( ).
lo_sub_element->set_value( value = lv_value ).
lo_element->append_child( new_child = lo_sub_element ). " range node
ENDWHILE.
lo_element_root->append_child( new_child = lo_element )." ranges node
" calcPr node
lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_calcid
value = '125725' ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* 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 FLAG2BOOL.
IF ip_flag EQ abap_true.
ep_boolean = 'true'.
ELSE.
ep_boolean = 'false'.
ENDIF.
endmethod.method GET_SHARED_STRING_INDEX.
DATA ls_shared_string TYPE zexcel_s_shared_string.
READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value BINARY SEARCH.
ep_index = ls_shared_string-string_no.
endmethod.