abap2xlsx/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk
2011-12-26 11:47:38 +00:00

1040 lines
48 KiB
XML

<?xml version="1.0" encoding="utf-16"?>
<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" AUTHOR="BCUSER" CREATEDON="20100820" CHANGEDBY="FEMIA" CHANGEDON="20111217" CHGDANYON="00000000" CLSCCINCL="X" FIXPT="X" UNICODE="X" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110601" CHANGEDBY="FEMIA" CHANGEDON="20111217" TYPTYPE="4" SRCROW1="6 " SRCCOLUMN1="4 " SRCROW2="10 " SRCCOLUMN2="29 " R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110602" CHANGEDBY="FEMIA" CHANGEDON="20111217" TYPTYPE="4" SRCROW1="12 " SRCCOLUMN1="4 " SRCROW2="18 " SRCCOLUMN2="26 " R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110602" CHANGEDBY="FEMIA" CHANGEDON="20111217" TYPTYPE="4" SRCROW1="20 " SRCCOLUMN1="4 " SRCROW2="24 " SRCCOLUMN2="22 " R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110602" CHANGEDBY="FEMIA" CHANGEDON="20111217" TYPTYPE="4" SRCROW1="26 " SRCCOLUMN1="4 " SRCROW2="29 " SRCCOLUMN2="27 " R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110602" CHANGEDBY="FEMIA" CHANGEDON="20111217" TYPTYPE="4" SRCROW1="31 " SRCCOLUMN1="4 " SRCROW2="33 " SRCCOLUMN2="24 " R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20111217" CHANGEDON="00000000" TYPTYPE="4" SRCROW1="35 " SRCCOLUMN1="4 " SRCROW2="37 " SRCCOLUMN2="22 " R3RELEASE="702" TYPESRC_LENG="77 " TYPESRC="BEGIN OF t_range,
name TYPE string,
END OF t_range
"/>
<implementing CLSNAME="ZCL_EXCEL_READER_2007" REFCLSNAME="ZIF_EXCEL_READER" VERSION="1" EXPOSURE="2" STATE="1" AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" RELTYPE="1" EDITORDER="0 "/>
<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>PROTECTED SECTION.
*&quot;* protected components of class ZCL_EXCEL_READER_2007
*&quot;* do not include other source files here!!!
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,
END OF t_range .
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
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 .
METHODS load_worksheet
IMPORTING
!ip_path TYPE string
!io_worksheet TYPE REF TO zcl_excel_worksheet .</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 .
methods LOAD_SHARED_STRINGS
importing
!IP_PATH type STRING .
methods LOAD_STYLES
importing
!IP_PATH type STRING
!IP_EXCEL type ref to ZCL_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 .</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
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 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: BEGIN OF t_color,
indexed TYPE string,
rgb TYPE string,
theme TYPE string,
tint TYPE string,
END OF t_color.</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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="1" TYPE="XSTRING" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="1" TYPE="STRINGTAB" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " R3RELEASE="702" TYPESRC_LENG="0 "/>
<attribute CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="STYLES" VERSION="1" LANGU="E" EXPOSURE="0" STATE="1" EDITORDER="4 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="1" TYPE="T_STYLE_REFS" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " R3RELEASE="702" TYPESRC_LENG="0 "/>
<attribute CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="ZIP" VERSION="1" LANGU="E" DESCRIPT="Zip Utility" EXPOSURE="0" STATE="1" EDITORDER="2 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" ATTDECLTYP="0" ATTEXPVIRT="0" TYPTYPE="3" TYPE="CL_ABAP_ZIP" SRCROW1="0 " SRCCOLUMN1="0 " SRCROW2="0 " SRCCOLUMN2="0 " R3RELEASE="702" TYPESRC_LENG="0 "/>
<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="1 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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="2 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217"/>
<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="3 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<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="2 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217"/>
<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_validating( mode = if_ixml_parser=&gt;co_no_validation ).
parser-&gt;parse( ).
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_SHARED_STRINGS" VERSION="1" LANGU="E" DESCRIPT="Loads shared strings table" EXPOSURE="0" STATE="1" EDITORDER="1 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="STRING"/>
<source>method LOAD_SHARED_STRINGS.
DATA: value 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.
shared_strings_xml = me-&gt;get_ixml_from_zip_archive( ip_path ).
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;.
value = node2-&gt;get_value( ).
APPEND value TO shared_strings.
ELSEIF tag_name = &apos;r&apos;.
&quot; TODO pharse Ritch text
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="0" STATE="1" EDITORDER="2 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL"/>
<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="0" STATE="1" EDITORDER="3 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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="0" STATE="1" EDITORDER="4 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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="0" STATE="1" EDITORDER="5 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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="0" STATE="1" EDITORDER="6 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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.
endmethod.</source>
</method>
<method CLSNAME="ZCL_EXCEL_READER_2007" CMPNAME="LOAD_WORKBOOK" VERSION="1" LANGU="E" DESCRIPT="Loads workbook" EXPOSURE="1" STATE="1" EDITORDER="4 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL"/>
<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,
range TYPE t_range,
range_value TYPE zexcel_range_value,
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.
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;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="5 " DISPID="0 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" 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 " AUTHOR="FEMIA" CREATEDON="20110528" CHANGEDBY="FEMIA" CHANGEDON="20111217" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL_WORKSHEET"/>
<source>method LOAD_WORKSHEET.
TYPES: BEGIN OF t_cell,
r TYPE string,
t TYPE string,
s TYPE string,
END OF t_cell.
DATA: worksheet TYPE REF TO if_ixml_document,
rows TYPE REF TO if_ixml_node_collection,
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 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.
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 ?= iterator-&gt;get_next( ).
WHILE row IS BOUND.
cells = row-&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
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 ?= iterator-&gt;get_next( ).
ENDWHILE.
endmethod.</source>
</method>
</CLAS>