abap2xlsx/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk
2012-10-21 22:20:50 +00:00

1860 lines
82 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<CLAS CLSNAME="ZCL_EXCEL_READER_2007" VERSION="1" LANGU="E" DESCRIPT="Read Excel 2007 into ZCL_EXCEL" UUID="DFAC2E4C81CE84F1B39B000C29B7D360" CATEGORY="00" EXPOSURE="2" STATE="1" RELEASE="0" CLSCCINCL="X" FIXPT="X" UNICODE="X" CLSBCCAT="00" DURATION_TYPE="0 " RISK_LEVEL="0 ">
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_RELATIONSHIP" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="1 " TYPTYPE="4" SRCROW1="6 " SRCCOLUMN1="4 " SRCROW2="10 " SRCCOLUMN2="29 " TYPESRC_LENG="149 " TYPESRC="BEGIN OF t_relationship,
id TYPE string,
type TYPE string,
target TYPE string,
END OF t_relationship
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_FILEVERSION" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="2 " TYPTYPE="4" SRCROW1="12 " SRCCOLUMN1="4 " SRCROW2="18 " SRCCOLUMN2="26 " TYPESRC_LENG="247 " TYPESRC="BEGIN OF t_fileversion,
appname TYPE string,
lastedited TYPE string,
lowestedited TYPE string,
rupbuild TYPE string,
codename TYPE string,
END OF t_fileversion
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_SHEET" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="3 " TYPTYPE="4" SRCROW1="20 " SRCCOLUMN1="4 " SRCROW2="24 " SRCCOLUMN2="22 " TYPESRC_LENG="147 " TYPESRC="BEGIN OF t_sheet,
name TYPE string,
sheetid TYPE string,
id TYPE string,
END OF t_sheet
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_WORKBOOKPR" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="4 " TYPTYPE="4" SRCROW1="26 " SRCCOLUMN1="4 " SRCROW2="29 " SRCCOLUMN2="27 " TYPESRC_LENG="146 " TYPESRC="BEGIN OF t_workbookpr,
codename TYPE string,
defaultthemeversion TYPE string,
END OF t_workbookpr
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_SHEETPR" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="5 " TYPTYPE="4" SRCROW1="31 " SRCCOLUMN1="4 " SRCROW2="33 " SRCCOLUMN2="24 " TYPESRC_LENG="93 " TYPESRC="BEGIN OF t_sheetpr,
codename TYPE string,
END OF t_sheetpr
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_RANGE" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="6 " TYPTYPE="4" SRCROW1="35 " SRCCOLUMN1="4 " SRCROW2="38 " SRCCOLUMN2="22 " TYPESRC_LENG="139 " TYPESRC='BEGIN OF t_range,
name TYPE string,
localsheetid TYPE string, &quot; issue #163
END OF t_range
'/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_FILLS" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="7 " TYPTYPE="4" SRCROW1="40 " SRCCOLUMN1="4 " SRCROW2="40 " SRCCOLUMN2="78 " TYPESRC_LENG="76 " TYPESRC="t_fills TYPE STANDARD TABLE OF REF TO zcl_excel_style_fill WITH DEFAULT KEY
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_BORDERS" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="8 " TYPTYPE="4" SRCROW1="42 " SRCCOLUMN1="4 " SRCROW2="42 " SRCCOLUMN2="83 " TYPESRC_LENG="81 " TYPESRC="t_borders TYPE STANDARD TABLE OF REF TO zcl_excel_style_borders WITH DEFAULT KEY
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_FONTS" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="9 " TYPTYPE="4" SRCROW1="44 " SRCCOLUMN1="4 " SRCROW2="44 " SRCCOLUMN2="78 " TYPESRC_LENG="76 " TYPESRC="t_fonts TYPE STANDARD TABLE OF REF TO zcl_excel_style_font WITH DEFAULT KEY
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_STYLE_REFS" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="10 " TYPTYPE="4" SRCROW1="46 " SRCCOLUMN1="4 " SRCROW2="46 " SRCCOLUMN2="52 " TYPESRC_LENG="50 " TYPESRC="t_style_refs TYPE TABLE OF REF TO zcl_excel_style
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_NUM_FORMAT" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="11 " TYPTYPE="4" SRCROW1="48 " SRCCOLUMN1="4 " SRCROW2="51 " SRCCOLUMN2="20 " TYPESRC_LENG="119 " TYPESRC="BEGIN OF t_num_format,
id TYPE string,
format TYPE REF TO zcl_excel_style_number_format,
END OF t_num_format
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_NUM_FORMATS" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="12 " TYPTYPE="4" SRCROW1="53 " SRCCOLUMN1="4 " SRCROW2="53 " SRCCOLUMN2="69 " TYPESRC_LENG="67 " TYPESRC="t_num_formats TYPE HASHED TABLE OF t_num_format WITH UNIQUE KEY id
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_COLOR" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="13 " TYPTYPE="4" SRCROW1="55 " SRCCOLUMN1="4 " SRCROW2="60 " SRCCOLUMN2="15 " TYPESRC_LENG="126 " TYPESRC="BEGIN OF t_color,
indexed TYPE string,
rgb TYPE string,
theme TYPE string,
tint TYPE string,
END OF t_color
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_REL_DRAWING" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="14 " TYPTYPE="4" SRCROW1="62 " SRCCOLUMN1="4 " SRCROW2="66 " SRCCOLUMN2="23 " TYPESRC_LENG="127 " TYPESRC="BEGIN OF T_REL_DRAWING,
id type string,
content type xstring,
file_ext type string,
end of t_rel_drawing
"/>
<types CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="T_REL_DRAWINGS" VERSION="1" LANGU="E" EXPOSURE="1" STATE="1" EDITORDER="15 " TYPTYPE="4" SRCROW1="68 " SRCCOLUMN1="4 " SRCROW2="68 " SRCCOLUMN2="45 " TYPESRC_LENG="43 " TYPESRC="t_rel_drawings type TABLE OF t_rel_drawing
"/>
<implementing CLSNAME="ZCL_EXCEL_READER_2007" REFCLSNAME="ZIF_EXCEL_READER" VERSION="1" EXPOSURE="2" STATE="1" RELTYPE="1"/>
<publicSection>class ZCL_EXCEL_READER_2007 definition
public
create public .
public section.
*&quot;* public components of class ZCL_EXCEL_READER_2007
*&quot;* do not include other source files here!!!
type-pools IXML .
interfaces ZIF_EXCEL_READER .</publicSection>
<protectedSection>*&quot;* protected components of class ZCL_EXCEL_READER_2007
*&quot;* do not include other source files here!!!
protected section.
types:
BEGIN OF t_relationship,
id TYPE string,
type TYPE string,
target TYPE string,
END OF t_relationship .
types:
BEGIN OF t_fileversion,
appname TYPE string,
lastedited TYPE string,
lowestedited TYPE string,
rupbuild TYPE string,
codename TYPE string,
END OF t_fileversion .
types:
BEGIN OF t_sheet,
name TYPE string,
sheetid TYPE string,
id TYPE string,
END OF t_sheet .
types:
BEGIN OF t_workbookpr,
codename TYPE string,
defaultthemeversion TYPE string,
END OF t_workbookpr .
types:
BEGIN OF t_sheetpr,
codename TYPE string,
END OF t_sheetpr .
types:
BEGIN OF t_range,
name TYPE string,
localsheetid TYPE string, &quot; issue #163
END OF t_range .
types:
t_fills TYPE STANDARD TABLE OF REF TO zcl_excel_style_fill WITH DEFAULT KEY .
types:
t_borders TYPE STANDARD TABLE OF REF TO zcl_excel_style_borders WITH DEFAULT KEY .
types:
t_fonts TYPE STANDARD TABLE OF REF TO zcl_excel_style_font WITH DEFAULT KEY .
types:
t_style_refs TYPE TABLE OF REF TO zcl_excel_style .
types:
BEGIN OF t_num_format,
id TYPE string,
format TYPE REF TO zcl_excel_style_number_format,
END OF t_num_format .
types:
t_num_formats TYPE HASHED TABLE OF t_num_format WITH UNIQUE KEY id .
types:
BEGIN OF t_color,
indexed TYPE string,
rgb TYPE string,
theme TYPE string,
tint TYPE string,
END OF t_color .
types:
BEGIN OF T_REL_DRAWING,
id type string,
content type xstring,
file_ext type string,
end of t_rel_drawing .
types:
t_rel_drawings type TABLE OF t_rel_drawing .
class-methods RESOLVE_PATH
importing
!IP_PATH type STRING
returning
value(RP_RESULT) type STRING .
methods FILL_STRUCT_FROM_ATTRIBUTES
importing
!IP_ELEMENT type ref to IF_IXML_ELEMENT
changing
!CP_STRUCTURE type ANY .
methods GET_FROM_ZIP_ARCHIVE
importing
!I_FILENAME type STRING
returning
value(R_CONTENT) type XSTRING
raising
ZCX_EXCEL .
methods GET_IXML_FROM_ZIP_ARCHIVE
importing
!I_FILENAME type STRING
!IS_NORMALIZING type BOOLEAN default &apos;X&apos;
returning
value(R_IXML) type ref to IF_IXML_DOCUMENT
raising
ZCX_EXCEL .
methods LOAD_WORKBOOK
importing
!IP_PATH type STRING
!IP_EXCEL type ref to ZCL_EXCEL
raising
ZCX_EXCEL .
methods LOAD_DRAWING_ANCHOR
importing
!IO_ANCHOR_ELEMENT type ref to IF_IXML_ELEMENT
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
!IT_RELATED_DRAWINGS type T_REL_DRAWINGS .
methods LOAD_WORKSHEET
importing
!IP_PATH type STRING
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
raising
ZCX_EXCEL .
methods LOAD_WORKSHEET_DRAWING
importing
!IP_PATH type STRING
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
raising
ZCX_EXCEL .
methods LOAD_SHARED_STRINGS
importing
!IP_PATH type STRING
raising
ZCX_EXCEL .
methods LOAD_STYLES
importing
!IP_PATH type STRING
!IP_EXCEL type ref to ZCL_EXCEL
raising
ZCX_EXCEL .
methods LOAD_STYLE_BORDERS
importing
!IP_XML type ref to IF_IXML_DOCUMENT
returning
value(EP_BORDERS) type T_BORDERS .
methods LOAD_STYLE_FILLS
importing
!IP_XML type ref to IF_IXML_DOCUMENT
returning
value(EP_FILLS) type T_FILLS .
methods LOAD_STYLE_FONTS
importing
!IP_XML type ref to IF_IXML_DOCUMENT
returning
value(EP_FONTS) type T_FONTS .
methods LOAD_STYLE_NUM_FORMATS
importing
!IP_XML type ref to IF_IXML_DOCUMENT
returning
value(EP_NUM_FORMATS) type T_NUM_FORMATS .</protectedSection>
<privateSection>private section.
*&quot;* private components of class ZCL_EXCEL_READER_2007
*&quot;* do not include other source files here!!!
data EXCEL2007 type XSTRING .
data ZIP type ref to CL_ABAP_ZIP .
data SHARED_STRINGS type STRINGTAB .
data STYLES type T_STYLE_REFS .</privateSection>
<localImplementation>*&quot;* local class implementation for public class
*&quot;* use this source file for the implementation part of
*&quot;* local helper classes
TYPES: BEGIN OF t_relationship,
id TYPE string,
type TYPE string,
target TYPE string,
END OF t_relationship.</localImplementation>
<localTypes>*&quot;* use this source file for any type declarations (class
*&quot;* definitions, interfaces or data types) you need for method
*&quot;* implementation or private method&apos;s signature</localTypes>
<localMacros>*&quot;* use this source file for any macro definitions you need
*&quot;* in the implementation part of the class</localMacros>
<typeUsage CLSNAME="ZCL_EXCEL_READER_2007" TYPEGROUP="IXML" VERSION="1" TPUTYPE="0" EXPLICIT="X"/>
<forwardDeclaration>IXML</forwardDeclaration>
<attribute CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="EXCEL2007" VERSION="1" LANGU="E" DESCRIPT="Excel 2007 data" EXPOSURE="0" STATE="1" EDITORDER="1 " ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="1" TYPE="XSTRING" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " TYPESRC_LENG="0 "/>
<attribute CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="SHARED_STRINGS" VERSION="1" LANGU="E" DESCRIPT="Table with Strings" EXPOSURE="0" STATE="1" EDITORDER="3 " ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="1" TYPE="STRINGTAB" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " TYPESRC_LENG="0 "/>
<attribute CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="STYLES" VERSION="1" LANGU="E" EXPOSURE="0" STATE="1" EDITORDER="4 " ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="1" TYPE="T_STYLE_REFS" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " TYPESRC_LENG="0 "/>
<attribute CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="ZIP" VERSION="1" LANGU="E" DESCRIPT="Zip Utility" EXPOSURE="0" STATE="1" EDITORDER="2 " ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="3" TYPE="CL_ABAP_ZIP" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " TYPESRC_LENG="0 "/>
<interfaceMethod CLSNAME="ZCL_EXCEL_READER_2007" CPDNAME="ZIF_EXCEL_READER~CAN_READ_FILE">
<source>method ZIF_EXCEL_READER~CAN_READ_FILE.
* For now always Unknown
r_readable = abap_undefined.
endmethod.</source>
</interfaceMethod>
<interfaceMethod CLSNAME="ZCL_EXCEL_READER_2007" CPDNAME="ZIF_EXCEL_READER~LOAD">
<source>method ZIF_EXCEL_READER~LOAD.
CONSTANTS:
lc_core_properties TYPE string VALUE &apos;http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties&apos;,
lc_office_document TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&apos;,
lc_relationships TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships&apos;.
DATA: rels TYPE REF TO if_ixml_document,
node TYPE REF TO if_ixml_element,
relationship TYPE t_relationship.
me-&gt;excel2007 = i_excel2007.
rels = me-&gt;get_ixml_from_zip_archive( &apos;_rels/.rels&apos; ).
CREATE OBJECT r_excel.
node ?= rels-&gt;find_from_name( &apos;Relationship&apos; ).
WHILE node IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = relationship ).
CASE relationship-type.
WHEN lc_core_properties.
&quot; TODO Map Document Properties to ZCL_EXCEL
WHEN lc_office_document.
load_workbook(
ip_path = relationship-target
ip_excel = r_excel ).
WHEN OTHERS.
ENDCASE.
node ?= node-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</interfaceMethod>
<interfaceMethod CLSNAME="ZCL_EXCEL_READER_2007" CPDNAME="ZIF_EXCEL_READER~LOAD_FILE">
<source>method ZIF_EXCEL_READER~LOAD_FILE.
DATA: excel_data TYPE xstring.
DATA filelength TYPE i.
DATA bin_tab TYPE TABLE OF x255.
&quot; Background processing
DATA bin_data LIKE LINE OF bin_tab.
DATA len TYPE i.
DATA alen TYPE i.
IF sy-batch = abap_true.
DESCRIBE FIELD bin_data LENGTH len IN BYTE MODE.
OPEN DATASET i_filename FOR INPUT IN BINARY MODE.
WHILE sy-subrc = 0.
READ DATASET i_filename INTO bin_data MAXIMUM LENGTH len ACTUAL LENGTH alen.
APPEND bin_data TO bin_tab.
filelength = filelength + alen.
ENDWHILE.
CLOSE DATASET i_filename.
ELSE.
cl_gui_frontend_services=&gt;gui_upload(
EXPORTING
filename = i_filename &quot; Name of file
filetype = &apos;BIN&apos; &quot; File Type (ASCII, Binary)
IMPORTING
filelength = filelength
CHANGING
data_tab = bin_tab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19
).
IF sy-subrc &lt;&gt; 0.
RAISE EXCEPTION TYPE zcx_excel
EXPORTING
error = &apos;A problem occured when reading the file&apos;.
ENDIF.
ENDIF.
CALL FUNCTION &apos;SCMS_BINARY_TO_XSTRING&apos;
EXPORTING
input_length = filelength
IMPORTING
buffer = excel_data
TABLES
binary_tab = bin_tab.
r_excel = me-&gt;zif_excel_reader~load( excel_data ).
endmethod.</source>
</interfaceMethod>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="FILL_STRUCT_FROM_ATTRIBUTES" VERSION="1" LANGU="E" DESCRIPT="Fills structure fields based on XML node attributes" EXPOSURE="1" STATE="1" EDITORDER="2 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="FILL_STRUCT_FROM_ATTRIBUTES" SCONAME="IP_ELEMENT" VERSION="1" LANGU="E" DESCRIPT="IF_IXML_ELEMENT" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="IF_IXML_ELEMENT"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="FILL_STRUCT_FROM_ATTRIBUTES" SCONAME="CP_STRUCTURE" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="2" PARPASSTYP="1" TYPTYPE="1" TYPE="ANY"/>
<source>method FILL_STRUCT_FROM_ATTRIBUTES.
DATA: name TYPE string,
attributes TYPE REF TO if_ixml_named_node_map,
attribute TYPE REF TO if_ixml_attribute,
iterator TYPE REF TO if_ixml_node_iterator.
FIELD-SYMBOLS: &lt;component&gt; TYPE any.
CLEAR cp_structure.
attributes = ip_element-&gt;get_attributes( ).
iterator = attributes-&gt;create_iterator( ).
attribute ?= iterator-&gt;get_next( ).
WHILE attribute IS BOUND.
name = attribute-&gt;get_name( ).
TRANSLATE name TO UPPER CASE.
ASSIGN COMPONENT name OF STRUCTURE cp_structure TO &lt;component&gt;.
IF sy-subrc = 0.
&lt;component&gt; = attribute-&gt;get_value( ).
ENDIF.
attribute ?= iterator-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_FROM_ZIP_ARCHIVE" VERSION="1" LANGU="E" DESCRIPT="Read file from ZIP Archive" EXPOSURE="1" STATE="1" EDITORDER="3 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_FROM_ZIP_ARCHIVE" SCONAME="I_FILENAME" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_FROM_ZIP_ARCHIVE" SCONAME="R_CONTENT" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="XSTRING"/>
<exception CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_FROM_ZIP_ARCHIVE" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
<source>method GET_FROM_ZIP_ARCHIVE.
IF me-&gt;zip IS NOT BOUND.
CREATE OBJECT me-&gt;zip.
zip-&gt;load(
EXPORTING
zip = me-&gt;excel2007
EXCEPTIONS
zip_parse_error = 1
OTHERS = 2
).
IF sy-subrc &lt;&gt; 0.
RAISE EXCEPTION TYPE zcx_excel
EXPORTING
error = &apos;ZIP parse error&apos;.
ENDIF.
ENDIF.
zip-&gt;get(
EXPORTING
name = i_filename
IMPORTING
content = r_content &quot; Contents
EXCEPTIONS
zip_index_error = 1
zip_decompression_error = 2
OTHERS = 3
).
IF sy-subrc &lt;&gt; 0.
RAISE EXCEPTION TYPE zcx_excel
EXPORTING
error = &apos;ZIP index or decompression error&apos;.
ENDIF.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_IXML_FROM_ZIP_ARCHIVE" VERSION="1" LANGU="E" DESCRIPT="Read file from ZIP Archive" EXPOSURE="1" STATE="1" EDITORDER="4 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_IXML_FROM_ZIP_ARCHIVE" SCONAME="I_FILENAME" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_IXML_FROM_ZIP_ARCHIVE" SCONAME="IS_NORMALIZING" VERSION="1" LANGU="E" DESCRIPT="Boolean Variable (X=True, -=False, Space=Unknown)" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="BOOLEAN" PARVALUE="&apos;X&apos;"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_IXML_FROM_ZIP_ARCHIVE" SCONAME="R_IXML" VERSION="1" LANGU="E" DESCRIPT="IF_IXML_DOCUMENT" CMPTYPE="1" MTDTYPE="0" EDITORDER="3 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="3" TYPE="IF_IXML_DOCUMENT"/>
<exception CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="GET_IXML_FROM_ZIP_ARCHIVE" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
<source>method GET_IXML_FROM_ZIP_ARCHIVE.
TYPE-POOLS: ixml.
DATA: content TYPE xstring.
DATA: ixml TYPE REF TO if_ixml,
streamfactory TYPE REF TO if_ixml_stream_factory,
istream TYPE REF TO if_ixml_istream,
parser TYPE REF TO if_ixml_parser.
content = me-&gt;get_from_zip_archive( i_filename ).
ixml = cl_ixml=&gt;create( ).
streamfactory = ixml-&gt;create_stream_factory( ).
istream = streamfactory-&gt;create_istream_xstring( content ).
r_ixml = ixml-&gt;create_document( ).
parser = ixml-&gt;create_parser( stream_factory = streamfactory
istream = istream
document = r_ixml ).
* parser-&gt;set_normalizing( ).
parser-&gt;set_normalizing( is_normalizing ).
parser-&gt;set_validating( mode = if_ixml_parser=&gt;co_no_validation ).
parser-&gt;parse( ).
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_DRAWING_ANCHOR" VERSION="1" LANGU="E" DESCRIPT="Loads worksheet" EXPOSURE="1" STATE="1" EDITORDER="6 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_DRAWING_ANCHOR" SCONAME="IO_ANCHOR_ELEMENT" VERSION="1" LANGU="E" DESCRIPT="IF_IXML_ELEMENT" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="IF_IXML_ELEMENT"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_DRAWING_ANCHOR" SCONAME="IO_WORKSHEET" VERSION="1" LANGU="E" DESCRIPT="Excel creator" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL_WORKSHEET"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_DRAWING_ANCHOR" SCONAME="IT_RELATED_DRAWINGS" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="3 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="T_REL_DRAWINGS"/>
<source>method LOAD_DRAWING_ANCHOR.
TYPES: BEGIN OF t_c_nv_pr,
name TYPE string,
id TYPE string,
END OF t_c_nv_pr.
TYPES: BEGIN OF t_blip,
cstate TYPE string,
embed TYPE string,
END OF t_blip.
TYPES: BEGIN OF t_chart,
id TYPE string,
END OF t_chart.
TYPES: BEGIN OF t_ext,
cx TYPE string,
cy TYPE string,
END OF t_ext.
CONSTANTS: lc_xml_attr_true TYPE string VALUE &apos;true&apos;,
lc_xml_attr_true_int TYPE string VALUE &apos;1&apos;.
CONSTANTS: lc_rel_chart TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart&apos;,
lc_rel_image TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/image&apos;.
DATA: lo_drawing TYPE REF TO zcl_excel_drawing,
node TYPE REF TO if_ixml_element,
node2 TYPE REF TO if_ixml_element,
node3 TYPE REF TO if_ixml_element,
node4 TYPE REF TO if_ixml_element,
ls_upper TYPE zexcel_drawing_location,
ls_lower TYPE zexcel_drawing_location,
ls_size TYPE zexcel_drawing_size,
ext TYPE t_ext,
lv_content TYPE xstring,
lv_relation_id TYPE string,
lv_title TYPE zexcel_sheet_title,
cnvpr TYPE t_c_nv_pr,
blip TYPE t_blip,
chart TYPE t_chart,
drawing_type TYPE zexcel_drawing_type,
rel_drawing TYPE t_rel_drawing.
node ?= io_anchor_element-&gt;find_from_name( name = &apos;from&apos; namespace = &apos;xdr&apos; ).
CHECK node IS NOT INITIAL.
node2 ?= node-&gt;find_from_name( name = &apos;col&apos; namespace = &apos;xdr&apos; ).
ls_upper-col = node2-&gt;get_value( ).
node2 ?= node-&gt;find_from_name( name = &apos;row&apos; namespace = &apos;xdr&apos; ).
ls_upper-row = node2-&gt;get_value( ).
node2 ?= node-&gt;find_from_name( name = &apos;colOff&apos; namespace = &apos;xdr&apos; ).
ls_upper-col_offset = node2-&gt;get_value( ).
node2 ?= node-&gt;find_from_name( name = &apos;rowOff&apos; namespace = &apos;xdr&apos; ).
ls_upper-row_offset = node2-&gt;get_value( ).
node ?= io_anchor_element-&gt;find_from_name( name = &apos;ext&apos; namespace = &apos;xdr&apos; ).
IF node IS INITIAL.
CLEAR ls_size.
ELSE.
me-&gt;fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = ext ).
ls_size-width = ext-cx.
ls_size-height = ext-cy.
ENDIF.
node ?= io_anchor_element-&gt;find_from_name( name = &apos;to&apos; namespace = &apos;xdr&apos; ).
IF node IS INITIAL.
CLEAR ls_lower.
ELSE.
node2 ?= node-&gt;find_from_name( name = &apos;col&apos; namespace = &apos;xdr&apos; ).
ls_lower-col = node2-&gt;get_value( ).
node2 ?= node-&gt;find_from_name( name = &apos;row&apos; namespace = &apos;xdr&apos; ).
ls_lower-row = node2-&gt;get_value( ).
node2 ?= node-&gt;find_from_name( name = &apos;colOff&apos; namespace = &apos;xdr&apos; ).
ls_lower-col_offset = node2-&gt;get_value( ).
node2 ?= node-&gt;find_from_name( name = &apos;rowOff&apos; namespace = &apos;xdr&apos; ).
ls_lower-row_offset = node2-&gt;get_value( ).
ENDIF.
node ?= io_anchor_element-&gt;find_from_name( name = &apos;pic&apos; namespace = &apos;xdr&apos; ).
IF node IS NOT INITIAL.
node2 ?= node-&gt;find_from_name( name = &apos;nvPicPr&apos; namespace = &apos;xdr&apos; ).
CHECK node2 IS NOT INITIAL.
node3 ?= node2-&gt;find_from_name( name = &apos;cNvPr&apos; namespace = &apos;xdr&apos; ).
CHECK node3 IS NOT INITIAL.
me-&gt;fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = cnvpr ).
lv_title = cnvpr-name.
node2 ?= node-&gt;find_from_name( name = &apos;blipFill&apos; namespace = &apos;xdr&apos; ).
CHECK node2 IS NOT INITIAL.
node3 ?= node2-&gt;find_from_name( name = &apos;blip&apos; namespace = &apos;a&apos; ).
CHECK node3 IS NOT INITIAL.
me-&gt;fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = blip ).
lv_relation_id = blip-embed.
drawing_type = zcl_excel_drawing=&gt;type_image.
ENDIF.
node ?= io_anchor_element-&gt;find_from_name( name = &apos;graphicFrame&apos; namespace = &apos;xdr&apos; ).
IF node IS NOT INITIAL.
node2 ?= node-&gt;find_from_name( name = &apos;nvGraphicFramePr&apos; namespace = &apos;xdr&apos; ).
CHECK node2 IS NOT INITIAL.
node3 ?= node2-&gt;find_from_name( name = &apos;cNvPr&apos; namespace = &apos;xdr&apos; ).
CHECK node3 IS NOT INITIAL.
me-&gt;fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = cnvpr ).
lv_title = cnvpr-name.
node2 ?= node-&gt;find_from_name( name = &apos;graphic&apos; namespace = &apos;a&apos; ).
CHECK node2 IS NOT INITIAL.
node3 ?= node2-&gt;find_from_name( name = &apos;graphicData&apos; namespace = &apos;a&apos; ).
CHECK node3 IS NOT INITIAL.
node4 ?= node2-&gt;find_from_name( name = &apos;chart&apos; namespace = &apos;c&apos; ).
CHECK node4 IS NOT INITIAL.
me-&gt;fill_struct_from_attributes( EXPORTING ip_element = node4 CHANGING cp_structure = chart ).
lv_relation_id = chart-id.
drawing_type = zcl_excel_drawing=&gt;type_chart.
ENDIF.
lo_drawing = io_worksheet-&gt;excel-&gt;add_new_drawing(
ip_type = drawing_type
ip_title = lv_title ).
io_worksheet-&gt;add_drawing( lo_drawing ).
lo_drawing-&gt;set_position2(
EXPORTING
ip_from = ls_upper
ip_to = ls_lower ).
READ TABLE it_related_drawings INTO rel_drawing
WITH KEY id = lv_relation_id.
lo_drawing-&gt;set_media(
EXPORTING
ip_media = rel_drawing-content
ip_media_type = rel_drawing-file_ext
ip_width = ls_size-width
ip_height = ls_size-height ).
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_SHARED_STRINGS" VERSION="1" LANGU="E" DESCRIPT="Loads shared strings table" EXPOSURE="1" STATE="1" EDITORDER="9 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_SHARED_STRINGS" SCONAME="IP_PATH" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<exception CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_SHARED_STRINGS" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
<source>method LOAD_SHARED_STRINGS.
DATA: value TYPE string,
value2 TYPE string,
shared_strings_xml TYPE REF TO if_ixml_document,
tag_name TYPE string,
node TYPE REF TO if_ixml_element,
node2 TYPE REF TO if_ixml_element,
node3 TYPE REF TO if_ixml_element.
*** Basic structure of Shared strings
*** Some lines insignificant for us to read
*** &lt;si&gt;(Stringinfo)&lt;/si&gt;
*** So far I have seen 2 versions how (Stringinfo) can be displayed
*** a) &quot;simple&quot; strings: &lt;t&gt;string&lt;/t&gt;
*** b) rich text string: (&lt;r&gt;richtextstring&lt;/r&gt;)+ &quot; String split up into parts that are of equal formatting
*** richtextstring: can be
*** b1) &lt;t xml:space=&quot;preserve&quot;&gt;string&lt;/t&gt;
*** or b2) &lt;rPr&gt;someformattinginfo&lt;/rPr&gt;&lt;t xml:space=&quot;preserve&quot;&gt;string&lt;/t&gt;
shared_strings_xml = me-&gt;get_ixml_from_zip_archive( i_filename = ip_path
is_normalizing = space ). &quot; NO!!! normalizing - otherwise leading blanks will be omitted and that is not really desired for the stringtable
node ?= shared_strings_xml-&gt;find_from_name( &apos;si&apos; ).
WHILE node IS BOUND.
node2 ?= node-&gt;get_first_child( ).
tag_name = node2-&gt;get_name( ).
IF tag_name = &apos;t&apos;. &quot; a - &quot;simple&quot; string
value = node2-&gt;get_value( ).
APPEND value TO shared_strings.
ELSEIF tag_name = &apos;r&apos;. &quot; b - rich text string
&quot; TODO parse rich text
* Still no support for rich text strings - but at least we should try to extract the stringinfo from this passage
* and !!! APPEND it to shared strings - otherwise the stringtable might get jumbled
CLEAR value.
WHILE node2 IS BOUND. &quot; Walk through b)
node3 ?= node2-&gt;get_first_child( ).
WHILE node3 IS BOUND.
tag_name = node3-&gt;get_name( ).
IF tag_name = &apos;t&apos;. &quot; this is sufficient to get hold of b1 and b2
value2 = node3-&gt;get_value( ).
CONCATENATE value value2 INTO value RESPECTING BLANKS. &quot; Build resulting string from all partial (formatted) strings
ENDIF.
node3 ?= node3-&gt;get_next( ).
ENDWHILE.
node2 ?= node2-&gt;get_next( ).
ENDWHILE.
APPEND value TO shared_strings.
ENDIF.
node ?= node-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLES" VERSION="1" LANGU="E" DESCRIPT="Loads styles" EXPOSURE="1" STATE="1" EDITORDER="10 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLES" SCONAME="IP_PATH" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLES" SCONAME="IP_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Excel creator" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL"/>
<exception CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLES" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
<source>method LOAD_STYLES.
TYPES: BEGIN OF t_xf,
applyalignment TYPE string,
applyborder TYPE string,
applyfill TYPE string,
applyfont TYPE string,
applynumberformat TYPE string,
applyprotection TYPE string,
borderid TYPE string,
fillid TYPE string,
fontid TYPE string,
numfmtid TYPE string,
pivotbutton TYPE string,
quoteprefix TYPE string,
xfid TYPE string,
END OF t_xf.
TYPES: BEGIN OF t_alignment,
horizontal TYPE string,
indent TYPE string,
justifylastline TYPE string,
readingorder TYPE string,
relativeindent TYPE string,
shrinktofit TYPE string,
textrotation TYPE string,
vertical TYPE string,
wraptext TYPE string,
END OF t_alignment.
TYPES: BEGIN OF t_protection,
hidden TYPE string,
locked TYPE string,
END OF t_protection.
DATA: styles_xml TYPE REF TO if_ixml_document,
iterator TYPE REF TO if_ixml_node_iterator,
nodes TYPE REF TO if_ixml_node_collection,
node TYPE REF TO if_ixml_element,
node2 TYPE REF TO if_ixml_element,
fills TYPE t_fills,
fill TYPE REF TO zcl_excel_style_fill,
num_formats TYPE t_num_formats,
num_format TYPE t_num_format,
cell_border TYPE REF TO zcl_excel_style_borders,
borders TYPE t_borders,
fonts TYPE t_fonts,
font TYPE REF TO zcl_excel_style_font,
style TYPE REF TO zcl_excel_style,
xf TYPE t_xf,
alignment TYPE t_alignment,
protection TYPE t_protection,
index TYPE i.
styles_xml = me-&gt;get_ixml_from_zip_archive( ip_path ).
num_formats = load_style_num_formats( styles_xml ).
fills = load_style_fills( styles_xml ).
borders = load_style_borders( styles_xml ).
fonts = load_style_fonts( styles_xml ).
&quot;we have all the components of style, now build the style objects
node = styles_xml-&gt;find_from_name( name = &apos;cellXfs&apos; ).
IF node IS BOUND.
nodes = node-&gt;get_elements_by_tag_name( name = &apos;xf&apos; ).
iterator = nodes-&gt;create_iterator( ).
node ?= iterator-&gt;get_next( ).
WHILE node IS BOUND.
style = ip_excel-&gt;add_new_style( ).
fill_struct_from_attributes(
EXPORTING
ip_element = node
CHANGING
cp_structure = xf ).
IF xf-applyfill = &apos;1&apos; AND xf-fillid IS NOT INITIAL.
index = xf-fillid + 1.
READ TABLE fills INTO fill INDEX index.
IF sy-subrc = 0.
style-&gt;fill = fill.
ENDIF.
ENDIF.
IF xf-numfmtid IS NOT INITIAL.
READ TABLE num_formats INTO num_format WITH TABLE KEY id = xf-numfmtid.
IF sy-subrc = 0.
style-&gt;number_format = num_format-format.
ENDIF.
ENDIF.
IF xf-applyborder = &apos;1&apos; AND xf-borderid IS NOT INITIAL.
index = xf-borderid + 1.
READ TABLE borders INTO cell_border INDEX index.
IF sy-subrc = 0.
style-&gt;borders = cell_border.
ENDIF.
ENDIF.
IF xf-applyfont = &apos;1&apos; AND xf-fontid IS NOT INITIAL.
index = xf-fontid + 1.
READ TABLE fonts INTO font INDEX index.
IF sy-subrc = 0.
style-&gt;font = font.
ENDIF.
ENDIF.
node2 ?= node-&gt;find_from_name( &apos;alignment&apos; ).
IF node2 IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node2
CHANGING
cp_structure = alignment ).
IF alignment-horizontal IS NOT INITIAL.
style-&gt;alignment-&gt;horizontal = alignment-horizontal.
ENDIF.
IF alignment-vertical IS NOT INITIAL.
style-&gt;alignment-&gt;vertical = alignment-vertical.
ENDIF.
IF alignment-textrotation IS NOT INITIAL.
style-&gt;alignment-&gt;textrotation = alignment-textrotation.
ENDIF.
IF alignment-wraptext = &apos;1&apos; OR alignment-wraptext = &apos;true&apos;.
style-&gt;alignment-&gt;wraptext = abap_true.
ENDIF.
IF alignment-shrinktofit = &apos;1&apos; OR alignment-shrinktofit = &apos;true&apos;.
style-&gt;alignment-&gt;shrinktofit = abap_true.
ENDIF.
IF alignment-indent IS NOT INITIAL.
style-&gt;alignment-&gt;indent = alignment-indent.
ENDIF.
ENDIF.
node2 ?= node-&gt;find_from_name( &apos;protection&apos; ).
IF node2 IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node2
CHANGING
cp_structure = protection ).
IF protection-locked = &apos;1&apos; OR protection-locked = &apos;true&apos;.
style-&gt;protection-&gt;locked = zcl_excel_style_protection=&gt;c_protection_locked.
ELSE.
style-&gt;protection-&gt;locked = zcl_excel_style_protection=&gt;c_protection_unlocked.
ENDIF.
IF protection-hidden = &apos;1&apos; OR protection-hidden = &apos;true&apos;.
style-&gt;protection-&gt;hidden = zcl_excel_style_protection=&gt;c_protection_hidden.
ELSE.
style-&gt;protection-&gt;hidden = zcl_excel_style_protection=&gt;c_protection_unhidden.
ENDIF.
ENDIF.
INSERT style INTO TABLE styles.
node ?= iterator-&gt;get_next( ).
ENDWHILE.
ENDIF.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_BORDERS" VERSION="1" LANGU="E" DESCRIPT="Loads &apos;borders&apos; part of styles" EXPOSURE="1" STATE="1" EDITORDER="11 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_BORDERS" SCONAME="IP_XML" VERSION="1" LANGU="E" DESCRIPT="IF_IXML_DOCUMENT" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="IF_IXML_DOCUMENT"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_BORDERS" SCONAME="EP_BORDERS" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="T_BORDERS"/>
<source>method LOAD_STYLE_BORDERS.
DATA: node TYPE REF TO if_ixml_element,
node2 TYPE REF TO if_ixml_element,
node3 TYPE REF TO if_ixml_element,
cell_border TYPE REF TO zcl_excel_style_borders,
border TYPE REF TO zcl_excel_style_border,
color TYPE t_color.
node ?= ip_xml-&gt;find_from_name( &apos;border&apos; ).
WHILE node IS BOUND.
CREATE OBJECT cell_border.
IF node-&gt;get_attribute( &apos;diagonalDown&apos; ) IS NOT INITIAL.
cell_border-&gt;diagonal_mode = zcl_excel_style_borders=&gt;c_diagonal_down.
ENDIF.
IF node-&gt;get_attribute( &apos;diagonalUp&apos; ) IS NOT INITIAL.
IF cell_border-&gt;diagonal_mode = zcl_excel_style_borders=&gt;c_diagonal_down.
cell_border-&gt;diagonal_mode = zcl_excel_style_borders=&gt;c_diagonal_both.
ELSE.
cell_border-&gt;diagonal_mode = zcl_excel_style_borders=&gt;c_diagonal_up.
ENDIF.
ENDIF.
node2 ?= node-&gt;get_first_child( ).
WHILE node2 IS BOUND.
CREATE OBJECT border.
CASE node2-&gt;get_name( ).
WHEN &apos;left&apos;.
cell_border-&gt;left = border.
WHEN &apos;right&apos;.
cell_border-&gt;right = border.
WHEN &apos;top&apos;.
cell_border-&gt;top = border.
WHEN &apos;bottom&apos;.
cell_border-&gt;down = border.
WHEN &apos;diagonal&apos;.
cell_border-&gt;diagonal = border.
ENDCASE.
border-&gt;border_style = node2-&gt;get_attribute( &apos;style&apos; ).
node3 ?= node2-&gt;find_from_name( &apos;color&apos; ).
IF node3 IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node3
CHANGING
cp_structure = color ).
border-&gt;border_color-rgb = color-rgb.
IF color-indexed IS NOT INITIAL.
border-&gt;border_color-indexed = color-indexed.
ENDIF.
IF color-theme IS NOT INITIAL.
border-&gt;border_color-theme = color-theme.
ENDIF.
border-&gt;border_color-tint = color-tint.
ENDIF.
node2 ?= node2-&gt;get_next( ).
ENDWHILE.
INSERT cell_border INTO TABLE ep_borders.
node ?= node-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_FILLS" VERSION="1" LANGU="E" DESCRIPT="Loads &apos;fills&apos; part of styles" EXPOSURE="1" STATE="1" EDITORDER="12 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_FILLS" SCONAME="IP_XML" VERSION="1" LANGU="E" DESCRIPT="IF_IXML_DOCUMENT" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="IF_IXML_DOCUMENT"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_FILLS" SCONAME="EP_FILLS" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="T_FILLS"/>
<source>method LOAD_STYLE_FILLS.
DATA: value TYPE string,
node TYPE REF TO if_ixml_element,
node2 TYPE REF TO if_ixml_element,
node3 TYPE REF TO if_ixml_element,
fill TYPE REF TO zcl_excel_style_fill,
color TYPE t_color.
node ?= ip_xml-&gt;find_from_name( &apos;fill&apos; ).
WHILE node IS BOUND.
CREATE OBJECT fill.
node2 ?= node-&gt;get_first_child( ).
value = node2-&gt;get_name( ).
CASE value.
WHEN &apos;patternFill&apos;.
fill-&gt;filltype = node2-&gt;get_attribute( &apos;patternType&apos; ).
node3 = node2-&gt;find_from_name( &apos;bgColor&apos; ).
IF node3 IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node3
CHANGING
cp_structure = color ).
fill-&gt;bgcolor-rgb = color-rgb.
IF color-indexed IS NOT INITIAL.
fill-&gt;bgcolor-indexed = color-indexed.
ENDIF.
IF color-theme IS NOT INITIAL.
fill-&gt;bgcolor-theme = color-theme.
ENDIF.
fill-&gt;bgcolor-tint = color-tint.
ENDIF.
node3 = node-&gt;find_from_name( &apos;fgColor&apos; ).
IF node3 IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node3
CHANGING
cp_structure = color ).
fill-&gt;fgcolor-rgb = color-rgb.
IF color-indexed IS NOT INITIAL.
fill-&gt;fgcolor-indexed = color-indexed.
ENDIF.
IF color-theme IS NOT INITIAL.
fill-&gt;fgcolor-theme = color-theme.
ENDIF.
fill-&gt;fgcolor-tint = color-tint.
ENDIF.
WHEN &apos;gradientFill&apos;.
&quot;TODO
WHEN OTHERS.
ENDCASE.
INSERT fill INTO TABLE ep_fills.
node ?= node-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_FONTS" VERSION="1" LANGU="E" DESCRIPT="Loads &apos;fonts&apos; part of styles" EXPOSURE="1" STATE="1" EDITORDER="13 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_FONTS" SCONAME="IP_XML" VERSION="1" LANGU="E" DESCRIPT="IF_IXML_DOCUMENT" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="IF_IXML_DOCUMENT"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_FONTS" SCONAME="EP_FONTS" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="T_FONTS"/>
<source>method LOAD_STYLE_FONTS.
DATA: value TYPE string,
node TYPE REF TO if_ixml_element,
node2 TYPE REF TO if_ixml_element,
node3 TYPE REF TO if_ixml_element,
font TYPE REF TO zcl_excel_style_font,
color TYPE t_color.
node ?= ip_xml-&gt;find_from_name( &apos;font&apos; ).
WHILE node IS BOUND.
CREATE OBJECT font.
IF node-&gt;find_from_name( &apos;b&apos; ) IS BOUND.
font-&gt;bold = abap_true.
ENDIF.
IF node-&gt;find_from_name( &apos;i&apos; ) IS BOUND.
font-&gt;italic = abap_true.
ENDIF.
node2 = node-&gt;find_from_name( &apos;u&apos; ).
IF node2 IS BOUND.
font-&gt;underline = abap_true.
font-&gt;underline_mode = node2-&gt;get_attribute( &apos;val&apos; ).
ENDIF.
IF node-&gt;find_from_name( &apos;strike&apos; ) IS BOUND.
font-&gt;strikethrough = abap_true.
ENDIF.
node2 = node-&gt;find_from_name( &apos;sz&apos; ).
IF node2 IS BOUND.
font-&gt;size = node2-&gt;get_attribute( &apos;val&apos; ).
ENDIF.
node2 = node-&gt;find_from_name( &apos;name&apos; ).
IF node2 IS BOUND.
font-&gt;name = node2-&gt;get_attribute( &apos;val&apos; ).
ENDIF.
node2 = node-&gt;find_from_name( &apos;family&apos; ).
IF node2 IS BOUND.
font-&gt;family = node2-&gt;get_attribute( &apos;val&apos; ).
ENDIF.
node2 = node-&gt;find_from_name( &apos;scheme&apos; ).
IF node2 IS BOUND.
font-&gt;scheme = node2-&gt;get_attribute( &apos;val&apos; ).
ENDIF.
node2 = node-&gt;find_from_name( &apos;color&apos; ).
IF node2 IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node2
CHANGING
cp_structure = color ).
font-&gt;color-rgb = color-rgb.
IF color-indexed IS NOT INITIAL.
font-&gt;color-indexed = color-indexed.
ENDIF.
IF color-theme IS NOT INITIAL.
font-&gt;color-theme = color-theme.
ENDIF.
font-&gt;color-tint = color-tint.
ENDIF.
INSERT font INTO TABLE ep_fonts.
node ?= node-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_NUM_FORMATS" VERSION="1" LANGU="E" DESCRIPT="Loads &apos;number format&apos; part of styles" EXPOSURE="1" STATE="1" EDITORDER="14 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_NUM_FORMATS" SCONAME="IP_XML" VERSION="1" LANGU="E" DESCRIPT="IF_IXML_DOCUMENT" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="IF_IXML_DOCUMENT"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_STYLE_NUM_FORMATS" SCONAME="EP_NUM_FORMATS" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="T_NUM_FORMATS"/>
<source>method LOAD_STYLE_NUM_FORMATS.
DATA: node TYPE REF TO if_ixml_element,
num_format TYPE t_num_format.
node ?= ip_xml-&gt;find_from_name( &apos;numFmt&apos; ).
WHILE node IS BOUND.
CLEAR num_format.
CREATE OBJECT num_format-format.
num_format-format-&gt;format_code = node-&gt;get_attribute( &apos;formatCode&apos; ).
num_format-id = node-&gt;get_attribute( &apos;numFmtId&apos; ).
INSERT num_format INTO TABLE ep_num_formats.
node ?= node-&gt;get_next( ).
ENDWHILE.
DEFINE predefined_format.
num_format-id = &amp;1.
create object num_format-format.
num_format-format-&gt;format_code = &amp;2.
insert num_format into table ep_num_formats.
END-OF-DEFINITION.
predefined_format &apos;1&apos; &apos;0&apos;.
predefined_format &apos;2&apos; &apos;0.00&apos;.
predefined_format &apos;3&apos; &apos;#,##0&apos;.
predefined_format &apos;4&apos; &apos;#,##0.00&apos;.
predefined_format &apos;5&apos; &apos;$#,##0_);($#,##0)&apos;.
predefined_format &apos;6&apos; &apos;$#,##0_);[Red]($#,##0)&apos;.
predefined_format &apos;7&apos; &apos;$#,##0.00_);($#,##0.00)&apos;.
predefined_format &apos;8&apos; &apos;$#,##0.00_);[Red]($#,##0.00)&apos;.
predefined_format &apos;9&apos; &apos;0%&apos;.
predefined_format &apos;10&apos; &apos;0.00%&apos;.
predefined_format &apos;11&apos; &apos;0.00E+00&apos;.
predefined_format &apos;12&apos; &apos;# ?/?&apos;.
predefined_format &apos;13&apos; &apos;# ??/??&apos;.
predefined_format &apos;14&apos; &apos;m/d/yyyy&apos;.
predefined_format &apos;15&apos; &apos;d-mmm-yy&apos;.
predefined_format &apos;16&apos; &apos;d-mmm&apos;.
predefined_format &apos;17&apos; &apos;mmm-yy&apos;.
predefined_format &apos;18&apos; &apos;h:mm AM/PM&apos;.
predefined_format &apos;19&apos; &apos;h:mm:ss AM/PM&apos;.
predefined_format &apos;20&apos; &apos;h:mm&apos;.
predefined_format &apos;21&apos; &apos;h:mm:ss&apos;.
predefined_format &apos;22&apos; &apos;m/d/yyyy h:mm&apos;.
predefined_format &apos;37&apos; &apos;#,##0_);(#,##0)&apos;.
predefined_format &apos;38&apos; &apos;#,##0_);[Red](#,##0)&apos;.
predefined_format &apos;39&apos; &apos;#,##0.00_);(#,##0.00)&apos;.
predefined_format &apos;40&apos; &apos;#,##0.00_);[Red](#,##0.00)&apos;.
predefined_format &apos;45&apos; &apos;mm:ss&apos;.
predefined_format &apos;46&apos; &apos;[h]:mm:ss&apos;.
predefined_format &apos;47&apos; &apos;mm:ss.0&apos;.
predefined_format &apos;48&apos; &apos;##0.0E+0&apos;.
predefined_format &apos;49&apos; &apos;@&apos;.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKBOOK" VERSION="1" LANGU="E" DESCRIPT="Loads workbook" EXPOSURE="1" STATE="1" EDITORDER="5 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKBOOK" SCONAME="IP_PATH" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKBOOK" SCONAME="IP_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Excel creator" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL"/>
<exception CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKBOOK" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
<source>method LOAD_WORKBOOK.
CONSTANTS: lc_shared_strings TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings&apos;,
lc_worksheet TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet&apos;,
lc_styles TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles&apos;.
DATA: rels TYPE REF TO if_ixml_document,
rels_workbook_path TYPE string,
rels_workbook TYPE REF TO if_ixml_document,
path TYPE string,
worksheets TYPE TABLE OF t_relationship,
workbook TYPE REF TO if_ixml_document,
workbook_index TYPE i,
worksheet_path TYPE string,
sheet TYPE t_sheet,
node TYPE REF TO if_ixml_element,
stripped_name TYPE chkfile,
dirname TYPE string,
relationship TYPE t_relationship,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_range TYPE REF TO zcl_excel_range,
worksheet_title TYPE zexcel_sheet_title,
range TYPE t_range,
range_value TYPE zexcel_range_value.
FIELD-SYMBOLS: &lt;worksheet&gt; TYPE t_relationship.
CALL FUNCTION &apos;TRINT_SPLIT_FILE_AND_PATH&apos;
EXPORTING
full_name = ip_path
IMPORTING
stripped_name = stripped_name
file_path = dirname.
&quot; Read Workbook Relationships
CONCATENATE dirname &apos;_rels/&apos; stripped_name &apos;.rels&apos;
INTO rels_workbook_path.
rels_workbook = me-&gt;get_ixml_from_zip_archive( rels_workbook_path ).
node ?= rels_workbook-&gt;find_from_name( &apos;Relationship&apos; ).
WHILE node IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = relationship ).
CASE relationship-type.
WHEN lc_shared_strings.
&quot; Read Shared Strings
CONCATENATE dirname relationship-target INTO path.
load_shared_strings( path ).
WHEN lc_worksheet.
&quot; Read worksheets
APPEND relationship TO worksheets.
WHEN lc_styles.
CONCATENATE dirname relationship-target INTO path.
load_styles(
ip_path = path
ip_excel = ip_excel ).
WHEN OTHERS.
ENDCASE.
node ?= node-&gt;get_next( ).
ENDWHILE.
&quot; Read Workbook
workbook = me-&gt;get_ixml_from_zip_archive( ip_path ).
node ?= workbook-&gt;find_from_name( &apos;sheet&apos; ).
workbook_index = 1.
WHILE node IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node
CHANGING
cp_structure = sheet ).
worksheet_title = sheet-name.
IF workbook_index &gt; 1.
lo_worksheet = ip_excel-&gt;add_new_worksheet( worksheet_title ).
ELSE.
lo_worksheet = ip_excel-&gt;get_active_worksheet( ).
lo_worksheet-&gt;set_title( worksheet_title ).
ENDIF.
READ TABLE worksheets ASSIGNING &lt;worksheet&gt;
WITH KEY id = sheet-id.
&quot; WRITE: / worksheet_id, worksheet_title, &lt;worksheet&gt;-target.
CONCATENATE dirname &lt;worksheet&gt;-target INTO worksheet_path.
load_worksheet(
ip_path = worksheet_path
io_worksheet = lo_worksheet ).
node ?= node-&gt;get_next( ).
ADD 1 TO workbook_index.
ENDWHILE.
&quot;Can I reuse the workbook variable?
&quot;workbook = me-&gt;get_ixml_from_zip_archive( ip_path ).
node ?= workbook-&gt;find_from_name( &apos;definedName&apos; ).
WHILE node IS BOUND.
fill_struct_from_attributes(
EXPORTING
ip_element = node
CHANGING
cp_structure = range
).
range_value = node-&gt;get_value( ).
lo_range = ip_excel-&gt;add_new_range( ).
lo_range-&gt;name = range-name.
lo_range-&gt;sheetid = range-localsheetid. &quot; issue #163
lo_range-&gt;set_range_value( range_value ).
node ?= node-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET" VERSION="1" LANGU="E" DESCRIPT="Loads worksheet" EXPOSURE="1" STATE="1" EDITORDER="7 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET" SCONAME="IP_PATH" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET" SCONAME="IO_WORKSHEET" VERSION="1" LANGU="E" DESCRIPT="Excel creator" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL_WORKSHEET"/>
<exception CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
<source>method LOAD_WORKSHEET.
TYPES: BEGIN OF t_cell,
r TYPE string,
t TYPE string,
s TYPE string,
END OF t_cell.
TYPES: BEGIN OF t_column,
min TYPE string,
max TYPE string,
width TYPE float,
customwidth TYPE string,
style TYPE string,
bestfit TYPE string,
collapsed TYPE string,
hidden TYPE string,
outlinelevel TYPE string,
END OF t_column.
TYPES: BEGIN OF t_sheetview,
showgridlines TYPE zexcel_show_gridlines,
tabselected TYPE string,
zoomscalenormal TYPE string,
workbookviewid TYPE string,
showrowcolheaders TYPE string,
END OF t_sheetview.
TYPES: BEGIN OF t_mergecell,
ref TYPE string,
END OF t_mergecell.
TYPES: BEGIN OF t_row,
r TYPE string,
customheight TYPE string,
ht TYPE float,
spans TYPE string,
thickbot TYPE string,
customformat TYPE string,
thicktop TYPE string,
collapsed TYPE string,
hidden TYPE string,
outlinelevel TYPE string,
END OF t_row.
TYPES: BEGIN OF t_page_setup,
id TYPE string,
orientation TYPE string,
scale TYPE string,
END OF t_page_setup.
TYPES: BEGIN OF t_page_margins,
footer TYPE string,
header TYPE string,
bottom TYPE string,
top TYPE string,
right TYPE string,
left TYPE string,
END OF t_page_margins.
TYPES: BEGIN OF t_sheetformatpr,
customheight TYPE string,
defaultrowheight TYPE string,
customwidth TYPE string,
defaultcolwidth TYPE string,
END OF t_sheetformatpr.
TYPES: BEGIN OF t_headerfooter,
alignwithmargins TYPE string,
differentoddeven TYPE string,
END OF t_headerfooter.
CONSTANTS: lc_xml_attr_true TYPE string VALUE &apos;true&apos;,
lc_xml_attr_true_int TYPE string VALUE &apos;1&apos;.
CONSTANTS: lc_rel_drawing TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing&apos;,
lc_rel_printer TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings&apos;.
DATA: worksheet TYPE REF TO if_ixml_document,
cells TYPE REF TO if_ixml_node_collection,
iterator TYPE REF TO if_ixml_node_iterator,
iterator2 TYPE REF TO if_ixml_node_iterator,
row_elem TYPE REF TO if_ixml_element,
cell_elem TYPE REF TO if_ixml_element,
cell TYPE t_cell,
index TYPE i,
value_elem TYPE REF TO if_ixml_element,
formula_elem TYPE REF TO if_ixml_element,
cell_value TYPE zexcel_cell_value,
cell_formula TYPE zexcel_cell_formula,
cell_column TYPE zexcel_cell_column_alpha,
cell_row TYPE zexcel_cell_row,
style TYPE REF TO zcl_excel_style,
style_guid TYPE zexcel_cell_style,
sheetview_elem TYPE REF TO if_ixml_element,
sheetview TYPE t_sheetview,
pane_elem TYPE REF TO if_ixml_element,
pane TYPE zexcel_pane,
pane_cell_row_a TYPE string,
pane_cell_row TYPE zexcel_cell_row,
pane_cell_col_a TYPE zexcel_cell_column_alpha,
pane_cell_col TYPE zexcel_cell_column,
mergecells TYPE REF TO if_ixml_node_collection,
mergecell_elem TYPE REF TO if_ixml_element,
mergecell TYPE t_mergecell,
merge_column_start TYPE zexcel_cell_column_alpha,
merge_column_end TYPE zexcel_cell_column_alpha,
merge_row_start TYPE zexcel_cell_row,
merge_row_end TYPE zexcel_cell_row,
sheetformatpr_elem TYPE REF TO if_ixml_element,
sheetformatpr TYPE t_sheetformatpr,
height TYPE float,
width TYPE float,
headerfooter_elem TYPE REF TO if_ixml_element,
headerfooter TYPE t_headerfooter,
odd_header TYPE zexcel_s_worksheet_head_foot,
odd_footer TYPE zexcel_s_worksheet_head_foot,
even_header TYPE zexcel_s_worksheet_head_foot,
even_footer TYPE zexcel_s_worksheet_head_foot,
hf_value_elem TYPE REF TO if_ixml_element,
pagemargins_elem TYPE REF TO if_ixml_element,
pagemargins TYPE t_page_margins,
pagesetup_elem TYPE REF TO if_ixml_element,
pagesetup TYPE t_page_setup,
columns TYPE REF TO if_ixml_node_collection,
column_elem TYPE REF TO if_ixml_element,
column TYPE t_column,
column_alpha TYPE zexcel_cell_column_alpha,
column_dimension TYPE REF TO zcl_excel_worksheet_columndime,
outline_level TYPE int4,
rows TYPE REF TO if_ixml_node_collection,
row TYPE t_row,
max_col TYPE i, &quot;for use with SPANS element
min_col TYPE i, &quot;for use with SPANS element
max_col_s TYPE char10, &quot;for use with SPANS element
min_col_s TYPE char10, &quot;for use with SPANS element
row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi,
path TYPE string,
node TYPE REF TO if_ixml_element,
relationship TYPE t_relationship,
rels_worksheet TYPE REF TO if_ixml_document,
rels_worksheet_path TYPE string,
stripped_name TYPE chkfile,
dirname TYPE string.
&quot; Read Workbook Relationships
CALL FUNCTION &apos;TRINT_SPLIT_FILE_AND_PATH&apos;
EXPORTING
full_name = ip_path
IMPORTING
stripped_name = stripped_name
file_path = dirname.
CONCATENATE dirname &apos;_rels/&apos; stripped_name &apos;.rels&apos;
INTO rels_worksheet_path.
rels_worksheet = me-&gt;get_ixml_from_zip_archive( rels_worksheet_path ).
node ?= rels_worksheet-&gt;find_from_name( &apos;Relationship&apos; ).
WHILE node IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = relationship ).
CONCATENATE dirname relationship-target INTO path.
path = resolve_path( path ).
CASE relationship-type.
WHEN lc_rel_drawing.
&quot; Read Drawings
CALL METHOD me-&gt;load_worksheet_drawing
EXPORTING
ip_path = path
io_worksheet = io_worksheet.
WHEN lc_rel_printer.
&quot; Read Printer settings
WHEN OTHERS.
ENDCASE.
node ?= node-&gt;get_next( ).
ENDWHILE.
worksheet = me-&gt;get_ixml_from_zip_archive( ip_path ).
rows = worksheet-&gt;get_elements_by_tag_name( name = &apos;row&apos; ).
iterator = rows-&gt;create_iterator( ).
row_elem ?= iterator-&gt;get_next( ).
WHILE row_elem IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = row_elem CHANGING cp_structure = row ).
SPLIT row-spans AT &apos;:&apos; INTO min_col_s max_col_s.
index = max_col_s.
IF index &gt; max_col.
max_col = index.
ENDIF.
cell_row = row-r.
IF row-customheight = &apos;1&apos; OR row-collapsed = lc_xml_attr_true OR row-collapsed = lc_xml_attr_true_int OR
row-hidden = lc_xml_attr_true OR row-hidden = lc_xml_attr_true_int OR row-outlineLevel &gt; &apos;0&apos;.
row_dimension = io_worksheet-&gt;get_row_dimension( cell_row ).
IF row-customheight = &apos;1&apos;.
row_dimension-&gt;set_row_height( row-ht ).
ENDIF.
IF row-collapsed = lc_xml_attr_true OR row-collapsed = lc_xml_attr_true_int.
row_dimension-&gt;set_collapsed( abap_true ).
ENDIF.
IF row-hidden = lc_xml_attr_true OR row-hidden = lc_xml_attr_true_int.
row_dimension-&gt;set_visible( abap_false ).
ENDIF.
IF row-outlineLevel &gt; &apos;&apos;.
* outline_level = condense( row-outlineLevel ). &quot;For basis 7.02 and higher
CONDENSE row-outlineLevel.
outline_level = row-outlineLevel.
IF outline_level &gt; 0.
row_dimension-&gt;set_outline_level( outline_level ).
ENDIF.
ENDIF.
ENDIF.
cells = row_elem-&gt;get_elements_by_tag_name( name = &apos;c&apos; ).
iterator2 = cells-&gt;create_iterator( ).
cell_elem ?= iterator2-&gt;get_next( ).
WHILE cell_elem IS BOUND.
CLEAR: cell_value, cell_formula, style_guid.
fill_struct_from_attributes( EXPORTING ip_element = cell_elem CHANGING cp_structure = cell ).
value_elem = cell_elem-&gt;find_from_name( name = &apos;v&apos; ).
CASE cell-t.
WHEN &apos;s&apos;. &quot; String values are stored as index in shared string table
index = value_elem-&gt;get_value( ) + 1.
READ TABLE shared_strings INTO cell_value INDEX index.
WHEN &apos;inlineStr&apos;. &quot; inlineStr values are kept in special node
value_elem = cell_elem-&gt;find_from_name( name = &apos;is&apos; ).
IF value_elem IS BOUND.
cell_value = value_elem-&gt;get_value( ).
ENDIF.
WHEN OTHERS. &quot;other types are stored directly
IF value_elem IS BOUND.
cell_value = value_elem-&gt;get_value( ).
ENDIF.
ENDCASE.
CLEAR style_guid.
&quot;read style based on index
IF cell-s IS NOT INITIAL.
index = cell-s + 1.
READ TABLE styles INTO style INDEX index.
IF sy-subrc = 0.
style_guid = style-&gt;get_guid( ).
ENDIF.
ENDIF.
formula_elem = cell_elem-&gt;find_from_name( name = &apos;f&apos; ).
IF formula_elem IS BOUND.
cell_formula = formula_elem-&gt;get_value( ).
ENDIF.
IF NOT cell_value IS INITIAL OR NOT cell_formula IS INITIAL OR style_guid IS NOT INITIAL.
zcl_excel_common=&gt;convert_columnrow2column_a_row(
EXPORTING
i_columnrow = cell-r
IMPORTING
e_column = cell_column
e_row = cell_row
).
io_worksheet-&gt;set_cell(
ip_column = cell_column &quot; cell_elem Column
ip_row = cell_row &quot; cell_elem row_elem
ip_value = cell_value &quot; cell_elem Value
ip_formula = cell_formula
ip_data_type = cell-t
ip_style = style_guid ).
ENDIF.
cell_elem ?= iterator2-&gt;get_next( ).
ENDWHILE.
row_elem ?= iterator-&gt;get_next( ).
ENDWHILE.
&quot;Get the customized column width
columns = worksheet-&gt;get_elements_by_tag_name( name = &apos;col&apos; ).
iterator = columns-&gt;create_iterator( ).
column_elem ?= iterator-&gt;get_next( ).
WHILE column_elem IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = column_elem CHANGING cp_structure = column ).
column_elem ?= iterator-&gt;get_next( ).
IF column-customwidth = lc_xml_attr_true OR
column-customwidth = lc_xml_attr_true_int OR
column-bestfit = lc_xml_attr_true OR
column-bestfit = lc_xml_attr_true_int OR
column-collapsed = lc_xml_attr_true OR
column-collapsed = lc_xml_attr_true_int OR
column-hidden = lc_xml_attr_true OR
column-hidden = lc_xml_attr_true_int OR
column-outlineLevel &gt; &apos;&apos; OR
column-style &gt; &apos;&apos;.
index = column-min.
WHILE index &lt;= column-max AND index &lt;= max_col.
column_alpha = zcl_excel_common=&gt;convert_column2alpha( index ).
column_dimension = io_worksheet-&gt;get_column_dimension( column_alpha ).
IF column-customwidth = lc_xml_attr_true OR column-customwidth = lc_xml_attr_true_int.
column_dimension-&gt;set_width( column-width ).
ENDIF.
IF column-bestfit = lc_xml_attr_true OR column-bestfit = lc_xml_attr_true_int.
column_dimension-&gt;set_auto_size( abap_true ).
ENDIF.
IF column-collapsed = lc_xml_attr_true OR column-collapsed = lc_xml_attr_true_int.
column_dimension-&gt;set_collapsed( abap_true ).
ENDIF.
IF column-hidden = lc_xml_attr_true OR column-hidden = lc_xml_attr_true_int.
column_dimension-&gt;set_visible( abap_false ).
ENDIF.
IF column-outlineLevel &gt; &apos;&apos;.
* outline_level = condense( column-outlineLevel ).
condense column-outlinelevel.
IF outline_level &gt; 0.
column_dimension-&gt;set_outline_level( outline_level ).
ENDIF.
ENDIF.
IF column-style &gt; &apos;&apos;.
sy-index = column-style + 1.
READ TABLE styles INTO style INDEX sy-index.
data: dummy_guid TYPE ZEXCEL_CELL_STYLE.
dummy_guid = style-&gt;get_guid( ).
column_dimension-&gt;set_column_style_by_guid( dummy_guid ).
ENDIF.
ADD 1 TO index.
ENDWHILE.
ENDIF.
* Fix 207 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007
* IF column-hidden = lc_xml_attr_true OR
* column-hidden = lc_xml_attr_true_int.
* index = column-min.
* WHILE index &lt;= column-max.
* column_alpha = zcl_excel_common=&gt;convert_column2alpha( index ).
* column_dimension = io_worksheet-&gt;get_column_dimension( column_alpha ).
* column_dimension-&gt;set_visible( abap_false ).
* ADD 1 TO index.
* ENDWHILE.
* ENDIF.
ENDWHILE.
&quot;Now we need to get information from the sheetView node
sheetview_elem = worksheet-&gt;find_from_name( name = &apos;sheetView&apos; ).
fill_struct_from_attributes( EXPORTING ip_element = sheetview_elem CHANGING cp_structure = sheetview ).
IF sheetview-showgridlines IS INITIAL OR
sheetview-showgridlines = lc_xml_attr_true OR
sheetview-showgridlines = lc_xml_attr_true_int.
&quot;If the attribute is not specified or set to true, we will show grid lines
sheetview-showgridlines = abap_true.
ELSE.
sheetview-showgridlines = abap_false.
ENDIF.
io_worksheet-&gt;set_show_gridlines( sheetview-showgridlines ).
&quot;Add merge cell information
mergecells = worksheet-&gt;get_elements_by_tag_name( name = &apos;mergeCell&apos; ).
iterator = mergecells-&gt;create_iterator( ).
mergecell_elem ?= iterator-&gt;get_next( ).
WHILE mergecell_elem IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = mergecell_elem CHANGING cp_structure = mergecell ).
zcl_excel_common=&gt;convert_range2column_a_row(
EXPORTING
i_range = mergecell-ref
IMPORTING
e_column_start = merge_column_start
e_column_end = merge_column_end
e_row_start = merge_row_start
e_row_end = merge_row_end
).
mergecell_elem ?= iterator-&gt;get_next( ).
io_worksheet-&gt;set_merge(
EXPORTING
ip_column_start = merge_column_start
ip_column_end = merge_column_end
ip_row = merge_row_start
ip_row_to = merge_row_end
).
ENDWHILE.
&quot; read sheet format properties
sheetformatpr_elem = worksheet-&gt;find_from_name( &apos;sheetFormatPr&apos; ).
IF sheetformatpr_elem IS NOT INITIAL.
fill_struct_from_attributes( EXPORTING ip_element = sheetformatpr_elem CHANGING cp_structure = sheetformatpr ).
IF sheetformatpr-customheight = &apos;1&apos;.
height = sheetformatpr-defaultrowheight.
row_dimension = io_worksheet-&gt;get_default_row_dimension( ).
row_dimension-&gt;set_row_height( height ).
ENDIF.
&quot; TODO... column
ENDIF.
&quot; Read in page margins
pagemargins_elem = worksheet-&gt;find_from_name( &apos;pageMargins&apos; ).
IF pagemargins_elem IS NOT INITIAL.
fill_struct_from_attributes( EXPORTING ip_element = pagemargins_elem CHANGING cp_structure = pagemargins ).
io_worksheet-&gt;sheet_setup-&gt;margin_bottom = pagemargins-bottom.
io_worksheet-&gt;sheet_setup-&gt;margin_footer = pagemargins-footer.
io_worksheet-&gt;sheet_setup-&gt;margin_header = pagemargins-header.
io_worksheet-&gt;sheet_setup-&gt;margin_left = pagemargins-left.
io_worksheet-&gt;sheet_setup-&gt;margin_right = pagemargins-right.
io_worksheet-&gt;sheet_setup-&gt;margin_top = pagemargins-top.
ENDIF.
&quot; Read in page setup
pagesetup_elem = worksheet-&gt;find_from_name( &apos;pageSetup&apos; ).
IF pagesetup_elem IS NOT INITIAL.
fill_struct_from_attributes( EXPORTING ip_element = pagesetup_elem CHANGING cp_structure = pagesetup ).
io_worksheet-&gt;sheet_setup-&gt;orientation = pagesetup-orientation.
io_worksheet-&gt;sheet_setup-&gt;scale = pagesetup-scale.
ENDIF.
&quot; Read header footer
headerfooter_elem = worksheet-&gt;find_from_name( &apos;headerFooter&apos; ).
IF headerfooter_elem IS NOT INITIAL.
fill_struct_from_attributes( EXPORTING ip_element = headerfooter_elem CHANGING cp_structure = headerfooter ).
io_worksheet-&gt;sheet_setup-&gt;diff_oddeven_headerfooter = headerfooter-differentoddeven.
hf_value_elem = headerfooter_elem-&gt;find_from_name( &apos;oddFooter&apos; ).
IF hf_value_elem IS NOT INITIAL.
odd_footer-left_value = hf_value_elem-&gt;get_value( ).
ENDIF.
&quot; TODO.. get the rest.
io_worksheet-&gt;sheet_setup-&gt;set_header_footer(
ip_odd_header = odd_header
ip_odd_footer = odd_footer
ip_even_header = even_header
ip_even_footer = even_footer ).
ENDIF.
&quot; Start fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007
&quot; Read pane
pane_elem = sheetview_elem-&gt;find_from_name( name = &apos;pane&apos; ).
IF pane_elem IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = pane_elem CHANGING cp_structure = pane ).
FIND REGEX &apos;^(\w+)(\d+)$&apos; IN pane-topleftcell SUBMATCHES pane_cell_col_a
pane_cell_row_a.
pane_cell_row = pane_cell_row_a.
pane_cell_col = zcl_excel_common=&gt;convert_column2int( pane_cell_col_a ).
SUBTRACT 1 FROM: pane_cell_col, pane_cell_row.
IF pane_cell_col &gt; 0 AND pane_cell_row &gt; 0.
io_worksheet-&gt;freeze_panes( ip_num_rows = pane_cell_row
ip_num_columns = pane_cell_col ).
ELSEIF pane_cell_row &gt; 0.
io_worksheet-&gt;freeze_panes( ip_num_rows = pane_cell_row ).
ELSE.
io_worksheet-&gt;freeze_panes( ip_num_columns = pane_cell_col ).
ENDIF.
ENDIF.
&quot; End fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET_DRAWING" VERSION="1" LANGU="E" DESCRIPT="Loads worksheet drawings" EXPOSURE="1" STATE="1" EDITORDER="8 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET_DRAWING" SCONAME="IP_PATH" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET_DRAWING" SCONAME="IO_WORKSHEET" VERSION="1" LANGU="E" DESCRIPT="Excel creator" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL_WORKSHEET"/>
<exception CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKSHEET_DRAWING" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
<source>method LOAD_WORKSHEET_DRAWING.
TYPES: BEGIN OF t_c_nv_pr,
name TYPE string,
id TYPE string,
END OF t_c_nv_pr.
TYPES: BEGIN OF t_blip,
cstate TYPE string,
embed TYPE string,
END OF t_blip.
TYPES: BEGIN OF t_chart,
id TYPE string,
END OF t_chart.
CONSTANTS: lc_xml_attr_true TYPE string VALUE &apos;true&apos;,
lc_xml_attr_true_int TYPE string VALUE &apos;1&apos;.
CONSTANTS: lc_rel_chart TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart&apos;,
lc_rel_image TYPE string VALUE &apos;http://schemas.openxmlformats.org/officeDocument/2006/relationships/image&apos;.
DATA: drawing TYPE REF TO if_ixml_document,
anchors TYPE REF TO if_ixml_node_collection,
node TYPE REF TO if_ixml_element,
coll_length TYPE i,
iterator TYPE REF TO if_ixml_node_iterator,
anchor_elem TYPE REF TO if_ixml_element,
relationship TYPE t_relationship,
rel_drawings TYPE t_rel_drawings,
rel_drawing TYPE t_rel_drawing,
rels_drawing TYPE REF TO if_ixml_document,
rels_drawing_path TYPE string,
stripped_name TYPE chkfile,
dirname TYPE string,
path TYPE string,
path2 TYPE text255,
file_ext2 TYPE char10.
&quot; Read Workbook Relationships
CALL FUNCTION &apos;TRINT_SPLIT_FILE_AND_PATH&apos;
EXPORTING
full_name = ip_path
IMPORTING
stripped_name = stripped_name
file_path = dirname.
CONCATENATE dirname &apos;_rels/&apos; stripped_name &apos;.rels&apos;
INTO rels_drawing_path.
rels_drawing_path = resolve_path( rels_drawing_path ).
rels_drawing = me-&gt;get_ixml_from_zip_archive( rels_drawing_path ).
node ?= rels_drawing-&gt;find_from_name( &apos;Relationship&apos; ).
WHILE node IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = relationship ).
rel_drawing-id = relationship-id.
CONCATENATE dirname relationship-target INTO path.
path = resolve_path( path ).
rel_drawing-content = me-&gt;get_from_zip_archive( path ).
path2 = path.
zcl_excel_common=&gt;split_file( EXPORTING ip_file = path2
IMPORTING ep_extension = file_ext2 ).
* CALL FUNCTION &apos;CV120_SPLIT_FILE&apos;
* EXPORTING
* pf_file = path2
* IMPORTING
* pfx_extension = file_ext2.
rel_drawing-file_ext = file_ext2.
APPEND rel_drawing TO rel_drawings.
node ?= node-&gt;get_next( ).
ENDWHILE.
drawing = me-&gt;get_ixml_from_zip_archive( ip_path ).
* one-cell anchor **************
anchors = drawing-&gt;get_elements_by_tag_name( name = &apos;oneCellAnchor&apos; namespace = &apos;xdr&apos; ).
coll_length = anchors-&gt;get_length( ).
iterator = anchors-&gt;create_iterator( ).
DO coll_length TIMES.
anchor_elem ?= iterator-&gt;get_next( ).
CALL METHOD me-&gt;load_drawing_anchor
EXPORTING
io_anchor_element = anchor_elem
io_worksheet = io_worksheet
it_related_drawings = rel_drawings.
ENDDO.
* two-cell anchor ******************
anchors = drawing-&gt;get_elements_by_tag_name( name = &apos;twoCellAnchor&apos; namespace = &apos;xdr&apos; ).
coll_length = anchors-&gt;get_length( ).
iterator = anchors-&gt;create_iterator( ).
DO coll_length TIMES.
anchor_elem ?= iterator-&gt;get_next( ).
CALL METHOD me-&gt;load_drawing_anchor
EXPORTING
io_anchor_element = anchor_elem
io_worksheet = io_worksheet
it_related_drawings = rel_drawings.
ENDDO.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="RESOLVE_PATH" VERSION="1" LANGU="E" DESCRIPT="Return path after ../ values are removed" EXPOSURE="1" STATE="1" EDITORDER="1 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="1" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="RESOLVE_PATH" SCONAME="IP_PATH" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<parameter CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="RESOLVE_PATH" SCONAME="RP_RESULT" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="STRING"/>
<source>method RESOLVE_PATH.
DATA: lt_segments TYPE TABLE OF string,
lv_segment TYPE string,
lv_count TYPE i.
SPLIT ip_path AT &apos;/&apos; INTO TABLE lt_segments.
lv_count = lines( lt_segments ).
WHILE lv_count &gt; 0.
READ TABLE lt_segments INTO lv_segment INDEX lv_count.
IF lv_segment = &apos;..&apos;.
SUBTRACT 1 FROM lv_count.
ELSE.
IF strlen( rp_result ) &gt; 0.
CONCATENATE &apos;/&apos; rp_result INTO rp_result.
ENDIF.
CONCATENATE lv_segment rp_result INTO rp_result.
ENDIF.
SUBTRACT 1 FROM lv_count.
ENDWHILE.
endmethod.</source>
</method>
</CLAS>