ABAP - XCO Excel
What can the XCO library for Excel in ABAP actually do? Here we look at the current status of the API.
Table of contents
The XCO classes are auxiliary classes that provide various everyday functions bundled under a public API. You can find more information and an overview of the XCO libraries on the overview page.
Introduction
SAP provides its own XCO API for processing Excel files, which you can use to read and now also to write. In today's example, we'll read in an Excel file and create a new file, which we'll then send by email.
Open Source
Before we get into the example, a quick point about an open source project that has been working on reading and preparing Excel files for a long time. With abap2xlsx you can prepare and design Excel files quickly and easily. Most Excel features are supported in the project, and even the creation of very large Excel files is possible. The project is still not 100% ABAP Cloud capable, but can be used very well in classic ABAP.
Read
In the first step, let's look at how we can read the Excel file and access the various components.
File
In this tutorial, we will use the following file for testing, which consists of three worksheets with the following names:
The contents of the worksheets look like this:
- Currency
- Country
- Users
So that you can work with the file locally, we return it using the GET_DUMMY_EXCEL_STREAM method. You can find the method in the example below. To open the file for reading, we pass the stream to the XCO_CP_XLSX class and call up the read mode.
DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).
Worksheets
If we want to get an overview of all the worksheets in the document, we can have all the objects returned and then process them using a LOOP. For example, we can get the name of the current worksheet using the GET_NAME method.
LOOP AT lo_document->get_workbook( )->worksheet->all->get( ) INTO DATA(lo_sheet).
out->write( lo_sheet->get_name( ) ).
ENDLOOP.
As a result, we get the worksheets returned from left to right.
If we want to get a specific worksheet from the file, we can work with the AT_POSITION or FOR_NAME methods.
lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 2 ).
lo_sheet = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-users ).
If we want to read a specific position, we pass an integer to the AT_POSITION method. The first worksheet starts at 1. With FOR_NAME we pass the name of the worksheet as we see it in the file. Before you access the data, however, you should check whether the worksheet actually exists:
lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 4 ).
IF NOT lo_sheet->exists( ).
out->write( |Sheet not found| ).
ENDIF.
Read (All)
How do we get the data in the sheets? Now that we have a worksheet as an object, we can read the data using the SELECT method. To do this, however, we need to call a few methods to get the data. First of all, we need to create a pattern, i.e. which area we want to read. Since we want all the data, we use the standard pattern without any further settings.
DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).
To read, we now have to call various methods and set configurations. We use the SELECT method to pass the pattern object and then select a ROW_STREAM. Here you can choose between the whole row or per cell; in this variant, we read per row. Then we select an operation and write the data into our table, which we pass as a reference. In the next step, we set a transformation for the content; here we want to convert all content to string. Finally, we execute the mapping using EXECUTE.
DATA(lo_result) = io_sheet->select( lo_pattern
)->row_stream(
)->operation->write_to( REF #( lt_users )
)->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
)->execute( ).
The data is now written to the internal table. Since we have read all the data, the header rows are also in the table; we can remove these in the next steps or use them to classify the data.
After execution, we also receive a RESULT object back, where we can ask about the status and also receive a table with error messages.
IF lo_result->succeeded = abap_false.
LOOP AT lo_result->messages INTO DATA(lo_message).
ENDLOOP.
ENDIF.
Read (range)
If we want to read a specific range, we can also adjust the pattern and keep the rest. In this case, we want to read columns B to C and skip the header row. We do not have to limit the maximum row, it will be read as long as there is data.
DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to(
)->from_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
)->to_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'C' )
)->from_row( xco_cp_xlsx=>coordinate->for_numeric_value( 2 )
)->get_pattern( ).
We want to load the result into a separate type.
TYPES: BEGIN OF ts_parts,
country TYPE string,
ranking TYPE string,
END OF ts_parts.
TYPES tt_parts TYPE STANDARD TABLE OF ts_parts WITH EMPTY KEY.
We don't need to make any changes to the writing so far. We will transfer the result to our local table.
lo_sheet->select( lo_pattern
)->row_stream(
)->operation->write_to( REF #( lt_parts )
)->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
)->execute( ).
Hint: Currently, reading does not seem to be working properly. To ensure that the result ends up in the correct columns, we have to insert a dummy column (skipped position). Otherwise, the last column will be overwritten again and again.
TYPES: BEGIN OF ts_parts,
dummy TYPE string,
country TYPE string,
ranking TYPE string,
END OF ts_parts.
TYPES tt_parts TYPE STANDARD TABLE OF ts_parts WITH EMPTY KEY.
Write
There is now also a way to create Excel files. In our example, we will create a file and send it by email so that we can take a better look at it.
Data
First of all, we create an internal table with data. To do this, we fill the first row with the column headings, since these cannot be created separately.
DATA(lt_users) = VALUE tt_users(
( user_id = 'User ID' user_name = 'First Name' user_mail = 'Mail address' )
( user_id = '04567' user_name = 'Chuck' user_mail = 'chuck@outlook.com' )
( user_id = '12541' user_name = 'Terence' user_mail = 'terence@outlook.com' )
( user_id = '24470' user_name = 'Emily' user_mail = 'emily@outlook.com' ) ).
Creation
Now we can start creating the Excel document. To do this, we open a new and empty document using the class. The document should be empty using the EMPTY method.
DATA(lo_document) = xco_cp_xlsx=>document->empty( )->write_access( ).
In the next step, we create a new worksheet and set it as the active entity so that we can write our data there. We therefore choose the second position because a sheet has already been created in the empty file. In principle, you can also adjust the name of the sheet using the SET_NAME method.
lo_document->get_workbook( )->add_new_sheet( `Made with ABAP` ).
DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->at_position( 2 ).
Now we need a simple pattern for the selection. If we want to start at A1, it is sufficient to create it without coordinates. We pass the pattern to the SELECT and can then transfer our table to Excel using ROW_STREAM. Writing is then started with EXECUTE.
DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).
lo_sheet->select( lo_pattern
)->row_stream(
)->operation->write_from( REF #( lt_users )
)->execute( ).
Finally, we can then get the complete Excel stream via the method in order to finally pass it on to the email dispatch.
DATA(ld_excel) = lo_document->get_file_content( ).
In this example, we send the email via the new email class. To do this, we prepare the document, set the sender and recipient and add a few more texts.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
lo_mail->set_sender( c_sender ).
lo_mail->add_recipient( c_receiver ).
lo_mail->set_subject( 'New Excel File' ).
lo_mail->set_main( cl_bcs_mail_textpart=>create_instance(
iv_content = '<h1>Hello,</h1><p>here your fresh printed Excel File</p>'
iv_content_type = 'text/html' ) ).
We then attach the stream to the email and give the document the correct mimetype.
lo_mail->add_attachment(
cl_bcs_mail_binarypart=>create_instance(
iv_content = id_excel
iv_content_type = `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`
iv_filename = `My-generated-Excel.xlsx` ) ).
The email will then be sent to us using the SEND method.
lo_mail->send( ).
In the email we find the corresponding text and the HTML formatting that we also passed on to the methods. The document has the assigned name and is an Excel file.
If we open the file, we find our two worksheets. Our data is on the new worksheet, just as we passed it on to the document.
Design
With the current release in the ABAP Environment (2411), you also have the option to design the Excel document in the BTP. Some functions have been made available for Excel, which we will take a closer look at.
Color
In the first step, we adjust the background color of the header and color each cell in a different shade. To do this, we first create a table with colors that we want to use later.
TYPES to_color TYPE REF TO cl_xco_xlsx_color.
DATA lt_color TYPE STANDARD TABLE OF to_color WITH EMPTY KEY.
lt_color = VALUE #( ( xco_cp_xlsx=>color->standard->blue )
( xco_cp_xlsx=>color->standard->light_blue )
( xco_cp_xlsx=>color->standard->orange ) ).
In the next step we set the cursor of the document to A1, i.e. the first cell at the top left of the Excel document.
DATA(lo_cursor) = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'A' )
io_row = xco_cp_xlsx=>coordinate->for_numeric_value( 1 ) ).
We then loop over the table with colors, get the current cell, set the corresponding color and move the cursor to the right to the next cell.
LOOP AT lt_color INTO DATA(lo_color).
DATA(lo_cell) = lo_cursor->get_cell( ).
lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->fill( )->set_background_color( lo_color ) ) ) ).
lo_cursor->move_right( ).
ENDLOOP.
The Excel file you received should now look like this, with the header now showing some color.
Protection
Basically, we have the option of protecting the worksheet so that no changes can be made. Basically, we execute the method on the SHEET and can protect or release everything. If the sheet is protected, we can open cells for editing in the next step.
io_sheet->protect( )->set_select_locked_cells( ).
Value help
The last point was to implement the value help or validation. In this section we will also open the cells so that we can adjust the values. To do this we will again give ourselves a cursor, this time for B2, to start with the first first name. Then we will prepare a validation with available first names.
lo_cursor = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
io_row = xco_cp_xlsx=>coordinate->for_numeric_value( 2 ) ).
DATA(lo_validation) = xco_cp_xlsx=>data_validation_type->if_xco_xlsx_dat_val_type_f~list(
)->add_source( `Chuck`
)->add_source( `Terence`
)->add_source( `Emily`
)->add_source( `Bob` ).
Finally, we go over the 3 cells, set the validation and open the cell for input. Once we're done, we move the cursor one cell down.
DO 3 TIMES.
lo_cell = lo_cursor->get_cell( ).
lo_cell->data_validation->set_type( lo_validation ).
lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->protection( )->set_locked( abap_false ) ) ) ).
lo_cursor->move_down( ).
ENDDO.
The result now looks like this: the cell is editable and we get a selection list for first names. The corresponding entry in the cell is already highlighted.
Other methods
In this article we wanted to focus on the two simplest methods for reading and writing. Working with tables will cover the most common use cases. In principle, the classes will also be further developed and there will be more formatting options later. There are also several methods for accessing the documents:
- Cursor - With the cursor you can dynamically read and write individual cells in the Excel file. The contents can be accessed via the Visitor Pattern.
You can find further examples of the other methods in the documentation linked below.
Complete example
You can find the complete example from the article here. The class contains the various examples shown, as well as the example Excel file as a stream, so you can start right away.
CLASS zcl_bs_demo_xco_excel DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
PRIVATE SECTION.
TYPES: BEGIN OF ts_users,
user_id TYPE string,
user_name TYPE string,
user_mail TYPE string,
END OF ts_users.
TYPES tt_users TYPE STANDARD TABLE OF ts_users WITH EMPTY KEY.
TYPES: BEGIN OF ts_parts,
dummy TYPE string,
country TYPE string,
ranking TYPE string,
END OF ts_parts.
TYPES tt_parts TYPE STANDARD TABLE OF ts_parts WITH EMPTY KEY.
CONSTANTS: BEGIN OF cs_sheets,
currency TYPE string VALUE `Currency`,
country TYPE string VALUE `Country`,
users TYPE string VALUE `Users`,
END OF cs_sheets.
CONSTANTS c_sender TYPE cl_bcs_mail_message=>ty_address VALUE ''.
CONSTANTS c_receiver TYPE cl_bcs_mail_message=>ty_address VALUE ''.
METHODS get_dummy_excel_stream
RETURNING VALUE(rd_result) TYPE xstring.
METHODS get_all_from_sheet.
METHODS get_part_from_sheet.
METHODS write_document.
METHODS get_worksheet_infos
IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.
METHODS send_test_email
IMPORTING id_excel TYPE xstring.
METHODS give_the_sheet_style
IMPORTING io_sheet TYPE REF TO if_xco_xlsx_wa_worksheet.
ENDCLASS.
CLASS zcl_bs_demo_xco_excel IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
get_worksheet_infos( out ).
get_all_from_sheet( ).
get_part_from_sheet( ).
write_document( ).
ENDMETHOD.
METHOD get_all_from_sheet.
DATA lt_users TYPE tt_users.
DATA(ld_stream) = get_dummy_excel_stream( ).
DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).
DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-users ).
DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).
DATA(lo_result) = lo_sheet->select( lo_pattern
)->row_stream(
)->operation->write_to( REF #( lt_users )
)->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
)->execute( ).
IF lo_result->succeeded = abap_false.
LOOP AT lo_result->messages INTO DATA(lo_message).
ENDLOOP.
ENDIF.
ENDMETHOD.
METHOD get_part_from_sheet.
DATA lt_parts TYPE tt_parts.
DATA(ld_stream) = get_dummy_excel_stream( ).
DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).
DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-currency ).
DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to(
)->from_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
)->to_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'C' )
)->from_row( xco_cp_xlsx=>coordinate->for_numeric_value( 2 )
)->get_pattern( ).
lo_sheet->select( lo_pattern
)->row_stream(
)->operation->write_to( REF #( lt_parts )
)->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
)->execute( ).
ENDMETHOD.
METHOD get_worksheet_infos.
DATA(ld_stream) = get_dummy_excel_stream( ).
DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).
LOOP AT lo_document->get_workbook( )->worksheet->all->get( ) INTO DATA(lo_sheet).
io_out->write( lo_sheet->get_name( ) ).
ENDLOOP.
lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 2 ).
io_out->write( lo_sheet->get_name( ) ).
lo_sheet = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-users ).
io_out->write( lo_sheet->get_name( ) ).
lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 4 ).
IF NOT lo_sheet->exists( ).
io_out->write( |Sheet not found| ).
ENDIF.
ENDMETHOD.
METHOD write_document.
DATA(lt_users) = VALUE tt_users( ( user_id = 'User ID' user_name = 'First Name' user_mail = 'Mail address' )
( user_id = '04567' user_name = 'Chuck' user_mail = 'chuck@outlook.com' )
( user_id = '12541' user_name = 'Terence' user_mail = 'terence@outlook.com' )
( user_id = '24470' user_name = 'Emily' user_mail = 'emily@outlook.com' ) ).
DATA(lo_document) = xco_cp_xlsx=>document->empty( )->write_access( ).
lo_document->get_workbook( )->add_new_sheet( `Made with ABAP` ).
DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->at_position( 2 ).
DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).
lo_sheet->select( lo_pattern
)->row_stream(
)->operation->write_from( REF #( lt_users )
)->execute( ).
give_the_sheet_style( lo_sheet ).
DATA(ld_excel) = lo_document->get_file_content( ).
send_test_email( ld_excel ).
ENDMETHOD.
METHOD give_the_sheet_style.
TYPES to_color TYPE REF TO cl_xco_xlsx_color.
DATA lt_color TYPE STANDARD TABLE OF to_color WITH EMPTY KEY.
lt_color = VALUE #( ( xco_cp_xlsx=>color->standard->blue )
( xco_cp_xlsx=>color->standard->light_blue )
( xco_cp_xlsx=>color->standard->orange ) ).
DATA(lo_cursor) = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'A' )
io_row = xco_cp_xlsx=>coordinate->for_numeric_value( 1 ) ).
LOOP AT lt_color INTO DATA(lo_color).
DATA(lo_cell) = lo_cursor->get_cell( ).
lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->fill( )->set_background_color( lo_color ) ) ) ).
lo_cursor->move_right( ).
ENDLOOP.
io_sheet->protect( )->set_select_locked_cells( ).
lo_cursor = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
io_row = xco_cp_xlsx=>coordinate->for_numeric_value( 2 ) ).
DATA(lo_validation) = xco_cp_xlsx=>data_validation_type->if_xco_xlsx_dat_val_type_f~list(
)->add_source( `Chuck`
)->add_source( `Terence`
)->add_source( `Emily`
)->add_source( `Bob` ).
DO 3 TIMES.
lo_cell = lo_cursor->get_cell( ).
lo_cell->data_validation->set_type( lo_validation ).
lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->protection( )->set_locked( abap_false ) ) ) ).
lo_cursor->move_down( ).
ENDDO.
ENDMETHOD.
METHOD send_test_email.
TRY.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
lo_mail->set_sender( c_sender ).
lo_mail->add_recipient( c_receiver ).
lo_mail->set_subject( 'New Excel File' ).
lo_mail->set_main( cl_bcs_mail_textpart=>create_instance(
iv_content = '<h1>Hello,</h1><p>here you fresh printed Excel File</p>'
iv_content_type = 'text/html' ) ).
lo_mail->add_attachment(
cl_bcs_mail_binarypart=>create_instance(
iv_content = id_excel
iv_content_type = `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`
iv_filename = `My-generated-Excel.xlsx` ) ).
lo_mail->send( ).
CATCH cx_bcs_mail.
ENDTRY.
ENDMETHOD.
METHOD get_dummy_excel_stream.
RETURN |504B0304140006000800000021007C6C981669010000A0050000130008025B436F6E74656E745F54797065735D2E786D6C20A2040228A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CC94DF6AC23014C6EF077B8792DBD1441D8C31AC5EECCFE526CC3D40D69CDA609A849CE8F4ED771A758CD129A2B| &&
|0DD34B4C9F9BE5F4F926F385E35265B4240ED6CC1FABCC732B0A553DACE0AF6367DCA6F5986515A258DB350B035201B8F2E2F86D3B507CCA8DA62C1EA18FD9D1058D6D048E4CE83A599CA8546467A0D33E16539973310835EEF4694CE46B0318FAD061B0D1FA0920B13B3C7157DDE900430C8B2FBCDC2D6AB60D27BA| &&
|34B1989542CADFAE1926F1D3855A635586B8F5784C144A7433BF3BBC1B6EE855A13B4826C22437C960D618895111F2ECCDF9D9BF3FD221D94AEAA7409CA958B863AC0D107900A6B80D8189E46DE486D77DC7BFCD3621469E89F19A4FDBF247C24C7E09F705CFF1147A4F30F223D4FDF922473600330AE0DE0B98F611| &&
|23DE45CCB00EA35064A8AB3037CD7DEC741F768129C474A9400C7776117196D75EE490842D4F0151A5D97EFCB91D2E8E4B6439B770A5487B748F93AFA040000FFFF0300504B030414000600080000002100B5553023F40000004C0200000B0008025F72656C732F2E72656C7320A2040228A00002000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000AC924D4FC3300C86EF48FC87C8F7D5DD9010424B774148BB21547E8049DC0FB58DA3241BDDBF271C10541A8303477FBD7EFCCADBDD3C8DEAC821F6E234AC8B12143B23B677AD8697FA7175072A2672964671ACE1C41176D5F5D5F699474A792876BD8F2AABB8A8A14BC9DF2346D3F144B110CF2| &&
|E571A0913A51C86163D99815AC64D59DE62F8AE01D54253EDAD86B0B737A0EA93CF9B7FD796A6E90D3F88394CECD29915C8736267D9AE7CC86C21F5F91A5553683969B0629E723A22795F646CC0F3449BBF13FD7C2D4E9CC852223412F832CF47C725A0F57F5AB434F1CB9D79C43709C3ABC8F0C9828B1FA8DE01000| &&
|0FFFF0300504B030414000600080000002100E1A418B49C030000240900000F000000786C2F776F726B626F6F6B2E786D6CAC556D6BE33810FE7E70FFC1E8BB6BC96F714CD3257E09576897D2CDB6775028AAADD4A2B69593E526A5EC7FDF9112A7E9E638B2DD0D891449E347CFCC3C333EFDB46E6AEB99C98E8B768| &&
|2C80946166B0B51F2F67182BECE677684AC4ED1B6A4B568D904BDB00E7D3AFBF38FD395904F0F423C5900D076135429B58C1DA72B2AD6D0EE442C590B270B211BAA60291F9D6E29192DBB8A31D5D48E8B71E83494B7688310CB6330C462C10B9689A26F58AB362092D55401FDAEE2CB6E406B8A63E01A2A9FFAA55D8| &&
|86609100FBCE6EAC58022AB29E2F3C75648FA5083DB6B12586B09DF107E04C3E00E37C1D1C1550D2FA4E8C4429D00B4B3217DE03FC10E21EF42B03E8CC17148BE23D933D739DCB192E10759853BACF00D8CE05F4623202DA3951882F741B460C7CD4567A70B5EB39B8D742DBA5C7EA68DCE548DAC9A762A2FB962E50| &&
|48D602956ECDD86EC9749CF6B3875C391479073B693F395B44AB6A07DADE620E4011E2A230CC76EA02D4118D35A31D952C552D12AD0E1D6AF5FD59CC14E2B010AB7AED9BF3D970C0A0BF405BEC2488B983E74575455562FEB094AE3BBAF1DB87F4789876950DE6562D5D6024AEC6E4F9BF4B0107E429DB4D02E3BE0F| &&
|386D7E6FF8FFE033D190F0ABC52D282FFE7D90564E10B7D869C40E6CB6DC99E43D08977DF163226F7AFE3C8CFC2284CED08A753DB8F82C01E876E02CB3126DE2CC26E84BF8133328C0B417B556DD3ADA127C887DC1E1C5DD2F5704270DCF3F28DC62BDE7E6C3DFF300C67DFB4C3BAB1DD70B6EADE84A197D6FA96B7A| &&
|5584D50E4FB01B25E8665E885E0E3CA1CDEF25255E0A44B30986CF6FE62FCB102C6048F7C5D06D2D5CC26E8354CA7AE1B06399019CD6C3F88423B9966B93D4AF324224112A46E6818397B944C0B056A66B65A23FBB497121AF70B746BDD604D989125637D8B3C2F8DC6DFD98BBE5572DF1C1ADACEDCD541D8373742D| &&
|BC3F6F68C3D2391815441EB028A484F86C4986077AC2DD85A5D74CACCA05F0ECE131F4F4778ECDB38F702C8FED8B523DF73EDD4CFDC3C18E5599E043AFBFA0513FF8E366BCA281EDE5C9A6545A59A4B5A3CC1FBEE9A2D12DA815C4DB01CE0BB4F3609A2047B40D19F11C81419633B4942DF0EB299178C4896E6C1EC8| &&
|DAC767FF1C1261739E66946550F0D40D7BE59C77A9C6D77779B8BCDC65605EF2A3BBECE74DCB74FFF9FE117F0BE66471ACF6E8E344C3F5FCE2F8FB4BDC8E7F7B7B3638DA79749363DDE7E7A7D3DFD679EFF3D5CE1FC67403709D7A391A933C8E4EC3B000000FFFF0300504B030414000600080000002100DE09FD280| &&
|2010000D40300001A000801786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C7320A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BC93CF6AC3300CC6EF83BD83D17D71926E65943ABD8C41AF5BF7002651E2D0C43696F6276F3F9343BA40C92EA1178324FC7D3FD0A7FDE1A7EFC417066A9D5590252908B4A5AB5| &&
|ADB28F838BD3E3C8320D6B6D29DB3A860408243717FB77FC34E73FC44A6F524A28A250586D9EFA4A4D260AF29711E6D9CD42EF49A63191AE97579D60DCA3C4DB732FCD58062A6298E958270AC36204E838FCEFF6BBBBA6E4B7C71E5678F96AF58C86F17CE6410398AEAD0202B985A24C7C92689C420AFC3E43786C99| &&
|760B21BC3644B30DB3561C8E880D53B879842BAAC6AD65E82795A1586872E867E0A0C8DF592FDE39AF61C4F092FEE6329C777DA879CDD62F10B0000FFFF0300504B0304140006000800000021002B250CDA0B0300007807000018000000786C2F776F726B7368656574732F7368656574312E786D6C9C93DB8EDA301| &&
|086EF2BF51D2CDF87C421592022AC0A61D5BDAB7ABC36CE8458D8716A9BC3AAEABB77620ABB123768A51C2663FBFB67E2DFF3C79356E400D649D395948D124AA013A696DDB6A43FBE3F45534A9CE75DCD95E9A0A42FE0E8E3E2E387F9D1D89D6B013C4142E74ADA7ADF1771EC440B9ABB91E9A1C391C658CD3D7EDA6| &&
|DEC7A0BBC0E8BB48AD324798835971D3D130A7B0FC3348D145019B1D7D0F933C482E21EEB77ADECDD85A6C53D38CDED6EDF47C2E81E111BA9A47F09504AB4289EB79DB17CA3B0EF13CBB820278B578AF7F82213F2374A5A0A6B9C69FC08C9F1B9E6DBF667F12CE6E24ABAEDFF2E0CCB620B07396CE02B2A7D5F492CB| &&
|FB2D257D8F89DB0872B6CF85DB6D8CBBAA47FAA69C5962CCFA32C9F4CA28CADF268B95C271163CB6CBD9C26ABD5A4FA4B17F35AE20E0F5D110B4D493FB1A2CA69BC9807FFFC9470746F62E2F9E61B28101E50835132D87363CC6E98F88CA904892E4C18885C787980152855D2F50C1DFE3B68608802F155E16D7C517| &&
|B0A86FE62C9863B5819F54BD6BE45493C3835347CAFFC5773FC0C72DB7ACCE6D8F8E09CA27EA9C009B42C96324A4323C22884E2936889672F43CBF153781FFF33D3513E49C60CA713B177DEE88B582833ACFF070000FFFF000000FFFF9493DD0E82300C465F85EC011C83E10F194BD4BDC8329778858611D4B7B7809| &&
|9A57189DC31CED7E4ACED54B87ADF1BDB5BADBADB23EB1A265816EEB60DF0554B963D85B4AEBEBC8C0FCEB77DC3F24D5131ADDC983D42187E05380F3A577CD08ABB0F3B612696EC8C59B16406B332320E7AD1B158E308E1E82889236615712CA65B09722D834B76BFF5CA357A104EEA61B6257AE5A447A40DAE48D8C| &&
|150FF1F3084A3DD9E340F33DA3C39378F8C165724ECAA3576104EDA617620BD1B1778D064290DAE40639F378F7F5FCA1B0000FFFF000000FFFFB229484C4FF54D2C4ACFCC2B56C8494D2BB15532D033575228CA4CCF80B14BF20BC0A216E6260686A6E626961060A6A490945F52929F8B433223353125B5082469ACA| &&
|490969F5F02E3E8DBD9E897E717651767A4A696D801000000FFFF0300504B030414000600080000002100F65023F5960200004B05000018000000786C2F776F726B7368656574732F7368656574322E786D6C9C934B6FA3301485F723F53F58DE130309E904855409B49AEE46A379AC1D730956FCA0B6F3D268FEFB5| &&
|C889256CA26AA84C5C516DF3DC73E9E3F1DB5227B705E5A53D06414530246D85A9A4D417FFD7C89BE52E203373557D640414FE0E9D3E2E1CBFC60DDD6B7008120C1F882B6217439635EB4A0B91FD90E0CAE34D6691EF0D36D98EF1CF07AF8492B96C6F194692E0D3D1372770FC3368D145059B1D360C219E240F180F| &&
|A7D2B3B7FA169710F4E73B7DD7591B0BA43C45A2A194E0394122DF2D78DB18EAF15FA3E26132EC8D1E193E2185FDA0CF3379DB414CE7ADB841192D959F3ADFD199B312EAEA45BFF7761920973B097FD01BEA3D2CF494AB22B2B7D878D3F099B5E61FD76B97C27EB82FE8DE3A4AAB2E7348ACBC7C768522ECB68B99AA| &&
|EA2B89AADCA2C9E94D5F3F81F5DCC6B8927DCBB220E9A822E937C35A66C311FF2F35BC2C17FA8491FC7B5B5DB7EE115DBC448F0A040F4C1201C5F7B2841A9829628C6BF0D4C2C11C8AEC48FF585FE3204F8BB236BEEA1B4EA8FAC438B37052F4A0D0DDFA9F0C31EBE81DCB401673334DA2725AF4F157881114529A33| &&
|4C33EFF010000FFFF000000FFFF94D0410AC3201085E1ABC81CA0763459344C84965C44ACD0555A3292B6B7EF14825157ED4EFD1F7C20F12DC634F9E41D2DF7A75A464050FCF033CB6930A05ED8F9305CDF53E410E734C2F1607A7014BEDBB38CE589E5BE3A24BD3AD2616B97AAED518B9331017EC7649CB1BEC1CA8| &&
|626C70AB3FF6032CED8A9C1CA86B6C1F4FEA51F000000FFFF000000FFFFB229484C4FF54D2C4ACFCC2B56C8494D2BB15532D033575228CA4CCF80B14BF20BC0A216E6260686A6E626961060A6A490945F52929F8B433223353125B5082469ACA490969F5F02E3E8DBD9E897E717651767A4A696D801000000FFFF030| &&
|0504B0304140006000800000021007A13C7B6A10300006E08000018000000786C2F776F726B7368656574732F7368656574332E786D6C9C934D8FDA301086EF95FA1F2CDF832109814484D50245DD5BB5EAC7D938136261C7A96DBE54F5BF77620ABB1217B452124F6CF99977EC77664F27ADC801AC93A62DE96830A| &&
|4045A612AD96E4BFAE3FB3A9A52E23C6F2BAE4C0B253D83A34FF3CF9F66476377AE01F00409AD2B69E37D5730E644039ABB81E9A0C595DA58CD3DFEDA2D739D055E854D5AB17838CC98E6B2A51742611F6198BA96025646EC35B4FE02B1A0B847FDAE919DBBD2B47804A7B9DDEDBB4818DD21622395F4E700A5448BE| &&
|265DB1ACB370AEB3E8D522EC8C9E213E39B5CD384F9BB4C5A0A6B9CA9FD00C9ECA2F9BEFC9CE58C8B1BE9BEFE8730A3945938C8FE02DF50F1C7248DC63756FC064B3E08CB6EB0FEB86CB1975549FFE4CFD93219AFB2289D6649944E166994AF278B68B11C27ABC9349F6693F42F9DCF2A8937DC57452CD4257D1E15C| &&
|B3165F359F0CF4F0947F72E26BD1D37C6ECFA85174C3344820305A23706E1381C60094A95F4CB181DFD3B30314420BB11DFC757FA3A18F89B251BEE6069D42F59F9063B051BA5829AEF957F35C7AF20B78DC75964074714D579054EA04551CA200E79845108C52FD1127B0DCF44F353188FFF99D86B62EFBCD1D7244| &&
|15ED8F70F0000FFFF000000FFFF94D25B0E82301005D0AD902EC0D2017C90D24461234D6DE2171A4A5077EF540D432731913FE00E99D39BEA70F17EECEC688D1EAEF76C68841259B8D93EE0535D88ECA14AEBEAF3B3F3C1F97E6C44BE814A18EDE2EC1187F153C0F7C9A852CBC968E9BEE12909AB346C93703B87121| &&
|53305D6507098283B465986A01825AE799F7BFE1F489B80B08FFFBBC16102ED1968190230505CC3403F1A2AD78070984007065A865030505CC340D470D250B50684C35479CE4049C8AE561BD7301035FC0149BADA2F000000FFFF000000FFFF74D0C96AC3301000D05F31BA4FA36DB48438204B31F4D08F4889BC90C| &&
|54171694BE9BF57498931349DD32CF0869955F7798EE9D09FF697F56ACA8B149B92784E8AB4EC772549CF3B468A8FB47CBB565FC122B5CC39A0810B905633301A29B85A32C5790834A86FB2F80B8A1998F109D45E48E69502E73323A5675029C781F21AAD44CD9CC287A09C81199F40EE6BE44E18402A39481D2858A| &&
|C322D9CA8F32EB6A1E221883330E31368ACD75499004A86EA0A5A30B8E15055683D7A8BC6F01BB8983FF4BC6DE3CB36B5FDE9521C623396843EE9BCA16FBB7B3E0EE75BD76849196A697F4391E27518C7E1F8CFB08BDB5D4CD7613EBB1986F15EE4AF2FDE87B4BF74318EEB1F000000FFFF0300504B0304140006000| &&
|80000002100580737E94E070000C020000013000000786C2F7468656D652F7468656D65312E786D6CEC59CD8B1B3714BF17FA3F0C7377FC35E38F25DEE0CF6C93DD24649D941CB5B6EC5156333292BC1B13022539F55228A4A597426F3D94D240030DBDF48F0924B4E91FD127CDD823ADE5249B6C4A5A760D8B47FEB| &&
|DA7A7F79E7E7AF374F1D2BD987A47980BC292965FBE50F23D9C8CD89824D3967F6B3828347C4F48948C1165096EF90B2CFC4BDB9F7E72116DC908C7D803F9446CA1961F4939DB2A16C5088691B8C0663881DF268CC748C2239F16C71C1D83DE98162BA552AD182392F85E8262507B7D322123EC6F2FD5F629E84EA45| &&
|00323CAF79552BC8E1D1F9615422C449772EF08D1960F338CD9F110DF93BE479190F043CB2FE93FBFB87DB188B632212A37C81A7203FD97C96502E3C38A9E934F0F5693064118D4DA2BFD1A40E53AAE5FEFD7FAB5953E0D40A311AC34B5C5D659AF74830C6B80D2AF0EDDBD7AAF5AB6F086FEEA9ACDED507D2CBC06A| &&
|5FA8335FC60D0052F5A780D4AF1E11A3EEC343B3D5BBF06A5F8DA1ABE5E6AF782BAA55F83224A92C3357429AC55BBCBD5AE201346779CF066180CEA954C798E826C5865979A62C212B929D7627497F1010014902249124F2E6678824690BF5D44C90127DE2E9946907833943001C3A54A6950AAC27FF509F4371D51B| &&
|4859121ADEC024BC4DA90B2C713234E66B2E55F01ADBE0179F1ECD9F3874F9F3FFCEDF9A347CF1FFE92CDAD5559723B28999A72AF7EFCFAEFEFBFF0FEFAF587578FBF49A73E891726FEE5CF5FBEFCFD8FD7A98715E7AE78F1ED93974F9FBCF8EEAB3F7F7AECD0DEE6E8C0840F498C85770D1F7B37590C0B74D88F0FF| &&
|8E92486112296048A40B743755F4616F0DA025117AE836D17DEE6C0322EE0E5F95DCBD6FD88CF2571CC7C358A2DE01E63B4C3B8D30157D55C868787F364EA9E9CCF4DDC4D848E5C7377516205B83F9F01BD1297CA6E842D336F50944834C509969EFA8D1D62EC58DD1D422CBFEE911167824DA47787781D449C2E199| &&
|2032B9172A11D12435C162E0321D4966FF66E7B1D465DABEEE1231B09DB025187F1434C2D375E4673896297CA218AA9E9F05D24239791FB0B3E32717D2121D2534C99D71F63215C32D739ACD708FA55601877D8F7E822B6915C924397CE5DC49889ECB1C36E84E299D366924426F6337108298ABC1B4CBAE07BCCDE2| &&
|1EA19E280928DE1BE4DB015EE3713C12D2057D3A43C41D42F73EE88E565CCECFDB8A013845D2CD3E6B1C5AE6D4E9CD9D1994FADD4DEC598A26334C6D8BBF599C3820E9B593ECF8DBE1201ABEC6057625D4176AEAAE7040BECE9BA669D227789B052761F4FD9067BF616278867819218F14D9AAF41D4ADD48553CE49A| &&
|5D7E9E8D0045E2350F841BE389D725D800E23B9FB9BB4DE88907576A967E1CED705B7E2F7367B0CF6E5DDD3EE4B90C1A79601627F6BDF0C11B526C8136688A0C070D12D8858E1CF45D4B9AAC5E64EB989BD69F330406164D53B3149DE58FC9C287BC27FA7EC7117306750F0B815BF4FA9B38952764E14389B70FFC1B| &&
|2A687E6C90D0C27C93A679D5735E7558DFFBFAF6A36EDE5F35AE6BC9639AF655C6F5F1FA496C9CB17A86CF22E8FEEF9C41B5B3E1342E9BE5C50BC2B74D747C01BCD780083BA1DA57B92AB16E02C82AF5983C9C24D39D2321E67F27322A3FD08CDA03554D6CDCEA9C8544F853763023A467A583751F109DDBAEF348FF| &&
|7D838ED7496CBAAAB99BA5020998F97C2D53874A9648AAED5F3EEDD4ABDEE874E7597756980923D8D11C664B611558711F5E52044E17546E8959D89154D87150DA57E19AA651457AE00D3565181576E0F5ED45B7E18A41D6468C641793E56714A9BC9CBE8AAE09C69A43739939A190025F63203F2483795AD1B97A75| &&
|697A6DA5B44DA32C24837DB08230D237811CEB2D36CB99F65AC9B79482DF3942B96BB2137A3DEF810B1562472821B686232054DBCE3965FAB86709F3242B3963F818E317C8D67903B42BD75213A850B9791E4E9867F17669971217B4844A9C335E9A46C101389B94749DCF2D5F257D94013CD21DAB6720508E1A335A| &&
|E09B4F2B1190741B7838C27133C9266D88D11E5E9F411183EE50AE7AF5AFCDDC14A92CD21DCFBD1F8D83BA0737E13418A85F5B272E09808B83828A7DE1C13B8095B11599E7F270EA68C76CDAB289D43E938A2B30865278A49E6295C93E8CA1CFDB4F281F194AD191CBAEEC283A93A60DFFBD47DF351AD3C6790667E6| &&
|65AACA24E4D37997EB843DEB02A3F442DAB52EAD6EFD422E7BAE692EB20519DA7C41B4EDDB738100CD3F2C92CD394C5EB34AC383B1BB54D3BC382C0F0446D83DF566784D313EF7AF283DCC9AC5507C4B2AED489AF2FCBCD5B6D767017C8A307F787732A850E25DC597304455F7A0399D2066C917B32AB11E19B37E7A| &&
|4E5DF2F85EDA05B09BB855223EC17826A502A34C276B5D00EC36AB91F964BBD4EE5011C2C328ACB617A513F802B0CBAC8AEEBF5F8DA957DBCBCA5B930627191E92BF9A2365C5FD9972B8E2B7B6FA86EE67D8F00E9DCAF5506CD6AB3532B34ABED4121E8751A8566B7D629F46ADD7A6FD0EB868DE6E081EF1D6970D0A| &&
|E76835ABF51A895BBDD42502B29F31BCD423DA854DA41BDDDE807ED075919032B4FE923F305B857DBB5FD0F000000FFFF0300504B030414000600080000002100DBDAAE23F9020000940700000D000000786C2F7374796C65732E786D6CA4555D6F9B30147D9FB4FF80FC4E0D34644904544D53A44ADD54299DB4570| &&
|74C62D51FC8988C6CDA7FDFB5090D5DB76E6B5F827DED7B7CCEFD4A72D109EEEDA96E9892290ACF02E45159A892C96D8A3EDFE7FE0C798D21B2245C499AA2036DD045F6FE5DD29803A7EB1DA5C60308D9A468674CBDC0B829765490E64CD554C249A5B42006B67A8B9B5A535236D649701C05C1140BC224EA1116A2F| &&
|8171041F4435BFB851235316CC338330787853C512C6EB65269B2E140B50B27A4F0BA70AA23AFD3C323CEFAEC1DC10AAD1A559933C0C5AAAA58419FD39DE33926C50909905F8714C638889E68EFF42B912658D33DB3E943595229691AAF50AD34298A80A80DC1E241AAAF32B74790E1E3AD2C69BE797BC2C112229C2| &&
|585E24A7B0652079173164904ED6F5C11CE369AD96B15118C1F7A73640DD83ED93F9C252D185E820DACC77FE13AF806F019E72361BD214BA0020CD5328753EFB8BE3FD4A04042B1F6F4E0E8AFB7B79A1CC2281E3960F760966C942EA1398690DAE8F5A62CE1B4322047B3EDCE7E8DAAE177A38C8102CA929291AD928| &&
|4DB100D1EC705C82928E76BDB405FAA27AABACA93ADC885B9295304AD68833B2C41C871D9E3F51BC0FF935308FEBF77F2485DF3C3A7566CA8CE5D7FBAD79CD5C6F2B45B3AFDA7FD25675B29A82D2FA0E71CEEB432B4306E7EB804E3B1BA5EEB9B657A5DF516BDBDB72B6BC70EF88C92F024058FE43D5BA829BA65F20| &&
|11AC93D0F11DDB48C1B262D9999EB9B2193C7EB6B372B7539B84094462EBFC4074894DDA902DCA9B1C3CBD5C6232DC02869455A6EEE1F0F53745A7FA4256B05B4FBF1D61DDB2BE32052745ADFDA420DA79634EDCC6D035D0B5FAFD52C45DFAF971FE6ABEB3CF267C172E64FCE69ECCFE3E5CA8F2757CBD52A9F07517| &&
|0F5633442DF3040DDC487AA0D278B86C398D547B147F2EB932D45A34D4FDFB528D01E739F47D3E0320E033F3F0F427F3225337F363D8FFD3C0EA3D574B2BC8EF378C43D7EE5A00D7018F623DB928F178609CA991C723564686C8524C1F6051178C8043EFD9D663F010000FFFF0300504B03041400060008000000210| &&
|02A04FEC53D0100003603000014000000786C2F736861726564537472696E67732E786D6C7492CB4EC3301045F748FC83E53D751F50A04A5CE80B214117857C807186C66A3C0EB653E8DFE3085676BAF4B93377EE8C9CCD7F744D8E609D3298D3D1604809A034A5C27D4E8BF7CDD51D25CE0B2C456D10727A0247E7F| &&
|CF22273CE93D08B2EA795F7CD8C31272BD0C20D4C0318944F63B5F0E169F7CC351644E92A00AF6B361E0EA74C0B859448D3A2CFE9E4969216D5570BCB3F30BEA73C738A679E2F5B6B43A453C63CCF58C7FE79576963DC659AB946C890350C75608F40F94EE0216C44628F2D7CB3A229858758795CAF62B45AC764F39| &&
|C18C6605DEC92AE8414898DD049A22708F7C4E40C1B2B5026C545589C3C272B7478DBE3FD2A549DDC77311A4FFAE0751FBCE983D3642F250F315B00C6E84D5851C5F0054C5288C1EF611FBE523D9046C71D1F80E745D7CD382FD7615A9FCAC2BFE7BF000000FFFF0300504B0304140006000800000021009C7CFD5AE| &&
|E0000002903000023000000786C2F776F726B7368656574732F5F72656C732F7368656574332E786D6C2E72656C73BC92C14A03311086EF82EF10E6EE665B45A434DB1E54E8C18BD40718B3B3BB6193992589D2BEBDF1205828283DEC71F899EFFF1866BD3904AF3E2926276C6051D5A088ADB48E7B036FFBE79B075| &&
|02923B7E885C9C091126C9AEBABF52B79CC65290D6E4AAA50381918729E565A273B50C054C9445C924E62C05CC6D8EB09ED883DE9655DDFEBF89B01CD0953ED5A0371D7DE82DA1FA7D2FC375BBACE597A14FB1188F3990A3D1452F48EC702C5D8533610D0F92CAB8411876DFF3D5556C24FFE226DA97E3A648A8C1EF| &&
|479C7E53C8EEFC4971A2EE6316467C74B15EFE651F424FFBAA23E79F0E60B0000FFFF0300504B030414000600080000002100DABEDF814D0100006D02000011000801646F6350726F70732F636F72652E786D6C20A2040128A0000100000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C924D4EC3301484F748DC21F29AC47152FEAC24950AEA8A4| &&
|A481481D859F66B1B881DCB7649CBC1B80017C349DA5054162CED99F779E6C9D97823ABE01D8C2D6B952312C52800C56B51AA658E1EE7D3F00A05D6312558552BC8D1162C1A17A72719D794D706EE4DADC1B8126CE049CA52AE73B4724E538C2D5F816436F20EE5C5456D2473FE68965833FEC696809338BEC0121C1| &&
|3CC31DC02433D10D10E29F880D46B537500C131542041398B4944F08FD78191F6CF814E3970CAD26DB5EFB48B7BC816BC1707F7C69683B1699AA849BB183E3FC1CFB3BB87AE6A58AA76571C5091094EB901E66A5378715D7D9C0593D7AF4FA3327C20B56BAC987533BFF1450962B23D721F3B3CBBABD23F0022F0E16| &&
|85F65AF3CA537B7F3292A923819858484249E93948EAE29B97C6903FC9A6FC3F6177217E39FC4739A26341E1D10F78022C3471FA4F8060000FFFF0300504B030414000600080000002100465A0753AB0100006603000010000801646F6350726F70732F6170702E786D6C20A2040128A000010000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C9| &&
|3C16EDB300C86EF03F60E86EE8DDCA62886405651B81B7A68B100717A57643A11264B86C418719F676FB2171B6DA38EB3F6B41BC99FFEFD49A4C4FDA9B6490B211AEF3276BD4859024EFBD2B87DC6B6C58FAB6F2C89A85CA9AC7790B10E22BB975FBF8875F00D04341013B270316307C466C579D407A8555C90EC48A| &&
|97CA815521AF6DC5795D1F0E8F5B10687FC264DEF389C105C09E5553319B2D171D5E2FF9A965EF77CF1B5E81A0296A2F0A86C616A90A9E0E7443C348D355A219D5EBE181D7CF41526DF4F1AACE0735110F506F43118EC7A8F792A365A59C8E987B2523682E0E7827802D55FE65A9910A56871D582461F9268DEE83A6| &&
|F58B253117ACC8CB52A18E59070FBB6311962DB440CF221ECC060DCD93FBF1121084E5DA33284F30FE6B1B995CBA18182CBC6DE60A421E192B3306821FEACD62AE027D8CB39F6C030428F38F931045AA26E4E38B1E6FEE8307CAE6D232DE287730DF74584FF30E5BE6E94EB4898A267E37EC56D53F84785F03E8BCBA| &&
|2D81C548092C637CD6A2A88271A43B0BD497E506E0FE57BCF47A1DF9CD7F1D9C8EBBB45BA4C69296635C1CF0F44FE050000FFFF0300504B01022D00140006000800000021007C6C981669010000A00500001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D0| &&
|014000600080000002100B5553023F40000004C0200000B00000000000000000000000000A20300005F72656C732F2E72656C73504B01022D0014000600080000002100E1A418B49C030000240900000F00000000000000000000000000C7060000786C2F776F726B626F6F6B2E786D6C504B01022D0014000600080| &&
|000002100DE09FD2802010000D40300001A00000000000000000000000000900A0000786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C73504B01022D00140006000800000021002B250CDA0B030000780700001800000000000000000000000000D20C0000786C2F776F726B7368656574732F7368656| &&
|574312E786D6C504B01022D0014000600080000002100F65023F5960200004B050000180000000000000000000000000013100000786C2F776F726B7368656574732F7368656574322E786D6C504B01022D00140006000800000021007A13C7B6A10300006E0800001800000000000000000000000000DF120000786| &&
|C2F776F726B7368656574732F7368656574332E786D6C504B01022D0014000600080000002100580737E94E070000C02000001300000000000000000000000000B6160000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100DBDAAE23F9020000940700000D000000000000000| &&
|00000000000351E0000786C2F7374796C65732E786D6C504B01022D00140006000800000021002A04FEC53D01000036030000140000000000000000000000000059210000786C2F736861726564537472696E67732E786D6C504B01022D00140006000800000021009C7CFD5AEE00000029030000230000000000000| &&
|0000000000000C8220000786C2F776F726B7368656574732F5F72656C732F7368656574332E786D6C2E72656C73504B01022D0014000600080000002100DABEDF814D0100006D0200001100000000000000000000000000F7230000646F6350726F70732F636F72652E786D6C504B01022D001400060008000000210| &&
|0465A0753AB0100006603000010000000000000000000000000007B260000646F6350726F70732F6170702E786D6C504B0506000000000D000D005D0300005C2900000000|.
ENDMETHOD.
ENDCLASS.
Conclusion
With the new API you can also read and process simple Excel documents. We have explained how to use the API correctly in this article. If you want more functions and options, you should take a look at abap2xlsx.
Source:
SAP Help - XLSX