From 9e766b5363d54ba0cb1d519825d13813e561bee5 Mon Sep 17 00:00:00 2001 From: Ivan Femia Date: Thu, 15 Mar 2012 22:27:51 +0000 Subject: [PATCH] Implemented fixes for issue #145 Sheet / Page Header and Footer including placeholders for pagenumber, date etc. git-svn-id: https://subversion.assembla.com/svn/abap2xlsx/trunk@263 b7d68dce-7c3c-4a99-8ce0-9ea847f5d049 --- ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk | 463 +- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 9107 ++++++++++--------- ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk | 52 + 3 files changed, 4971 insertions(+), 4651 deletions(-) create mode 100644 ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk b/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk index 9951896..7e3a19d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk @@ -1,5 +1,5 @@ - + class ZCL_EXCEL_SHEET_SETUP definition public final @@ -10,6 +10,9 @@ public section. *"* do not include other source files here!!! type-pools ABAP . + data BLACK_AND_WHITE type FLAG . + data CELL_COMMENTS type STRINGVAL . + data COPIES type INT2 . constants C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT constants C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT constants C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT @@ -91,15 +94,16 @@ public section. constants C_PE_DASH type STRING value 'dash'. "#EC NOTEXT constants C_PE_DISPLAYED type STRING value 'displayed'. "#EC NOTEXT constants C_PE_NA type STRING value 'NA'. "#EC NOTEXT - data BLACK_AND_WHITE type FLAG . - data CELL_COMMENTS type STRINGVAL . - data COPIES type INT2 . + data DIFF_ODDEVEN_HEADERFOOTER type FLAG . data DRAFT type FLAG . data ERRORS type STRINGVAL . + data EVEN_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . + data EVEN_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . data FIRST_PAGE_NUMBER type INT2 . data FIT_TO_HEIGHT type INT2 . data FIT_TO_PAGE type FLAG . data FIT_TO_WIDTH type INT2 . + data HORIZONTAL_CENTERED type FLAG . data HORIZONTAL_DPI type INT2 . data MARGIN_BOTTOM type ZEXCEL_DEC_8_2 . data MARGIN_FOOTER type ZEXCEL_DEC_8_2 . @@ -107,6 +111,8 @@ public section. data MARGIN_LEFT type ZEXCEL_DEC_8_2 . data MARGIN_RIGHT type ZEXCEL_DEC_8_2 . data MARGIN_TOP type ZEXCEL_DEC_8_2 . + data ODD_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . + data ODD_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . data ORIENTATION type ZEXCEL_SHEET_ORIENATATION . data PAGE_ORDER type STRING . data PAPER_HEIGHT type STRING . @@ -115,9 +121,8 @@ public section. data SCALE type INT2 . data USE_FIRST_PAGE_NUM type FLAG . data USE_PRINTER_DEFAULTS type FLAG . - data VERTICAL_DPI type INT2 . - data HORIZONTAL_CENTERED type FLAG . data VERTICAL_CENTERED type FLAG . + data VERTICAL_DPI type INT2 . methods CONSTRUCTOR . methods SET_PAGE_MARGINS @@ -128,10 +133,29 @@ public section. !IP_LEFT type FLOAT optional !IP_RIGHT type FLOAT optional !IP_TOP type FLOAT optional - !IP_UNIT type CSEQUENCE default 'in' . - *"* protected components of class ZABAP_EXCEL_STYLE + !IP_UNIT type CSEQUENCE default 'in' . + methods SET_HEADER_FOOTER + importing + !IP_ODD_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional + !IP_ODD_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional + !IP_EVEN_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional + !IP_EVEN_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional . + methods GET_HEADER_FOOTER_STRING + exporting + !EP_ODD_HEADER type STRING + !EP_ODD_FOOTER type STRING + !EP_EVEN_HEADER type STRING + !EP_EVEN_FOOTER type STRING . + protected section. +*"* protected components of class ZCL_EXCEL_SHEET_SETUP *"* do not include other source files here!!! -protected section. + + methods PROCESS_HEADER_FOOTER + importing + !IP_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT + !IP_SIDE type STRING + returning + value(RV_PROCESSED_STRING) type STRING . private section. *"* private components of class ZCL_EXCEL_SHEET_SETUP *"* do not include other source files here!!! @@ -143,119 +167,122 @@ protected section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. orientation = me->c_orientation_default. @@ -288,16 +315,193 @@ protected section. use_printer_defaults, vertical_dpi. endmethod. - - - - - - - - - + + + + + + method GET_HEADER_FOOTER_STRING. +* ---------------------------------------------------------------------- + DATA: lc_marker_left(2) TYPE c VALUE '&L' + , lc_marker_right(2) TYPE c VALUE '&R' + , lc_marker_center(2) TYPE c VALUE '&C' + , lv_value TYPE string + . +* ---------------------------------------------------------------------- + IF ep_odd_header IS SUPPLIED. + + IF me->odd_header-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_odd_header. + ENDIF. + + IF me->odd_header-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'CENTER' ). + CONCATENATE ep_odd_header lc_marker_center lv_value INTO ep_odd_header. + ENDIF. + + IF me->odd_header-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'RIGHT' ). + CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_odd_header. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- + IF ep_odd_footer IS SUPPLIED. + + IF me->odd_footer-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_odd_footer. + ENDIF. + + IF me->odd_footer-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'CENTER' ). + CONCATENATE ep_odd_footer lc_marker_center lv_value INTO ep_odd_footer. + ENDIF. + + IF me->odd_footer-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'RIGHT' ). + CONCATENATE ep_odd_footer lc_marker_right lv_value INTO ep_odd_footer. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- + IF ep_even_header IS SUPPLIED. + + IF me->even_header-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_even_header. + ENDIF. + + IF me->even_header-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'CENTER' ). + CONCATENATE ep_even_header lc_marker_center lv_value INTO ep_even_header. + ENDIF. + + IF me->even_header-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'RIGHT' ). + CONCATENATE ep_even_header lc_marker_right lv_value INTO ep_even_header. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- + IF ep_even_footer IS SUPPLIED. + + IF me->even_footer-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_even_footer. + ENDIF. + + IF me->even_footer-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'CENTER' ). + CONCATENATE ep_even_footer lc_marker_center lv_value INTO ep_even_footer. + ENDIF. + + IF me->even_footer-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'RIGHT' ). + CONCATENATE ep_even_footer lc_marker_right lv_value INTO ep_even_footer. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- +endmethod. + + + + + + METHOD process_header_footer. + +* ---------------------------------------------------------------------- +* Only Basic font/text formatting possible: +* Bold (yes / no), Font Type, Font Size + + DATA: lv_fname(12) TYPE c + , lv_string TYPE string + . + + FIELD-SYMBOLS: <lv_value> TYPE string + , <ls_font> TYPE zexcel_s_style_font + . + +* ---------------------------------------------------------------------- + CONCATENATE ip_side '_VALUE' INTO lv_fname. + ASSIGN COMPONENT lv_fname OF STRUCTURE ip_header TO <lv_value>. + + CONCATENATE ip_side '_FONT' INTO lv_fname. + ASSIGN COMPONENT lv_fname OF STRUCTURE ip_header TO <ls_font>. + + IF <ls_font> IS ASSIGNED AND <lv_value> IS ASSIGNED. + + IF <ls_font>-name IS NOT INITIAL. + CONCATENATE '&"' <ls_font>-name ',' INTO rv_processed_string. + ELSE. + rv_processed_string = '&"-,'. + ENDIF. + + IF <ls_font>-bold = abap_true. + CONCATENATE rv_processed_string 'Bold"' INTO rv_processed_string. + ELSE. + CONCATENATE rv_processed_string 'Standard"' INTO rv_processed_string. + ENDIF. + + IF <ls_font>-size IS NOT INITIAL. + lv_string = <ls_font>-size. + CONCATENATE rv_processed_string '&' lv_string INTO rv_processed_string. + ENDIF. + + CONCATENATE rv_processed_string <lv_value> INTO rv_processed_string. + + ENDIF. +* ---------------------------------------------------------------------- + +ENDMETHOD. + + + + + + + method SET_HEADER_FOOTER. + +* Only Basic font/text formatting possible: +* Bold (yes / no), Font Type, Font Size +* +* usefull placeholders, which can be used in header/footer value strings +* '&P' - page number +* '&N' - total number of pages +* '&D' - Date +* '&T' - Time +* '&F' - File Name +* '&Z' - Path +* '&A' - Sheet name +* new line via class constant CL_ABAP_CHAR_UTILITIES=>newline +* +* Example Value String 'page &P of &N' +* +* DO NOT USE &L , &C or &R which automatically created as position markers + + me->odd_header = ip_odd_header. + me->odd_footer = ip_odd_footer. + me->even_header = ip_even_header. + me->even_footer = ip_even_footer. + + IF me->even_header IS NOT INITIAL OR me->even_footer IS NOT INITIAL. + me->diff_oddeven_headerfooter = abap_true. + ENDIF. + + +endmethod. + + + + + + + + + method SET_PAGE_MARGINS. DATA: lv_coef TYPE f, lv_unit TYPE string. @@ -319,6 +523,5 @@ endmethod. IF ip_top IS SUPPLIED. margin_top = lv_coef * ip_top. ENDIF. endmethod. - diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 49ec761..96d2aa1 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -1,4521 +1,4586 @@ - - - - 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 class - - - - - - - - - - - - - - - - - - - - - method 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->zif_excel_book_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->zif_excel_book_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->zif_excel_book_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 - IF excel->zif_excel_book_properties~company IS NOT INITIAL. - lo_element = lo_document->create_simple_element( name = lc_xml_node_company - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~company. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - " LinksUpToDate - lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate - parent = lo_document ). - lv_value = me->flag2bool( excel->zif_excel_book_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->zif_excel_book_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->zif_excel_book_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->zif_excel_book_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, - lv_date TYPE sydatum, - lv_time TYPE syuzeit. - -********************************************************************** -* 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->zif_excel_book_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->zif_excel_book_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 ). - - CONVERT TIME STAMP excel->zif_excel_book_properties~created TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. - CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. - REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. -* lv_value = excel->zif_excel_book_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 ). - CONVERT TIME STAMP excel->zif_excel_book_properties~modified TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. - CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. - REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. -* lv_value = excel->zif_excel_book_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_zoomscale TYPE string VALUE 'zoomScale', - lc_xml_attr_zoomscalenormal TYPE string VALUE 'zoomScaleNormal', - lc_xml_attr_zoomscalepageview TYPE string VALUE 'zoomScalePageLayoutView', - lc_xml_attr_zoomscalesheetview TYPE string VALUE 'zoomScaleSheetLayoutView', - 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 ). - - lv_value = io_worksheet->zif_excel_sheet_properties~summarybelow. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow - value = lv_value ). - - lv_value = io_worksheet->zif_excel_sheet_properties~summaryright. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright - value = lv_value ). - - 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 = abap_true - OR io_worksheet->zif_excel_sheet_properties~selected 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. - " Zoom scale - IF io_worksheet->zif_excel_sheet_properties~zoomscale GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale - value = lv_value ). - IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_normal LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_normal. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalenormal - value = lv_value ). - ENDIF. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview NE 0. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalepageview - value = lv_value ). - ENDIF. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview NE 0. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalesheetview - value = lv_value ). - 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. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - 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( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - 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( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - 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. - CONDENSE lv_value. - 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 ). - CONDENSE lv_value. - lo_element_4->set_value( value = lv_value ). - ELSE. - lv_value = <ls_sheet_content>-cell_value. - CONDENSE lv_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->horizontal_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_indexedcolors TYPE string VALUE 'indexedColors', - lc_xml_node_rgbcolor TYPE string VALUE 'rgbColor', - 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, - lt_colors TYPE zexcel_t_style_color_argb, - ls_color LIKE LINE OF lt_colors. - - 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. - CONDENSE lv_value. - lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid - value = lv_value ). - lv_value = ls_numfmt-numfmt. -* REPLACE ALL OCCURRENCES OF '.' IN lv_value WITH '\.'. - 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 - IF ls_font-scheme IS NOT INITIAL. - 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 ). - ENDIF. - 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 ). - - "write legacy color palette in case any indexed color was changed - IF excel->legacy_palette->is_modified( ) = abap_true. - lo_element = lo_document->create_simple_element( name = lc_xml_node_colors - parent = lo_document ). - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_indexedcolors - parent = lo_document ). - lo_element->append_child( new_child = lo_sub_element ). - - lt_colors = excel->legacy_palette->get_colors( ). - LOOP AT lt_colors INTO ls_color. - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_rgbcolor - parent = lo_document ). - lv_value = ls_color. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb - value = lv_value ). - lo_sub_element->append_child( new_child = lo_sub_element_2 ). - ENDLOOP. - - 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_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_l. - 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. - - + + + + 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 class + + + + + + + + + + + + + + + + + + + + + method 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->zif_excel_book_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->zif_excel_book_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->zif_excel_book_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 + IF excel->zif_excel_book_properties~company IS NOT INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~company. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->zif_excel_book_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->zif_excel_book_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->zif_excel_book_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->zif_excel_book_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, + lv_date TYPE sydatum, + lv_time TYPE syuzeit. + +********************************************************************** +* 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->zif_excel_book_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->zif_excel_book_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 ). + + CONVERT TIME STAMP excel->zif_excel_book_properties~created TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. + CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. + REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. +* lv_value = excel->zif_excel_book_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 ). + CONVERT TIME STAMP excel->zif_excel_book_properties~modified TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. + CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. + REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. +* lv_value = excel->zif_excel_book_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', + lc_xml_node_headerfooter TYPE string VALUE 'headerFooter', + lc_xml_node_oddheader TYPE string VALUE 'oddHeader', + lc_xml_node_oddfooter TYPE string VALUE 'oddFooter', + lc_xml_node_evenheader TYPE string VALUE 'evenHeader', + lc_xml_node_evenfooter TYPE string VALUE 'evenFooter', + " 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_zoomscale TYPE string VALUE 'zoomScale', + lc_xml_attr_zoomscalenormal TYPE string VALUE 'zoomScaleNormal', + lc_xml_attr_zoomscalepageview TYPE string VALUE 'zoomScalePageLayoutView', + lc_xml_attr_zoomscalesheetview TYPE string VALUE 'zoomScaleSheetLayoutView', + 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', + lc_xml_attr_differentoddeven TYPE string VALUE 'differentOddEven', + " 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 ). + + lv_value = io_worksheet->zif_excel_sheet_properties~summarybelow. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow + value = lv_value ). + + lv_value = io_worksheet->zif_excel_sheet_properties~summaryright. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright + value = lv_value ). + + 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 = abap_true + OR io_worksheet->zif_excel_sheet_properties~selected 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. + " Zoom scale + IF io_worksheet->zif_excel_sheet_properties~zoomscale GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale + value = lv_value ). + IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_normal LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_normal. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalenormal + value = lv_value ). + ENDIF. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalepageview + value = lv_value ). + ENDIF. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalesheetview + value = lv_value ). + 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. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + 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( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + 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( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + 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. + CONDENSE lv_value. + 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 ). + CONDENSE lv_value. + lo_element_4->set_value( value = lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + CONDENSE lv_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->horizontal_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 + +* { headerFooter necessary? --> + IF io_worksheet->sheet_setup->odd_header IS NOT INITIAL + OR io_worksheet->sheet_setup->odd_footer IS NOT INITIAL + OR io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_headerfooter + parent = lo_document ). + + " Different header/footer for odd/even pages? + IF io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. + lo_element->set_attribute_ns( name = lc_xml_attr_differentoddeven + value = '1' ). + ENDIF. + + " OddHeader + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_odd_header = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_oddheader + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + " OddFooter + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_odd_footer = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_oddfooter + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + " evenHeader + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_even_header = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_evenheader + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + " evenFooter + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_even_footer = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_evenfooter + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + + lo_element_root->append_child( new_child = lo_element ). " headerFooter + + ENDIF. +* } <-- + +* 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_indexedcolors TYPE string VALUE 'indexedColors', + lc_xml_node_rgbcolor TYPE string VALUE 'rgbColor', + 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, + lt_colors TYPE zexcel_t_style_color_argb, + ls_color LIKE LINE OF lt_colors. + + 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. + CONDENSE lv_value. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + lv_value = ls_numfmt-numfmt. +* REPLACE ALL OCCURRENCES OF '.' IN lv_value WITH '\.'. + 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 + IF ls_font-scheme IS NOT INITIAL. + 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 ). + ENDIF. + 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 ). + + "write legacy color palette in case any indexed color was changed + IF excel->legacy_palette->is_modified( ) = abap_true. + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_indexedcolors + parent = lo_document ). + lo_element->append_child( new_child = lo_sub_element ). + + lt_colors = excel->legacy_palette->get_colors( ). + LOOP AT lt_colors INTO ls_color. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_rgbcolor + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( new_child = lo_sub_element_2 ). + ENDLOOP. + + 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_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_l. + 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. + + diff --git a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk new file mode 100644 index 0000000..761e0d7 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +