From 24c5fca308c1b312e3f1262af145b0a9f95ae2c5 Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 12 Jan 2015 14:55:28 -0600 Subject: [PATCH 1/5] Update slinkees Update of all the slinkees files with the latest version of SAPLink to simplify merge of pull request --- ZA2X/CLAS/ZCL_EXCEL_AUTOFILTER.slnk | 20 +- ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk | 16 +- ZA2X/CLAS/ZCL_EXCEL_CONVERTER.slnk | 19 +- ZA2X/CLAS/ZCL_EXCEL_CONVERTER_ALV_GRID.slnk | 6 +- ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT.slnk | 10 +- ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_EX.slnk | 6 +- ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_WD.slnk | 2 - ZA2X/CLAS/ZCL_EXCEL_CONVERTER_SALV_TABLE.slnk | 16 +- ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI.slnk | 18 +- ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI_BUTTON.slnk | 22 +- ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk | 139 ++---- ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk | 79 +--- ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk | 73 +-- ZA2X/CLAS/ZCL_EXCEL_GRAPH.slnk | 430 ++++++++--------- ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk | 140 +----- ZA2X/CLAS/ZCL_EXCEL_GRAPH_LINE.slnk | 140 +----- ZA2X/CLAS/ZCL_EXCEL_GRAPH_PIE.slnk | 81 +--- ZA2X/CLAS/ZCL_EXCEL_HYPERLINK.slnk | 123 ++--- ZA2X/CLAS/ZCL_EXCEL_LEGACY_PALETTE.slnk | 95 +--- ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk | 91 +--- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 38 +- ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk | 88 ++-- ZA2X/CLAS/ZCL_EXCEL_READER_XLSM.slnk | 47 +- ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk | 447 ++++++------------ ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk | 62 +-- ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk | 104 ++-- ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk | 91 +--- ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk | 83 +--- ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk | 73 +-- ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk | 136 ++---- ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk | 154 ++---- ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk | 54 +-- ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk | 22 +- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 6 +- ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk | 98 ++-- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk | 253 +++------- ZA2X/CLAS/ZCL_EXCEL_WRITER_CSV.slnk | 108 ++--- ZA2X/CLAS/ZCL_EXCEL_WRITER_XLSM.slnk | 192 ++++++++ ZA2X/DEVC/ZABAP2XLSX.slnk | 2 + ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk | 2 +- ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk | 4 +- ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk | 4 +- ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk | 4 +- ZA2X/DTEL/ZEXCEL_APPLICATION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_APPVERSION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_BORDER.slnk | 4 +- ZA2X/DTEL/ZEXCEL_BREAK.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CATEGORY.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_COLOR.slnk | 4 +- ZA2X/DTEL/ZEXCEL_COMPANY.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk | 4 +- ...nk => ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk} | 8 +- ZA2X/DTEL/ZEXCEL_CREATOR.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk | 4 +- ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk | 2 +- ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk | 2 +- ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk | 4 +- ZA2X/DTEL/ZEXCEL_FILL.slnk | 4 +- ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_FONT.slnk | 4 +- ZA2X/DTEL/ZEXCEL_FORMAT.slnk | 4 +- ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_HIDDEN.slnk | 4 +- ZA2X/DTEL/ZEXCEL_INDENT.slnk | 4 +- ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk | 4 +- ZA2X/DTEL/ZEXCEL_LOCKED.slnk | 4 +- ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk | 4 +- ZA2X/DTEL/ZEXCEL_PROTECTION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk | 4 +- ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk | 4 +- ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk | 4 +- ZA2X/DTEL/ZEXCEL_ROTATION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SCALECROP.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk | 4 +- ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk | 4 +- ZA2X/DTEL/ZEXCEL_SUBJECT.slnk | 4 +- ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk | 4 +- ZA2X/DTEL/ZEXCEL_TITLE.slnk | 4 +- ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk | 4 +- ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk | 4 +- ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk | 4 +- ZA2X/INTF/ZIF_EXCEL_BOOK_PROTECTION.slnk | 26 +- ZA2X/INTF/ZIF_EXCEL_BOOK_VBA_PROJECT.slnk | 22 +- ZA2X/INTF/ZIF_EXCEL_CONVERTER.slnk | 2 +- ZA2X/INTF/ZIF_EXCEL_CUSTOMUI_ELEMENT.slnk | 8 +- ZA2X/INTF/ZIF_EXCEL_SHEET_PRINTSETTINGS.slnk | 2 +- ZA2X/INTF/ZIF_EXCEL_SHEET_PROTECTION.slnk | 50 +- ZA2X/INTF/ZIF_EXCEL_SHEET_VBA_PROJECT.slnk | 18 +- ZA2X/INTF/ZIF_EXCEL_WRITER.slnk | 10 +- ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk | 4 +- ZA2X/PROG/ZANGRY_BIRDS.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL1.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL10.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL13.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL14.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL17.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL18.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL19.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL20.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL21.slnk | 6 +- ZA2X/PROG/ZDEMO_EXCEL22.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL23.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL24.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL25.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL26.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL27.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL28.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL29.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL32.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL35.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL36.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL5.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL9.slnk | 4 +- ZA2X/PROG/ZDEMO_TECHED1.slnk | 4 +- ZA2X/PROG/ZDEMO_TECHED10.slnk | 43 +- ZA2X/PROG/ZDEMO_TECHED2.slnk | 4 +- ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk | 12 +- ZA2X/TABL/ZEXCEL_CONDITIONAL_DATABAR.slnk | 10 +- ZA2X/TABL/ZEXCEL_CONDITIONAL_EXPRESSION.slnk | 8 +- ZA2X/TABL/ZEXCEL_CONDITIONAL_ICONSET.slnk | 30 +- ZA2X/TABL/ZEXCEL_DRAWING_LOCATION.slnk | 2 +- ZA2X/TABL/ZEXCEL_PANE.slnk | 16 +- ZA2X/TABL/ZEXCEL_S_AUTOFILTER_AREA.slnk | 14 +- ZA2X/TABL/ZEXCEL_S_AUTOFILTER_VALUES.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk | 32 +- ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk | 20 +- ZA2X/TABL/ZEXCEL_S_CONVERTER_COL.slnk | 16 +- ZA2X/TABL/ZEXCEL_S_CONVERTER_FCAT.slnk | 54 +-- ZA2X/TABL/ZEXCEL_S_CONVERTER_FIL.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_CONVERTER_LAYO.slnk | 12 +- ZA2X/TABL/ZEXCEL_S_CONVERTER_OPTION.slnk | 8 +- ZA2X/TABL/ZEXCEL_S_CONV_FIELDCATALOG.slnk | 27 ++ ZA2X/TABL/ZEXCEL_S_CONV_SETTINGS.slnk | 6 + ZA2X/TABL/ZEXCEL_S_CSTYLEX_ALIGNMENT.slnk | 18 +- ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDER.slnk | 18 +- ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDERS.slnk | 92 ++-- ZA2X/TABL/ZEXCEL_S_CSTYLEX_COLOR.slnk | 14 +- ZA2X/TABL/ZEXCEL_S_CSTYLEX_COMPLETE.slnk | 184 +++---- ZA2X/TABL/ZEXCEL_S_CSTYLEX_FONT.slnk | 34 +- ZA2X/TABL/ZEXCEL_S_CSTYLEX_NUMBER_FORMAT.slnk | 8 +- ZA2X/TABL/ZEXCEL_S_CSTYLEX_PROTECTION.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_CSTYLE_ALIGNMENT.slnk | 18 +- ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDER.slnk | 18 +- ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDERS.slnk | 92 ++-- ZA2X/TABL/ZEXCEL_S_CSTYLE_COMPLETE.slnk | 184 +++---- ZA2X/TABL/ZEXCEL_S_CSTYLE_FONT.slnk | 34 +- ZA2X/TABL/ZEXCEL_S_CSTYLE_NUMBER_FORMAT.slnk | 8 +- ZA2X/TABL/ZEXCEL_S_CSTYLE_PROTECTION.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk | 26 +- ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk | 239 +++++----- ZA2X/TABL/ZEXCEL_S_SHEET_STYLE.slnk | 8 +- ZA2X/TABL/ZEXCEL_S_STYLEMAPPING.slnk | 374 ++++++++------- ZA2X/TABL/ZEXCEL_S_STYLES_COND_MAPPING.slnk | 6 +- ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk | 18 +- ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk | 70 +-- ZA2X/TABL/ZEXCEL_S_STYLE_COLOR.slnk | 6 +- ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk | 8 +- ZA2X/TABL/ZEXCEL_S_STYLE_PROTECTION.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk | 10 +- ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk | 18 +- ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk | 10 +- ZA2X/TTYP/ZEXCEL_T_AUTOFILTER_VALUES.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_CONVERTER_COL.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_CONVERTER_FCAT.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_CONVERTER_FIL.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_CONVERTER_LAYO.slnk | 2 + ZA2X/TTYP/ZEXCEL_T_CONV_FIELDCATALOG.slnk | 2 + ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_SHEET_STYLE.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING1.slnk | 6 +- ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING2.slnk | 6 +- ZA2X/TTYP/ZEXCEL_T_STYLES_COND_MAPPING.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_STYLE_COLOR_ARGB.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk | 6 +- ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk | 10 +- ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_STYLE_PROTECTION.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk | 4 +- ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk | 4 +- 237 files changed, 2594 insertions(+), 3599 deletions(-) create mode 100644 ZA2X/DEVC/ZABAP2XLSX.slnk rename ZA2X/DTEL/{DTEL_ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk => ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk} (99%) create mode 100644 ZA2X/TABL/ZEXCEL_S_CONV_FIELDCATALOG.slnk create mode 100644 ZA2X/TABL/ZEXCEL_S_CONV_SETTINGS.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_CONVERTER_LAYO.slnk create mode 100644 ZA2X/TTYP/ZEXCEL_T_CONV_FIELDCATALOG.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTER.slnk b/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTER.slnk index 89704e5..8aab299 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTER.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTER.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -15,7 +15,7 @@ method CONSTRUCTOR. worksheet = io_sheet. -endmethod. + endmethod. @@ -25,7 +25,7 @@ endmethod. rs_area = filter_area. -endmethod. + endmethod. @@ -49,7 +49,7 @@ endmethod. CONCATENATE l_col_start_c l_row_start_c ':' l_col_end_c l_row_end_c INTO r_range. -endmethod. + endmethod. @@ -76,7 +76,7 @@ endmethod. CONCATENATE r_ref '!$' l_col_start_c '$' l_row_start_c ':$' l_col_end_c '$' l_row_end_c INTO r_ref. -endmethod. + endmethod. @@ -84,7 +84,7 @@ endmethod. rt_filter = values. -endmethod. + endmethod. @@ -92,7 +92,7 @@ endmethod. filter_area = is_area. -endmethod. + endmethod. @@ -108,7 +108,7 @@ endmethod. * Now we need to be sure we don't get the same value again. DELETE ADJACENT DUPLICATES FROM values COMPARING column value. -endmethod. + endmethod. @@ -118,7 +118,7 @@ endmethod. values = it_values. DELETE ADJACENT DUPLICATES FROM values COMPARING column value. -endmethod. + endmethod. method VALIDATE_AREA. @@ -159,6 +159,6 @@ endmethod. IF filter_area-col_start > filter_area-col_end. filter_area-col_start = filter_area-col_end. ENDIF. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk b/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk index 96400f0..1056ba3 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -21,7 +21,7 @@ TYPES: BEGIN OF ts_objects, - METHOD add. + method ADD. DATA: ls_autofilters TYPE ts_objects, l_guid TYPE uuid. l_guid = io_sheet->get_guid( ) . @@ -36,14 +36,14 @@ TYPES: BEGIN OF ts_objects, ls_autofilters-sheet_guid = l_guid. INSERT ls_autofilters INTO TABLE autofilters . ENDIF. -ENDMETHOD. + endmethod. method CLEAR. REFRESH autofilters. -endmethod. + endmethod. @@ -59,7 +59,7 @@ endmethod. CLEAR ro_autofilter. ENDIF. -endmethod. + endmethod. @@ -67,7 +67,7 @@ endmethod. IF autofilters IS INITIAL. r_empty = abap_true. ENDIF. -endmethod. + endmethod. @@ -76,12 +76,12 @@ endmethod. DELETE autofilters WHERE sheet_guid = i_sheet_guid. -endmethod. + endmethod. method SIZE. DESCRIBE TABLE autofilters LINES r_size. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER.slnk b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER.slnk index d6dc26d..33c0bbb 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER.slnk @@ -1,12 +1,12 @@ - - - - - @@ -82,15 +82,6 @@ TYPES: BEGIN OF ts_color_styles, *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - - - - diff --git a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_ALV_GRID.slnk b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_ALV_GRID.slnk index 71bb2b1..fbc965f 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_ALV_GRID.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_ALV_GRID.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -9,8 +9,8 @@ *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - + + method ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. diff --git a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT.slnk b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT.slnk index e1d7816..45ace47 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -9,9 +9,9 @@ *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - + + + method GET_TABLE. DATA: lo_object TYPE REF TO object, ls_seoclass TYPE seoclass, @@ -35,6 +35,6 @@ value = ro_data. ENDIF. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_EX.slnk b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_EX.slnk index a6a7ca6..442fc90 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_EX.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_EX.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -9,8 +9,8 @@ *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - + + METHOD ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. diff --git a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_WD.slnk b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_WD.slnk index 8a377e6..f7ce9c0 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_WD.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_RESULT_WD.slnk @@ -46,8 +46,6 @@ ENDMETHOD. CLEAR: es_layout, et_fieldcatalog. - break rturnheim. - IF lo_result IS BOUND. lo_data = get_table( io_object = lo_result->r_model->r_data ). IF lo_data IS BOUND. diff --git a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_SALV_TABLE.slnk b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_SALV_TABLE.slnk index 50e92e4..a39d4dc 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_SALV_TABLE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CONVERTER_SALV_TABLE.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -9,8 +9,8 @@ *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - + + METHOD zif_excel_converter~can_convert_object. @@ -58,10 +58,10 @@ ENDMETHOD. ENDIF. ENDMETHOD. - - - - METHOD load_data. + + + + method LOAD_DATA. DATA: lo_columns TYPE REF TO cl_salv_columns_table, lo_aggregations TYPE REF TO cl_salv_aggregations, lo_sorts TYPE REF TO cl_salv_sorts, @@ -237,6 +237,6 @@ ENDMETHOD. wt_filt = cl_salv_controller_metadata=>get_lvc_filter( lo_filters ). ENDIF. -ENDMETHOD. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI.slnk b/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI.slnk index 9bb6669..36bf987 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI.slnk @@ -1,19 +1,5 @@ - - - class ZCL_EXCEL_CUSTOMUI definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_CUSTOMUI -*"* do not include other source files here!!! - protected section. -*"* protected components of class ZCL_EXCEL_CUSTOMUI -*"* do not include other source files here!!! - private section. -*"* private components of class ZCL_EXCEL_CUSTOMUI -*"* do not include other source files here!!! + + *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations diff --git a/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI_BUTTON.slnk b/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI_BUTTON.slnk index d292e70..f17b68e 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI_BUTTON.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_CUSTOMUI_BUTTON.slnk @@ -1,22 +1,6 @@ - - - - class ZCL_EXCEL_CUSTOMUI_BUTTON definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_CUSTOMUI_BUTTON -*"* do not include other source files here!!! - - interfaces ZIF_EXCEL_CUSTOMUI_ELEMENT . - protected section. -*"* protected components of class ZCL_EXCEL_CUSTOMUI_BUTTON -*"* do not include other source files here!!! - private section. -*"* private components of class ZCL_EXCEL_CUSTOMUI_BUTTON -*"* do not include other source files here!!! + + + *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations diff --git a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk index c0f56b4..5b144a3 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk @@ -1,59 +1,5 @@ - - - class ZCL_EXCEL_DATA_VALIDATION definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_DATA_VALIDATION -*"* do not include other source files here!!! - type-pools ABAP . - - data ERRORSTYLE type ZEXCEL_DATA_VAL_ERROR_STYLE . - data OPERATOR type ZEXCEL_DATA_VAL_OPERATOR . - data ALLOWBLANK type FLAG value 'X'. "#EC NOTEXT . - data CELL_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . - data CELL_COLUMN_TO type ZEXCEL_CELL_COLUMN_ALPHA . - data CELL_ROW type ZEXCEL_CELL_ROW . - data CELL_ROW_TO type ZEXCEL_CELL_ROW . - constants C_TYPE_CUSTOM type ZEXCEL_DATA_VAL_TYPE value 'custom'. "#EC NOTEXT - constants C_TYPE_LIST type ZEXCEL_DATA_VAL_TYPE value 'list'. "#EC NOTEXT - data SHOWERRORMESSAGE type FLAG value 'X'. "#EC NOTEXT . - data SHOWINPUTMESSAGE type FLAG value 'X'. "#EC NOTEXT . - data TYPE type ZEXCEL_DATA_VAL_TYPE . - data FORMULA1 type ZEXCEL_VALIDATION_FORMULA1 . - data FORMULA2 type ZEXCEL_VALIDATION_FORMULA1 . - constants C_TYPE_NONE type ZEXCEL_DATA_VAL_TYPE value 'none'. "#EC NOTEXT - constants C_TYPE_DATE type ZEXCEL_DATA_VAL_TYPE value 'date'. "#EC NOTEXT - constants C_TYPE_DECIMAL type ZEXCEL_DATA_VAL_TYPE value 'decimal'. "#EC NOTEXT - constants C_TYPE_TEXTLENGTH type ZEXCEL_DATA_VAL_TYPE value 'textLength'. "#EC NOTEXT - constants C_TYPE_TIME type ZEXCEL_DATA_VAL_TYPE value 'time'. "#EC NOTEXT - constants C_TYPE_WHOLE type ZEXCEL_DATA_VAL_TYPE value 'whole'. "#EC NOTEXT - constants C_STYLE_STOP type ZEXCEL_DATA_VAL_ERROR_STYLE value 'stop'. "#EC NOTEXT - constants C_STYLE_WARNING type ZEXCEL_DATA_VAL_ERROR_STYLE value 'warning'. "#EC NOTEXT - constants C_STYLE_INFORMATION type ZEXCEL_DATA_VAL_ERROR_STYLE value 'information'. "#EC NOTEXT - constants C_OPERATOR_BETWEEN type ZEXCEL_DATA_VAL_OPERATOR value 'between'. "#EC NOTEXT - constants C_OPERATOR_EQUAL type ZEXCEL_DATA_VAL_OPERATOR value 'equal'. "#EC NOTEXT - constants C_OPERATOR_GREATERTHAN type ZEXCEL_DATA_VAL_OPERATOR value 'greaterThan'. "#EC NOTEXT - constants C_OPERATOR_GREATERTHANOREQUAL type ZEXCEL_DATA_VAL_OPERATOR value 'greaterThanOrEqual'. "#EC NOTEXT - constants C_OPERATOR_LESSTHAN type ZEXCEL_DATA_VAL_OPERATOR value 'lessThan'. "#EC NOTEXT - constants C_OPERATOR_LESSTHANOREQUAL type ZEXCEL_DATA_VAL_OPERATOR value 'lessThanOrEqual'. "#EC NOTEXT - constants C_OPERATOR_NOTBETWEEN type ZEXCEL_DATA_VAL_OPERATOR value 'notBetween'. "#EC NOTEXT - constants C_OPERATOR_NOTEQUAL type ZEXCEL_DATA_VAL_OPERATOR value 'notEqual'. "#EC NOTEXT - data SHOWDROPDOWN type FLAG . - data ERRORTITLE type STRING . - data ERROR type STRING . - data PROMPTTITLE type STRING . - data PROMPT type STRING . - - methods CONSTRUCTOR . - *"* protected components of class ZCL_EXCEL_DATA_VALIDATION -*"* do not include other source files here!!! -protected section. - private section. -*"* private components of class ZCL_EXCEL_DATA_VALIDATION -*"* do not include other source files here!!! + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -62,48 +8,46 @@ protected section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - METHOD constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. " Initialise instance variables formula1 = ''. formula2 = ''. @@ -121,7 +65,6 @@ protected section. * inizialize dimension range cell_row = 1. cell_column = 'A'. -ENDMETHOD. - + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk index 8d2d302..5ddc8e5 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATIONS.slnk @@ -1,40 +1,5 @@ - - - class ZCL_EXCEL_DATA_VALIDATIONS definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_DATA_VALIDATIONS -*"* do not include other source files here!!! -public section. - type-pools ABAP . - - methods ADD - importing - !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . - methods CLEAR . - methods CONSTRUCTOR . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IP_DATA_VALIDATION type ref to ZCL_EXCEL_DATA_VALIDATION . - methods SIZE - returning - value(EP_SIZE) type I . - *"* protected components of class ZCL_EXCEL_DATA_VALIDATIONS -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_DATA_VALIDATIONS -*"* do not include other source files here!!! -private section. - - data DATA_VALIDATIONS type ref to CL_OBJECT_COLLECTION . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -45,47 +10,47 @@ private section. *"* in the implementation part of the class ABAP - - - + + + method ADD. data_validations->add( ip_data_validation ). -endmethod. + endmethod. - + method CLEAR. data_validations->clear( ). -endmethod. + endmethod. - + method CONSTRUCTOR. CREATE OBJECT data_validations. -endmethod. + endmethod. - - + + method GET_ITERATOR. eo_iterator ?= data_validations->if_object_collection~get_iterator( ). -endmethod. + endmethod. - - + + method IS_EMPTY. is_empty = data_validations->if_object_collection~is_empty( ). -endmethod. + endmethod. - - + + method REMOVE. data_validations->remove( ip_data_validation ). -endmethod. + endmethod. - - + + method SIZE. ep_size = data_validations->if_object_collection~size( ). -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk index 74679a6..2c3756d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk @@ -1,54 +1,5 @@ - - - class ZCL_EXCEL_DRAWINGS definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_DRAWINGS -*"* do not include other source files here!!! - - data TYPE type ZEXCEL_DRAWING_TYPE read-only value 'IMAGE'. "#EC NOTEXT . - - methods ADD - importing - !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . - methods INCLUDE - importing - !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . - methods CLEAR . - methods CONSTRUCTOR - importing - !IP_TYPE type ZEXCEL_DRAWING_TYPE . - methods GET - importing - !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET - returning - value(EO_DRAWING) type ref to ZCL_EXCEL_DRAWING . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . - methods SIZE - returning - value(EP_SIZE) type I . - methods GET_TYPE - returning - value(RP_TYPE) type ZEXCEL_DRAWING_TYPE . - *"* protected components of class ZCL_EXCEL_DRAWINGS -*"* do not include other source files here!!! -protected section. - private section. -*"* private components of class ZCL_EXCEL_DRAWINGS -*"* do not include other source files here!!! - - data DRAWINGS type ref to CL_OBJECT_COLLECTION . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -68,13 +19,13 @@ protected section. lv_index = drawings->if_object_collection~size( ). ip_drawing->create_media_name( ip_index = lv_index ). -endmethod. + endmethod. method CLEAR. drawings->clear( ). -endmethod. + endmethod. @@ -83,7 +34,7 @@ endmethod. CREATE OBJECT drawings. type = ip_type. -endmethod. + endmethod. @@ -93,46 +44,46 @@ endmethod. DATA lv_index TYPE i. lv_index = ip_index. eo_drawing ?= drawings->if_object_collection~get( lv_index ). -endmethod. + endmethod. method GET_ITERATOR. eo_iterator ?= drawings->if_object_collection~get_iterator( ). -endmethod. + endmethod. method GET_TYPE. rp_type = me->type. -endmethod. + endmethod. method INCLUDE. drawings->add( ip_drawing ). -endmethod. + endmethod. method IS_EMPTY. is_empty = drawings->if_object_collection~is_empty( ). -endmethod. + endmethod. method REMOVE. drawings->remove( ip_drawing ). -endmethod. + endmethod. method SIZE. ep_size = drawings->if_object_collection~size( ). -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_GRAPH.slnk b/ZA2X/CLAS/ZCL_EXCEL_GRAPH.slnk index d35cf21..368b72a 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_GRAPH.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_GRAPH.slnk @@ -1,31 +1,31 @@ - - - - *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type @@ -39,245 +39,245 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk index bb3187c..51d1fe2 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk @@ -1,39 +1,6 @@ - - - - class ZCL_EXCEL_GRAPH_BARS definition - public - inheriting from ZCL_EXCEL_GRAPH - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_GRAPH_BARS -*"* do not include other source files here!!! - - types: - BEGIN OF s_ax, + + + *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations @@ -127,11 +31,11 @@ public section. *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - @@ -164,7 +68,7 @@ public section. - METHOD create_ax. + method CREATE_AX. DATA ls_ax TYPE s_ax. ls_ax-type = ip_type. @@ -309,42 +213,42 @@ public section. APPEND ls_ax TO me->axes. sort me->axes by axid ascending. -ENDMETHOD. + endmethod. - METHOD set_show_cat_name. + method SET_SHOW_CAT_NAME. ns_showcatnameval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_legend_key. + method SET_SHOW_LEGEND_KEY. ns_showlegendkeyval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_percent. + method SET_SHOW_PERCENT. ns_showpercentval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_ser_name. + method SET_SHOW_SER_NAME. ns_showsernameval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_values. + method SET_SHOW_VALUES. ns_showvalval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_varycolor. + method SET_VARYCOLOR. ns_varycolorsval = ip_value. -ENDMETHOD. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_LINE.slnk b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_LINE.slnk index 56ca13c..268b6ac 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_LINE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_LINE.slnk @@ -1,39 +1,6 @@ - - - - class ZCL_EXCEL_GRAPH_LINE definition - public - inheriting from ZCL_EXCEL_GRAPH - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_GRAPH_LINE -*"* do not include other source files here!!! - - types: - BEGIN OF s_ax, + + + *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations @@ -127,11 +31,11 @@ public section. *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - @@ -164,7 +68,7 @@ public section. - METHOD create_ax. + method CREATE_AX. DATA ls_ax TYPE s_ax. ls_ax-type = ip_type. @@ -309,42 +213,42 @@ public section. APPEND ls_ax TO me->axes. SORT me->axes BY axid ASCENDING. -ENDMETHOD. + endmethod. - METHOD SET_SHOW_CAT_NAME. + method SET_SHOW_CAT_NAME. ns_showcatnameval = ip_value. -ENDMETHOD. + endmethod. - METHOD SET_SHOW_LEGEND_KEY. + method SET_SHOW_LEGEND_KEY. ns_showlegendkeyval = ip_value. -ENDMETHOD. + endmethod. - METHOD SET_SHOW_PERCENT. + method SET_SHOW_PERCENT. ns_showpercentval = ip_value. -ENDMETHOD. + endmethod. - METHOD SET_SHOW_SER_NAME. + method SET_SHOW_SER_NAME. ns_showsernameval = ip_value. -ENDMETHOD. + endmethod. - METHOD SET_SHOW_VALUES. + method SET_SHOW_VALUES. ns_showvalval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_varycolor. + method SET_VARYCOLOR. ns_varycolorsval = ip_value. -ENDMETHOD. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_PIE.slnk b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_PIE.slnk index edc09e1..9a8f2b1 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_PIE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_PIE.slnk @@ -1,56 +1,5 @@ - - class ZCL_EXCEL_GRAPH_PIE definition - public - inheriting from ZCL_EXCEL_GRAPH - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_GRAPH_PIE -*"* do not include other source files here!!! - - data NS_LEGENDPOSVAL type STRING value 'r'. "#EC NOTEXT . - data NS_OVERLAYVAL type STRING value '0'. "#EC NOTEXT . - data NS_PPRRTL type STRING value '0'. "#EC NOTEXT . - data NS_ENDPARARPRLANG type STRING value 'it-IT'. "#EC NOTEXT . - data NS_VARYCOLORSVAL type STRING value '1'. "#EC NOTEXT . - data NS_FIRSTSLICEANGVAL type STRING value '0'. "#EC NOTEXT . - data NS_SHOWLEGENDKEYVAL type STRING value '0'. "#EC NOTEXT . - data NS_SHOWVALVAL type STRING value '0'. "#EC NOTEXT . - data NS_SHOWCATNAMEVAL type STRING value '0'. "#EC NOTEXT . - data NS_SHOWSERNAMEVAL type STRING value '0'. "#EC NOTEXT . - data NS_SHOWPERCENTVAL type STRING value '0'. "#EC NOTEXT . - data NS_SHOWBUBBLESIZEVAL type STRING value '0'. "#EC NOTEXT . - data NS_SHOWLEADERLINESVAL type STRING value '1'. "#EC NOTEXT . - - methods SET_SHOW_LEGEND_KEY - importing - !IP_VALUE type C . - methods SET_SHOW_VALUES - importing - !IP_VALUE type C . - methods SET_SHOW_CAT_NAME - importing - !IP_VALUE type C . - methods SET_SHOW_SER_NAME - importing - !IP_VALUE type C . - methods SET_SHOW_PERCENT - importing - !IP_VALUE type C . - methods SET_SHOW_LEADER_LINES - importing - !IP_VALUE type C . - methods SET_VARYCOLOR - importing - !IP_VALUE type C . - protected section. -*"* protected components of class ZCL_EXCEL_GRAPH_PIE -*"* do not include other source files here!!! - private section. -*"* private components of class ZCL_EXCEL_GRAPH_PIE -*"* do not include other source files here!!! + *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations @@ -75,44 +24,44 @@ public section. - METHOD set_show_cat_name. + method SET_SHOW_CAT_NAME. ns_showcatnameval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_leader_lines. + method SET_SHOW_LEADER_LINES. ns_showleaderlinesval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_legend_key. + method SET_SHOW_LEGEND_KEY. ns_showlegendkeyval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_percent. + method SET_SHOW_PERCENT. ns_showpercentval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_ser_name. + method SET_SHOW_SER_NAME. ns_showsernameval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_show_values. + method SET_SHOW_VALUES. ns_showvalval = ip_value. -ENDMETHOD. + endmethod. - METHOD set_varycolor. + method SET_VARYCOLOR. ns_varycolorsval = ip_value. -ENDMETHOD. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_HYPERLINK.slnk b/ZA2X/CLAS/ZCL_EXCEL_HYPERLINK.slnk index d25f621..22ed096 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_HYPERLINK.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_HYPERLINK.slnk @@ -1,60 +1,5 @@ - - - - class ZCL_EXCEL_HYPERLINK definition - public - final - create private . - -*"* public components of class ZCL_EXCEL_HYPERLINK -*"* do not include other source files here!!! -public section. - type-pools ABAP . - - class-methods CREATE_EXTERNAL_LINK - importing - !IV_URL type STRING - returning - value(OV_LINK) type ref to ZCL_EXCEL_HYPERLINK . - class-methods CREATE_INTERNAL_LINK - importing - !IV_LOCATION type STRING - returning - value(OV_LINK) type ref to ZCL_EXCEL_HYPERLINK . - methods IS_INTERNAL - returning - value(EV_RET) type ABAP_BOOL . - methods SET_CELL_REFERENCE - importing - !IP_COLUMN type SIMPLE - !IP_ROW type ZEXCEL_CELL_ROW - raising - ZCX_EXCEL . - methods GET_REF - returning - value(EV_REF) type STRING . - methods GET_URL - returning - value(EV_URL) type STRING . - *"* protected components of class ZCL_EXCEL_HYPERLINK -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_HYPERLINK -*"* do not include other source files here!!! -private section. - - data LOCATION type STRING . - data CELL_REFERENCE type STRING . - data INTERNAL type ABAP_BOOL . - data COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . - data ROW type ZEXCEL_CELL_ROW . - - class-methods CREATE - importing - !IV_URL type STRING - !IV_INTERNAL type ABAP_BOOL - returning - value(OV_LINK) type ref to ZCL_EXCEL_HYPERLINK . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -65,15 +10,15 @@ private section. *"* in the implementation part of the class ABAP - - - - - - - - - + + + + + + + + + method CREATE. data: lo_hyperlink type REF TO zcl_excel_hyperlink. @@ -83,52 +28,52 @@ private section. lo_hyperlink->internal = iv_internal. ov_link = lo_hyperlink. -endmethod. + endmethod. - - - + + + method CREATE_EXTERNAL_LINK. ov_link = zcl_excel_hyperlink=>create( iv_url = iv_url iv_internal = abap_false ). -endmethod. + endmethod. - - - + + + method CREATE_INTERNAL_LINK. ov_link = zcl_excel_hyperlink=>create( iv_url = iv_location iv_internal = abap_true ). -endmethod. + endmethod. - - + + method GET_REF. ev_ref = row. CONDENSE ev_ref. CONCATENATE column ev_ref INTO ev_ref. -endmethod. + endmethod. - - + + method GET_URL. ev_url = me->location. -endmethod. + endmethod. - - + + method IS_INTERNAL. ev_ret = me->internal. -endmethod. + endmethod. - - - - + + + + method SET_CELL_REFERENCE. me->column = zcl_excel_common=>convert_column2alpha( ip_column ). " issue #155 - less restrictive typing for ip_column me->row = ip_row. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_LEGACY_PALETTE.slnk b/ZA2X/CLAS/ZCL_EXCEL_LEGACY_PALETTE.slnk index 5b43d04..143b6c7 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_LEGACY_PALETTE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_LEGACY_PALETTE.slnk @@ -1,41 +1,5 @@ - - - class ZCL_EXCEL_LEGACY_PALETTE definition - public - create public . - -public section. -*"* public components of class ZCL_EXCEL_LEGACY_PALETTE -*"* do not include other source files here!!! - type-pools ABAP . - - methods CONSTRUCTOR . - methods IS_MODIFIED - returning - value(EP_MODIFIED) type ABAP_BOOL . - methods GET_COLOR - importing - !IP_INDEX type I - returning - value(EP_COLOR) type ZEXCEL_STYLE_COLOR_ARGB - raising - ZCX_EXCEL . - methods GET_COLORS - returning - value(EP_COLORS) type ZEXCEL_T_STYLE_COLOR_ARGB . - methods SET_COLOR - importing - !IP_INDEX type I - !IP_COLOR type ZEXCEL_STYLE_COLOR_ARGB . - protected section. -*"* protected components of class ZCL_EXCEL_LEGACY_PALETTE -*"* do not include other source files here!!! - private section. -*"* private components of class ZCL_EXCEL_LEGACY_PALETTE -*"* do not include other source files here!!! - - data MODIFIED type ABAP_BOOL value ABAP_FALSE. "#EC NOTEXT . - data COLORS type ZEXCEL_T_STYLE_COLOR_ARGB . + + *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations @@ -44,14 +8,12 @@ public section. *"* components in the private section *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - ABAP - - - - METHOD constructor. + + + + method CONSTRUCTOR. " default Excel palette based on " http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.indexedcolors.aspx @@ -126,14 +88,13 @@ public section. APPEND '00333399' TO colors. APPEND '00333333' TO colors. -ENDMETHOD. - + endmethod. - - - - - METHOD get_color. + + + + + method GET_COLOR. DATA: lv_index type i. lv_index = ip_index + 1. @@ -143,27 +104,24 @@ ENDMETHOD. EXPORTING error = 'Invalid color index'. ENDIF. -ENDMETHOD. - + endmethod. - - - METHOD get_colors. + + + method GET_COLORS. ep_colors = colors. -ENDMETHOD. - + endmethod. - - - METHOD is_modified. + + + method IS_MODIFIED. ep_modified = modified. -ENDMETHOD. - + endmethod. - - - - METHOD set_color. + + + + method SET_COLOR. DATA: lv_index TYPE i. FIELD-SYMBOLS: <lv_color> LIKE LINE OF colors. @@ -181,7 +139,6 @@ ENDMETHOD. <lv_color> = ip_color. ENDIF. -ENDMETHOD. - + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk b/ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk index 22707b7..dd4a028 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_RANGES.slnk @@ -1,44 +1,5 @@ - - - class ZCL_EXCEL_RANGES definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_RANGES -*"* do not include other source files here!!! -public section. - - methods ADD - importing - !IP_RANGE type ref to ZCL_EXCEL_RANGE . - methods CLEAR . - methods CONSTRUCTOR . - methods GET - importing - !IP_INDEX type I - returning - value(EO_RANGE) type ref to ZCL_EXCEL_RANGE . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IP_RANGE type ref to ZCL_EXCEL_RANGE . - methods SIZE - returning - value(EP_SIZE) type I . - *"* protected components of class ZABAP_EXCEL_WORKSHEETS -*"* do not include other source files here!!! -protected section. - *"* private components of class ZABAP_EXCEL_RANGES -*"* do not include other source files here!!! -private section. - - data RANGES type ref to CL_OBJECT_COLLECTION . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -47,55 +8,55 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - + + + method ADD. ranges->add( ip_range ). -endmethod. + endmethod. - + method CLEAR. ranges->clear( ). -endmethod. + endmethod. - + method CONSTRUCTOR. CREATE OBJECT ranges. -endmethod. + endmethod. - - - + + + method GET. eo_range ?= ranges->if_object_collection~get( ip_index ). -endmethod. + endmethod. - - + + method GET_ITERATOR. eo_iterator ?= ranges->if_object_collection~get_iterator( ). -endmethod. + endmethod. - - + + method IS_EMPTY. is_empty = ranges->if_object_collection~is_empty( ). -endmethod. + endmethod. - - + + method REMOVE. ranges->remove( ip_range ). -endmethod. + endmethod. - - + + method SIZE. ep_size = ranges->if_object_collection~size( ). -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index d0acdb0..61c98f7 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk index bfe1205..9769451 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk @@ -1,6 +1,6 @@ - - + - - - - - - - - + + + + + - - - - + + + + method FILL_CELL_FROM_ATTRIBUTES. while io_reader->node_type ne c_end_of_stream. @@ -403,9 +403,9 @@ endclass. "lcl_test IMPLEMENTATION endmethod. - - - + + + method GET_CELL_COORD. zcl_excel_common=>convert_columnrow2column_a_row( @@ -418,10 +418,10 @@ endmethod. endmethod. - - - - + + + + method GET_SHARED_STRING. data: lv_tabix type i, lv_error type string. @@ -435,10 +435,10 @@ endmethod. endif. endmethod. - - - - + + + + method GET_STYLE. data: lv_tabix type i, @@ -463,10 +463,10 @@ endmethod. endmethod. - - - - + + + + method GET_SXML_READER. data: lv_xml type xstring. @@ -499,9 +499,9 @@ endmethod. endmethod. - - - + + + method PUT_CELL_TO_WORKSHEET. check is_cell-value is not initial or is_cell-formula is not initial @@ -516,9 +516,9 @@ endmethod. ip_style = is_cell-style. endmethod. - - - + + + method READ_SHARED_STRINGS. while io_reader->node_type ne c_end_of_stream. @@ -531,10 +531,10 @@ endmethod. endmethod. - - - - + + + + method READ_WORKSHEET_DATA. data: ls_cell type t_cell. @@ -575,10 +575,10 @@ endmethod. endmethod. - - - - + + + + method SKIP_TO. data: lv_error type string. @@ -598,4 +598,4 @@ endmethod. endmethod. - \ No newline at end of file + diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_XLSM.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_XLSM.slnk index f4d27c3..8ca036f 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_XLSM.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_XLSM.slnk @@ -1,30 +1,5 @@ - - class ZCL_EXCEL_READER_XLSM definition - public - inheriting from ZCL_EXCEL_READER_2007 - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_READER_XLSM -*"* do not include other source files here!!! - protected section. -*"* protected components of class ZCL_EXCEL_READER_XLSM -*"* do not include other source files here!!! - - methods LOAD_WORKBOOK - redefinition . - methods LOAD_WORKSHEET - redefinition . - private section. -*"* private components of class ZCL_EXCEL_READER_XLSM -*"* do not include other source files here!!! - - methods LOAD_VBAPROJECT - importing - !IP_PATH type STRING - !IP_EXCEL type ref to ZCL_EXCEL . + *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations @@ -34,24 +9,24 @@ public section. *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - + + METHOD load_vbaproject. - DATA lv_content TYPE xstring. + DATA lv_content TYPE xstring. - lv_content = me->get_from_zip_archive( ip_path ). + lv_content = me->get_from_zip_archive( ip_path ). - ip_excel->zif_excel_book_vba_project~set_vbaproject( lv_content ). + ip_excel->zif_excel_book_vba_project~set_vbaproject( lv_content ). -ENDMETHOD. + ENDMETHOD. - METHOD load_workbook. + method LOAD_WORKBOOK. super->load_workbook( EXPORTING iv_workbook_full_filename = iv_workbook_full_filename io_excel = io_excel ). @@ -121,10 +96,10 @@ ENDMETHOD. io_excel->zif_excel_book_vba_project~set_codename_pr( workbookpr-codename ). ENDIF. -ENDMETHOD. + endmethod. - METHOD load_worksheet. + method LOAD_WORKSHEET. super->load_worksheet( EXPORTING ip_path = ip_path io_worksheet = io_worksheet ). @@ -156,6 +131,6 @@ ENDMETHOD. io_worksheet->zif_excel_sheet_vba_project~set_codename_pr( sheetpr-codename ). ENDIF. -ENDMETHOD. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk b/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk index 7e3a19d..e1ed664 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_SHEET_SETUP.slnk @@ -1,164 +1,5 @@ - - - class ZCL_EXCEL_SHEET_SETUP definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_SHEET_SETUP -*"* do not include other source files here!!! - type-pools ABAP . - - data BLACK_AND_WHITE type FLAG . - data CELL_COMMENTS type STRINGVAL . - data COPIES type INT2 . - constants C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT - constants C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT - constants C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT - constants C_CC_AS_DISPLAYED type STRING value 'asDisplayed'. "#EC NOTEXT - constants C_CC_AT_END type STRING value 'atEnd'. "#EC NOTEXT - constants C_CC_NONE type STRING value 'none'. "#EC NOTEXT - constants C_ORD_DOWNTHENOVER type STRING value 'downThenOver'. "#EC NOTEXT - constants C_ORD_OVERTHENDOWN type STRING value 'overThenDown'. "#EC NOTEXT - constants C_ORIENTATION_DEFAULT type ZEXCEL_SHEET_ORIENATATION value 'default'. "#EC NOTEXT - constants C_ORIENTATION_LANDSCAPE type ZEXCEL_SHEET_ORIENATATION value 'landscape'. "#EC NOTEXT - constants C_ORIENTATION_PORTRAIT type ZEXCEL_SHEET_ORIENATATION value 'portrait'. "#EC NOTEXT - constants C_PAPERSIZE_6_3_4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 38. "#EC NOTEXT - constants C_PAPERSIZE_A2_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 64. "#EC NOTEXT - constants C_PAPERSIZE_A3 type ZEXCEL_SHEET_PAPER_SIZE value 8. "#EC NOTEXT - constants C_PAPERSIZE_A3_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 61. "#EC NOTEXT - constants C_PAPERSIZE_A3_EXTRA_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 66. "#EC NOTEXT - constants C_PAPERSIZE_A3_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 65. "#EC NOTEXT - constants C_PAPERSIZE_A4 type ZEXCEL_SHEET_PAPER_SIZE value 9. "#EC NOTEXT - constants C_PAPERSIZE_A4_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 51. "#EC NOTEXT - constants C_PAPERSIZE_A4_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 58. "#EC NOTEXT - constants C_PAPERSIZE_A4_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 10. "#EC NOTEXT - constants C_PAPERSIZE_A4_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 53. "#EC NOTEXT - constants C_PAPERSIZE_A5 type ZEXCEL_SHEET_PAPER_SIZE value 11. "#EC NOTEXT - constants C_PAPERSIZE_A5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 62. "#EC NOTEXT - constants C_PAPERSIZE_A5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 59. "#EC NOTEXT - constants C_PAPERSIZE_B4 type ZEXCEL_SHEET_PAPER_SIZE value 12. "#EC NOTEXT - constants C_PAPERSIZE_B4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 33. "#EC NOTEXT - constants C_PAPERSIZE_B5 type ZEXCEL_SHEET_PAPER_SIZE value 13. "#EC NOTEXT - constants C_PAPERSIZE_B5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 34. "#EC NOTEXT - constants C_PAPERSIZE_B6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 35. "#EC NOTEXT - constants C_PAPERSIZE_C type ZEXCEL_SHEET_PAPER_SIZE value 24. "#EC NOTEXT - constants C_PAPERSIZE_C3_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 29. "#EC NOTEXT - constants C_PAPERSIZE_C4_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 30. "#EC NOTEXT - constants C_PAPERSIZE_C5_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 28. "#EC NOTEXT - constants C_PAPERSIZE_C65_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 32. "#EC NOTEXT - constants C_PAPERSIZE_C6_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 31. "#EC NOTEXT - constants C_PAPERSIZE_D type ZEXCEL_SHEET_PAPER_SIZE value 25. "#EC NOTEXT - constants C_PAPERSIZE_DE_LEG_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 41. "#EC NOTEXT - constants C_PAPERSIZE_DE_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 40. "#EC NOTEXT - constants C_PAPERSIZE_DL_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 27. "#EC NOTEXT - constants C_PAPERSIZE_E type ZEXCEL_SHEET_PAPER_SIZE value 26. "#EC NOTEXT - constants C_PAPERSIZE_EXECUTIVE type ZEXCEL_SHEET_PAPER_SIZE value 7. "#EC NOTEXT - constants C_PAPERSIZE_FOLIO type ZEXCEL_SHEET_PAPER_SIZE value 14. "#EC NOTEXT - constants C_PAPERSIZE_INVITE_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 47. "#EC NOTEXT - constants C_PAPERSIZE_ISO_B4 type ZEXCEL_SHEET_PAPER_SIZE value 42. "#EC NOTEXT - constants C_PAPERSIZE_ISO_B5_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 63. "#EC NOTEXT - constants C_PAPERSIZE_ITALY_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 36. "#EC NOTEXT - constants C_PAPERSIZE_JIS_B5_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 60. "#EC NOTEXT - constants C_PAPERSIZE_JPN_DBL_POSTCARD type ZEXCEL_SHEET_PAPER_SIZE value 43. "#EC NOTEXT - constants C_PAPERSIZE_LEDGER type ZEXCEL_SHEET_PAPER_SIZE value 4. "#EC NOTEXT - constants C_PAPERSIZE_LEGAL type ZEXCEL_SHEET_PAPER_SIZE value 5. "#EC NOTEXT - constants C_PAPERSIZE_LEGAL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 49. "#EC NOTEXT - constants C_PAPERSIZE_LETTER type ZEXCEL_SHEET_PAPER_SIZE value 1. "#EC NOTEXT - constants C_PAPERSIZE_LETTER_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 48. "#EC NOTEXT - constants C_PAPERSIZE_LETTER_EXTV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 54. "#EC NOTEXT - constants C_PAPERSIZE_LETTER_PLUS_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 57. "#EC NOTEXT - constants C_PAPERSIZE_LETTER_SMALL type ZEXCEL_SHEET_PAPER_SIZE value 2. "#EC NOTEXT - constants C_PAPERSIZE_LETTER_TV_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 52. "#EC NOTEXT - constants C_PAPERSIZE_MONARCH_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 37. "#EC NOTEXT - constants C_PAPERSIZE_NO10_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 20. "#EC NOTEXT - constants C_PAPERSIZE_NO11_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 21. "#EC NOTEXT - constants C_PAPERSIZE_NO12_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 22. "#EC NOTEXT - constants C_PAPERSIZE_NO14_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 23. "#EC NOTEXT - constants C_PAPERSIZE_NO9_ENVELOPE type ZEXCEL_SHEET_PAPER_SIZE value 19. "#EC NOTEXT - constants C_PAPERSIZE_NOTE type ZEXCEL_SHEET_PAPER_SIZE value 18. "#EC NOTEXT - constants C_PAPERSIZE_QUARTO type ZEXCEL_SHEET_PAPER_SIZE value 15. "#EC NOTEXT - constants C_PAPERSIZE_STANDARD_1 type ZEXCEL_SHEET_PAPER_SIZE value 16. "#EC NOTEXT - constants C_PAPERSIZE_STANDARD_2 type ZEXCEL_SHEET_PAPER_SIZE value 17. "#EC NOTEXT - constants C_PAPERSIZE_STANDARD_PAPER_1 type ZEXCEL_SHEET_PAPER_SIZE value 44. "#EC NOTEXT - constants C_PAPERSIZE_STANDARD_PAPER_2 type ZEXCEL_SHEET_PAPER_SIZE value 45. "#EC NOTEXT - constants C_PAPERSIZE_STANDARD_PAPER_3 type ZEXCEL_SHEET_PAPER_SIZE value 46. "#EC NOTEXT - constants C_PAPERSIZE_STATEMENT type ZEXCEL_SHEET_PAPER_SIZE value 6. "#EC NOTEXT - constants C_PAPERSIZE_SUPERA_A4_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 55. "#EC NOTEXT - constants C_PAPERSIZE_SUPERB_A3_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 56. "#EC NOTEXT - constants C_PAPERSIZE_TABLOID type ZEXCEL_SHEET_PAPER_SIZE value 3. "#EC NOTEXT - constants C_PAPERSIZE_TABL_EXTRA_PAPER type ZEXCEL_SHEET_PAPER_SIZE value 50. "#EC NOTEXT - constants C_PAPERSIZE_US_STD_FANFOLD type ZEXCEL_SHEET_PAPER_SIZE value 39. "#EC NOTEXT - constants C_PE_BLANK type STRING value 'blank'. "#EC NOTEXT - constants C_PE_DASH type STRING value 'dash'. "#EC NOTEXT - constants C_PE_DISPLAYED type STRING value 'displayed'. "#EC NOTEXT - constants C_PE_NA type STRING value 'NA'. "#EC NOTEXT - data DIFF_ODDEVEN_HEADERFOOTER type FLAG . - data DRAFT type FLAG . - data ERRORS type STRINGVAL . - data EVEN_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . - data EVEN_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . - data FIRST_PAGE_NUMBER type INT2 . - data FIT_TO_HEIGHT type INT2 . - data FIT_TO_PAGE type FLAG . - data FIT_TO_WIDTH type INT2 . - data HORIZONTAL_CENTERED type FLAG . - data HORIZONTAL_DPI type INT2 . - data MARGIN_BOTTOM type ZEXCEL_DEC_8_2 . - data MARGIN_FOOTER type ZEXCEL_DEC_8_2 . - data MARGIN_HEADER type ZEXCEL_DEC_8_2 . - data MARGIN_LEFT type ZEXCEL_DEC_8_2 . - data MARGIN_RIGHT type ZEXCEL_DEC_8_2 . - data MARGIN_TOP type ZEXCEL_DEC_8_2 . - data ODD_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . - data ODD_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT . - data ORIENTATION type ZEXCEL_SHEET_ORIENATATION . - data PAGE_ORDER type STRING . - data PAPER_HEIGHT type STRING . - data PAPER_SIZE type INT2 . - data PAPER_WIDTH type STRING . - data SCALE type INT2 . - data USE_FIRST_PAGE_NUM type FLAG . - data USE_PRINTER_DEFAULTS type FLAG . - data VERTICAL_CENTERED type FLAG . - data VERTICAL_DPI type INT2 . - - methods CONSTRUCTOR . - methods SET_PAGE_MARGINS - importing - !IP_BOTTOM type FLOAT optional - !IP_FOOTER type FLOAT optional - !IP_HEADER type FLOAT optional - !IP_LEFT type FLOAT optional - !IP_RIGHT type FLOAT optional - !IP_TOP type FLOAT optional - !IP_UNIT type CSEQUENCE default 'in' . - methods SET_HEADER_FOOTER - importing - !IP_ODD_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional - !IP_ODD_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional - !IP_EVEN_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional - !IP_EVEN_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT optional . - methods GET_HEADER_FOOTER_STRING - exporting - !EP_ODD_HEADER type STRING - !EP_ODD_FOOTER type STRING - !EP_EVEN_HEADER type STRING - !EP_EVEN_FOOTER type STRING . - protected section. -*"* protected components of class ZCL_EXCEL_SHEET_SETUP -*"* do not include other source files here!!! - - methods PROCESS_HEADER_FOOTER - importing - !IP_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT - !IP_SIDE type STRING - returning - value(RV_PROCESSED_STRING) type STRING . - private section. -*"* private components of class ZCL_EXCEL_SHEET_SETUP -*"* do not include other source files here!!! + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -169,120 +10,120 @@ public section. *"* in the implementation part of the class ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. orientation = me->c_orientation_default. @@ -314,13 +155,13 @@ public section. use_first_page_num, use_printer_defaults, vertical_dpi. -endmethod. + endmethod. - - - - - + + + + + method GET_HEADER_FOOTER_STRING. * ---------------------------------------------------------------------- DATA: lc_marker_left(2) TYPE c VALUE '&L' @@ -405,13 +246,13 @@ endmethod. ENDIF. * ---------------------------------------------------------------------- -endmethod. + endmethod. - - - - - METHOD process_header_footer. + + + + + method PROCESS_HEADER_FOOTER. * ---------------------------------------------------------------------- * Only Basic font/text formatting possible: @@ -456,13 +297,13 @@ endmethod. ENDIF. * ---------------------------------------------------------------------- -ENDMETHOD. + endmethod. - - - - - + + + + + method SET_HEADER_FOOTER. * Only Basic font/text formatting possible: @@ -492,16 +333,16 @@ ENDMETHOD. ENDIF. -endmethod. + endmethod. - - - - - - - - + + + + + + + + method SET_PAGE_MARGINS. DATA: lv_coef TYPE f, lv_unit TYPE string. @@ -522,6 +363,6 @@ endmethod. IF ip_right IS SUPPLIED. margin_right = lv_coef * ip_right. ENDIF. IF ip_top IS SUPPLIED. margin_top = lv_coef * ip_top. ENDIF. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk index 4faacc4..69b0366 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk @@ -1,35 +1,5 @@ - - - class ZCL_EXCEL_STYLE definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_STYLE -*"* do not include other source files here!!! -public section. - - data FONT type ref to ZCL_EXCEL_STYLE_FONT . - data FILL type ref to ZCL_EXCEL_STYLE_FILL . - data BORDERS type ref to ZCL_EXCEL_STYLE_BORDERS . - data ALIGNMENT type ref to ZCL_EXCEL_STYLE_ALIGNMENT . - data NUMBER_FORMAT type ref to ZCL_EXCEL_STYLE_NUMBER_FORMAT . - data PROTECTION type ref to ZCL_EXCEL_STYLE_PROTECTION . - - methods CONSTRUCTOR - importing - !IP_GUID type ZEXCEL_CELL_STYLE optional . - methods GET_GUID - returning - value(EP_GUID) type ZEXCEL_CELL_STYLE . - *"* protected components of class ZABAP_EXCEL_STYLE -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_STYLE -*"* do not include other source files here!!! -private section. - - data GUID type ZEXCEL_CELL_STYLE . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -38,16 +8,16 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - - - - - METHOD constructor. + + + + + + + + + + method CONSTRUCTOR. CREATE OBJECT font. @@ -69,14 +39,14 @@ private section. ENDIF. * End of insertion # issue 139 - Dateretention of cellstyles -ENDMETHOD. + endmethod. - - + + method GET_GUID. ep_guid = me->guid. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk index 93a7155..5ab275c 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLES.slnk @@ -1,49 +1,5 @@ - - - class ZCL_EXCEL_STYLES definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_STYLES -*"* do not include other source files here!!! -public section. - - methods ADD - importing - !IP_STYLE type ref to ZCL_EXCEL_STYLE . - methods CLEAR . - methods CONSTRUCTOR . - methods GET - importing - !IP_INDEX type I - returning - value(EO_STYLE) type ref to ZCL_EXCEL_STYLE . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IP_STYLE type ref to ZCL_EXCEL_STYLE . - methods SIZE - returning - value(EP_SIZE) type I . - methods REGISTER_NEW_STYLE - importing - !IO_STYLE type ref to ZCL_EXCEL_STYLE - returning - value(EP_STYLE_CODE) type I . - *"* protected components of class ZABAP_EXCEL_WORKSHEETS -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_STYLES -*"* do not include other source files here!!! -private section. - - data STYLES type ref to CL_OBJECT_COLLECTION . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -52,78 +8,78 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - + + + method ADD. styles->add( ip_style ). -endmethod. + endmethod. - + method CLEAR. styles->clear( ). -endmethod. + endmethod. - + method CONSTRUCTOR. CREATE OBJECT styles. -endmethod. + endmethod. - - - + + + method GET. eo_style ?= styles->if_object_collection~get( ip_index ). -endmethod. + endmethod. - - + + method GET_ITERATOR. eo_iterator ?= styles->if_object_collection~get_iterator( ). -endmethod. + endmethod. - - + + method IS_EMPTY. is_empty = styles->if_object_collection~is_empty( ). -endmethod. + endmethod. - - - + + + method REGISTER_NEW_STYLE. me->add( io_style ). ep_style_code = me->size( ) - 1. "style count starts from 0 -endmethod. + endmethod. - - + + method REMOVE. styles->remove( ip_style ). -endmethod. + endmethod. - - + + method SIZE. ep_size = styles->if_object_collection~size( ). -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk index 438cde9..40810e0 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLES_CONDITIONAL.slnk @@ -1,44 +1,5 @@ - - - class ZCL_EXCEL_STYLES_CONDITIONAL definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_STYLES_CONDITIONAL -*"* do not include other source files here!!! -public section. - - methods ADD - importing - !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . - methods CLEAR . - methods CONSTRUCTOR . - methods GET - importing - !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET - returning - value(EO_STYLE_CONDITIONAL) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IP_STYLE_CONDITIONAL type ref to ZCL_EXCEL_STYLE_CONDITIONAL . - methods SIZE - returning - value(EP_SIZE) type I . - *"* protected components of class ZABAP_EXCEL_WORKSHEETS -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_STYLES_CONDITIONAL -*"* do not include other source files here!!! -private section. - - data STYLES_CONDITIONAL type ref to CL_OBJECT_COLLECTION . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -47,56 +8,56 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - + + + method ADD. styles_conditional->add( ip_style_conditional ). -endmethod. + endmethod. - + method CLEAR. styles_conditional->clear( ). -endmethod. + endmethod. - + method CONSTRUCTOR. CREATE OBJECT styles_conditional. -endmethod. + endmethod. - - - + + + method GET. DATA lv_index TYPE i. lv_index = ip_index. eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). -endmethod. + endmethod. - - + + method GET_ITERATOR. eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). -endmethod. + endmethod. - - + + method IS_EMPTY. is_empty = styles_conditional->if_object_collection~is_empty( ). -endmethod. + endmethod. - - + + method REMOVE. styles_conditional->remove( ip_style_conditional ). -endmethod. + endmethod. - - + + method SIZE. ep_size = styles_conditional->if_object_collection~size( ). -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk index 08f0125..b047f31 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_ALIGNMENT.slnk @@ -1,42 +1,5 @@ - - - class ZCL_EXCEL_STYLE_ALIGNMENT definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_STYLE_ALIGNMENT -*"* do not include other source files here!!! -public section. - type-pools ABAP . - - constants C_HORIZONTAL_GENERAL type ZEXCEL_ALIGNMENT value 'general'. "#EC NOTEXT - constants C_HORIZONTAL_LEFT type ZEXCEL_ALIGNMENT value 'left'. "#EC NOTEXT - constants C_HORIZONTAL_RIGHT type ZEXCEL_ALIGNMENT value 'right'. "#EC NOTEXT - constants C_HORIZONTAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT - constants C_HORIZONTAL_CENTER_CONTINUOUS type ZEXCEL_ALIGNMENT value 'centerContinuous'. "#EC NOTEXT - constants C_HORIZONTAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT - constants C_VERTICAL_BOTTOM type ZEXCEL_ALIGNMENT value 'bottom'. "#EC NOTEXT - constants C_VERTICAL_TOP type ZEXCEL_ALIGNMENT value 'top'. "#EC NOTEXT - constants C_VERTICAL_CENTER type ZEXCEL_ALIGNMENT value 'center'. "#EC NOTEXT - constants C_VERTICAL_JUSTIFY type ZEXCEL_ALIGNMENT value 'justify'. "#EC NOTEXT - data HORIZONTAL type ZEXCEL_ALIGNMENT . - data VERTICAL type ZEXCEL_ALIGNMENT . - data TEXTROTATION type ZEXCEL_TEXT_ROTATION value 0. "#EC NOTEXT . - data WRAPTEXT type FLAG . - data SHRINKTOFIT type FLAG . - data INDENT type ZEXCEL_INDENT value 0. "#EC NOTEXT . - - methods CONSTRUCTOR . - methods GET_STRUCTURE - returning - value(ES_ALIGNMENT) type ZEXCEL_S_STYLE_ALIGNMENT . - *"* protected components of class ZABAP_EXCEL_STYLE_FONT -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_STYLE_ALIGNMENT -*"* do not include other source files here!!! -private section. + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -47,32 +10,32 @@ private section. *"* in the implementation part of the class ABAP - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + method CONSTRUCTOR. horizontal = me->c_horizontal_general. vertical = me->c_vertical_bottom. wrapText = abap_false. shrinkToFit = abap_false. -endmethod. + endmethod. - - + + method GET_STRUCTURE. es_alignment-horizontal = me->horizontal. @@ -82,6 +45,6 @@ endmethod. es_alignment-shrinktofit = me->shrinktofit. es_alignment-indent = me->indent. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk index d46ae32..8cbfca2 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_BORDER.slnk @@ -1,38 +1,5 @@ - - - class ZCL_EXCEL_STYLE_BORDER definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_STYLE_BORDER -*"* do not include other source files here!!! - - data BORDER_STYLE type ZEXCEL_BORDER . - data BORDER_COLOR type ZEXCEL_S_STYLE_COLOR . - constants C_BORDER_NONE type ZEXCEL_BORDER value 'none'. "#EC NOTEXT - constants C_BORDER_DASHDOT type ZEXCEL_BORDER value 'dashDot'. "#EC NOTEXT - constants C_BORDER_DASHDOTDOT type ZEXCEL_BORDER value 'dashDotDot'. "#EC NOTEXT - constants C_BORDER_DASHED type ZEXCEL_BORDER value 'dashed'. "#EC NOTEXT - constants C_BORDER_DOTTED type ZEXCEL_BORDER value 'dotted'. "#EC NOTEXT - constants C_BORDER_DOUBLE type ZEXCEL_BORDER value 'double'. "#EC NOTEXT - constants C_BORDER_HAIR type ZEXCEL_BORDER value 'hair'. "#EC NOTEXT - constants C_BORDER_MEDIUM type ZEXCEL_BORDER value 'medium'. "#EC NOTEXT - constants C_BORDER_MEDIUMDASHDOT type ZEXCEL_BORDER value 'mediumDashDot'. "#EC NOTEXT - constants C_BORDER_MEDIUMDASHDOTDOT type ZEXCEL_BORDER value 'mediumDashDotDot'. "#EC NOTEXT - constants C_BORDER_MEDIUMDASHED type ZEXCEL_BORDER value 'mediumDashed'. "#EC NOTEXT - constants C_BORDER_SLANTDASHDOT type ZEXCEL_BORDER value 'slantDashDot'. "#EC NOTEXT - constants C_BORDER_THICK type ZEXCEL_BORDER value 'thick'. "#EC NOTEXT - constants C_BORDER_THIN type ZEXCEL_BORDER value 'thin'. "#EC NOTEXT - - methods CONSTRUCTOR . - *"* protected components of class ZABAP_EXCEL_STYLE_FONT -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_STYLE_BORDER -*"* do not include other source files here!!! -private section. + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -41,27 +8,27 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + method CONSTRUCTOR. border_style = zcl_excel_style_border=>c_border_none. border_color-theme = zcl_excel_style_color=>c_theme_not_set. border_color-indexed = zcl_excel_style_color=>c_indexed_not_set. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk index bbb1ab0..61a530f 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FONT.slnk @@ -1,59 +1,5 @@ - - - class ZCL_EXCEL_STYLE_FONT definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_STYLE_FONT -*"* do not include other source files here!!! - type-pools ABAP . - - data BOLD type FLAG . - data COLOR type ZEXCEL_S_STYLE_COLOR . - constants C_FAMILY_DECORATIVE type ZEXCEL_STYLE_FONT_FAMILY value 5. "#EC NOTEXT - constants C_FAMILY_MODERN type ZEXCEL_STYLE_FONT_FAMILY value 3. "#EC NOTEXT - constants C_FAMILY_NONE type ZEXCEL_STYLE_FONT_FAMILY value 0. "#EC NOTEXT - constants C_FAMILY_ROMAN type ZEXCEL_STYLE_FONT_FAMILY value 1. "#EC NOTEXT - constants C_FAMILY_SCRIPT type ZEXCEL_STYLE_FONT_FAMILY value 4. "#EC NOTEXT - constants C_FAMILY_SWISS type ZEXCEL_STYLE_FONT_FAMILY value 2. "#EC NOTEXT - constants C_NAME_ARIAL type ZEXCEL_STYLE_FONT_NAME value 'Arial'. "#EC NOTEXT - constants C_NAME_CALIBRI type ZEXCEL_STYLE_FONT_NAME value 'Calibri'. "#EC NOTEXT - constants C_NAME_CAMBRIA type ZEXCEL_STYLE_FONT_NAME value 'Cambria'. "#EC NOTEXT - constants C_NAME_ROMAN type ZEXCEL_STYLE_FONT_NAME value 'Times New Roman'. "#EC NOTEXT - constants C_SCHEME_MAJOR type ZEXCEL_STYLE_FONT_SCHEME value 'major'. "#EC NOTEXT - constants C_SCHEME_NONE type ZEXCEL_STYLE_FONT_SCHEME value ''. "#EC NOTEXT - constants C_SCHEME_MINOR type ZEXCEL_STYLE_FONT_SCHEME value 'minor'. "#EC NOTEXT - constants C_UNDERLINE_DOUBLE type ZEXCEL_STYLE_FONT_UNDERLINE value 'double'. "#EC NOTEXT - constants C_UNDERLINE_DOUBLEACCOUNTING type ZEXCEL_STYLE_FONT_UNDERLINE value 'doubleAccounting'. "#EC NOTEXT - constants C_UNDERLINE_NONE type ZEXCEL_STYLE_FONT_UNDERLINE value 'none'. "#EC NOTEXT - constants C_UNDERLINE_SINGLE type ZEXCEL_STYLE_FONT_UNDERLINE value 'single'. "#EC NOTEXT - constants C_UNDERLINE_SINGLEACCOUNTING type ZEXCEL_STYLE_FONT_UNDERLINE value 'singleAccounting'. "#EC NOTEXT - data FAMILY type ZEXCEL_STYLE_FONT_FAMILY value 2. "#EC NOTEXT . - data ITALIC type FLAG . - data NAME type ZEXCEL_STYLE_FONT_NAME value 'Calibri'. "#EC NOTEXT . - data SCHEME type ZEXCEL_STYLE_FONT_SCHEME value 'minor'. "#EC NOTEXT . - data SIZE type ZEXCEL_STYLE_FONT_SIZE value 11. "#EC NOTEXT . - data STRIKETHROUGH type FLAG . - data UNDERLINE type FLAG . - data UNDERLINE_MODE type ZEXCEL_STYLE_FONT_UNDERLINE . - - methods CONSTRUCTOR . - methods GET_STRUCTURE - returning - value(ES_FONT) type ZEXCEL_S_STYLE_FONT . - methods CALCULATE_TEXT_WIDTH - importing - !I_TEXT type ZEXCEL_CELL_VALUE - returning - value(R_WIDTH) type I . - *"* protected components of class ZCL_EXCEL_STYLE_FONT -*"* do not include other source files here!!! -protected section. - private section. -*"* private components of class ZCL_EXCEL_STYLE_FONT -*"* do not include other source files here!!! + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -64,56 +10,56 @@ protected section. *"* in the implementation part of the class ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - METHOD calculate_text_width. - " Addition to solve issue #120, contribution by Stefan Schmöcker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CALCULATE_TEXT_WIDTH. + " Addition to solve issue #120, contribution by Stefan Schmöcker r_width = strlen( i_text ). " use scale factor based on default 11 " ( don't know where defaultsetting is stored currently ) r_width = r_width * me->size / 11. -ENDMETHOD. + endmethod. - + method CONSTRUCTOR. me->color-rgb = zcl_excel_style_color=>c_black. me->color-theme = zcl_excel_style_color=>c_theme_not_set. me->color-indexed = zcl_excel_style_color=>c_indexed_not_set. me->scheme = zcl_excel_style_font=>c_scheme_minor. me->underline_mode = zcl_excel_style_font=>c_underline_single. -endmethod. + endmethod. - - + + method GET_STRUCTURE. es_font-bold = me->bold. @@ -127,6 +73,6 @@ endmethod. es_font-family = me->family. es_font-scheme = me->scheme. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk index 509557c..a6521cf 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_NUMBER_FORMAT.slnk @@ -1,65 +1,5 @@ - - - class ZCL_EXCEL_STYLE_NUMBER_FORMAT definition - public - final - create public . - -public section. -*"* public components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT -*"* do not include other source files here!!! - - constants C_FORMAT_NUMC_STD type ZEXCEL_NUMBER_FORMAT value 'STD_NDEC'. "#EC NOTEXT - constants C_FORMAT_DATE_STD type ZEXCEL_NUMBER_FORMAT value 'STD_DATE'. "#EC NOTEXT - constants C_FORMAT_CURRENCY_EUR_SIMPLE type ZEXCEL_NUMBER_FORMAT value '[$EUR ]#,##0.00_-'. "#EC NOTEXT - constants C_FORMAT_CURRENCY_USD type ZEXCEL_NUMBER_FORMAT value '$#,##0_-'. "#EC NOTEXT - constants C_FORMAT_CURRENCY_USD_SIMPLE type ZEXCEL_NUMBER_FORMAT value '"$"#,##0.00_-'. "#EC NOTEXT - constants C_FORMAT_DATE_DATETIME type ZEXCEL_NUMBER_FORMAT value 'd/m/y h:mm'. "#EC NOTEXT - constants C_FORMAT_DATE_DDMMYYYY type ZEXCEL_NUMBER_FORMAT value 'dd/mm/yy'. "#EC NOTEXT - constants C_FORMAT_DATE_DDMMYYYYDOT type ZEXCEL_NUMBER_FORMAT value 'dd\.mm\.yyyy'. "#EC NOTEXT - constants C_FORMAT_DATE_DMMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m'. "#EC NOTEXT - constants C_FORMAT_DATE_DMYMINUS type ZEXCEL_NUMBER_FORMAT value 'd-m-y'. "#EC NOTEXT - constants C_FORMAT_DATE_DMYSLASH type ZEXCEL_NUMBER_FORMAT value 'd/m/y'. "#EC NOTEXT - constants C_FORMAT_DATE_MYMINUS type ZEXCEL_NUMBER_FORMAT value 'm-y'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME1 type ZEXCEL_NUMBER_FORMAT value 'h:mm AM/PM'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME2 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss AM/PM'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME3 type ZEXCEL_NUMBER_FORMAT value 'h:mm'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME4 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME5 type ZEXCEL_NUMBER_FORMAT value 'mm:ss'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME6 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME7 type ZEXCEL_NUMBER_FORMAT value 'i:s.S'. "#EC NOTEXT - constants C_FORMAT_DATE_TIME8 type ZEXCEL_NUMBER_FORMAT value 'h:mm:ss@'. "#EC NOTEXT - constants C_FORMAT_DATE_XLSX14 type ZEXCEL_NUMBER_FORMAT value 'mm-dd-yy'. "#EC NOTEXT - constants C_FORMAT_DATE_XLSX15 type ZEXCEL_NUMBER_FORMAT value 'd-mmm-yy'. "#EC NOTEXT - constants C_FORMAT_DATE_XLSX16 type ZEXCEL_NUMBER_FORMAT value 'd-mmm'. "#EC NOTEXT - constants C_FORMAT_DATE_XLSX17 type ZEXCEL_NUMBER_FORMAT value 'mmm-yy'. "#EC NOTEXT - constants C_FORMAT_DATE_XLSX22 type ZEXCEL_NUMBER_FORMAT value 'm/d/yy h:mm'. "#EC NOTEXT - constants C_FORMAT_DATE_YYMMDD type ZEXCEL_NUMBER_FORMAT value 'yymmdd'. "#EC NOTEXT - constants C_FORMAT_DATE_YYMMDDMINUS type ZEXCEL_NUMBER_FORMAT value 'yy-mm-dd'. "#EC NOTEXT - constants C_FORMAT_DATE_YYMMDDSLASH type ZEXCEL_NUMBER_FORMAT value 'yy/mm/dd'. "#EC NOTEXT - constants C_FORMAT_DATE_YYYYMMDD type ZEXCEL_NUMBER_FORMAT value 'yyyymmdd'. "#EC NOTEXT - constants C_FORMAT_DATE_YYYYMMDDMINUS type ZEXCEL_NUMBER_FORMAT value 'yyyy-mm-dd'. "#EC NOTEXT - constants C_FORMAT_DATE_YYYYMMDDSLASH type ZEXCEL_NUMBER_FORMAT value 'yyyy/mm/dd'. "#EC NOTEXT - constants C_FORMAT_GENERAL type ZEXCEL_NUMBER_FORMAT value ''. "#EC NOTEXT - constants C_FORMAT_NUMBER type ZEXCEL_NUMBER_FORMAT value '0'. "#EC NOTEXT - constants C_FORMAT_NUMBER_00 type ZEXCEL_NUMBER_FORMAT value '0.00'. "#EC NOTEXT - constants C_FORMAT_NUMBER_COMMA_SEP1 type ZEXCEL_NUMBER_FORMAT value '#,##0.00'. "#EC NOTEXT - constants C_FORMAT_NUMBER_COMMA_SEP2 type ZEXCEL_NUMBER_FORMAT value '#,##0.00_-'. "#EC NOTEXT - constants C_FORMAT_PERCENTAGE type ZEXCEL_NUMBER_FORMAT value '0%'. "#EC NOTEXT - constants C_FORMAT_PERCENTAGE_00 type ZEXCEL_NUMBER_FORMAT value '0.00%'. "#EC NOTEXT - constants C_FORMAT_TEXT type ZEXCEL_NUMBER_FORMAT value '@'. "#EC NOTEXT - data FORMAT_CODE type ZEXCEL_NUMBER_FORMAT . - - methods CONSTRUCTOR . - methods GET_STRUCTURE - returning - value(EP_NUMBER_FORMAT) type ZEXCEL_S_STYLE_NUMFMT . - *"* protected components of class ZABAP_EXCEL_STYLE_FONT -*"* do not include other source files here!!! -protected section. - private section. -*"* private components of class ZCL_EXCEL_STYLE_NUMBER_FORMAT -*"* do not include other source files here!!! + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -68,55 +8,55 @@ protected section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. format_code = me->c_format_general. -endmethod. + endmethod. - - + + method GET_STRUCTURE. ep_number_format-numfmt = me->format_code. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk index 4e242c9..d212b17 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_PROTECTION.slnk @@ -1,31 +1,5 @@ - - - class ZCL_EXCEL_STYLE_PROTECTION definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_STYLE_PROTECTION -*"* do not include other source files here!!! -public section. - - constants C_PROTECTION_HIDDEN type ZEXCEL_CELL_PROTECTION value '1'. "#EC NOTEXT - constants C_PROTECTION_LOCKED type ZEXCEL_CELL_PROTECTION value '1'. "#EC NOTEXT - constants C_PROTECTION_UNHIDDEN type ZEXCEL_CELL_PROTECTION value '0'. "#EC NOTEXT - constants C_PROTECTION_UNLOCKED type ZEXCEL_CELL_PROTECTION value '0'. "#EC NOTEXT - data HIDDEN type ZEXCEL_CELL_PROTECTION . - data LOCKED type ZEXCEL_CELL_PROTECTION . - - methods CONSTRUCTOR . - methods GET_STRUCTURE - returning - value(EP_PROTECTION) type ZEXCEL_S_STYLE_PROTECTION . - *"* protected components of class ZABAP_EXCEL_STYLE_FONT -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_STYLE_PROTECTION -*"* do not include other source files here!!! -private section. + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -34,23 +8,23 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - - + + + + + + + method CONSTRUCTOR. locked = me->c_protection_locked. hidden = me->c_protection_unhidden. -endmethod. + endmethod. - - - METHOD get_structure. + + + method GET_STRUCTURE. ep_protection-locked = me->locked. ep_protection-hidden = me->hidden. -ENDMETHOD. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk b/ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk index e91e87a..4a6bb67 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_TABLE.slnk @@ -27,17 +27,17 @@ - - - - - - - - - - - + + + + + + + + + + + method GET_BOTTOM_ROW_INTEGER. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 4d8f172..42e976d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -31,10 +31,10 @@ "/> - - - + + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk index 77ee784..99ee918 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEETS.slnk @@ -1,47 +1,5 @@ - - - class ZCL_EXCEL_WORKSHEETS definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_WORKSHEETS -*"* do not include other source files here!!! -public section. - - data ACTIVE_WORKSHEET type ZEXCEL_ACTIVE_WORKSHEET value 1. "#EC NOTEXT . - data NAME type ZEXCEL_WORKSHEETS_NAME value 'Worksheets'. "#EC NOTEXT . - - methods ADD - importing - !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . - methods CLEAR . - methods CONSTRUCTOR . - methods GET - importing - !IP_INDEX type ZEXCEL_ACTIVE_WORKSHEET - returning - value(EO_WORKSHEET) type ref to ZCL_EXCEL_WORKSHEET . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . - methods SIZE - returning - value(EP_SIZE) type I . - *"* protected components of class ZCL_EXCEL_WORKSHEETS -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_WORKSHEETS -*"* do not include other source files here!!! -private section. - - data WORKSHEETS type ref to CL_OBJECT_COLLECTION . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -50,72 +8,72 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - + + + + + method ADD. worksheets->add( ip_worksheet ). -endmethod. + endmethod. - + method CLEAR. worksheets->clear( ). -endmethod. + endmethod. - + method CONSTRUCTOR. CREATE OBJECT worksheets. -endmethod. + endmethod. - - - + + + method GET. DATA lv_index TYPE i. lv_index = ip_index. eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). -endmethod. + endmethod. - - + + method GET_ITERATOR. eo_iterator ?= worksheets->if_object_collection~get_iterator( ). -endmethod. + endmethod. - - + + method IS_EMPTY. is_empty = worksheets->if_object_collection~is_empty( ). -endmethod. + endmethod. - - + + method REMOVE. worksheets->remove( ip_worksheet ). -endmethod. + endmethod. - - + + method SIZE. ep_size = worksheets->if_object_collection~size( ). -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk index 8d2d49d..8d44f7d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_COLUMNDIME.slnk @@ -1,104 +1,5 @@ - - - - class ZCL_EXCEL_WORKSHEET_COLUMNDIME definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_WORKSHEET_COLUMNDIME -*"* do not include other source files here!!! -public section. - type-pools ABAP . - - methods CONSTRUCTOR - importing - !IP_INDEX type ZEXCEL_CELL_COLUMN_ALPHA - !IP_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET - !IP_EXCEL type ref to ZCL_EXCEL . - methods GET_AUTO_SIZE - returning - value(R_AUTO_SIZE) type ABAP_BOOL . - methods GET_COLLAPSED - returning - value(R_COLLAPSED) type ABAP_BOOL . - methods GET_COLUMN_INDEX - returning - value(R_COLUMN_INDEX) type INT4 . - methods GET_OUTLINE_LEVEL - returning - value(R_OUTLINE_LEVEL) type INT4 . - methods GET_VISIBLE - returning - value(R_VISIBLE) type ABAP_BOOL . - methods GET_WIDTH - returning - value(R_WIDTH) type FLOAT . - methods GET_XF_INDEX - returning - value(R_XF_INDEX) type INT4 . - methods SET_AUTO_SIZE - importing - !IP_AUTO_SIZE type ABAP_BOOL - returning - value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . - methods SET_COLLAPSED - importing - !IP_COLLAPSED type ABAP_BOOL - returning - value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . - methods SET_COLUMN_INDEX - importing - !IP_INDEX type ZEXCEL_CELL_COLUMN_ALPHA - returning - value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . - methods SET_OUTLINE_LEVEL - importing - !IP_OUTLINE_LEVEL type INT4 . - methods SET_VISIBLE - importing - !IP_VISIBLE type ABAP_BOOL - returning - value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . - methods SET_WIDTH - importing - !IP_WIDTH type SIMPLE - returning - value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME - raising - ZCX_EXCEL . - methods SET_XF_INDEX - importing - !IP_XF_INDEX type INT4 - returning - value(R_WORKSHEET_COLUMNDIME) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . - methods SET_COLUMN_STYLE_BY_GUID - importing - !IP_STYLE_GUID type ZEXCEL_CELL_STYLE - raising - ZCX_EXCEL . - methods GET_COLUMN_STYLE_GUID - returning - value(EP_STYLE_GUID) type ZEXCEL_CELL_STYLE - raising - ZCX_EXCEL . - *"* protected components of class ZCL_EXCEL_WORKSHEET_COLUMNDIME -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_WORKSHEET_COLUMNDIME -*"* do not include other source files here!!! -private section. - - data COLUMN_INDEX type INT4 . - data WIDTH type FLOAT . - data AUTO_SIZE type ABAP_BOOL . - data VISIBLE type ABAP_BOOL . - data OUTLINE_LEVEL type INT4 . - data COLLAPSED type ABAP_BOOL . - data XF_INDEX type INT4 . - data STYLE_GUID type ZEXCEL_CELL_STYLE . - data EXCEL type ref to ZCL_EXCEL . - data WORKSHEET type ref to ZCL_EXCEL_WORKSHEET . + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -109,21 +10,21 @@ private section. *"* in the implementation part of the class ABAP - - - - - - - - - - - - - - - METHOD constructor. + + + + + + + + + + + + + + + method CONSTRUCTOR. me->column_index = zcl_excel_common=>convert_column2int( ip_index ). me->width = -1. me->auto_size = abap_false. @@ -136,89 +37,89 @@ private section. " set default index to cellXf me->xf_index = 0. -ENDMETHOD. + endmethod. - - + + method GET_AUTO_SIZE. r_auto_size = me->auto_size. -endmethod. + endmethod. - - + + method GET_COLLAPSED. r_Collapsed = me->Collapsed. -endmethod. + endmethod. - - + + method GET_COLUMN_INDEX. r_column_index = me->column_index. -endmethod. + endmethod. - - - - METHOD get_column_style_guid. + + + + method GET_COLUMN_STYLE_GUID. IF me->style_guid IS NOT INITIAL. ep_style_guid = me->style_guid. ELSE. ep_style_guid = me->worksheet->zif_excel_sheet_properties~get_style( ). ENDIF. -ENDMETHOD. + endmethod. - - + + method GET_OUTLINE_LEVEL. r_outline_level = me->outline_level. -endmethod. + endmethod. - - + + method GET_VISIBLE. r_Visible = me->Visible. -endmethod. + endmethod. - - + + method GET_WIDTH. r_WIDTH = me->WIDTH. -endmethod. + endmethod. - - + + method GET_XF_INDEX. r_xf_index = me->xf_index. -endmethod. + endmethod. - - - + + + method SET_AUTO_SIZE. me->auto_size = ip_auto_size. r_worksheet_columndime = me. -endmethod. + endmethod. - - - + + + method SET_COLLAPSED. me->Collapsed = ip_Collapsed. r_worksheet_columndime = me. -endmethod. + endmethod. - - - + + + method SET_COLUMN_INDEX. me->column_index = zcl_excel_common=>convert_column2int( ip_index ). r_worksheet_columndime = me. -endmethod. + endmethod. - - - - METHOD set_column_style_by_guid. + + + + method SET_COLUMN_STYLE_BY_GUID. DATA: stylemapping TYPE zexcel_s_stylemapping. IF me->excel IS NOT BOUND. @@ -234,26 +135,26 @@ endmethod. EXIT. " leave as is in case of error ENDTRY. -ENDMETHOD. + endmethod. - - + + method SET_OUTLINE_LEVEL. me->outline_level = ip_outline_level. -endmethod. + endmethod. - - - + + + method SET_VISIBLE. me->Visible = ip_Visible. r_worksheet_columndime = me. -endmethod. + endmethod. - - - - + + + + method SET_WIDTH. TRY. me->width = ip_width. @@ -263,14 +164,14 @@ endmethod. EXPORTING error = 'Unable to interpret width as number'. ENDTRY. -endmethod. + endmethod. - - - + + + method SET_XF_INDEX. me->XF_INDEX = ip_XF_INDEX. r_worksheet_columndime = me. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_CSV.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_CSV.slnk index 5cf7852..b882522 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_CSV.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_CSV.slnk @@ -1,52 +1,6 @@ - - - - class ZCL_EXCEL_WRITER_CSV definition - public - final - create public . - -*"* public components of class ZCL_EXCEL_WRITER_CSV -*"* do not include other source files here!!! -public section. - - interfaces ZIF_EXCEL_WRITER . - - class-methods SET_DELIMITER - importing - value(IP_VALUE) type CHAR01 default ';' . - class-methods SET_ENCLOSURE - importing - value(IP_VALUE) type CHAR01 default '"' . - class-methods SET_ENDOFLINE - importing - value(IP_VALUE) type ANY default CL_ABAP_CHAR_UTILITIES=>CR_LF . - class-methods SET_ACTIVE_SHEET_INDEX - importing - !I_ACTIVE_WORKSHEET type ZEXCEL_ACTIVE_WORKSHEET . - class-methods SET_ACTIVE_SHEET_INDEX_BY_NAME - importing - !I_WORKSHEET_NAME type ZEXCEL_WORKSHEETS_NAME . - *"* protected components of class ZCL_EXCEL_WRITER_2007 -*"* do not include other source files here!!! -protected section. - *"* private components of class ZCL_EXCEL_WRITER_CSV -*"* do not include other source files here!!! -private section. - - data EXCEL type ref to ZCL_EXCEL . - class-data DELIMITER type CHAR01 value ';'. "#EC NOTEXT . - class-data ENCLOSURE type CHAR01 value '"'. "#EC NOTEXT . - class-data EOL type CHAR01 value CL_ABAP_CHAR_UTILITIES=>CR_LF. "#EC NOTEXT . - class-data WORKSHEET_NAME type ZEXCEL_WORKSHEETS_NAME . - class-data WORKSHEET_INDEX type ZEXCEL_ACTIVE_WORKSHEET . - - methods CREATE - returning - value(EP_EXCEL) type XSTRING . - methods CREATE_CSV - returning - value(EP_CONTENT) type XSTRING . + + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -55,30 +9,30 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - + + + + + + method ZIF_EXCEL_WRITER~WRITE_FILE. me->excel = io_excel. ep_file = me->create( ). -endmethod. + endmethod. - - + + method CREATE. * .csv format with ; delimiter ep_excel = me->CREATE_CSV( ). -endmethod. + endmethod. - - + + method CREATE_CSV. TYPES: BEGIN OF lty_format, @@ -294,38 +248,38 @@ endmethod. OTHERS = 2 . -endmethod. + endmethod. - - + + method SET_ACTIVE_SHEET_INDEX. CLEAR WORKSHEET_NAME. WORKSHEET_INDEX = i_active_worksheet. -endmethod. + endmethod. - - + + method SET_ACTIVE_SHEET_INDEX_BY_NAME. CLEAR WORKSHEET_INDEX. WORKSHEET_NAME = i_worksheet_name. -endmethod. + endmethod. - - + + method SET_DELIMITER. delimiter = ip_value. -endmethod. + endmethod. - - + + method SET_ENCLOSURE. zcl_excel_writer_csv=>enclosure = ip_value. -endmethod. + endmethod. - - + + method SET_ENDOFLINE. zcl_excel_writer_csv=>eol = ip_value. -endmethod. + endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_XLSM.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_XLSM.slnk index e095554..f8472a4 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_XLSM.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_XLSM.slnk @@ -11,6 +11,7 @@ + @@ -27,6 +28,197 @@ ENDMETHOD. + + method CREATE. + + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_drawings TYPE REF TO zcl_excel_drawings. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_xl_drawing TYPE string, + lv_xl_drawing_rels TYPE string, + lv_syindex TYPE string, + lv_value TYPE string, + lv_drawing_index TYPE i. + +********************************************************************** +* Start of insertion # issue 139 - Dateretention of cellstyles + me->excel->add_static_styles( ). +* End of insertion # issue 139 - Dateretention of cellstyles + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sheet#.xml and drawing#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + lv_drawing_index = 1. + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_false. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet + iv_drawing_index = lv_drawing_index ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). + lv_content = me->create_xl_table( lo_table ). + + lv_value = lo_table->get_name( ). + CONCATENATE 'xl/tables/' lv_value '.xml' INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +* Add drawings ********************************** + lo_drawings = lo_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + MOVE lv_drawing_index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + + lv_content = me->create_xl_drawings( lo_worksheet ). + lv_xl_drawing = me->c_xl_drawings. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_syindex. + lo_zip->add( name = lv_xl_drawing + content = lv_content ). + + lv_content = me->create_xl_drawings_rels( lo_worksheet ). + lv_xl_drawing_rels = me->c_xl_drawings_rels. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_drawing_rels + content = lv_content ). + ADD 1 TO lv_drawing_index. + ENDIF. + ENDWHILE. + +********************************************************************** +* STEP 11: Add media + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_content = lo_drawing->get_media( ). + lv_value = lo_drawing->get_media_name( ). + CONCATENATE 'xl/media/' lv_value INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 12: Add charts + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_content = lo_drawing->get_media( ). + lv_value = lo_drawing->get_media_name( ). + CONCATENATE 'xl/charts/' lv_value INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 9: Add vbaProject.bin to zip + lo_zip->add( name = me->c_xl_vbaproject + content = me->excel->zif_excel_book_vba_project~vbaproject ). + +********************************************************************** +* STEP 12: Create the final zip + ep_excel = lo_zip->save( ). + + endmethod. + method CREATE_CONTENT_TYPES. ** Constant node name diff --git a/ZA2X/DEVC/ZABAP2XLSX.slnk b/ZA2X/DEVC/ZABAP2XLSX.slnk new file mode 100644 index 0000000..87799ad --- /dev/null +++ b/ZA2X/DEVC/ZABAP2XLSX.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk b/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk index 9dbe0e3..7a91743 100644 --- a/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk +++ b/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk @@ -1,5 +1,5 @@ - + diff --git a/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk index 67203ff..bce7111 100644 --- a/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk +++ b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk index e579fea..c66e97f 100644 --- a/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk index ddb21c2..2b7ec9f 100644 --- a/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk index 9a21478..6f6379d 100644 --- a/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk index 9ebb970..160dce9 100644 --- a/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk +++ b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk index 74b78a8..8381c44 100644 --- a/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_BORDER.slnk b/ZA2X/DTEL/ZEXCEL_BORDER.slnk index 07c427c..ef5aeea 100644 --- a/ZA2X/DTEL/ZEXCEL_BORDER.slnk +++ b/ZA2X/DTEL/ZEXCEL_BORDER.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_BREAK.slnk b/ZA2X/DTEL/ZEXCEL_BREAK.slnk index cd1a862..55278e2 100644 --- a/ZA2X/DTEL/ZEXCEL_BREAK.slnk +++ b/ZA2X/DTEL/ZEXCEL_BREAK.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk index 6c89914..8116da8 100644 --- a/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk +++ b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk index a19f23d..b068929 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk index b0633c5..6e0fcf2 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk index a9dac75..1805010 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk index 8a57233..3b80419 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk index 1765321..cca5778 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk index e598310..803b57d 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk index ff8d5e4..707dafc 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk index 191fab9..6c20d90 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_COLOR.slnk b/ZA2X/DTEL/ZEXCEL_COLOR.slnk index 36403e8..624d45b 100644 --- a/ZA2X/DTEL/ZEXCEL_COLOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_COLOR.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_COMPANY.slnk b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk index 04abf58..9ec378e 100644 --- a/ZA2X/DTEL/ZEXCEL_COMPANY.slnk +++ b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk index 8ebfda7..71687fb 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk index 368cd08..556401e 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk index e5b2908..0e3a899 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk index 31498da..0d4a54e 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk index 0c9fd38..e363816 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk index dc388d6..30766b7 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk index 8a26903..049393f 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/DTEL_ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk similarity index 99% rename from ZA2X/DTEL/DTEL_ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk rename to ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk index 4123dfd..29ab61a 100644 --- a/ZA2X/DTEL/DTEL_ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk @@ -1,4 +1,4 @@ - - - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CREATOR.slnk b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk index 575b6db..480d349 100644 --- a/ZA2X/DTEL/ZEXCEL_CREATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk index a24ea87..59f06ef 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk index 765fb4f..e595bb1 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk index 5dc6210..dbcc4c0 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk b/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk index 0e850a4..ec0001f 100644 --- a/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk +++ b/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk index 92195ab..e17e3f1 100644 --- a/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk index 5f69802..b22f162 100644 --- a/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk +++ b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk index 49a45e1..84075a3 100644 --- a/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk +++ b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk b/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk index dfef22c..ebc1c24 100644 --- a/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk @@ -1,4 +1,4 @@ - + diff --git a/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk index 6cab8b0..e5bcdae 100644 --- a/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk @@ -1,4 +1,4 @@ - + diff --git a/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk b/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk index c6df70d..590f0a2 100644 --- a/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk +++ b/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL.slnk b/ZA2X/DTEL/ZEXCEL_FILL.slnk index 016192c..55eadf2 100644 --- a/ZA2X/DTEL/ZEXCEL_FILL.slnk +++ b/ZA2X/DTEL/ZEXCEL_FILL.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk index b354d80..fc1e23f 100644 --- a/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FONT.slnk b/ZA2X/DTEL/ZEXCEL_FONT.slnk index 31c4572..f8dea36 100644 --- a/ZA2X/DTEL/ZEXCEL_FONT.slnk +++ b/ZA2X/DTEL/ZEXCEL_FONT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FORMAT.slnk b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk index 9a4f160..bbae5a3 100644 --- a/ZA2X/DTEL/ZEXCEL_FORMAT.slnk +++ b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk index 645ec0b..217c8b9 100644 --- a/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk b/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk index 42e9197..8ac650f 100644 --- a/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk +++ b/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_INDENT.slnk b/ZA2X/DTEL/ZEXCEL_INDENT.slnk index 7685234..ae47deb 100644 --- a/ZA2X/DTEL/ZEXCEL_INDENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_INDENT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk index 2583e5d..ce515c9 100644 --- a/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk +++ b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_LOCKED.slnk b/ZA2X/DTEL/ZEXCEL_LOCKED.slnk index a6c3f24..bfd8b85 100644 --- a/ZA2X/DTEL/ZEXCEL_LOCKED.slnk +++ b/ZA2X/DTEL/ZEXCEL_LOCKED.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk b/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk index c06feae..1b0180e 100644 --- a/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk +++ b/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk index e3bd68d..b20a3ee 100644 --- a/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk b/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk index c37a1ce..d7cfd87 100644 --- a/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk +++ b/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk index cd947e2..eb1e15d 100644 --- a/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk b/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk index d78a12a..d0a4e88 100644 --- a/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk +++ b/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk index d9357d4..5145a39 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk index 12e2834..6a7c871 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk index 74847bc..7c83f25 100644 --- a/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk index 558c0e7..360ef06 100644 --- a/ZA2X/DTEL/ZEXCEL_ROTATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk index 32a9856..5afcd45 100644 --- a/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk +++ b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk index ac93825..6240783 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk index 5d7f44b..2aa0027 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk index c4e5908..77fb60f 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk index 64ec3d2..1302f6b 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk index bc414e7..65d77d0 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk index ff9c887..6877cce 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk index f11a218..b8fe668 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk index 92b73a1..37dce2e 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk index 45e9e16..3b941d9 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk index da10d3f..9bbc2d6 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk index fc714b8..26ca58f 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk b/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk index 037f0cc..420d344 100644 --- a/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk b/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk index f0400bb..33f19b6 100644 --- a/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk index f5df235..88b51f5 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk index 41dd250..39c919f 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk index 662eed1..e9e71a8 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk index 30125f8..bba3c92 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk index 0b4db9f..1c9cbb9 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk index 61b258d..e328ef3 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk index 62b0469..5d5800e 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk index 920e1f6..961eb58 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk index a80b057..0b70a8b 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk index 7552293..8092e1b 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk index 33b6ebf..88326de 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk index f185821..f40ce4c 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk index f53f2d1..c673acc 100644 --- a/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk +++ b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk index c4208b6..6b3fd1e 100644 --- a/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk index 0bf438c..ca69cc4 100644 --- a/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk index e8a09ea..d4c8c09 100644 --- a/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_TITLE.slnk index e363d86..b13188f 100644 --- a/ZA2X/DTEL/ZEXCEL_TITLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_TITLE.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk index af72a87..33743c1 100644 --- a/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk +++ b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk index a616e27..ecdaaef 100644 --- a/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk index 9985c78..0c7a9da 100644 --- a/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/INTF/ZIF_EXCEL_BOOK_PROTECTION.slnk b/ZA2X/INTF/ZIF_EXCEL_BOOK_PROTECTION.slnk index 77dfa42..fccc571 100644 --- a/ZA2X/INTF/ZIF_EXCEL_BOOK_PROTECTION.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_BOOK_PROTECTION.slnk @@ -1,14 +1,14 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/ZA2X/INTF/ZIF_EXCEL_BOOK_VBA_PROJECT.slnk b/ZA2X/INTF/ZIF_EXCEL_BOOK_VBA_PROJECT.slnk index 1a08efe..cb83101 100644 --- a/ZA2X/INTF/ZIF_EXCEL_BOOK_VBA_PROJECT.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_BOOK_VBA_PROJECT.slnk @@ -1,15 +1,15 @@ - - - - - - - + + + + + + + - - + + - - + + diff --git a/ZA2X/INTF/ZIF_EXCEL_CONVERTER.slnk b/ZA2X/INTF/ZIF_EXCEL_CONVERTER.slnk index b5b71d1..ed5d710 100644 --- a/ZA2X/INTF/ZIF_EXCEL_CONVERTER.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_CONVERTER.slnk @@ -1,5 +1,5 @@ - + diff --git a/ZA2X/INTF/ZIF_EXCEL_CUSTOMUI_ELEMENT.slnk b/ZA2X/INTF/ZIF_EXCEL_CUSTOMUI_ELEMENT.slnk index 5694492..45f3c29 100644 --- a/ZA2X/INTF/ZIF_EXCEL_CUSTOMUI_ELEMENT.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_CUSTOMUI_ELEMENT.slnk @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/ZA2X/INTF/ZIF_EXCEL_SHEET_PRINTSETTINGS.slnk b/ZA2X/INTF/ZIF_EXCEL_SHEET_PRINTSETTINGS.slnk index d65a7a3..550258f 100644 --- a/ZA2X/INTF/ZIF_EXCEL_SHEET_PRINTSETTINGS.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_SHEET_PRINTSETTINGS.slnk @@ -1,5 +1,5 @@ - + diff --git a/ZA2X/INTF/ZIF_EXCEL_SHEET_PROTECTION.slnk b/ZA2X/INTF/ZIF_EXCEL_SHEET_PROTECTION.slnk index ccbbd5f..d43e226 100644 --- a/ZA2X/INTF/ZIF_EXCEL_SHEET_PROTECTION.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_SHEET_PROTECTION.slnk @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/INTF/ZIF_EXCEL_SHEET_VBA_PROJECT.slnk b/ZA2X/INTF/ZIF_EXCEL_SHEET_VBA_PROJECT.slnk index f9d8887..bbdcb26 100644 --- a/ZA2X/INTF/ZIF_EXCEL_SHEET_VBA_PROJECT.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_SHEET_VBA_PROJECT.slnk @@ -1,12 +1,12 @@ - - - - - - - + + + + + + + - - + + diff --git a/ZA2X/INTF/ZIF_EXCEL_WRITER.slnk b/ZA2X/INTF/ZIF_EXCEL_WRITER.slnk index e4b0a67..91b2064 100644 --- a/ZA2X/INTF/ZIF_EXCEL_WRITER.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_WRITER.slnk @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk b/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk index 99ddf02..ed04a39 100644 --- a/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk +++ b/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZANGRY_BIRDS.slnk b/ZA2X/PROG/ZANGRY_BIRDS.slnk index 48122d5..61d5216 100644 --- a/ZA2X/PROG/ZANGRY_BIRDS.slnk +++ b/ZA2X/PROG/ZANGRY_BIRDS.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL1.slnk b/ZA2X/PROG/ZDEMO_EXCEL1.slnk index 46da31a..54aa21f 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL1.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL1.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL10.slnk b/ZA2X/PROG/ZDEMO_EXCEL10.slnk index 39ce701..0914eb8 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL10.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL10.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL13.slnk b/ZA2X/PROG/ZDEMO_EXCEL13.slnk index ea00a19..9337531 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL13.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL13.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL14.slnk b/ZA2X/PROG/ZDEMO_EXCEL14.slnk index c2a974b..e7fa87e 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL14.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL14.slnk @@ -119,7 +119,7 @@ START-OF-SELECTION. lo_style_rotated = lo_excel->add_new_style( ). lo_style_rotated->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. lo_style_rotated->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. - lo_style_rotated->alignment->textrotation = 165. " -75° == 90° + 75° + lo_style_rotated->alignment->textrotation = 165. " -75° == 90° + 75° lv_style_rotated_guid = lo_style_rotated->get_guid( ). @@ -153,7 +153,7 @@ START-OF-SELECTION. " Rotated lo_worksheet->set_cell( ip_row = 10 ip_column = 'D' - ip_value = 'This is a centered text rotated by -75°' + ip_value = 'This is a centered text rotated by -75°' ip_style = lv_style_rotated_guid ). " forced line break diff --git a/ZA2X/PROG/ZDEMO_EXCEL17.slnk b/ZA2X/PROG/ZDEMO_EXCEL17.slnk index 6f43a1a..0f81f12 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL17.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL17.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL18.slnk b/ZA2X/PROG/ZDEMO_EXCEL18.slnk index ec668f7..15f4fbe 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL18.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL18.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL19.slnk b/ZA2X/PROG/ZDEMO_EXCEL19.slnk index b4ac1b6..7980b8c 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL19.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL19.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL20.slnk b/ZA2X/PROG/ZDEMO_EXCEL20.slnk index 7a12876..44515bd 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL20.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL20.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL21.slnk b/ZA2X/PROG/ZDEMO_EXCEL21.slnk index 16e08cf..36be3d7 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL21.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL21.slnk @@ -1,8 +1,8 @@ - - + + - + diff --git a/ZA2X/PROG/ZDEMO_EXCEL22.slnk b/ZA2X/PROG/ZDEMO_EXCEL22.slnk index d50a9a5..9dc62cb 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL22.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL22.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL23.slnk b/ZA2X/PROG/ZDEMO_EXCEL23.slnk index f7d31f2..1f9492c 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL23.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL23.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL24.slnk b/ZA2X/PROG/ZDEMO_EXCEL24.slnk index 1352f12..0cf6427 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL24.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL24.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL25.slnk b/ZA2X/PROG/ZDEMO_EXCEL25.slnk index ea1865c..89f1372 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL25.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL25.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL26.slnk b/ZA2X/PROG/ZDEMO_EXCEL26.slnk index 5966928..f2b6342 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL26.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL26.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL27.slnk b/ZA2X/PROG/ZDEMO_EXCEL27.slnk index 4c2b2cb..4253b87 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL27.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL27.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL28.slnk b/ZA2X/PROG/ZDEMO_EXCEL28.slnk index cf4ffa2..1bf4781 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL28.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL28.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL29.slnk b/ZA2X/PROG/ZDEMO_EXCEL29.slnk index 4d993e8..040aeb0 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL29.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL29.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL32.slnk b/ZA2X/PROG/ZDEMO_EXCEL32.slnk index b84a7ff..e5ba213 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL32.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL32.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL35.slnk b/ZA2X/PROG/ZDEMO_EXCEL35.slnk index dac3c4d..cd2ff2c 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL35.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL35.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL36.slnk b/ZA2X/PROG/ZDEMO_EXCEL36.slnk index b67e3cd..0e1c8da 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL36.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL36.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL5.slnk b/ZA2X/PROG/ZDEMO_EXCEL5.slnk index a520694..01124e3 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL5.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL5.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL9.slnk b/ZA2X/PROG/ZDEMO_EXCEL9.slnk index 1bf463a..ba4fe75 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL9.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL9.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_TECHED1.slnk b/ZA2X/PROG/ZDEMO_TECHED1.slnk index c93eda4..ab07833 100644 --- a/ZA2X/PROG/ZDEMO_TECHED1.slnk +++ b/ZA2X/PROG/ZDEMO_TECHED1.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/PROG/ZDEMO_TECHED10.slnk b/ZA2X/PROG/ZDEMO_TECHED10.slnk index a982638..35f19c1 100644 --- a/ZA2X/PROG/ZDEMO_TECHED10.slnk +++ b/ZA2X/PROG/ZDEMO_TECHED10.slnk @@ -1,5 +1,5 @@ - - + + @@ -33,41 +33,11 @@ DATA: lt_files TYPE filetable, lv_rc TYPE i, lv_value TYPE zexcel_cell_value. -CONSTANTS: lc_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>file_open_dialog( EXPORTING initial_directory = lv_workdir - default_filename = lc_default_file_name - file_filter = 'abap2xlsx|*.xlsx' - CHANGING file_table = lt_files - rc = lv_rc ). - IF lv_rc EQ 1. - READ TABLE lt_files INTO ls_file INDEX 1. - lv_full_path = ls_file-filename. - p_path = ls_file-filename. - ENDIF. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE lv_workdir lv_file_separator lc_default_file_name INTO lv_full_path. - p_path = lv_full_path. +CONSTANTS: gc_save_file_name TYPE string VALUE 'TechEd01.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. START-OF-SELECTION. - IF lv_full_path IS INITIAL. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE lv_workdir lv_file_separator lc_default_file_name INTO lv_full_path. - ENDIF. - ******************************* * abap2xlsx read XLSX * ******************************* @@ -81,5 +51,8 @@ START-OF-SELECTION. ip_row = 10 IMPORTING ep_value = lv_value ). - WRITE: 'abap2xlsx total score is ', lv_value. + WRITE: 'abap2xlsx total score is ', lv_value. + +*** Create output + lcl_output=>output( lo_excel ). diff --git a/ZA2X/PROG/ZDEMO_TECHED2.slnk b/ZA2X/PROG/ZDEMO_TECHED2.slnk index e72153d..6969aee 100644 --- a/ZA2X/PROG/ZDEMO_TECHED2.slnk +++ b/ZA2X/PROG/ZDEMO_TECHED2.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk index 94f84bd..082dad3 100644 --- a/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk @@ -1,7 +1,7 @@ - - - - - - + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_DATABAR.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_DATABAR.slnk index 0e22d51..ec5cf20 100644 --- a/ZA2X/TABL/ZEXCEL_CONDITIONAL_DATABAR.slnk +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_DATABAR.slnk @@ -1,9 +1,9 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_EXPRESSION.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_EXPRESSION.slnk index ba60ba6..7cbe629 100644 --- a/ZA2X/TABL/ZEXCEL_CONDITIONAL_EXPRESSION.slnk +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_EXPRESSION.slnk @@ -1,6 +1,6 @@ - - - + + + - + diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_ICONSET.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_ICONSET.slnk index c87301e..eaf9a22 100644 --- a/ZA2X/TABL/ZEXCEL_CONDITIONAL_ICONSET.slnk +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_ICONSET.slnk @@ -1,16 +1,16 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_DRAWING_LOCATION.slnk b/ZA2X/TABL/ZEXCEL_DRAWING_LOCATION.slnk index 14a75b3..00f2b36 100644 --- a/ZA2X/TABL/ZEXCEL_DRAWING_LOCATION.slnk +++ b/ZA2X/TABL/ZEXCEL_DRAWING_LOCATION.slnk @@ -1,4 +1,4 @@ - + diff --git a/ZA2X/TABL/ZEXCEL_PANE.slnk b/ZA2X/TABL/ZEXCEL_PANE.slnk index d616ea9..8844bfa 100644 --- a/ZA2X/TABL/ZEXCEL_PANE.slnk +++ b/ZA2X/TABL/ZEXCEL_PANE.slnk @@ -1,9 +1,9 @@ - - - - - - - - + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_AREA.slnk b/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_AREA.slnk index f3fce37..71a6bdc 100644 --- a/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_AREA.slnk +++ b/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_AREA.slnk @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_VALUES.slnk b/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_VALUES.slnk index 82dc7fa..401332e 100644 --- a/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_VALUES.slnk +++ b/ZA2X/TABL/ZEXCEL_S_AUTOFILTER_VALUES.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk b/ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk index 96ea987..187052a 100644 --- a/ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CELLXFS.slnk @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk b/ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk index e45a42e..8f30bb1 100644 --- a/ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CELL_DATA.slnk @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CONVERTER_COL.slnk b/ZA2X/TABL/ZEXCEL_S_CONVERTER_COL.slnk index a25e511..11a16b2 100644 --- a/ZA2X/TABL/ZEXCEL_S_CONVERTER_COL.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CONVERTER_COL.slnk @@ -1,9 +1,9 @@ - - - - - - - - + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CONVERTER_FCAT.slnk b/ZA2X/TABL/ZEXCEL_S_CONVERTER_FCAT.slnk index a8c067c..fbc07ca 100644 --- a/ZA2X/TABL/ZEXCEL_S_CONVERTER_FCAT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CONVERTER_FCAT.slnk @@ -1,30 +1,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CONVERTER_FIL.slnk b/ZA2X/TABL/ZEXCEL_S_CONVERTER_FIL.slnk index 077ffcb..3a69df9 100644 --- a/ZA2X/TABL/ZEXCEL_S_CONVERTER_FIL.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CONVERTER_FIL.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CONVERTER_LAYO.slnk b/ZA2X/TABL/ZEXCEL_S_CONVERTER_LAYO.slnk index 62f05e1..d3719a0 100644 --- a/ZA2X/TABL/ZEXCEL_S_CONVERTER_LAYO.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CONVERTER_LAYO.slnk @@ -1,7 +1,7 @@ - - - - - - + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CONVERTER_OPTION.slnk b/ZA2X/TABL/ZEXCEL_S_CONVERTER_OPTION.slnk index 19df6d8..f9c9076 100644 --- a/ZA2X/TABL/ZEXCEL_S_CONVERTER_OPTION.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CONVERTER_OPTION.slnk @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CONV_FIELDCATALOG.slnk b/ZA2X/TABL/ZEXCEL_S_CONV_FIELDCATALOG.slnk new file mode 100644 index 0000000..17e884e --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_CONV_FIELDCATALOG.slnk @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CONV_SETTINGS.slnk b/ZA2X/TABL/ZEXCEL_S_CONV_SETTINGS.slnk new file mode 100644 index 0000000..a9e14b4 --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_S_CONV_SETTINGS.slnk @@ -0,0 +1,6 @@ + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_ALIGNMENT.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_ALIGNMENT.slnk index 7ac72db..5110251 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_ALIGNMENT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_ALIGNMENT.slnk @@ -1,10 +1,10 @@ - - - - - - - - - + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDER.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDER.slnk index 9601fcd..42d82e7 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDER.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDER.slnk @@ -1,10 +1,10 @@ - - - - - - - - - + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDERS.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDERS.slnk index 108f351..b90d45b 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDERS.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_BORDERS.slnk @@ -1,47 +1,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COLOR.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COLOR.slnk index 627de69..ad54c77 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COLOR.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COLOR.slnk @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COMPLETE.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COMPLETE.slnk index 0fdb482..b8e7830 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COMPLETE.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_COMPLETE.slnk @@ -1,88 +1,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_FONT.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_FONT.slnk index 85729f5..c66c107 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_FONT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_FONT.slnk @@ -1,18 +1,18 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_NUMBER_FORMAT.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_NUMBER_FORMAT.slnk index 92e735a..07ec5a1 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_NUMBER_FORMAT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_NUMBER_FORMAT.slnk @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_PROTECTION.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_PROTECTION.slnk index c104a1a..2480495 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLEX_PROTECTION.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLEX_PROTECTION.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLE_ALIGNMENT.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLE_ALIGNMENT.slnk index a4c1e96..1c82487 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLE_ALIGNMENT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLE_ALIGNMENT.slnk @@ -1,10 +1,10 @@ - - - - - - - - - + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDER.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDER.slnk index ed69323..145152a 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDER.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDER.slnk @@ -1,10 +1,10 @@ - - - - - - - - - + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDERS.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDERS.slnk index 68e365d..9081415 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDERS.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLE_BORDERS.slnk @@ -1,47 +1,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLE_COMPLETE.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLE_COMPLETE.slnk index 8a15f21..dd167da 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLE_COMPLETE.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLE_COMPLETE.slnk @@ -1,88 +1,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLE_FONT.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLE_FONT.slnk index 5550d1a..0dc722d 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLE_FONT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLE_FONT.slnk @@ -1,18 +1,18 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLE_NUMBER_FORMAT.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLE_NUMBER_FORMAT.slnk index fb15bbf..8919092 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLE_NUMBER_FORMAT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLE_NUMBER_FORMAT.slnk @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_CSTYLE_PROTECTION.slnk b/ZA2X/TABL/ZEXCEL_S_CSTYLE_PROTECTION.slnk index 1314a3a..e486cdc 100644 --- a/ZA2X/TABL/ZEXCEL_S_CSTYLE_PROTECTION.slnk +++ b/ZA2X/TABL/ZEXCEL_S_CSTYLE_PROTECTION.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk b/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk index ad18f15..2752a5a 100644 --- a/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk +++ b/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk @@ -1,17 +1,17 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk b/ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk index afb8b25..bfae045 100644 --- a/ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk +++ b/ZA2X/TABL/ZEXCEL_S_ORG_REL.slnk @@ -1,119 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_SHEET_STYLE.slnk b/ZA2X/TABL/ZEXCEL_S_SHEET_STYLE.slnk index 940aaef..8c7b104 100644 --- a/ZA2X/TABL/ZEXCEL_S_SHEET_STYLE.slnk +++ b/ZA2X/TABL/ZEXCEL_S_SHEET_STYLE.slnk @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLEMAPPING.slnk b/ZA2X/TABL/ZEXCEL_S_STYLEMAPPING.slnk index 9fe1a3a..e99b737 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLEMAPPING.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLEMAPPING.slnk @@ -1,178 +1,198 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLES_COND_MAPPING.slnk b/ZA2X/TABL/ZEXCEL_S_STYLES_COND_MAPPING.slnk index cad0477..bf47f48 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLES_COND_MAPPING.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLES_COND_MAPPING.slnk @@ -1,6 +1,6 @@ - - - + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk b/ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk index 299b276..31e7820 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLES_MAPPING.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk index ea370a7..abe4cb0 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_ALIGNMENT.slnk @@ -1,10 +1,10 @@ - - - - - - - - - + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk index 41669ab..eb1fcbc 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_BORDER.slnk @@ -1,36 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_COLOR.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_COLOR.slnk index 722ffb8..806196c 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLE_COLOR.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_COLOR.slnk @@ -1,6 +1,6 @@ - - - + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk index 8bd8b47..3761355 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_FONT.slnk @@ -1,18 +1,18 @@ - - - + + + - + - + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk index b996db7..83c4518 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_NUMFMT.slnk @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_STYLE_PROTECTION.slnk b/ZA2X/TABL/ZEXCEL_S_STYLE_PROTECTION.slnk index 060b32c..0c442e1 100644 --- a/ZA2X/TABL/ZEXCEL_S_STYLE_PROTECTION.slnk +++ b/ZA2X/TABL/ZEXCEL_S_STYLE_PROTECTION.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk index a36e8af..31e3797 100644 --- a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk +++ b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_COLUMNDIME.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk index 761e0d7..0b56cc4 100644 --- a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk +++ b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_HEAD_FOOT.slnk @@ -1,6 +1,6 @@ - - - + + + @@ -8,14 +8,14 @@ - + - + @@ -24,14 +24,14 @@ - + - + @@ -40,13 +40,13 @@ - + - + diff --git a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk index 64f2e1d..10a9649 100644 --- a/ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk +++ b/ZA2X/TABL/ZEXCEL_S_WORKSHEET_ROWDIMENSIO.slnk @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_AUTOFILTER_VALUES.slnk b/ZA2X/TTYP/ZEXCEL_T_AUTOFILTER_VALUES.slnk index c9f0388..1939dca 100644 --- a/ZA2X/TTYP/ZEXCEL_T_AUTOFILTER_VALUES.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_AUTOFILTER_VALUES.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk b/ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk index 29409f1..87c0dbd 100644 --- a/ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_CELLXFS.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk index d6638ee..ea6e9a1 100644 --- a/ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk index abaf13b..8631faf 100644 --- a/ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_CELL_DATA_UNSORTED.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CONVERTER_COL.slnk b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_COL.slnk index 7752997..8f99331 100644 --- a/ZA2X/TTYP/ZEXCEL_T_CONVERTER_COL.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_COL.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FCAT.slnk b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FCAT.slnk index 812e864..8eeeb33 100644 --- a/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FCAT.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FCAT.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FIL.slnk b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FIL.slnk index 5eaac82..12cb2ed 100644 --- a/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FIL.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_FIL.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CONVERTER_LAYO.slnk b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_LAYO.slnk new file mode 100644 index 0000000..f1e8546 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_CONVERTER_LAYO.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/TTYP/ZEXCEL_T_CONV_FIELDCATALOG.slnk b/ZA2X/TTYP/ZEXCEL_T_CONV_FIELDCATALOG.slnk new file mode 100644 index 0000000..1f76496 --- /dev/null +++ b/ZA2X/TTYP/ZEXCEL_T_CONV_FIELDCATALOG.slnk @@ -0,0 +1,2 @@ + + diff --git a/ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk b/ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk index f852a4d..cd59511 100644 --- a/ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_FIELDCATALOG.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk b/ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk index b1b05ff..8de05e2 100644 --- a/ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_SHARED_STRING.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_SHEET_STYLE.slnk b/ZA2X/TTYP/ZEXCEL_T_SHEET_STYLE.slnk index 9db53d1..b89c1cb 100644 --- a/ZA2X/TTYP/ZEXCEL_T_SHEET_STYLE.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_SHEET_STYLE.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING1.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING1.slnk index ca00b4b..77085e1 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING1.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING1.slnk @@ -1,6 +1,6 @@ - - + + - + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING2.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING2.slnk index 167323e..ca0356b 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING2.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLEMAPPING2.slnk @@ -1,4 +1,4 @@ - - - + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLES_COND_MAPPING.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLES_COND_MAPPING.slnk index 8a7d662..a44c472 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLES_COND_MAPPING.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLES_COND_MAPPING.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk index 06c4a9b..ed4ce81 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLES_MAPPING.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk index fb30252..bb9926c 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_ALIGNMENT.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk index 0dc3848..6f071e6 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_BORDER.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_COLOR_ARGB.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_COLOR_ARGB.slnk index ddc08f4..a786c98 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLE_COLOR_ARGB.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_COLOR_ARGB.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk index 6e19440..6e6cfaf 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_FILL.slnk @@ -1,7 +1,7 @@ - - + + - + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk index 1564172..199c26f 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_FONT.slnk @@ -1,5 +1,5 @@ - - + + @@ -7,7 +7,7 @@ - - - + + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk index 6da9c5f..c75ba3f 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_NUMFMT.slnk @@ -1,4 +1,4 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_STYLE_PROTECTION.slnk b/ZA2X/TTYP/ZEXCEL_T_STYLE_PROTECTION.slnk index 6ebfad2..4b0c7d6 100644 --- a/ZA2X/TTYP/ZEXCEL_T_STYLE_PROTECTION.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_STYLE_PROTECTION.slnk @@ -1,5 +1,5 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk index 10629bb..f0f3c92 100644 --- a/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_COLUMNDIME.slnk @@ -1,2 +1,2 @@ - - + + diff --git a/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk index da2bfe6..c10b6e6 100644 --- a/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk +++ b/ZA2X/TTYP/ZEXCEL_T_WORKSHEET_ROWDIMENSIO.slnk @@ -1,2 +1,2 @@ - - + + From 1d18ae5a30fd4a86b287a80103d099fbaaa10162 Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 12 Jan 2015 15:00:14 -0600 Subject: [PATCH 2/5] Add demo report 41 --- ZA2X/PROG/ZDEMO_EXCEL.slnk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ZA2X/PROG/ZDEMO_EXCEL.slnk b/ZA2X/PROG/ZDEMO_EXCEL.slnk index b779d7b..d485a0f 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL.slnk @@ -55,6 +55,7 @@ START-OF-SELECTION. SUBMIT zdemo_excel12 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Column size SUBMIT zdemo_excel13 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Merge cell SUBMIT zdemo_excel14 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Alignment + " zdemo_excel15 added at the end SUBMIT zdemo_excel16 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Drawing SUBMIT zdemo_excel17 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Lock sheet SUBMIT zdemo_excel18 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Lock workbook @@ -81,6 +82,7 @@ START-OF-SELECTION. SUBMIT zdemo_excel38 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Show off integration of drawings ( here using the SAP-Icons ) SUBMIT zdemo_excel39 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Charts SUBMIT zdemo_excel40 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Demo Printsettings + SUBMIT zdemo_excel41 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Inheritance " " Reader/Writer Demo must always run at the end " to make sure all documents where created From 78b3f66d08c5095fe71cb8bf8870ad4b897f2221 Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 12 Jan 2015 15:30:48 -0600 Subject: [PATCH 3/5] Daily Build 7.0.3 build --- build/ABAP2XLSX_V_7_0_3.nugg | 40978 +++++++++++++++++++++++++++++ build/ABAP2XLSX_V_7_0_3.nugg.zip | Bin 0 -> 321144 bytes build/ABAP2XLSX_V_7_0_3.zip | Bin 0 -> 1535022 bytes 3 files changed, 40978 insertions(+) create mode 100644 build/ABAP2XLSX_V_7_0_3.nugg create mode 100644 build/ABAP2XLSX_V_7_0_3.nugg.zip create mode 100644 build/ABAP2XLSX_V_7_0_3.zip diff --git a/build/ABAP2XLSX_V_7_0_3.nugg b/build/ABAP2XLSX_V_7_0_3.nugg new file mode 100644 index 0000000..07b89ea --- /dev/null +++ b/build/ABAP2XLSX_V_7_0_3.nugg @@ -0,0 +1,40978 @@ + + + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + CLASS zcl_tc_excel DEFINITION DEFERRED. +CLASS zcl_excel DEFINITION LOCAL FRIENDS zcl_tc_excel. + +*----------------------------------------------------------------------* +* CLASS zcl_Tc_Excel DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_tc_excel DEFINITION FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS +. +*?<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> +*?<asx:values> +*?<TESTCLASS_OPTIONS> +*?<TEST_CLASS>zcl_Tc_Excel +*?</TEST_CLASS> +*?<TEST_MEMBER>f_Cut +*?</TEST_MEMBER> +*?<OBJECT_UNDER_TEST>ZCL_EXCEL +*?</OBJECT_UNDER_TEST> +*?<OBJECT_IS_LOCAL/> +*?<GENERATE_FIXTURE>X +*?</GENERATE_FIXTURE> +*?<GENERATE_CLASS_FIXTURE>X +*?</GENERATE_CLASS_FIXTURE> +*?<GENERATE_INVOCATION>X +*?</GENERATE_INVOCATION> +*?<GENERATE_ASSERT_EQUAL>X +*?</GENERATE_ASSERT_EQUAL> +*?</TESTCLASS_OPTIONS> +*?</asx:values> +*?</asx:abap> + PRIVATE SECTION. +* ================ + DATA: + f_cut TYPE REF TO zcl_excel. "class under test + + CLASS-METHODS: class_setup. + CLASS-METHODS: class_teardown. + METHODS: setup. + METHODS: teardown. + METHODS: create_empty_excel FOR TESTING. + +ENDCLASS. "zcl_Tc_Excel + + +*----------------------------------------------------------------------* +* CLASS zcl_Tc_Excel IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_tc_excel IMPLEMENTATION. +* ================================== + + METHOD class_setup. +* =================== + + + ENDMETHOD. "class_Setup + + + METHOD class_teardown. +* ====================== + + + ENDMETHOD. "class_Teardown + + + METHOD setup. +* ============= + + CREATE OBJECT f_cut. + ENDMETHOD. "setup + + + METHOD teardown. +* ================ + + + ENDMETHOD. "teardown + +*// START TEST METHODS + + METHOD create_empty_excel. +* ================================== + + DATA: lv_count TYPE i. + lv_count = f_cut->get_worksheets_size( ). + + cl_abap_unit_assert=>assert_equals( act = lv_count + exp = 1 + msg = 'Testing number of sheet' + level = if_aunit_constants=>tolerable ). + ENDMETHOD. "create_empty_excel + +*// END TEST METHODS + + +ENDCLASS. "zcl_Tc_Excel + + + + + + + + + + + + + + + METHOD zif_excel_book_properties~initialize. + DATA: lv_timestamp TYPE timestampl. + + me->zif_excel_book_properties~application = 'Microsoft Excel'. + me->zif_excel_book_properties~appversion = '12.0000'. + + GET TIME STAMP FIELD lv_timestamp. + me->zif_excel_book_properties~created = lv_timestamp. + me->zif_excel_book_properties~creator = sy-uname. + me->zif_excel_book_properties~description = zcl_excel=>version. + me->zif_excel_book_properties~modified = lv_timestamp. + me->zif_excel_book_properties~lastmodifiedby = sy-uname. +ENDMETHOD. + + + method ZIF_EXCEL_BOOK_PROTECTION~INITIALIZE. + me->zif_excel_book_protection~protected = zif_excel_book_protection=>c_unprotected. + me->zif_excel_book_protection~lockrevision = zif_excel_book_protection=>c_unlocked. + me->zif_excel_book_protection~lockstructure = zif_excel_book_protection=>c_unlocked. + me->zif_excel_book_protection~lockwindows = zif_excel_book_protection=>c_unlocked. + CLEAR me->zif_excel_book_protection~workbookpassword. + CLEAR me->zif_excel_book_protection~revisionspassword. + endmethod. + + + method ZIF_EXCEL_BOOK_VBA_PROJECT~SET_CODENAME. + me->zif_excel_book_vba_project~codename = ip_codename. + endmethod. + + + method ZIF_EXCEL_BOOK_VBA_PROJECT~SET_CODENAME_PR. + me->zif_excel_book_vba_project~codename_pr = ip_codename_pr. + endmethod. + + + method ZIF_EXCEL_BOOK_VBA_PROJECT~SET_VBAPROJECT. + me->zif_excel_book_vba_project~vbaproject = ip_vbaproject. + endmethod. + + + + + method ADD_NEW_AUTOFILTER. +* Check for autofilter reference: new or overwrite; only one per sheet + ro_autofilter = autofilters->add( io_sheet = io_sheet ) . + endmethod. + + + + + + method ADD_NEW_DRAWING. + DATA: lv_guid TYPE guid_16. +* Create default blank worksheet + CREATE OBJECT eo_drawing + EXPORTING + ip_type = ip_type + ip_title = ip_title. + + CASE ip_type. + WHEN 'image'. + drawings->add( eo_drawing ). + WHEN 'chart'. + charts->add( eo_drawing ). + ENDCASE. + endmethod. + + + + method ADD_NEW_RANGE. +* Create default blank range + CREATE OBJECT eo_range. + ranges->add( eo_range ). + endmethod. + + + + + method ADD_NEW_STYLE. +* Start of deletion # issue 139 - Dateretention of cellstyles +* CREATE OBJECT eo_style. +* styles->add( eo_style ). +* End of deletion # issue 139 - Dateretention of cellstyles +* Start of insertion # issue 139 - Dateretention of cellstyles +* Create default style + CREATE OBJECT eo_style + EXPORTING + ip_guid = ip_guid. + styles->add( eo_style ). + + DATA: style2 TYPE zexcel_s_stylemapping. +* Copy to new representations + style2 = stylemapping_dynamic_style( eo_style ). + INSERT style2 INTO TABLE t_stylemapping1. + INSERT style2 INTO TABLE t_stylemapping2. +* End of insertion # issue 139 - Dateretention of cellstyles + + endmethod. + + + + + + method ADD_NEW_WORKSHEET. + DATA: lv_guid TYPE guid_16. + +* Create default blank worksheet + CREATE OBJECT eo_worksheet + EXPORTING + ip_excel = me + ip_title = ip_title. + + worksheets->add( eo_worksheet ). + worksheets->active_worksheet = worksheets->size( ). + endmethod. + + + METHOD add_static_styles. + " # issue 139 + FIELD-SYMBOLS: <style1> LIKE LINE OF t_stylemapping1, + <style2> LIKE LINE OF t_stylemapping2. + DATA: style TYPE REF TO zcl_excel_style. + + LOOP AT me->t_stylemapping1 ASSIGNING <style1> WHERE added_to_iterator IS INITIAL. + READ TABLE me->t_stylemapping2 ASSIGNING <style2> WITH TABLE KEY guid = <style1>-guid. + CHECK sy-subrc = 0. " Should always be true since these tables are being filled parallel + + style = me->add_new_style( <style1>-guid ). + + zcl_excel_common=>recursive_struct_to_class( EXPORTING i_source = <style1>-complete_style + i_sourcex = <style1>-complete_stylex + CHANGING e_target = style ). + + ENDLOOP. +ENDMETHOD. + + + method CONSTRUCTOR. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style. + +* Inizialize instance objects + CREATE OBJECT security. + CREATE OBJECT worksheets. + CREATE OBJECT ranges. + CREATE OBJECT styles. + CREATE OBJECT drawings + EXPORTING + ip_type = zcl_excel_drawing=>type_image. + CREATE OBJECT charts + EXPORTING + ip_type = zcl_excel_drawing=>type_chart. + CREATE OBJECT legacy_palette. + CREATE OBJECT autofilters. + + me->zif_excel_book_protection~initialize( ). + me->zif_excel_book_properties~initialize( ). + + me->add_new_worksheet( ). + me->add_new_style( ). " Standard style + lo_style = me->add_new_style( ). " Standard style with fill gray125 + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. + + endmethod. + + + + method GET_ACTIVE_SHEET_INDEX. + r_active_worksheet = me->worksheets->active_worksheet. + endmethod. + + + + method GET_ACTIVE_WORKSHEET. + + eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). + + endmethod. + + + + method GET_AUTOFILTERS_REFERENCE. + + ro_autofilters = autofilters. + + endmethod. + + + + method GET_DEFAULT_STYLE. + ep_style = me->default_style. + endmethod. + + + + + method GET_DRAWINGS_ITERATOR. + + CASE ip_type. + WHEN zcl_excel_drawing=>type_image. + eo_iterator = me->drawings->get_iterator( ). + WHEN zcl_excel_drawing=>type_chart. + eo_iterator = me->charts->get_iterator( ). + WHEN OTHERS. + ENDCASE. + + endmethod. + + + + method GET_NEXT_TABLE_ID. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lv_tables_count TYPE i. + + lo_iterator = me->get_worksheets_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_tables_count = lo_worksheet->get_tables_size( ). + ADD lv_tables_count TO ep_id. + + ENDWHILE. + + ADD 1 TO ep_id. + + endmethod. + + + + method GET_RANGES_ITERATOR. + + eo_iterator = me->ranges->get_iterator( ). + + endmethod. + + + + + + method GET_STATIC_CELLSTYLE_GUID. +" # issue 139 + DATA: style LIKE LINE OF me->t_stylemapping1. + + READ TABLE me->t_stylemapping1 INTO style + WITH TABLE KEY dynamic_style_guid = style-guid " no dynamic style --> look for initial guid here + complete_style = ip_cstyle_complete + complete_stylex = ip_cstylex_complete. + IF sy-subrc <> 0. + style-complete_style = ip_cstyle_complete. + style-complete_stylex = ip_cstylex_complete. + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = style-guid. + INSERT style INTO TABLE me->t_stylemapping1. + INSERT style INTO TABLE me->t_stylemapping2. + + ENDIF. + + ep_guid = style-guid. + endmethod. + + + + method GET_STYLES_ITERATOR. + + eo_iterator = me->styles->get_iterator( ). + + endmethod. + + + + + + method GET_STYLE_INDEX_IN_STYLES. + DATA: index TYPE syindex. + DATA: lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style TYPE REF TO zcl_excel_style. + + CHECK ip_guid IS NOT INITIAL. + + + lo_iterator = me->get_styles_iterator( ). + WHILE lo_iterator->has_next( ) = 'X'. + ADD 1 TO index. + lo_style ?= lo_iterator->get_next( ). + IF lo_style->get_guid( ) = ip_guid. + ep_index = index. + EXIT. + ENDIF. + ENDWHILE. + + IF ep_index IS INITIAL. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Index not found'. + else. + SUBTRACT 1 from ep_index. " In excel list starts with "0" + ENDIF. + endmethod. + + + + + + method GET_STYLE_TO_GUID. + " # issue 139 + + READ TABLE me->t_stylemapping2 INTO ep_stylemapping WITH TABLE KEY guid = ip_guid. + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'GUID not found'. + ENDIF. + + IF ep_stylemapping-dynamic_style_guid IS NOT INITIAL. + zcl_excel_common=>recursive_class_to_struct( EXPORTING i_source = ep_stylemapping-cl_style + CHANGING e_target = ep_stylemapping-complete_style + e_targetx = ep_stylemapping-complete_stylex ). + ENDIF. + + + endmethod. + + + + method GET_WORKSHEETS_ITERATOR. + + eo_iterator = me->worksheets->get_iterator( ). + + endmethod. + + + + method GET_WORKSHEETS_NAME. + + ep_name = me->worksheets->name. + + endmethod. + + + + method GET_WORKSHEETS_SIZE. + + ep_size = me->worksheets->size( ). + + endmethod. + + + + + method GET_WORKSHEET_BY_NAME. + + DATA: lv_index TYPE zexcel_active_worksheet, + l_size TYPE i. + + l_size = get_worksheets_size( ). + + DO l_size TIMES. + lv_index = sy-index. + eo_worksheet = me->worksheets->get( lv_index ). + IF eo_worksheet->get_title( ) = ip_sheet_name. + RETURN. + ENDIF. + ENDDO. + + CLEAR eo_worksheet. + + endmethod. + + + + method SET_ACTIVE_SHEET_INDEX. + me->worksheets->active_worksheet = i_active_worksheet. + endmethod. + + + + method SET_ACTIVE_SHEET_INDEX_BY_NAME. + + DATA: ws_it TYPE REF TO cl_object_collection_iterator, + ws TYPE REF TO zcl_excel_worksheet, + lv_title TYPE ZEXCEL_SHEET_TITLE, + count TYPE i VALUE 1. + + ws_it = me->worksheets->get_iterator( ). + + WHILE ws_it->if_object_collection_iterator~has_next( ) = abap_true. + ws ?= ws_it->if_object_collection_iterator~get_next( ). + lv_title = ws->get_title( ). + IF lv_title = i_worksheet_name. + me->worksheets->active_worksheet = count. + EXIT. + ENDIF. + count = count + 1. + ENDWHILE. + + endmethod. + + + + + method SET_DEFAULT_STYLE. + me->default_style = ip_style. + endmethod. + + + + + method STYLEMAPPING_DYNAMIC_STYLE. +" # issue 139 + eo_style2-dynamic_style_guid = ip_style->get_guid( ). + eo_style2-guid = eo_style2-dynamic_style_guid. + eo_style2-added_to_iterator = abap_true. + eo_style2-cl_style = ip_style. + +* don't care about attributes here, since this data may change +* dynamically + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + method CONSTRUCTOR. + worksheet = io_sheet. + endmethod. + + + + method GET_FILTER_AREA. + + validate_area( ). + + rs_area = filter_area. + + endmethod. + + + + method GET_FILTER_RANGE. + DATA: l_row_start_c TYPE string, + l_row_end_c TYPE string, + l_col_start_c TYPE string, + l_col_end_c TYPE string, + l_value TYPE string. + + validate_area( ). + + l_row_end_c = filter_area-row_end. + CONDENSE l_row_end_c NO-GAPS. + + l_row_start_c = filter_area-row_start. + CONDENSE l_row_start_c NO-GAPS. + + l_col_start_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_start ) . + l_col_end_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_end ) . + + CONCATENATE l_col_start_c l_row_start_c ':' l_col_end_c l_row_end_c INTO r_range. + + endmethod. + + + + method GET_FILTER_REFERENCE. + DATA: l_row_start_c TYPE string, + l_row_end_c TYPE string, + l_col_start_c TYPE string, + l_col_end_c TYPE string, + l_value TYPE string. + + validate_area( ). + + l_row_end_c = filter_area-row_end. + CONDENSE l_row_end_c NO-GAPS. + + l_row_start_c = filter_area-row_start. + CONDENSE l_row_start_c NO-GAPS. + + l_col_start_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_start ) . + l_col_end_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_end ) . + l_value = worksheet->get_title( ) . + + r_ref = zcl_excel_common=>escape_string( ip_value = l_value ). + + CONCATENATE r_ref '!$' l_col_start_c '$' l_row_start_c ':$' l_col_end_c '$' l_row_end_c INTO r_ref. + + endmethod. + + + + method GET_VALUES. + + rt_filter = values. + + endmethod. + + + + method SET_FILTER_AREA. + + filter_area = is_area. + + endmethod. + + + + + method SET_VALUE. + DATA: ls_values TYPE zexcel_s_autofilter_values. + +* Checks a re missing. + ls_values-column = i_column. + ls_values-value = i_value. + + INSERT ls_values INTO TABLE values. +* Now we need to be sure we don't get the same value again. + DELETE ADJACENT DUPLICATES FROM values COMPARING column value. + + endmethod. + + + + method SET_VALUES. + +* Checks are missing. + values = it_values. + DELETE ADJACENT DUPLICATES FROM values COMPARING column value. + + endmethod. + + + method VALIDATE_AREA. + DATA: l_col TYPE zexcel_cell_column, + l_row TYPE zexcel_cell_row. + + l_row = worksheet->get_highest_row( ) . + l_col = worksheet->get_highest_column( ) . + + IF filter_area IS INITIAL. + filter_area-row_start = 1. + filter_area-col_start = 1. + filter_area-row_end = l_row . + filter_area-col_end = l_col . + ENDIF. + + IF filter_area-row_start < 1. + filter_area-row_start = 1. + ENDIF. + IF filter_area-col_start < 1. + filter_area-col_start = 1. + ENDIF. + IF filter_area-row_end > l_row OR + filter_area-row_end < 1. + filter_area-row_end = l_row. + ENDIF. + IF filter_area-col_end > l_col OR + filter_area-col_end < 1. + filter_area-col_end = l_col. + ENDIF. + IF filter_area-row_start >= filter_area-row_end. + filter_area-row_start = filter_area-row_end - 1. + IF filter_area-row_start < 1. + filter_area-row_start = 1. + filter_area-row_end = 2. + ENDIF. + ENDIF. + IF filter_area-col_start > filter_area-col_end. + filter_area-col_start = filter_area-col_end. + ENDIF. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature +TYPES: BEGIN OF ts_objects, + sheet_guid TYPE uuid, + autofilter TYPE REF TO zcl_excel_autofilter, + END OF ts_objects, + + tt_objects TYPE HASHED TABLE OF ts_objects WITH UNIQUE KEY sheet_guid. + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + method ADD. + DATA: ls_autofilters TYPE ts_objects, + l_guid TYPE uuid. + l_guid = io_sheet->get_guid( ) . + READ TABLE autofilters INTO ls_autofilters WITH TABLE KEY sheet_guid = l_guid. + IF sy-subrc = 0. + ro_autofilter = ls_autofilters-autofilter. + ELSE. + CREATE OBJECT ro_autofilter + EXPORTING + io_sheet = io_sheet. + ls_autofilters-autofilter = ro_autofilter. + ls_autofilters-sheet_guid = l_guid. + INSERT ls_autofilters INTO TABLE autofilters . + ENDIF. + endmethod. + + + method CLEAR. + + REFRESH autofilters. + + endmethod. + + + + + method GET. + + DATA: ls_autofilters TYPE ts_objects. + + READ TABLE autofilters INTO ls_autofilters WITH TABLE KEY sheet_guid = i_sheet_guid. + IF sy-subrc = 0. + ro_autofilter = ls_autofilters-autofilter. + ELSE. + CLEAR ro_autofilter. + ENDIF. + + endmethod. + + + + method IS_EMPTY. + IF autofilters IS INITIAL. + r_empty = abap_true. + ENDIF. + endmethod. + + + + method REMOVE. + DATA: ls_autofilters TYPE ts_objects. + + DELETE autofilters WHERE sheet_guid = i_sheet_guid. + + endmethod. + + + + method SIZE. + DESCRIBE TABLE autofilters LINES r_size. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + CLASS lcl_excel_common_test DEFINITION DEFERRED. +CLASS zcl_excel_common DEFINITION LOCAL FRIENDS lcl_excel_common_test. + +*----------------------------------------------------------------------* +* CLASS lcl_Excel_Common_Test DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_excel_common_test DEFINITION FOR TESTING "#AU Risk_Level Harmless + . "#AU Duration Short +*?<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> +*?<asx:values> +*?<TESTCLASS_OPTIONS> +*?<TEST_CLASS>lcl_Excel_Common_Test +*?</TEST_CLASS> +*?<TEST_MEMBER>f_Cut +*?</TEST_MEMBER> +*?<OBJECT_UNDER_TEST>ZCL_EXCEL_COMMON +*?</OBJECT_UNDER_TEST> +*?<OBJECT_IS_LOCAL/> +*?<GENERATE_FIXTURE>X +*?</GENERATE_FIXTURE> +*?<GENERATE_CLASS_FIXTURE>X +*?</GENERATE_CLASS_FIXTURE> +*?<GENERATE_INVOCATION>X +*?</GENERATE_INVOCATION> +*?<GENERATE_ASSERT_EQUAL>X +*?</GENERATE_ASSERT_EQUAL> +*?</TESTCLASS_OPTIONS> +*?</asx:values> +*?</asx:abap> + PRIVATE SECTION. +* ================ + DATA: + lx_excel TYPE REF TO zcx_excel, + ls_symsg_act TYPE symsg, " actual messageinformation of exception + ls_symsg_exp TYPE symsg, " expected messageinformation of exception + f_cut TYPE REF TO zcl_excel_common. "class under test + + CLASS-METHODS: class_setup. + CLASS-METHODS: class_teardown. + METHODS: setup. + METHODS: teardown. +* METHODS: char2hex FOR TESTING. + METHODS: convert_column2alpha FOR TESTING. + METHODS: convert_column2int FOR TESTING. + METHODS: date_to_excel_string FOR TESTING. + METHODS: encrypt_password FOR TESTING. + METHODS: excel_string_to_date FOR TESTING. + METHODS: excel_string_to_time FOR TESTING. +* METHODS: number_to_excel_string FOR TESTING. + METHODS: time_to_excel_string FOR TESTING. + METHODS: split_file FOR TESTING. + METHODS: convert_range2column_a_row FOR TESTING. + METHODS: describe_structure FOR TESTING. + METHODS: calculate_cell_distance FOR TESTING. + METHODS: shift_formula FOR TESTING. + METHODS: is_cell_in_range FOR TESTING. +ENDCLASS. "lcl_Excel_Common_Test + + +*----------------------------------------------------------------------* +* CLASS lcl_Excel_Common_Test IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_excel_common_test IMPLEMENTATION. +* =========================================== + + METHOD class_setup. +* =================== + + + ENDMETHOD. "class_Setup + + + METHOD class_teardown. +* ====================== + + + ENDMETHOD. "class_Teardown + + + METHOD setup. +* ============= + + CREATE OBJECT f_cut. + ENDMETHOD. "setup + + + METHOD teardown. +* ================ + + + ENDMETHOD. "teardown + + + METHOD convert_column2alpha. +* ============================ + DATA ep_column TYPE zexcel_cell_column_alpha. + +* Test 1. Simple test + TRY. + ep_column = zcl_excel_common=>convert_column2alpha( 1 ). + + zcl_excel_common=>assert_equals( + act = ep_column + exp = 'A' + msg = 'Wrong column conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 2. Max column for OXML #16,384 = XFD + TRY. + ep_column = zcl_excel_common=>convert_column2alpha( 16384 ). + + zcl_excel_common=>assert_equals( + act = ep_column + exp = 'XFD' + msg = 'Wrong column conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 3. Index 0 is out of bounds + TRY. + ep_column = zcl_excel_common=>convert_column2alpha( 0 ). + + zcl_excel_common=>assert_equals( + act = ep_column + exp = 'A' + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>assert_equals( + act = lx_excel->error + exp = 'Index out of bounds' + msg = 'Colum index 0 is out of bounds, min column index is 1' + level = if_aunit_constants=>fatal + ). + ENDTRY. + +* Test 4. Exception should be thrown index out of bounds + TRY. + ep_column = zcl_excel_common=>convert_column2alpha( 16385 ). + + zcl_excel_common=>assert_differs( + act = ep_column + exp = 'XFE' + msg = 'Colum index 16385 is out of bounds, max column index is 16384' + level = if_aunit_constants=>fatal + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>assert_equals( + act = lx_excel->error + exp = 'Index out of bounds' + msg = 'Wrong exception is thrown' + level = if_aunit_constants=>tolerable + ). + ENDTRY. + ENDMETHOD. "convert_Column2alpha + + + METHOD convert_column2int. +* ========================== + DATA ep_column TYPE zexcel_cell_column. + +* Test 1. Basic test + TRY. + ep_column = zcl_excel_common=>convert_column2int( 'A' ). + + zcl_excel_common=>assert_equals( + act = ep_column + exp = 1 + msg = 'Wrong column conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 2. Max column + TRY. + ep_column = zcl_excel_common=>convert_column2int( 'XFD' ). + + zcl_excel_common=>assert_equals( + act = ep_column + exp = 16384 + msg = 'Wrong column conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 3. Out of bounds + TRY. + ep_column = zcl_excel_common=>convert_column2int( '' ). + + zcl_excel_common=>assert_differs( act = ep_column + exp = '0' + msg = 'Wrong column conversion' + level = if_aunit_constants=>critical ). + CATCH zcx_excel INTO lx_excel. + CLEAR: ls_symsg_act, + ls_symsg_exp. + ls_symsg_exp-msgid = 'ZABAP2XLSX'. + ls_symsg_exp-msgno = '800'. + ls_symsg_act-msgid = lx_excel->syst_at_raise-msgid. + ls_symsg_act-msgno = lx_excel->syst_at_raise-msgno. + zcl_excel_common=>assert_equals( act = ls_symsg_act + exp = ls_symsg_exp + msg = 'Colum name should be a valid string' + level = if_aunit_constants=>fatal ). + ENDTRY. + +* Test 4. Out of bounds + TRY. + ep_column = zcl_excel_common=>convert_column2int( 'XFE' ). + + zcl_excel_common=>assert_differs( act = ep_column + exp = 16385 + msg = 'Wrong column conversion' + level = if_aunit_constants=>critical ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>assert_equals( act = lx_excel->error + exp = 'Index out of bounds' + msg = 'Colum XFE is out of range' + level = if_aunit_constants=>fatal ). + ENDTRY. + ENDMETHOD. "convert_Column2int + + + METHOD date_to_excel_string. +* ============================ + DATA ep_value TYPE zexcel_cell_value. + +* Test 1. Basic conversion + TRY. + ep_value = zcl_excel_common=>date_to_excel_string( '19000101' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = 1 + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. +* Check around the "Excel Leap Year" 1900 + TRY. + ep_value = zcl_excel_common=>date_to_excel_string( '19000228' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = 59 + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + TRY. + ep_value = zcl_excel_common=>date_to_excel_string( '19000301' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = 61 + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + + +* Test 2. Basic conversion + TRY. + ep_value = zcl_excel_common=>date_to_excel_string( '99991212' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = 2958446 + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 3. Initial date + TRY. + DATA: lv_date TYPE d. + ep_value = zcl_excel_common=>date_to_excel_string( lv_date ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 2. Basic conversion + TRY. + DATA exp_value TYPE zexcel_cell_value VALUE 0. + ep_value = zcl_excel_common=>date_to_excel_string( '18991231' ). + + zcl_excel_common=>assert_differs( + act = ep_value + exp = exp_value + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>assert_equals( + act = lx_excel->error + exp = 'Index out of bounds' + msg = 'Dates prior of 1900 are not available in excel' + level = if_aunit_constants=>critical + ). + ENDTRY. + + ENDMETHOD. "date_To_Excel_String + + + METHOD encrypt_password. +* ======================== + DATA lv_encrypted_pwd TYPE zexcel_aes_password. + + TRY. + lv_encrypted_pwd = zcl_excel_common=>encrypt_password( 'test' ). + + zcl_excel_common=>assert_equals( + act = lv_encrypted_pwd + exp = 'CBEB' + msg = 'Wrong password encryption' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + ENDMETHOD. "encrypt_Password + + + METHOD excel_string_to_date. +* ============================ + DATA ep_value TYPE d. + + +* Test 1. Simple test -> ABAP Manage also date prior of 1900 + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( '0' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '18991231' + msg = 'Wrong date conversion' + level = if_aunit_constants=>tolerable + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. +* Check around the "Excel Leap Year" 1900 + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( '59' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '19000228' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( '61' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '19000301' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 2. Simple test + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( '1' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '19000101' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 3. Index 0 is out of bounds + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( '2958446' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '99991212' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 4. Exception should be thrown index out of bounds + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( '2958447' ). + + zcl_excel_common=>assert_differs( + act = ep_value + exp = '99991212' + msg = 'Wrong date conversion' + level = if_aunit_constants=>fatal + ). + + zcl_excel_common=>assert_differs( + act = ep_value + exp = '00000000' + msg = 'Wrong date conversion' + level = if_aunit_constants=>fatal + ). + + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>assert_equals( + act = lx_excel->error + exp = 'Index out of bounds' + msg = 'Wrong exception is thrown' + level = if_aunit_constants=>tolerable + ). + ENDTRY. + ENDMETHOD. "excel_String_To_Date + + + METHOD excel_string_to_time. +* ============================ + DATA ep_value TYPE t. + +* Test 1. Simple test + TRY. + ep_value = zcl_excel_common=>excel_string_to_time( '0' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '000000' + msg = 'Wrong date conversion' + level = if_aunit_constants=>tolerable + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 2. Simple test + TRY. + ep_value = zcl_excel_common=>excel_string_to_time( '1' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '000000' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 3. Simple test + TRY. + ep_value = zcl_excel_common=>excel_string_to_time( '0.99999' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '235959' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 4. Also string greater than 1 should be managed + TRY. + ep_value = zcl_excel_common=>excel_string_to_time( '4.1' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '022400' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 4. string is not a number + TRY. + ep_value = zcl_excel_common=>excel_string_to_time( 'NaN' ). + + zcl_excel_common=>assert_differs( + act = ep_value + exp = '000000' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>assert_equals( + act = lx_excel->error + exp = 'Unable to interpret time' + msg = 'Time should be a valid string' + level = if_aunit_constants=>fatal + ). + ENDTRY. + ENDMETHOD. "excel_String_To_Time + + + METHOD time_to_excel_string. +* ============================ + DATA ep_value TYPE zexcel_cell_value. + +* Test 1. Basic conversion + TRY. + ep_value = zcl_excel_common=>time_to_excel_string( '000001' ). + " A test directly in Excel returns the value 0.0000115740740740741000 + zcl_excel_common=>assert_equals( + act = ep_value + exp = '0.0000115740740741' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 2. Basic conversion + TRY. + ep_value = zcl_excel_common=>time_to_excel_string( '235959' ). + " A test directly in Excel returns the value 0.9999884259259260000000 + zcl_excel_common=>assert_equals( + act = ep_value + exp = '0.9999884259259260' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 3. Initial date + TRY. + ep_value = zcl_excel_common=>time_to_excel_string( '000000' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '0' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + +* Test 2. Basic conversion + TRY. + ep_value = zcl_excel_common=>time_to_excel_string( '022400' ). + + zcl_excel_common=>assert_equals( + act = ep_value + exp = '0.1000000000000000' + msg = 'Wrong date conversion' + level = if_aunit_constants=>critical + ). + CATCH zcx_excel INTO lx_excel. + zcl_excel_common=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical " Error Severity + ). + ENDTRY. + + ENDMETHOD. "time_To_Excel_String + + METHOD split_file. +* ============================ + + DATA: ep_file TYPE text255, + ep_extension TYPE char10, + ep_dotextension TYPE char10. + + +* Test 1. Basic conversion + zcl_excel_common=>split_file( EXPORTING ip_file = 'filename.xml' + IMPORTING ep_file = ep_file + ep_extension = ep_extension + ep_dotextension = ep_dotextension ). + + zcl_excel_common=>assert_equals( + act = ep_file + exp = 'filename' + msg = 'Split filename failed' + level = if_aunit_constants=>critical ). + + zcl_excel_common=>assert_equals( + act = ep_extension + exp = 'xml' + msg = 'Split extension failed' + level = if_aunit_constants=>critical ). + + zcl_excel_common=>assert_equals( + act = ep_dotextension + exp = '.xml' + msg = 'Split extension failed' + level = if_aunit_constants=>critical ). + +* Test 2. no extension + zcl_excel_common=>split_file( EXPORTING ip_file = 'filename' + IMPORTING ep_file = ep_file + ep_extension = ep_extension + ep_dotextension = ep_dotextension ). + + zcl_excel_common=>assert_equals( + act = ep_file + exp = 'filename' + msg = 'Split filename failed' + level = if_aunit_constants=>critical ). + + zcl_excel_common=>assert_equals( + act = ep_extension + exp = '' + msg = 'Split extension failed' + level = if_aunit_constants=>critical ). + + zcl_excel_common=>assert_equals( + act = ep_dotextension + exp = '' + msg = 'Split extension failed' + level = if_aunit_constants=>critical ). + + ENDMETHOD. "split_file + + METHOD convert_range2column_a_row. + DATA: lv_range TYPE string. + DATA: lv_column_start TYPE zexcel_cell_column_alpha, + lv_column_end TYPE zexcel_cell_column_alpha, + lv_row_start TYPE zexcel_cell_row, + lv_row_end TYPE zexcel_cell_row, + lv_sheet TYPE string. + +* a) input empty --> nothing to do + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = lv_range + IMPORTING + e_column_start = lv_column_start " Cell Column Start + e_column_end = lv_column_end " Cell Column End + e_row_start = lv_row_start " Cell Row + e_row_end = lv_row_end " Cell Row + e_sheet = lv_sheet " Title + ). + + zcl_excel_common=>assert_equals( + act = lv_column_start + exp = '' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_column_end + exp = '' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_start + exp = '' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_end + exp = '' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_sheet + exp = '' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). +* b) sheetname existing - starts with ' example 'Sheet 1'!$B$6:$D$13 + lv_range = `'Sheet 1'!$B$6:$D$13`. + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = lv_range + IMPORTING + e_column_start = lv_column_start " Cell Column Start + e_column_end = lv_column_end " Cell Column End + e_row_start = lv_row_start " Cell Row + e_row_end = lv_row_end " Cell Row + e_sheet = lv_sheet " Title + ). + + zcl_excel_common=>assert_equals( + act = lv_column_start + exp = 'B' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_column_end + exp = 'D' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_start + exp = '6' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_end + exp = '13' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_sheet + exp = 'Sheet 1' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). +* c) sheetname existing - does not start with ' example Sheet1!$B$6:$D$13 + lv_range = `Sheet1!B6:$D$13`. + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = lv_range + IMPORTING + e_column_start = lv_column_start " Cell Column Start + e_column_end = lv_column_end " Cell Column End + e_row_start = lv_row_start " Cell Row + e_row_end = lv_row_end " Cell Row + e_sheet = lv_sheet " Title + ). + + zcl_excel_common=>assert_equals( + act = lv_column_start + exp = 'B' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_column_end + exp = 'D' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_start + exp = '6' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_end + exp = '13' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_sheet + exp = 'Sheet1' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). +* d) no sheetname - just area example $B$6:$D$13 + lv_range = `$B$6:D13`. + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = lv_range + IMPORTING + e_column_start = lv_column_start " Cell Column Start + e_column_end = lv_column_end " Cell Column End + e_row_start = lv_row_start " Cell Row + e_row_end = lv_row_end " Cell Row + e_sheet = lv_sheet " Title + ). + + zcl_excel_common=>assert_equals( + act = lv_column_start + exp = 'B' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_column_end + exp = 'D' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_start + exp = '6' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_row_end + exp = '13' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + zcl_excel_common=>assert_equals( + act = lv_sheet + exp = '' + msg = 'Conversion of range failed' + level = if_aunit_constants=>critical ). + ENDMETHOD. "convert_range2column_a_row + + + METHOD describe_structure. + DATA: ls_test TYPE scarr. + DATA: lo_structdescr TYPE REF TO cl_abap_structdescr. + DATA: lt_structure TYPE ddfields. + FIELD-SYMBOLS: <line> LIKE LINE OF lt_structure. + + " Test with DDIC Type + lo_structdescr ?= cl_abap_structdescr=>describe_by_data( p_data = ls_test ). + lt_structure = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). + READ TABLE lt_structure ASSIGNING <line> INDEX 1. + zcl_excel_common=>assert_equals( + act = <line>-fieldname + exp = 'MANDT' + msg = 'Describe structure failed' + level = if_aunit_constants=>critical ). + + " Test with local defined structure having DDIC and non DDIC elements + TYPES: + BEGIN OF t_test, + carrid TYPE s_carr_id, + carrname TYPE s_carrname, + carrdesc TYPE string, + END OF t_test. + DATA: ls_ttest TYPE t_test. + + lo_structdescr ?= cl_abap_structdescr=>describe_by_data( p_data = ls_ttest ). + lt_structure = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). + READ TABLE lt_structure ASSIGNING <line> INDEX 1. + zcl_excel_common=>assert_equals( + act = <line>-fieldname + exp = 'CARRID' + msg = 'Describe structure failed' + level = if_aunit_constants=>critical ). + + ENDMETHOD. "describe_structure + + + METHOD calculate_cell_distance. + DATA: lv_offset_rows TYPE i, + lv_offset_cols TYPE i, + lv_message TYPE string. + + DEFINE macro_calculate_cell_distance. + zcl_excel_common=>calculate_cell_distance( exporting iv_reference_cell = &1 + iv_current_cell = &2 + importing ev_row_difference = lv_offset_rows + ev_col_difference = lv_offset_cols ). +* Check delta columns + concatenate 'Error calculating column difference in test:' + &1 + '->' + &2 + into lv_message separated by space. + zcl_excel_common=>assert_equals( act = lv_offset_cols + exp = &3 + msg = lv_message + quit = 0 " continue tests + level = if_aunit_constants=>critical ). +* Check delta rows + concatenate 'Error calculating row difference in test:' + &1 + '->' + &2 + into lv_message separated by space. + zcl_excel_common=>assert_equals( act = lv_offset_rows + exp = &4 + msg = lv_message + quit = 0 " continue tests + level = if_aunit_constants=>critical ). + END-OF-DEFINITION. + + + macro_calculate_cell_distance: + 'C12' 'C12' 0 0 , " Same cell + 'C12' 'C13' 0 1 , " Shift down 1 place + 'C12' 'C25' 0 13 , " Shift down some places + 'C12' 'C11' 0 -1 , " Shift up 1 place + 'C12' 'C1' 0 -11 , " Shift up some place + 'C12' 'D12' 1 0 , " Shift right 1 place + 'C12' 'AA12' 24 0 , " Shift right some places + 'C12' 'B12' -1 0 , " Shift left 1 place + 'AA12' 'C12' -24 0 , " Shift left some place + 'AA121' 'C12' -24 -109 . " The full package. + + ENDMETHOD. "CALCULATE_CELL_DISTANCE + + METHOD shift_formula. + DATA: lv_resulting_formula TYPE string, + lv_message TYPE string, + lv_counter TYPE num8. + + DEFINE macro_shift_formula. + add 1 to lv_counter. + clear lv_resulting_formula. + try. + lv_resulting_formula = zcl_excel_common=>shift_formula( iv_reference_formula = &1 + iv_shift_cols = &2 + iv_shift_rows = &3 ). + concatenate 'Wrong result in test' + lv_counter + 'shifting formula ' + &1 + into lv_message separated by space. + zcl_excel_common=>assert_equals( act = lv_resulting_formula + exp = &4 + msg = lv_message + quit = 0 " continue tests + level = if_aunit_constants=>critical ). + catch zcx_excel. + concatenate 'Unexpected exception occurred in test' + lv_counter + 'shifting formula ' + &1 + into lv_message separated by space. + zcl_excel_common=>assert_equals( act = lv_resulting_formula + exp = &4 + msg = lv_message + quit = 0 " continue tests + level = if_aunit_constants=>critical ). + endtry. + END-OF-DEFINITION. + +* Test shifts that should result in a valid output + macro_shift_formula: + 'C17' 0 0 'C17', " Very basic check + 'C17' 2 3 'E20', " Check shift right and down + 'C17' -2 -3 'A14', " Check shift left and up + '$C$17' 1 1 '$C$17', " Fixed columns/rows + 'SUM($C17:C$23)+C30' 1 11 'SUM($C28:D$23)+D41', " Operators and Ranges, mixed fixed rows or columns + 'RNGNAME1+C7' -1 -4 'RNGNAME1+B3', " Operators and Rangename + '"Date:"&TEXT(B2)' 1 1 '"Date:"&TEXT(C3)', " String literals and string concatenation + '[TEST6.XLSX]SHEET1!A1' 1 11 '[TEST6.XLSX]SHEET1!B12', " External sheet reference + `X(B13, "KK" ) ` 1 1 `X(C14,"KK")`, " superflous blanks, multi-argument functions, literals in function, unknown functions +* 'SIN((((((B2))))))' 1 1 'SIN((((((C3))))))', " Deep nesting +* 'SIN(SIN(SIN(SIN(E22))))' 0 1 'SIN(SIN(SIN(SIN(E23))))', " Different type of deep nesting + `SIN(SIN(SIN(SIN(E22))))` 0 1 'SIN(SIN(SIN(SIN(E23))))', " same as above - but with string input instead of Char-input + 'HEUTE()' 2 5 'HEUTE()', " Functions w/o arguments, No cellreferences + '"B2"' 2 5 '"B2"', " No cellreferences + '' 2 5 '', " Empty + 'A1+$A1+A$1+$A$1+B2' -1 0 '#REF!+$A1+#REF!+$A$1+A2', " Referencing error , column only , underflow + 'A1+$A1+A$1+$A$1+B2' 0 -1 '#REF!+#REF!+A$1+$A$1+B1', " Referencing error , row only , underflow + 'A1+$A1+A$1+$A$1+B2' -1 -1 '#REF!+#REF!+#REF!+$A$1+A1'. " Referencing error , row and column , underflow + ENDMETHOD. "SHIFT_FORMULA + + METHOD is_cell_in_range. + DATA ep_cell_in_range TYPE abap_bool. + +* Test 1: upper left corner (in range) + TRY. + ep_cell_in_range = zcl_excel_common=>is_cell_in_range( + ip_column = 'B' + ip_row = 2 + ip_range = 'B2:D4' ). + + zcl_excel_common=>assert_equals( + act = ep_cell_in_range + exp = abap_true + msg = 'Check cell in range failed' + level = if_aunit_constants=>critical ). + CATCH zcx_excel. + zcl_excel_common=>fail( + msg = 'Unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + +* Test 2: lower right corner (in range) + TRY. + ep_cell_in_range = zcl_excel_common=>is_cell_in_range( + ip_column = 'D' + ip_row = 4 + ip_range = 'B2:D4' ). + + zcl_excel_common=>assert_equals( + act = ep_cell_in_range + exp = abap_true + msg = 'Check cell in range failed' + level = if_aunit_constants=>critical ). + CATCH zcx_excel. + zcl_excel_common=>fail( + msg = 'Unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + +* Test 3: left side (out of range) + TRY. + ep_cell_in_range = zcl_excel_common=>is_cell_in_range( + ip_column = 'A' + ip_row = 3 + ip_range = 'B2:D4' ). + + zcl_excel_common=>assert_equals( + act = ep_cell_in_range + exp = abap_false + msg = 'Check cell in range failed' + level = if_aunit_constants=>critical ). + CATCH zcx_excel. + zcl_excel_common=>fail( + msg = 'Unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + +* Test 4: upper side (out of range) + TRY. + ep_cell_in_range = zcl_excel_common=>is_cell_in_range( + ip_column = 'C' + ip_row = 1 + ip_range = 'B2:D4' ). + + zcl_excel_common=>assert_equals( + act = ep_cell_in_range + exp = abap_false + msg = 'Check cell in range failed' + level = if_aunit_constants=>critical ). + CATCH zcx_excel. + zcl_excel_common=>fail( + msg = 'Unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + +* Test 5: right side (out of range) + TRY. + ep_cell_in_range = zcl_excel_common=>is_cell_in_range( + ip_column = 'E' + ip_row = 3 + ip_range = 'B2:D4' ). + + zcl_excel_common=>assert_equals( + act = ep_cell_in_range + exp = abap_false + msg = 'Check cell in range failed' + level = if_aunit_constants=>critical ). + CATCH zcx_excel. + zcl_excel_common=>fail( + msg = 'Unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + +* Test 6: lower side (out of range) + TRY. + ep_cell_in_range = zcl_excel_common=>is_cell_in_range( + ip_column = 'C' + ip_row = 5 + ip_range = 'B2:D4' ). + + zcl_excel_common=>assert_equals( + act = ep_cell_in_range + exp = abap_false + msg = 'Check cell in range failed' + level = if_aunit_constants=>critical ). + CATCH zcx_excel. + zcl_excel_common=>fail( + msg = 'Unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + ENDMETHOD. + +ENDCLASS. "lcl_Excel_Common_Test + + + + + + + + + + + + + + + + ABAP + + + + + + + + + + + + + + + + + + method ASSERT_DIFFERS. + DATA: ls_seoclass TYPE seoclass. + +" Let see >=7.02 + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'CL_ABAP_UNIT_ASSERT'. + + IF sy-subrc = 0. + CALL METHOD (ls_seoclass-clsname)=>assert_differs + EXPORTING + exp = exp + act = act + msg = msg + level = level + tol = tol + quit = quit + RECEIVING + assertion_failed = assertion_failed. + ELSE. +" Let see >=7.00 or even lower + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'CL_AUNIT_ASSERT'. + + IF sy-subrc = 0. + CALL METHOD (ls_seoclass-clsname)=>assert_differs + EXPORTING + exp = exp + act = act + msg = msg + level = level + tol = tol + quit = quit + RECEIVING + assertion_failed = assertion_failed. + ELSE. +* We do nothing for now not supported + ENDIF. + ENDIF. +endmethod. + + + + + + + + + + + METHOD assert_equals. + DATA: ls_seoclass TYPE seoclass. + + " Let see >=7.02 + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'CL_ABAP_UNIT_ASSERT'. + + IF sy-subrc = 0. + CALL METHOD (ls_seoclass-clsname)=>assert_equals + EXPORTING + exp = exp + act = act + msg = msg + level = level + tol = tol + quit = quit + ignore_hash_sequence = ignore_hash_sequence + RECEIVING + assertion_failed = assertion_failed. + ELSE. + " Let see >=7.00 or even lower + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'CL_AUNIT_ASSERT'. + + IF sy-subrc = 0. + CALL METHOD (ls_seoclass-clsname)=>assert_equals + EXPORTING + exp = exp + act = act + msg = msg + level = level + tol = tol + quit = quit + ignore_hash_sequence = ignore_hash_sequence + RECEIVING + assertion_failed = assertion_failed. + ELSE. +* We do nothing for now not supported + ENDIF. + ENDIF. +ENDMETHOD. + + + + + + + + METHOD calculate_cell_distance. + + DATA: lv_reference_row TYPE i, + lv_reference_col_alpha TYPE zexcel_cell_column_alpha, + lv_reference_col TYPE i, + lv_current_row TYPE i, + lv_current_col_alpha TYPE zexcel_cell_column_alpha, + lv_current_col TYPE i. + +*--------------------------------------------------------------------* +* Split reference cell into numerical row/column representation +*--------------------------------------------------------------------* + convert_columnrow2column_a_row( EXPORTING + i_columnrow = iv_reference_cell + IMPORTING + e_column = lv_reference_col_alpha + e_row = lv_reference_row ). + lv_reference_col = convert_column2int( lv_reference_col_alpha ). + +*--------------------------------------------------------------------* +* Split current cell into numerical row/column representation +*--------------------------------------------------------------------* + convert_columnrow2column_a_row( EXPORTING + i_columnrow = iv_current_cell + IMPORTING + e_column = lv_current_col_alpha + e_row = lv_current_row ). + lv_current_col = convert_column2int( lv_current_col_alpha ). + +*--------------------------------------------------------------------* +* Calculate row and column difference +* Positive: Current cell below reference cell +* or Current cell right of reference cell +* Negative: Current cell above reference cell +* or Current cell left of reference cell +*--------------------------------------------------------------------* + ev_row_difference = lv_current_row - lv_reference_row. + ev_col_difference = lv_current_col - lv_reference_col. + +ENDMETHOD. + + + + + method CHAR2HEX. + + IF o_conv IS NOT BOUND. + o_conv = cl_abap_conv_out_ce=>create( endian = 'L' + ignore_cerr = abap_true + replacement = '#' ). + ENDIF. + + CALL METHOD o_conv->reset( ). + CALL METHOD o_conv->write( data = i_char ). + r_hex+1 = o_conv->get_buffer( ). " x'65' must be x'0065' + +endmethod. + + + + + + METHOD convert_column2alpha. + + DATA: lv_uccpi TYPE i, + lv_text TYPE sychar02, + lv_module TYPE int4, + lv_column TYPE zexcel_cell_column. + +* Propagate zcx_excel if error occurs " issue #155 - less restrictive typing for ip_column + lv_column = convert_column2int( ip_column ). " issue #155 - less restrictive typing for ip_column + +*--------------------------------------------------------------------* +* Check whether column is in allowed range for EXCEL to handle ( 1-16384 ) +*--------------------------------------------------------------------* + IF lv_column > 16384 + OR lv_column < 1. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Index out of bounds'. + ENDIF. + +*--------------------------------------------------------------------* +* Build alpha representation of column +*--------------------------------------------------------------------* + WHILE lv_column GT 0. + + lv_module = ( lv_column - 1 ) MOD 26. + lv_uccpi = 65 + lv_module. + + lv_column = ( lv_column - lv_module ) / 26. + + lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). + CONCATENATE lv_text ep_column INTO ep_column. + + ENDWHILE. + +ENDMETHOD. + + + + + + METHOD convert_column2int. + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-12-29 +* - ... +* changes: renaming variables to naming conventions +* removing unused variables +* removing commented out code that is inactive for more then half a year +* message made to support multilinguality +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* +* issue#246 - error converting lower case column names +* - Stefan Schmöcker, 2012-12-29 +* changes: translating the correct variable to upper dase +* adding missing exception if input is a number +* that is out of bounds +* adding missing exception if input contains +* illegal characters like german umlauts +*--------------------------------------------------------------------* + + DATA: lv_column TYPE zexcel_cell_column_alpha, + lv_column_c TYPE char10, + lv_column_s TYPE string, + lv_errormessage TYPE string, " Can't pass '...'(abc) to exception-class + lv_modulo TYPE i. + +*--------------------------------------------------------------------* +* This module tries to identify which column a user wants to access +* Numbers as input are just passed back, anything else will be converted +* using EXCEL nomenclatura A = 1, AA = 27, ..., XFD = 16384 +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* Normalize input ( upper case , no gaps ) +*--------------------------------------------------------------------* + lv_column_c = ip_column. +* TRANSLATE lv_column TO UPPER CASE. " Fix #246 + TRANSLATE lv_column_c TO UPPER CASE. " Fix #246 + CONDENSE lv_column_c NO-GAPS. + IF lv_column_c EQ ''. +* lv_errormessage = 'Unable to interpret input as column'(003). +* RAISE EXCEPTION TYPE zcx_excel +* EXPORTING +* error = lv_errormessage. + MESSAGE e800(zabap2xlsx) INTO lv_errormessage. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + syst_at_raise = syst. + ENDIF. + +*--------------------------------------------------------------------* +* If a number gets passed, just convert it to an integer and return +* the converted value +*--------------------------------------------------------------------* + TRY. + IF lv_column_c CO '1234567890 '. " Fix #164 + ep_column = lv_column_c. " Fix #164 +*--------------------------------------------------------------------* +* Maximum column for EXCEL: XFD = 16384 " if anyone has a reference for this information - please add here instead of this comment +*--------------------------------------------------------------------* + IF ep_column > 16384 OR ep_column < 1. + lv_errormessage = 'Index out of bounds'(004). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + EXIT. + ENDIF. + CATCH cx_sy_conversion_no_number. "#EC NO_HANDLER + " Try the character-approach if approach via number has failed + ENDTRY. + +*--------------------------------------------------------------------* +* Raise error if unexpected characters turns up +*--------------------------------------------------------------------* + lv_column_s = lv_column_c. + IF lv_column_s CN sy-abcde. +* lv_errormessage = 'Unable to interpret input as column'(003). +* RAISE EXCEPTION TYPE zcx_excel +* EXPORTING +* error = lv_errormessage. + MESSAGE e800(zabap2xlsx) INTO lv_errormessage. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + syst_at_raise = syst. + ENDIF. + +*--------------------------------------------------------------------* +* Interpret input as number to base 26 with A=1, ... Z=26 +* Raise error if unexpected character turns up +*--------------------------------------------------------------------* +* 1st character +*--------------------------------------------------------------------* + lv_column = lv_column_c. + lv_modulo = cl_abap_conv_out_ce=>uccpi( lv_column+0(1) ) MOD zcl_excel_common=>c_excel_col_module. + IF lv_modulo < 1 OR lv_modulo > 26. +* lv_errormessage = 'Unable to interpret input as column'(003). +* RAISE EXCEPTION TYPE zcx_excel +* EXPORTING +* error = lv_errormessage. + MESSAGE e800(zabap2xlsx) INTO lv_errormessage. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + syst_at_raise = syst. + ENDIF. + ep_column = lv_modulo. " Leftmost digit + +*--------------------------------------------------------------------* +* 2nd character if present +*--------------------------------------------------------------------* + CHECK lv_column+1(1) IS NOT INITIAL. " No need to continue if string ended + lv_modulo = cl_abap_conv_out_ce=>uccpi( lv_column+1(1) ) MOD zcl_excel_common=>c_excel_col_module. + IF lv_modulo < 1 OR lv_modulo > 26. +* lv_errormessage = 'Unable to interpret input as column'(003). +* RAISE EXCEPTION TYPE zcx_excel +* EXPORTING +* error = lv_errormessage. + MESSAGE e800(zabap2xlsx) INTO lv_errormessage. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + syst_at_raise = syst. + ENDIF. + ep_column = 26 * ep_column + lv_modulo. " if second digit is present first digit is for 26^1 + +*--------------------------------------------------------------------* +* 3rd character if present +*--------------------------------------------------------------------* + CHECK lv_column+2(1) IS NOT INITIAL. " No need to continue if string ended + lv_modulo = cl_abap_conv_out_ce=>uccpi( lv_column+2(1) ) MOD zcl_excel_common=>c_excel_col_module. + IF lv_modulo < 1 OR lv_modulo > 26. +* lv_errormessage = 'Unable to interpret input as column'(003). +* RAISE EXCEPTION TYPE zcx_excel +* EXPORTING +* error = lv_errormessage. + MESSAGE e800(zabap2xlsx) INTO lv_errormessage. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + syst_at_raise = syst. + ENDIF. + ep_column = 26 * ep_column + lv_modulo. " if third digit is present first digit is for 26^2 and second digit for 26^1 + +*--------------------------------------------------------------------* +* Maximum column for EXCEL: XFD = 16384 " if anyone has a reference for this information - please add here instead of this comment +*--------------------------------------------------------------------* + IF ep_column > 16384 OR ep_column < 1. + lv_errormessage = 'Index out of bounds'(004). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + +ENDMETHOD. + + + + + + method CONVERT_COLUMNROW2COLUMN_A_ROW. +*--------------------------------------------------------------------* + "issue #256 - replacing char processing with regex +*--------------------------------------------------------------------* +* Stefan Schmöcker, 2013-08-11 +* Allow input to be CLIKE instead of STRING +*--------------------------------------------------------------------* + + DATA: pane_cell_row_a TYPE string, + lv_columnrow type string. + + lv_columnrow = i_columnrow. " Get rid of trailing blanks + + FIND REGEX '^(\D+)(\d+)$' IN lv_columnrow SUBMATCHES e_column + pane_cell_row_a. + e_row = pane_cell_row_a. + +endmethod. + + + + + + + + + + method CONVERT_RANGE2COLUMN_A_ROW. +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-12-07 +* - ... +* changes: renaming variables to naming conventions +* aligning code +* added exceptionclass +* added errorhandling for invalid range +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* +* issue#241 - error when sheetname contains "!" +* - sheetname should be returned unescaped +* - Stefan Schmöcker, 2012-12-07 +* changes: changed coding to support sheetnames with "!" +* unescaping sheetname +*--------------------------------------------------------------------* +* issue#155 - lessening restrictions of input parameters +* - Stefan Schmöcker, 2012-12-07 +* changes: i_range changed to clike +* e_sheet changed to clike +*--------------------------------------------------------------------* + + DATA: lv_sheet TYPE string, + lv_range TYPE string, + lv_columnrow_start TYPE string, + lv_columnrow_end TYPE string, + lv_errormessage TYPE string. " Can't pass '...'(abc) to exception-class + + +*--------------------------------------------------------------------* +* Split input range into sheetname and Area +* 4 cases - a) input empty --> nothing to do +* - b) sheetname existing - starts with ' example 'Sheet 1'!$B$6:$D$13 +* - c) sheetname existing - does not start with ' example Sheet1!$B$6:$D$13 +* - d) no sheetname - just area example $B$6:$D$13 +*--------------------------------------------------------------------* +* Initialize output parameters + CLEAR: e_column_start, + e_column_end, + e_row_start, + e_row_end, + e_sheet. + + IF i_range IS INITIAL. " a) input empty --> nothing to do + EXIT. + + ELSEIF i_range(1) = `'`. " b) sheetname existing - starts with ' + FIND REGEX '\![^\!]*$' IN i_range MATCH OFFSET sy-fdpos. " Find last ! + IF sy-subrc = 0. + lv_sheet = i_range(sy-fdpos). + ADD 1 TO sy-fdpos. + lv_range = i_range. + SHIFT lv_range LEFT BY sy-fdpos PLACES. + ELSE. + lv_errormessage = 'Invalid range'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + ELSEIF i_range CS '!'. " c) sheetname existing - does not start with ' + SPLIT i_range AT '!' INTO lv_sheet lv_range. + + ELSE. " d) no sheetname - just area + lv_range = i_range. + ENDIF. + + REPLACE ALL OCCURRENCES OF '$' IN lv_range WITH ''. + SPLIT lv_range AT ':' INTO lv_columnrow_start lv_columnrow_end. + + convert_columnrow2column_a_row( EXPORTING + i_columnrow = lv_columnrow_start + IMPORTING + e_column = e_column_start + e_row = e_row_start ). + convert_columnrow2column_a_row( EXPORTING + i_columnrow = lv_columnrow_end + IMPORTING + e_column = e_column_end + e_row = e_row_end ). + + e_sheet = unescape_string( lv_sheet ). " Return in unescaped form +endmethod. + + + + + method DATE_TO_EXCEL_STRING. + DATA: lv_date_diff TYPE i. + + CHECK ip_value IS NOT INITIAL. + " Needed hack caused by the problem that: + " Excel 2000 incorrectly assumes that the year 1900 is a leap year + " http://support.microsoft.com/kb/214326/en-us + IF ip_value > c_excel_1900_leap_year. + lv_date_diff = ip_value - c_excel_baseline_date + 2. + ELSE. + lv_date_diff = ip_value - c_excel_baseline_date + 1. + ENDIF. + ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_date_diff ). +endmethod. + + + + + method DESCRIBE_STRUCTURE. + DATA: lt_components TYPE abap_component_tab, + lt_comps TYPE abap_component_tab, + lo_struct TYPE REF TO cl_abap_structdescr, + ls_component TYPE abap_componentdescr, + lo_elemdescr TYPE REF TO cl_abap_elemdescr, + ls_dfies TYPE dfies, + l_position TYPE tabfdpos. + + "for DDIC structure get the info directly + IF io_struct->is_ddic_type( ) = abap_true. + rt_dfies = io_struct->get_ddic_field_list( ). + ELSE. + lt_components = io_struct->get_components( ). + + LOOP AT lt_components INTO ls_component. + structure_case( EXPORTING is_component = ls_component + CHANGING xt_components = lt_comps ) . + ENDLOOP. + LOOP AT lt_comps INTO ls_component. + CLEAR ls_dfies. + IF ls_component-type->kind = cl_abap_typedescr=>kind_elem. "E Elementary Type + ADD 1 TO l_position. + lo_elemdescr ?= ls_component-type. + IF lo_elemdescr->is_ddic_type( ) = abap_true. + ls_dfies = lo_elemdescr->get_ddic_field( ). + ls_dfies-fieldname = ls_component-name. + ls_dfies-position = l_position. + ELSE. + ls_dfies-fieldname = ls_component-name. + ls_dfies-position = l_position. + ls_dfies-inttype = lo_elemdescr->type_kind. + ls_dfies-leng = lo_elemdescr->length. + ls_dfies-outputlen = lo_elemdescr->length. + ls_dfies-decimals = lo_elemdescr->decimals. + ls_dfies-fieldtext = ls_component-name. + ls_dfies-reptext = ls_component-name. + ls_dfies-scrtext_s = ls_component-name. + ls_dfies-scrtext_m = ls_component-name. + ls_dfies-scrtext_l = ls_component-name. + ls_dfies-dynpfld = abap_true. + ENDIF. + INSERT ls_dfies INTO TABLE rt_dfies. + ENDIF. + ENDLOOP. + ENDIF. +endmethod. + + + + + + + + METHOD determine_resulting_formula. + + DATA: lv_row_difference TYPE i, + lv_col_difference TYPE i. + +*--------------------------------------------------------------------* +* Calculate distance of reference and current cell +*--------------------------------------------------------------------* + calculate_cell_distance( EXPORTING + iv_reference_cell = iv_reference_cell + iv_current_cell = iv_current_cell + IMPORTING + ev_row_difference = lv_row_difference + ev_col_difference = lv_col_difference ). + +*--------------------------------------------------------------------* +* and shift formula by using the row- and columndistance +*--------------------------------------------------------------------* + ev_resulting_formula = shift_formula( iv_reference_formula = iv_reference_formula + iv_shift_rows = lv_row_difference + iv_shift_cols = lv_col_difference ). + +ENDMETHOD. "determine_resulting_formula + + + + + method ENCRYPT_PASSWORD. + + DATA lv_curr_offset TYPE i. + DATA lv_curr_char TYPE c LENGTH 1. + DATA lv_curr_hex TYPE zexcel_pwd_hash. + DATA lv_pwd_len TYPE zexcel_pwd_hash. + DATA lv_pwd_hash TYPE zexcel_pwd_hash. + + CONSTANTS: + lv_0x7fff TYPE zexcel_pwd_hash VALUE '7FFF', + lv_0x0001 TYPE zexcel_pwd_hash VALUE '0001', + lv_0xce4b TYPE zexcel_pwd_hash VALUE 'CE4B'. + + DATA lv_pwd TYPE zexcel_aes_password. + + lv_pwd = i_pwd(15). + + lv_pwd_len = STRLEN( lv_pwd ). + lv_curr_offset = lv_pwd_len - 1. + + WHILE lv_curr_offset GE 0. + + lv_curr_char = lv_pwd+lv_curr_offset(1). + lv_curr_hex = char2hex( lv_curr_char ). + + lv_pwd_hash = ( shr14( lv_pwd_hash ) BIT-AND lv_0x0001 ) BIT-OR ( shl01( lv_pwd_hash ) BIT-AND lv_0x7fff ). + + lv_pwd_hash = lv_pwd_hash BIT-XOR lv_curr_hex. + SUBTRACT 1 FROM lv_curr_offset. + ENDWHILE. + + lv_pwd_hash = ( shr14( lv_pwd_hash ) BIT-AND lv_0x0001 ) BIT-OR ( shl01( lv_pwd_hash ) BIT-AND lv_0x7fff ). + lv_pwd_hash = lv_pwd_hash BIT-XOR lv_0xce4b. + lv_pwd_hash = lv_pwd_hash BIT-XOR lv_pwd_len. + + WRITE lv_pwd_hash TO r_encrypted_pwd. + +endmethod. + + + + + method ESCAPE_STRING. +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-12-08 +* - ... +* changes: aligning code +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* +* issue#242 - Support escaping for white-spaces +* - Escaping also necessary when ' encountered in input +* - Stefan Schmöcker, 2012-12-08 +* changes: switched check if escaping is necessary to regular expression +* and moved the "REPLACE" +*--------------------------------------------------------------------* +* issue#155 - lessening restrictions of input parameters +* - Stefan Schmöcker, 2012-12-08 +* changes: ip_value changed to clike +*--------------------------------------------------------------------* + DATA: lv_value TYPE string. + +*--------------------------------------------------------------------* +* There exist various situations when a space will be used to separate +* different parts of a string. When we have a string consisting spaces +* that will cause errors unless we "escape" the string by putting ' at +* the beginning and at the end of the string. +*--------------------------------------------------------------------* + + +*--------------------------------------------------------------------* +* When allowing clike-input parameters we might encounter trailing +* "real" blanks . These are automatically eliminated when moving +* the input parameter to a string. +* Now any remaining spaces ( white-spaces or normal spaces ) should +* trigger the escaping as well as any ' +*--------------------------------------------------------------------* + lv_value = ip_value. + + + FIND REGEX `\s|'` IN lv_value. " \s finds regular and white spaces + IF sy-subrc = 0. + REPLACE ALL OCCURRENCES OF `'` IN lv_value WITH `''`. + CONCATENATE `'` lv_value `'` INTO lv_value . + ENDIF. + + ep_escaped_value = lv_value. + +endmethod. + + + + + + method EXCEL_STRING_TO_DATE. + DATA: lv_date_int TYPE i. + + TRY. + lv_date_int = ip_value. + ep_value = lv_date_int + c_excel_baseline_date - 2. + " Needed hack caused by the problem that: + " Excel 2000 incorrectly assumes that the year 1900 is a leap year + " http://support.microsoft.com/kb/214326/en-us + IF ep_value < c_excel_1900_leap_year. + ep_value = ep_value + 1. + ENDIF. + CATCH cx_sy_conversion_error. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Index out of bounds'. + ENDTRY. +endmethod. + + + + + + method EXCEL_STRING_TO_NUMBER. + +* If we encounter anything more complicated in EXCEL we might have to extend this +* But currently this works fine - even for numbers in scientific notation + + ep_value = ip_value. + +endmethod. + + + + + + method EXCEL_STRING_TO_TIME. + DATA: lv_seconds_in_day TYPE i, + lv_day_fraction TYPE f, + lc_seconds_in_day TYPE i VALUE 86400. + + TRY. + + lv_day_fraction = ip_value. + lv_seconds_in_day = lv_day_fraction * lc_seconds_in_day. + + ep_value = lv_seconds_in_day. + + CATCH cx_sy_conversion_error. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Unable to interpret time'. + ENDTRY. +endmethod. + + + + + + + method FAIL. + DATA: ls_seoclass TYPE seoclass. + + " Let see >=7.02 + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'CL_ABAP_UNIT_ASSERT'. + + IF sy-subrc = 0. + CALL METHOD (ls_seoclass-clsname)=>fail + EXPORTING + msg = msg + level = level + quit = quit + detail = detail. + ELSE. + " Let see >=7.00 or even lower + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'CL_AUNIT_ASSERT'. + + IF sy-subrc = 0. + CALL METHOD (ls_seoclass-clsname)=>fail + EXPORTING + msg = msg + level = level + quit = quit + detail = detail. + ELSE. +* We do nothing for now not supported + ENDIF. + ENDIF. + +endmethod. + + + + + method GET_FIELDCATALOG. + DATA: lr_dref_tab TYPE REF TO data, + lo_salv_table TYPE REF TO cl_salv_table, + lo_salv_columns_table TYPE REF TO cl_salv_columns_table, + lt_salv_t_column_ref TYPE salv_t_column_ref, + ls_salv_t_column_ref LIKE LINE OF lt_salv_t_column_ref, + lo_salv_column_table TYPE REF TO cl_salv_column_table. + + FIELD-SYMBOLS: <tab> TYPE STANDARD TABLE. + FIELD-SYMBOLS: <fcat> LIKE LINE OF ep_fieldcatalog. + +* Get copy of IP_TABLE-structure <-- must be changeable to create salv + CREATE DATA lr_dref_tab LIKE ip_table. + ASSIGN lr_dref_tab->* TO <tab>. +* Create salv --> implicitly create fieldcat + TRY. + cl_salv_table=>factory( IMPORTING + r_salv_table = lo_salv_table + CHANGING + t_table = <tab> ). + lo_salv_columns_table = lo_salv_table->get_columns( ). + lt_salv_t_column_ref = lo_salv_columns_table->get( ). + CATCH cx_root. +* maybe some errorhandling here - just haven't made up my mind yet + ENDTRY. + +* Loop through columns and set relevant fields ( fieldname, texts ) + LOOP AT lt_salv_t_column_ref INTO ls_salv_t_column_ref. + + lo_salv_column_table ?= ls_salv_t_column_ref-r_column. + APPEND INITIAL LINE TO ep_fieldcatalog ASSIGNING <fcat>. + <fcat>-position = sy-tabix. + <fcat>-fieldname = ls_salv_t_column_ref-columnname. + <fcat>-scrtext_s = ls_salv_t_column_ref-r_column->get_short_text( ). + <fcat>-scrtext_m = ls_salv_t_column_ref-r_column->get_medium_text( ). + <fcat>-scrtext_l = ls_salv_t_column_ref-r_column->get_long_text( ). + + <fcat>-dynpfld = 'X'. " What in the world would we exclude here? + IF <fcat>-position = 1. " except for the MANDT-field of most tables ( 1st column that is ) + IF lo_salv_column_table->get_ddic_datatype( ) = 'CLNT'. + CLEAR <fcat>-dynpfld. + ENDIF. + ENDIF. + +* For fields that don't a description ( i.e. defined by "field type i," ) +* just use the fieldname as description - that is better than nothing + IF <fcat>-scrtext_s IS INITIAL + AND <fcat>-scrtext_m IS INITIAL + AND <fcat>-scrtext_l IS INITIAL. + CONCATENATE 'Col:' <fcat>-fieldname INTO <fcat>-scrtext_l SEPARATED BY space. + <fcat>-scrtext_m = <fcat>-scrtext_l. + <fcat>-scrtext_s = <fcat>-scrtext_l. + ENDIF. + + ENDLOOP. + +endmethod. + + + + + + + + method IS_CELL_IN_RANGE. + DATA lv_column_start TYPE zexcel_cell_column_alpha. + DATA lv_column_end TYPE zexcel_cell_column_alpha. + DATA lv_row_start TYPE zexcel_cell_row. + DATA lv_row_end TYPE zexcel_cell_row. + DATA lv_column_start_i TYPE zexcel_cell_column. + DATA lv_column_end_i TYPE zexcel_cell_column. + DATA lv_column_i TYPE zexcel_cell_column. + + +* Split range and convert columns + convert_range2column_a_row( + exporting + i_range = ip_range + IMPORTING + e_column_start = lv_column_start + e_column_end = lv_column_end + e_row_start = lv_row_start + e_row_end = lv_row_end ). + + lv_column_start_i = convert_column2int( ip_column = lv_column_start ). + lv_column_end_i = convert_column2int( ip_column = lv_column_end ). + + lv_column_i = convert_column2int( ip_column = ip_column ). + +* Check if cell is in range + IF lv_column_i >= lv_column_start_i AND + lv_column_i <= lv_column_end_i AND + ip_row >= lv_row_start AND + ip_row <= lv_row_end. + rp_in_range = abap_true. + ENDIF. +endmethod. + + + + + method NUMBER_TO_EXCEL_STRING. + DATA: lv_value_c TYPE c LENGTH 100. + + WRITE ip_value TO lv_value_c EXPONENT 0 NO-GROUPING NO-SIGN. + REPLACE ALL OCCURRENCES OF ',' IN lv_value_c WITH '.'. + + ep_value = lv_value_c. + CONDENSE ep_value. + + IF ip_value < 0. + CONCATENATE '-' ep_value INTO ep_value. + ELSEIF ip_value EQ 0. + ep_value = '0'. + ENDIF. +endmethod. + + + + + + method RECURSIVE_CLASS_TO_STRUCT. + " # issue 139 +* is working for me - but after looking through this coding I guess +* I'll rewrite this to a version w/o recursion +* This is private an no one using it so far except me, so no need to hurry + DATA: descr TYPE REF TO cl_abap_structdescr, + wa_component LIKE LINE OF descr->components, + attribute_name TYPE fieldname, + flag_class TYPE flag, + o_border TYPE REF TO zcl_excel_style_border. + + FIELD-SYMBOLS: <field> TYPE any, + <fieldx> TYPE any, + <class> TYPE REF TO object, + <attribute> TYPE any. + + + descr ?= cl_abap_structdescr=>describe_by_data( e_target ). + + LOOP AT descr->components INTO wa_component. + +* Assign structure and X-structure + ASSIGN COMPONENT wa_component-name OF STRUCTURE e_target TO <field>. + ASSIGN COMPONENT wa_component-name OF STRUCTURE e_targetx TO <fieldx>. +* At least one field in the structure should be marked - otherwise continue with next field + CLEAR flag_class. +* maybe source is just a structure - try assign component... + ASSIGN COMPONENT wa_component-name OF STRUCTURE i_source TO <attribute>. + IF sy-subrc <> 0. +* not - then it is an attribute of the class - use different assign then + CONCATENATE 'i_source->' wa_component-name INTO attribute_name. + ASSIGN (attribute_name) TO <attribute>. + IF sy-subrc <> 0. + EXIT. + ENDIF. " Should not happen if structure is built properly - otherwise just exit to create no dumps + flag_class = abap_true. + ENDIF. + + CASE wa_component-type_kind. + WHEN cl_abap_structdescr=>typekind_struct1 OR cl_abap_structdescr=>typekind_struct2. " Structure --> use recursio +* IF flag_class = abap_true. +** Only borders will be passed as unbound references. But since we want to set a value we have to create an instance +* ENDIF. + zcl_excel_common=>recursive_class_to_struct( EXPORTING i_source = <attribute> + CHANGING e_target = <field> + e_targetx = <fieldx> ). + WHEN OTHERS. + <field> = <attribute>. + <fieldx> = abap_true. + + ENDCASE. + ENDLOOP. + +endmethod. + + + + + + METHOD recursive_struct_to_class. + " # issue 139 +* is working for me - but after looking through this coding I guess +* I'll rewrite this to a version w/o recursion +* This is private an no one using it so far except me, so no need to hurry + DATA: descr TYPE REF TO cl_abap_structdescr, + wa_component LIKE LINE OF descr->components, + attribute_name TYPE fieldname, + flag_class TYPE flag, + o_border TYPE REF TO zcl_excel_style_border. + + FIELD-SYMBOLS: <field> TYPE any, + <fieldx> TYPE any, + <class> TYPE REF TO object, + <attribute> TYPE any, + <attribute_s> TYPE ANY TABLE. + + + descr ?= cl_abap_structdescr=>describe_by_data( i_source ). + + LOOP AT descr->components INTO wa_component. + +* Assign structure and X-structure + ASSIGN COMPONENT wa_component-name OF STRUCTURE i_source TO <field>. + ASSIGN COMPONENT wa_component-name OF STRUCTURE i_sourcex TO <fieldx>. +* At least one field in the structure should be marked - otherwise continue with next field + CHECK <fieldx> CA abap_true. + CLEAR flag_class. +* maybe target is just a structure - try assign component... + ASSIGN COMPONENT wa_component-name OF STRUCTURE e_target TO <attribute>. + IF sy-subrc <> 0. +* not - then it is an attribute of the class - use different assign then + CONCATENATE 'E_TARGET->' wa_component-name INTO attribute_name. + ASSIGN (attribute_name) TO <attribute>. + IF sy-subrc <> 0.EXIT.ENDIF. " Should not happen if structure is built properly - otherwise just exit to create no dumps + flag_class = abap_true. + ENDIF. + + CASE wa_component-type_kind. + WHEN cl_abap_structdescr=>typekind_struct1 OR cl_abap_structdescr=>typekind_struct2. " Structure --> use recursion + " To avoid dump with attribute GRADTYPE of class ZCL_EXCEL_STYLE_FILL + " quick and really dirty fix -> check the attribute name + " Border has to be initialized somewhere else + IF wa_component-name EQ 'GRADTYPE'. + flag_class = abap_false. + ENDIF. + + IF flag_class = abap_true AND <attribute> IS INITIAL. +* Only borders will be passed as unbound references. But since we want to set a value we have to create an instance + CREATE OBJECT o_border. + <attribute> = o_border. + ENDIF. + zcl_excel_common=>recursive_struct_to_class( EXPORTING i_source = <field> + i_sourcex = <fieldx> + CHANGING e_target = <attribute> ). +* WHEN cl_abap_structdescr=>typekind_struct2. " String +* CHECK <fieldx> = abap_true. " Marked for change +* <attribute_s> = <field>. + WHEN OTHERS. + CHECK <fieldx> = abap_true. " Marked for change + <attribute> = <field>. + + ENDCASE. + ENDLOOP. + +ENDMETHOD. + + + + + + + + METHOD shift_formula. + + CONSTANTS: lcv_operators TYPE string VALUE '+-/*^%=<>&, !', + lcv_letters TYPE string VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ$', + lcv_digits TYPE string VALUE '0123456789', + lcv_cell_reference_error TYPE string VALUE '#REF!'. + + DATA: lv_tcnt TYPE i, " Counter variable + lv_tlen TYPE i, " Temp variable length + lv_cnt TYPE i, " Counter variable + lv_cnt2 TYPE i, " Counter variable + lv_offset1 TYPE i, " Character offset + lv_numchars TYPE i, " Number of characters counter + lv_tchar(1) TYPE c, " Temp character + lv_tchar2(1) TYPE c, " Temp character + lv_cur_form(2000) TYPE c, " Formula for current cell + lv_ref_cell_addr TYPE string, " Reference cell address + lv_tcol1 TYPE string, " Temp column letter + lv_tcol2 TYPE string, " Temp column letter + lv_tcoln TYPE i, " Temp column number + lv_trow1 TYPE string, " Temp row number + lv_trow2 TYPE string, " Temp row number + lv_flen TYPE i, " Length of reference formula + lv_tlen2 TYPE i, " Temp variable length + lv_substr1 TYPE string, " Substring variable + lv_abscol TYPE string, " Absolute column symbol + lv_absrow TYPE string, " Absolute row symbol + + lv_errormessage TYPE string. + + FIELD-SYMBOLS: <find_my_include> TYPE ANY. + +*--------------------------------------------------------------------* +* When copying a cell in EXCEL to another cell any inherent formulas +* are copied as well. Cell-references in the formula are being adjusted +* by the distance of the new cell to the original one +*--------------------------------------------------------------------* +* §1 Parse reference formula character by character +* §2 Identify Cell-references +* §3 Shift cell-reference +* §4 Build resulting formula +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* No distance --> Reference = resulting cell/formula +*--------------------------------------------------------------------* + IF iv_shift_cols = 0 + AND iv_shift_rows = 0. + ev_resulting_formula = iv_reference_formula. + EXIT. " done + ENDIF. + + + lv_flen = STRLEN( iv_reference_formula ). + lv_numchars = 1. + +*--------------------------------------------------------------------* +* §1 Parse reference formula character by character +*--------------------------------------------------------------------* + DO lv_flen TIMES. + + CLEAR: lv_tchar, + lv_substr1, + lv_ref_cell_addr. + lv_cnt2 = lv_cnt + 1. + IF lv_cnt2 > lv_flen. + EXIT. " Done + ENDIF. + +*--------------------------------------------------------------------* +* Here we have the current character in the formula +*--------------------------------------------------------------------* + lv_tchar = iv_reference_formula+lv_cnt(1). + +*--------------------------------------------------------------------* +* Operators or opening parenthesis will separate possible cellreferences +*--------------------------------------------------------------------* + IF ( lv_tchar CA lcv_operators + OR lv_tchar CA '(' ) + AND lv_cnt2 = 1. + lv_substr1 = iv_reference_formula+lv_offset1(1). + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_numchars = 1. + CONTINUE. " --> next character in formula can be analyzed + ENDIF. + +*--------------------------------------------------------------------* +* Quoted literal text holds no cell reference --> advance to end of text +*--------------------------------------------------------------------* + IF lv_tchar EQ '"'. + lv_cnt = lv_cnt + 1. + lv_numchars = lv_numchars + 1. + lv_tchar = iv_reference_formula+lv_cnt(1). + WHILE lv_tchar NE '"'. + + lv_cnt = lv_cnt + 1. + lv_numchars = lv_numchars + 1. + lv_tchar = iv_reference_formula+lv_cnt(1). + + ENDWHILE. + lv_cnt2 = lv_cnt + 1. + lv_substr1 = iv_reference_formula+lv_offset1(lv_numchars). + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + IF lv_cnt = lv_flen. + EXIT. + ENDIF. + lv_offset1 = lv_cnt. + lv_numchars = 1. + lv_tchar = iv_reference_formula+lv_cnt(1). + lv_cnt2 = lv_cnt + 1. + CONTINUE. " --> next character in formula can be analyzed + ENDIF. + + +*--------------------------------------------------------------------* +* Operators or parenthesis or last character in formula will separate possible cellreferences +*--------------------------------------------------------------------* + IF lv_tchar CA lcv_operators + OR lv_tchar CA '():' + OR lv_cnt2 = lv_flen. + IF lv_cnt > 0. + lv_substr1 = iv_reference_formula+lv_offset1(lv_numchars). +*--------------------------------------------------------------------* +* Check for text concatenation and functions +*--------------------------------------------------------------------* + IF ( lv_tchar CA lcv_operators AND lv_tchar EQ lv_substr1 ) OR lv_tchar EQ '('. + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_cnt2 = lv_cnt + 1. + lv_numchars = 1. + CONTINUE. " --> next character in formula can be analyzed + ENDIF. + + lv_tlen = lv_cnt2 - lv_offset1. +*--------------------------------------------------------------------* +* Exclude mathematical operators and closing parentheses +*--------------------------------------------------------------------* + IF lv_tchar CA lcv_operators + OR lv_tchar CA ':)'. + IF lv_cnt2 = lv_flen + AND lv_numchars = 1. + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_cnt2 = lv_cnt + 1. + lv_numchars = 1. + CONTINUE. " --> next character in formula can be analyzed + ELSE. + lv_tlen = lv_tlen - 1. + ENDIF. + ENDIF. +*--------------------------------------------------------------------* +* Capture reference cell address +*--------------------------------------------------------------------* + TRY. + MOVE: iv_reference_formula+lv_offset1(lv_tlen) TO lv_ref_cell_addr. "Ref cell address + CATCH cx_root. + lv_errormessage = 'Internal error in Class ZCL_EXCEL_COMMON Method SHIFT_FORMULA Spot 1 '. " Change to messageclass if possible + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDTRY. + +*--------------------------------------------------------------------* +* Split cell address into characters and numbers +*--------------------------------------------------------------------* + CLEAR: lv_tlen, + lv_tcnt, + lv_tcol1, + lv_trow1. + lv_tlen = STRLEN( lv_ref_cell_addr ). + IF lv_tlen <> 0. + CLEAR: lv_tcnt. + DO lv_tlen TIMES. + CLEAR: lv_tchar2. + lv_tchar2 = lv_ref_cell_addr+lv_tcnt(1). + IF lv_tchar2 CA lcv_letters. + CONCATENATE lv_tcol1 lv_tchar2 INTO lv_tcol1. + ELSEIF lv_tchar2 CA lcv_digits. + CONCATENATE lv_trow1 lv_tchar2 INTO lv_trow1. + ENDIF. + lv_tcnt = lv_tcnt + 1. + ENDDO. + ENDIF. +*--------------------------------------------------------------------* +* Check for invalid cell address +*--------------------------------------------------------------------* + IF lv_tcol1 IS INITIAL OR lv_trow1 IS INITIAL. + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_cnt2 = lv_cnt + 1. + lv_numchars = 1. + CONTINUE. + ENDIF. +*--------------------------------------------------------------------* +* Check for range names +*--------------------------------------------------------------------* + CLEAR: lv_tlen. + lv_tlen = STRLEN( lv_tcol1 ). + IF lv_tlen GT 3. + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_cnt2 = lv_cnt + 1. + lv_numchars = 1. + CONTINUE. + ENDIF. +*--------------------------------------------------------------------* +* Check for valid row +*--------------------------------------------------------------------* + IF lv_trow1 GT 1048576. + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_cnt2 = lv_cnt + 1. + lv_numchars = 1. + CONTINUE. + ENDIF. +*--------------------------------------------------------------------* +* Check for absolute column or row reference +*--------------------------------------------------------------------* + CLEAR: lv_tcol2, + lv_trow2, + lv_abscol, + lv_absrow. + lv_tlen2 = STRLEN( lv_tcol1 ) - 1. + IF lv_tcol1 IS NOT INITIAL. + lv_abscol = lv_tcol1(1). + ENDIF. + IF lv_tlen2 GE 0. + lv_absrow = lv_tcol1+lv_tlen2(1). + ENDIF. + IF lv_abscol EQ '$' AND lv_absrow EQ '$'. + lv_tlen2 = lv_tlen2 - 1. + IF lv_tlen2 > 0. + lv_tcol1 = lv_tcol1+1(lv_tlen2). + ENDIF. + lv_tlen2 = lv_tlen2 + 1. + ELSEIF lv_abscol EQ '$'. + lv_tcol1 = lv_tcol1+1(lv_tlen2). + ELSEIF lv_absrow EQ '$'. + lv_tcol1 = lv_tcol1(lv_tlen2). + ENDIF. +*--------------------------------------------------------------------* +* Check for valid column +*--------------------------------------------------------------------* + TRY. + lv_tcoln = zcl_excel_common=>convert_column2int( lv_tcol1 ) + iv_shift_cols. + CATCH zcx_excel. + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_cnt2 = lv_cnt + 1. + lv_numchars = 1. + CONTINUE. + ENDTRY. +*--------------------------------------------------------------------* +* Check whether there is a referencing problem +*--------------------------------------------------------------------* + lv_trow2 = lv_trow1 + iv_shift_rows. + IF ( lv_tcoln < 1 AND lv_abscol <> '$' ) " Maybe we should add here max-column and max row-tests as well. + OR ( lv_trow2 < 1 AND lv_absrow <> '$' ). " Check how EXCEL behaves in this case +*--------------------------------------------------------------------* +* Referencing problem encountered --> set error +*--------------------------------------------------------------------* + CONCATENATE lv_cur_form lcv_cell_reference_error INTO lv_cur_form. + ELSE. +*--------------------------------------------------------------------* +* No referencing problems --> adjust row and column +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* Adjust column +*--------------------------------------------------------------------* + IF lv_abscol EQ '$'. + CONCATENATE lv_cur_form lv_abscol lv_tcol1 INTO lv_cur_form. + ELSEIF iv_shift_cols EQ 0. + CONCATENATE lv_cur_form lv_tcol1 INTO lv_cur_form. + ELSE. + TRY. + lv_tcol2 = zcl_excel_common=>convert_column2alpha( lv_tcoln ). + CONCATENATE lv_cur_form lv_tcol2 INTO lv_cur_form. + CATCH zcx_excel. + CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. + lv_cnt = lv_cnt + 1. + lv_offset1 = lv_cnt. + lv_cnt2 = lv_cnt + 1. + lv_numchars = 1. + CONTINUE. + ENDTRY. + ENDIF. +*--------------------------------------------------------------------* +* Adjust row +*--------------------------------------------------------------------* + IF lv_absrow EQ '$'. + CONCATENATE lv_cur_form lv_absrow lv_trow1 INTO lv_cur_form. + ELSEIF iv_shift_rows = 0. + CONCATENATE lv_cur_form lv_trow1 INTO lv_cur_form. +* elseif lv_trow2 < 1. +* CONCATENATE lv_cur_form lc_cell_reference_error INTO lv_cur_form. + ELSE. + CONCATENATE lv_cur_form lv_trow2 INTO lv_cur_form. + ENDIF. + ENDIF. + + lv_numchars = 0. + IF lv_tchar CA lcv_operators + OR lv_tchar CA ':)'. + CONCATENATE lv_cur_form lv_tchar INTO lv_cur_form. + ENDIF. + lv_offset1 = lv_cnt2. + ENDIF. + ENDIF. + lv_numchars = lv_numchars + 1. + lv_cnt = lv_cnt + 1. + lv_cnt2 = lv_cnt + 1. + + ENDDO. + + + +*--------------------------------------------------------------------* +* Return resulting formula +*--------------------------------------------------------------------* + IF lv_cur_form IS NOT INITIAL. + MOVE lv_cur_form TO ev_resulting_formula. + ENDIF. + +ENDMETHOD. + + + + + method SHL01. + + DATA: + lv_bit TYPE i, + lv_curr_pos TYPE i VALUE 2, + lv_prev_pos TYPE i VALUE 1. + + DO 15 TIMES. + GET BIT lv_curr_pos OF i_pwd_hash INTO lv_bit. + SET BIT lv_prev_pos OF r_pwd_hash TO lv_bit. + ADD 1 TO lv_curr_pos. + ADD 1 TO lv_prev_pos. + ENDDO. + SET BIT 16 OF r_pwd_hash TO 0. + +endmethod. + + + + + method SHR14. + + DATA: + lv_bit TYPE i, + lv_curr_pos TYPE i, + lv_next_pos TYPE i. + + r_pwd_hash = i_pwd_hash. + + DO 14 TIMES. + lv_curr_pos = 15. + lv_next_pos = 16. + + DO 15 TIMES. + GET BIT lv_curr_pos OF r_pwd_hash INTO lv_bit. + SET BIT lv_next_pos OF r_pwd_hash TO lv_bit. + SUBTRACT 1 FROM lv_curr_pos. + SUBTRACT 1 FROM lv_next_pos. + ENDDO. + SET BIT 1 OF r_pwd_hash TO 0. + ENDDO. + +endmethod. + + + + + + + method SPLIT_FILE. + + DATA: lt_hlp TYPE TABLE OF text255, + ls_hlp TYPE text255. + + DATA: lf_ext(10) TYPE c, + lf_dot_ext(10) TYPE c. + DATA: lf_str TYPE text255, + lf_anz TYPE i, + lf_len TYPE i. +** --------------------------------------------------------------------- + + CLEAR: lt_hlp, + ep_file, + ep_extension, + ep_dotextension. + +** Split the whole file at '.' + SPLIT ip_file AT '.' INTO TABLE lt_hlp. + +** get the extenstion from the last line of table + DESCRIBE TABLE lt_hlp LINES lf_anz. + IF lf_anz <= 1. + ep_file = ip_file. + EXIT. + ENDIF. + + READ TABLE lt_hlp INTO ls_hlp INDEX lf_anz. + ep_extension = ls_hlp. + lf_ext = ls_hlp. + IF NOT lf_ext IS INITIAL. + CONCATENATE '.' lf_ext INTO lf_dot_ext. + ENDIF. + ep_dotextension = lf_dot_ext. + +** get only the filename + lf_len = strlen( ip_file ) - strlen( lf_dot_ext ). + IF lf_len > 0. + ep_file = ip_file(lf_len). + ENDIF. + +endmethod. + + + + + method STRUCTURE_CASE. + DATA: lt_comp_str TYPE abap_component_tab. + + CASE is_component-type->kind. + WHEN cl_abap_typedescr=>kind_elem. "E Elementary Type + INSERT is_component INTO TABLE xt_components. + WHEN cl_abap_typedescr=>kind_table. "T Table + INSERT is_component INTO TABLE xt_components. + WHEN cl_abap_typedescr=>kind_struct. "S Structure + lt_comp_str = structure_recursive( is_component = is_component ). + INSERT LINES OF lt_comp_str INTO TABLE xt_components. + WHEN OTHERS. "cl_abap_typedescr=>kind_ref or cl_abap_typedescr=>kind_class or cl_abap_typedescr=>kind_intf. +* We skip it. for now. + ENDCASE. +endmethod. + + + + + method STRUCTURE_RECURSIVE. + DATA: lo_struct TYPE REF TO cl_abap_structdescr, + lt_components TYPE abap_component_tab, + ls_components TYPE abap_componentdescr. + + REFRESH rt_components. + + lo_struct ?= is_component-type. + lt_components = lo_struct->get_components( ). + + LOOP AT lt_components INTO ls_components. + structure_case( EXPORTING is_component = ls_components + CHANGING xt_components = rt_components ) . + ENDLOOP. + +endmethod. + + + + + method TIME_TO_EXCEL_STRING. + DATA: lv_seconds_in_day TYPE i, + lv_day_fraction TYPE f, + lc_time_baseline TYPE t VALUE '000000', + lc_seconds_in_day TYPE i VALUE 86400. + + lv_seconds_in_day = ip_value - lc_time_baseline. + lv_day_fraction = lv_seconds_in_day / lc_seconds_in_day. + ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_day_fraction ). +endmethod. + + + + + + method UNESCAPE_STRING. + + CONSTANTS lcv_regex TYPE string VALUE `^'[^']` & `|` & " Beginning single ' OR + `[^']'$` & `|` & " Trailing single ' OR + `[^']'[^']`. " Single ' somewhere in between + + + DATA: lv_errormessage TYPE string. " Can't pass '...'(abc) to exception-class + +*--------------------------------------------------------------------* +* This method is used to extract the "real" string from an escaped string. +* An escaped string can be identified by a beginning ' which must be +* accompanied by a trailing ' +* All '' in between beginning and trailing ' are treated as single ' +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* When allowing clike-input parameters we might encounter trailing +* "real" blanks . These are automatically eliminated when moving +* the input parameter to a string. +*--------------------------------------------------------------------* + ev_unescaped_string = iv_escaped. " Pass through if not escaped + + CHECK ev_unescaped_string IS NOT INITIAL. " Nothing to do if empty + CHECK ev_unescaped_string(1) = `'`. " Nothing to do if not escaped + +*--------------------------------------------------------------------* +* Remove leading and trailing ' +*--------------------------------------------------------------------* + REPLACE REGEX `^'(.*)'$` IN ev_unescaped_string WITH '$1'. + IF sy-subrc <> 0. + lv_errormessage = 'Input not properly escaped - &'(002). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + +*--------------------------------------------------------------------* +* Any remaining single ' should not be here +*--------------------------------------------------------------------* + FIND REGEX lcv_regex IN ev_unescaped_string. + IF sy-subrc = 0. + lv_errormessage = 'Input not properly escaped - &'(002). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + +*--------------------------------------------------------------------* +* Replace '' with ' +*--------------------------------------------------------------------* + REPLACE ALL OCCURRENCES OF `''` IN ev_unescaped_string WITH `'`. + + +endmethod. + + + + + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + +TYPES: BEGIN OF ts_alv_types, + seoclass TYPE seoclsname, + clsname TYPE seoclsname, + END OF ts_alv_types, + tt_alv_types TYPE HASHED TABLE OF ts_alv_types WITH UNIQUE KEY seoclass. + +TYPES: BEGIN OF ts_sort_values, + fieldname TYPE fieldname, + row_int TYPE zexcel_cell_row, + value TYPE REF TO data, + new TYPE flag, + sort_level TYPE int4, + is_collapsed type flag, + END OF ts_sort_values, + + tt_sort_values TYPE HASHED TABLE OF ts_sort_values WITH UNIQUE KEY fieldname. +TYPES: BEGIN OF ts_subtotal_rows, + row_int TYPE zexcel_cell_row, + row_int_start TYPE zexcel_cell_row, + columnname TYPE fieldname, + END OF ts_subtotal_rows, + + tt_subtotal_rows TYPE HASHED TABLE OF ts_subtotal_rows WITH UNIQUE KEY row_int. + +TYPES: BEGIN OF ts_styles, + type TYPE char1, + alignment TYPE zexcel_alignment, + inttype TYPE inttype, + decimals TYPE int1, + style TYPE REF TO zcl_excel_style, + guid TYPE zexcel_cell_style, + END OF ts_styles, + + tt_styles TYPE HASHED TABLE OF ts_styles WITH UNIQUE KEY type alignment inttype decimals. + +TYPES: BEGIN OF ts_color_styles, + guid_old TYPE zexcel_cell_style, + fontcolor TYPE zexcel_style_color_argb, + fillcolor TYPE zexcel_style_color_argb, + style_new TYPE REF TO zcl_excel_style, + END OF ts_color_styles, + + tt_color_styles TYPE HASHED TABLE OF ts_color_styles WITH UNIQUE KEY guid_old fontcolor fillcolor. + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + ABAP + SLIS + SOI + + + + + + + + + + + + + + + + + + + + + + + + + + + + method ASK_OPTION. + DATA: ls_sval TYPE sval, + lt_sval TYPE STANDARD TABLE OF sval, + l_returncode TYPE string, + lt_fields TYPE ddfields, + ls_fields TYPE dfies. + + FIELD-SYMBOLS: <fs> TYPE ANY. + + rs_option = ws_option. + + CALL FUNCTION 'DDIF_FIELDINFO_GET' + EXPORTING + tabname = 'ZEXCEL_S_CONVERTER_OPTION' +* FIELDNAME = ' ' +* LANGU = sy-langu +* LFIELDNAME = ' ' +* ALL_TYPES = ' ' +* GROUP_NAMES = ' ' +* UCLEN = +* IMPORTING +* X030L_WA = +* DDOBJTYPE = +* DFIES_WA = +* LINES_DESCR = + TABLES + dfies_tab = lt_fields +* FIXED_VALUES = + EXCEPTIONS + not_found = 1 + internal_error = 2 + OTHERS = 3 + . + IF sy-subrc <> 0. +* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO +* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. + ENDIF. + + LOOP AT lt_fields INTO ls_fields. + ASSIGN COMPONENT ls_fields-fieldname OF STRUCTURE ws_option TO <fs>. + IF sy-subrc = 0. + CLEAR ls_sval. + ls_sval-tabname = ls_fields-tabname. + ls_sval-fieldname = ls_fields-fieldname. + ls_sval-value = <fs>. + ls_sval-field_attr = space. + ls_sval-field_obl = space. + ls_sval-comp_code = space. + ls_sval-fieldtext = ls_fields-scrtext_m. + ls_sval-comp_tab = space. + ls_sval-comp_field = space. + ls_sval-novaluehlp = space. + INSERT ls_sval INTO TABLE lt_sval. + ENDIF. + ENDLOOP. + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING +* NO_VALUE_CHECK = space + popup_title = 'Excel creation options'(008) +* START_COLUMN = '5' +* START_ROW = '5' + IMPORTING + returncode = l_returncode + TABLES + fields = lt_sval + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2 + . + IF sy-subrc <> 0. +* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO +* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. + ELSE. + IF l_returncode = 'A'. + RAISE EXCEPTION TYPE zcx_excel. + ELSE. + LOOP AT lt_sval INTO ls_sval. + ASSIGN COMPONENT ls_sval-fieldname OF STRUCTURE ws_option TO <fs>. + IF sy-subrc = 0. + <fs> = ls_sval-value. + ENDIF. + ENDLOOP. + set_option( is_option = ws_option ) . + rs_option = ws_option. + ENDIF. + ENDIF. + endmethod. + + + + + method BIND_CELLS. + +* Do we need subtotals with grouping + READ TABLE wt_fieldcatalog TRANSPORTING NO FIELDS WITH KEY is_subtotalled = abap_true. + IF sy-subrc = 0 . + r_freeze_col = loop_subtotal( i_row_int = w_row_int + i_col_int = w_col_int ) . + ELSE. + r_freeze_col = loop_normal( i_row_int = w_row_int + i_col_int = w_col_int ) . + ENDIF. + + endmethod. + + + + + + method BIND_TABLE. + data: lt_field_catalog type zexcel_t_fieldcatalog, + ls_field_catalog type zexcel_s_fieldcatalog, + ls_fcat type zexcel_s_converter_fcat, + lo_col_dim type ref to zcl_excel_worksheet_columndime, + lo_row_dim type ref to zcl_excel_worksheet_rowdimensi, + l_col_int type zexcel_cell_column, + l_col_alpha type zexcel_cell_column_alpha, + ls_settings type zexcel_s_table_settings, + l_line type i. + + field-symbols: <fs_tab> type any table. + + assign wo_data->* to <fs_tab> . + + ls_settings-table_style = i_style_table. + ls_settings-top_left_column = zcl_excel_common=>convert_column2alpha( ip_column = w_col_int ). + ls_settings-top_left_row = w_row_int. + ls_settings-show_row_stripes = ws_layout-is_stripped. + + describe table wt_fieldcatalog lines l_line. + l_line = l_line + 1 + w_col_int. + ls_settings-bottom_right_column = zcl_excel_common=>convert_column2alpha( ip_column = l_line ). + + describe table <fs_tab> lines l_line. + ls_settings-bottom_right_row = l_line + 1 + w_row_int. + sort wt_fieldcatalog by position. + loop at wt_fieldcatalog into ls_fcat. + move-corresponding ls_fcat to ls_field_catalog. + ls_field_catalog-dynpfld = abap_true. + insert ls_field_catalog into table lt_field_catalog. + endloop. + + wo_worksheet->bind_table( + exporting + ip_table = <fs_tab> + it_field_catalog = lt_field_catalog + is_table_settings = ls_settings + importing + es_table_settings = ls_settings + ). + loop at wt_fieldcatalog into ls_fcat. + l_col_int = w_col_int + ls_fcat-position - 1. + l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). +* Freeze panes + if ls_fcat-fix_column = abap_true. + add 1 to r_freeze_col. + endif. +* Now let's check for optimized + if ls_fcat-is_optimized = abap_true. + lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). + lo_col_dim->set_auto_size( ip_auto_size = abap_true ) . + endif. +* Now let's check for visible + if ls_fcat-is_hidden = abap_true. + lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). + lo_col_dim->set_visible( ip_visible = abap_false ) . + endif. + endloop. + + endmethod. + + + method CLASS_CONSTRUCTOR. + DATA: ls_objects TYPE ts_alv_types. + DATA: ls_option TYPE zexcel_s_converter_option, + l_uname TYPE sy-uname. + + GET PARAMETER ID 'ZUS' FIELD l_uname. + IF l_uname IS INITIAL OR l_uname = space. + l_uname = sy-uname. + ENDIF. + +* Object CL_GUI_ALV_GRID + ls_objects-seoclass = 'CL_GUI_ALV_GRID'. + ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_ALV_GRID'. + INSERT ls_objects INTO TABLE wt_objects. + +* Object CL_SALV_TABLE + ls_objects-seoclass = 'CL_SALV_TABLE'. + ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_SALV_TABLE'. + INSERT ls_objects INTO TABLE wt_objects. + +* Object CL_SALV_RESULT + ls_objects-seoclass = 'CL_SALV_EX_RESULT_DATA_TABLE '. + ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_RESULT_EX'. + INSERT ls_objects INTO TABLE wt_objects. +* Object CL_SALV_WD_RESULT + ls_objects-seoclass = 'CL_SALV_WD_RESULT_DATA_TABLE '. + ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_RESULT_WD'. + INSERT ls_objects INTO TABLE wt_objects. + + CONCATENATE 'EXCEL_' sy-uname INTO ws_indx-srtfd. + + IMPORT p1 = ls_option FROM DATABASE indx(xl) TO ws_indx ID ws_indx-srtfd. + + IF sy-subrc = 0. + ws_option = ls_option. + ELSE. + init_option( ) . + ENDIF. + + endmethod. + + + method CLEAN_FIELDCATALOG. + DATA: l_position TYPE int1. + + FIELD-SYMBOLS: <fs_sfcat> TYPE zexcel_s_converter_fcat. + + SORT wt_fieldcatalog BY position col_id. + + CLEAR l_position. + LOOP AT wt_fieldcatalog ASSIGNING <fs_sfcat>. + ADD 1 TO l_position. + <fs_sfcat>-position = l_position. +* Default stype with alignment and format + <fs_sfcat>-style_hdr = get_style( i_type = c_type_hdr + i_alignment = <fs_sfcat>-alignment ). + IF ws_layout-is_stripped = abap_true. + <fs_sfcat>-style_stripped = get_style( i_type = c_type_str + i_alignment = <fs_sfcat>-alignment + i_inttype = <fs_sfcat>-inttype + i_decimals = <fs_sfcat>-decimals ). + ENDIF. + <fs_sfcat>-style_normal = get_style( i_type = c_type_nor + i_alignment = <fs_sfcat>-alignment + i_inttype = <fs_sfcat>-inttype + i_decimals = <fs_sfcat>-decimals ). + <fs_sfcat>-style_subtotal = get_style( i_type = c_type_sub + i_alignment = <fs_sfcat>-alignment + i_inttype = <fs_sfcat>-inttype + i_decimals = <fs_sfcat>-decimals ). + <fs_sfcat>-style_total = get_style( i_type = c_type_tot + i_alignment = <fs_sfcat>-alignment + i_inttype = <fs_sfcat>-inttype + i_decimals = <fs_sfcat>-decimals ). + ENDLOOP. + + endmethod. + + + + + + + + + + + + + method CONVERT. + + IF is_option IS SUPPLIED. + ws_option = is_option. + ENDIF. + + TRY. + execute_converter( EXPORTING io_object = io_alv + it_table = it_table ) . + ENDTRY. + + IF io_worksheet IS SUPPLIED AND io_worksheet IS BOUND. + wo_worksheet = io_worksheet. + ENDIF. + IF co_excel IS SUPPLIED. + IF co_excel IS NOT BOUND. + CREATE OBJECT co_excel. + co_excel->zif_excel_book_properties~creator = sy-uname. + ENDIF. + wo_excel = co_excel. + ENDIF. + +* Move table to data object and clean it up + IF wt_fieldcatalog IS NOT INITIAL. + create_table( ). + ELSE. + wo_data = wo_table . + ENDIF. + + IF wo_excel IS NOT BOUND. + CREATE OBJECT wo_excel. + wo_excel->zif_excel_book_properties~creator = sy-uname. + ENDIF. + IF wo_worksheet IS NOT BOUND. + " Get active sheet + wo_worksheet = wo_excel->get_active_worksheet( ). + wo_worksheet->set_title( ip_title = 'Sheet1'(001) ). + ENDIF. + + IF i_row_int <= 0. + w_row_int = 1. + ELSE. + w_row_int = i_row_int. + ENDIF. + IF i_column_int <= 0. + w_col_int = 1. + ELSE. + w_col_int = i_column_int. + ENDIF. + + create_worksheet( i_table = i_table + i_style_table = i_style_table ) . + + endmethod. + + + + + + method CREATE_COLOR_STYLE. + DATA: ls_styles TYPE ts_styles. + DATA: lo_style TYPE REF TO zcl_excel_style. + + READ TABLE wt_styles INTO ls_styles WITH KEY guid = i_style. + IF sy-subrc = 0. + lo_style = wo_excel->add_new_style( ). +* lo_style->borders = ls_styles-style->borders. +* lo_style->protection = ls_styles-style->protection. + lo_style->font->bold = ls_styles-style->font->bold. + lo_style->alignment->horizontal = ls_styles-style->alignment->horizontal. + lo_style->number_format->format_code = ls_styles-style->number_format->format_code. + + lo_style->font->color-rgb = is_colors-fontcolor. + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style->fill->fgcolor-rgb = is_colors-fillcolor. + + ro_style = lo_style. + ENDIF. + endmethod. + + + + + + + + method CREATE_FORMULAR_SUBTOTAL. + data: l_row_alpha_start type string, + l_row_alpha_end type string, + l_func_num type string. + + l_row_alpha_start = i_row_int_start. + l_row_alpha_end = i_row_int_end. + + l_func_num = get_function_number( i_totals_function = i_totals_function ). + concatenate 'SUBTOTAL(' l_func_num ',' i_column l_row_alpha_start ':' i_column l_row_alpha_end ')' into r_formula. + endmethod. + + + + + + + method CREATE_FORMULAR_TOTAL. + data: l_row_alpha type string, + l_row_e_alpha type string. + + l_row_alpha = w_row_int + 1. + l_row_e_alpha = i_row_int. + + concatenate i_totals_function '(' i_column l_row_alpha ':' i_column l_row_e_alpha ')' into r_formula. + endmethod. + + + + method CREATE_PATH. + DATA: l_sep TYPE c , + l_path TYPE string, + l_return TYPE i . + + CLEAR r_path. + + " Save the file + cl_gui_frontend_services=>get_sapgui_workdir( + CHANGING + sapworkdir = l_path + EXCEPTIONS + get_sapworkdir_failed = 1 + cntl_error = 2 + error_no_gui = 3 + not_supported_by_gui = 4 + ). + IF sy-subrc <> 0. +* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO +* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. + CONCATENATE 'Excel_' w_fcount '.xlsx' INTO r_path. + ELSE. + DO. + ADD 1 TO w_fcount. +*-obtain file separator character--------------------------------------- + CALL METHOD cl_gui_frontend_services=>get_file_separator + CHANGING + file_separator = l_sep + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + not_supported_by_gui = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + l_sep = ''. + ENDIF. + + CONCATENATE l_path l_sep 'Excel_' w_fcount '.xlsx' INTO r_path. + + IF cl_gui_frontend_services=>file_exist( file = r_path ) = abap_true. + cl_gui_frontend_services=>file_delete( EXPORTING filename = r_path + CHANGING rc = l_return + EXCEPTIONS OTHERS = 1 ). + IF sy-subrc = 0 . + RETURN. + ENDIF. + ELSE. + RETURN. + ENDIF. + ENDDO. + ENDIF. + + endmethod. + + + + + method CREATE_STYLE_HDR. + data: lo_style type ref to zcl_excel_style. + + lo_style = wo_excel->add_new_style( ). + lo_style->font->bold = abap_true. + lo_style->font->color-rgb = zcl_excel_style_color=>c_white. + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style->fill->fgcolor-rgb = 'FF4F81BD'. + if i_alignment is supplied and i_alignment is not initial. + lo_style->alignment->horizontal = i_alignment. + endif. + ro_style = lo_style . + endmethod. + + + + + + + method CREATE_STYLE_NORMAL. + DATA: lo_style TYPE REF TO zcl_excel_style, + l_format TYPE zexcel_number_format. + + IF i_inttype IS SUPPLIED AND i_inttype IS NOT INITIAL. + l_format = set_cell_format( i_inttype = i_inttype + i_decimals = i_decimals ) . + ENDIF. + IF l_format IS NOT INITIAL OR + ( i_alignment IS SUPPLIED AND i_alignment IS NOT INITIAL ) . + + lo_style = wo_excel->add_new_style( ). + + IF i_alignment IS SUPPLIED AND i_alignment IS NOT INITIAL. + lo_style->alignment->horizontal = i_alignment. + ENDIF. + + IF l_format IS NOT INITIAL. + lo_style->number_format->format_code = l_format. + ENDIF. + + ro_style = lo_style . + + ENDIF. + endmethod. + + + + + + + method CREATE_STYLE_STRIPPED. + data: lo_style type ref to zcl_excel_style. + data: l_format type zexcel_number_format. + + lo_style = wo_excel->add_new_style( ). + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style->fill->fgcolor-rgb = 'FFDBE5F1'. + if i_alignment is supplied and i_alignment is not initial. + lo_style->alignment->horizontal = i_alignment. + endif. + if i_inttype is supplied and i_inttype is not initial. + l_format = set_cell_format( i_inttype = i_inttype + i_decimals = i_decimals ) . + if l_format is not initial. + lo_style->number_format->format_code = l_format. + endif. + endif. + ro_style = lo_style. + + endmethod. + + + + + + + method CREATE_STYLE_SUBTOTAL. + data: lo_style type ref to zcl_excel_style. + data: l_format type zexcel_number_format. + + lo_style = wo_excel->add_new_style( ). + lo_style->font->bold = abap_true. + + if i_alignment is supplied and i_alignment is not initial. + lo_style->alignment->horizontal = i_alignment. + endif. + if i_inttype is supplied and i_inttype is not initial. + l_format = set_cell_format( i_inttype = i_inttype + i_decimals = i_decimals ) . + if l_format is not initial. + lo_style->number_format->format_code = l_format. + endif. + endif. + + ro_style = lo_style . + + endmethod. + + + + + + + method CREATE_STYLE_TOTAL. + DATA: lo_style TYPE REF TO zcl_excel_style. + DATA: l_format TYPE zexcel_number_format. + + lo_style = wo_excel->add_new_style( ). + lo_style->font->bold = abap_true. + + CREATE OBJECT lo_style->borders->top. + lo_style->borders->top->border_style = zcl_excel_style_border=>c_border_thin. + lo_style->borders->top->border_color-rgb = zcl_excel_style_color=>c_black. + + CREATE OBJECT lo_style->borders->right. + lo_style->borders->right->border_style = zcl_excel_style_border=>c_border_none. + lo_style->borders->right->border_color-rgb = zcl_excel_style_color=>c_black. + + CREATE OBJECT lo_style->borders->down. + lo_style->borders->down->border_style = zcl_excel_style_border=>c_border_double. + lo_style->borders->down->border_color-rgb = zcl_excel_style_color=>c_black. + + CREATE OBJECT lo_style->borders->left. + lo_style->borders->left->border_style = zcl_excel_style_border=>c_border_none. + lo_style->borders->left->border_color-rgb = zcl_excel_style_color=>c_black. + + IF i_alignment IS SUPPLIED AND i_alignment IS NOT INITIAL. + lo_style->alignment->horizontal = i_alignment. + ENDIF. + IF i_inttype IS SUPPLIED AND i_inttype IS NOT INITIAL. + l_format = set_cell_format( i_inttype = i_inttype + i_decimals = i_decimals ) . + IF l_format IS NOT INITIAL. + lo_style->number_format->format_code = l_format. + ENDIF. + ENDIF. + + ro_style = lo_style . + + endmethod. + + + method CREATE_TABLE. + TYPES: BEGIN OF ts_output, + fieldname TYPE fieldname, + function TYPE funcname, + END OF ts_output. + + DATA: lo_data TYPE REF TO data. + DATA: lo_addit TYPE REF TO cl_abap_elemdescr, + lt_components_tab TYPE cl_abap_structdescr=>component_table, + ls_components TYPE abap_componentdescr, + lo_table TYPE REF TO cl_abap_tabledescr, + lo_struc TYPE REF TO cl_abap_structdescr, + lt_fieldcatalog TYPE zexcel_t_converter_fcat. + + FIELD-SYMBOLS: <fs_scat> TYPE zexcel_s_converter_fcat, + <fs_stab> TYPE ANY, + <fs_ttab> TYPE STANDARD TABLE, + <fs> TYPE ANY, + <fs_table> TYPE STANDARD TABLE. + + SORT wt_fieldcatalog BY position. + ASSIGN wo_table->* TO <fs_table>. + + READ TABLE <fs_table> ASSIGNING <fs_stab> INDEX 1. + IF sy-subrc EQ 0 . + LOOP AT wt_fieldcatalog ASSIGNING <fs_scat>. + ASSIGN COMPONENT <fs_scat>-columnname OF STRUCTURE <fs_stab> TO <fs>. + IF sy-subrc = 0. + ls_components-name = <fs_scat>-columnname. + TRY. + lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ). + CATCH cx_sy_move_cast_error. + CLEAR lo_addit. + DELETE TABLE wt_fieldcatalog FROM <fs_scat>. + ENDTRY. + IF lo_addit IS BOUND. + ls_components-type = lo_addit . + INSERT ls_components INTO TABLE lt_components_tab. + ENDIF. + ENDIF. + ENDLOOP. + IF lt_components_tab IS NOT INITIAL. + "create new line type + TRY. + lo_struc = cl_abap_structdescr=>create( P_COMPONENTS = lt_components_tab + P_STRICT = abap_false ). + CATCH cx_sy_struct_creation. + RETURN. " We can not do anything in this case. + ENDTRY. + + lo_table = cl_abap_tabledescr=>create( lo_struc ). + + CREATE DATA wo_data TYPE HANDLE lo_table. + CREATE DATA lo_data TYPE HANDLE lo_struc. + + ASSIGN wo_data->* TO <fs_ttab>. + ASSIGN lo_data->* TO <fs_stab>. + LOOP AT <fs_table> ASSIGNING <fs>. + CLEAR <fs_stab>. + MOVE-CORRESPONDING <fs> TO <fs_stab>. + APPEND <fs_stab> TO <fs_ttab>. + ENDLOOP. + ENDIF. + ENDIF. + + endmethod. + + + + + + METHOD create_text_subtotal. + DATA: l_string(256) TYPE c, + l_func TYPE string. + + CASE i_totals_function. + WHEN zcl_excel_table=>totals_function_sum. " Total + l_func = 'Total'(003). + WHEN zcl_excel_table=>totals_function_min. " Minimum + l_func = 'Minimum'(004). + WHEN zcl_excel_table=>totals_function_max. " Maximum + l_func = 'Maximum'(005). + WHEN zcl_excel_table=>totals_function_average. " Mean Value + l_func = 'Average'(006). + WHEN zcl_excel_table=>totals_function_count. " Count + l_func = 'Count'(007). + WHEN OTHERS. + CLEAR l_func. + ENDCASE. + + MOVE i_value TO l_string. + + CONCATENATE l_string l_func INTO r_text SEPARATED BY space. + +ENDMETHOD. + + + + + + method CREATE_WORKSHEET. + DATA: l_freeze_col TYPE i. + DATA: l_guid TYPE oltpguid16. + + IF wo_data IS BOUND AND wo_worksheet IS BOUND. + + wo_worksheet->zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_on. " By default is on + + IF wt_fieldcatalog IS INITIAL. + set_fieldcatalog( ) . + ELSE. + clean_fieldcatalog( ) . + ENDIF. + + IF i_table = abap_true. + l_freeze_col = bind_table( i_style_table = i_style_table ) . + ELSE. +* Let's check for filter. + IF wt_filter IS NOT INITIAL. + wo_autofilter = wo_excel->add_new_autofilter( io_sheet = wo_worksheet ). + l_freeze_col = bind_cells( ) . + set_autofilter_area( ) . + ELSE. + l_freeze_col = bind_cells( ) . + ENDIF. + + ENDIF. + +* Check for freeze panes + IF ws_layout-is_fixed = abap_true. + IF l_freeze_col = 0. + l_freeze_col = w_col_int. + ENDIF. + wo_worksheet->freeze_panes( EXPORTING ip_num_columns = l_freeze_col + ip_num_rows = w_row_int ) . + ENDIF. + ENDIF. + + endmethod. + + + + + + method EXECUTE_CONVERTER. + DATA: lt_fieldcatalog TYPE zexcel_t_fieldcatalog, + ls_fieldcatalog TYPE zexcel_s_converter_fcat, + lo_if TYPE REF TO zif_excel_converter, + ls_types TYPE ts_alv_types, + lo_addit TYPE REF TO cl_abap_classdescr. + + IF io_object IS BOUND. + TRY. + lo_addit ?= cl_abap_typedescr=>describe_by_object_ref( io_object ). + CATCH cx_sy_move_cast_error. + RAISE EXCEPTION TYPE zcx_excel. + ENDTRY. + ls_types-seoclass = lo_addit->get_relative_name( ). + READ TABLE wt_objects INTO ls_types WITH TABLE KEY seoclass = ls_types-seoclass. + IF sy-subrc = 0. + CREATE OBJECT lo_if TYPE (ls_types-clsname). + + TRY. + lo_if->create_fieldcatalog( + EXPORTING + is_option = ws_option + io_object = io_object + it_table = it_table + IMPORTING + es_layout = ws_layout + et_fieldcatalog = wt_fieldcatalog + eo_table = wo_table + et_colors = wt_colors + et_filter = wt_filter + ). + ENDTRY. +* data lines of highest level. + IF ws_layout-max_subtotal_level > 0. + ADD 1 TO ws_layout-max_subtotal_level. + ENDIF. + ELSE. + RAISE EXCEPTION TYPE zcx_excel. + ENDIF. + ELSE. + REFRESH wt_fieldcatalog. + GET REFERENCE OF it_table INTO wo_table. + ENDIF. + + endmethod. + + + + + + + method GET_COLOR_STYLE. + DATA: ls_colors TYPE zexcel_s_converter_col, + ls_color_styles TYPE ts_color_styles, + lo_style TYPE REF TO zcl_excel_style. + + r_style = i_style. " Default we change nothing + + IF wt_colors IS NOT INITIAL. +* Full line has color + READ TABLE wt_colors INTO ls_colors WITH KEY rownumber = i_row + columnname = space. + IF sy-subrc = 0. + READ TABLE wt_color_styles INTO ls_color_styles WITH KEY guid_old = i_style + fontcolor = ls_colors-fontcolor + fillcolor = ls_colors-fillcolor. + IF sy-subrc = 0. + r_style = ls_color_styles-style_new->get_guid( ). + ELSE. + lo_style = create_color_style( i_style = i_style + is_colors = ls_colors ) . + r_style = lo_style->get_guid( ) . + ls_color_styles-guid_old = i_style. + ls_color_styles-fontcolor = ls_colors-fontcolor. + ls_color_styles-fillcolor = ls_colors-fillcolor. + ls_color_styles-style_new = lo_style. + INSERT ls_color_styles INTO TABLE wt_color_styles. + ENDIF. + ELSE. +* Only field has color + READ TABLE wt_colors INTO ls_colors WITH KEY rownumber = i_row + columnname = i_fieldname. + IF sy-subrc = 0. + READ TABLE wt_color_styles INTO ls_color_styles WITH KEY guid_old = i_style + fontcolor = ls_colors-fontcolor + fillcolor = ls_colors-fillcolor. + IF sy-subrc = 0. + r_style = ls_color_styles-style_new->get_guid( ). + ELSE. + lo_style = create_color_style( i_style = i_style + is_colors = ls_colors ) . + ls_color_styles-guid_old = i_style. + ls_color_styles-fontcolor = ls_colors-fontcolor. + ls_color_styles-fillcolor = ls_colors-fillcolor. + ls_color_styles-style_new = lo_style. + INSERT ls_color_styles INTO TABLE wt_color_styles. + r_style = ls_color_styles-style_new->get_guid( ). + ENDIF. + ELSE. + r_style = i_style. + ENDIF. + ENDIF. + ELSE. + r_style = i_style. + ENDIF. + + endmethod. + + + + + + method GET_FILE. + data: lo_excel_writer type ref to zif_excel_writer, + lo_excel type ref to zcl_excel. + + data: ls_seoclass type seoclass. + + + if wo_excel is bound. + create object lo_excel_writer type zcl_excel_writer_2007. + e_file = lo_excel_writer->write_file( wo_excel ). + + select single * into ls_seoclass + from seoclass + where clsname = 'CL_BCS_CONVERT'. + + if sy-subrc = 0. + call method (ls_seoclass-clsname)=>xstring_to_solix + exporting + iv_xstring = e_file + receiving + et_solix = et_file. + e_bytecount = xstrlen( e_file ). + else. + " Convert to binary + call function 'SCMS_XSTRING_TO_BINARY' + exporting + buffer = e_file + importing + output_length = e_bytecount + tables + binary_tab = et_file. + endif. + endif. + + endmethod. + + + + + method GET_FUNCTION_NUMBER. +*Number Function +*1 AVERAGE +*2 COUNT +*3 COUNTA +*4 MAX +*5 MIN +*6 PRODUCT +*7 STDEV +*8 STDEVP +*9 SUM +*10 VAR +*11 VARP + + case i_totals_function. + when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_SUM. " Total + r_function_number = 9. + when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_MIN. " Minimum + r_function_number = 5. + when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_MAX. " Maximum + r_function_number = 4. + when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_AVERAGE. " Mean Value + r_function_number = 1. + when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_count. " Count + r_function_number = 2. + when others. + clear r_function_number. + endcase. + endmethod. + + + + method GET_OPTION. + + rs_option = ws_option. + + endmethod. + + + + + + + + method GET_STYLE. + DATA: ls_styles TYPE ts_styles, + lo_style TYPE REF TO zcl_excel_style. + + CLEAR r_style. + + READ TABLE wt_styles INTO ls_styles WITH TABLE KEY type = i_type + alignment = i_alignment + inttype = i_inttype + decimals = i_decimals. + IF sy-subrc = 0. + r_style = ls_styles-guid. + ELSE. + CASE i_type. + WHEN c_type_hdr. " Header + lo_style = create_style_hdr( i_alignment = i_alignment ). + WHEN c_type_str. "Stripped + lo_style = create_style_stripped( i_alignment = i_alignment + i_inttype = i_inttype + i_decimals = i_decimals ). + WHEN c_type_nor. "Normal + lo_style = create_style_normal( i_alignment = i_alignment + i_inttype = i_inttype + i_decimals = i_decimals ). + WHEN c_type_sub. "Subtotals + lo_style = create_style_subtotal( i_alignment = i_alignment + i_inttype = i_inttype + i_decimals = i_decimals ). + WHEN c_type_tot. "Totals + lo_style = create_style_total( i_alignment = i_alignment + i_inttype = i_inttype + i_decimals = i_decimals ). + ENDCASE. + IF lo_style IS NOT INITIAL. + r_style = lo_style->get_guid( ). + ls_styles-type = i_type. + ls_styles-alignment = i_alignment. + ls_styles-inttype = i_inttype. + ls_styles-decimals = i_decimals. + ls_styles-guid = r_style. + ls_styles-style = lo_style. + INSERT ls_styles INTO TABLE wt_styles. + ENDIF. + ENDIF. + endmethod. + + + method INIT_OPTION. + + ws_option-filter = abap_true. + ws_option-hidenc = abap_true. + ws_option-subtot = abap_true. + + endmethod. + + + + + + + method LOOP_NORMAL. + DATA: lo_data TYPE REF TO data, + l_row_header TYPE zexcel_cell_row VALUE 2, + l_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + l_row_int_start TYPE zexcel_cell_row, + l_row_int_end TYPE zexcel_cell_row, + l_row_int TYPE zexcel_cell_row, + l_col_int TYPE zexcel_cell_column, + l_col_alpha TYPE zexcel_cell_column_alpha, + l_col_alpha_start TYPE zexcel_cell_column_alpha, + l_cell_value TYPE zexcel_cell_value, + l_s_color TYPE abap_bool, + lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, + lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi, + l_formula TYPE zexcel_cell_formula, + l_style TYPE zexcel_cell_style, + l_cells TYPE i, + l_count TYPE i, + l_table_row TYPE i. + + FIELD-SYMBOLS: <fs_stab> TYPE ANY, + <fs_tab> TYPE STANDARD TABLE, + <fs_sfcat> TYPE zexcel_s_converter_fcat, + <fs_fldval> TYPE ANY, + <fs_cell_value> TYPE zexcel_cell_value. + + ASSIGN wo_data->* TO <fs_tab> . + + DESCRIBE TABLE wt_fieldcatalog LINES l_cells. + DESCRIBE TABLE <fs_tab> LINES l_count. + l_cells = l_cells * l_count. + +* It is better to loop column by column + LOOP AT wt_fieldcatalog ASSIGNING <fs_sfcat>. + l_row_int = i_row_int. + l_col_int = i_col_int + <fs_sfcat>-position - 1. + +* Freeze panes + IF <fs_sfcat>-fix_column = abap_true. + ADD 1 TO r_freeze_col. + ENDIF. + l_s_color = abap_true. + + l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). + +* Only if the Header is required create it. + IF ws_option-hidehd IS INITIAL. + " First of all write column header + l_cell_value = <fs_sfcat>-scrtext_m. + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = l_cell_value + ip_style = <fs_sfcat>-style_hdr ). + ADD 1 TO l_row_int. + ENDIF. + LOOP AT <fs_tab> ASSIGNING <fs_stab>. + l_table_row = sy-tabix. +* Now the cell values + ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. +* Now let's write the cell values + IF ws_layout-is_stripped = abap_true AND l_s_color = abap_true. + l_style = get_color_style( i_row = l_table_row + i_fieldname = <fs_sfcat>-columnname + i_style = <fs_sfcat>-style_stripped ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = <fs_fldval> + ip_style = l_style ). + CLEAR l_s_color. + ELSE. + l_style = get_color_style( i_row = l_table_row + i_fieldname = <fs_sfcat>-columnname + i_style = <fs_sfcat>-style_normal ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = <fs_fldval> + ip_style = l_style ). + l_s_color = abap_true. + ENDIF. + READ TABLE wt_filter TRANSPORTING NO FIELDS WITH TABLE KEY rownumber = l_table_row + columnname = <fs_sfcat>-columnname. + IF sy-subrc = 0. + wo_worksheet->get_cell( EXPORTING + ip_column = l_col_alpha + ip_row = l_row_int + IMPORTING + ep_value = l_cell_value ). + wo_autofilter->set_value( i_column = l_col_int + i_value = l_cell_value ). + ENDIF. + ADD 1 TO l_row_int. + ENDLOOP. +* Now let's check for optimized + IF <fs_sfcat>-is_optimized = abap_true . + lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). + lo_col_dim->set_auto_size( ip_auto_size = abap_true ) . + ENDIF. +* Now let's check for visible + IF <fs_sfcat>-is_hidden = abap_true. + lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). + lo_col_dim->set_visible( ip_visible = abap_false ) . + ENDIF. +* Now let's check for total versus subtotal. + IF <fs_sfcat>-totals_function IS NOT INITIAL. + l_row_int_end = l_row_int - 1. + + l_formula = create_formular_total( i_row_int = l_row_int_end + i_column = l_col_alpha + i_totals_function = <fs_sfcat>-totals_function ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_formula = l_formula + ip_style = <fs_sfcat>-style_total ). + ENDIF. + ENDLOOP. + endmethod. + + + + + + + method LOOP_SUBTOTAL. + + DATA: lo_data TYPE REF TO data, + l_row_header TYPE zexcel_cell_row VALUE 2, + l_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + l_row_int_start TYPE zexcel_cell_row, + l_row_int_end TYPE zexcel_cell_row, + l_row_int TYPE zexcel_cell_row, + l_col_int TYPE zexcel_cell_column, + l_col_alpha TYPE zexcel_cell_column_alpha, + l_col_alpha_start TYPE zexcel_cell_column_alpha, + l_cell_value TYPE zexcel_cell_value, + l_s_color TYPE abap_bool, + lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, + lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi, + l_formula TYPE zexcel_cell_formula, + l_style TYPE zexcel_cell_style, + l_subtotalled TYPE flag, + l_text TYPE string, + ls_sort_values TYPE ts_sort_values, + ls_subtotal_rows TYPE ts_subtotal_rows, + l_sort_level TYPE int4, + l_hidden TYPE int4, + l_line TYPE i, + l_guid TYPE guid_22, + l_tabix TYPE sy-tabix, + l_cells TYPE i, + l_count TYPE i, + l_table_row TYPE i, + lt_fcat TYPE zexcel_t_converter_fcat. + + FIELD-SYMBOLS: <fs_stab> TYPE ANY, + <fs_tab> TYPE STANDARD TABLE, + <fs_sfcat> TYPE zexcel_s_converter_fcat, + <fs_fldval> TYPE ANY, + <fs_sortval> TYPE ANY, + <fs_sortv> TYPE ts_sort_values, + <fs_cell_value> TYPE zexcel_cell_value. + + ASSIGN wo_data->* TO <fs_tab> . + + REFRESH: wt_sort_values, + wt_subtotal_rows. + + DESCRIBE TABLE wt_fieldcatalog LINES l_cells. + DESCRIBE TABLE <fs_tab> LINES l_count. + l_cells = l_cells * l_count. + + READ TABLE <fs_tab> ASSIGNING <fs_stab> INDEX 1. + IF sy-subrc = 0. + l_row_int = i_row_int + 1. + lt_fcat = wt_fieldcatalog. + SORT lt_fcat BY sort_level DESCENDING. + LOOP AT lt_fcat ASSIGNING <fs_sfcat> WHERE is_subtotalled = abap_true. + ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. + ls_sort_values-fieldname = <fs_sfcat>-columnname. + ls_sort_values-row_int = l_row_int. + ls_sort_values-sort_level = <fs_sfcat>-sort_level. + ls_sort_values-is_collapsed = <fs_sfcat>-is_collapsed. + CREATE DATA ls_sort_values-value LIKE <fs_fldval>. + ASSIGN ls_sort_values-value->* TO <fs_sortval>. + <fs_sortval> = <fs_fldval>. + INSERT ls_sort_values INTO TABLE wt_sort_values. + ENDLOOP. + ENDIF. + l_row_int = i_row_int. +* Let's check if we need to hide a sort level. + DESCRIBE TABLE wt_sort_values LINES l_line. + IF l_line <= 1. + CLEAR l_hidden. + ELSE. + LOOP AT wt_sort_values INTO ls_sort_values WHERE is_collapsed = abap_false. + IF l_hidden < ls_sort_values-sort_level. + l_hidden = ls_sort_values-sort_level. + ENDIF. + ENDLOOP. + ENDIF. + ADD 1 TO l_hidden. " As this is the first level we show. +* First loop without formular only addtional rows with subtotal text. + LOOP AT <fs_tab> ASSIGNING <fs_stab>. + ADD 1 TO l_row_int. " 1 is for header row. + l_row_int_start = l_row_int. + SORT lt_fcat BY sort_level DESCENDING. + LOOP AT lt_fcat ASSIGNING <fs_sfcat> WHERE is_subtotalled = abap_true. + l_col_int = i_col_int + <fs_sfcat>-position - 1. + l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). +* Now the cell values + ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. + IF sy-subrc = 0. + READ TABLE wt_sort_values ASSIGNING <fs_sortv> WITH TABLE KEY fieldname = <fs_sfcat>-columnname. + IF sy-subrc = 0. + ASSIGN <fs_sortv>-value->* TO <fs_sortval>. + IF <fs_sortval> <> <fs_fldval> OR <fs_sortv>-new = abap_true. +* First let's remmember the subtotal values as it has to appear later. + ls_subtotal_rows-row_int = l_row_int. + ls_subtotal_rows-row_int_start = <fs_sortv>-row_int. + ls_subtotal_rows-columnname = <fs_sfcat>-columnname. + INSERT ls_subtotal_rows INTO TABLE wt_subtotal_rows. +* Now let's write the subtotal line + l_cell_value = create_text_subtotal( i_value = <fs_sortval> + i_totals_function = <fs_sfcat>-totals_function ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = l_cell_value + ip_abap_type = cl_abap_typedescr=>typekind_string + ip_style = <fs_sfcat>-style_subtotal ). + lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). + lo_row_dim->set_outline_level( ip_outline_level = <fs_sfcat>-sort_level ) . + IF <fs_sfcat>-is_collapsed = abap_true. + IF <fs_sfcat>-sort_level > l_hidden. + lo_row_dim->set_visible( ip_visible = abap_false ) . + ENDIF. + lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . + ENDIF. +* Now let's change the key + ADD 1 TO l_row_int. + <fs_sortval> = <fs_fldval>. + <fs_sortv>-new = abap_false. + l_line = <fs_sortv>-sort_level. + LOOP AT wt_sort_values ASSIGNING <fs_sortv> WHERE sort_level >= l_line. + <fs_sortv>-row_int = l_row_int. + ENDLOOP. + ENDIF. + ENDIF. + ENDIF. + ENDLOOP. + ENDLOOP. + ADD 1 TO l_row_int. + l_row_int_start = l_row_int. + SORT lt_fcat BY sort_level DESCENDING. + LOOP AT lt_fcat ASSIGNING <fs_sfcat> WHERE is_subtotalled = abap_true. + l_col_int = i_col_int + <fs_sfcat>-position - 1. + l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). + READ TABLE wt_sort_values ASSIGNING <fs_sortv> WITH TABLE KEY fieldname = <fs_sfcat>-columnname. + IF sy-subrc = 0. + ASSIGN <fs_sortv>-value->* TO <fs_sortval>. + ls_subtotal_rows-row_int = l_row_int. + ls_subtotal_rows-row_int_start = <fs_sortv>-row_int. + ls_subtotal_rows-columnname = <fs_sfcat>-columnname. + INSERT ls_subtotal_rows INTO TABLE wt_subtotal_rows. +* First let's write the value as it has to appear. + l_cell_value = create_text_subtotal( i_value = <fs_sortval> + i_totals_function = <fs_sfcat>-totals_function ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = l_cell_value + ip_abap_type = cl_abap_typedescr=>typekind_string + ip_style = <fs_sfcat>-style_subtotal ). + + l_sort_level = <fs_sfcat>-sort_level. + lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). + lo_row_dim->set_outline_level( ip_outline_level = l_sort_level ) . + IF <fs_sfcat>-is_collapsed = abap_true. + IF <fs_sfcat>-sort_level > l_hidden. + lo_row_dim->set_visible( ip_visible = abap_false ) . + ENDIF. + lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . + ENDIF. + ADD 1 TO l_row_int. + ENDIF. + ENDLOOP. +* Let's write the Grand total + l_sort_level = 0. + lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). + lo_row_dim->set_outline_level( ip_outline_level = l_sort_level ) . +* lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . Not on grand total + + l_text = create_text_subtotal( i_value = 'Grand'(002) + i_totals_function = <fs_sfcat>-totals_function ). + + l_col_alpha_start = zcl_excel_common=>convert_column2alpha( i_col_int ). + wo_worksheet->set_cell( ip_column = l_col_alpha_start + ip_row = l_row_int + ip_value = l_text + ip_abap_type = cl_abap_typedescr=>typekind_string + ip_style = <fs_sfcat>-style_subtotal ). + +* It is better to loop column by column second time around +* Second loop with formular and data. + LOOP AT wt_fieldcatalog ASSIGNING <fs_sfcat>. + l_row_int = i_row_int. + l_col_int = i_col_int + <fs_sfcat>-position - 1. +* Freeze panes + IF <fs_sfcat>-fix_column = abap_true. + ADD 1 TO r_freeze_col. + ENDIF. + l_s_color = abap_true. + l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). + " First of all write column header + l_cell_value = <fs_sfcat>-scrtext_m. + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = l_cell_value + ip_abap_type = cl_abap_typedescr=>typekind_string + ip_style = <fs_sfcat>-style_hdr ). + ADD 1 TO l_row_int. + LOOP AT <fs_tab> ASSIGNING <fs_stab>. + l_table_row = sy-tabix. +* Now the cell values + ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. +* Let's check for subtotal lines + DO. + READ TABLE wt_subtotal_rows TRANSPORTING NO FIELDS WITH TABLE KEY row_int = l_row_int. + IF sy-subrc = 0. + IF <fs_sfcat>-is_subtotalled = abap_false AND + <fs_sfcat>-totals_function IS NOT INITIAL. + DO. + READ TABLE wt_subtotal_rows INTO ls_subtotal_rows WITH TABLE KEY row_int = l_row_int. + IF sy-subrc = 0. + l_row_int_start = ls_subtotal_rows-row_int_start. + l_row_int_end = l_row_int - 1. + + l_formula = create_formular_subtotal( i_row_int_start = l_row_int_start + i_row_int_end = l_row_int_end + i_column = l_col_alpha + i_totals_function = <fs_sfcat>-totals_function ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_formula = l_formula + ip_style = <fs_sfcat>-style_subtotal ). + IF <fs_sfcat>-is_collapsed = abap_true. + lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). + lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ). + IF <fs_sfcat>-sort_level > l_hidden. + lo_row_dim->set_visible( ip_visible = abap_false ) . + ENDIF. + ENDIF. + ADD 1 TO l_row_int. + ELSE. + EXIT. + ENDIF. + ENDDO. + ELSE. + ADD 1 TO l_row_int. + ENDIF. + ELSE. + EXIT. + ENDIF. + ENDDO. +* Let's set the row dimension values + lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). + lo_row_dim->set_outline_level( ip_outline_level = ws_layout-max_subtotal_level ) . + IF <fs_sfcat>-is_collapsed = abap_true. + lo_row_dim->set_visible( ip_visible = abap_false ) . + lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . + ENDIF. +* Now let's write the cell values + IF ws_layout-is_stripped = abap_true AND l_s_color = abap_true. + l_style = get_color_style( i_row = l_table_row + i_fieldname = <fs_sfcat>-columnname + i_style = <fs_sfcat>-style_stripped ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = <fs_fldval> + ip_style = l_style ). + CLEAR l_s_color. + ELSE. + l_style = get_color_style( i_row = l_table_row + i_fieldname = <fs_sfcat>-columnname + i_style = <fs_sfcat>-style_normal ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_value = <fs_fldval> + ip_style = l_style ). + l_s_color = abap_true. + ENDIF. + READ TABLE wt_filter TRANSPORTING NO FIELDS WITH TABLE KEY rownumber = l_table_row + columnname = <fs_sfcat>-columnname. + IF sy-subrc = 0. + wo_worksheet->get_cell( EXPORTING + ip_column = l_col_alpha + ip_row = l_row_int + IMPORTING + ep_value = l_cell_value ). + wo_autofilter->set_value( i_column = l_col_int + i_value = l_cell_value ). + ENDIF. + ADD 1 TO l_row_int. + ENDLOOP. +* Let's check for subtotal lines + DO. + READ TABLE wt_subtotal_rows TRANSPORTING NO FIELDS WITH TABLE KEY row_int = l_row_int. + IF sy-subrc = 0. + IF <fs_sfcat>-is_subtotalled = abap_false AND + <fs_sfcat>-totals_function IS NOT INITIAL. + DO. + READ TABLE wt_subtotal_rows INTO ls_subtotal_rows WITH TABLE KEY row_int = l_row_int. + IF sy-subrc = 0. + l_row_int_start = ls_subtotal_rows-row_int_start. + l_row_int_end = l_row_int - 1. + + l_formula = create_formular_subtotal( i_row_int_start = l_row_int_start + i_row_int_end = l_row_int_end + i_column = l_col_alpha + i_totals_function = <fs_sfcat>-totals_function ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_formula = l_formula + ip_style = <fs_sfcat>-style_subtotal ). + IF <fs_sfcat>-is_collapsed = abap_true. + lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). + lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ). + ENDIF. + ADD 1 TO l_row_int. + ELSE. + EXIT. + ENDIF. + ENDDO. + ELSE. + ADD 1 TO l_row_int. + ENDIF. + ELSE. + EXIT. + ENDIF. + ENDDO. +* Now let's check for Grand total + IF <fs_sfcat>-is_subtotalled = abap_false AND + <fs_sfcat>-totals_function IS NOT INITIAL. + l_row_int_start = i_row_int + 1. + l_row_int_end = l_row_int - 1. + + l_formula = create_formular_subtotal( i_row_int_start = l_row_int_start + i_row_int_end = l_row_int_end + i_column = l_col_alpha + i_totals_function = <fs_sfcat>-totals_function ). + wo_worksheet->set_cell( ip_column = l_col_alpha + ip_row = l_row_int + ip_formula = l_formula + ip_style = <fs_sfcat>-style_subtotal ). + ENDIF. +* Now let's check for optimized + IF <fs_sfcat>-is_optimized = abap_true. + lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). + lo_col_dim->set_auto_size( ip_auto_size = abap_true ) . + ENDIF. +* Now let's check for visible + IF <fs_sfcat>-is_hidden = abap_true. + lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). + lo_col_dim->set_visible( ip_visible = abap_false ) . + ENDIF. + ENDLOOP. + + endmethod. + + + method OPEN_FILE. + data: l_bytecount type i, + lt_file type solix_tab, + l_dir type string, + l_sep type c. + + field-symbols: <fs_data> type any table. + + assign wo_data->* to <fs_data>. + +* catch zcx_excel . +*endtry. + if wo_excel is bound. + get_file( importing e_bytecount = l_bytecount + et_file = lt_file ) . + + l_dir = create_path( ) . + + cl_gui_frontend_services=>gui_download( exporting bin_filesize = l_bytecount + filename = l_dir + filetype = 'BIN' + changing data_tab = lt_file ). + cl_gui_frontend_services=>execute( + exporting + document = l_dir +* application = +* parameter = +* default_directory = +* maximized = +* minimized = +* synchronous = +* operation = 'OPEN' + exceptions + cntl_error = 1 + error_no_gui = 2 + bad_parameter = 3 + file_not_found = 4 + path_not_found = 5 + file_extension_unknown = 6 + error_execute_failed = 7 + synchronous_failed = 8 + not_supported_by_gui = 9 + ). + if sy-subrc <> 0. + message id sy-msgid type sy-msgty number sy-msgno + with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + endif. + + endif. + + + endmethod. + + + method SET_AUTOFILTER_AREA. + DATA: ls_area TYPE zexcel_s_autofilter_area, + l_lines TYPE i, + lt_values TYPE zexcel_t_autofilter_values, + ls_values TYPE zexcel_s_autofilter_values. + +* Let's check for filter. + IF wo_autofilter IS BOUND. + ls_area-row_start = 1. + lt_values = wo_autofilter->get_values( ) . + SORT lt_values BY column ASCENDING. + DESCRIBE TABLE lt_values LINES l_lines. + READ TABLE lt_values INTO ls_values INDEX 1. + IF sy-subrc = 0. + ls_area-col_start = ls_values-column. + ENDIF. + READ TABLE lt_values INTO ls_values INDEX l_lines. + IF sy-subrc = 0. + ls_area-col_end = ls_values-column. + ENDIF. + wo_autofilter->set_filter_area( is_area = ls_area ) . + ENDIF. + + endmethod. + + + + + + method SET_CELL_FORMAT. + DATA: l_format TYPE zexcel_number_format. + + CLEAR r_format. + CASE i_inttype. + WHEN cl_abap_typedescr=>typekind_date. + r_format = wo_worksheet->get_default_excel_date_format( ). + WHEN cl_abap_typedescr=>typekind_time. + r_format = wo_worksheet->get_default_excel_time_format( ). + WHEN cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_packed. + IF i_decimals > 0 . + l_format = '#,##0.'. + DO i_decimals TIMES. + CONCATENATE l_format '0' INTO l_format. + ENDDO. + r_format = l_format. + ENDIF. + WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2. + r_format = '#,##0'. + ENDCASE. + + endmethod. + + + method SET_FIELDCATALOG. + + DATA: lr_data TYPE REF TO data, + lo_structdescr TYPE REF TO cl_abap_structdescr, + lt_dfies TYPE ddfields, + ls_dfies TYPE dfies, + ls_fieldcatalog TYPE zexcel_s_fieldcatalog. + DATA: ls_fcat TYPE zexcel_s_converter_fcat. + + FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE. + + ASSIGN wo_data->* TO <fs_tab> . + + CREATE DATA lr_data LIKE LINE OF <fs_tab>. + + lo_structdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + lt_dfies = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). + + LOOP AT lt_dfies INTO ls_dfies. + MOVE-CORRESPONDING ls_dfies TO ls_fcat. + ls_fcat-columnname = ls_dfies-fieldname. + INSERT ls_fcat INTO TABLE wt_fieldcatalog. + ENDLOOP. + + clean_fieldcatalog( ). + + endmethod. + + + + method SET_OPTION. + + IF ws_indx-begdt IS INITIAL. + ws_indx-begdt = sy-datum. + ENDIF. + + ws_indx-aedat = sy-datum. + ws_indx-usera = sy-uname. + ws_indx-pgmid = sy-cprog. + + EXPORT p1 = is_option TO DATABASE indx(xl) FROM ws_indx ID ws_indx-srtfd. + + IF sy-subrc = 0. + ws_option = is_option. + ENDIF. + + endmethod. + + + + method WRITE_FILE. + data: l_bytecount type i, + lt_file type solix_tab, + l_dir type string. + + field-symbols: <fs_data> type any table. + + assign wo_data->* to <fs_data>. + +* catch zcx_excel . +*endtry. + if wo_excel is bound. + get_file( importing e_bytecount = l_bytecount + et_file = lt_file ) . + if i_path is initial. + l_dir = create_path( ) . + else. + l_dir = i_path. + endif. + cl_gui_frontend_services=>gui_download( exporting bin_filesize = l_bytecount + filename = l_dir + filetype = 'BIN' + changing data_tab = lt_file ). + endif. + endmethod. + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature +TYPES: BEGIN OF ts_col_converter, + col TYPE lvc_col, + int TYPE lvc_int, + inv TYPE lvc_inv, + fontcolor TYPE zexcel_style_color_argb, + fillcolor TYPE zexcel_style_color_argb, + END OF ts_col_converter, + + tt_col_converter TYPE HASHED TABLE OF ts_col_converter WITH UNIQUE KEY col int inv. + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + ABAP + KKBLO + + + + + + + + + + method APPLY_SORT. + DATA: lt_otab TYPE abap_sortorder_tab, + ls_otab TYPE abap_sortorder. + + FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE, + <fs_sort> TYPE lvc_s_sort. + + CREATE DATA eo_table LIKE it_table. + ASSIGN eo_table->* TO <fs_table>. + + <fs_table> = it_table. + + SORT wt_sort BY spos. + LOOP AT wt_sort ASSIGNING <fs_sort>. + IF <fs_sort>-up = abap_true. + ls_otab-name = <fs_sort>-fieldname. + ls_otab-descending = abap_false. +* ls_otab-astext = abap_true. " not only text fields + INSERT ls_otab INTO TABLE lt_otab. + ENDIF. + IF <fs_sort>-down = abap_true. + ls_otab-name = <fs_sort>-fieldname. + ls_otab-descending = abap_true. +* ls_otab-astext = abap_true. " not only text fields + INSERT ls_otab INTO TABLE lt_otab. + ENDIF. + ENDLOOP. + IF lt_otab IS NOT INITIAL. + SORT <fs_table> BY (lt_otab). + ENDIF. + + endmethod. + + + method CLASS_CONSTRUCTOR. +* let's fill the color conversion routines. + DATA: ls_color TYPE ts_col_converter. +* 0 all combination the same + ls_color-col = 0. + ls_color-int = 0. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 0. + ls_color-int = 0. + ls_color-inv = 1. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 0. + ls_color-int = 1. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 0. + ls_color-int = 1. + ls_color-inv = 1. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + +* Blue + ls_color-col = 1. + ls_color-int = 0. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFB0E4FC'. " 176 228 252 blue + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 1. + ls_color-int = 0. + ls_color-inv = 1. + ls_color-fontcolor = 'FFB0E4FC'. " 176 228 252 blue + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 1. + ls_color-int = 1. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FF5FCBFE'. " 095 203 254 Int blue + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 1. + ls_color-int = 1. + ls_color-inv = 1. + ls_color-fontcolor = 'FF5FCBFE'. " 095 203 254 + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 + INSERT ls_color INTO TABLE wt_colors. + +* Gray + ls_color-col = 2. + ls_color-int = 0. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. + ls_color-fillcolor = 'FFE5EAF0'. " 229 234 240 gray + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 2. + ls_color-int = 0. + ls_color-inv = 1. + ls_color-fontcolor = 'FFE5EAF0'. " 229 234 240 gray + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 2. + ls_color-int = 1. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFD8E8F4'. " 216 234 244 int gray + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 2. + ls_color-int = 1. + ls_color-inv = 1. + ls_color-fontcolor = 'FFD8E8F4'. " 216 234 244 int gray + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + +*Yellow + ls_color-col = 3. + ls_color-int = 0. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFFEFEB8'. " 254 254 184 yellow + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 3. + ls_color-int = 0. + ls_color-inv = 1. + ls_color-fontcolor = 'FFFEFEB8'. " 254 254 184 yellow + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 3. + ls_color-int = 1. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFF9ED5D'. " 249 237 093 int yellow + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 3. + ls_color-int = 1. + ls_color-inv = 1. + ls_color-fontcolor = 'FFF9ED5D'. " 249 237 093 int yellow + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + +* light blue + ls_color-col = 4. + ls_color-int = 0. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFCEE7FB'. " 206 231 251 light blue + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 4. + ls_color-int = 0. + ls_color-inv = 1. + ls_color-fontcolor = 'FFCEE7FB'. " 206 231 251 light blue + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 4. + ls_color-int = 1. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FF9ACCEF'. " 154 204 239 int light blue + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 4. + ls_color-int = 1. + ls_color-inv = 1. + ls_color-fontcolor = 'FF9ACCEF'. " 154 204 239 int light blue + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + +* Green + ls_color-col = 5. + ls_color-int = 0. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFCEF8AE'. " 206 248 174 Green + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 5. + ls_color-int = 0. + ls_color-inv = 1. + ls_color-fontcolor = 'FFCEF8AE'. " 206 248 174 Green + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 5. + ls_color-int = 1. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FF7AC769'. " 122 199 105 int Green + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 5. + ls_color-int = 1. + ls_color-inv = 1. + ls_color-fontcolor = 'FF7AC769'. " 122 199 105 int Green + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + +* Red + ls_color-col = 6. + ls_color-int = 0. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFFDBBBC'. " 253 187 188 Red + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 6. + ls_color-int = 0. + ls_color-inv = 1. + ls_color-fontcolor = 'FFFDBBBC'. " 253 187 188 Red + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 6. + ls_color-int = 1. + ls_color-inv = 0. + ls_color-fontcolor = 'FF000000'. " 000 000 000 Black + ls_color-fillcolor = 'FFFB6B6B'. " 251 107 107 int Red + INSERT ls_color INTO TABLE wt_colors. + + ls_color-col = 6. + ls_color-int = 1. + ls_color-inv = 1. + ls_color-fontcolor = 'FFFB6B6B'. " 251 107 107 int Red + ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White + INSERT ls_color INTO TABLE wt_colors. + + endmethod. + + + + + method GET_COLOR. + DATA: ls_con_col TYPE zexcel_s_converter_col, + ls_color TYPE ts_col_converter, + l_line TYPE i, + l_color(4) TYPE c. + FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE, + <fs_stab> TYPE ANY, + <fs> TYPE ANY, + <fs_tcol> TYPE lvc_t_scol, + <fs_scol> TYPE lvc_s_scol. + +* Loop trough the table to set the color properties of each line. The color properties field is +* Char 4 and the characters is set as follows: +* Char 1 = C = This is a color property +* Char 2 = 6 = Color code (1 - 7) +* Char 3 = Intensified on/of = 1 = on +* Char 4 = Inverse display = 0 = of + + ASSIGN io_table->* TO <fs_tab>. + + IF ws_layo-info_fname IS NOT INITIAL OR + ws_layo-ctab_fname IS NOT INITIAL. + LOOP AT <fs_tab> ASSIGNING <fs_stab>. + l_line = sy-tabix. + IF ws_layo-info_fname IS NOT INITIAL. + ASSIGN COMPONENT ws_layo-info_fname OF STRUCTURE <fs_stab> TO <fs>. + IF sy-subrc = 0. + IF <fs> IS NOT INITIAL. + l_color = <fs>. + IF l_color(1) = 'C'. + READ TABLE wt_colors INTO ls_color WITH TABLE KEY col = l_color+1(1) + int = l_color+2(1) + inv = l_color+3(1). + IF sy-subrc = 0. + ls_con_col-rownumber = l_line. + ls_con_col-columnname = space. + ls_con_col-fontcolor = ls_color-fontcolor. + ls_con_col-fillcolor = ls_color-fillcolor. + INSERT ls_con_col INTO TABLE et_colors. + ENDIF. + ENDIF. + ENDIF. + ENDIF. + ENDIF. + IF ws_layo-ctab_fname IS NOT INITIAL. + ASSIGN COMPONENT ws_layo-ctab_fname OF STRUCTURE <fs_stab> TO <fs_tcol>. + IF sy-subrc = 0. + LOOP AT <fs_tcol> ASSIGNING <fs_scol>. + READ TABLE wt_colors INTO ls_color WITH TABLE KEY col = <fs_scol>-color-col + int = <fs_scol>-color-int + inv = <fs_scol>-color-inv. + IF sy-subrc = 0. + ls_con_col-rownumber = l_line. + ls_con_col-columnname = <fs_scol>-fname. + ls_con_col-fontcolor = ls_color-fontcolor. + ls_con_col-fillcolor = ls_color-fillcolor. + ls_con_col-nokeycol = <fs_scol>-nokeycol. + INSERT ls_con_col INTO TABLE et_colors. + ENDIF. + ENDLOOP. + ENDIF. + ENDIF. + ENDLOOP. + ENDIF. + endmethod. + + + + + METHOD get_filter. + DATA: ls_filt TYPE lvc_s_filt, + l_line TYPE i, + ls_filter TYPE zexcel_s_converter_fil. + DATA: lo_addit TYPE REF TO cl_abap_elemdescr, + lt_components_tab TYPE cl_abap_structdescr=>component_table, + ls_components TYPE abap_componentdescr, + lo_table TYPE REF TO cl_abap_tabledescr, + lo_struc TYPE REF TO cl_abap_structdescr, + lo_trange TYPE REF TO data, + lo_srange TYPE REF TO data, + lo_ltabdata TYPE REF TO data. + + FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE, + <fs_ltab> TYPE STANDARD TABLE, + <fs_stab> TYPE any, + <fs> TYPE any, + <fs1> TYPE any, + <fs_srange> TYPE any, + <fs_trange> TYPE STANDARD TABLE. + + IF ws_option-filter = abap_false. + REFRESH et_filter. + RETURN. + ENDIF. + + ASSIGN xo_table->* TO <fs_tab>. + + CREATE DATA lo_ltabdata LIKE <fs_tab>. + ASSIGN lo_ltabdata->* TO <fs_ltab>. + + LOOP AT wt_filt INTO ls_filt. + LOOP AT <fs_tab> ASSIGNING <fs_stab>. + l_line = sy-tabix. + ASSIGN COMPONENT ls_filt-fieldname OF STRUCTURE <fs_stab> TO <fs>. + IF sy-subrc = 0. + IF l_line = 1. + REFRESH lt_components_tab. + ls_components-name = 'SIGN'. + lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-sign ). + ls_components-type = lo_addit . + INSERT ls_components INTO TABLE lt_components_tab. + ls_components-name = 'OPTION'. + lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-option ). + ls_components-type = lo_addit . + INSERT ls_components INTO TABLE lt_components_tab. + ls_components-name = 'LOW'. + lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ). + ls_components-type = lo_addit . + INSERT ls_components INTO TABLE lt_components_tab. + ls_components-name = 'HIGH'. + lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ). + ls_components-type = lo_addit . + INSERT ls_components INTO TABLE lt_components_tab. + "create new line type + TRY. + lo_struc = cl_abap_structdescr=>create( p_components = lt_components_tab + p_strict = abap_false ). + CATCH cx_sy_struct_creation. + CONTINUE. + ENDTRY. + lo_table = cl_abap_tabledescr=>create( lo_struc ). + + CREATE DATA lo_trange TYPE HANDLE lo_table. + CREATE DATA lo_srange TYPE HANDLE lo_struc. + + ASSIGN lo_trange->* TO <fs_trange>. + ASSIGN lo_srange->* TO <fs_srange>. + ENDIF. + REFRESH <fs_trange>. + ASSIGN COMPONENT 'SIGN' OF STRUCTURE <fs_srange> TO <fs1>. + <fs1> = ls_filt-sign. + ASSIGN COMPONENT 'OPTION' OF STRUCTURE <fs_srange> TO <fs1>. + <fs1> = ls_filt-option. + ASSIGN COMPONENT 'LOW' OF STRUCTURE <fs_srange> TO <fs1>. + <fs1> = ls_filt-low. + ASSIGN COMPONENT 'HIGH' OF STRUCTURE <fs_srange> TO <fs1>. + <fs1> = ls_filt-high. + INSERT <fs_srange> INTO TABLE <fs_trange>. + IF <fs> IN <fs_trange>. + IF ws_option-filter = abap_true. + ls_filter-rownumber = l_line. + ls_filter-columnname = ls_filt-fieldname. + INSERT ls_filter INTO TABLE et_filter. + ELSE. + INSERT <fs_stab> INTO TABLE <fs_ltab>. + ENDIF. + ENDIF. + ENDIF. + ENDLOOP. + IF ws_option-filter = abap_undefined. + <fs_tab> = <fs_ltab>. + REFRESH <fs_ltab>. + ENDIF. + ENDLOOP. + +ENDMETHOD. + + + + + method UPDATE_CATALOG. + DATA: ls_fieldcatalog TYPE zexcel_s_converter_fcat, + ls_ref TYPE salv_s_ddic_reference, + ls_fcat TYPE lvc_s_fcat, + ls_sort TYPE lvc_s_sort, + l_decimals TYPE lvc_decmls. + + FIELD-SYMBOLS: <fs_scat> TYPE zexcel_s_converter_fcat. + + IF ws_layo-zebra IS NOT INITIAL. + cs_layout-is_stripped = abap_true. + ENDIF. + IF ws_layo-no_keyfix IS INITIAL OR + ws_layo-no_keyfix = '0'. + cs_layout-is_fixed = abap_true. + ENDIF. + + LOOP AT wt_fcat INTO ls_fcat. + CLEAR: ls_fieldcatalog, + l_decimals. + CASE ws_option-hidenc. + WHEN abap_false. " We make hiden columns visible + CLEAR ls_fcat-no_out. + WHEN abap_true. +* We convert column and hide it. + WHEN abap_undefined. "We don't convert hiden columns + IF ls_fcat-no_out = abap_true. + ls_fcat-tech = abap_true. + ENDIF. + ENDCASE. + IF ls_fcat-tech = abap_false. + ls_fieldcatalog-tabname = ls_fcat-tabname. + ls_fieldcatalog-fieldname = ls_fcat-fieldname . + ls_fieldcatalog-columnname = ls_fcat-fieldname . + ls_fieldcatalog-position = ls_fcat-col_pos. + ls_fieldcatalog-col_id = ls_fcat-col_id. + ls_fieldcatalog-convexit = ls_fcat-convexit. + ls_fieldcatalog-inttype = ls_fcat-inttype. + ls_fieldcatalog-scrtext_s = ls_fcat-scrtext_s . + ls_fieldcatalog-scrtext_m = ls_fcat-scrtext_m . + ls_fieldcatalog-scrtext_l = ls_fcat-scrtext_l. + l_decimals = ls_fcat-decimals_o. + IF l_decimals IS NOT INITIAL. + ls_fieldcatalog-decimals = l_decimals. + ELSE. + ls_fieldcatalog-decimals = ls_fcat-decimals . + ENDIF. + CASE ws_option-subtot. + WHEN abap_false. " We ignore subtotals + CLEAR ls_fcat-do_sum. + WHEN abap_true. " We convert subtotals and detail + + WHEN abap_undefined. " We should only take subtotals and displayed detail +* for now abap_true + ENDCASE. + CASE ls_fcat-do_sum. + WHEN abap_true. + ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_sum. + WHEN 'A'. + ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_min. + WHEN 'B' . + ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_max. + WHEN 'C' . + ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_average. + WHEN OTHERS. + CLEAR ls_fieldcatalog-totals_function . + ENDCASE. + ls_fieldcatalog-fix_column = ls_fcat-fix_column. + IF ws_layo-cwidth_opt IS INITIAL. + IF ls_fcat-col_opt IS NOT INITIAL. + ls_fieldcatalog-is_optimized = abap_true. + ENDIF. + ELSE. + ls_fieldcatalog-is_optimized = abap_true. + ENDIF. + IF ls_fcat-no_out IS NOT INITIAL. + ls_fieldcatalog-is_hidden = abap_true. + ls_fieldcatalog-position = ls_fieldcatalog-col_id. " We hide based on orginal data structure + ENDIF. +* Alignment in each cell + CASE ls_fcat-just. + WHEN 'R'. + ls_fieldcatalog-alignment = zcl_excel_style_alignment=>c_horizontal_right. + WHEN 'L'. + ls_fieldcatalog-alignment = zcl_excel_style_alignment=>c_horizontal_left. + WHEN 'C'. + ls_fieldcatalog-alignment = zcl_excel_style_alignment=>c_horizontal_center. + WHEN OTHERS. + CLEAR ls_fieldcatalog-alignment. + ENDCASE. +* Check for subtotals. + READ TABLE wt_sort INTO ls_sort WITH KEY fieldname = ls_fcat-fieldname. + IF sy-subrc = 0 AND ws_option-subtot <> abap_false. + ls_fieldcatalog-sort_level = 0 . +* IF ls_fieldcatalog-totals_function IS INITIAL. " Not clear why not +* CLEAR ls_fieldcatalog-is_subtotalled. +* ELSE. + ls_fieldcatalog-is_subtotalled = ls_sort-subtot. +* ENDIF. + ls_fieldcatalog-is_collapsed = ls_sort-expa. + IF ls_fieldcatalog-is_subtotalled = abap_true. + ls_fieldcatalog-sort_level = ls_sort-spos. + ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_sum. " we need function for text + ENDIF. + ENDIF. + APPEND ls_fieldcatalog TO ct_fieldcatalog. + ENDIF. + ENDLOOP. + + SORT ct_fieldcatalog BY sort_level ASCENDING. + cs_layout-max_subtotal_level = 0. + LOOP AT ct_fieldcatalog ASSIGNING <fs_scat> WHERE sort_level > 0. + cs_layout-max_subtotal_level = cs_layout-max_subtotal_level + 1. + <fs_scat>-sort_level = cs_layout-max_subtotal_level. + ENDLOOP. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + method ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. + data: lo_alv type REF TO cl_gui_alv_grid. + + try. + lo_alv ?= io_object. + catch cx_sy_move_cast_error . + raise exception type zcx_excel. + endtry. + +endmethod. + + + METHOD zif_excel_converter~create_fieldcatalog. + DATA: lo_alv TYPE REF TO cl_gui_alv_grid. + + TRY. + zif_excel_converter~can_convert_object( io_object = io_object ). + ENDTRY. + + ws_option = is_option. + + lo_alv ?= io_object. + + CLEAR: es_layout, + et_fieldcatalog. + + IF lo_alv IS BOUND. + lo_alv->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = wt_fcat ). + lo_alv->get_frontend_layout( IMPORTING es_layout = ws_layo ). + lo_alv->get_sort_criteria( IMPORTING et_sort = wt_sort ) . + lo_alv->get_filter_criteria( IMPORTING et_filter = wt_filt ) . + + apply_sort( EXPORTING it_table = it_table + IMPORTING eo_table = eo_table ) . + + get_color( EXPORTING io_table = eo_table + IMPORTING et_colors = et_colors ) . + + get_filter( IMPORTING et_filter = et_filter + CHANGING xo_table = eo_table ) . + + update_catalog( CHANGING cs_layout = es_layout + ct_fieldcatalog = et_fieldcatalog ). + ENDIF. +ENDMETHOD. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + method GET_TABLE. + DATA: lo_object TYPE REF TO object, + ls_seoclass TYPE seoclass, + l_method TYPE string. + + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'IF_SALV_BS_DATA_SOURCE'. + + IF sy-subrc = 0. + l_method = 'GET_TABLE_REF'. + lo_object ?= io_object. + CALL METHOD lo_object->(l_method) + RECEIVING + value = ro_data. + ELSE. + l_method = 'GET_REF_TO_TABLE'. + lo_object ?= io_object. + CALL METHOD lo_object->(l_method) + RECEIVING + value = ro_data. + ENDIF. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + METHOD ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. + + DATA: lo_result TYPE REF TO cl_salv_ex_result_data_table. + + TRY. + lo_result ?= io_object. + CATCH cx_sy_move_cast_error . + RAISE EXCEPTION TYPE zcx_excel. + ENDTRY. + +ENDMETHOD. + + + METHOD zif_excel_converter~create_fieldcatalog. + DATA: lo_result TYPE REF TO cl_salv_ex_result_data_table, + lo_ex_cm TYPE REF TO cl_salv_ex_cm, + lo_data TYPE REF TO data. + + FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. + + TRY. + zif_excel_converter~can_convert_object( io_object = io_object ). + ENDTRY. + + ws_option = is_option. + + lo_result ?= io_object. + + CLEAR: es_layout, + et_fieldcatalog. + + IF lo_result IS BOUND. + lo_data = get_table( io_object = lo_result->r_model->r_data ). + IF lo_data IS BOUND. + ASSIGN lo_data->* TO <fs_table> . + + lo_ex_cm ?= lo_result->r_model->r_model. + ws_layo = lo_ex_cm->s_layo. +* T_DRDN Instance Attribute Public Type LVC_T_DROP + wt_fcat = lo_ex_cm->t_fcat. + wt_filt = lo_ex_cm->t_filt. +* T_HYPE Instance Attribute Public Type LVC_T_HYPE +* T_SELECTED_CELLS Instance Attribute Public Type LVC_T_CELL +* T_SELECTED_COLUMNS Instance Attribute Public Type LVC_T_COL + wt_sort = lo_ex_cm->t_sort. + + apply_sort( EXPORTING it_table = <fs_table> + IMPORTING eo_table = eo_table ) . + + get_color( EXPORTING io_table = eo_table + IMPORTING et_colors = et_colors ) . + + get_filter( IMPORTING et_filter = et_filter + CHANGING xo_table = eo_table ) . + + update_catalog( CHANGING cs_layout = es_layout + ct_fieldcatalog = et_fieldcatalog ). + else. +* We have a problem and should stop here. + ENDIF. + ENDIF. +ENDMETHOD. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + METHOD ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. + + DATA: lo_result TYPE REF TO cl_salv_wd_result_data_table. + + TRY. + lo_result ?= io_object. + CATCH cx_sy_move_cast_error . + RAISE EXCEPTION TYPE zcx_excel. + ENDTRY. + +ENDMETHOD. + + + METHOD zif_excel_converter~create_fieldcatalog. + DATA: lo_result TYPE REF TO cl_salv_wd_result_data_table, + lo_data TYPE REF TO data. + + FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. + + TRY. + zif_excel_converter~can_convert_object( io_object = io_object ). + ENDTRY. + + ws_option = is_option. + + lo_result ?= io_object. + + CLEAR: es_layout, + et_fieldcatalog. + + IF lo_result IS BOUND. + lo_data = get_table( io_object = lo_result->r_model->r_data ). + IF lo_data IS BOUND. + ASSIGN lo_data->* TO <fs_table> . + + wo_config ?= lo_result->r_model->r_model. + + IF wo_config IS BOUND. + wt_fields = wo_config->if_salv_wd_field_settings~get_fields( ) . + wt_columns = wo_config->if_salv_wd_column_settings~get_columns( ) . + ENDIF. + + create_wt_fcat( io_table = lo_data ). + create_wt_sort( ). + create_wt_filt( ). + + apply_sort( EXPORTING it_table = <fs_table> + IMPORTING eo_table = eo_table ) . + +* get_color( EXPORTING io_table = eo_table +* IMPORTING et_colors = et_colors ) . + + get_filter( IMPORTING et_filter = et_filter + CHANGING xo_table = eo_table ) . + + update_catalog( CHANGING cs_layout = es_layout + ct_fieldcatalog = et_fieldcatalog ). + ELSE. +* We have a problem and should stop here + ENDIF. + ENDIF. +ENDMETHOD. + + + + method CREATE_WT_FCAT. + DATA: lr_data TYPE REF TO data, + lo_structdescr TYPE REF TO cl_abap_structdescr, + lt_dfies TYPE ddfields, + ls_dfies TYPE dfies, + lv_sytabix TYPE sytabix. + + DATA: ls_fcat TYPE lvc_s_fcat. + + FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE. + + ASSIGN io_table->* TO <fs_tab> . + CREATE DATA lr_data LIKE LINE OF <fs_tab>. + + lo_structdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + lt_dfies = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). + + loop at lt_dfies into ls_dfies. + MOVE-CORRESPONDING ls_dfies TO ls_fcat. +* ls_fcat-columnname = ls_dfies-fieldname. + ls_fcat-col_pos = ls_dfies-position. + ls_fcat-key = ls_dfies-keyflag. + get_fields_info( CHANGING xs_fcat = ls_fcat ) . + + ls_fcat-col_opt = abap_true. + + get_columns_info( CHANGING xs_fcat = ls_fcat ) . + + INSERT ls_fcat INTO TABLE wt_fcat. + endloop. + + endmethod. + + + method CREATE_WT_FILT. +* No neeed for superclass. +* Only for WD + DATA: lt_otab TYPE abap_sortorder_tab, + ls_otab TYPE abap_sortorder. + DATA: lt_filters TYPE salv_wd_t_filter_rule_ref, + ls_filt TYPE lvc_s_filt. + + FIELD-SYMBOLS: <fs_fields> TYPE salv_wd_s_field_ref, + <fs_filter> TYPE salv_wd_s_filter_rule_ref. + + LOOP AT wt_fields ASSIGNING <fs_fields>. + REFRESH lt_filters. + lt_filters = <fs_fields>-r_field->if_salv_wd_filter~get_filter_rules( ) . + LOOP AT lt_filters ASSIGNING <fs_filter>. + ls_filt-fieldname = <fs_fields>-fieldname. + IF <fs_filter>-r_filter_rule->get_included( ) = abap_true. + ls_filt-sign = 'I'. + ELSE. + ls_filt-sign = 'E'. + ENDIF. + ls_filt-option = <fs_filter>-r_filter_rule->get_operator( ). + ls_filt-high = <fs_filter>-r_filter_rule->get_high_value( ) . + ls_filt-low = <fs_filter>-r_filter_rule->get_low_value( ) . + INSERT ls_filt INTO TABLE wt_filt. + ENDLOOP. + ENDLOOP. + + endmethod. + + + method CREATE_WT_SORT. + DATA: lo_sort TYPE REF TO cl_salv_wd_sort_rule, + l_sort_order TYPE salv_wd_constant, + ls_sort TYPE lvc_s_sort. + + FIELD-SYMBOLS: <fs_fields> TYPE salv_wd_s_field_ref. + + LOOP AT wt_fields ASSIGNING <fs_fields>. + lo_sort = <fs_fields>-r_field->if_salv_wd_sort~get_sort_rule( ) . + IF lo_sort IS BOUND. + l_sort_order = lo_sort->get_sort_order( ). + IF l_sort_order <> if_salv_wd_c_sort=>sort_order. + CLEAR ls_sort. + ls_sort-spos = lo_sort->get_sort_position( ). + ls_sort-fieldname = <fs_fields>-fieldname. +* ls_sort-GROUP + ls_sort-subtot = lo_sort->get_group_aggregation( ). +* ls_sort-COMP +* ls_sort-EXPA +* ls_sort-SELTEXT +* ls_sort-OBLIGATORY +* ls_sort-LEVEL +* ls_sort-NO_OUT + IF l_sort_order = if_salv_wd_c_sort=>sort_order_ascending. + ls_sort-up = abap_true. + ELSE. + ls_sort-down = abap_true. + ENDIF. + INSERT ls_sort INTO TABLE wt_sort. + ENDIF. + ENDIF. + ENDLOOP. + + endmethod. + + + + method GET_COLUMNS_INFO. + DATA: l_numc2 TYPE salv_wd_constant. + + + FIELD-SYMBOLS: <fs_column> TYPE salv_wd_s_column_ref. + + READ TABLE wt_columns ASSIGNING <fs_column> WITH KEY id = xs_fcat-fieldname . + IF sy-subrc = 0. + xs_fcat-col_pos = <fs_column>-r_column->get_position( ) . + l_numc2 = <fs_column>-r_column->get_fixed_position( ). + IF l_numc2 = '02'. + xs_fcat-fix_column = abap_true . + ENDIF. + l_numc2 = <fs_column>-r_column->get_visible( ). + IF l_numc2 = '01'. + xs_fcat-no_out = abap_true . + ENDIF. + ENDIF. + + endmethod. + + + + method GET_FIELDS_INFO. + DATA: lo_aggr TYPE REF TO cl_salv_wd_aggr_rule, + l_aggrtype TYPE salv_wd_constant. + + FIELD-SYMBOLS: <fs_fields> TYPE salv_wd_s_field_ref. + + READ TABLE wt_fields ASSIGNING <fs_fields> WITH KEY fieldname = xs_fcat-fieldname. + IF sy-subrc = 0. + lo_aggr = <fs_fields>-r_field->if_salv_wd_aggr~get_aggr_rule( ) . + IF lo_aggr IS BOUND. + l_aggrtype = lo_aggr->get_aggregation_type( ) . + CASE l_aggrtype. + WHEN if_salv_wd_c_aggregation=>aggrtype_total. + xs_fcat-do_sum = abap_true. + WHEN if_salv_wd_c_aggregation=>aggrtype_minimum. + xs_fcat-do_sum = 'A'. + WHEN if_salv_wd_c_aggregation=>aggrtype_maximum . + xs_fcat-do_sum = 'B'. + WHEN if_salv_wd_c_aggregation=>aggrtype_average . + xs_fcat-do_sum = 'C'. + WHEN OTHERS. + CLEAR xs_fcat-do_sum . + ENDCASE. + ENDIF. + ENDIF. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + METHOD zif_excel_converter~can_convert_object. + + DATA: lo_salv TYPE REF TO cl_salv_table. + + TRY. + lo_salv ?= io_object. + CATCH cx_sy_move_cast_error . + RAISE EXCEPTION TYPE zcx_excel. + ENDTRY. + +ENDMETHOD. + + + METHOD zif_excel_converter~create_fieldcatalog. + DATA: lo_salv TYPE REF TO cl_salv_table. + + TRY. + zif_excel_converter~can_convert_object( io_object = io_object ). + ENDTRY. + + ws_option = is_option. + + lo_salv ?= io_object. + + CLEAR: es_layout, + et_fieldcatalog, + et_colors . + + IF lo_salv IS BOUND. + load_data( EXPORTING io_salv = lo_salv + it_table = it_table ). + apply_sort( EXPORTING it_table = it_table + IMPORTING eo_table = eo_table ) . + + get_color( EXPORTING io_table = eo_table + IMPORTING et_colors = et_colors ) . + + get_filter( IMPORTING et_filter = et_filter + CHANGING xo_table = eo_table ) . + + update_catalog( CHANGING cs_layout = es_layout + ct_fieldcatalog = et_fieldcatalog ). + ENDIF. +ENDMETHOD. + + + + + method LOAD_DATA. + DATA: lo_columns TYPE REF TO cl_salv_columns_table, + lo_aggregations TYPE REF TO cl_salv_aggregations, + lo_sorts TYPE REF TO cl_salv_sorts, + lo_filters TYPE REF TO cl_salv_filters, + lo_functional TYPE REF TO cl_salv_functional_settings, + lo_display TYPE REF TO cl_salv_display_settings, + lo_selections TYPE REF TO cl_salv_selections. + + DATA: ls_vari TYPE disvariant, + lo_layout TYPE REF TO cl_salv_layout. + + DATA: lr_form_tol TYPE REF TO cl_salv_form, + lr_form_eol TYPE REF TO cl_salv_form. + + DATA lt_kkblo_fieldcat TYPE kkblo_t_fieldcat. + DATA ls_kkblo_layout TYPE kkblo_layout. + DATA lt_kkblo_filter TYPE kkblo_t_filter. + DATA lt_kkblo_sort TYPE kkblo_t_sortinfo. + + lo_layout = io_salv->get_layout( ) . + lo_columns = io_salv->get_columns( ). + lo_aggregations = io_salv->get_aggregations( ) . + lo_sorts = io_salv->get_sorts( ) . + lo_filters = io_salv->get_filters( ) . + lo_display = io_salv->get_display_settings( ) . + lo_functional = io_salv->get_functional_settings( ) . + + REFRESH: wt_fcat, + wt_sort, + wt_filt. + +* First update metadata if we can. + IF io_salv->is_offline( ) = abap_false. + io_salv->get_metadata( ) . + ELSE. +* If we are offline we need to build this. + cl_salv_controller_metadata=>get_variant( + EXPORTING + r_layout = lo_layout + CHANGING + s_variant = ls_vari ). + ENDIF. + +*... get the column information + wt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog( + r_columns = lo_columns + r_aggregations = lo_aggregations ). + +*... get the layout information + cl_salv_controller_metadata=>get_lvc_layout( + EXPORTING + r_functional_settings = lo_functional + r_display_settings = lo_display + r_columns = lo_columns + r_aggregations = lo_aggregations + CHANGING + s_layout = ws_layo ). + +* the fieldcatalog is not complete yet! + CALL FUNCTION 'LVC_FIELDCAT_COMPLETE' + EXPORTING + i_complete = 'X' + i_refresh_buffer = space + i_buffer_active = space + is_layout = ws_layo + i_test = '1' + i_fcat_complete = 'X' + IMPORTING +* E_EDIT = + es_layout = ws_layo + CHANGING + ct_fieldcat = wt_fcat. + + IF ls_vari IS NOT INITIAL AND io_salv->is_offline( ) = abap_true. + CALL FUNCTION 'LVC_TRANSFER_TO_KKBLO' + EXPORTING + it_fieldcat_lvc = wt_fcat + is_layout_lvc = ws_layo + IMPORTING + et_fieldcat_kkblo = lt_kkblo_fieldcat + es_layout_kkblo = ls_kkblo_layout + TABLES + it_data = it_table + EXCEPTIONS + it_data_missing = 1 + it_fieldcat_lvc_missing = 2 + OTHERS = 3. + IF sy-subrc <> 0. +* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO +* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. + ENDIF. + + CALL FUNCTION 'LT_VARIANT_LOAD' + EXPORTING +* I_TOOL = 'LT' + i_tabname = '1' +* I_TABNAME_SLAVE = + i_dialog = ' ' +* I_USER_SPECIFIC = ' ' +* I_DEFAULT = 'X' +* I_NO_REPTEXT_OPTIMIZE = +* I_VIA_GRID = + i_fcat_complete = 'X' + IMPORTING +* E_EXIT = + et_fieldcat = lt_kkblo_fieldcat + et_sort = lt_kkblo_sort + et_filter = lt_kkblo_filter + CHANGING + cs_layout = ls_kkblo_layout + ct_default_fieldcat = lt_kkblo_fieldcat + cs_variant = ls_vari + EXCEPTIONS + wrong_input = 1 + fc_not_complete = 2 + not_found = 3 + OTHERS = 4 + . + IF sy-subrc <> 0. +* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO +* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. + ENDIF. + + CALL FUNCTION 'LVC_TRANSFER_FROM_KKBLO' + EXPORTING +* I_TECH_COMPLETE = +* I_STRUCTURE_NAME = + it_fieldcat_kkblo = lt_kkblo_fieldcat + it_sort_kkblo = lt_kkblo_sort + it_filter_kkblo = lt_kkblo_filter +* IT_SPECIAL_GROUPS_KKBLO = +* IT_FILTERED_ENTRIES_KKBLO = +* IT_GROUPLEVELS_KKBLO = +* IS_SUBTOT_OPTIONS_KKBLO = + is_layout_kkblo = ls_kkblo_layout +* IS_REPREP_ID_KKBLO = +* I_CALLBACK_PROGRAM_KKBLO = +* IT_ADD_FIELDCAT = +* IT_EXCLUDING_KKBLO = +* IT_EXCEPT_QINFO_KKBLO = + IMPORTING + et_fieldcat_lvc = wt_fcat + et_sort_lvc = wt_sort + et_filter_lvc = wt_filt +* ET_SPECIAL_GROUPS_LVC = +* ET_FILTER_INDEX_LVC = +* ET_GROUPLEVELS_LVC = +* ES_TOTAL_OPTIONS_LVC = + es_layout_lvc = ws_layo +* ES_VARIANT_LVC = +* E_VARIANT_SAVE_LVC = +* ES_PRINT_INFO_LVC = +* ES_REPREP_LVC = +* E_REPREP_ACTIVE_LVC = +* ET_EXCLUDING_LVC = +* ET_EXCEPT_QINFO_LVC = + TABLES + it_data = it_table + EXCEPTIONS + it_data_missing = 1 + OTHERS = 2 + . + IF sy-subrc <> 0. +* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO +* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. + ENDIF. + + ELSE. +* ... get the sort information + wt_sort = cl_salv_controller_metadata=>get_lvc_sort( lo_sorts ). + +* ... get the filter information + wt_filt = cl_salv_controller_metadata=>get_lvc_filter( lo_filters ). + ENDIF. + + endmethod. + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + " Initialise instance variables + formula1 = ''. + formula2 = ''. + type = me->c_type_none. + errorstyle = me->c_style_stop. + operator = ''. + allowblank = abap_false. + showdropdown = abap_false. + showinputmessage = abap_true. + showerrormessage = abap_true. + errortitle = ''. + error = ''. + prompttitle = ''. + prompt = ''. +* inizialize dimension range + cell_row = 1. + cell_column = 'A'. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + method ADD. + data_validations->add( ip_data_validation ). + endmethod. + + + method CLEAR. + data_validations->clear( ). + endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT data_validations. + + endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= data_validations->if_object_collection~get_iterator( ). + endmethod. + + + + method IS_EMPTY. + is_empty = data_validations->if_object_collection~is_empty( ). + endmethod. + + + + method REMOVE. + data_validations->remove( ip_data_validation ). + endmethod. + + + + method SIZE. + ep_size = data_validations->if_object_collection~size( ). + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + title = ip_title. + ELSE. + title = me->guid. + ENDIF. + + me->type = ip_type. + +* inizialize dimension range + anchor = anchor_one_cell. + from_loc-col = 1. + from_loc-row = 1. + endmethod. + + + + method CREATE_MEDIA_NAME. + +* if media name is initial, create unique name + CHECK media_name IS INITIAL. + + index = ip_index. + CONCATENATE me->type index INTO media_name. + CONDENSE media_name NO-GAPS. + endmethod. + + + + method GET_FROM_COL. + r_from_col = me->from_loc-col. + endmethod. + + + + method GET_FROM_ROW. + r_from_row = me->from_loc-row. + endmethod. + + + + method GET_GUID. + + ep_guid = me->guid. + + endmethod. + + + + method GET_HEIGHT_EMU_STR. + r_height = pixel2emu( size-height ). + CONDENSE r_height NO-GAPS. + endmethod. + + + + method GET_INDEX. + rp_index = me->index. + endmethod. + + + + METHOD get_media. + + DATA: lv_language TYPE sylangu. + DATA: lt_bin_mime TYPE sdokcntbins. + DATA: lt_mime TYPE tsfmime, + lv_filesize TYPE i, + lv_filesizec(10). + + CASE media_source. + WHEN c_media_source_xstring. + r_media = media. + WHEN c_media_source_www. + CALL FUNCTION 'WWWDATA_IMPORT' + EXPORTING + key = media_key_www + TABLES + mime = lt_mime + EXCEPTIONS + OTHERS = 1. + + CALL FUNCTION 'WWWPARAMS_READ' + EXPORTING + relid = media_key_www-relid + objid = media_key_www-objid + name = 'filesize' + IMPORTING + value = lv_filesizec. + + lv_filesize = lv_filesizec. + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filesize + IMPORTING + buffer = r_media + TABLES + binary_tab = lt_mime + EXCEPTIONS + failed = 1 + OTHERS = 2. + WHEN c_media_source_mime. + lv_language = sy-langu. + cl_wb_mime_repository=>load_mime( EXPORTING + io = me->io + IMPORTING + filesize = lv_filesize + bin_data = lt_bin_mime + CHANGING + language = lv_language ). + + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filesize + IMPORTING + buffer = r_media + TABLES + binary_tab = lt_bin_mime + EXCEPTIONS + failed = 1 + OTHERS = 2. + ENDCASE. +ENDMETHOD. + + + + method GET_MEDIA_NAME. + CONCATENATE media_name `.` media_type INTO r_name. + endmethod. + + + + method GET_MEDIA_TYPE. + r_type = media_type. + endmethod. + + + + method GET_NAME. + r_name = title. + endmethod. + + + + method GET_POSITION. + rp_position-anchor = anchor. + rp_position-from = from_loc. + rp_position-to = to_loc. + rp_position-size = size. + endmethod. + + + + method GET_TO_COL. + r_to_col = me->to_loc-col. + endmethod. + + + + method GET_TO_ROW. + r_to_row = me->to_loc-row. + endmethod. + + + + method GET_TYPE. + rp_type = me->type. + endmethod. + + + + method GET_WIDTH_EMU_STR. + r_width = pixel2emu( size-width ). + CONDENSE r_width NO-GAPS. + endmethod. + + + + method LOAD_CHART_ATTRIBUTES. + DATA: node TYPE REF TO if_ixml_element. + DATA: node2 TYPE REF TO if_ixml_element. + DATA: node3 TYPE REF TO if_ixml_element. + DATA: node4 TYPE REF TO if_ixml_element. + DATA: iterator TYPE REF TO if_ixml_node_iterator. + + DATA: chartspace TYPE REF TO if_ixml_node_collection. + DATA: coll_length TYPE i. + DATA: chartelem TYPE REF TO if_ixml_element. + + DATA lo_barchart TYPE REF TO zcl_excel_graph_bars. + DATA lo_piechart TYPE REF TO zcl_excel_graph_pie. + DATA lo_linechart TYPE REF TO zcl_excel_graph_line. + + TYPES: BEGIN OF t_prop, + val TYPE string, + rtl TYPE string, + lang TYPE string, + formatcode TYPE string, + sourcelinked TYPE string, + END OF t_prop. + + TYPES: BEGIN OF t_pagemargins, + b TYPE string, + l TYPE string, + r TYPE string, + t TYPE string, + header TYPE string, + footer TYPE string, + END OF t_pagemargins. + + DATA ls_prop TYPE t_prop. + DATA ls_pagemargins TYPE t_pagemargins. + + DATA lo_collection TYPE REF TO if_ixml_node_collection. + DATA lo_node TYPE REF TO if_ixml_node. + DATA lo_iterator TYPE REF TO if_ixml_node_iterator. + DATA lv_idx TYPE i. + DATA lv_order TYPE i. + DATA lv_invertifnegative TYPE string. + DATA lv_symbol TYPE string. + DATA lv_smooth TYPE c. + DATA lv_sername TYPE string. + DATA lv_label TYPE string. + DATA lv_value TYPE string. + DATA lv_axid TYPE string. + DATA lv_orientation TYPE string. + DATA lv_delete TYPE string. + DATA lv_axpos TYPE string. + DATA lv_formatcode TYPE string. + DATA lv_sourcelinked TYPE string. + DATA lv_majortickmark TYPE string. + DATA lv_minortickmark TYPE string. + DATA lv_ticklblpos TYPE string. + DATA lv_crossax TYPE string. + DATA lv_crosses TYPE string. + DATA lv_auto TYPE string. + DATA lv_lblalgn TYPE string. + DATA lv_lbloffset TYPE string. + DATA lv_nomultilvllbl TYPE string. + DATA lv_crossbetween TYPE string. + + node ?= ip_chart->if_ixml_node~get_first_child( ). + CHECK node IS NOT INITIAL. + + CASE me->graph_type. + WHEN c_graph_bars. + CREATE OBJECT lo_barchart. + me->graph = lo_barchart. + WHEN c_graph_pie. + CREATE OBJECT lo_piechart. + me->graph = lo_piechart. + WHEN c_graph_line. + CREATE OBJECT lo_linechart. + me->graph = lo_linechart. + WHEN OTHERS. + ENDCASE. + + "Fill properties + node2 ?= node->find_from_name( name = 'date1904' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_1904val = ls_prop-val. + node2 ?= node->find_from_name( name = 'lang' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_langval = ls_prop-val. + node2 ?= node->find_from_name( name = 'roundedCorners' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_roundedcornersval = ls_prop-val. + + "style + node2 ?= node->find_from_name( name = 'style' namespace = 'c14' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_c14styleval = ls_prop-val. + node2 ?= node->find_from_name( name = 'style' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_styleval = ls_prop-val. + "---------------------------Read graph properties + node2 ?= node->find_from_name( name = 'autoTitleDeleted' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_autotitledeletedval = ls_prop-val. + + "plotArea + CASE me->graph_type. + WHEN c_graph_bars. + node2 ?= node->find_from_name( name = 'barDir' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_bardirval = ls_prop-val. + node2 ?= node->find_from_name( name = 'grouping' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_groupingval = ls_prop-val. + node2 ?= node->find_from_name( name = 'varyColors' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_varycolorsval = ls_prop-val. + + "Load series + CALL METHOD node->get_elements_by_tag_name + EXPORTING +* depth = 0 + name = 'ser' +* namespace = '' + RECEIVING + rval = lo_collection. + CALL METHOD lo_collection->create_iterator + RECEIVING + rval = lo_iterator. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + WHILE lo_node IS BOUND. + node3 ?= node2->find_from_name( name = 'idx' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_idx = ls_prop-val. + node3 ?= node2->find_from_name( name = 'order' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_order = ls_prop-val. + node3 ?= node2->find_from_name( name = 'invertIfNegative' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_invertifnegative = ls_prop-val. + node3 ?= node2->find_from_name( name = 'v' namespace = 'c' ). + IF node3 IS BOUND. + lv_sername = node3->get_value( ). + ENDIF. + node3 ?= node2->find_from_name( name = 'strRef' namespace = 'c' ). + IF node3 IS BOUND. + node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). + lv_label = node4->get_value( ). + ENDIF. + node3 ?= node2->find_from_name( name = 'numRef' namespace = 'c' ). + IF node3 IS BOUND. + node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). + lv_value = node4->get_value( ). + ENDIF. + CALL METHOD lo_barchart->create_serie + EXPORTING + ip_idx = lv_idx + ip_order = lv_order + ip_invertifnegative = lv_invertifnegative + ip_lbl = lv_label + ip_ref = lv_value + ip_sername = lv_sername. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + ENDWHILE. + "note: numCache avoided + node2 ?= node->find_from_name( name = 'showLegendKey' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_showlegendkeyval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showVal' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_showvalval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showCatName' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_showcatnameval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showSerName' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_showsernameval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showPercent' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_showpercentval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showBubbleSize' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_showbubblesizeval = ls_prop-val. + node2 ?= node->find_from_name( name = 'gapWidth' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_gapwidthval = ls_prop-val. + + "Load axes + node2 ?= node->find_from_name( name = 'barChart' namespace = 'c' ). + CALL METHOD node2->get_elements_by_tag_name + EXPORTING +* depth = 0 + name = 'axId' +* namespace = '' + RECEIVING + rval = lo_collection. + CALL METHOD lo_collection->create_iterator + RECEIVING + rval = lo_iterator. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + WHILE lo_node IS BOUND. + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lv_axid = ls_prop-val. + IF sy-index EQ 1. "catAx + node2 ?= node->find_from_name( name = 'catAx' namespace = 'c' ). + node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_orientation = ls_prop-val. + node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_delete = ls_prop-val. + node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_axpos = ls_prop-val. + node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_formatcode = ls_prop-formatcode. + lv_sourcelinked = ls_prop-sourcelinked. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_majortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_minortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_ticklblpos = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crossax = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crosses = ls_prop-val. + node3 ?= node2->find_from_name( name = 'auto' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_auto = ls_prop-val. + node3 ?= node2->find_from_name( name = 'lblAlgn' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_lblalgn = ls_prop-val. + node3 ?= node2->find_from_name( name = 'lblOffset' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_lbloffset = ls_prop-val. + node3 ?= node2->find_from_name( name = 'noMultiLvlLbl' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_nomultilvllbl = ls_prop-val. + CALL METHOD lo_barchart->create_ax + EXPORTING + ip_axid = lv_axid + ip_type = zcl_excel_graph_bars=>c_catax + ip_orientation = lv_orientation + ip_delete = lv_delete + ip_axpos = lv_axpos + ip_formatcode = lv_formatcode + ip_sourcelinked = lv_sourcelinked + ip_majortickmark = lv_majortickmark + ip_minortickmark = lv_minortickmark + ip_ticklblpos = lv_ticklblpos + ip_crossax = lv_crossax + ip_crosses = lv_crosses + ip_auto = lv_auto + ip_lblalgn = lv_lblalgn + ip_lbloffset = lv_lbloffset + ip_nomultilvllbl = lv_nomultilvllbl. + ELSEIF sy-index EQ 2. "valAx + node2 ?= node->find_from_name( name = 'valAx' namespace = 'c' ). + node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_orientation = ls_prop-val. + node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_delete = ls_prop-val. + node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_axpos = ls_prop-val. + node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_formatcode = ls_prop-formatcode. + lv_sourcelinked = ls_prop-sourcelinked. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_majortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_minortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_ticklblpos = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crossax = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crosses = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crossBetween' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crossbetween = ls_prop-val. + CALL METHOD lo_barchart->create_ax + EXPORTING + ip_axid = lv_axid + ip_type = zcl_excel_graph_bars=>c_valax + ip_orientation = lv_orientation + ip_delete = lv_delete + ip_axpos = lv_axpos + ip_formatcode = lv_formatcode + ip_sourcelinked = lv_sourcelinked + ip_majortickmark = lv_majortickmark + ip_minortickmark = lv_minortickmark + ip_ticklblpos = lv_ticklblpos + ip_crossax = lv_crossax + ip_crosses = lv_crosses + ip_crossbetween = lv_crossbetween. + ENDIF. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + ENDWHILE. + + WHEN c_graph_pie. + node2 ?= node->find_from_name( name = 'varyColors' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_varycolorsval = ls_prop-val. + + "Load series + CALL METHOD node->get_elements_by_tag_name + EXPORTING +* depth = 0 + name = 'ser' +* namespace = '' + RECEIVING + rval = lo_collection. + CALL METHOD lo_collection->create_iterator + RECEIVING + rval = lo_iterator. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + WHILE lo_node IS BOUND. + node3 ?= node2->find_from_name( name = 'idx' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_idx = ls_prop-val. + node3 ?= node2->find_from_name( name = 'order' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_order = ls_prop-val. + node3 ?= node2->find_from_name( name = 'v' namespace = 'c' ). + IF node3 IS BOUND. + lv_sername = node3->get_value( ). + ENDIF. + node3 ?= node2->find_from_name( name = 'strRef' namespace = 'c' ). + IF node3 IS BOUND. + node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). + lv_label = node4->get_value( ). + ENDIF. + node3 ?= node2->find_from_name( name = 'numRef' namespace = 'c' ). + IF node3 IS BOUND. + node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). + lv_value = node4->get_value( ). + ENDIF. + CALL METHOD lo_piechart->create_serie + EXPORTING + ip_idx = lv_idx + ip_order = lv_order + ip_lbl = lv_label + ip_ref = lv_value + ip_sername = lv_sername. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + ENDWHILE. + + "note: numCache avoided + node2 ?= node->find_from_name( name = 'showLegendKey' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_showlegendkeyval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showVal' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_showvalval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showCatName' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_showcatnameval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showSerName' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_showsernameval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showPercent' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_showpercentval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showBubbleSize' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_showbubblesizeval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showLeaderLines' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_showleaderlinesval = ls_prop-val. + node2 ?= node->find_from_name( name = 'firstSliceAng' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_firstsliceangval = ls_prop-val. + WHEN c_graph_line. + node2 ?= node->find_from_name( name = 'grouping' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_groupingval = ls_prop-val. + node2 ?= node->find_from_name( name = 'varyColors' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_varycolorsval = ls_prop-val. + + "Load series + CALL METHOD node->get_elements_by_tag_name + EXPORTING +* depth = 0 + name = 'ser' +* namespace = '' + RECEIVING + rval = lo_collection. + CALL METHOD lo_collection->create_iterator + RECEIVING + rval = lo_iterator. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + WHILE lo_node IS BOUND. + node3 ?= node2->find_from_name( name = 'idx' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_idx = ls_prop-val. + node3 ?= node2->find_from_name( name = 'order' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_order = ls_prop-val. + node3 ?= node2->find_from_name( name = 'symbol' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_symbol = ls_prop-val. + node3 ?= node2->find_from_name( name = 'smooth' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_smooth = ls_prop-val. + node3 ?= node2->find_from_name( name = 'v' namespace = 'c' ). + IF node3 IS BOUND. + lv_sername = node3->get_value( ). + ENDIF. + node3 ?= node2->find_from_name( name = 'strRef' namespace = 'c' ). + IF node3 IS BOUND. + node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). + lv_label = node4->get_value( ). + ENDIF. + node3 ?= node2->find_from_name( name = 'numRef' namespace = 'c' ). + IF node3 IS BOUND. + node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). + lv_value = node4->get_value( ). + ENDIF. + CALL METHOD lo_linechart->create_serie + EXPORTING + ip_idx = lv_idx + ip_order = lv_order + ip_symbol = lv_symbol + ip_smooth = lv_smooth + ip_lbl = lv_label + ip_ref = lv_value + ip_sername = lv_sername. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + ENDWHILE. + "note: numCache avoided + node2 ?= node->find_from_name( name = 'showLegendKey' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_showlegendkeyval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showVal' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_showvalval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showCatName' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_showcatnameval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showSerName' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_showsernameval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showPercent' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_showpercentval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showBubbleSize' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_showbubblesizeval = ls_prop-val. + + node ?= node->find_from_name( name = 'lineChart' namespace = 'c' ). + node2 ?= node->find_from_name( name = 'marker' namespace = 'c' DEPTH = '1' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->NS_MARKERVAL = ls_prop-val. + node2 ?= node->find_from_name( name = 'smooth' namespace = 'c' DEPTH = '1' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->NS_SMOOTHVAL = ls_prop-val. + node ?= ip_chart->if_ixml_node~get_first_child( ). + CHECK node IS NOT INITIAL. + + "Load axes + node2 ?= node->find_from_name( name = 'lineChart' namespace = 'c' ). + CALL METHOD node2->get_elements_by_tag_name + EXPORTING +* depth = 0 + name = 'axId' +* namespace = '' + RECEIVING + rval = lo_collection. + CALL METHOD lo_collection->create_iterator + RECEIVING + rval = lo_iterator. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + WHILE lo_node IS BOUND. + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lv_axid = ls_prop-val. + IF sy-index EQ 1. "catAx + node2 ?= node->find_from_name( name = 'catAx' namespace = 'c' ). + node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_orientation = ls_prop-val. + node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_delete = ls_prop-val. + node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_axpos = ls_prop-val. +* node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). +* zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). +* lv_formatcode = ls_prop-formatcode. +* lv_sourcelinked = ls_prop-sourcelinked. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_majortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_minortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_ticklblpos = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crossax = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crosses = ls_prop-val. + node3 ?= node2->find_from_name( name = 'auto' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_auto = ls_prop-val. + node3 ?= node2->find_from_name( name = 'lblAlgn' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_lblalgn = ls_prop-val. + node3 ?= node2->find_from_name( name = 'lblOffset' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_lbloffset = ls_prop-val. + node3 ?= node2->find_from_name( name = 'noMultiLvlLbl' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_nomultilvllbl = ls_prop-val. + CALL METHOD lo_linechart->create_ax + EXPORTING + ip_axid = lv_axid + ip_type = zcl_excel_graph_line=>c_catax + ip_orientation = lv_orientation + ip_delete = lv_delete + ip_axpos = lv_axpos + ip_formatcode = lv_formatcode + ip_sourcelinked = lv_sourcelinked + ip_majortickmark = lv_majortickmark + ip_minortickmark = lv_minortickmark + ip_ticklblpos = lv_ticklblpos + ip_crossax = lv_crossax + ip_crosses = lv_crosses + ip_auto = lv_auto + ip_lblalgn = lv_lblalgn + ip_lbloffset = lv_lbloffset + ip_nomultilvllbl = lv_nomultilvllbl. + ELSEIF sy-index EQ 2. "valAx + node2 ?= node->find_from_name( name = 'valAx' namespace = 'c' ). + node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_orientation = ls_prop-val. + node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_delete = ls_prop-val. + node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_axpos = ls_prop-val. + node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_formatcode = ls_prop-formatcode. + lv_sourcelinked = ls_prop-sourcelinked. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_majortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_minortickmark = ls_prop-val. + node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_ticklblpos = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crossax = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crosses = ls_prop-val. + node3 ?= node2->find_from_name( name = 'crossBetween' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). + lv_crossbetween = ls_prop-val. + CALL METHOD lo_linechart->create_ax + EXPORTING + ip_axid = lv_axid + ip_type = zcl_excel_graph_line=>c_valax + ip_orientation = lv_orientation + ip_delete = lv_delete + ip_axpos = lv_axpos + ip_formatcode = lv_formatcode + ip_sourcelinked = lv_sourcelinked + ip_majortickmark = lv_majortickmark + ip_minortickmark = lv_minortickmark + ip_ticklblpos = lv_ticklblpos + ip_crossax = lv_crossax + ip_crosses = lv_crosses + ip_crossbetween = lv_crossbetween. + ENDIF. + lo_node = lo_iterator->get_next( ). + IF lo_node IS BOUND. + node2 ?= lo_node->query_interface( ixml_iid_element ). + ENDIF. + ENDWHILE. + WHEN OTHERS. + ENDCASE. + + "legend + CASE me->graph_type. + WHEN c_graph_bars. + node2 ?= node->find_from_name( name = 'legendPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_legendposval = ls_prop-val. + node2 ?= node->find_from_name( name = 'overlay' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_barchart->ns_overlayval = ls_prop-val. + WHEN c_graph_line. + node2 ?= node->find_from_name( name = 'legendPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_legendposval = ls_prop-val. + node2 ?= node->find_from_name( name = 'overlay' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_linechart->ns_overlayval = ls_prop-val. + WHEN c_graph_pie. + node2 ?= node->find_from_name( name = 'legendPos' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_legendposval = ls_prop-val. + node2 ?= node->find_from_name( name = 'overlay' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_overlayval = ls_prop-val. + node2 ?= node->find_from_name( name = 'pPr' namespace = 'a' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_pprrtl = ls_prop-rtl. + node2 ?= node->find_from_name( name = 'endParaRPr' namespace = 'a' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + lo_piechart->ns_endpararprlang = ls_prop-lang. + + WHEN OTHERS. + ENDCASE. + + node2 ?= node->find_from_name( name = 'plotVisOnly' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_plotvisonlyval = ls_prop-val. + node2 ?= node->find_from_name( name = 'dispBlanksAs' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_dispblanksasval = ls_prop-val. + node2 ?= node->find_from_name( name = 'showDLblsOverMax' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). + me->graph->ns_showdlblsovermaxval = ls_prop-val. + "--------------------- + + node2 ?= node->find_from_name( name = 'pageMargins' namespace = 'c' ). + zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_pagemargins ). + me->graph->pagemargins = ls_pagemargins. + + + endmethod. + + + + + + method PIXEL2EMU. +* suppose 96 DPI + IF ip_dpi IS SUPPLIED. + r_emu = ip_pixel * 914400 / ip_dpi. + ELSE. +* suppose 96 DPI + r_emu = ip_pixel * 914400 / 96. + ENDIF. + endmethod. + + + + + + + method SET_MEDIA. + IF ip_media IS SUPPLIED. + media = ip_media. + ENDIF. + media_type = ip_media_type. + media_source = c_media_source_xstring. + IF ip_width IS SUPPLIED. + size-width = ip_width. + ENDIF. + IF ip_height IS SUPPLIED. + size-height = ip_height. + ENDIF. + endmethod. + + + + + + METHOD set_media_mime. + + DATA: lv_language TYPE sylangu. + + io = ip_io. + media_source = c_media_source_mime. + size-width = ip_width. + size-height = ip_height. + + lv_language = sy-langu. + cl_wb_mime_repository=>load_mime( EXPORTING + io = ip_io + IMPORTING + filename = media_name + "mimetype = media_type + CHANGING + language = lv_language ). + + SPLIT media_name AT '.' INTO media_name media_type. + +ENDMETHOD. + + + + + + method SET_MEDIA_WWW. + DATA: lv_value(20). + + media_key_www = ip_key. + media_source = c_media_source_www. + + CALL FUNCTION 'WWWPARAMS_READ' + EXPORTING + relid = media_key_www-relid + objid = media_key_www-objid + name = 'fileextension' + IMPORTING + value = lv_value. + media_type = lv_value. + SHIFT media_type LEFT DELETING LEADING '.'. + + size-width = ip_width. + size-height = ip_height. + endmethod. + + + + + + + method SET_POSITION. + from_loc-col = zcl_excel_common=>convert_column2int( ip_from_col ) - 1. + IF ip_coloff IS SUPPLIED. + from_loc-col_offset = ip_coloff. + ENDIF. + from_loc-row = ip_from_row - 1. + IF ip_rowoff IS SUPPLIED. + from_loc-row_offset = ip_rowoff. + ENDIF. + anchor = anchor_one_cell. + endmethod. + + + + + + method SET_POSITION2. + + data: lv_anchor type zexcel_drawing_anchor. + lv_anchor = ip_anchor. + + IF lv_anchor IS INITIAL. + IF ip_to IS NOT INITIAL. + lv_anchor = anchor_two_cell. + ELSE. + lv_anchor = anchor_one_cell. + ENDIF. + ENDIF. + + CASE lv_anchor. + WHEN anchor_absolute OR anchor_one_cell. + CLEAR: me->to_loc. + WHEN anchor_two_cell. + CLEAR: me->size. + ENDCASE. + + me->from_loc = ip_from. + me->to_loc = ip_to. + me->anchor = lv_anchor. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + method ADD. + DATA: lv_index TYPE i. + + drawings->add( ip_drawing ). + lv_index = drawings->if_object_collection~size( ). + ip_drawing->create_media_name( + ip_index = lv_index ). + endmethod. + + + method CLEAR. + + drawings->clear( ). + endmethod. + + + + method CONSTRUCTOR. + + CREATE OBJECT drawings. + type = ip_type. + + endmethod. + + + + + method GET. + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_drawing ?= drawings->if_object_collection~get( lv_index ). + endmethod. + + + + method GET_ITERATOR. + + eo_iterator ?= drawings->if_object_collection~get_iterator( ). + endmethod. + + + + method GET_TYPE. + rp_type = me->type. + endmethod. + + + + method INCLUDE. + drawings->add( ip_drawing ). + endmethod. + + + + method IS_EMPTY. + + is_empty = drawings->if_object_collection~is_empty( ). + endmethod. + + + + method REMOVE. + + drawings->remove( ip_drawing ). + endmethod. + + + + method SIZE. + + ep_size = drawings->if_object_collection~size( ). + endmethod. + + + + + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + "Load default values + me->pagemargins-b = '0.75'. + me->pagemargins-l = '0.7'. + me->pagemargins-r = '0.7'. + me->pagemargins-t = '0.75'. + me->pagemargins-header = '0.3'. + me->pagemargins-footer = '0.3'. + endmethod. + + + + + + + + + + + + + + + + + + + + method CREATE_SERIE. + DATA ls_serie TYPE s_series. + + DATA: lv_start_row_c TYPE char7, + lv_stop_row_c TYPE char7. + + + IF ip_lbl IS NOT SUPPLIED. + lv_stop_row_c = ip_lbl_to_row. + SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. + SHIFT lv_stop_row_c LEFT DELETING LEADING space. + lv_start_row_c = ip_lbl_from_row. + SHIFT lv_start_row_c RIGHT DELETING TRAILING space. + SHIFT lv_start_row_c LEFT DELETING LEADING space. + ls_serie-lbl = ip_sheet. + ls_serie-lbl = zcl_excel_common=>escape_string( ip_value = ls_serie-lbl ). + CONCATENATE ls_serie-lbl '!$' ip_lbl_from_col '$' lv_start_row_c ':$' ip_lbl_to_col '$' lv_stop_row_c INTO ls_serie-lbl. + CLEAR: lv_start_row_c, lv_stop_row_c. + ELSE. + ls_serie-lbl = ip_lbl. + ENDIF. + IF ip_ref IS NOT SUPPLIED. + lv_stop_row_c = ip_ref_to_row. + SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. + SHIFT lv_stop_row_c LEFT DELETING LEADING space. + lv_start_row_c = ip_ref_from_row. + SHIFT lv_start_row_c RIGHT DELETING TRAILING space. + SHIFT lv_start_row_c LEFT DELETING LEADING space. + ls_serie-ref = ip_sheet. + ls_serie-ref = zcl_excel_common=>escape_string( ip_value = ls_serie-ref ). + CONCATENATE ls_serie-ref '!$' ip_ref_from_col '$' lv_start_row_c ':$' ip_ref_to_col '$' lv_stop_row_c INTO ls_serie-ref. + CLEAR: lv_start_row_c, lv_stop_row_c. + ELSE. + ls_serie-ref = ip_ref. + ENDIF. + ls_serie-idx = ip_idx. + ls_serie-order = ip_order. + ls_serie-invertifnegative = ip_invertifnegative. + ls_serie-symbol = ip_symbol. + ls_serie-smooth = ip_smooth. + ls_serie-sername = ip_sername. + APPEND ls_serie TO me->series. + SORT me->series BY order ASCENDING. + endmethod. + + + + method SET_PRINT_LBL. + me->print_label = ip_value. + endmethod. + + + + method SET_STYLE. + me->ns_c14styleval = ip_style-c14style. + CONDENSE me->ns_c14styleval NO-GAPS. + me->ns_styleval = ip_style-cstyle. + CONDENSE me->ns_styleval NO-GAPS. + endmethod. + + + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CREATE_AX. + DATA ls_ax TYPE s_ax. + ls_ax-type = ip_type. + + if ip_type = c_catax. + if ip_axid is SUPPLIED. + ls_ax-axid = ip_axid. + else. + ls_ax-axid = '1'. + endif. + if ip_orientation is SUPPLIED. + ls_ax-orientation = ip_orientation. + else. + ls_ax-orientation = 'minMax'. + endif. + if ip_delete is SUPPLIED. + ls_ax-delete = ip_delete. + else. + ls_ax-delete = '0'. + endif. + if ip_axpos is SUPPLIED. + ls_ax-axpos = ip_axpos. + else. + ls_ax-axpos = 'b'. + endif. + if ip_formatcode is SUPPLIED. + ls_ax-formatcode = ip_formatcode. + else. + ls_ax-formatcode = 'General'. + endif. + if ip_sourcelinked is SUPPLIED. + ls_ax-sourcelinked = ip_sourcelinked. + else. + ls_ax-sourcelinked = '1'. + endif. + if ip_majorTickMark is SUPPLIED. + ls_ax-majorTickMark = ip_majorTickMark. + else. + ls_ax-majorTickMark = 'out'. + endif. + if ip_minorTickMark is SUPPLIED. + ls_ax-minorTickMark = ip_minorTickMark. + else. + ls_ax-minorTickMark = 'none'. + endif. + if ip_ticklblpos is SUPPLIED. + ls_ax-ticklblpos = ip_ticklblpos. + else. + ls_ax-ticklblpos = 'nextTo'. + endif. + if ip_crossax is SUPPLIED. + ls_ax-crossax = ip_crossax. + else. + ls_ax-crossax = '2'. + endif. + if ip_crosses is SUPPLIED. + ls_ax-crosses = ip_crosses. + else. + ls_ax-crosses = 'autoZero'. + endif. + if ip_auto is SUPPLIED. + ls_ax-auto = ip_auto. + else. + ls_ax-auto = '1'. + endif. + if ip_lblAlgn is SUPPLIED. + ls_ax-lblAlgn = ip_lblAlgn. + else. + ls_ax-lblAlgn = 'ctr'. + endif. + if ip_lblOffset is SUPPLIED. + ls_ax-lblOffset = ip_lblOffset. + else. + ls_ax-lblOffset = '100'. + endif. + if ip_noMultiLvlLbl is SUPPLIED. + ls_ax-noMultiLvlLbl = ip_noMultiLvlLbl. + else. + ls_ax-noMultiLvlLbl = '0'. + endif. + elseif ip_type = c_valax. + if ip_axid is SUPPLIED. + ls_ax-axid = ip_axid. + else. + ls_ax-axid = '2'. + endif. + if ip_orientation is SUPPLIED. + ls_ax-orientation = ip_orientation. + else. + ls_ax-orientation = 'minMax'. + endif. + if ip_delete is SUPPLIED. + ls_ax-delete = ip_delete. + else. + ls_ax-delete = '0'. + endif. + if ip_axpos is SUPPLIED. + ls_ax-axpos = ip_axpos. + else. + ls_ax-axpos = 'l'. + endif. + if ip_formatcode is SUPPLIED. + ls_ax-formatcode = ip_formatcode. + else. + ls_ax-formatcode = 'General'. + endif. + if ip_sourcelinked is SUPPLIED. + ls_ax-sourcelinked = ip_sourcelinked. + else. + ls_ax-sourcelinked = '1'. + endif. + if ip_majorTickMark is SUPPLIED. + ls_ax-majorTickMark = ip_majorTickMark. + else. + ls_ax-majorTickMark = 'out'. + endif. + if ip_minorTickMark is SUPPLIED. + ls_ax-minorTickMark = ip_minorTickMark. + else. + ls_ax-minorTickMark = 'none'. + endif. + if ip_ticklblpos is SUPPLIED. + ls_ax-ticklblpos = ip_ticklblpos. + else. + ls_ax-ticklblpos = 'nextTo'. + endif. + if ip_crossax is SUPPLIED. + ls_ax-crossax = ip_crossax. + else. + ls_ax-crossax = '1'. + endif. + if ip_crosses is SUPPLIED. + ls_ax-crosses = ip_crosses. + else. + ls_ax-crosses = 'autoZero'. + endif. + if ip_crossBetween is SUPPLIED. + ls_ax-crossBetween = ip_crossBetween. + else. + ls_ax-crossBetween = 'between'. + endif. + endif. + + APPEND ls_ax TO me->axes. + sort me->axes by axid ascending. + endmethod. + + + + method SET_SHOW_CAT_NAME. + ns_showcatnameval = ip_value. + endmethod. + + + + method SET_SHOW_LEGEND_KEY. + ns_showlegendkeyval = ip_value. + endmethod. + + + + method SET_SHOW_PERCENT. + ns_showpercentval = ip_value. + endmethod. + + + + method SET_SHOW_SER_NAME. + ns_showsernameval = ip_value. + endmethod. + + + + method SET_SHOW_VALUES. + ns_showvalval = ip_value. + endmethod. + + + + method SET_VARYCOLOR. + ns_varycolorsval = ip_value. + endmethod. + + + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CREATE_AX. + DATA ls_ax TYPE s_ax. + ls_ax-type = ip_type. + + IF ip_type = c_catax. + IF ip_axid IS SUPPLIED. + ls_ax-axid = ip_axid. + ELSE. + ls_ax-axid = '1'. + ENDIF. + IF ip_orientation IS SUPPLIED. + ls_ax-orientation = ip_orientation. + ELSE. + ls_ax-orientation = 'minMax'. + ENDIF. + IF ip_delete IS SUPPLIED. + ls_ax-delete = ip_delete. + ELSE. + ls_ax-delete = '0'. + ENDIF. + IF ip_axpos IS SUPPLIED. + ls_ax-axpos = ip_axpos. + ELSE. + ls_ax-axpos = 'b'. + ENDIF. + IF ip_formatcode IS SUPPLIED. + ls_ax-formatcode = ip_formatcode. + ELSE. + ls_ax-formatcode = 'General'. + ENDIF. + IF ip_sourcelinked IS SUPPLIED. + ls_ax-sourcelinked = ip_sourcelinked. + ELSE. + ls_ax-sourcelinked = '1'. + ENDIF. + IF ip_majortickmark IS SUPPLIED. + ls_ax-majortickmark = ip_majortickmark. + ELSE. + ls_ax-majortickmark = 'out'. + ENDIF. + IF ip_minortickmark IS SUPPLIED. + ls_ax-minortickmark = ip_minortickmark. + ELSE. + ls_ax-minortickmark = 'none'. + ENDIF. + IF ip_ticklblpos IS SUPPLIED. + ls_ax-ticklblpos = ip_ticklblpos. + ELSE. + ls_ax-ticklblpos = 'nextTo'. + ENDIF. + IF ip_crossax IS SUPPLIED. + ls_ax-crossax = ip_crossax. + ELSE. + ls_ax-crossax = '2'. + ENDIF. + IF ip_crosses IS SUPPLIED. + ls_ax-crosses = ip_crosses. + ELSE. + ls_ax-crosses = 'autoZero'. + ENDIF. + IF ip_auto IS SUPPLIED. + ls_ax-auto = ip_auto. + ELSE. + ls_ax-auto = '1'. + ENDIF. + IF ip_lblalgn IS SUPPLIED. + ls_ax-lblalgn = ip_lblalgn. + ELSE. + ls_ax-lblalgn = 'ctr'. + ENDIF. + IF ip_lbloffset IS SUPPLIED. + ls_ax-lbloffset = ip_lbloffset. + ELSE. + ls_ax-lbloffset = '100'. + ENDIF. + IF ip_nomultilvllbl IS SUPPLIED. + ls_ax-nomultilvllbl = ip_nomultilvllbl. + ELSE. + ls_ax-nomultilvllbl = '0'. + ENDIF. + ELSEIF ip_type = c_valax. + IF ip_axid IS SUPPLIED. + ls_ax-axid = ip_axid. + ELSE. + ls_ax-axid = '2'. + ENDIF. + IF ip_orientation IS SUPPLIED. + ls_ax-orientation = ip_orientation. + ELSE. + ls_ax-orientation = 'minMax'. + ENDIF. + IF ip_delete IS SUPPLIED. + ls_ax-delete = ip_delete. + ELSE. + ls_ax-delete = '0'. + ENDIF. + IF ip_axpos IS SUPPLIED. + ls_ax-axpos = ip_axpos. + ELSE. + ls_ax-axpos = 'l'. + ENDIF. + IF ip_formatcode IS SUPPLIED. + ls_ax-formatcode = ip_formatcode. + ELSE. + ls_ax-formatcode = 'General'. + ENDIF. + IF ip_sourcelinked IS SUPPLIED. + ls_ax-sourcelinked = ip_sourcelinked. + ELSE. + ls_ax-sourcelinked = '1'. + ENDIF. + IF ip_majortickmark IS SUPPLIED. + ls_ax-majortickmark = ip_majortickmark. + ELSE. + ls_ax-majortickmark = 'out'. + ENDIF. + IF ip_minortickmark IS SUPPLIED. + ls_ax-minortickmark = ip_minortickmark. + ELSE. + ls_ax-minortickmark = 'none'. + ENDIF. + IF ip_ticklblpos IS SUPPLIED. + ls_ax-ticklblpos = ip_ticklblpos. + ELSE. + ls_ax-ticklblpos = 'nextTo'. + ENDIF. + IF ip_crossax IS SUPPLIED. + ls_ax-crossax = ip_crossax. + ELSE. + ls_ax-crossax = '1'. + ENDIF. + IF ip_crosses IS SUPPLIED. + ls_ax-crosses = ip_crosses. + ELSE. + ls_ax-crosses = 'autoZero'. + ENDIF. + IF ip_crossbetween IS SUPPLIED. + ls_ax-crossbetween = ip_crossbetween. + ELSE. + ls_ax-crossbetween = 'between'. + ENDIF. + ENDIF. + + APPEND ls_ax TO me->axes. + SORT me->axes BY axid ASCENDING. + endmethod. + + + + method SET_SHOW_CAT_NAME. + ns_showcatnameval = ip_value. + endmethod. + + + + method SET_SHOW_LEGEND_KEY. + ns_showlegendkeyval = ip_value. + endmethod. + + + + method SET_SHOW_PERCENT. + ns_showpercentval = ip_value. + endmethod. + + + + method SET_SHOW_SER_NAME. + ns_showsernameval = ip_value. + endmethod. + + + + method SET_SHOW_VALUES. + ns_showvalval = ip_value. + endmethod. + + + + method SET_VARYCOLOR. + ns_varycolorsval = ip_value. + endmethod. + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + method SET_SHOW_CAT_NAME. + ns_showcatnameval = ip_value. + endmethod. + + + + method SET_SHOW_LEADER_LINES. + ns_showleaderlinesval = ip_value. + endmethod. + + + + method SET_SHOW_LEGEND_KEY. + ns_showlegendkeyval = ip_value. + endmethod. + + + + method SET_SHOW_PERCENT. + ns_showpercentval = ip_value. + endmethod. + + + + method SET_SHOW_SER_NAME. + ns_showsernameval = ip_value. + endmethod. + + + + method SET_SHOW_VALUES. + ns_showvalval = ip_value. + endmethod. + + + + method SET_VARYCOLOR. + ns_varycolorsval = ip_value. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + method CREATE. + data: lo_hyperlink type REF TO zcl_excel_hyperlink. + + create OBJECT lo_hyperlink. + + lo_hyperlink->location = iv_url. + lo_hyperlink->internal = iv_internal. + + ov_link = lo_hyperlink. + endmethod. + + + + + method CREATE_EXTERNAL_LINK. + + ov_link = zcl_excel_hyperlink=>create( iv_url = iv_url + iv_internal = abap_false ). + endmethod. + + + + + method CREATE_INTERNAL_LINK. + ov_link = zcl_excel_hyperlink=>create( iv_url = iv_location + iv_internal = abap_true ). + endmethod. + + + + method GET_REF. + ev_ref = row. + CONDENSE ev_ref. + CONCATENATE column ev_ref INTO ev_ref. + endmethod. + + + + method GET_URL. + ev_url = me->location. + endmethod. + + + + method IS_INTERNAL. + ev_ret = me->internal. + endmethod. + + + + + + method SET_CELL_REFERENCE. + me->column = zcl_excel_common=>convert_column2alpha( ip_column ). " issue #155 - less restrictive typing for ip_column + me->row = ip_row. + endmethod. + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + method CONSTRUCTOR. + " default Excel palette based on + " http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.indexedcolors.aspx + + APPEND '00000000' TO colors. + APPEND '00FFFFFF' TO colors. + APPEND '00FF0000' TO colors. + APPEND '0000FF00' TO colors. + APPEND '000000FF' TO colors. + APPEND '00FFFF00' TO colors. + APPEND '00FF00FF' TO colors. + APPEND '0000FFFF' TO colors. + APPEND '00000000' TO colors. + APPEND '00FFFFFF' TO colors. + + APPEND '00FF0000' TO colors. + APPEND '0000FF00' TO colors. + APPEND '000000FF' TO colors. + APPEND '00FFFF00' TO colors. + APPEND '00FF00FF' TO colors. + APPEND '0000FFFF' TO colors. + APPEND '00800000' TO colors. + APPEND '00008000' TO colors. + APPEND '00000080' TO colors. + APPEND '00808000' TO colors. + + APPEND '00800080' TO colors. + APPEND '00008080' TO colors. + APPEND '00C0C0C0' TO colors. + APPEND '00808080' TO colors. + APPEND '009999FF' TO colors. + APPEND '00993366' TO colors. + APPEND '00FFFFCC' TO colors. + APPEND '00CCFFFF' TO colors. + APPEND '00660066' TO colors. + APPEND '00FF8080' TO colors. + + APPEND '000066CC' TO colors. + APPEND '00CCCCFF' TO colors. + APPEND '00000080' TO colors. + APPEND '00FF00FF' TO colors. + APPEND '00FFFF00' TO colors. + APPEND '0000FFFF' TO colors. + APPEND '00800080' TO colors. + APPEND '00800000' TO colors. + APPEND '00008080' TO colors. + APPEND '000000FF' TO colors. + + APPEND '0000CCFF' TO colors. + APPEND '00CCFFFF' TO colors. + APPEND '00CCFFCC' TO colors. + APPEND '00FFFF99' TO colors. + APPEND '0099CCFF' TO colors. + APPEND '00FF99CC' TO colors. + APPEND '00CC99FF' TO colors. + APPEND '00FFCC99' TO colors. + APPEND '003366FF' TO colors. + APPEND '0033CCCC' TO colors. + + APPEND '0099CC00' TO colors. + APPEND '00FFCC00' TO colors. + APPEND '00FF9900' TO colors. + APPEND '00FF6600' TO colors. + APPEND '00666699' TO colors. + APPEND '00969696' TO colors. + APPEND '00003366' TO colors. + APPEND '00339966' TO colors. + APPEND '00003300' TO colors. + APPEND '00333300' TO colors. + + APPEND '00993300' TO colors. + APPEND '00993366' TO colors. + APPEND '00333399' TO colors. + APPEND '00333333' TO colors. + + endmethod. + + + + + + method GET_COLOR. + DATA: lv_index type i. + + lv_index = ip_index + 1. + READ TABLE colors INTO ep_color INDEX lv_index. + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid color index'. + ENDIF. + endmethod. + + + + method GET_COLORS. + ep_colors = colors. + endmethod. + + + + method IS_MODIFIED. + ep_modified = modified. + endmethod. + + + + + method SET_COLOR. + DATA: lv_index TYPE i. + + FIELD-SYMBOLS: <lv_color> LIKE LINE OF colors. + + lv_index = ip_index + 1. + READ TABLE colors ASSIGNING <lv_color> INDEX lv_index. + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid color index'. + ENDIF. + + IF <lv_color> <> ip_color. + modified = abap_true. + <lv_color> = ip_color. + ENDIF. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + method GET_GUID. + + ep_guid = me->guid. + + endmethod. + + + + method GET_VALUE. + + ep_value = me->value. + + endmethod. + + + + method SET_RANGE_VALUE. + me->value = ip_value. + endmethod. + + + + + + + + method SET_VALUE. + DATA: lv_start_row_c TYPE char7, + lv_stop_row_c TYPE char7, + lv_value TYPE string. + lv_stop_row_c = ip_stop_row. + SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. + SHIFT lv_stop_row_c LEFT DELETING LEADING space. + lv_start_row_c = ip_start_row. + SHIFT lv_start_row_c RIGHT DELETING TRAILING space. + SHIFT lv_start_row_c LEFT DELETING LEADING space. + lv_value = ip_sheet_name. + me->value = zcl_excel_common=>escape_string( ip_value = lv_value ). + + CONCATENATE me->value '!$' ip_start_column '$' lv_start_row_c ':$' ip_stop_column '$' lv_stop_row_c INTO me->value. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + ranges->add( ip_range ). + endmethod. + + + method CLEAR. + ranges->clear( ). + endmethod. + + + method CONSTRUCTOR. + + + CREATE OBJECT ranges. + + endmethod. + + + + + method GET. + eo_range ?= ranges->if_object_collection~get( ip_index ). + endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= ranges->if_object_collection~get_iterator( ). + endmethod. + + + + method IS_EMPTY. + is_empty = ranges->if_object_collection~is_empty( ). + endmethod. + + + + method REMOVE. + ranges->remove( ip_range ). + endmethod. + + + + method SIZE. + ep_size = ranges->if_object_collection~size( ). + endmethod. + + + + + + + + + + + + + + + + + + + + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + TYPES: BEGIN OF t_relationship, + id TYPE string, + type TYPE string, + target TYPE string, + END OF t_relationship. + +* + CLASS lcl_abap_zip_archive DEFINITION + INHERITING FROM lcl_zip_archive + CREATE PRIVATE. + PUBLIC SECTION. + CLASS-METHODS create + IMPORTING i_data TYPE xstring + RETURNING value(r_zip) TYPE REF TO lcl_zip_archive + RAISING zcx_excel. + METHODS read REDEFINITION. + PRIVATE SECTION. + DATA: abap_zip TYPE REF TO cl_abap_zip. + METHODS constructor IMPORTING i_data TYPE xstring + RAISING zcx_excel. + ENDCLASS. "lcl_abap_zip_archive DEFINITION + +* + CLASS lcl_alternate_zip_archive DEFINITION + INHERITING FROM lcl_zip_archive + CREATE PRIVATE. + PUBLIC SECTION. + CLASS-METHODS create + IMPORTING i_data TYPE xstring + i_alternate_zip_class TYPE seoclsname + RETURNING value(r_zip) TYPE REF TO lcl_zip_archive + RAISING zcx_excel. + METHODS read REDEFINITION. + PRIVATE SECTION. + DATA: alternate_zip TYPE REF TO object. + METHODS constructor + IMPORTING i_data TYPE xstring + i_alternate_zip_class TYPE seoclsname + RAISING zcx_excel. + ENDCLASS. "lcl_alternate_zip_archive DEFINITION + +* + CLASS lcl_abap_zip_archive IMPLEMENTATION. + METHOD create. + CREATE OBJECT r_zip TYPE lcl_abap_zip_archive + EXPORTING + i_data = i_data. + ENDMETHOD. "create + METHOD constructor. + DATA: lv_errormessage TYPE string. + super->constructor( ). + CREATE OBJECT abap_zip. + abap_zip->load( + EXPORTING + zip = i_data + EXCEPTIONS + zip_parse_error = 1 + OTHERS = 2 ). + IF sy-subrc <> 0. + lv_errormessage = 'ZIP parse error'(002). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + ENDMETHOD. "constructor + METHOD read. + DATA: lv_errormessage TYPE string. + CALL METHOD abap_zip->get + EXPORTING + name = i_filename + IMPORTING + content = r_content + EXCEPTIONS + zip_index_error = 1 + zip_decompression_error = 2 + OTHERS = 3. + IF sy-subrc <> 0. + lv_errormessage = 'File not found in zip-archive'(003). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + ENDMETHOD. "read + ENDCLASS. "lcl_abap_zip_archive IMPLEMENTATION + +* + CLASS lcl_alternate_zip_archive IMPLEMENTATION. + METHOD create. + CREATE OBJECT r_zip TYPE lcl_alternate_zip_archive + EXPORTING + i_alternate_zip_class = i_alternate_zip_class + i_data = i_data. + ENDMETHOD. "create + METHOD constructor. + DATA: lv_errormessage TYPE string. + super->constructor( ). + CREATE OBJECT alternate_zip TYPE (i_alternate_zip_class). + TRY. + CALL METHOD alternate_zip->('LOAD') + EXPORTING + zip = i_data + EXCEPTIONS + zip_parse_error = 1 + OTHERS = 2. + CATCH cx_sy_dyn_call_illegal_method. + lv_errormessage = 'Method LOAD missing in alternative zipclass'. "#EC NOTEXT This is a workaround until class CL_ABAP_ZIP is fixed + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDTRY. + + IF sy-subrc <> 0. + lv_errormessage = 'ZIP parse error'(002). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + ENDMETHOD. "constructor + METHOD read. + DATA: lv_errormessage TYPE string. + TRY. + CALL METHOD alternate_zip->('GET') + EXPORTING + name = i_filename + IMPORTING + content = r_content " Contents + EXCEPTIONS + zip_index_error = 1 + zip_decompression_error = 2 + OTHERS = 3. + CATCH cx_sy_dyn_call_illegal_method. + lv_errormessage = 'Method GET missing in alternative zipclass'. "#EC NOTEXT This is a workaround until class CL_ABAP_ZIP is fixed + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDTRY. + IF sy-subrc <> 0. + lv_errormessage = 'File not found in zip-archive'(003). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + ENDMETHOD. "read + ENDCLASS. "lcl_alternate_zip_archive IMPLEMENTATION + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + +* +class lcl_zip_archive definition abstract. + public section. + methods read abstract + importing i_filename type csequence + returning value(r_content) type xstring " Remember copy-on-write! + raising zcx_excel. +endclass. + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + IXML + + + + + + METHOD zif_excel_reader~load. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 Map Document Properties to ZCL_EXCEL +*--------------------------------------------------------------------* + + CONSTANTS: lcv_core_properties TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lcv_office_document TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument'. + + DATA: lo_rels TYPE REF TO if_ixml_document, + lo_node TYPE REF TO if_ixml_element, + ls_relationship TYPE t_relationship. + +*--------------------------------------------------------------------* +* §1 Create EXCEL-Object we want to return to caller + +* §2 We need to read the the file "\\_rels\.rels" because it tells +* us where in this folder structure the data for the workbook +* is located in the xlsx zip-archive +* +* The xlsx Zip-archive has generally the following folder structure: +* <root> | +* |--> _rels +* |--> doc_Props +* |--> xl | +* |--> _rels +* |--> theme +* |--> worksheets + +* §3 Extracting from this the path&file where the workbook is located +* Following is an example how this file could be set up +* <?xml version="1.0" encoding="UTF-8" standalone="true"?> +* <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> +* <Relationship Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Id="rId3"/> +* <Relationship Target="docProps/core.xml" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Id="rId2"/> +* <Relationship Target="xl/workbook.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Id="rId1"/> +* </Relationships> +*--------------------------------------------------------------------* + + +*--------------------------------------------------------------------* +* §1 Create EXCEL-Object we want to return to caller +*--------------------------------------------------------------------* + IF iv_zcl_excel_classname IS INITIAL. + CREATE OBJECT r_excel. + ELSE. + CREATE OBJECT r_excel TYPE (iv_zcl_excel_classname). + ENDIF. + + zip = create_zip_archive( i_xlsx_binary = i_excel2007 + i_use_alternate_zip = i_use_alternate_zip ). + +*--------------------------------------------------------------------* +* §2 Get file in folderstructure +*--------------------------------------------------------------------* + lo_rels = get_ixml_from_zip_archive( '_rels/.rels' ). + +*--------------------------------------------------------------------* +* §3 Cycle through the Relationship Tags and use the ones we need +*--------------------------------------------------------------------* + lo_node ?= lo_rels->find_from_name( 'Relationship' ). "#EC NOTEXT + WHILE lo_node IS BOUND. + + fill_struct_from_attributes( EXPORTING + ip_element = lo_node + CHANGING + cp_structure = ls_relationship ). + CASE ls_relationship-type. + + WHEN lcv_office_document. +*--------------------------------------------------------------------* +* Parse workbook - main part here +*--------------------------------------------------------------------* + load_workbook( iv_workbook_full_filename = ls_relationship-target + io_excel = r_excel ). + + WHEN lcv_core_properties. + " 2do§1 Map Document Properties to ZCL_EXCEL + + WHEN OTHERS. + + ENDCASE. + lo_node ?= lo_node->get_next( ). + + ENDWHILE. + + +ENDMETHOD. + + + METHOD zif_excel_reader~load_file. + + DATA: lv_excel_data TYPE xstring. + +*--------------------------------------------------------------------* +* Read file into binary string +*--------------------------------------------------------------------* + IF i_from_applserver = abap_true. + lv_excel_data = read_from_applserver( i_filename ). + ELSE. + lv_excel_data = read_from_local_file( i_filename ). + ENDIF. + +*--------------------------------------------------------------------* +* Parse Excel data into ZCL_EXCEL object from binary string +*--------------------------------------------------------------------* + r_excel = zif_excel_reader~load( i_excel2007 = lv_excel_data + i_use_alternate_zip = i_use_alternate_zip + iv_zcl_excel_classname = iv_zcl_excel_classname ). + +ENDMETHOD. + + + + + + + METHOD create_zip_archive. + CASE i_use_alternate_zip. + WHEN space. + e_zip = lcl_abap_zip_archive=>create( i_xlsx_binary ). + WHEN OTHERS. + e_zip = lcl_alternate_zip_archive=>create( i_data = i_xlsx_binary + i_alternate_zip_class = i_use_alternate_zip ). + ENDCASE. +ENDMETHOD. + + + + + METHOD fill_row_outlines. + + TYPES: BEGIN OF lts_row_data, + row TYPE i, + outline_level TYPE i, + END OF lts_row_data, + ltt_row_data TYPE SORTED TABLE OF lts_row_data WITH UNIQUE KEY row. + + DATA: lt_row_dimensions TYPE zexcel_t_worksheet_rowdimensio, + + lt_row_data TYPE ltt_row_data, + ls_row_data LIKE LINE OF lt_row_data, + lt_collapse_rows TYPE HASHED TABLE OF i WITH UNIQUE KEY table_line, + + lv_collapsed TYPE abap_bool, + + lv_outline_level TYPE i, + lv_next_consecutive_row TYPE i, + lt_outline_rows TYPE zcl_excel_worksheet=>mty_ts_outlines_row, + ls_outline_row LIKE LINE OF lt_outline_rows, + + lv_row_offset TYPE i, + lv_row_collapse_flag TYPE i. + + + FIELD-SYMBOLS: <ls_row_dimension> LIKE LINE OF lt_row_dimensions, + <ls_row_data> LIKE LINE OF lt_row_data. + +* First collect information about outlines ( outline leven and collapsed state ) + lt_row_dimensions = io_worksheet->get_row_dimensions( ). + LOOP AT lt_row_dimensions ASSIGNING <ls_row_dimension>. + + ls_row_data-row = <ls_row_dimension>-row. + ls_row_data-outline_level = <ls_row_dimension>-row_dimension->get_outline_level( ). + IF ls_row_data-outline_level IS NOT INITIAL. + INSERT ls_row_data INTO TABLE lt_row_data. + ENDIF. + + lv_collapsed = <ls_row_dimension>-row_dimension->get_collapsed( ). + IF lv_collapsed = abap_true. + INSERT <ls_row_dimension>-row INTO TABLE lt_collapse_rows. + ENDIF. + + ENDLOOP. + +* Now parse this information - we need consecutive rows - any gap will create a new outline + DO 7 TIMES. " max number of outlines allowed + lv_outline_level = sy-index. + CLEAR lv_next_consecutive_row. + CLEAR ls_outline_row. + LOOP AT lt_row_data ASSIGNING <ls_row_data> WHERE outline_level >= lv_outline_level. + + IF lv_next_consecutive_row <> <ls_row_data>-row " A gap --> close all open outlines + AND lv_next_consecutive_row IS NOT INITIAL. " First time in loop. + INSERT ls_outline_row INTO TABLE lt_outline_rows. + CLEAR: ls_outline_row. + ENDIF. + + IF ls_outline_row-row_from IS INITIAL. + ls_outline_row-row_from = <ls_row_data>-row. + ENDIF. + ls_outline_row-row_to = <ls_row_data>-row. + + lv_next_consecutive_row = <ls_row_data>-row + 1. + + ENDLOOP. + IF ls_outline_row-row_from IS NOT INITIAL. + INSERT ls_outline_row INTO TABLE lt_outline_rows. + ENDIF. + ENDDO. + +* lt_outline_rows holds all outline information +* we now need to determine whether the outline is collapsed or not + LOOP AT lt_outline_rows INTO ls_outline_row. + + IF io_worksheet->zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_off. + lv_row_collapse_flag = ls_outline_row-row_from - 1. + ELSE. + lv_row_collapse_flag = ls_outline_row-row_to + 1. + ENDIF. + READ TABLE lt_collapse_rows TRANSPORTING NO FIELDS WITH TABLE KEY table_line = lv_row_collapse_flag. + IF sy-subrc = 0. + ls_outline_row-collapsed = abap_true. + ENDIF. + io_worksheet->set_row_outline( iv_row_from = ls_outline_row-row_from + iv_row_to = ls_outline_row-row_to + iv_collapsed = ls_outline_row-collapsed ). + + ENDLOOP. + +* Finally purge outline information ( collapsed state, outline leve) from row_dimensions, since we want to keep these in the outline-table + LOOP AT lt_row_dimensions ASSIGNING <ls_row_dimension>. + + <ls_row_dimension>-row_dimension->set_outline_level( 0 ). + <ls_row_dimension>-row_dimension->set_collapsed( abap_false ). + + ENDLOOP. + +ENDMETHOD. + + + + + method fill_struct_from_attributes. +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-07 +* - ... +* changes: renaming variables to naming conventions +* aligning code +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* + + data: lv_name type string, + lo_attributes type ref to if_ixml_named_node_map, + lo_attribute type ref to if_ixml_attribute, + lo_iterator type ref to if_ixml_node_iterator. + + field-symbols: <component> type any. + +*--------------------------------------------------------------------* +* The values of named attributes of a tag are being read and moved into corresponding +* fields of given structure +* Behaves like move-corresonding tag to structure + +* Example: +* <Relationship Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Id="rId3"/> +* Here the attributes are Target, Type and Id. Thus if the passed +* structure has fieldnames Id and Target these would be filled with +* "rId3" and "docProps/app.xml" respectively +*--------------------------------------------------------------------* + clear cp_structure. + + lo_attributes = ip_element->get_attributes( ). + lo_iterator = lo_attributes->create_iterator( ). + lo_attribute ?= lo_iterator->get_next( ). + while lo_attribute is bound. + + lv_name = lo_attribute->get_name( ). + translate lv_name to upper case. + assign component lv_name of structure cp_structure to <component>. + if sy-subrc = 0. + <component> = lo_attribute->get_value( ). + endif. + lo_attribute ?= lo_iterator->get_next( ). + + endwhile. + + +endmethod. + + + + + + METHOD get_from_zip_archive. + + ASSERT zip IS BOUND. " zip object has to exist at this point + + r_content = zip->read( i_filename ). + +ENDMETHOD. + + + + + + + METHOD get_ixml_from_zip_archive. + + DATA: lv_content TYPE xstring, + lo_ixml TYPE REF TO if_ixml, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_istream TYPE REF TO if_ixml_istream, + lo_parser TYPE REF TO if_ixml_parser. + +*--------------------------------------------------------------------* +* Load XML file from archive into an input stream, +* and parse that stream into an ixml object +*--------------------------------------------------------------------* + lv_content = me->get_from_zip_archive( i_filename ). + lo_ixml = cl_ixml=>create( ). + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_istream = lo_streamfactory->create_istream_xstring( lv_content ). + r_ixml = lo_ixml->create_document( ). + lo_parser = lo_ixml->create_parser( stream_factory = lo_streamfactory + istream = lo_istream + document = r_ixml ). + lo_parser->set_normalizing( is_normalizing ). + lo_parser->set_validating( mode = if_ixml_parser=>co_no_validation ). + lo_parser->parse( ). + +ENDMETHOD. + + + + + + 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 'true', + lc_xml_attr_true_int TYPE string VALUE '1'. + CONSTANTS: lc_rel_chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', + lc_rel_image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'. + + 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->find_from_name( name = 'from' namespace = 'xdr' ). + CHECK node IS NOT INITIAL. + node2 ?= node->find_from_name( name = 'col' namespace = 'xdr' ). + ls_upper-col = node2->get_value( ). + node2 ?= node->find_from_name( name = 'row' namespace = 'xdr' ). + ls_upper-row = node2->get_value( ). + node2 ?= node->find_from_name( name = 'colOff' namespace = 'xdr' ). + ls_upper-col_offset = node2->get_value( ). + node2 ?= node->find_from_name( name = 'rowOff' namespace = 'xdr' ). + ls_upper-row_offset = node2->get_value( ). + + node ?= io_anchor_element->find_from_name( name = 'ext' namespace = 'xdr' ). + IF node IS INITIAL. + CLEAR ls_size. + ELSE. + me->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->find_from_name( name = 'to' namespace = 'xdr' ). + IF node IS INITIAL. + CLEAR ls_lower. + ELSE. + node2 ?= node->find_from_name( name = 'col' namespace = 'xdr' ). + ls_lower-col = node2->get_value( ). + node2 ?= node->find_from_name( name = 'row' namespace = 'xdr' ). + ls_lower-row = node2->get_value( ). + node2 ?= node->find_from_name( name = 'colOff' namespace = 'xdr' ). + ls_lower-col_offset = node2->get_value( ). + node2 ?= node->find_from_name( name = 'rowOff' namespace = 'xdr' ). + ls_lower-row_offset = node2->get_value( ). + ENDIF. + + node ?= io_anchor_element->find_from_name( name = 'pic' namespace = 'xdr' ). + IF node IS NOT INITIAL. + node2 ?= node->find_from_name( name = 'nvPicPr' namespace = 'xdr' ). + CHECK node2 IS NOT INITIAL. + node3 ?= node2->find_from_name( name = 'cNvPr' namespace = 'xdr' ). + CHECK node3 IS NOT INITIAL. + me->fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = cnvpr ). + lv_title = cnvpr-name. + + node2 ?= node->find_from_name( name = 'blipFill' namespace = 'xdr' ). + CHECK node2 IS NOT INITIAL. + node3 ?= node2->find_from_name( name = 'blip' namespace = 'a' ). + CHECK node3 IS NOT INITIAL. + me->fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = blip ). + lv_relation_id = blip-embed. + + drawing_type = zcl_excel_drawing=>type_image. + ENDIF. + + node ?= io_anchor_element->find_from_name( name = 'graphicFrame' namespace = 'xdr' ). + IF node IS NOT INITIAL. + node2 ?= node->find_from_name( name = 'nvGraphicFramePr' namespace = 'xdr' ). + CHECK node2 IS NOT INITIAL. + node3 ?= node2->find_from_name( name = 'cNvPr' namespace = 'xdr' ). + CHECK node3 IS NOT INITIAL. + me->fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = cnvpr ). + lv_title = cnvpr-name. + + node2 ?= node->find_from_name( name = 'graphic' namespace = 'a' ). + CHECK node2 IS NOT INITIAL. + node3 ?= node2->find_from_name( name = 'graphicData' namespace = 'a' ). + CHECK node3 IS NOT INITIAL. + node4 ?= node2->find_from_name( name = 'chart' namespace = 'c' ). + CHECK node4 IS NOT INITIAL. + me->fill_struct_from_attributes( EXPORTING ip_element = node4 CHANGING cp_structure = chart ). + lv_relation_id = chart-id. + + drawing_type = zcl_excel_drawing=>type_chart. + ENDIF. + + lo_drawing = io_worksheet->excel->add_new_drawing( + ip_type = drawing_type + ip_title = lv_title ). + io_worksheet->add_drawing( lo_drawing ). + + lo_drawing->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->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 ). + + if drawing_type = zcl_excel_drawing=>type_chart. + "-------------Added by Alessandro Iannacci - Should load chart attributes + lo_drawing->load_chart_attributes( rel_drawing-content_xml ). + endif. + + endmethod. + + + + + method LOAD_SHARED_STRINGS. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 Support partial formatting of strings in cells +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-11 +* - ... +* changes: renaming variables to naming conventions +* renaming variables to indicate what they are used for +* aligning code +* adding comments to explain what we are trying to achieve +* rewriting code for better readibility +*--------------------------------------------------------------------* + + + + DATA: + lo_shared_strings_xml TYPE REF TO if_ixml_document, + lo_node_si TYPE REF TO if_ixml_element, + lo_node_si_child TYPE REF TO if_ixml_element, + lo_node_r_child_t TYPE REF TO if_ixml_element, + lv_tag_name TYPE string, + lv_node_value TYPE string. + + FIELD-SYMBOLS: <lv_shared_string> LIKE LINE OF me->shared_strings. + +*--------------------------------------------------------------------* + +* §1 Parse shared strings file and get into internal table +* So far I have encountered 2 ways how a string can be represented in the shared strings file +* §1.1 - "simple" strings +* §1.2 - rich text formatted strings + +* Following is an example how this file could be set up; 2 strings in simple formatting, 3rd string rich textformatted + + +* <?xml version="1.0" encoding="UTF-8" standalone="true"?> +* <sst uniqueCount="6" count="6" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> +* <si> +* <t>This is a teststring 1</t> +* </si> +* <si> +* <t>This is a teststring 2</t> +* </si> +* <si> +* <r> +* <t>T</t> +* </r> +* <r> +* <rPr> +* <sz val="11"/> +* <color rgb="FFFF0000"/> +* <rFont val="Calibri"/> +* <family val="2"/> +* <scheme val="minor"/> +* </rPr> +* <t xml:space="preserve">his is a </t> +* </r> +* <r> +* <rPr> +* <sz val="11"/> +* <color theme="1"/> +* <rFont val="Calibri"/> +* <family val="2"/> +* <scheme val="minor"/> +* </rPr> +* <t>teststring 3</t> +* </r> +* </si> +* </sst> +*--------------------------------------------------------------------* + + lo_shared_strings_xml = me->get_ixml_from_zip_archive( i_filename = ip_path + is_normalizing = space ). " NO!!! normalizing - otherwise leading blanks will be omitted and that is not really desired for the stringtable + lo_node_si ?= lo_shared_strings_xml->find_from_name( 'si' ). + WHILE lo_node_si IS BOUND. + + APPEND INITIAL LINE TO me->shared_strings ASSIGNING <lv_shared_string>. " Each <si>-entry in the xml-file must lead to an entry in our stringtable + lo_node_si_child ?= lo_node_si->get_first_child( ). + IF lo_node_si_child IS BOUND. + lv_tag_name = lo_node_si_child->get_name( ). + IF lv_tag_name = 't'. +*--------------------------------------------------------------------* +* §1.1 - "simple" strings +* Example: see above +*--------------------------------------------------------------------* + <lv_shared_string> = lo_node_si_child->get_value( ). + ELSE. +*--------------------------------------------------------------------* +* §1.2 - rich text formatted strings +* it is sufficient to strip the <t>...</t> tag from each <r>-tag and concatenate these +* as long as rich text formatting is not supported (2do§1) ignore all info about formatting +* Example: see above +*--------------------------------------------------------------------* + WHILE lo_node_si_child IS BOUND. " actually these children of <si> are <r>-tags + + lo_node_r_child_t ?= lo_node_si_child->find_from_name( 't' ). " extract the <t>...</t> part of each <r>-tag + IF lo_node_r_child_t IS BOUND. + lv_node_value = lo_node_r_child_t->get_value( ). + CONCATENATE <lv_shared_string> lv_node_value INTO <lv_shared_string> RESPECTING BLANKS. + ENDIF. + + lo_node_si_child ?= lo_node_si_child->get_next( ). + + ENDWHILE. + ENDIF. + ENDIF. + + lo_node_si ?= lo_node_si->get_next( ). + ENDWHILE. + + endmethod. + + + + + + method LOAD_STYLES. + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (wip ) 2012-11-25 +* - ... +* changes: renaming variables and types to naming conventions +* aligning code +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* + TYPES: BEGIN OF lty_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 lty_xf. + + TYPES: BEGIN OF lty_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 lty_alignment. + + TYPES: BEGIN OF lty_protection, + hidden TYPE string, + locked TYPE string, + END OF lty_protection. + + DATA: lo_styles_xml TYPE REF TO if_ixml_document, + lo_style TYPE REF TO zcl_excel_style, + + lt_num_formats TYPE t_num_formats, + lt_fills TYPE t_fills, + lt_borders TYPE t_borders, + lt_fonts TYPE t_fonts, + + ls_num_format TYPE t_num_format, + ls_fill TYPE REF TO zcl_excel_style_fill, + ls_cell_border TYPE REF TO zcl_excel_style_borders, + ls_font TYPE REF TO zcl_excel_style_font, + + lo_node_cellxfs TYPE REF TO if_ixml_element, + lo_node_cellxfs_xf TYPE REF TO if_ixml_element, + lo_node_cellxfs_xf_alignment TYPE REF TO if_ixml_element, + lo_node_cellxfs_xf_protection TYPE REF TO if_ixml_element, + + lo_nodes_xf TYPE REF TO if_ixml_node_collection, + lo_iterator_cellxfs TYPE REF TO if_ixml_node_iterator, + + ls_xf TYPE lty_xf, + ls_alignment TYPE lty_alignment, + ls_protection TYPE lty_protection, + lv_index TYPE i. + +*--------------------------------------------------------------------* +* To build a complete style that fully describes how a cell looks like +* we need the various parts +* §1 - Numberformat +* §2 - Fillstyle +* §3 - Borders +* §4 - Font +* §5 - Alignment +* §6 - Protection + +* Following is an example how this part of a file could be set up +* ... +* parts with various formatinformation - see §1,§2,§3,§4 +* ... +* <cellXfs count="26"> +* <xf numFmtId="0" borderId="0" fillId="0" fontId="0" xfId="0"/> +* <xf numFmtId="0" borderId="0" fillId="2" fontId="0" xfId="0" applyFill="1"/> +* <xf numFmtId="0" borderId="1" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> +* <xf numFmtId="0" borderId="2" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> +* <xf numFmtId="0" borderId="3" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> +* <xf numFmtId="0" borderId="4" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> +* <xf numFmtId="0" borderId="0" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> +* ... +* </cellXfs> +*--------------------------------------------------------------------* + + lo_styles_xml = me->get_ixml_from_zip_archive( ip_path ). + +*--------------------------------------------------------------------* +* The styles are build up from +* §1 number formats +* §2 fill styles +* §3 border styles +* §4 fonts +* These need to be read before we can try to build up a complete +* style that describes the look of a cell +*--------------------------------------------------------------------* + lt_num_formats = load_style_num_formats( lo_styles_xml ). " §1 + lt_fills = load_style_fills( lo_styles_xml ). " §2 + lt_borders = load_style_borders( lo_styles_xml ). " §3 + lt_fonts = load_style_fonts( lo_styles_xml ). " §4 + +*--------------------------------------------------------------------* +* Now everything is prepared to build a "full" style +*--------------------------------------------------------------------* + lo_node_cellxfs = lo_styles_xml->find_from_name( name = 'cellXfs' ). + IF lo_node_cellxfs IS BOUND. + lo_nodes_xf = lo_node_cellxfs->get_elements_by_tag_name( name = 'xf' ). + lo_iterator_cellxfs = lo_nodes_xf->create_iterator( ). + lo_node_cellxfs_xf ?= lo_iterator_cellxfs->get_next( ). + WHILE lo_node_cellxfs_xf IS BOUND. + + lo_style = ip_excel->add_new_style( ). + fill_struct_from_attributes( EXPORTING + ip_element = lo_node_cellxfs_xf + CHANGING + cp_structure = ls_xf ). +*--------------------------------------------------------------------* +* §2 fill style +*--------------------------------------------------------------------* + IF ls_xf-applyfill = '1' AND ls_xf-fillid IS NOT INITIAL. + lv_index = ls_xf-fillid + 1. + READ TABLE lt_fills INTO ls_fill INDEX lv_index. + IF sy-subrc = 0. + lo_style->fill = ls_fill. + ENDIF. + ENDIF. + +*--------------------------------------------------------------------* +* §1 number format +*--------------------------------------------------------------------* + IF ls_xf-numfmtid IS NOT INITIAL. + READ TABLE lt_num_formats INTO ls_num_format WITH TABLE KEY id = ls_xf-numfmtid. + IF sy-subrc = 0. + lo_style->number_format = ls_num_format-format. + ENDIF. + ENDIF. + +*--------------------------------------------------------------------* +* §3 border style +*--------------------------------------------------------------------* + IF ls_xf-applyborder = '1' AND ls_xf-borderid IS NOT INITIAL. + lv_index = ls_xf-borderid + 1. + READ TABLE lt_borders INTO ls_cell_border INDEX lv_index. + IF sy-subrc = 0. + lo_style->borders = ls_cell_border. + ENDIF. + ENDIF. + +*--------------------------------------------------------------------* +* §4 font +*--------------------------------------------------------------------* + IF ls_xf-applyfont = '1' AND ls_xf-fontid IS NOT INITIAL. + lv_index = ls_xf-fontid + 1. + READ TABLE lt_fonts INTO ls_font INDEX lv_index. + IF sy-subrc = 0. + lo_style->font = ls_font. + ENDIF. + ENDIF. + +*--------------------------------------------------------------------* +* §5 - Alignment +*--------------------------------------------------------------------* + lo_node_cellxfs_xf_alignment ?= lo_node_cellxfs_xf->find_from_name( 'alignment' ). + IF lo_node_cellxfs_xf_alignment IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_node_cellxfs_xf_alignment + CHANGING + cp_structure = ls_alignment ). + IF ls_alignment-horizontal IS NOT INITIAL. + lo_style->alignment->horizontal = ls_alignment-horizontal. + ENDIF. + + IF ls_alignment-vertical IS NOT INITIAL. + lo_style->alignment->vertical = ls_alignment-vertical. + ENDIF. + + IF ls_alignment-textrotation IS NOT INITIAL. + lo_style->alignment->textrotation = ls_alignment-textrotation. + ENDIF. + + IF ls_alignment-wraptext = '1' OR ls_alignment-wraptext = 'true'. + lo_style->alignment->wraptext = abap_true. + ENDIF. + + IF ls_alignment-shrinktofit = '1' OR ls_alignment-shrinktofit = 'true'. + lo_style->alignment->shrinktofit = abap_true. + ENDIF. + + IF ls_alignment-indent IS NOT INITIAL. + lo_style->alignment->indent = ls_alignment-indent. + ENDIF. + ENDIF. + +*--------------------------------------------------------------------* +* §6 - Protection +*--------------------------------------------------------------------* + lo_node_cellxfs_xf_protection ?= lo_node_cellxfs_xf->find_from_name( 'protection' ). + IF lo_node_cellxfs_xf_protection IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_node_cellxfs_xf_protection + CHANGING + cp_structure = ls_protection ). + IF ls_protection-locked = '1' OR ls_protection-locked = 'true'. + lo_style->protection->locked = zcl_excel_style_protection=>c_protection_locked. + ELSE. + lo_style->protection->locked = zcl_excel_style_protection=>c_protection_unlocked. + ENDIF. + + IF ls_protection-hidden = '1' OR ls_protection-hidden = 'true'. + lo_style->protection->hidden = zcl_excel_style_protection=>c_protection_hidden. + ELSE. + lo_style->protection->hidden = zcl_excel_style_protection=>c_protection_unhidden. + ENDIF. + + ENDIF. + + INSERT lo_style INTO TABLE me->styles. + + lo_node_cellxfs_xf ?= lo_iterator_cellxfs->get_next( ). + + ENDWHILE. + ENDIF. + + endmethod. + + + + + method LOAD_STYLE_BORDERS. + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-25 +* - ... +* changes: renaming variables and types to naming conventions +* aligning code +* renaming variables to indicate what they are used for +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* + DATA: lo_node_border TYPE REF TO if_ixml_element, + lo_node_bordertype TYPE REF TO if_ixml_element, + lo_node_bordercolor TYPE REF TO if_ixml_element, + lo_cell_border TYPE REF TO zcl_excel_style_borders, + lo_border TYPE REF TO zcl_excel_style_border, + ls_color TYPE t_color. + +*--------------------------------------------------------------------* +* We need a table of used borderformats to build up our styles +* §1 A cell has 4 outer borders and 2 diagonal "borders" +* These borders can be formatted separately but the diagonal borders +* are always being formatted the same +* We'll parse through the <border>-tag for each of the bordertypes +* §2 and read the corresponding formatting information + +* Following is an example how this part of a file could be set up +* <border diagonalDown="1"> +* <left style="mediumDashDotDot"> +* <color rgb="FFFF0000"/> +* </left> +* <right/> +* <top style="thick"> +* <color rgb="FFFF0000"/> +* </top> +* <bottom style="thick"> +* <color rgb="FFFF0000"/> +* </bottom> +* <diagonal style="thick"> +* <color rgb="FFFF0000"/> +* </diagonal> +* </border> +*--------------------------------------------------------------------* + lo_node_border ?= ip_xml->find_from_name( 'border' ). + WHILE lo_node_border IS BOUND. + + CREATE OBJECT lo_cell_border. + +*--------------------------------------------------------------------* +* Diagonal borderlines are formatted the equally. Determine what kind of diagonal borders are present if any +*--------------------------------------------------------------------* +* DiagonalNone = 0 +* DiagonalUp = 1 +* DiagonalDown = 2 +* DiagonalBoth = 3 +*--------------------------------------------------------------------* + IF lo_node_border->get_attribute( 'diagonalDown' ) IS NOT INITIAL. + add zcl_excel_style_borders=>c_diagonal_down to lo_cell_border->diagonal_mode. + ENDIF. + + IF lo_node_border->get_attribute( 'diagonalUp' ) IS NOT INITIAL. + add zcl_excel_style_borders=>c_diagonal_up to lo_cell_border->diagonal_mode. + ENDIF. + + lo_node_bordertype ?= lo_node_border->get_first_child( ). + WHILE lo_node_bordertype IS BOUND. +*--------------------------------------------------------------------* +* §1 Determine what kind of border we are talking about +*--------------------------------------------------------------------* +* Up, down, left, right, diagonal +*--------------------------------------------------------------------* + CREATE OBJECT lo_border. + + CASE lo_node_bordertype->get_name( ). + + WHEN 'left'. + lo_cell_border->left = lo_border. + + WHEN 'right'. + lo_cell_border->right = lo_border. + + WHEN 'top'. + lo_cell_border->top = lo_border. + + WHEN 'bottom'. + lo_cell_border->down = lo_border. + + WHEN 'diagonal'. + lo_cell_border->diagonal = lo_border. + + ENDCASE. + +*--------------------------------------------------------------------* +* §2 Read the border-formatting +*--------------------------------------------------------------------* + lo_border->border_style = lo_node_bordertype->get_attribute( 'style' ). + lo_node_bordercolor ?= lo_node_bordertype->find_from_name( 'color' ). + IF lo_node_bordercolor IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_node_bordercolor + CHANGING + cp_structure = ls_color ). + + lo_border->border_color-rgb = ls_color-rgb. + IF ls_color-indexed IS NOT INITIAL. + lo_border->border_color-indexed = ls_color-indexed. + ENDIF. + + IF ls_color-theme IS NOT INITIAL. + lo_border->border_color-theme = ls_color-theme. + ENDIF. + lo_border->border_color-tint = ls_color-tint. + ENDIF. + + lo_node_bordertype ?= lo_node_bordertype->get_next( ). + + ENDWHILE. + + INSERT lo_cell_border INTO TABLE ep_borders. + + lo_node_border ?= lo_node_border->get_next( ). + + ENDWHILE. + + + endmethod. + + + + + method LOAD_STYLE_FILLS. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 Support gradientFill +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-25 +* - ... +* changes: renaming variables and types to naming conventions +* aligning code +* commenting on problems/future enhancements/todos we already know of or should decide upon +* adding comments to explain what we are trying to achieve +* renaming variables to indicate what they are used for +*--------------------------------------------------------------------* + DATA: lv_value TYPE string, + lo_node_fill TYPE REF TO if_ixml_element, + lo_node_fill_child TYPE REF TO if_ixml_element, + lo_node_bgcolor TYPE REF TO if_ixml_element, + lo_node_fgcolor TYPE REF TO if_ixml_element, + lo_fill TYPE REF TO zcl_excel_style_fill, + ls_color TYPE t_color. + +*--------------------------------------------------------------------* +* We need a table of used fillformats to build up our styles + +* Following is an example how this part of a file could be set up +* <fill> +* <patternFill patternType="gray125"/> +* </fill> +* <fill> +* <patternFill patternType="solid"> +* <fgColor rgb="FFFFFF00"/> +* <bgColor indexed="64"/> +* </patternFill> +* </fill> +*--------------------------------------------------------------------* + + lo_node_fill ?= ip_xml->find_from_name( 'fill' ). + WHILE lo_node_fill IS BOUND. + + CREATE OBJECT lo_fill. + lo_node_fill_child ?= lo_node_fill->get_first_child( ). + lv_value = lo_node_fill_child->get_name( ). + CASE lv_value. + +*--------------------------------------------------------------------* +* Patternfill +*--------------------------------------------------------------------* + WHEN 'patternFill'. + lo_fill->filltype = lo_node_fill_child->get_attribute( 'patternType' ). +*--------------------------------------------------------------------* +* Patternfill - background color +*--------------------------------------------------------------------* + lo_node_bgcolor = lo_node_fill_child->find_from_name( 'bgColor' ). + IF lo_node_bgcolor IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_node_bgcolor + CHANGING + cp_structure = ls_color ). + + lo_fill->bgcolor-rgb = ls_color-rgb. + IF ls_color-indexed IS NOT INITIAL. + lo_fill->bgcolor-indexed = ls_color-indexed. + ENDIF. + + IF ls_color-theme IS NOT INITIAL. + lo_fill->bgcolor-theme = ls_color-theme. + ENDIF. + lo_fill->bgcolor-tint = ls_color-tint. + ENDIF. + +*--------------------------------------------------------------------* +* Patternfill - foreground color +*--------------------------------------------------------------------* + lo_node_fgcolor = lo_node_fill->find_from_name( 'fgColor' ). + IF lo_node_fgcolor IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_node_fgcolor + CHANGING + cp_structure = ls_color ). + + lo_fill->fgcolor-rgb = ls_color-rgb. + IF ls_color-indexed IS NOT INITIAL. + lo_fill->fgcolor-indexed = ls_color-indexed. + ENDIF. + + IF ls_color-theme IS NOT INITIAL. + lo_fill->fgcolor-theme = ls_color-theme. + ENDIF. + lo_fill->fgcolor-tint = ls_color-tint. + ENDIF. + + +*--------------------------------------------------------------------* +* gradientFill +*--------------------------------------------------------------------* + WHEN 'gradientFill'. + " 2do§1 Support gradientFill + + WHEN OTHERS. + + ENDCASE. + + + INSERT lo_fill INTO TABLE ep_fills. + + lo_node_fill ?= lo_node_fill->get_next( ). + + ENDWHILE. + + + endmethod. + + + + + method LOAD_STYLE_FONTS. + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-25 +* - ... +* changes: renaming variables and types to naming conventions +* aligning code +* removing unused variables +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* + DATA: lo_node_font TYPE REF TO if_ixml_element, + lo_node2 TYPE REF TO if_ixml_element, + lo_font TYPE REF TO zcl_excel_style_font, + ls_color TYPE t_color. + +*--------------------------------------------------------------------* +* We need a table of used fonts to build up our styles + +* Following is an example how this part of a file could be set up +* <font> +* <sz val="11"/> +* <color theme="1"/> +* <name val="Calibri"/> +* <family val="2"/> +* <scheme val="minor"/> +* </font> +*--------------------------------------------------------------------* + lo_node_font ?= ip_xml->find_from_name( 'font' ). + WHILE lo_node_font IS BOUND. + + CREATE OBJECT lo_font. +*--------------------------------------------------------------------* +* Bold +*--------------------------------------------------------------------* + IF lo_node_font->find_from_name( 'b' ) IS BOUND. + lo_font->bold = abap_true. + ENDIF. + +*--------------------------------------------------------------------* +* Italic +*--------------------------------------------------------------------* + IF lo_node_font->find_from_name( 'i' ) IS BOUND. + lo_font->italic = abap_true. + ENDIF. + +*--------------------------------------------------------------------* +* Underline +*--------------------------------------------------------------------* + lo_node2 = lo_node_font->find_from_name( 'u' ). + IF lo_node2 IS BOUND. + lo_font->underline = abap_true. + lo_font->underline_mode = lo_node2->get_attribute( 'val' ). + ENDIF. + +*--------------------------------------------------------------------* +* StrikeThrough +*--------------------------------------------------------------------* + IF lo_node_font->find_from_name( 'strike' ) IS BOUND. + lo_font->strikethrough = abap_true. + ENDIF. + +*--------------------------------------------------------------------* +* Fontsize +*--------------------------------------------------------------------* + lo_node2 = lo_node_font->find_from_name( 'sz' ). + IF lo_node2 IS BOUND. + lo_font->size = lo_node2->get_attribute( 'val' ). + ENDIF. + +*--------------------------------------------------------------------* +* Fontname +*--------------------------------------------------------------------* + lo_node2 = lo_node_font->find_from_name( 'name' ). + IF lo_node2 IS BOUND. + lo_font->name = lo_node2->get_attribute( 'val' ). + ENDIF. + +*--------------------------------------------------------------------* +* Fontfamily +*--------------------------------------------------------------------* + lo_node2 = lo_node_font->find_from_name( 'family' ). + IF lo_node2 IS BOUND. + lo_font->family = lo_node2->get_attribute( 'val' ). + ENDIF. + +*--------------------------------------------------------------------* +* Fontscheme +*--------------------------------------------------------------------* + lo_node2 = lo_node_font->find_from_name( 'scheme' ). + IF lo_node2 IS BOUND. + lo_font->scheme = lo_node2->get_attribute( 'val' ). + ENDIF. + +*--------------------------------------------------------------------* +* Fontcolor +*--------------------------------------------------------------------* + lo_node2 = lo_node_font->find_from_name( 'color' ). + IF lo_node2 IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_node2 + CHANGING + cp_structure = ls_color ). + lo_font->color-rgb = ls_color-rgb. + IF ls_color-indexed IS NOT INITIAL. + lo_font->color-indexed = ls_color-indexed. + ENDIF. + + IF ls_color-theme IS NOT INITIAL. + lo_font->color-theme = ls_color-theme. + ENDIF. + lo_font->color-tint = ls_color-tint. + ENDIF. + + INSERT lo_font INTO TABLE ep_fonts. + + lo_node_font ?= lo_node_font->get_next( ). + + ENDWHILE. + + + endmethod. + + + + + method LOAD_STYLE_NUM_FORMATS. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 Explain gaps in predefined formats +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-25 +* - ... +* changes: renaming variables and types to naming conventions +* adding comments to explain what we are trying to achieve +* aligning code +*--------------------------------------------------------------------* + DATA: lo_node_numfmt TYPE REF TO if_ixml_element, + ls_num_format TYPE t_num_format. + +*--------------------------------------------------------------------* +* We need a table of used numberformats to build up our styles +* there are two kinds of numberformats +* §1 those that have been explicitly added by the createor of the excel-file +* §2 and built-in numberformats +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* §1 Get non-internal numberformats that are found in the file explicitly + +* Following is an example how this part of a file could be set up +* <numFmts count="1"> +* <numFmt formatCode="#,###,###,###,##0.00" numFmtId="164"/> +* </numFmts> +*--------------------------------------------------------------------* + lo_node_numfmt ?= ip_xml->find_from_name( 'numFmt' ). + WHILE lo_node_numfmt IS BOUND. + + CLEAR ls_num_format. + + CREATE OBJECT ls_num_format-format. + ls_num_format-format->format_code = lo_node_numfmt->get_attribute( 'formatCode' ). + ls_num_format-id = lo_node_numfmt->get_attribute( 'numFmtId' ). + INSERT ls_num_format INTO TABLE ep_num_formats. + + lo_node_numfmt ?= lo_node_numfmt->get_next( ). + + ENDWHILE. + + DEFINE predefined_format. + ls_num_format-id = &1. + create object ls_num_format-format. + ls_num_format-format->format_code = &2. + insert ls_num_format into table ep_num_formats. + END-OF-DEFINITION. + +*--------------------------------------------------------------------* +* §1 Get internal predefined numberformats +*--------------------------------------------------------------------* + predefined_format '1' '0'. + predefined_format '2' '0.00'. + predefined_format '3' '#,##0'. + predefined_format '4' '#,##0.00'. + predefined_format '5' '$#,##0_);($#,##0)'. + predefined_format '6' '$#,##0_);[Red]($#,##0)'. + predefined_format '7' '$#,##0.00_);($#,##0.00)'. + predefined_format '8' '$#,##0.00_);[Red]($#,##0.00)'. + predefined_format '9' '0%'. + predefined_format '10' '0.00%'. + predefined_format '11' '0.00E+00'. + predefined_format '12' '# ?/?'. + predefined_format '13' '# ??/??'. + predefined_format '14' 'm/d/yyyy'. + predefined_format '15' 'd-mmm-yy'. + predefined_format '16' 'd-mmm'. + predefined_format '17' 'mmm-yy'. + predefined_format '18' 'h:mm AM/PM'. + predefined_format '19' 'h:mm:ss AM/PM'. + predefined_format '20' 'h:mm'. + predefined_format '21' 'h:mm:ss'. + predefined_format '22' 'm/d/yyyy h:mm'. +* 2do§1 Why is there a gap in here? + + + + + + + + + + + + + + predefined_format '37' '#,##0_);(#,##0)'. + predefined_format '38' '#,##0_);[Red](#,##0)'. + predefined_format '39' '#,##0.00_);(#,##0.00)'. + predefined_format '40' '#,##0.00_);[Red](#,##0.00)'. +* 2do§1 Why is there a gap in here? + + + + predefined_format '45' 'mm:ss'. + predefined_format '46' '[h]:mm:ss'. + predefined_format '47' 'mm:ss.0'. + predefined_format '48' '##0.0E+0'. + predefined_format '49' '@'. +* 2do§1 Is 49 really the last predefined format? + + + endmethod. + + + + + + method LOAD_WORKBOOK. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 Move macro-reading from zcl_excel_reader_xlsm to this class +* autodetect existance of macro/vba content +* Allow inputparameter to explicitly tell reader to ignore vba-content +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-10 +* - ... +* changes: renaming variables to naming conventions +* aligning code +* removing unused variables +* adding me-> where possible +* renaming variables to indicate what they are used for +* adding comments to explain what we are trying to achieve +* renaming i/o parameters: previous input-parameter ip_path holds a (full) filename and not a path --> rename to iv_workbook_full_filename +* ip_excel renamed while being at it --> rename to io_excel +*--------------------------------------------------------------------* +* issue #232 - Read worksheetstate hidden/veryHidden +* - Stefan Schmöcker, 2012-11-11 +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns +* - Stefan Schmöcker, 2012-12-02 +* changes: correction in named ranges to correctly attach +* sheetlocal names/ranges to the correct sheet +*--------------------------------------------------------------------* +* issue#284 - Copied formulae ignored when reading excelfile +* - Stefan Schmöcker, 2013-08-02 +* changes: initialize area to hold referenced formulaedata +* after all worksheets have been read resolve formuae +*--------------------------------------------------------------------* + + CONSTANTS: lcv_shared_strings TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + lcv_worksheet TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lcv_styles TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lcv_vba_project TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', "#EC NEEDED for future incorporation of XLSM-reader +*--------------------------------------------------------------------* +* #232: Read worksheetstate hidden/veryHidden - begin data declarations +*--------------------------------------------------------------------* + lcv_worksheet_state_hidden TYPE string VALUE 'hidden', + lcv_worksheet_state_veryhidden TYPE string VALUE 'veryHidden'. +*--------------------------------------------------------------------* +* #232: Read worksheetstate hidden/veryHidden - end data declarations +*--------------------------------------------------------------------* + + DATA: + lv_path TYPE string, + lv_filename TYPE chkfile, + lv_full_filename TYPE string, + + lo_rels_workbook TYPE REF TO if_ixml_document, + lt_worksheets TYPE STANDARD TABLE OF t_relationship WITH NON-UNIQUE DEFAULT KEY, + lo_workbook TYPE REF TO if_ixml_document, + lv_workbook_index TYPE i, + lv_worksheet_path TYPE string, + ls_sheet TYPE t_sheet, + + lo_node TYPE REF TO if_ixml_element, + ls_relationship TYPE t_relationship, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lv_worksheet_title TYPE zexcel_sheet_title, + lv_tabix TYPE sytabix, " #235 - repeat rows/cols. Needed to link defined name to correct worksheet + + ls_range TYPE t_range, + lv_range_value TYPE zexcel_range_value, +*--------------------------------------------------------------------* +* #229: Set active worksheet - begin data declarations +*--------------------------------------------------------------------* + lv_active_sheet_string TYPE string, + lv_zexcel_active_worksheet TYPE zexcel_active_worksheet, +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns - added autofilter support while changing this section + lo_autofilter TYPE REF TO zcl_excel_autofilter, + ls_area TYPE zexcel_s_autofilter_area, + lv_col_start_alpha TYPE zexcel_cell_column_alpha, + lv_col_end_alpha TYPE zexcel_cell_column_alpha, + lv_row_start TYPE zexcel_cell_row, + lv_row_end TYPE zexcel_cell_row , + lv_regex TYPE string, + lv_range_value_1 TYPE zexcel_range_value, + lv_range_value_2 TYPE zexcel_range_value. +*--------------------------------------------------------------------* +* #229: Set active worksheet - end data declarations +*--------------------------------------------------------------------* + FIELD-SYMBOLS: <worksheet> TYPE t_relationship. + + +*--------------------------------------------------------------------* + +* §1 Get the position of files related to this workbook +* Usually this will be <root>/xl/workbook.xml +* Thus the workbookroot will be <root>/xl/ +* The position of all related files will be given in file +* <workbookroot>/_rels/<workbookfilename>.rels and their positions +* be be given relative to the workbookroot + +* Following is an example how this file could be set up + +* <?xml version="1.0" encoding="UTF-8" standalone="true"?> +* <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> +* <Relationship Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Id="rId6"/> +* <Relationship Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Id="rId5"/> +* <Relationship Target="worksheets/sheet1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId1"/> +* <Relationship Target="worksheets/sheet2.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId2"/> +* <Relationship Target="worksheets/sheet3.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId3"/> +* <Relationship Target="worksheets/sheet4.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId4"/> +* <Relationship Target="sharedStrings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Id="rId7"/> +* </Relationships> +* +* §2 Load data that is relevant to the complete workbook +* Currently supported is: +* §2.1 Shared strings - This holds all strings that are used in all worksheets +* §2.2 Styles - This holds all styles that are used in all worksheets +* §2.3 Worksheets - For each worksheet in the workbook one entry appears here to point to the file that holds the content of this worksheet +* §2.4 [Themes] - not supported +* §2.5 [VBA (Macro)] - supported in class zcl_excel_reader_xlsm but should be moved here and autodetect +* ... +* +* §3 Some information is held in the workbookfile as well +* §3.1 Names and order of of worksheets +* §3.2 Active worksheet +* §3.3 Defined names +* ... +* Following is an example how this file could be set up + +* <?xml version="1.0" encoding="UTF-8" standalone="true"?> +* <workbook xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> +* <fileVersion rupBuild="4506" lowestEdited="4" lastEdited="4" appName="xl"/> +* <workbookPr defaultThemeVersion="124226"/> +* <bookViews> +* <workbookView activeTab="1" windowHeight="8445" windowWidth="19035" yWindow="120" xWindow="120"/> +* </bookViews> +* <sheets> +* <sheet r:id="rId1" sheetId="1" name="Sheet1"/> +* <sheet r:id="rId2" sheetId="2" name="Sheet2"/> +* <sheet r:id="rId3" sheetId="3" name="Sheet3" state="hidden"/> +* <sheet r:id="rId4" sheetId="4" name="Sheet4"/> +* </sheets> +* <definedNames/> +* <calcPr calcId="125725"/> +* </workbook> +*--------------------------------------------------------------------* + + CLEAR me->mt_ref_formulae. " ins issue#284 + +*--------------------------------------------------------------------* +* §1 Get the position of files related to this workbook +* Entry into this method is with the filename of the workbook +*--------------------------------------------------------------------* + CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' + EXPORTING + full_name = iv_workbook_full_filename + IMPORTING + stripped_name = lv_filename + file_path = lv_path. + + CONCATENATE lv_path '_rels/' lv_filename '.rels' + INTO lv_full_filename. + lo_rels_workbook = me->get_ixml_from_zip_archive( lv_full_filename ). + + lo_node ?= lo_rels_workbook->find_from_name( 'Relationship' ). "#EC NOTEXT + WHILE lo_node IS BOUND. + + me->fill_struct_from_attributes( EXPORTING ip_element = lo_node CHANGING cp_structure = ls_relationship ). + + CASE ls_relationship-type. + +*--------------------------------------------------------------------* +* §2.1 Shared strings - This holds all strings that are used in all worksheets +*--------------------------------------------------------------------* + WHEN lcv_shared_strings. + CONCATENATE lv_path ls_relationship-target + INTO lv_full_filename. + me->load_shared_strings( lv_full_filename ). + +*--------------------------------------------------------------------* +* §2.3 Worksheets +* For each worksheet in the workbook one entry appears here to point to the file that holds the content of this worksheet +* Shared strings and styles have to be present before we can start with creating the worksheets +* thus we only store this information for use when parsing the workbookfile for sheetinformations +*--------------------------------------------------------------------* + WHEN lcv_worksheet. + APPEND ls_relationship TO lt_worksheets. + +*--------------------------------------------------------------------* +* §2.2 Styles - This holds the styles that are used in all worksheets +*--------------------------------------------------------------------* + WHEN lcv_styles. + CONCATENATE lv_path ls_relationship-target + INTO lv_full_filename. + me->load_styles( ip_path = lv_full_filename + ip_excel = io_excel ). + + WHEN OTHERS. + + ENDCASE. + + lo_node ?= lo_node->get_next( ). + + ENDWHILE. + +*--------------------------------------------------------------------* +* §3 Some information held in the workbookfile +*--------------------------------------------------------------------* + lo_workbook = me->get_ixml_from_zip_archive( iv_workbook_full_filename ). + +*--------------------------------------------------------------------* +* §3.1 Names and order of of worksheets +*--------------------------------------------------------------------* + lo_node ?= lo_workbook->find_from_name( 'sheet' ). + lv_workbook_index = 1. + WHILE lo_node IS BOUND. + + me->fill_struct_from_attributes( EXPORTING + ip_element = lo_node + CHANGING + cp_structure = ls_sheet ). +*--------------------------------------------------------------------* +* Create new worksheet in workbook with correct name +*--------------------------------------------------------------------* + lv_worksheet_title = ls_sheet-name. + IF lv_workbook_index = 1. " First sheet has been added automatically by creating io_excel + lo_worksheet = io_excel->get_active_worksheet( ). + lo_worksheet->set_title( lv_worksheet_title ). + ELSE. + lo_worksheet = io_excel->add_new_worksheet( lv_worksheet_title ). + ENDIF. +*--------------------------------------------------------------------* +* #232 - Read worksheetstate hidden/veryHidden - begin of coding +* Set status hidden if necessary +*--------------------------------------------------------------------* + CASE ls_sheet-state. + + WHEN lcv_worksheet_state_hidden. + lo_worksheet->zif_excel_sheet_properties~hidden = zif_excel_sheet_properties=>c_hidden. + + WHEN lcv_worksheet_state_veryhidden. + lo_worksheet->zif_excel_sheet_properties~hidden = zif_excel_sheet_properties=>c_veryhidden. + + ENDCASE. +*--------------------------------------------------------------------* +* #232 - Read worksheetstate hidden/veryHidden - end of coding +*--------------------------------------------------------------------* +*--------------------------------------------------------------------* +* Load worksheetdata +*--------------------------------------------------------------------* + READ TABLE lt_worksheets ASSIGNING <worksheet> WITH KEY id = ls_sheet-id. + IF sy-subrc = 0. + <worksheet>-sheetid = ls_sheet-sheetid. "ins #235 - repeat rows/cols - needed to identify correct sheet + CONCATENATE lv_path <worksheet>-target + INTO lv_worksheet_path. + me->load_worksheet( ip_path = lv_worksheet_path + io_worksheet = lo_worksheet ). + <worksheet>-worksheet = lo_worksheet. + ENDIF. + + lo_node ?= lo_node->get_next( ). + ADD 1 TO lv_workbook_index. + + ENDWHILE. + SORT lt_worksheets BY sheetid. " needed for localSheetid -referencing + +*--------------------------------------------------------------------* +* #284: Set active worksheet - Resolve referenced formulae to +* explicit formulae those cells +*--------------------------------------------------------------------* + me->resolve_referenced_formulae( ). + " ins issue#284 +*--------------------------------------------------------------------* +* #229: Set active worksheet - begin coding +* §3.2 Active worksheet +*--------------------------------------------------------------------* + lv_zexcel_active_worksheet = 1. " First sheet = active sheet if nothing else specified. + lo_node ?= lo_workbook->find_from_name( 'workbookView' ). + IF lo_node IS BOUND. + lv_active_sheet_string = lo_node->get_attribute( 'activeTab' ). + TRY. + lv_zexcel_active_worksheet = lv_active_sheet_string + 1. " EXCEL numbers the sheets from 0 onwards --> index into worksheettable is increased by one + CATCH cx_sy_conversion_error. "#EC NO_HANDLER - error here --> just use the default 1st sheet + ENDTRY. + ENDIF. + io_excel->set_active_sheet_index( lv_zexcel_active_worksheet ). +*--------------------------------------------------------------------* +* #229: Set active worksheet - end coding +*--------------------------------------------------------------------* + + +*--------------------------------------------------------------------* +* §3.3 Defined names +* So far I have encountered these +* - named ranges - sheetlocal +* - named ranges - workbookglobal +* - autofilters - sheetlocal ( special range ) +* - repeat rows/cols - sheetlocal ( special range ) +* +*--------------------------------------------------------------------* + lo_node ?= lo_workbook->find_from_name( 'definedName' ). + WHILE lo_node IS BOUND. + + CLEAR lo_range. "ins issue #235 - repeat rows/cols + me->fill_struct_from_attributes( EXPORTING + ip_element = lo_node + CHANGING + cp_structure = ls_range ). + lv_range_value = lo_node->get_value( ). + + IF ls_range-localsheetid IS NOT INITIAL. " issue #163+ +* READ TABLE lt_worksheets ASSIGNING <worksheet> WITH KEY id = ls_range-localsheetid. "del issue #235 - repeat rows/cols " issue #163+ +* lo_range = <worksheet>-worksheet->add_new_range( ). "del issue #235 - repeat rows/cols " issue #163+ +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns - begin +*--------------------------------------------------------------------* + lv_tabix = ls_range-localsheetid + 1. + READ TABLE lt_worksheets ASSIGNING <worksheet> INDEX lv_tabix. + IF sy-subrc = 0. + CASE ls_range-name. + +*--------------------------------------------------------------------* +* insert autofilters +*--------------------------------------------------------------------* + WHEN zcl_excel_autofilters=>c_autofilter. + lo_autofilter = io_excel->add_new_autofilter( io_sheet = <worksheet>-worksheet ) . + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = ls_area-row_start ). + ls_area-col_start = zcl_excel_common=>convert_column2int( lv_col_start_alpha ). + ls_area-col_end = zcl_excel_common=>convert_column2int( lv_col_end_alpha ). + lo_autofilter->set_filter_area( is_area = ls_area ). + +*--------------------------------------------------------------------* +* repeat print rows/columns +*--------------------------------------------------------------------* + WHEN zif_excel_sheet_printsettings=>gcv_print_title_name. + lo_range = <worksheet>-worksheet->add_new_range( ). +*--------------------------------------------------------------------* +* This might be a temporary solution. Maybe ranges get be reworked +* to support areas consisting of multiple rectangles +* But for now just split the range into row and columnpart +*--------------------------------------------------------------------* + CLEAR:lv_range_value_1, + lv_range_value_2. + IF lv_range_value IS INITIAL. +* Empty --> nothing to do + ELSE. + IF lv_range_value(1) = `'`. " Escaped + lv_regex = `^('[^']*')+![^,]*,`. + ELSE. + lv_regex = `^[^!]*![^,]*,`. + ENDIF. +* Split into two ranges if necessary + FIND REGEX lv_regex IN lv_range_value MATCH LENGTH sy-fdpos. + IF sy-subrc = 0 AND sy-fdpos > 0. + lv_range_value_2 = lv_range_value+sy-fdpos. + SUBTRACT 1 FROM sy-fdpos. + lv_range_value_1 = lv_range_value(sy-fdpos). + ELSE. + lv_range_value_1 = lv_range_value. + ENDIF. + ENDIF. +* 1st range + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_1 + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). + ENDIF. + +* 2nd range + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_2 + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). + ENDIF. + + WHEN OTHERS. + + ENDCASE. + ENDIF. +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns - end +*--------------------------------------------------------------------* + ELSE. " issue #163+ + lo_range = io_excel->add_new_range( ). " issue #163+ + ENDIF. " issue #163+ +* lo_range = ip_excel->add_new_range( ). " issue #163- + IF lo_range IS BOUND. "ins issue #235 - repeat rows/cols + lo_range->name = ls_range-name. + lo_range->set_range_value( lv_range_value ). + ENDIF. "ins issue #235 - repeat rows/cols + lo_node ?= lo_node->get_next( ). + + ENDWHILE. + + endmethod. + + + + + + METHOD load_worksheet. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 Header/footer +* +* Please don't just delete these ToDos if they are not +* needed but leave a comment that states this +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, +* - ... +* changes: renaming variables to naming conventions +* aligning code (started) +* add a list of open ToDos here +* adding comments to explain what we are trying to achieve (started) +*--------------------------------------------------------------------* +* issue #345 - Dump on small pagemargins +* Took the chance to modularize this very long method +* by extracting the code that needed correction into +* own method ( load_worksheet_pagemargins ) +*--------------------------------------------------------------------* + TYPES: BEGIN OF lty_cell, + r TYPE string, + t TYPE string, + s TYPE string, + END OF lty_cell. + + TYPES: BEGIN OF lty_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 lty_column. + + TYPES: BEGIN OF lty_sheetview, + showgridlines TYPE zexcel_show_gridlines, + tabselected TYPE string, + zoomscalenormal TYPE string, + workbookviewid TYPE string, + showrowcolheaders TYPE string, + END OF lty_sheetview. + + TYPES: BEGIN OF lty_mergecell, + ref TYPE string, + END OF lty_mergecell. + + TYPES: BEGIN OF lty_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 lty_row. + + TYPES: BEGIN OF lty_page_setup, + id TYPE string, + orientation TYPE string, + scale TYPE string, + END OF lty_page_setup. + + TYPES: BEGIN OF lty_sheetformatpr, + customheight TYPE string, + defaultrowheight TYPE string, + customwidth TYPE string, + defaultcolwidth TYPE string, + END OF lty_sheetformatpr. + + TYPES: BEGIN OF lty_headerfooter, + alignwithmargins TYPE string, + differentoddeven TYPE string, + END OF lty_headerfooter. + + TYPES: BEGIN OF lty_tabcolor, + rgb TYPE string, + theme TYPE string, + END OF lty_tabcolor. + + TYPES: BEGIN OF lty_datavalidation, + type TYPE zexcel_data_val_type, + allowblank TYPE flag, + showinputmessage TYPE flag, + showerrormessage TYPE flag, + showdropdown TYPE flag, + operator TYPE zexcel_data_val_operator, + formula1 TYPE zexcel_validation_formula1, + formula2 TYPE zexcel_validation_formula1, + sqref TYPE string, + cell_column TYPE zexcel_cell_column_alpha, + cell_column_to TYPE zexcel_cell_column_alpha, + cell_row TYPE zexcel_cell_row, + cell_row_to TYPE zexcel_cell_row, + error TYPE string, + errortitle TYPE string, + prompt TYPE string, + prompttitle TYPE string, + errorstyle TYPE zexcel_data_val_error_style, + END OF lty_datavalidation. + + + + CONSTANTS: lc_xml_attr_true TYPE string VALUE 'true', + lc_xml_attr_true_int TYPE string VALUE '1', + lc_rel_drawing TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', + lc_rel_hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', + lc_rel_printer TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'. + + DATA: lo_ixml_worksheet TYPE REF TO if_ixml_document, + lo_ixml_cells TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml_iterator2 TYPE REF TO if_ixml_node_iterator, + lo_ixml_row_elem TYPE REF TO if_ixml_element, + lo_ixml_cell_elem TYPE REF TO if_ixml_element, + ls_cell TYPE lty_cell, + lv_index TYPE i, + lo_ixml_value_elem TYPE REF TO if_ixml_element, + lo_ixml_formula_elem TYPE REF TO if_ixml_element, + lv_cell_value TYPE zexcel_cell_value, + lv_cell_formula TYPE zexcel_cell_formula, + lv_cell_column TYPE zexcel_cell_column_alpha, + lv_cell_row TYPE zexcel_cell_row, + lo_excel_style TYPE REF TO zcl_excel_style, + lv_style_guid TYPE zexcel_cell_style, + + lo_ixml_imension_elem TYPE REF TO if_ixml_element, "#+234 + lv_dimension_range TYPE string, "#+234 + + lo_ixml_sheetview_elem TYPE REF TO if_ixml_element, + ls_sheetview TYPE lty_sheetview, + lo_ixml_pane_elem TYPE REF TO if_ixml_element, + ls_excel_pane TYPE zexcel_pane, + lv_pane_cell_row TYPE zexcel_cell_row, + lv_pane_cell_col_a TYPE zexcel_cell_column_alpha, + lv_pane_cell_col TYPE zexcel_cell_column, + + lo_ixml_mergecells TYPE REF TO if_ixml_node_collection, + lo_ixml_mergecell_elem TYPE REF TO if_ixml_element, + ls_mergecell TYPE lty_mergecell, + lv_merge_column_start TYPE zexcel_cell_column_alpha, + lv_merge_column_end TYPE zexcel_cell_column_alpha, + lv_merge_row_start TYPE zexcel_cell_row, + lv_merge_row_end TYPE zexcel_cell_row, + + lo_ixml_sheetformatpr_elem TYPE REF TO if_ixml_element, + ls_sheetformatpr TYPE lty_sheetformatpr, + lv_height TYPE float, + + lo_ixml_headerfooter_elem TYPE REF TO if_ixml_element, + ls_headerfooter TYPE lty_headerfooter, + ls_odd_header TYPE zexcel_s_worksheet_head_foot, + ls_odd_footer TYPE zexcel_s_worksheet_head_foot, + ls_even_header TYPE zexcel_s_worksheet_head_foot, + ls_even_footer TYPE zexcel_s_worksheet_head_foot, + lo_ixml_hf_value_elem TYPE REF TO if_ixml_element, + + lo_ixml_pagesetup_elem TYPE REF TO if_ixml_element, + ls_pagesetup TYPE lty_page_setup, + + lo_ixml_columns TYPE REF TO if_ixml_node_collection, + lo_ixml_column_elem TYPE REF TO if_ixml_element, + ls_column TYPE lty_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lv_outline_level TYPE int4, + + lo_ixml_tabcolor TYPE REF TO if_ixml_element, + ls_tabcolor TYPE lty_tabcolor, + ls_excel_s_tabcolor TYPE zexcel_s_tabcolor, + + lo_ixml_rows TYPE REF TO if_ixml_node_collection, + ls_row TYPE lty_row, + lv_max_col TYPE i, "for use with SPANS element +* lv_min_col TYPE i, "for use with SPANS element " not in use currently + lv_max_col_s TYPE char10, "for use with SPANS element + lv_min_col_s TYPE char10, "for use with SPANS element + lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, +*--- End of current code aligning ------------------------------------------------------------------- + + lv_path TYPE string, + lo_ixml_node TYPE REF TO if_ixml_element, + ls_relationship TYPE t_relationship, + lo_ixml_rels_worksheet TYPE REF TO if_ixml_document, + lv_rels_worksheet_path TYPE string, + lv_stripped_name TYPE chkfile, + lv_dirname TYPE string, + + lt_external_hyperlinks TYPE gtt_external_hyperlinks, + ls_external_hyperlink LIKE LINE OF lt_external_hyperlinks, + + lo_ixml_datavalidations TYPE REF TO if_ixml_node_collection, + lo_ixml_datavalidation_elem TYPE REF TO if_ixml_element, + ls_datavalidation TYPE lty_datavalidation, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lv_datavalidation_range TYPE string, + lt_datavalidation_range TYPE TABLE OF string. + +*--------------------------------------------------------------------* +* §2 We need to read the the file "\\_rels\.rels" because it tells +* us where in this folder structure the data for the workbook +* is located in the xlsx zip-archive +* +* The xlsx Zip-archive has generally the following folder structure: +* <root> | +* |--> _rels +* |--> doc_Props +* |--> xl | +* |--> _rels +* |--> theme +* |--> worksheets +*--------------------------------------------------------------------* + + " Read Workbook Relationships + CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' + EXPORTING + full_name = ip_path + IMPORTING + stripped_name = lv_stripped_name + file_path = lv_dirname. + CONCATENATE lv_dirname '_rels/' lv_stripped_name '.rels' + INTO lv_rels_worksheet_path. + TRY. " +#222 _rels/xxx.rels might not be present. If not found there can be no drawings --> just ignore this section + lo_ixml_rels_worksheet = me->get_ixml_from_zip_archive( lv_rels_worksheet_path ). + lo_ixml_node ?= lo_ixml_rels_worksheet->find_from_name( 'Relationship' ). + CATCH zcx_excel. "#EC NO_HANDLER +#222 + " +#222 No errorhandling necessary - node will be unbound if error occurs + ENDTRY. " +#222 + WHILE lo_ixml_node IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_node + CHANGING + cp_structure = ls_relationship ). + CONCATENATE lv_dirname ls_relationship-target INTO lv_path. + lv_path = resolve_path( lv_path ). + + CASE ls_relationship-type. + WHEN lc_rel_drawing. + " Read Drawings +* Issue # 339 Not all drawings are in the path mentioned below. +* Some Excel elements like textfields (which we don't support ) have a drawing-part in the relationsships +* but no "xl/drawings/_rels/drawing____.xml.rels" part. +* Since we don't support these there is no need to read them. Catching exceptions thrown +* in the "load_worksheet_drawing" shouldn't lead to an abortion of the reading + TRY. + me->load_worksheet_drawing( ip_path = lv_path + io_worksheet = io_worksheet ). + CATCH zcx_excel. "--> then ignore it " SS - inserted weil sonst Fehler aber noch nicht zu assembla übertragen + ENDTRY. + + WHEN lc_rel_printer. + " Read Printer settings + + WHEN lc_rel_hyperlink. + MOVE-CORRESPONDING ls_relationship TO ls_external_hyperlink. + INSERT ls_external_hyperlink INTO TABLE lt_external_hyperlinks. + + WHEN OTHERS. + ENDCASE. + + lo_ixml_node ?= lo_ixml_node->get_next( ). + ENDWHILE. + + + lo_ixml_worksheet = me->get_ixml_from_zip_archive( ip_path ). + + + lo_ixml_tabcolor ?= lo_ixml_worksheet->find_from_name( 'tabColor' ). + IF lo_ixml_tabcolor IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_tabcolor + CHANGING + cp_structure = ls_tabcolor ). +* Theme not supported yet + IF ls_tabcolor-rgb IS NOT INITIAL. + ls_excel_s_tabcolor-rgb = ls_tabcolor-rgb. + io_worksheet->set_tabcolor( ls_excel_s_tabcolor ). + ENDIF. + ENDIF. + + lo_ixml_rows = lo_ixml_worksheet->get_elements_by_tag_name( name = 'row' ). + lo_ixml_iterator = lo_ixml_rows->create_iterator( ). + lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_row_elem IS BOUND. + + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_row_elem + CHANGING + cp_structure = ls_row ). + SPLIT ls_row-spans AT ':' INTO lv_min_col_s lv_max_col_s. + lv_index = lv_max_col_s. + IF lv_index > lv_max_col. + lv_max_col = lv_index. + ENDIF. + lv_cell_row = ls_row-r. + IF ls_row-customheight = '1' + OR ls_row-collapsed = lc_xml_attr_true + OR ls_row-collapsed = lc_xml_attr_true_int + OR ls_row-hidden = lc_xml_attr_true + OR ls_row-hidden = lc_xml_attr_true_int + OR ls_row-outlinelevel > '0'. + lo_row_dimension = io_worksheet->get_row_dimension( lv_cell_row ). + IF ls_row-customheight = '1'. + lo_row_dimension->set_row_height( ls_row-ht ). + ENDIF. + + IF ls_row-collapsed = lc_xml_attr_true + OR ls_row-collapsed = lc_xml_attr_true_int. + lo_row_dimension->set_collapsed( abap_true ). + ENDIF. + + IF ls_row-hidden = lc_xml_attr_true + OR ls_row-hidden = lc_xml_attr_true_int. + lo_row_dimension->set_visible( abap_false ). + ENDIF. + + IF ls_row-outlinelevel > ''. +* outline_level = condense( row-outlineLevel ). "For basis 7.02 and higher + CONDENSE ls_row-outlinelevel. + lv_outline_level = ls_row-outlinelevel. + IF lv_outline_level > 0. + lo_row_dimension->set_outline_level( lv_outline_level ). + ENDIF. + ENDIF. + ENDIF. + + lo_ixml_cells = lo_ixml_row_elem->get_elements_by_tag_name( name = 'c' ). + lo_ixml_iterator2 = lo_ixml_cells->create_iterator( ). + lo_ixml_cell_elem ?= lo_ixml_iterator2->get_next( ). + WHILE lo_ixml_cell_elem IS BOUND. + CLEAR: lv_cell_value, + lv_cell_formula, + lv_style_guid. + + fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_cell_elem CHANGING cp_structure = ls_cell ). + + lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name( name = 'v' ). + + CASE ls_cell-t. + WHEN 's'. " String values are stored as index in shared string table + lv_index = lo_ixml_value_elem->get_value( ) + 1. + READ TABLE shared_strings INTO lv_cell_value INDEX lv_index. + WHEN 'inlineStr'. " inlineStr values are kept in special node + lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name( name = 'is' ). + IF lo_ixml_value_elem IS BOUND. + lv_cell_value = lo_ixml_value_elem->get_value( ). + ENDIF. + WHEN OTHERS. "other types are stored directly + IF lo_ixml_value_elem IS BOUND. + lv_cell_value = lo_ixml_value_elem->get_value( ). + ENDIF. + ENDCASE. + + CLEAR lv_style_guid. + "read style based on index + IF ls_cell-s IS NOT INITIAL. + lv_index = ls_cell-s + 1. + READ TABLE styles INTO lo_excel_style INDEX lv_index. + IF sy-subrc = 0. + lv_style_guid = lo_excel_style->get_guid( ). + ENDIF. + ENDIF. + + lo_ixml_formula_elem = lo_ixml_cell_elem->find_from_name( name = 'f' ). + IF lo_ixml_formula_elem IS BOUND. + lv_cell_formula = lo_ixml_formula_elem->get_value( ). +*--------------------------------------------------------------------* +* Begin of insertion issue#284 - Copied formulae not +*--------------------------------------------------------------------* + DATA: BEGIN OF ls_formula_attributes, + ref TYPE string, + si TYPE i, + t TYPE string, + END OF ls_formula_attributes, + ls_ref_formula TYPE ty_ref_formulae. + + fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_formula_elem CHANGING cp_structure = ls_formula_attributes ). + IF ls_formula_attributes-t = 'shared'. + zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING + i_columnrow = ls_cell-r + IMPORTING + e_column = lv_cell_column + e_row = lv_cell_row ). + + TRY. + CLEAR ls_ref_formula. + ls_ref_formula-sheet = io_worksheet. + ls_ref_formula-row = lv_cell_row. + ls_ref_formula-column = zcl_excel_common=>convert_column2int( lv_cell_column ). + ls_ref_formula-si = ls_formula_attributes-si. + ls_ref_formula-ref = ls_formula_attributes-ref. + ls_ref_formula-formula = lv_cell_formula. + INSERT ls_ref_formula INTO TABLE me->mt_ref_formulae. + CATCH cx_root. + BREAK-POINT. + ENDTRY. + ENDIF. +*--------------------------------------------------------------------* +* End of insertion issue#284 - Copied formulae not +*--------------------------------------------------------------------* + ENDIF. + + IF lv_cell_value IS NOT INITIAL + OR lv_cell_formula IS NOT INITIAL + OR lv_style_guid IS NOT INITIAL. + zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING + i_columnrow = ls_cell-r + IMPORTING + e_column = lv_cell_column + e_row = lv_cell_row ). + io_worksheet->set_cell( ip_column = lv_cell_column " cell_elem Column + ip_row = lv_cell_row " cell_elem row_elem + ip_value = lv_cell_value " cell_elem Value + ip_formula = lv_cell_formula + ip_data_type = ls_cell-t + ip_style = lv_style_guid ). + ENDIF. + lo_ixml_cell_elem ?= lo_ixml_iterator2->get_next( ). + ENDWHILE. + lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + +*--------------------------------------------------------------------* +*#234 - column width not read correctly - begin of coding +* reason - libre office doesn't use SPAN in row - definitions +*--------------------------------------------------------------------* + IF lv_max_col = 0. + lo_ixml_imension_elem = lo_ixml_worksheet->find_from_name( name = 'dimension' ). + IF lo_ixml_imension_elem IS BOUND. + lv_dimension_range = lo_ixml_imension_elem->get_attribute( 'ref' ). + IF lv_dimension_range CS ':'. + REPLACE REGEX '\D+\d+:(\D+)\d+' IN lv_dimension_range WITH '$1'. " Get max column + ELSE. + REPLACE REGEX '(\D+)\d+' IN lv_dimension_range WITH '$1'. " Get max column + ENDIF. + lv_max_col = zcl_excel_common=>convert_column2int( lv_dimension_range ). + ENDIF. + ENDIF. +*--------------------------------------------------------------------* +*#234 - column width not read correctly - end of coding +*--------------------------------------------------------------------* + + "Get the customized column width + lo_ixml_columns = lo_ixml_worksheet->get_elements_by_tag_name( name = 'col' ). + lo_ixml_iterator = lo_ixml_columns->create_iterator( ). + lo_ixml_column_elem ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_column_elem IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_column_elem + CHANGING + cp_structure = ls_column ). + lo_ixml_column_elem ?= lo_ixml_iterator->get_next( ). + IF ls_column-customwidth = lc_xml_attr_true + OR ls_column-customwidth = lc_xml_attr_true_int + OR ls_column-bestfit = lc_xml_attr_true + OR ls_column-bestfit = lc_xml_attr_true_int + OR ls_column-collapsed = lc_xml_attr_true + OR ls_column-collapsed = lc_xml_attr_true_int + OR ls_column-hidden = lc_xml_attr_true + OR ls_column-hidden = lc_xml_attr_true_int + OR ls_column-outlinelevel > '' + OR ls_column-style > ''. + lv_index = ls_column-min. + WHILE lv_index <= ls_column-max AND lv_index <= lv_max_col. + + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_index ). + lo_column_dimension = io_worksheet->get_column_dimension( lv_column_alpha ). + + IF ls_column-customwidth = lc_xml_attr_true + OR ls_column-customwidth = lc_xml_attr_true_int + OR ls_column-width IS NOT INITIAL. "+#234 + lo_column_dimension->set_width( ls_column-width ). + ENDIF. + + IF ls_column-bestfit = lc_xml_attr_true + OR ls_column-bestfit = lc_xml_attr_true_int. + lo_column_dimension->set_auto_size( abap_true ). + ENDIF. + + IF ls_column-collapsed = lc_xml_attr_true + OR ls_column-collapsed = lc_xml_attr_true_int. + lo_column_dimension->set_collapsed( abap_true ). + ENDIF. + + IF ls_column-hidden = lc_xml_attr_true + OR ls_column-hidden = lc_xml_attr_true_int. + lo_column_dimension->set_visible( abap_false ). + ENDIF. + + IF ls_column-outlinelevel > ''. +* outline_level = condense( column-outlineLevel ). + CONDENSE ls_column-outlinelevel. + lv_outline_level = ls_column-outlinelevel. + IF lv_outline_level > 0. + lo_column_dimension->set_outline_level( lv_outline_level ). + ENDIF. + ENDIF. + + IF ls_column-style > ''. + sy-index = ls_column-style + 1. + READ TABLE styles INTO lo_excel_style INDEX sy-index. + DATA: dummy_zexcel_cell_style TYPE zexcel_cell_style. + dummy_zexcel_cell_style = lo_excel_style->get_guid( ). + lo_column_dimension->set_column_style_by_guid( dummy_zexcel_cell_style ). + ENDIF. + + ADD 1 TO lv_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 <= column-max. +* column_alpha = zcl_excel_common=>convert_column2alpha( index ). +* column_dimension = io_worksheet->get_column_dimension( column_alpha ). +* column_dimension->set_visible( abap_false ). +* ADD 1 TO index. +* ENDWHILE. +* ENDIF. + ENDWHILE. + + "Now we need to get information from the sheetView node + lo_ixml_sheetview_elem = lo_ixml_worksheet->find_from_name( name = 'sheetView' ). + fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_sheetview_elem CHANGING cp_structure = ls_sheetview ). + IF ls_sheetview-showgridlines IS INITIAL OR + ls_sheetview-showgridlines = lc_xml_attr_true OR + ls_sheetview-showgridlines = lc_xml_attr_true_int. + "If the attribute is not specified or set to true, we will show grid lines + ls_sheetview-showgridlines = abap_true. + ELSE. + ls_sheetview-showgridlines = abap_false. + ENDIF. + io_worksheet->set_show_gridlines( ls_sheetview-showgridlines ). + + + "Add merge cell information + lo_ixml_mergecells = lo_ixml_worksheet->get_elements_by_tag_name( name = 'mergeCell' ). + lo_ixml_iterator = lo_ixml_mergecells->create_iterator( ). + lo_ixml_mergecell_elem ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_mergecell_elem IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_mergecell_elem + CHANGING + cp_structure = ls_mergecell ). + zcl_excel_common=>convert_range2column_a_row( EXPORTING + i_range = ls_mergecell-ref + IMPORTING + e_column_start = lv_merge_column_start + e_column_end = lv_merge_column_end + e_row_start = lv_merge_row_start + e_row_end = lv_merge_row_end ). + lo_ixml_mergecell_elem ?= lo_ixml_iterator->get_next( ). + io_worksheet->set_merge( EXPORTING + ip_column_start = lv_merge_column_start + ip_column_end = lv_merge_column_end + ip_row = lv_merge_row_start + ip_row_to = lv_merge_row_end ). + ENDWHILE. + + " read sheet format properties + lo_ixml_sheetformatpr_elem = lo_ixml_worksheet->find_from_name( 'sheetFormatPr' ). + IF lo_ixml_sheetformatpr_elem IS NOT INITIAL. + fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_sheetformatpr_elem CHANGING cp_structure = ls_sheetformatpr ). + IF ls_sheetformatpr-customheight = '1'. + lv_height = ls_sheetformatpr-defaultrowheight. + lo_row_dimension = io_worksheet->get_default_row_dimension( ). + lo_row_dimension->set_row_height( lv_height ). + ENDIF. + + " TODO... column + ENDIF. + + " Read in page margins + me->load_worksheet_pagemargins( EXPORTING + io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet ). + + " Read in page setup + lo_ixml_pagesetup_elem = lo_ixml_worksheet->find_from_name( 'pageSetup' ). + IF lo_ixml_pagesetup_elem IS NOT INITIAL. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_pagesetup_elem + CHANGING + cp_structure = ls_pagesetup ). + io_worksheet->sheet_setup->orientation = ls_pagesetup-orientation. + io_worksheet->sheet_setup->scale = ls_pagesetup-scale. + ENDIF. + + " Read header footer + lo_ixml_headerfooter_elem = lo_ixml_worksheet->find_from_name( 'headerFooter' ). + IF lo_ixml_headerfooter_elem IS NOT INITIAL. + fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_headerfooter_elem CHANGING cp_structure = ls_headerfooter ). + io_worksheet->sheet_setup->diff_oddeven_headerfooter = ls_headerfooter-differentoddeven. + + lo_ixml_hf_value_elem = lo_ixml_headerfooter_elem->find_from_name( 'oddFooter' ). + IF lo_ixml_hf_value_elem IS NOT INITIAL. + ls_odd_footer-left_value = lo_ixml_hf_value_elem->get_value( ). + ENDIF. + +* 2do§1 Header/footer + " TODO.. get the rest. + + io_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_odd_header + ip_odd_footer = ls_odd_footer + ip_even_header = ls_even_header + ip_even_footer = ls_even_footer ). + + ENDIF. + + " Start fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 + " Read pane + lo_ixml_pane_elem = lo_ixml_sheetview_elem->find_from_name( name = 'pane' ). + IF lo_ixml_pane_elem IS BOUND. + fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_pane_elem CHANGING cp_structure = ls_excel_pane ). + " Issue #194 + " Replace REGEX with method from the common class + zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING + i_columnrow = ls_excel_pane-topleftcell + IMPORTING + e_column = lv_pane_cell_col_a " Cell Column + e_row = lv_pane_cell_row ). " Natural number + lv_pane_cell_col = zcl_excel_common=>convert_column2int( lv_pane_cell_col_a ). + SUBTRACT 1 FROM: lv_pane_cell_col, + lv_pane_cell_row. + IF lv_pane_cell_col > 0 + AND lv_pane_cell_row > 0. + io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row + ip_num_columns = lv_pane_cell_col ). + ELSEIF lv_pane_cell_row > 0. + io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row ). + ELSE. + io_worksheet->freeze_panes( ip_num_columns = lv_pane_cell_col ). + ENDIF. + ENDIF. + " End fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 + + " Start fix 276 Read data validations + lo_ixml_datavalidations = lo_ixml_worksheet->get_elements_by_tag_name( name = 'dataValidation' ). + lo_ixml_iterator = lo_ixml_datavalidations->create_iterator( ). + lo_ixml_datavalidation_elem ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_datavalidation_elem IS BOUND. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_datavalidation_elem + CHANGING + cp_structure = ls_datavalidation ). + CLEAR lo_ixml_formula_elem. + lo_ixml_formula_elem = lo_ixml_datavalidation_elem->find_from_name( name = 'formula1' ). + IF lo_ixml_formula_elem IS BOUND. + ls_datavalidation-formula1 = lo_ixml_formula_elem->get_value( ). + ENDIF. + CLEAR lo_ixml_formula_elem. + lo_ixml_formula_elem = lo_ixml_datavalidation_elem->find_from_name( name = 'formula2' ). + IF lo_ixml_formula_elem IS BOUND. + ls_datavalidation-formula2 = lo_ixml_formula_elem->get_value( ). + ENDIF. + SPLIT ls_datavalidation-sqref AT space INTO TABLE lt_datavalidation_range. + LOOP AT lt_datavalidation_range INTO lv_datavalidation_range. + zcl_excel_common=>convert_range2column_a_row( EXPORTING + i_range = lv_datavalidation_range + IMPORTING + e_column_start = ls_datavalidation-cell_column + e_column_end = ls_datavalidation-cell_column_to + e_row_start = ls_datavalidation-cell_row + e_row_end = ls_datavalidation-cell_row_to ). + lo_data_validation = io_worksheet->add_new_data_validation( ). + lo_data_validation->type = ls_datavalidation-type. + lo_data_validation->allowblank = ls_datavalidation-allowblank. + lo_data_validation->showinputmessage = ls_datavalidation-showinputmessage. + lo_data_validation->showerrormessage = ls_datavalidation-showerrormessage. + lo_data_validation->showdropdown = ls_datavalidation-showdropdown. + lo_data_validation->operator = ls_datavalidation-operator. + lo_data_validation->formula1 = ls_datavalidation-formula1. + lo_data_validation->formula2 = ls_datavalidation-formula2. + lo_data_validation->prompttitle = ls_datavalidation-prompttitle. + lo_data_validation->prompt = ls_datavalidation-prompt. + lo_data_validation->errortitle = ls_datavalidation-errortitle. + lo_data_validation->error = ls_datavalidation-error. + lo_data_validation->errorstyle = ls_datavalidation-errorstyle. + lo_data_validation->cell_row = ls_datavalidation-cell_row. + lo_data_validation->cell_row_to = ls_datavalidation-cell_row_to. + lo_data_validation->cell_column = ls_datavalidation-cell_column. + lo_data_validation->cell_column_to = ls_datavalidation-cell_column_to. + ENDLOOP. + lo_ixml_datavalidation_elem ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + " End fix 276 Read data validations + + " Read hyperlinks + TRY. + me->load_worksheet_hyperlinks( io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet + it_external_hyperlinks = lt_external_hyperlinks ). + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. + + TRY. + me->fill_row_outlines( io_worksheet = io_worksheet ). + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. + + +ENDMETHOD. + + + + + + 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 'true', + lc_xml_attr_true_int TYPE string VALUE '1'. + CONSTANTS: lc_rel_chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', + lc_rel_image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'. + + 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. + + " Read Workbook Relationships + CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' + EXPORTING + full_name = ip_path + IMPORTING + stripped_name = stripped_name + file_path = dirname. + CONCATENATE dirname '_rels/' stripped_name '.rels' + INTO rels_drawing_path. + rels_drawing_path = resolve_path( rels_drawing_path ). + rels_drawing = me->get_ixml_from_zip_archive( rels_drawing_path ). + node ?= rels_drawing->find_from_name( 'Relationship' ). + 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->get_from_zip_archive( path ). "------------> This is for template usage + + path2 = path. + zcl_excel_common=>split_file( EXPORTING ip_file = path2 + IMPORTING ep_extension = file_ext2 ). + rel_drawing-file_ext = file_ext2. + + "-------------Added by Alessandro Iannacci - Should load graph xml + CASE relationship-type. + WHEN lc_rel_chart. + "Read chart xml + rel_drawing-content_xml = me->get_ixml_from_zip_archive( path ). + WHEN OTHERS. + ENDCASE. + "---------------------------- + + + APPEND rel_drawing TO rel_drawings. + + node ?= node->get_next( ). + ENDWHILE. + + drawing = me->get_ixml_from_zip_archive( ip_path ). + +* one-cell anchor ************** + anchors = drawing->get_elements_by_tag_name( name = 'oneCellAnchor' namespace = 'xdr' ). + coll_length = anchors->get_length( ). + iterator = anchors->create_iterator( ). + DO coll_length TIMES. + anchor_elem ?= iterator->get_next( ). + + CALL METHOD me->load_drawing_anchor + EXPORTING + io_anchor_element = anchor_elem + io_worksheet = io_worksheet + it_related_drawings = rel_drawings. + + ENDDO. + +* two-cell anchor ****************** + anchors = drawing->get_elements_by_tag_name( name = 'twoCellAnchor' namespace = 'xdr' ). + coll_length = anchors->get_length( ). + iterator = anchors->create_iterator( ). + DO coll_length TIMES. + anchor_elem ?= iterator->get_next( ). + + CALL METHOD me->load_drawing_anchor + EXPORTING + io_anchor_element = anchor_elem + io_worksheet = io_worksheet + it_related_drawings = rel_drawings. + + ENDDO. + + endmethod. + + + + + + + METHOD load_worksheet_hyperlinks. + + DATA: lo_ixml_hyperlinks TYPE REF TO if_ixml_node_collection, + lo_ixml_hyperlink TYPE REF TO if_ixml_element, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lv_row TYPE zexcel_cell_row, + lv_column TYPE zexcel_cell_column_alpha, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink, + lv_value TYPE zexcel_cell_value. + + DATA: BEGIN OF ls_hyperlink, + ref TYPE string, + display TYPE string, + location TYPE string, + tooltip TYPE string, + r_id TYPE string, + END OF ls_hyperlink. + + FIELD-SYMBOLS: <ls_external_hyperlink> LIKE LINE OF it_external_hyperlinks. + + lo_ixml_hyperlinks = io_ixml_worksheet->get_elements_by_tag_name( name = 'hyperlink' ). + lo_ixml_iterator = lo_ixml_hyperlinks->create_iterator( ). + lo_ixml_hyperlink ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_hyperlink IS BOUND. + + CLEAR ls_hyperlink. + CLEAR lo_hyperlink. + + ls_hyperlink-ref = lo_ixml_hyperlink->get_attribute_ns( 'ref' ). + ls_hyperlink-display = lo_ixml_hyperlink->get_attribute_ns( 'display' ). + ls_hyperlink-location = lo_ixml_hyperlink->get_attribute_ns( 'location' ). + ls_hyperlink-tooltip = lo_ixml_hyperlink->get_attribute_ns( 'tooltip' ). + ls_hyperlink-r_id = lo_ixml_hyperlink->get_attribute( name = 'id' + namespace = 'r' ). + IF ls_hyperlink-r_id IS INITIAL. " Internal link + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = ls_hyperlink-location ). + ELSE. " External link + READ TABLE it_external_hyperlinks ASSIGNING <ls_external_hyperlink> WITH TABLE KEY id = ls_hyperlink-r_id. + IF sy-subrc = 0. + lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = <ls_external_hyperlink>-target ). + ENDIF. + ENDIF. + IF lo_hyperlink IS BOUND. " because of unsupported external links + + zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING + i_columnrow = ls_hyperlink-ref + IMPORTING + e_row = lv_row + e_column = lv_column ). +* Currently it is not allowed to pass a hyperlink w/o text, but text has already been read. +* So just reread it and be done with it + io_worksheet->get_cell( EXPORTING + ip_column = lv_column + ip_row = lv_row + IMPORTING + ep_value = lv_value ). + io_worksheet->set_cell( ip_column = lv_column + ip_row = lv_row + ip_value = lv_value + ip_hyperlink = lo_hyperlink ). + ENDIF. + + lo_ixml_hyperlink ?= lo_ixml_iterator->get_next( ). + + ENDWHILE. + + +ENDMETHOD. + + + + + + METHOD load_worksheet_pagemargins. + + TYPES: BEGIN OF lty_page_margins, + footer TYPE string, + header TYPE string, + bottom TYPE string, + top TYPE string, + right TYPE string, + left TYPE string, + END OF lty_page_margins. + + DATA:lo_ixml_pagemargins_elem TYPE REF TO if_ixml_element, + ls_pagemargins TYPE lty_page_margins. + + + lo_ixml_pagemargins_elem = io_ixml_worksheet->find_from_name( 'pageMargins' ). + IF lo_ixml_pagemargins_elem IS NOT INITIAL. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_pagemargins_elem + CHANGING + cp_structure = ls_pagemargins ). + io_worksheet->sheet_setup->margin_bottom = zcl_excel_common=>excel_string_to_number( ls_pagemargins-bottom ). + io_worksheet->sheet_setup->margin_footer = zcl_excel_common=>excel_string_to_number( ls_pagemargins-footer ). + io_worksheet->sheet_setup->margin_header = zcl_excel_common=>excel_string_to_number( ls_pagemargins-header ). + io_worksheet->sheet_setup->margin_left = zcl_excel_common=>excel_string_to_number( ls_pagemargins-left ). + io_worksheet->sheet_setup->margin_right = zcl_excel_common=>excel_string_to_number( ls_pagemargins-right ). + io_worksheet->sheet_setup->margin_top = zcl_excel_common=>excel_string_to_number( ls_pagemargins-top ). + ENDIF. + +ENDMETHOD. + + + + + METHOD read_from_applserver. + + DATA: lv_filelength TYPE i, + lt_binary_data TYPE STANDARD TABLE OF x255 WITH NON-UNIQUE DEFAULT KEY, + ls_binary_data LIKE LINE OF lt_binary_data, + lv_filename TYPE string, + lv_max_length_line TYPE i, + lv_actual_length_line TYPE i, + lv_errormessage TYPE string. + + MOVE i_filename TO lv_filename. + + DESCRIBE FIELD ls_binary_data LENGTH lv_max_length_line IN BYTE MODE. + OPEN DATASET lv_filename FOR INPUT IN BINARY MODE. + IF sy-subrc <> 0. + lv_errormessage = 'A problem occured when reading the file'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + WHILE sy-subrc = 0. + + READ DATASET lv_filename INTO ls_binary_data MAXIMUM LENGTH lv_max_length_line ACTUAL LENGTH lv_actual_length_line. + APPEND ls_binary_data TO lt_binary_data. + lv_filelength = lv_filelength + lv_actual_length_line. + + ENDWHILE. + CLOSE DATASET lv_filename. + +*--------------------------------------------------------------------* +* Binary data needs to be provided as XSTRING for further processing +*--------------------------------------------------------------------* + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filelength + IMPORTING + buffer = r_excel_data + TABLES + binary_tab = lt_binary_data. + ENDMETHOD. + + + + + + METHOD read_from_local_file. + DATA: lv_filelength TYPE i, + lt_binary_data TYPE STANDARD TABLE OF x255 WITH NON-UNIQUE DEFAULT KEY, + ls_binary_data LIKE LINE OF lt_binary_data, + lv_filename TYPE string, + lv_errormessage TYPE string. + + MOVE i_filename TO lv_filename. + + cl_gui_frontend_services=>gui_upload( EXPORTING + filename = lv_filename + filetype = 'BIN' " We are basically working with zipped directories --> force binary read + IMPORTING + filelength = lv_filelength + CHANGING + data_tab = lt_binary_data + 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 <> 0. + lv_errormessage = 'A problem occured when reading the file'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + +*--------------------------------------------------------------------* +* Binary data needs to be provided as XSTRING for further processing +*--------------------------------------------------------------------* + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filelength + IMPORTING + buffer = r_excel_data + TABLES + binary_tab = lt_binary_data. + + ENDMETHOD. + + + + + method RESOLVE_PATH. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 Determine whether the replacement should be done +* iterative to allow /../../.. or something alike +* 2do§2 Determine whether /./ has to be supported as well +* 2do§3 Create unit-test for this method +* +* Please don't just delete these ToDos if they are not +* needed but leave a comment that states this +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-11 +* - ... +* changes: replaced previous coding by regular expression +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* §1 This routine will receive a path, that may have a relative pathname (/../) included somewhere +* The output should be a resolved path without relative references +* Example: Input xl/worksheets/../drawings/drawing1.xml +* Output xl/drawings/drawing1.xml +*--------------------------------------------------------------------* + + rp_result = ip_path. +*--------------------------------------------------------------------* +* §1 Remove relative pathnames +*--------------------------------------------------------------------* +* Regular expression [^/]*/\.\./ +* [^/]* --> any number of characters other than / +* followed by /\.\./ --> the sequence /../ +* ==> worksheets/../ will be found in the example +*--------------------------------------------------------------------* + REPLACE REGEX '[^/]*/\.\./' IN rp_result WITH ``. + + + endmethod. + + + method RESOLVE_REFERENCED_FORMULAE. + TYPES: BEGIN OF ty_referenced_cells, + sheet TYPE REF TO zcl_excel_worksheet, + si TYPE i, + row_from TYPE i, + row_to TYPE i, + col_from TYPE i, + col_to TYPE i, + formula TYPE string, + ref_cell TYPE char10, + END OF ty_referenced_cells. + + DATA: ls_ref_formula LIKE LINE OF me->mt_ref_formulae, + lts_referenced_cells TYPE SORTED TABLE OF ty_referenced_cells WITH NON-UNIQUE KEY sheet si row_from row_to col_from col_to, + ls_referenced_cell LIKE LINE OF lts_referenced_cells, + lv_col_from TYPE zexcel_cell_column_alpha, + lv_col_to TYPE zexcel_cell_column_alpha, + lv_resulting_formula TYPE string, + lv_current_cell TYPE char10. + + + me->mt_ref_formulae = me->mt_ref_formulae. + +*--------------------------------------------------------------------* +* Get referenced Cells, Build ranges for easy lookup +*--------------------------------------------------------------------* + LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref <> space. + + CLEAR ls_referenced_cell. + ls_referenced_cell-sheet = ls_ref_formula-sheet. + ls_referenced_cell-si = ls_ref_formula-si. + ls_referenced_cell-formula = ls_ref_formula-formula. + + TRY. + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = ls_ref_formula-ref + IMPORTING e_column_start = lv_col_from + e_column_end = lv_col_to + e_row_start = ls_referenced_cell-row_from + e_row_end = ls_referenced_cell-row_to ). + ls_referenced_cell-col_from = zcl_excel_common=>convert_column2int( lv_col_from ). + ls_referenced_cell-col_to = zcl_excel_common=>convert_column2int( lv_col_to ). + + + CLEAR ls_referenced_cell-ref_cell. + TRY. + ls_referenced_cell-ref_cell(3) = zcl_excel_common=>convert_column2alpha( ls_ref_formula-column ). + ls_referenced_cell-ref_cell+3 = ls_ref_formula-row. + CONDENSE ls_referenced_cell-ref_cell NO-GAPS. + CATCH zcx_excel. + ENDTRY. + + INSERT ls_referenced_cell INTO TABLE lts_referenced_cells. + CATCH zcx_excel. + ENDTRY. + + ENDLOOP. + +* break x0009004. +*--------------------------------------------------------------------* +* For each referencing cell determine the referenced cell +* and resolve the formula +*--------------------------------------------------------------------* + LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref = space. + + + CLEAR lv_current_cell. + TRY. + lv_current_cell(3) = zcl_excel_common=>convert_column2alpha( ls_ref_formula-column ). + lv_current_cell+3 = ls_ref_formula-row. + CONDENSE lv_current_cell NO-GAPS. + CATCH zcx_excel. + ENDTRY. + + LOOP AT lts_referenced_cells INTO ls_referenced_cell WHERE sheet = ls_ref_formula-sheet + AND si = ls_ref_formula-si + AND row_from <= ls_ref_formula-row + AND row_to >= ls_ref_formula-row + AND col_from <= ls_ref_formula-column + AND col_to >= ls_ref_formula-column. + + TRY. + + lv_resulting_formula = zcl_excel_common=>determine_resulting_formula( iv_reference_cell = ls_referenced_cell-ref_cell + iv_reference_formula = ls_referenced_cell-formula + iv_current_cell = lv_current_cell ). + + ls_referenced_cell-sheet->set_cell_formula( ip_column = ls_ref_formula-column + ip_row = ls_ref_formula-row + ip_formula = lv_resulting_formula ). + CATCH zcx_excel. + ENDTRY. + EXIT. + + ENDLOOP. + + ENDLOOP. + endmethod. + + + + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + +* Signal "not found" +class lcx_not_found implementation. + method constructor. + super->constructor( textid = textid previous = previous ). + me->error = error. + endmethod. "constructor + method if_message~get_text. + result = error. + endmethod. "if_message~get_text +endclass. "lcx_not_found IMPLEMENTATION + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + +* Signal for "Not found" +class lcx_not_found definition inheriting from cx_static_check. + public section. + data error type string. + methods constructor + importing error type string + textid type sotr_conc optional + previous type ref to cx_root optional. + methods if_message~get_text redefinition. +endclass. + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + *"* use this source file for your ABAP unit test classes +class lcl_test definition deferred. +class zcl_excel_reader_huge_file definition local friends lcl_test. + +* +class lcl_test definition for testing " #AU Risk_Level Harmless + inheriting from cl_aunit_assert. " #AU Duration Short + + private section. + data: + out type ref to zcl_excel_reader_huge_file, " object under test + excel type ref to zcl_excel, + worksheet type ref to zcl_excel_worksheet. + methods: + setup, + test_number for testing, + test_shared_string for testing, + test_shared_string_missing for testing, + test_inline_string for testing, + test_empty_cells for testing, + test_boolean for testing, + test_style for testing, + test_style_missing for testing, + test_formula for testing, + test_read_shared_strings for testing, + test_skip_to_inexistent for testing, + get_reader importing iv_xml type string returning value(eo_reader) type ref to if_sxml_reader, + assert_value_equals importing iv_row type i default 1 iv_col type i default 1 iv_value type string, + assert_formula_equals importing iv_row type i default 1 iv_col type i default 1 iv_formula type string, + assert_style_equals importing iv_row type i default 1 iv_col type i default 1 iv_style type ZEXCEL_CELL_STYLE, + assert_datatype_equals importing iv_row type i default 1 iv_col type i default 1 iv_datatype type string. + +endclass. "lcl_test DEFINITION + +* +class lcl_test implementation. + +* + method test_number. + data lo_reader type ref to if_sxml_reader. + lo_reader = get_reader( + `<c r="A1" t="n"><v>17</v></c>` + ). + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + assert_value_equals( `17` ). + assert_datatype_equals( `n` ). + endmethod. "test_shared_string + +* + method test_shared_string. + data lo_reader type ref to if_sxml_reader. + append `Test1` to out->shared_strings. + append `Test2` to out->shared_strings. + lo_reader = get_reader( + `<c r="A1" t="s"><v>1</v></c>` + ). + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + assert_value_equals( `Test2` ). + assert_datatype_equals( `s` ). + endmethod. "test_shared_string +* + method test_shared_string_missing. + + data: lo_reader type ref to if_sxml_reader, + lo_ex type ref to lcx_not_found, + lv_text type string. + append `Test` to out->shared_strings. + lo_reader = get_reader( + `<c r="A1" t="s"><v>1</v></c>` + ). + + try. + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + fail(`Index to non-existent shared string should give an error`). + catch lcx_not_found into lo_ex. + lv_text = lo_ex->get_text( ). " >>> May inspect the message in the debugger + endtry. + + endmethod. +* + method test_inline_string. + data lo_reader type ref to if_sxml_reader. + lo_reader = get_reader( + `<c r="A1" t="inlineStr"><is><t>Alpha</t></is></c>` + ). + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + assert_value_equals( `Alpha` ). + assert_datatype_equals( `inlineStr` ). + endmethod. "test_inline_string + +* + method test_boolean. + data lo_reader type ref to if_sxml_reader. + lo_reader = get_reader( + `<c r="A1" t="b"><v>1</v></c>` + ). + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + assert_value_equals( `1` ). + assert_datatype_equals( `b` ). + endmethod. "test_boolean + +* + method test_formula. + data lo_reader type ref to if_sxml_reader. + lo_reader = get_reader( + `<c r="A1" t="n"><f>A2*A2</f></c>` + ). + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + assert_formula_equals( `A2*A2` ). + assert_datatype_equals( `n` ). + endmethod. "test_formula + +* + method test_empty_cells. + +* There is no need to store an empty cell in the ABAP worksheet structure + + data: lo_reader type ref to if_sxml_reader, + lo_ex type ref to lcx_not_found, + lv_text type string. + append `` to out->shared_strings. + append `t` to out->shared_strings. + lo_reader = get_reader( + `<c r="A1" t="s"><v>0</v></c>` & + `<c r="A2" t="inlineStr"><is><t></t></is></c>` & + `<c r="A3" t="s"><v>1</v></c>` + ). + + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + + assert_value_equals( iv_row = 1 iv_col = 1 iv_value = `` ). + assert_value_equals( iv_row = 2 iv_col = 1 iv_value = `` ). + assert_value_equals( iv_row = 3 iv_col = 1 iv_value = `t` ). + + endmethod. + +* + method test_style. + data: + lo_reader type ref to if_sxml_reader, + lo_style type ref to zcl_excel_style, + lv_guid type ZEXCEL_CELL_STYLE. + create object lo_style. + append lo_style to out->styles. + lv_guid = lo_style->get_guid( ). + + lo_reader = get_reader( + `<c r="A1" s="0"><v>18</v></c>` + ). + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + + assert_style_equals( lv_guid ). + + endmethod. "test_style + +* + method test_style_missing. + + data: + lo_reader type ref to if_sxml_reader, + lo_ex type ref to lcx_not_found, + lv_text type string. + + lo_reader = get_reader( + `<c r="A1" s="0"><v>18</v></c>` + ). + + try. + out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). + fail(`Reference to non-existent style should throw an lcx_not_found exception`). + catch lcx_not_found into lo_ex. + lv_text = lo_ex->get_text( ). " >>> May inspect the message in the debugger + endtry. + + endmethod. "test_style + +* + method test_read_shared_strings. + data: lo_c2x type ref to cl_abap_conv_out_ce, + lv_xstring type xstring, + lo_reader type ref to if_sxml_reader, + lt_act type stringtab, + lt_exp type stringtab. + + lo_c2x = cl_abap_conv_out_ce=>create( ). + lo_c2x->convert( exporting data = `<sst><si><t/></si><si><t>Alpha</t></si><si><t>Bravo</t></si></sst>` + importing buffer = lv_xstring ). + lo_reader = cl_sxml_string_reader=>create( lv_xstring ). + append : + `` to lt_exp, + `Alpha` to lt_exp, + `Bravo` to lt_exp. + + lt_act = out->read_shared_strings( lo_reader ). + + assert_equals( act = lt_act + exp = lt_exp ). + + endmethod. + +* + method test_skip_to_inexistent. + data: lo_c2x type ref to cl_abap_conv_out_ce, + lv_xstring type xstring, + lo_reader type ref to if_sxml_reader, + lo_ex type ref to lcx_not_found, + lv_text type string. + + lo_c2x = cl_abap_conv_out_ce=>create( ). + lo_c2x->convert( exporting data = `<sst><si><t/></si><si><t>Alpha</t></si><si><t>Bravo</t></si></sst>` + importing buffer = lv_xstring ). + lo_reader = cl_sxml_string_reader=>create( lv_xstring ). + try. + out->skip_to( iv_element_name = `nonExistingElement` io_reader = lo_reader ). + fail(`Skipping to non-existing element must raise lcx_not_found exception`). + catch lcx_not_found into lo_ex. + lv_text = lo_ex->get_text( ). " May inspect exception text in debugger + endtry. + endmethod. + +* + method get_reader. + data: lv_full type string, + lo_c2x type ref to cl_abap_conv_out_ce, + lv_xstring type xstring. + concatenate `<root><sheetData><row>` iv_xml `</row></sheetData></root>` into lv_full. + lo_c2x = cl_abap_conv_out_ce=>create( ). + lo_c2x->convert( exporting data = lv_full + importing buffer = lv_xstring ). + eo_reader = cl_sxml_string_reader=>create( lv_xstring ). + endmethod. "get_reader +* + method assert_value_equals. + + constants: lc_empty_string type string value is initial. + + field-symbols: <ls_cell_data> type zexcel_s_cell_data, + <lv_value> type string. + + read table worksheet->sheet_content assigning <ls_cell_data> + with table key cell_row = iv_row cell_column = iv_col. + if sy-subrc eq 0. + assign <ls_cell_data>-cell_value to <lv_value>. + else. + assign lc_empty_string to <lv_value>. + endif. + + assert_equals( act = <lv_value> + exp = iv_value ). + + endmethod. "assert_value_equals +** + method assert_formula_equals. + + field-symbols: <ls_cell_data> type zexcel_s_cell_data. + + read table worksheet->sheet_content assigning <ls_cell_data> + with table key cell_row = iv_row cell_column = iv_col. + assert_subrc( sy-subrc ). + + assert_equals( act = <ls_cell_data>-cell_formula + exp = iv_formula ). + + endmethod. "assert_formula_equals +* + method assert_style_equals. + + field-symbols: <ls_cell_data> type zexcel_s_cell_data. + + read table worksheet->sheet_content assigning <ls_cell_data> + with table key cell_row = iv_row cell_column = iv_col. + assert_subrc( sy-subrc ). + + assert_equals( act = <ls_cell_data>-cell_style + exp = iv_style ). + + endmethod. +* + method assert_datatype_equals. + + field-symbols: <ls_cell_data> type zexcel_s_cell_data. + + read table worksheet->sheet_content assigning <ls_cell_data> + with table key cell_row = iv_row cell_column = iv_col. + assert_subrc( sy-subrc ). + + assert_equals( act = <ls_cell_data>-data_type + exp = iv_datatype ). + + endmethod. "assert_datatype_equals + method setup. + create object out. + create object excel. + create object worksheet + exporting + ip_excel = excel. + endmethod. "setup +endclass. "lcl_test IMPLEMENTATION + + + + + + + + + + + + + + + + method FILL_CELL_FROM_ATTRIBUTES. + + while io_reader->node_type ne c_end_of_stream. + io_reader->next_attribute( ). + if io_reader->node_type ne c_attribute. + exit. + endif. + case io_reader->name. + when `t`. + es_cell-datatype = io_reader->value. + when `s`. + if io_reader->value is not initial. + es_cell-style = get_style( io_reader->value ). + endif. + when `r`. + es_cell-coord = get_cell_coord( io_reader->value ). + endcase. + endwhile. + +endmethod. + + + + + method GET_CELL_COORD. + + zcl_excel_common=>convert_columnrow2column_a_row( + exporting + i_columnrow = iv_coord + importing + e_column = es_coord-column + e_row = es_coord-row + ). + +endmethod. + + + + + + method GET_SHARED_STRING. + data: lv_tabix type i, + lv_error type string. + lv_tabix = iv_index + 1. + read table shared_strings into ev_value index lv_tabix. + if sy-subrc ne 0. + concatenate 'Entry ' iv_index ' not found in Shared String Table' into lv_error. + raise exception type lcx_not_found + exporting + error = lv_error. + endif. +endmethod. + + + + + + method GET_STYLE. + + data: lv_tabix type i, + lo_style type ref to zcl_excel_style, + lv_error type string. + + if gs_buffer_style-index ne iv_index. + lv_tabix = iv_index + 1. + read table styles into lo_style index lv_tabix. + if sy-subrc ne 0. + concatenate 'Entry ' iv_index ' not found in Style Table' into lv_error. + raise exception type lcx_not_found + exporting + error = lv_error. + else. + gs_buffer_style-index = iv_index. + gs_buffer_style-guid = lo_style->get_guid( ). + endif. + endif. + + ev_style_guid = gs_buffer_style-guid. + +endmethod. + + + + + + method GET_SXML_READER. + + data: lv_xml type xstring. + + lv_xml = get_from_zip_archive( iv_path ). + eo_reader = cl_sxml_string_reader=>create( lv_xml ). + +endmethod. + + + method LOAD_SHARED_STRINGS. + + data: lo_reader type ref to if_sxml_reader. + + lo_reader = get_sxml_reader( ip_path ). + + shared_strings = read_shared_strings( lo_reader ). + +endmethod. + + + method LOAD_WORKSHEET. + + data: lo_reader type ref to if_sxml_reader. + + lo_reader = get_sxml_reader( ip_path ). + + read_worksheet_data( io_reader = lo_reader + io_worksheet = io_worksheet ). + +endmethod. + + + + + method PUT_CELL_TO_WORKSHEET. + check is_cell-value is not initial + or is_cell-formula is not initial + or is_cell-style is not initial. + call method io_worksheet->set_cell + exporting + ip_column = is_cell-column + ip_row = is_cell-row + ip_value = is_cell-value + ip_formula = is_cell-formula + ip_data_type = is_cell-datatype + ip_style = is_cell-style. +endmethod. + + + + + method READ_SHARED_STRINGS. + + while io_reader->node_type ne c_end_of_stream. + io_reader->next_node( ). + if io_reader->node_type eq c_element_close and + io_reader->name eq `t`. + append io_reader->value to et_shared_strings. + endif. + endwhile. + +endmethod. + + + + + + method READ_WORKSHEET_DATA. + + data: ls_cell type t_cell. + +* Skip to <sheetData> element + skip_to( iv_element_name = `sheetData` io_reader = io_reader ). + +* Main loop: Evaluate the <c> elements and its children + while io_reader->node_type ne c_end_of_stream. + io_reader->next_node( ). + case io_reader->node_type. + when c_element_open. + if io_reader->name eq `c`. + ls_cell = fill_cell_from_attributes( io_reader ). + endif. + when c_node_value. + case io_reader->name. + when `f`. + ls_cell-formula = io_reader->value. + when `v`. + if ls_cell-datatype eq `s`. + ls_cell-value = get_shared_string( io_reader->value ). + else. + ls_cell-value = io_reader->value. + endif. + when `t` or `is`. + ls_cell-value = io_reader->value. + endcase. + when c_element_close. + case io_reader->name. + when `c`. + put_cell_to_worksheet( is_cell = ls_cell io_worksheet = io_worksheet ). + when `sheetData`. + exit. + endcase. + endcase. + endwhile. + +endmethod. + + + + + + method SKIP_TO. + + data: lv_error type string. + +* Skip forward to given element + while io_reader->name ne iv_element_name or + io_reader->node_type ne c_element_open. + io_reader->next_node( ). + if io_reader->node_type = c_end_of_stream. + concatenate 'XML error: Didn''t find element <' iv_element_name '>' into lv_error. + raise exception type lcx_not_found + exporting + error = lv_error. + endif. + endwhile. + + +endmethod. + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + METHOD load_vbaproject. + + DATA lv_content TYPE xstring. + + lv_content = me->get_from_zip_archive( ip_path ). + + ip_excel->zif_excel_book_vba_project~set_vbaproject( lv_content ). + + ENDMETHOD. + + + method LOAD_WORKBOOK. + super->load_workbook( EXPORTING iv_workbook_full_filename = iv_workbook_full_filename + io_excel = io_excel ). + + CONSTANTS: lc_vba_project TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject'. + + DATA: rels_workbook_path TYPE string, + rels_workbook TYPE REF TO if_ixml_document, + path TYPE string, + node TYPE REF TO if_ixml_element, + workbook TYPE REF TO if_ixml_document, + stripped_name TYPE chkfile, + dirname TYPE string, + relationship TYPE t_relationship, + fileversion TYPE t_fileversion, + workbookpr TYPE t_workbookpr. + + FIELD-SYMBOLS: <worksheet> TYPE t_relationship. + + CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' + EXPORTING + full_name = iv_workbook_full_filename + IMPORTING + stripped_name = stripped_name + file_path = dirname. + + " Read Workbook Relationships + CONCATENATE dirname '_rels/' stripped_name '.rels' + INTO rels_workbook_path. + + rels_workbook = me->get_ixml_from_zip_archive( rels_workbook_path ). + + node ?= rels_workbook->find_from_name( 'Relationship' ). + WHILE node IS BOUND. + me->fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = relationship ). + + CASE relationship-type. + WHEN lc_vba_project. + " Read VBA binary + CONCATENATE dirname relationship-target INTO path. + me->load_vbaproject( ip_path = path + ip_excel = io_excel ). + WHEN OTHERS. + ENDCASE. + + node ?= node->get_next( ). + ENDWHILE. + + " Read Workbook codeName + workbook = me->get_ixml_from_zip_archive( iv_workbook_full_filename ). + node ?= workbook->find_from_name( 'fileVersion' ). + IF node IS BOUND. + + fill_struct_from_attributes( EXPORTING ip_element = node + CHANGING cp_structure = fileversion ). + + io_excel->zif_excel_book_vba_project~set_codename( fileversion-codename ). + ENDIF. + + " Read Workbook codeName + workbook = me->get_ixml_from_zip_archive( iv_workbook_full_filename ). + node ?= workbook->find_from_name( 'workbookPr' ). + IF node IS BOUND. + + fill_struct_from_attributes( EXPORTING ip_element = node + CHANGING cp_structure = workbookpr ). + + io_excel->zif_excel_book_vba_project~set_codename_pr( workbookpr-codename ). + ENDIF. + + endmethod. + + + method LOAD_WORKSHEET. + + super->load_worksheet( EXPORTING ip_path = ip_path + io_worksheet = io_worksheet ). + + DATA: path TYPE string, + node TYPE REF TO if_ixml_element, + worksheet TYPE REF TO if_ixml_document, + sheetpr TYPE t_sheetpr. + + +* " Read Workbook codeName +* workbook = me->get_ixml_from_zip_archive( ip_path ). +* node ?= workbook->find_from_name( 'fileVersion' ). +* IF node IS BOUND. +* +* fill_struct_from_attributes( EXPORTING ip_element = node +* CHANGING cp_structure = fileversion ). +* +* IO_WORKSHEET->zif_excel_book_vba_project~set_codename( fileversion-codename ). +* ENDIF. + + " Read Workbook codeName + worksheet = me->get_ixml_from_zip_archive( ip_path ). + node ?= worksheet->find_from_name( 'sheetPr' ). + IF node IS BOUND. + + fill_struct_from_attributes( EXPORTING ip_element = node + CHANGING cp_structure = sheetpr ). + + io_worksheet->zif_excel_sheet_vba_project~set_codename_pr( sheetpr-codename ). + ENDIF. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + METHOD is_security_enabled. + IF lockrevision EQ abap_true OR lockstructure EQ abap_true OR lockwindows EQ abap_true. + ep_security_enabled = abap_true. + ENDIF. +ENDMETHOD. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + orientation = me->c_orientation_default. + +* default margins + margin_bottom = '0.75'. + margin_footer = '0.3'. + margin_header = '0.3'. + margin_left = '0.7'. + margin_right = '0.7'. + margin_top = '0.75'. + +* clear page settings + CLEAR: black_and_white, + cell_comments, + copies, + draft, + errors, + first_page_number, + fit_to_page, + fit_to_height, + fit_to_width, + horizontal_dpi, + orientation, + page_order, + paper_height, + paper_size, + paper_width, + scale, + use_first_page_num, + use_printer_defaults, + vertical_dpi. + endmethod. + + + + + + + method GET_HEADER_FOOTER_STRING. +* ---------------------------------------------------------------------- + DATA: lc_marker_left(2) TYPE c VALUE '&L' + , lc_marker_right(2) TYPE c VALUE '&R' + , lc_marker_center(2) TYPE c VALUE '&C' + , lv_value TYPE string + . +* ---------------------------------------------------------------------- + IF ep_odd_header IS SUPPLIED. + + IF me->odd_header-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_odd_header. + ENDIF. + + IF me->odd_header-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'CENTER' ). + CONCATENATE ep_odd_header lc_marker_center lv_value INTO ep_odd_header. + ENDIF. + + IF me->odd_header-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'RIGHT' ). + CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_odd_header. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- + IF ep_odd_footer IS SUPPLIED. + + IF me->odd_footer-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_odd_footer. + ENDIF. + + IF me->odd_footer-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'CENTER' ). + CONCATENATE ep_odd_footer lc_marker_center lv_value INTO ep_odd_footer. + ENDIF. + + IF me->odd_footer-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'RIGHT' ). + CONCATENATE ep_odd_footer lc_marker_right lv_value INTO ep_odd_footer. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- + IF ep_even_header IS SUPPLIED. + + IF me->even_header-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_even_header. + ENDIF. + + IF me->even_header-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'CENTER' ). + CONCATENATE ep_even_header lc_marker_center lv_value INTO ep_even_header. + ENDIF. + + IF me->even_header-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'RIGHT' ). + CONCATENATE ep_even_header lc_marker_right lv_value INTO ep_even_header. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- + IF ep_even_footer IS SUPPLIED. + + IF me->even_footer-left_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'LEFT' ). + CONCATENATE lc_marker_left lv_value INTO ep_even_footer. + ENDIF. + + IF me->even_footer-center_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'CENTER' ). + CONCATENATE ep_even_footer lc_marker_center lv_value INTO ep_even_footer. + ENDIF. + + IF me->even_footer-right_value IS NOT INITIAL. + lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'RIGHT' ). + CONCATENATE ep_even_footer lc_marker_right lv_value INTO ep_even_footer. + ENDIF. + + ENDIF. +* ---------------------------------------------------------------------- + endmethod. + + + + + + method PROCESS_HEADER_FOOTER. + +* ---------------------------------------------------------------------- +* Only Basic font/text formatting possible: +* Bold (yes / no), Font Type, Font Size + + DATA: lv_fname(12) TYPE c + , lv_string TYPE string + . + + FIELD-SYMBOLS: <lv_value> TYPE string + , <ls_font> TYPE zexcel_s_style_font + . + +* ---------------------------------------------------------------------- + CONCATENATE ip_side '_VALUE' INTO lv_fname. + ASSIGN COMPONENT lv_fname OF STRUCTURE ip_header TO <lv_value>. + + CONCATENATE ip_side '_FONT' INTO lv_fname. + ASSIGN COMPONENT lv_fname OF STRUCTURE ip_header TO <ls_font>. + + IF <ls_font> IS ASSIGNED AND <lv_value> IS ASSIGNED. + + IF <ls_font>-name IS NOT INITIAL. + CONCATENATE '&"' <ls_font>-name ',' INTO rv_processed_string. + ELSE. + rv_processed_string = '&"-,'. + ENDIF. + + IF <ls_font>-bold = abap_true. + CONCATENATE rv_processed_string 'Bold"' INTO rv_processed_string. + ELSE. + CONCATENATE rv_processed_string 'Standard"' INTO rv_processed_string. + ENDIF. + + IF <ls_font>-size IS NOT INITIAL. + lv_string = <ls_font>-size. + CONCATENATE rv_processed_string '&' lv_string INTO rv_processed_string. + ENDIF. + + CONCATENATE rv_processed_string <lv_value> INTO rv_processed_string. + + ENDIF. +* ---------------------------------------------------------------------- + + endmethod. + + + + + + + method SET_HEADER_FOOTER. + +* Only Basic font/text formatting possible: +* Bold (yes / no), Font Type, Font Size +* +* usefull placeholders, which can be used in header/footer value strings +* '&P' - page number +* '&N' - total number of pages +* '&D' - Date +* '&T' - Time +* '&F' - File Name +* '&Z' - Path +* '&A' - Sheet name +* new line via class constant CL_ABAP_CHAR_UTILITIES=>newline +* +* Example Value String 'page &P of &N' +* +* DO NOT USE &L , &C or &R which automatically created as position markers + + me->odd_header = ip_odd_header. + me->odd_footer = ip_odd_footer. + me->even_header = ip_even_header. + me->even_footer = ip_even_footer. + + IF me->even_header IS NOT INITIAL OR me->even_footer IS NOT INITIAL. + me->diff_oddeven_headerfooter = abap_true. + ENDIF. + + + endmethod. + + + + + + + + + + method SET_PAGE_MARGINS. + DATA: lv_coef TYPE f, + lv_unit TYPE string. + + lv_unit = ip_unit. + TRANSLATE lv_unit TO UPPER CASE. + + CASE lv_unit. + WHEN 'IN'. lv_coef = 1. + WHEN 'CM'. lv_coef = '0.393700787'. + WHEN 'MM'. lv_coef = '0.0393700787'. + ENDCASE. + + IF ip_bottom IS SUPPLIED. margin_bottom = lv_coef * ip_bottom. ENDIF. + IF ip_footer IS SUPPLIED. margin_footer = lv_coef * ip_footer. ENDIF. + IF ip_header IS SUPPLIED. margin_header = lv_coef * ip_header. ENDIF. + IF ip_left IS SUPPLIED. margin_left = lv_coef * ip_left. ENDIF. + IF ip_right IS SUPPLIED. margin_right = lv_coef * ip_right. ENDIF. + IF ip_top IS SUPPLIED. margin_top = lv_coef * ip_top. ENDIF. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + method CONSTRUCTOR. + + + CREATE OBJECT font. + CREATE OBJECT fill. + CREATE OBJECT borders. + CREATE OBJECT alignment. + CREATE OBJECT number_format. + CREATE OBJECT protection. + +* Start of insertion # issue 139 - Dateretention of cellstyles + IF ip_guid IS NOT INITIAL. + me->guid = ip_guid. + ELSE. +* End of insertion # issue 139 - Dateretention of cellstyles + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. +* Start of insertion # issue 139 - Dateretention of cellstyles + ENDIF. +* End of insertion # issue 139 - Dateretention of cellstyles + + endmethod. + + + + method GET_GUID. + + + ep_guid = me->guid. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + + + styles->add( ip_style ). + endmethod. + + + method CLEAR. + + + styles->clear( ). + endmethod. + + + method CONSTRUCTOR. + + + CREATE OBJECT styles. + endmethod. + + + + + method GET. + + + eo_style ?= styles->if_object_collection~get( ip_index ). + endmethod. + + + + method GET_ITERATOR. + + + eo_iterator ?= styles->if_object_collection~get_iterator( ). + endmethod. + + + + method IS_EMPTY. + + + is_empty = styles->if_object_collection~is_empty( ). + endmethod. + + + + + method REGISTER_NEW_STYLE. + + + me->add( io_style ). + ep_style_code = me->size( ) - 1. "style count starts from 0 + endmethod. + + + + method REMOVE. + + + styles->remove( ip_style ). + endmethod. + + + + method SIZE. + + + ep_size = styles->if_object_collection~size( ). + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + method ADD. + styles_conditional->add( ip_style_conditional ). + endmethod. + + + method CLEAR. + styles_conditional->clear( ). + endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT styles_conditional. + + endmethod. + + + + + method GET. + DATA lv_index TYPE i. + lv_index = ip_index. + eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). + endmethod. + + + + method GET_ITERATOR. + eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). + endmethod. + + + + method IS_EMPTY. + is_empty = styles_conditional->if_object_collection~is_empty( ). + endmethod. + + + + method REMOVE. + styles_conditional->remove( ip_style_conditional ). + endmethod. + + + + method SIZE. + ep_size = styles_conditional->if_object_collection~size( ). + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + horizontal = me->c_horizontal_general. + vertical = me->c_vertical_bottom. + wrapText = abap_false. + shrinkToFit = abap_false. + endmethod. + + + + method GET_STRUCTURE. + + es_alignment-horizontal = me->horizontal. + es_alignment-vertical = me->vertical. + es_alignment-textrotation = me->textrotation. + es_alignment-wraptext = me->wraptext. + es_alignment-shrinktofit = me->shrinktofit. + es_alignment-indent = me->indent. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + border_style = zcl_excel_style_border=>c_border_none. + border_color-theme = zcl_excel_style_color=>c_theme_not_set. + border_color-indexed = zcl_excel_style_color=>c_indexed_not_set. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + method GET_STRUCTURE. +*initialize colors to 'not set' + es_fill-left_color-indexed = zcl_excel_style_color=>c_indexed_not_set. + es_fill-left_color-theme = zcl_excel_style_color=>c_theme_not_set. + es_fill-right_color-indexed = zcl_excel_style_color=>c_indexed_not_set. + es_fill-right_color-theme = zcl_excel_style_color=>c_theme_not_set. + es_fill-top_color-indexed = zcl_excel_style_color=>c_indexed_not_set. + es_fill-top_color-theme = zcl_excel_style_color=>c_theme_not_set. + es_fill-bottom_color-indexed = zcl_excel_style_color=>c_indexed_not_set. + es_fill-bottom_color-theme = zcl_excel_style_color=>c_theme_not_set. + es_fill-diagonal_color-indexed = zcl_excel_style_color=>c_indexed_not_set. + es_fill-diagonal_color-theme = zcl_excel_style_color=>c_theme_not_set. + +* Check if all borders is set otherwise check single border + IF me->allborders IS BOUND. + es_fill-left_color = me->allborders->border_color. + es_fill-left_style = me->allborders->border_style. + es_fill-right_color = me->allborders->border_color. + es_fill-right_style = me->allborders->border_style. + es_fill-top_color = me->allborders->border_color. + es_fill-top_style = me->allborders->border_style. + es_fill-bottom_color = me->allborders->border_color. + es_fill-bottom_style = me->allborders->border_style. + ELSE. + IF me->left IS BOUND. + es_fill-left_color = me->left->border_color. + es_fill-left_style = me->left->border_style. + ENDIF. + IF me->right IS BOUND. + es_fill-right_color = me->right->border_color. + es_fill-right_style = me->right->border_style. + ENDIF. + IF me->top IS BOUND. + es_fill-top_color = me->top->border_color. + es_fill-top_style = me->top->border_style. + ENDIF. + IF me->down IS BOUND. + es_fill-bottom_color = me->down->border_color. + es_fill-bottom_style = me->down->border_style. + ENDIF. + ENDIF. + +* Check if diagonal is set + IF me->diagonal IS BOUND. + es_fill-diagonal_color = me->diagonal->border_color. + es_fill-diagonal_style = me->diagonal->border_style. + CASE me->diagonal_mode. + WHEN 1. + es_fill-diagonalup = 1. + es_fill-diagonaldown = 0. + WHEN 2. + es_fill-diagonalup = 0. + es_fill-diagonaldown = 1. + WHEN 3. + es_fill-diagonalup = 1. + es_fill-diagonaldown = 1. + WHEN OTHERS. + es_fill-diagonalup = 0. + es_fill-diagonaldown = 0. + ENDCASE. + ENDIF. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD create_new_arbg_int. + DATA: lv_red TYPE int1, + lv_green TYPE int1, + lv_blue TYPE int1, + lv_hex TYPE x, + lv_char_red TYPE zexcel_style_color_component, + lv_char_green TYPE zexcel_style_color_component, + lv_char_blue TYPE zexcel_style_color_component. + + lv_red = iv_red MOD 256. + lv_green = iv_green MOD 256. + lv_blue = iv_blue MOD 256. + + lv_hex = lv_red. + lv_char_red = lv_hex. + + lv_hex = lv_green. + lv_char_green = lv_hex. + + lv_hex = lv_blue. + lv_char_blue = lv_hex. + + + concatenate zcl_excel_style_color=>c_alpha lv_char_red lv_char_green lv_char_blue into rv_color_argb. + + +ENDMETHOD. + + + + + + + METHOD create_new_argb. + + CONCATENATE zcl_excel_style_color=>c_alpha ip_red ip_green ip_blu INTO ep_color_argb. + +ENDMETHOD. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + + DATA: ls_iconset TYPE zexcel_conditional_iconset. + ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. + ls_iconset-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo1_value = '0'. + ls_iconset-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo2_value = '20'. + ls_iconset-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo3_value = '40'. + ls_iconset-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo4_value = '60'. + ls_iconset-cfvo5_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo5_value = '80'. + + + me->rule = zcl_excel_style_conditional=>c_rule_none. +* me->iconset->operator = zcl_excel_style_conditional=>c_operator_none. + me->mode_iconset = ls_iconset. + me->priority = 1. + +* inizialize dimension range + me->stop_cell-cell_row = 1. + me->stop_cell-cell_column = 1. + me->start_cell-cell_row = 1. + me->start_cell-cell_column = 1. + endmethod. + + + + method GET_DIMENSION_RANGE. + IF stop_cell EQ start_cell. "only one cell + ep_dimension_range = start_cell-cell_coords. + ELSE. + CONCATENATE start_cell-cell_coords ':' stop_cell-cell_coords INTO ep_dimension_range. + ENDIF. + endmethod. + + + + + + + method SET_RANGE. + DATA: lv_column TYPE zexcel_cell_column, + lv_row_alpha TYPE string. + + lv_column = zcl_excel_common=>convert_column2int( ip_stop_column ). + stop_cell-cell_row = 1. + stop_cell-cell_column = lv_column. + lv_row_alpha = ip_stop_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_stop_column lv_row_alpha INTO stop_cell-cell_coords. + + lv_column = zcl_excel_common=>convert_column2int( ip_start_column ). + start_cell-cell_row = 1. + start_cell-cell_column = lv_column. + lv_row_alpha = ip_start_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_start_column lv_row_alpha INTO start_cell-cell_coords. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method build_gradient. + check check_filltype_is_gradient( ) eq abap_true. + case filltype. + when c_fill_gradient_horizontal90. + gradtype-degree = '90'. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + when c_fill_gradient_horizontal270. + gradtype-degree = '270'. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + when c_fill_gradient_horizontalb. + gradtype-degree = '90'. + gradtype-position1 = '0'. + gradtype-position2 = '0.5'. + gradtype-position3 = '1'. + when c_fill_gradient_vertical. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + when c_fill_gradient_fromcenter. + gradtype-type = c_fill_gradient_path. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + gradtype-bottom = '0.5'. + gradtype-top = '0.5'. + gradtype-left = '0.5'. + gradtype-right = '0.5'. + when c_fill_gradient_diagonal45. + gradtype-degree = '45'. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + when c_fill_gradient_diagonal45b. + gradtype-degree = '45'. + gradtype-position1 = '0'. + gradtype-position2 = '0.5'. + gradtype-position3 = '1'. + when c_fill_gradient_diagonal135. + gradtype-degree = '135'. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + when c_fill_gradient_diagonal135b. + gradtype-degree = '135'. + gradtype-position1 = '0'. + gradtype-position2 = '0.5'. + gradtype-position3 = '1'. + when c_fill_gradient_cornerlt. + gradtype-type = c_fill_gradient_path. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + when c_fill_gradient_cornerlb. + gradtype-type = c_fill_gradient_path. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + gradtype-bottom = '1'. + gradtype-top = '1'. + when c_fill_gradient_cornerrt. + gradtype-type = c_fill_gradient_path. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + gradtype-left = '1'. + gradtype-right = '1'. + when c_fill_gradient_cornerrb. + gradtype-type = c_fill_gradient_path. + gradtype-position1 = '0'. + gradtype-position2 = '1'. + gradtype-bottom = '0.5'. + gradtype-top = '0.5'. + gradtype-left = '0.5'. + gradtype-right = '0.5'. + endcase. + + endmethod. "build_gradient + + + + method check_filltype_is_gradient. + case filltype. + when c_fill_gradient_horizontal90 or + c_fill_gradient_horizontal270 or + c_fill_gradient_horizontalb or + c_fill_gradient_vertical or + c_fill_gradient_fromcenter or + c_fill_gradient_diagonal45 or + c_fill_gradient_diagonal45b or + c_fill_gradient_diagonal135 or + c_fill_gradient_diagonal135b or + c_fill_gradient_cornerlt or + c_fill_gradient_cornerlb or + c_fill_gradient_cornerrt or + c_fill_gradient_cornerrb. + rv_is_gradient = abap_true. + endcase. + endmethod. "check_filltype_is_gradient + + + method constructor. + filltype = zcl_excel_style_fill=>c_fill_none. + fgcolor-theme = zcl_excel_style_color=>c_theme_not_set. + fgcolor-indexed = zcl_excel_style_color=>c_indexed_not_set. + bgcolor-theme = zcl_excel_style_color=>c_theme_not_set. + bgcolor-indexed = zcl_excel_style_color=>c_indexed_sys_foreground. + rotation = 0. + + endmethod. "CONSTRUCTOR + + + + method get_structure. + es_fill-rotation = me->rotation. + es_fill-filltype = me->filltype. + es_fill-fgcolor = me->fgcolor. + es_fill-bgcolor = me->bgcolor. + me->build_gradient( ). + es_fill-gradtype = me->gradtype. + endmethod. "GET_STRUCTURE + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CALCULATE_TEXT_WIDTH. + " Addition to solve issue #120, contribution by Stefan Schmöcker + r_width = strlen( i_text ). + " use scale factor based on default 11 + " ( don't know where defaultsetting is stored currently ) + r_width = r_width * me->size / 11. + endmethod. + + + method CONSTRUCTOR. + me->color-rgb = zcl_excel_style_color=>c_black. + me->color-theme = zcl_excel_style_color=>c_theme_not_set. + me->color-indexed = zcl_excel_style_color=>c_indexed_not_set. + me->scheme = zcl_excel_style_font=>c_scheme_minor. + me->underline_mode = zcl_excel_style_font=>c_underline_single. + endmethod. + + + + method GET_STRUCTURE. + + es_font-bold = me->bold. + es_font-italic = me->italic. + es_font-underline = me->underline. + es_font-underline_mode = me->underline_mode. + es_font-strikethrough = me->strikethrough. + es_font-size = me->size. + es_font-color = me->color. + es_font-name = me->name. + es_font-family = me->family. + es_font-scheme = me->scheme. + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. + format_code = me->c_format_general. + endmethod. + + + + method GET_STRUCTURE. + ep_number_format-numfmt = me->format_code. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + method CONSTRUCTOR. + locked = me->c_protection_locked. + hidden = me->c_protection_unhidden. + endmethod. + + + + method GET_STRUCTURE. + ep_protection-locked = me->locked. + ep_protection-hidden = me->hidden. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method GET_BOTTOM_ROW_INTEGER. + DATA: lv_table_lines TYPE i. + FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. + + IF settings-bottom_right_row IS NOT INITIAL. +* ev_row = zcl_excel_common=>convert_column2int( settings-bottom_right_row ). " del issue #246 + ev_row = settings-bottom_right_row . " ins issue #246 + EXIT. + ENDIF. + + ASSIGN table_data->* TO <fs_table>. + DESCRIBE TABLE <fs_table> LINES lv_table_lines. + IF lv_table_lines = 0. + lv_table_lines = 1. "table needs at least 1 data row + ENDIF. + + ev_row = settings-top_left_row + lv_table_lines. + + IF me->has_totals( ) = abap_true." ???? AND ip_include_totals_row = abap_true. + ADD 1 TO ev_row. + ENDIF. + endmethod. + + + + method GET_ID. + ov_id = id. + endmethod. + + + + method GET_NAME. + + IF me->name IS INITIAL. + me->name = zcl_excel_common=>number_to_excel_string( ip_value = me->id ). + CONCATENATE 'table' me->name INTO me->name. + ENDIF. + + ov_name = me->name. + endmethod. + + + + + method GET_REFERENCE. + DATA: lv_column TYPE zexcel_cell_column, + lv_table_lines TYPE i, + lv_right_column TYPE zexcel_cell_column_alpha, + ls_field_catalog TYPE zexcel_s_fieldcatalog, + lv_bottom_row TYPE zexcel_cell_row, + lv_top_row_string(10) TYPE c, + lv_bottom_row_string(10) TYPE c. + + FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. + +*column + lv_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). + lv_table_lines = 0. + LOOP AT fieldcat INTO ls_field_catalog WHERE dynpfld EQ abap_true. + ADD 1 TO lv_table_lines. + ENDLOOP. + lv_column = lv_column + lv_table_lines - 1. + lv_right_column = zcl_excel_common=>convert_column2alpha( lv_column ). + +*row + ASSIGN table_data->* TO <fs_table>. + DESCRIBE TABLE <fs_table> LINES lv_table_lines. + IF lv_table_lines = 0. + lv_table_lines = 1. "table needs at least 1 data row + ENDIF. + lv_bottom_row = settings-top_left_row + lv_table_lines . + + IF me->has_totals( ) = abap_true AND ip_include_totals_row = abap_true. + ADD 1 TO lv_bottom_row. + ENDIF. + + lv_top_row_string = zcl_excel_common=>number_to_excel_string( settings-top_left_row ). + lv_bottom_row_string = zcl_excel_common=>number_to_excel_string( lv_bottom_row ). + + CONCATENATE settings-top_left_column lv_top_row_string + ':' + lv_right_column lv_bottom_row_string INTO ov_reference. + + endmethod. + + + + + method GET_RIGHT_COLUMN_INTEGER. + DATA: lv_column TYPE zexcel_cell_column, + lv_table_lines TYPE i, + ls_field_catalog TYPE zexcel_s_fieldcatalog. + + IF settings-bottom_right_column IS NOT INITIAL. + ev_column = zcl_excel_common=>convert_column2int( settings-bottom_right_column ). + EXIT. + ENDIF. + + ev_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). + LOOP AT fieldcat INTO ls_field_catalog WHERE dynpfld EQ abap_true. + ADD 1 TO ev_column. + ENDLOOP. + + endmethod. + + + + + + method GET_TOTALS_FORMULA. + CONSTANTS: lc_function_id_sum TYPE string VALUE '109', + lc_function_id_min TYPE string VALUE '105', + lc_function_id_max TYPE string VALUE '104', + lc_function_id_count TYPE string VALUE '103', + lc_function_id_average TYPE string VALUE '101'. + + DATA: lv_function_id TYPE string. + + CASE ip_function. + WHEN zcl_excel_table=>totals_function_sum. + lv_function_id = lc_function_id_sum. + + WHEN zcl_excel_table=>totals_function_min. + lv_function_id = lc_function_id_min. + + WHEN zcl_excel_table=>totals_function_max. + lv_function_id = lc_function_id_max. + + WHEN zcl_excel_table=>totals_function_count. + lv_function_id = lc_function_id_count. + + WHEN zcl_excel_table=>totals_function_average. + lv_function_id = lc_function_id_average. + + WHEN zcl_excel_table=>totals_function_custom. " issue #292 + RETURN. + + WHEN OTHERS. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid totals formula. See ZCL_ for possible values'. + ENDCASE. + + CONCATENATE 'SUBTOTAL(' lv_function_id ',[' ip_column '])' INTO ep_formula. + endmethod. + + + + method HAS_TOTALS. + DATA: ls_field_catalog TYPE zexcel_s_fieldcatalog. + + ep_result = abap_false. + + LOOP AT fieldcat INTO ls_field_catalog. + IF ls_field_catalog-totals_function IS NOT INITIAL. + ep_result = abap_true. + EXIT. + ENDIF. + ENDLOOP. + + endmethod. + + + + METHOD set_data. + + DATA lr_temp TYPE REF TO data. + + FIELD-SYMBOLS: <lt_table_temp> TYPE ANY TABLE, + <lt_table> TYPE ANY TABLE. + + GET REFERENCE OF ir_data INTO lr_temp. + ASSIGN lr_temp->* TO <lt_table_temp>. + CREATE DATA table_data LIKE <lt_table_temp>. + ASSIGN me->table_data->* TO <lt_table>. + <lt_table> = <lt_table_temp>. + +ENDMETHOD. + + + + method SET_ID. + id = iv_id. + endmethod. + + + + + + + + + + + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + +*&---------------------------------------------------------------------* +*& Class (Implementation) C_OI_PROXY_ERROR +*&---------------------------------------------------------------------* +CLASS c_oi_proxy_error IMPLEMENTATION. + METHOD constructor. +* IMPORTING object_name TYPE c +* method_name TYPE c. + error_nr = ret_call_not_flushed. + me->i_oi_error~error_code = c_oi_errors=>ret_call_not_flushed. + me->i_oi_error~is_flushed = ' '. + me->i_oi_error~has_failed = 'X'. + me->i_oi_error~has_succeeded = ' '. + me->message_id = 'SOFFICEINTEGRATION'. + me->message_nr = '899'. + me->param1 = object_name. + me->param2 = method_name. + ENDMETHOD. "constructor + + METHOD i_oi_error~flush_error. + IF error_nr EQ 0. + me->i_oi_error~error_code = c_oi_errors=>ret_ok. + me->i_oi_error~is_flushed = 'X'. + me->i_oi_error~has_failed = ' '. + me->i_oi_error~has_succeeded = 'X'. + me->message_id = ''. + me->message_nr = '000'. + CALL METHOD c_oi_errors=>translate_proxy_error_code + EXPORTING + errorcode = error_nr + IMPORTING + retcode = me->i_oi_error~error_code. + ELSEIF error_nr EQ ret_call_not_flushed. + "call still not flushed + CALL METHOD c_oi_errors=>translate_proxy_error_code + EXPORTING + errorcode = error_nr + errorstring = me->param2 "method name + objectname = me->param1 + IMPORTING + retcode = me->i_oi_error~error_code. + ELSE. + me->i_oi_error~is_flushed = 'X'. + me->i_oi_error~has_succeeded = ' '. + me->i_oi_error~has_failed = 'X'. + CALL METHOD c_oi_errors=>translate_proxy_error_code + EXPORTING + errorcode = error_nr + errorstring = error_string + IMPORTING + retcode = me->i_oi_error~error_code. + CALL METHOD c_oi_errors=>get_message + IMPORTING + message_id = me->message_id + message_number = me->message_nr + param1 = me->param1 + param2 = me->param2 + param3 = me->param3 + param4 = me->param4. + ENDIF. + ENDMETHOD. "i_oi_error~flush_error + + METHOD i_oi_error~raise_message. +* IMPORTING type TYPE c. +* EXCEPTIONS message_raised flush_failed. + IF me->i_oi_error~has_succeeded IS INITIAL. + IF NOT me->i_oi_error~is_flushed IS INITIAL. + MESSAGE ID message_id TYPE type + NUMBER message_nr WITH param1 param2 param3 param4 + RAISING message_raised. + ELSE. + RAISE flush_failed. + ENDIF. + ENDIF. + ENDMETHOD. "i_oi_error~raise_message + + METHOD i_oi_error~get_message. +* EXPORTING message_id TYPE c +* message_number TYPE c +* param1 TYPE c +* param2 TYPE c +* param3 TYPE c +* param4 TYPE c. + param1 = me->param1. param2 = me->param2. + param3 = me->param3. param4 = me->param4. + + message_id = me->message_id. + message_number = me->message_nr. + ENDMETHOD. "i_oi_error~get_message +ENDCLASS. "C_OI_PROXY_ERROR + +*&---------------------------------------------------------------------* +*& Class (Implementation) CL_GRID_ACCESSION +*&---------------------------------------------------------------------* +CLASS lcl_gui_alv_grid IMPLEMENTATION. + + METHOD get_alv_attributes. + CREATE DATA et_table LIKE io_grid->mt_outtab. + et_table = io_grid->mt_outtab. + ENDMETHOD. "get_data + +ENDCLASS. "CL_GRID_ACCESSION + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature +TYPE-POOLS: sydes. +TYPE-POOLS: slis. +*--------------------------------------------------------------------* +* CLASS c_oi_proxy_error +*--------------------------------------------------------------------* +* use for method bind_ALV +*--------------------------------------------------------------------* +CLASS c_oi_proxy_error DEFINITION. + PUBLIC SECTION. + INTERFACES: i_oi_error. + DATA: error_nr TYPE i. + DATA: error_string TYPE sy-msgv1. + + METHODS: constructor IMPORTING object_name TYPE c + method_name TYPE c. + PRIVATE SECTION. + CONSTANTS: + ret_call_not_flushed TYPE i VALUE -999999. + + DATA: message_id TYPE sy-msgid, + message_nr TYPE sy-msgno, + param1 TYPE sy-msgv1, + param2 TYPE sy-msgv2, + param3 TYPE sy-msgv3, + param4 TYPE sy-msgv4. +ENDCLASS. "c_oi_proxy_error DEFINITION + +*--------------------------------------------------------------------* +* CLASS lcl_gui_alv_grid +*--------------------------------------------------------------------* +* to get protected attribute and method of cl_gui_alv_grid +* use for method bind_ALV +*--------------------------------------------------------------------* +CLASS lcl_gui_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid. + + PUBLIC SECTION. +* get ALV grid data + METHODS: get_alv_attributes + IMPORTING + io_grid TYPE REF TO cl_gui_alv_grid " ALV grid + EXPORTING + et_table TYPE REF TO data. " dta table + +ENDCLASS. "lcl_gui_alv_grid DEFINITION + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + ABAP + SLIS + SOI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_COLUMNS. + +*--------------------------------------------------------------------* +* adjust internal representation +*--------------------------------------------------------------------* + CLEAR: me->print_title_col_from, + me->print_title_col_to . + + +*--------------------------------------------------------------------* +* adjust corresponding range +*--------------------------------------------------------------------* + me->print_title_set_range( ). + + + endmethod. + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_ROWS. + +*--------------------------------------------------------------------* +* adjust internal representation +*--------------------------------------------------------------------* + CLEAR: me->print_title_row_from, + me->print_title_row_to . + + +*--------------------------------------------------------------------* +* adjust corresponding range +*--------------------------------------------------------------------* + me->print_title_set_range( ). + + + endmethod. + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~GET_PRINT_REPEAT_COLUMNS. + ev_columns_from = me->print_title_col_from. + ev_columns_to = me->print_title_col_to. + endmethod. + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~GET_PRINT_REPEAT_ROWS. + ev_rows_from = me->print_title_row_from. + ev_rows_to = me->print_title_row_to. + endmethod. + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_COLUMNS. +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns +* - Stefan Schmöcker, 2012-12-02 +*--------------------------------------------------------------------* + + DATA: lv_col_from_int TYPE i, + lv_col_to_int TYPE i, + lv_errormessage TYPE string. + + DATA: lo_range_iterator TYPE REF TO cl_object_collection_iterator, + lo_range TYPE REF TO zcl_excel_range. + + + lv_col_from_int = zcl_excel_common=>convert_column2int( iv_columns_from ). + lv_col_to_int = zcl_excel_common=>convert_column2int( iv_columns_to ). + +*--------------------------------------------------------------------* +* Check if valid range is supplied +*--------------------------------------------------------------------* + IF lv_col_from_int < 1. + lv_errormessage = 'Invalid range supplied for print-title repeatable columns'(401). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + IF lv_col_from_int > lv_col_to_int. + lv_errormessage = 'Invalid range supplied for print-title repeatable columns'(401). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + +*--------------------------------------------------------------------* +* adjust internal representation +*--------------------------------------------------------------------* + me->print_title_col_from = iv_columns_from. + me->print_title_col_to = iv_columns_to. + + +*--------------------------------------------------------------------* +* adjust corresponding range +*--------------------------------------------------------------------* + me->print_title_set_range( ). + + endmethod. + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_ROWS. +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns +* - Stefan Schmöcker, 2012-12-02 +*--------------------------------------------------------------------* + + DATA: lv_errormessage TYPE string. + + DATA: lo_range_iterator TYPE REF TO cl_object_collection_iterator, + lo_range TYPE REF TO zcl_excel_range. + + + +*--------------------------------------------------------------------* +* Check if valid range is supplied +*--------------------------------------------------------------------* + IF iv_rows_from < 1. + lv_errormessage = 'Invalid range supplied for print-title repeatable rowumns'(401). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + IF iv_rows_from > iv_rows_to. + lv_errormessage = 'Invalid range supplied for print-title repeatable rowumns'(401). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + +*--------------------------------------------------------------------* +* adjust internal representation +*--------------------------------------------------------------------* + me->print_title_row_from = iv_rows_from. + me->print_title_row_to = iv_rows_to. + + +*--------------------------------------------------------------------* +* adjust corresponding range +*--------------------------------------------------------------------* + me->print_title_set_range( ). + + + endmethod. + + + method ZIF_EXCEL_SHEET_PROPERTIES~GET_STYLE. + IF zif_excel_sheet_properties~style IS NOT INITIAL. + ep_style = zif_excel_sheet_properties~style. + ELSE. + ep_style = me->excel->get_default_style( ). + ENDIF. + endmethod. + + + method ZIF_EXCEL_SHEET_PROPERTIES~INITIALIZE. + + zif_excel_sheet_properties~show_zeros = zif_excel_sheet_properties=>c_showzero. + zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_on. + zif_excel_sheet_properties~summaryright = zif_excel_sheet_properties=>c_right_on. + +* inizialize zoomscale values + ZIF_EXCEL_SHEET_PROPERTIES~zoomscale = 100. + ZIF_EXCEL_SHEET_PROPERTIES~zoomscale_normal = 100. + ZIF_EXCEL_SHEET_PROPERTIES~zoomscale_pagelayoutview = 100 . + ZIF_EXCEL_SHEET_PROPERTIES~zoomscale_sheetlayoutview = 100 . + endmethod. + + + method ZIF_EXCEL_SHEET_PROPERTIES~SET_STYLE. + zif_excel_sheet_properties~style = ip_style. + endmethod. + + + method ZIF_EXCEL_SHEET_PROTECTION~INITIALIZE. + + me->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_unprotected. + CLEAR me->zif_excel_sheet_protection~password. + me->zif_excel_sheet_protection~auto_filter = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~delete_columns = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~delete_rows = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~format_cells = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~format_columns = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~format_rows = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~insert_columns = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~insert_hyperlinks = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~insert_rows = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_noactive. +* me->zif_excel_sheet_protection~password = zif_excel_sheet_protection=>c_noactive. "issue #68 + me->zif_excel_sheet_protection~pivot_tables = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~select_locked_cells = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~select_unlocked_cells = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_noactive. + me->zif_excel_sheet_protection~sort = zif_excel_sheet_protection=>c_noactive. + + endmethod. + + + method ZIF_EXCEL_SHEET_VBA_PROJECT~SET_CODENAME. + me->zif_excel_sheet_vba_project~codename = ip_codename. + endmethod. + + + method ZIF_EXCEL_SHEET_VBA_PROJECT~SET_CODENAME_PR. + me->zif_excel_sheet_vba_project~codename_pr = ip_codename_pr. + endmethod. + + + + method ADD_DRAWING. + CASE ip_drawing->get_type( ). + WHEN zcl_excel_drawing=>type_image. + drawings->include( ip_drawing ). + WHEN zcl_excel_drawing=>type_chart. + charts->include( ip_drawing ). + ENDCASE. + endmethod. + + + + method ADD_NEW_CONDITIONAL_STYLE. + + CREATE OBJECT eo_conditional_style. + conditional_styles->add( eo_conditional_style ). + endmethod. + + + + method ADD_NEW_DATA_VALIDATION. + + CREATE OBJECT eo_data_validation. + data_validations->add( eo_data_validation ). + endmethod. + + + + method ADD_NEW_RANGE. +* Create default blank range + CREATE OBJECT eo_range. + ranges->add( eo_range ). + endmethod. + + + + + + + + + method BIND_ALV. + data: lo_converter type ref to zcl_excel_converter. + + create object lo_converter. + + try. + lo_converter->convert( + exporting + io_alv = io_alv + it_table = it_table + i_row_int = i_top + i_column_int = i_left + i_table = abap_true + i_style_table = table_style + io_worksheet = me + changing + co_excel = excel ). + catch zcx_excel . + endtry. + + endmethod. + + + + + + + + + + + + + + + + + + + + + + method BIND_ALV_OLE2. +*--------------------------------------------------------------------* +* Method description: +* Method use to export a CL_GUI_ALV_GRID object to xlsx/xls file +* with list header and characteristics of ALV field catalog such as: +* + Total, group's subtotal +* + Quantity fields, amount fields (dependent fields) +* + No_out, no_zero, ... +* Technique use in method: +* SAP Desktop Office Integration (DOI) +*--------------------------------------------------------------------* + +* Data for session 0: DOI constructor +* ------------------------------------------ + + data: lo_control type ref to I_OI_CONTAINER_CONTROL. + data: lo_proxy type ref to I_OI_DOCUMENT_PROXY. + data: lo_spreadsheet type ref to I_OI_SPREADSHEET. + data: lo_error type ref to I_OI_ERROR. + data: lc_retcode type SOI_RET_STRING. + data: li_has type i. "Proxy has spreadsheet interface? + data: l_is_closed type i. + +* Data for session 1: Get LVC data from ALV object +* ------------------------------------------ + + data: l_has_activex, + l_doctype_excel_sheet(11) type c. + data: wa_DOC_HANDLE Type CNTL_HANDLE. + +* LVC + data: lt_fieldcat_lvc type LVC_T_FCAT. + data: wa_fieldcat_lvc type lvc_s_fcat. + data: lt_sort_lvc type LVC_T_SORT. + data: lt_filter_idx_lvc type LVC_T_FIDX. + data: lt_GROUPLEVELS_LVC type LVC_T_GRPL. + +* KKBLO + DATA: LT_FIELDCAT_KKBLO Type KKBLO_T_FIELDCAT. + DATA: LT_SORT_KKBLO Type KKBLO_T_SORTINFO. + DATA: LT_GROUPLEVELS_KKBLO Type KKBLO_T_GROUPLEVELS. + DATA: LT_FILTER_IDX_KKBLO Type KKBLO_T_SFINFO. + data: wa_listheader like line of it_listheader. + +* Subtotal + data: lt_collect00 type ref to data. + data: lt_collect01 type ref to data. + data: lt_collect02 type ref to data. + data: lt_collect03 type ref to data. + data: lt_collect04 type ref to data. + data: lt_collect05 type ref to data. + data: lt_collect06 type ref to data. + data: lt_collect07 type ref to data. + data: lt_collect08 type ref to data. + data: lt_collect09 type ref to data. + +* data table name + data: l_tabname type kkblo_tabname. + +* local object + data: lo_grid type ref to lcl_gui_alv_grid. + +* data table get from ALV + data: lt_alv type ref to data. + +* total / subtotal data + field-symbols: <f_collect00> type standard table. + field-symbols: <f_collect01> type standard table. + field-symbols: <f_collect02> type standard table. + field-symbols: <f_collect03> type standard table. + field-symbols: <f_collect04> type standard table. + field-symbols: <f_collect05> type standard table. + field-symbols: <f_collect06> type standard table. + field-symbols: <f_collect07> type standard table. + field-symbols: <f_collect08> type standard table. + field-symbols: <f_collect09> type standard table. + +* table before append subtotal lines + field-symbols: <f_alv_tab> type standard table. + +* data for session 2: sort, filter and calculate total/subtotal +* ------------------------------------------ + +* table to save index of subotal / total line in excel tanle +* this ideal to control index of subtotal / total line later +* for ex, when get subtotal / total line to format + types: begin of st_subtot_indexs, + index type i, + end of st_subtot_indexs. + data: lt_subtot_indexs type table of st_subtot_indexs. + data: wa_subtot_indexs like line of lt_subtot_indexs. + +* data table after append subtotal + data: lt_excel type ref to data. + + data: l_tabix type i. + data: l_save_index type i. + +* dyn subtotal table name + data: l_collect type string. + +* subtotal range, to format subtotal (and total) + data: subranges type soi_range_list. + data: subrangeitem type soi_range_item. + data: l_sub_index type i. + + +* table after append subtotal lines + field-symbols: <f_excel_tab> type standard table. + field-symbols: <f_excel_line> type any. + +* dyn subtotal tables + field-symbols: <f_collect_tab> type standard table. + field-symbols: <f_collect_line> type any. + + field-symbols: <f_filter_idx_line> like line of LT_FILTER_IDX_KKBLO. + field-symbols: <f_fieldcat_line> like line of LT_FIELDCAT_KKBLO. + field-symbols: <f_grouplevels_line> like line of LT_GROUPLEVELS_KKBLO. + field-symbols: <f_line> type any. + +* Data for session 3: map data to semantic table +* ------------------------------------------ + + types: begin of st_column_index, + fieldname type kkblo_fieldname, + tabname type kkblo_tabname, + col like sy-index, + end of st_column_index. + +* columns index + data: lt_column_index type table of st_column_index. + data: wa_column_index like line of lt_column_index. + +* table of dependent field ( currency and quantity unit field) + data: lt_fieldcat_depf type kkblo_t_fieldcat. + data: wa_fieldcat_depf type kkblo_fieldcat. + +* XXL interface: +* -XXL: contain exporting columns characteristic + data: lt_sema type table of gxxlt_s initial size 0. + data: wa_sema like line of lt_sema. + +* -XXL interface: header + data: lt_hkey type table of gxxlt_h initial size 0. + data: wa_hkey like line of lt_hkey. + +* -XXL interface: header keys + data: lt_vkey type table of gxxlt_v initial size 0. + data: wa_vkey like line of lt_vkey. + +* Number of H Keys: number of key columns + data: l_n_hrz_keys type i. +* Number of data columns in the list object: non-key columns no + data: l_n_att_cols type i. +* Number of V Keys: number of header row + data: l_n_vrt_keys type i. + +* curency to format amount + data: lt_tcurx type table of tcurx. + data: wa_tcurx like line of lt_tcurx. + data: l_def type flag. " currency / quantity flag + data: wa_t006 type t006. " decimal place of unit + + data: l_num type i. " table columns number + data: l_typ type c. " table type + data: wa type ref to data. + data: l_int type i. + data: l_counter type i. + + field-symbols: <f_excel_column> type any. + field-symbols: <f_fcat_column> type any. + +* Data for session 4: write to excel +* ------------------------------------------ + + data: data_starting_at type i value 1. + data: data_ending_at type i value -1. + data: sema_type type c. + + data l_error type ref to c_oi_proxy_error. + data count type i. + data datac type i. + data datareal type i. " exporting column number + data vkeycount type i. + data all type i. + data mit type i value 1. " index of recent row? + data li_col_pos type i value 1. " column position + data li_col_num type i. " table columns number + field-symbols: <line> type any. + field-symbols: <item> type any. + + data td type sydes_desc. + + data: typ. + data: ranges type soi_range_list. + data: rangeitem type soi_range_item. + data: contents type soi_generic_table. + data: contentsitem type soi_generic_item. + data: semaitem type gxxlt_s. + data: hkeyitem type gxxlt_h. + data: vkeyitem type gxxlt_v. + data: li_commentary_rows type i. "row number of title lines + 1 + data: lo_error_w type ref to i_oi_error. + data: l_retcode type soi_ret_string. + data: no_flush type c value 'X'. + data: li_head_top type i. "header rows position + +* Data for session 5: Save and clode document +* ------------------------------------------ + + data: li_document_size type i. + data: ls_path type RLGRAP-FILENAME. + +* MACRO: Close_document +*------------------------------------------- + + DEFINE close_document. + clear: l_is_closed. + IF lo_proxy is not initial. + +* check proxy detroyed adi + + call method lo_proxy->is_destroyed + IMPORTING + ret_value = l_is_closed. + +* if dun detroyed yet: close -> release proxy + + IF l_is_closed is initial. + call method lo_proxy->close_document +* EXPORTING +* do_save = do_save + IMPORTING + error = lo_error + retcode = lc_retcode. + ENDIF. + + call method lo_proxy->release_document + IMPORTING + error = lo_error + retcode = lC_retcode. + + else. + lc_retcode = c_oi_errors=>ret_document_not_open. + ENDIF. + +* Detroy control container + + IF lo_control is not initial. + CALL METHOD lo_control->destroy_control. + ENDIF. + + clear: + lo_spreadsheet, + lo_proxy, + lo_control. + +* free local + + clear: l_is_closed. + + END-OF-DEFINITION. + +* Macro to catch DOI error +*------------------------------------------- + + DEFINE error_doi. + if lc_retcode ne c_oi_errors=>ret_ok. + close_document. + call method lo_error->raise_message + EXPORTING + type = 'E'. + clear: lo_error. + endif. + END-OF-DEFINITION. + +*--------------------------------------------------------------------* +* SESSION 0: DOI CONSTRUCTOR +*--------------------------------------------------------------------* + +* check active windown + + call function 'GUI_HAS_ACTIVEX' + IMPORTING + return = l_has_activex. + + if l_has_activex is initial. + raise MISS_GUIDE. + endif. + +* Get Container Object of Screen + + call method c_oi_container_control_creator=>get_container_control + IMPORTING + control = lo_control + retcode = lC_retcode. + + error_doi. + +* Initialize Container control + + CALL METHOD lo_control->init_control + EXPORTING + parent = CL_GUI_CONTAINER=>DEFAULT_SCREEN + r3_application_name = '' + inplace_enabled = 'X' + no_flush = 'X' + register_on_close_event = 'X' + register_on_custom_event = 'X' + IMPORTING + error = lO_ERROR + retcode = lc_retcode. + + error_doi. + +* Get Proxy Document: +* check exist of document proxy, if exist -> close first + + if not lo_proxy is initial. + close_document. + endif. + + IF i_xls is not initial. +* xls format, doctype = soi_doctype_excel97_sheet + l_doctype_excel_sheet = 'Excel.Sheet.8'. + else. +* xlsx format, doctype = soi_doctype_excel_sheet + l_doctype_excel_sheet = 'Excel.Sheet'. + ENDIF. + + CALL METHOD lo_control->get_document_proxy + EXPORTING + document_type = l_doctype_excel_sheet + register_container = 'X' + IMPORTING + document_proxy = lo_proxy + error = lO_ERROR + retcode = lc_retcode. + + error_doi. + + IF I_DOCUMENT_URL is initial. + +* create new excel document + + call method lo_proxy->create_document + EXPORTING + create_view_data = 'X' + open_inplace = 'X' + no_flush = 'X' + IMPORTING + ERROR = lO_ERROR + retcode = lc_retcode. + + error_doi. + + else. + +* Read excel template for i_DOCUMENT_URL +* this excel template can be store in local or server + + CALL METHOD lo_proxy->open_document + EXPORTING + document_url = i_document_url + open_inplace = 'X' + no_flush = 'X' + IMPORTING + error = lo_error + retcode = lc_retcode. + + error_doi. + + endif. + +* Check Spreadsheet Interface of Document Proxy + + CALL METHOD lo_proxy->has_spreadsheet_interface + IMPORTING + is_available = li_has + error = lO_ERROR + retcode = lc_retcode. + + error_doi. + +* create Spreadsheet object + + CHECK li_has IS NOT INITIAL. + + CALL METHOD lo_proxy->get_spreadsheet_interface + IMPORTING + sheet_interface = lo_spreadsheet + error = lO_ERROR + retcode = lc_retcode. + + error_doi. + +*--------------------------------------------------------------------* +* SESSION 1: GET LVC DATA FROM ALV OBJECT +*--------------------------------------------------------------------* + +* data table + + create object lo_grid + EXPORTING + i_parent = CL_GUI_CONTAINER=>SCREEN0. + + call method lo_grid->get_alv_attributes + EXPORTING + io_grid = io_alv + IMPORTING + Et_table = lt_alv. + + assign lt_alv->* to <f_alv_tab>. + +* fieldcat + + CALL METHOD iO_alv->GET_FRONTEND_FIELDCATALOG + IMPORTING + ET_FIELDCATALOG = lt_fieldcat_LVC. + +* table name + + loop at lt_fieldcat_LVC into wa_fieldcat_lvc + where not tabname is initial. + l_tabname = wa_fieldcat_lvc-tabname. + exit. + endloop. + + if sy-subrc ne 0. + l_tabname = '1'. + endif. + clear: wa_fieldcat_lvc. + +* sort table + + CALL METHOD IO_ALV->GET_SORT_CRITERIA + IMPORTING + ET_SORT = lt_sort_lvc. + + +* filter index + + CALL METHOD IO_ALV->GET_FILTERED_ENTRIES + IMPORTING + ET_FILTERED_ENTRIES = lt_filter_idx_lvc. + +* group level + subtotal + + CALL METHOD IO_ALV->GET_SUBTOTALS + IMPORTING + EP_COLLECT00 = lt_collect00 + EP_COLLECT01 = lt_collect01 + EP_COLLECT02 = lt_collect02 + EP_COLLECT03 = lt_collect03 + EP_COLLECT04 = lt_collect04 + EP_COLLECT05 = lt_collect05 + EP_COLLECT06 = lt_collect06 + EP_COLLECT07 = lt_collect07 + EP_COLLECT08 = lt_collect08 + EP_COLLECT09 = lt_collect09 + ET_GROUPLEVELS = lt_GROUPLEVELS_LVC. + + assign lt_collect00->* to <f_collect00>. + assign lt_collect01->* to <f_collect01>. + assign lt_collect02->* to <f_collect02>. + assign lt_collect03->* to <f_collect03>. + assign lt_collect04->* to <f_collect04>. + assign lt_collect05->* to <f_collect05>. + assign lt_collect06->* to <f_collect06>. + assign lt_collect07->* to <f_collect07>. + assign lt_collect08->* to <f_collect08>. + assign lt_collect09->* to <f_collect09>. + +* transfer to KKBLO struct + + CALL FUNCTION 'LVC_TRANSFER_TO_KKBLO' + EXPORTING + IT_FIELDCAT_LVC = lt_fieldcat_lvc + IT_SORT_LVC = lt_sort_lvc + IT_FILTER_INDEX_LVC = lt_filter_idx_lvc + IT_GROUPLEVELS_LVC = lt_grouplevels_lvc + IMPORTING + ET_FIELDCAT_KKBLO = lt_fieldcat_kkblo + ET_SORT_KKBLO = lt_sort_kkblo + ET_FILTERED_ENTRIES_KKBLO = lt_filter_idx_kkblo + ET_GROUPLEVELS_KKBLO = lt_grouplevels_kkblo + TABLES + IT_DATA = <f_alv_tab> + EXCEPTIONS + IT_DATA_MISSING = 1 + IT_FIELDCAT_LVC_MISSING = 2 + OTHERS = 3. + IF SY-SUBRC <> 0. + raise ex_transfer_KKBLO_ERROR. + ENDIF. + + clear: + wa_fieldcat_lvc, + lt_fieldcat_lvc, + lt_sort_lvc, + lt_filter_idx_lvc, + lt_GROUPLEVELS_LVC. + + clear: + lo_grid. + + +*--------------------------------------------------------------------* +* SESSION 2: SORT, FILTER AND CALCULATE TOTAL / SUBTOTAL +*--------------------------------------------------------------------* + +* append subtotal & total line + + create data lt_excel like <f_ALV_TAB>. + assign lt_excel->* to <f_excel_tab>. + + loop at <f_alv_tab> assigning <f_line>. + l_save_index = sy-tabix. + +* filter base on filter index table + + read table LT_FILTER_IDX_KKBLO assigning <f_filter_idx_line> + with key index = l_save_index + binary search. + if sy-subrc ne 0. + append <f_line> to <f_excel_tab>. + endif. + +* append subtotal lines + + read table LT_GROUPLEVELS_KKBLO assigning <f_grouplevels_line> + with key index_to = l_save_index + binary search. + if sy-subrc = 0. + l_tabix = sy-tabix. + do. + if <f_grouplevels_line>-subtot eq 'X' and + <f_grouplevels_line>-hide_level is initial and + <f_grouplevels_line>-cindex_from ne 0. + +* dynamic append subtotal line to excel table base on grouplevel table +* ex <f_GROUPLEVELS_line>-level = 1 +* then <f_collect_tab> = '<F_COLLECT01>' + + l_collect = <f_grouplevels_line>-level. + condense l_collect. + concatenate '<F_COLLECT0' + l_collect '>' +* '->*' + into l_collect. + + assign (l_collect) to <f_collect_tab>. + +* incase there're more than 1 total line of group, at the same level +* for example: subtotal of multi currency + + LOOP AT <f_collect_tab> assigning <f_collect_line>. + IF sy-tabix between <f_grouplevels_line>-cindex_from + and <f_grouplevels_line>-cindex_to. + + + append <f_collect_line> to <f_excel_tab>. + +* save subtotal lines index + + wa_subtot_indexs-index = sy-tabix. + append wa_subtot_indexs to lt_subtot_indexs. + +* append sub total ranges table for format later + + add 1 to l_sub_index. + subrangeitem-name = l_sub_index. + condense subrangeitem-name. + concatenate 'SUBTOT' + subrangeitem-name + into subrangeitem-name. + + subrangeitem-rows = wa_subtot_indexs-index. + subrangeitem-columns = 1. " start col + append subrangeitem to subranges. + clear: subrangeitem. + + ENDIF. + ENDLOOP. + unassign: <f_collect_tab>. + unassign: <f_collect_line>. + clear: l_collect. + endif. + +* check next subtotal level of group + + unassign: <f_grouplevels_line>. + add 1 to l_tabix. + + read table LT_GROUPLEVELS_KKBLO assigning <f_grouplevels_line> + index l_tabix. + if sy-subrc ne 0 + or <f_grouplevels_line>-index_to ne l_save_index. + exit. + endif. + + unassign: + <f_collect_tab>, + <f_collect_line>. + + enddo. + endif. + + clear: + l_tabix, + l_save_index. + + unassign: + <f_filter_idx_line>, + <f_grouplevels_line>. + + endloop. + +* free local data + + unassign: + <f_line>, + <f_collect_tab>, + <f_collect_line>, + <f_fieldcat_line>. + +* append grand total line + + IF <f_collect00> is assigned. + assign <f_collect00> to <f_collect_tab>. + if <f_collect_tab> is not initial. + LOOP AT <f_collect_tab> assigning <f_collect_line>. + + append <f_collect_line> to <f_excel_tab>. + +* save total line index + + wa_subtot_indexs-index = sy-tabix. + append wa_subtot_indexs to lt_subtot_indexs. + +* append grand total range (to format) + + add 1 to l_sub_index. + subrangeitem-name = l_sub_index. + condense subrangeitem-name. + concatenate 'TOTAL' + subrangeitem-name + into subrangeitem-name. + + subrangeitem-rows = wa_subtot_indexs-index. + subrangeitem-columns = 1. " start col + append subrangeitem to subranges. + ENDLOOP. + endif. + ENDIF. + + clear: + subrangeitem, + LT_SORT_KKBLO, + <f_collect00>, + <f_collect01>, + <f_collect02>, + <f_collect03>, + <f_collect04>, + <f_collect05>, + <f_collect06>, + <f_collect07>, + <f_collect08>, + <f_collect09>. + + unassign: + <f_collect00>, + <f_collect01>, + <f_collect02>, + <f_collect03>, + <f_collect04>, + <f_collect05>, + <f_collect06>, + <f_collect07>, + <f_collect08>, + <f_collect09>, + <f_collect_tab>, + <f_collect_line>. + +*--------------------------------------------------------------------* +* SESSION 3: MAP DATA TO SEMANTIC TABLE +*--------------------------------------------------------------------* + +* get dependent field field: currency and quantity + + create data wa like line of <f_excel_tab>. + assign wa->* to <f_excel_line>. + + describe field <f_excel_line> type l_typ components l_num. + + do l_num times. + l_save_index = sy-index. + assign component l_save_index of structure <f_excel_line> + to <f_excel_column>. + if sy-subrc ne 0. + message e059(0k) with 'FATAL ERROR' raising fatal_error. + endif. + + loop at LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> + where tabname = l_tabname. + assign component <f_fieldcat_line>-fieldname + of structure <f_excel_line> to <f_fcat_column>. + + describe distance between <f_excel_column> and <f_fcat_column> + into l_int in byte mode. + +* append column index +* this columns index is of table, not fieldcat + + if l_int = 0. + wa_column_index-fieldname = <f_fieldcat_line>-fieldname. + wa_column_index-tabname = <f_fieldcat_line>-tabname. + wa_column_index-col = l_save_index. + append wa_column_index to lt_column_index. + endif. + +* append dependent fields (currency and quantity unit) + + if <f_fieldcat_line>-cfieldname is not initial. + clear wa_fieldcat_depf. + wa_fieldcat_depf-fieldname = <f_fieldcat_line>-cfieldname. + wa_fieldcat_depf-tabname = <f_fieldcat_line>-ctabname. + collect wa_fieldcat_depf into lt_fieldcat_depf. + endif. + + if <f_fieldcat_line>-qfieldname is not initial. + clear wa_fieldcat_depf. + wa_fieldcat_depf-fieldname = <f_fieldcat_line>-qfieldname. + wa_fieldcat_depf-tabname = <f_fieldcat_line>-qtabname. + collect wa_fieldcat_depf into lt_fieldcat_depf. + endif. + +* rewrite field data type + + if <f_fieldcat_line>-inttype = 'X' + and <f_fieldcat_line>-datatype(3) = 'INT'. + <f_fieldcat_line>-inttype = 'I'. + endif. + + endloop. + + clear: l_save_index. + unassign: <f_fieldcat_line>. + + enddo. + +* build semantic tables + + l_n_hrz_keys = 1. + +* Get keyfigures + + loop at LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> + where tabname = l_tabname + and tech ne 'X' + and no_out ne 'X'. + + clear wa_sema. + clear wa_hkey. + +* Units belong to keyfigures -> display as str + + read table lt_fieldcat_depf into wa_fieldcat_depf with key + fieldname = <f_fieldcat_line>-fieldname + tabname = <f_fieldcat_line>-tabname. + + if sy-subrc = 0. + wa_sema-col_typ = 'STR'. + wa_sema-col_ops = 'DFT'. + +* Keyfigures + + else. + case <f_fieldcat_line>-datatype. + when 'QUAN'. + wa_sema-col_typ = 'N03'. + + if <f_fieldcat_line>-no_sum ne 'X'. + wa_sema-col_ops = 'ADD'. + else. + wa_sema-col_ops = 'NOP'. " no dependent field + endif. + + when 'DATS'. + wa_sema-col_typ = 'DAT'. + wa_sema-col_ops = 'NOP'. + + when 'CHAR' OR 'UNIT' OR 'CUKY'. " Added fieldformats UNIT and CUKY - dd. 26-10-2012 Wouter Heuvelmans + wa_sema-col_typ = 'STR'. + wa_sema-col_ops = 'DFT'. " dependent field + +* incase numeric, ex '00120' -> display as '12' + + when 'NUMC'. + wa_sema-col_typ = 'STR'. + wa_sema-col_ops = 'DFT'. + + when others. + wa_sema-col_typ = 'NUM'. + + if <f_fieldcat_line>-no_sum ne 'X'. + wa_sema-col_ops = 'ADD'. + else. + wa_sema-col_ops = 'NOP'. + endif. + endcase. + endif. + + l_counter = l_counter + 1. + l_n_att_cols = l_n_att_cols + 1. + + wa_sema-col_no = l_counter. + + read table lt_column_index into wa_column_index with key + fieldname = <f_fieldcat_line>-fieldname + tabname = <f_fieldcat_line>-tabname. + + if sy-subrc = 0. + wa_sema-col_src = wa_column_index-col. + else. + raise fatal_error. + endif. + +* columns index of ref currency field in table + + if not <f_fieldcat_line>-cfieldname is initial. + read table lt_column_index into wa_column_index with key + fieldname = <f_fieldcat_line>-cfieldname + tabname = <f_fieldcat_line>-ctabname. + + if sy-subrc = 0. + wa_sema-col_cur = wa_column_index-col. + endif. + +* quantities fields +* treat as currency when display on excel + + elseif not <f_fieldcat_line>-qfieldname is initial. + read table lt_column_index into wa_column_index with key + fieldname = <f_fieldcat_line>-qfieldname + tabname = <f_fieldcat_line>-qtabname. + if sy-subrc = 0. + wa_sema-col_cur = wa_column_index-col. + endif. + + endif. + +* Treat of fixed currency in the fieldcatalog for column + + data: l_num_help(2) type n. + + if not <f_fieldcat_line>-currency is initial. + + select * from tcurx into table lt_tcurx. + sort lt_tcurx. + read table lt_tcurx into wa_tcurx + with key currkey = <f_fieldcat_line>-currency. + if sy-subrc = 0. + l_num_help = wa_tcurx-currdec. + concatenate 'N' l_num_help into wa_sema-col_typ. + wa_sema-col_cur = sy-tabix * ( -1 ). + endif. + + endif. + + wa_hkey-col_no = l_n_att_cols. + wa_hkey-row_no = l_n_hrz_keys. + wa_hkey-col_name = <f_fieldcat_line>-reptext. + append wa_hkey to lt_hkey. + append wa_sema to lt_sema. + + endloop. + +* free local data + + clear: + lt_column_index, + wa_column_index, + lt_fieldcat_depf, + wa_fieldcat_depf, + lt_tcurx, + wa_tcurx, + l_num, + l_typ, + wa, + l_int, + l_counter. + + unassign: + <f_fieldcat_line>, + <f_excel_line>, + <f_excel_column>, + <f_fcat_column>. + +*--------------------------------------------------------------------* +* SESSION 4: WRITE TO EXCEL +*--------------------------------------------------------------------* + + clear: wa_tcurx. + refresh: lt_tcurx. + +* if spreadsheet dun have proxy yet + + if li_has is initial. + l_retcode = c_oi_errors=>ret_interface_not_supported. + call method c_oi_errors=>create_error_for_retcode + EXPORTING + retcode = l_retcode + no_flush = no_flush + IMPORTING + error = lo_error_w. + exit. + endif. + + create object l_error + EXPORTING + object_name = 'OLE_DOCUMENT_PROXY' + method_name = 'get_ranges_names'. + + call method c_oi_errors=>add_error + EXPORTING + error = l_error. + + + describe table lt_sema lines datareal. + describe table <f_excel_tab> lines datac. + describe table lt_vkey lines vkeycount. + + if datac = 0. + raise inv_data_range. + endif. + + + if vkeycount ne l_n_vrt_keys. + raise dim_mismatch_vkey. + endif. + + all = l_n_vrt_keys + l_n_att_cols. + + if datareal ne all. + raise dim_mismatch_sema. + endif. + + data: decimal type c. + +* get decimal separator format ('.', ',', ...) in Office config + + call method lo_proxy->get_application_property + EXPORTING + property_name = 'INTERNATIONAL' + subproperty_name = 'DECIMAL_SEPARATOR' + CHANGING + retvalue = decimal. + + data: wa_usr type usr01. + select * from usr01 into wa_usr where bname = sy-uname. + endselect. + + data: comma_elim(4) type c. + data: help6 type i. + field-symbols <g> type any. + data search_item(4) value ' #'. + + concatenate ',' decimal '.' decimal into comma_elim. + + data help type i. " table (with subtotal) line number + + help = datac. + + data: rowmax type i value 1. " header row number + data: columnmax type i value 0. " header columns number + + loop at lt_hkey into hkeyitem. + if hkeyitem-col_no > columnmax. + columnmax = hkeyitem-col_no. + endif. + + if hkeyitem-row_no > rowmax. + rowmax = hkeyitem-row_no. + endif. + endloop. + + data: hkeycolumns type i. " header columns no + + hkeycolumns = columnmax. + + if hkeycolumns < l_n_att_cols. + hkeycolumns = l_n_att_cols. + endif. + + columnmax = 0. + + loop at lt_vkey into vkeyitem. + if vkeyitem-col_no > columnmax. + columnmax = vkeyitem-col_no. + endif. + endloop. + + data overflow type i value 1. + data testname(10) type c. + data temp2 type i. " 1st item row position in excel + data realmit type i value 1. + data realoverflow type i value 1. " row index in content + + call method lo_spreadsheet->screen_update + EXPORTING + updating = ''. + + call method lo_spreadsheet->load_lib. + + data: str(40) type c. " range names of columns range (w/o col header) + data: rows type i. " row postion of 1st item line in ecxel + +* calculate row position of data table + + describe table iT_LISTHEADER lines li_commentary_rows. + +* if grid had title, add 1 empy line between title and table + + if li_commentary_rows ne 0. + add 1 to li_commentary_rows. + endif. + +* add top position of block data + + li_commentary_rows = li_commentary_rows + i_top - 1. + +* write header (commentary rows) + + data: li_commentary_row_index type i value 1. + data: li_content_index type i value 1. + data: ls_index(10) type c. + data ls_commentary_range(40) type c value 'TITLE'. + data: li_font_bold type i. + data: li_font_italic type i. + data: li_font_size type i. + + loop at iT_LISTHEADER into wa_listheader. + li_commentary_row_index = i_top + li_content_index - 1. + ls_index = li_content_index. + condense ls_index. + concatenate ls_commentary_range(5) ls_index + into ls_commentary_range. + condense ls_commentary_range. + +* insert title range + + call method lo_spreadsheet->insert_range_dim + EXPORTING + name = ls_commentary_range + top = li_commentary_row_index + left = i_left + rows = 1 + columns = 1 + no_flush = no_flush. + +* format range + + case wa_listheader-typ. + when 'H'. "title + li_font_size = 16. + li_font_bold = 1. + li_font_italic = -1. + when 'S'. "subtile + li_font_size = -1. + li_font_bold = 1. + li_font_italic = -1. + when others. "'A' comment + li_font_size = -1. + li_font_bold = -1. + li_font_italic = 1. + endcase. + + call method lo_spreadsheet->set_font + EXPORTING + rangename = ls_commentary_range + family = '' + size = li_font_size + bold = li_font_bold + italic = li_font_italic + align = 0 + no_flush = no_flush. + +* title: range content + + rangeitem-name = ls_commentary_range. + rangeitem-columns = 1. + rangeitem-rows = 1. + append rangeitem to ranges. + + contentsitem-row = li_content_index. + contentsitem-column = 1. + concatenate wa_listheader-key + wa_listheader-info + into contentsitem-value + separated by space. + condense contentsitem-value. + append contentsitem to contents. + + add 1 to li_content_index. + + clear: + rangeitem, + contentsitem, + ls_index. + + endloop. + +* set range data title + + call method lo_spreadsheet->set_ranges_data + EXPORTING + ranges = ranges + contents = contents + no_flush = no_flush. + + refresh: + ranges, + contents. + + rows = rowmax + li_commentary_rows + 1. + + all = wa_usr-datfm. + all = all + 3. + + loop at lt_sema into semaitem. + if semaitem-col_typ = 'DAT' or semaitem-col_typ = 'MON' or + semaitem-col_typ = 'N00' or semaitem-col_typ = 'N01' or + semaitem-col_typ = 'N01' or semaitem-col_typ = 'N02' or + semaitem-col_typ = 'N03' or semaitem-col_typ = 'PCT' or + semaitem-col_typ = 'STR' or semaitem-col_typ = 'NUM'. + clear str. + str = semaitem-col_no. + condense str. + concatenate 'DATA' str into str. + mit = semaitem-col_no. + li_col_pos = semaitem-col_no + i_left - 1. + +* range from data1 to data(n), for each columns of table + + call method lo_spreadsheet->insert_range_dim + EXPORTING + name = str + top = rows + left = li_col_pos + rows = help + columns = 1 + no_flush = no_flush. + + data dec type i value -1. + data typeinfo type sydes_typeinfo. + loop at <f_excel_tab> assigning <line>. + assign component semaitem-col_no of structure <line> to <item>. + describe field <item> into td. + read table td-types index 1 into typeinfo. + if typeinfo-type = 'P'. + dec = typeinfo-decimals. + elseif typeinfo-type = 'I'. + dec = 0. + endif. + + describe field <line> type typ components count. + mit = 1. + do count times. + if mit = semaitem-col_src. + assign component sy-index of structure <line> to <item>. + describe field <item> into td. + read table td-types index 1 into typeinfo. + if typeinfo-type = 'P'. + dec = typeinfo-decimals. + endif. + exit. + endif. + mit = mit + 1. + enddo. + exit. + endloop. + +* format for each columns of table (w/o columns headers) + + if semaitem-col_typ = 'DAT'. + if semaitem-col_no > vkeycount. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = all + no_flush = no_flush. + else. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 0 + no_flush = no_flush. + endif. + elseif semaitem-col_typ = 'STR'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 0 + no_flush = no_flush. + elseif semaitem-col_typ = 'MON'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 10 + no_flush = no_flush. + elseif semaitem-col_typ = 'N00'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 1 + decimals = 0 + no_flush = no_flush. + elseif semaitem-col_typ = 'N01'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 1 + decimals = 1 + no_flush = no_flush. + elseif semaitem-col_typ = 'N02'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 1 + decimals = 2 + no_flush = no_flush. + elseif semaitem-col_typ = 'N03'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 1 + decimals = 3 + no_flush = no_flush. + elseif semaitem-col_typ = 'N04'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 1 + decimals = 4 + no_flush = no_flush. + elseif semaitem-col_typ = 'NUM'. + if dec eq -1. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 1 + decimals = 2 + no_flush = no_flush. + else. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 1 + decimals = dec + no_flush = no_flush. + endif. + elseif semaitem-col_typ = 'PCT'. + call method lo_spreadsheet->set_format + EXPORTING + rangename = str + currency = '' + typ = 3 + decimals = 0 + no_flush = no_flush. + endif. + + endif. + endloop. + +* get item contents for set_range_data method +* get currency cell also + + mit = 1. + + data: currcells type soi_cell_table. + data: curritem type soi_cell_item. + + curritem-rows = 1. + curritem-columns = 1. + curritem-front = -1. + curritem-back = -1. + curritem-font = ''. + curritem-size = -1. + curritem-bold = -1. + curritem-italic = -1. + curritem-align = -1. + curritem-frametyp = -1. + curritem-framecolor = -1. + curritem-currency = ''. + curritem-number = 1. + curritem-input = -1. + + data: conv_exit(10) type c. + data: const type i. + +* Change for Correction request +* Initial 10000 lines are missing in Excel Export +* if there are only 2 columns in exported List object. + + if datareal gt 2. + const = 20000 / datareal. + else. + const = 20000 / ( datareal + 2 ). + endif. + + data: lines type i. + data: innerlines type i. + data: counter type i. + data: curritem2 like curritem. + data: curritem3 like curritem. + data: length type i. + data: found. + +* append content table (for method set_range_content) + + loop at <f_excel_tab> assigning <line>. + +* save line index to compare with lt_subtot_indexs, +* to discover line is a subtotal / totale line or not +* ex use to set 'dun display zero in subtotal / total line' + + l_save_index = sy-tabix. + + do datareal times. + read table lt_sema into semaitem with key col_no = sy-index. + if semaitem-col_src ne 0. + assign component semaitem-col_src + of structure <line> to <item>. + else. + assign component sy-index + of structure <line> to <item>. + endif. + + contentsitem-row = realoverflow. + + if sy-subrc = 0. + move semaitem-col_ops to search_item(3). + search 'ADD#CNT#MIN#MAX#AVG#NOP#DFT#' + for search_item. + if sy-subrc ne 0. + raise error_in_sema. + endif. + move semaitem-col_typ to search_item(3). + search 'NUM#N00#N01#N02#N03#N04#PCT#DAT#MON#STR#' + for search_item. + if sy-subrc ne 0. + raise error_in_sema. + endif. + contentsitem-column = sy-index. + if semaitem-col_typ eq 'DAT' or semaitem-col_typ eq 'MON'. + if semaitem-col_no > vkeycount. + + " Hinweis 512418 + " EXCEL bezieht Datumsangaben + " auf den 31.12.1899, behandelt + " aber 1900 als ein Schaltjahr + " d.h. ab 1.3.1900 korrekt + " 1.3.1900 als Zahl = 61 + + data: genesis type d value '18991230'. + data: number_of_days type p. +* change for date in char format & sema_type = X + data: temp_date type d. + + if not <item> is initial and not <item> co ' ' and not + <item> co '0'. +* change for date in char format & sema_type = X starts + if sema_type = 'X'. + describe field <item> type typ. + if typ = 'C'. + temp_date = <item>. + number_of_days = temp_date - genesis. + else. + number_of_days = <item> - genesis. + endif. + else. + number_of_days = <item> - genesis. + endif. +* change for date in char format & sema_type = X ends + if number_of_days < 61. + number_of_days = number_of_days - 1. + endif. + + set country 'DE'. + write number_of_days to contentsitem-value + no-grouping + left-justified. + set country space. + translate contentsitem-value using comma_elim. + else. + clear contentsitem-value. + endif. + else. + move <item> to contentsitem-value. + endif. + elseif semaitem-col_typ eq 'NUM' or + semaitem-col_typ eq 'N00' or + semaitem-col_typ eq 'N01' or + semaitem-col_typ eq 'N02' or + semaitem-col_typ eq 'N03' or + semaitem-col_typ eq 'N04' or + semaitem-col_typ eq 'PCT'. + set country 'DE'. + describe field <item> type typ. + + if semaitem-col_cur is initial. + if typ ne 'F'. + write <item> to contentsitem-value no-grouping + no-sign decimals 14. + else. + write <item> to contentsitem-value no-grouping + no-sign. + endif. + else. +* Treat of fixed curreny for column >>Y9CK007319 + if semaitem-col_cur < 0. + semaitem-col_cur = semaitem-col_cur * ( -1 ). + select * from tcurx into table lt_tcurx. + sort lt_tcurx. + read table lt_tcurx into + wa_tcurx index semaitem-col_cur. + if sy-subrc = 0. + if typ ne 'F'. + write <item> to contentsitem-value no-grouping + currency wa_tcurx-currkey no-sign decimals 14. + else. + write <item> to contentsitem-value no-grouping + currency wa_tcurx-currkey no-sign. + endif. + endif. + else. + assign component semaitem-col_cur + of structure <line> to <g>. +* mit = index of recent row + curritem-top = rowmax + mit + li_commentary_rows. + + li_col_pos = sy-index + i_left - 1. + curritem-left = li_col_pos. + +* if filed is quantity field (qfieldname ne space) +* or amount field (cfieldname ne space), then format decimal place +* corresponding with config + + clear: l_def. + read table LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> + with key tabname = l_tabname + tech = space + no_out = space + col_pos = semaitem-col_no. + IF sy-subrc = 0. + IF <f_fieldcat_line>-cfieldname is not initial. + l_def = 'C'. + else."if <f_fieldcat_line>-qfieldname is not initial. + l_def = 'Q'. + ENDIF. + ENDIF. + +* if field is amount field +* exporting of amount field base on currency decimal table: TCURX + IF l_def = 'C'. "field is amount field + select single * from tcurx into wa_tcurx + where currkey = <g>. +* if amount ref to un-know currency -> default decimal = 2 + if sy-subrc eq 0. + curritem-decimals = wa_tcurx-currdec. + else. + curritem-decimals = 2. + endif. + + append curritem to currcells. + if typ ne 'F'. + write <item> to contentsitem-value + currency <g> + no-sign no-grouping. + else. + write <item> to contentsitem-value + decimals 14 currency <g> + no-sign no-grouping. + endif. + +* if field is quantity field +* exporting of quantity field base on quantity decimal table: T006 + + else."if l_def = 'Q'. " field is quantity field + clear: wa_t006. + select single * from t006 into wa_t006 + where MSEHI = <g>. +* if quantity ref to un-know unit-> default decimal = 2 + if sy-subrc eq 0. + curritem-decimals = wa_t006-decan. + else. + curritem-decimals = 2. + endif. + append curritem to currcells. + + write <item> to contentsitem-value + unit <g> + no-sign no-grouping. + condense contentsitem-value. + + ENDIF. + + endif. "Y9CK007319 + endif. + condense contentsitem-value. + +* add function fieldcat-no zero display + + loop at LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> + where tabname = l_tabname + and tech ne 'X' + and no_out ne 'X'. + if <f_fieldcat_line>-col_pos = semaitem-col_no. + if <f_fieldcat_line>-no_zero = 'X'. + if <item> = '0'. + clear: contentsitem-value. + endif. + +* dun display zero in total/subtotal line too + + else. + clear: wa_subtot_indexs. + read table lt_subtot_indexs into wa_subtot_indexs + with key index = l_save_index. + IF sy-subrc = 0. + if <item> = '0'. + clear: contentsitem-value. + endif. + ENDIF. + endif. + endif. + endloop. + unassign: <f_fieldcat_line>. + + if <item> lt 0. + search contentsitem-value for 'E'. + if sy-fdpos eq 0. + +* use prefix notation for signed numbers + + translate contentsitem-value using '- '. + condense contentsitem-value no-gaps. + concatenate '-' contentsitem-value + into contentsitem-value. + else. + concatenate '-' contentsitem-value + into contentsitem-value. + endif. + endif. + set country space. +* Hier wird nur die korrekte Kommaseparatierung gemacht, wenn die +* Zeichen einer +* Zahl enthalten sind. Das ist für Timestamps, die auch ":" enthalten. +* Für die +* darf keine Kommaseparierung stattfinden. +* Changing for correction request - Y6BK041073 + if contentsitem-value co '0123456789.,-+E '. + translate contentsitem-value using comma_elim. + endif. + else. + clear contentsitem-value. + +* if type is not numeric -> dun display with zero + + write <item> to contentsitem-value no-zero. + + shift contentsitem-value left deleting leading space. + + endif. + append contentsitem to contents. + endif. + enddo. + + realmit = realmit + 1. + realoverflow = realoverflow + 1. + + mit = mit + 1. +* overflow = current row index in content table + overflow = overflow + 1. + endloop. + + unassign: <f_fieldcat_line>. + +* set item range for set_range_data method + + testname = mit / const. + condense testname. + + concatenate 'TEST' testname into testname. + + realoverflow = realoverflow - 1. + realmit = realmit - 1. + help = realoverflow. + + rangeitem-name = testname. + rangeitem-columns = datareal. + rangeitem-rows = help. + append rangeitem to ranges. + +* insert item range dim + + temp2 = rowmax + 1 + li_commentary_rows + realmit - realoverflow. + +* items data + + call method lo_spreadsheet->insert_range_dim + EXPORTING + name = testname + top = temp2 + left = i_left + rows = help + columns = datareal + no_flush = no_flush. + +* get columns header contents for set_range_data method +* export columns header only if no columns header option = space + + data: rowcount type i. + data: columncount type i. + + if i_columns_header = 'X'. + +* append columns header to contents: hkey + + rowcount = 1. + do rowmax times. + columncount = 1. + do hkeycolumns times. + loop at lt_hkey into hkeyitem where col_no = columncount + and row_no = rowcount. + endloop. + if sy-subrc = 0. + str = hkeyitem-col_name. + contentsitem-value = hkeyitem-col_name. + else. + contentsitem-value = str. + endif. + contentsitem-column = columncount. + contentsitem-row = rowcount. + append contentsitem to contents. + columncount = columncount + 1. + enddo. + rowcount = rowcount + 1. + enddo. + +* incase columns header in multiline + + data: rowmaxtemp type i. + if rowmax > 1. + rowmaxtemp = rowmax - 1. + rowcount = 1. + do rowmaxtemp times. + columncount = 1. + do columnmax times. + contentsitem-column = columncount. + contentsitem-row = rowcount. + contentsitem-value = ''. + append contentsitem to contents. + columncount = columncount + 1. + enddo. + rowcount = rowcount + 1. + enddo. + endif. + +* append columns header to contents: vkey + + columncount = 1. + do columnmax times. + loop at lt_vkey into vkeyitem where col_no = columncount. + endloop. + contentsitem-value = vkeyitem-col_name. + contentsitem-row = rowmax. + contentsitem-column = columncount. + append contentsitem to contents. + columncount = columncount + 1. + enddo. +*--------------------------------------------------------------------* +* set header range for method set_range_data +* insert header keys range dim + + li_head_top = li_commentary_rows + 1. + li_col_pos = i_left. + +* insert range headers + + if hkeycolumns ne 0. + rangeitem-name = 'TESTHKEY'. + rangeitem-rows = rowmax. + rangeitem-columns = hkeycolumns. + append rangeitem to ranges. + clear: rangeitem. + + call method lo_spreadsheet->insert_range_dim + EXPORTING + name = 'TESTHKEY' + top = li_head_top + left = li_col_pos + rows = rowmax + columns = hkeycolumns + no_flush = no_flush. + endif. + endif. + +* format for columns header + total + subtotal +* ------------------------------------------ + + help = rowmax + realmit. " table + header lines + + data: item type colxxl_t. + data: lt_format type soi_format_table. + data: wa_format like line of lt_format. + data: wa_format_temp like line of lt_format. + + field-symbols: <f_source> type any. + field-symbols: <f_des> type any. + +* columns header format + + wa_format-front = -1. + wa_format-back = 15. "grey + wa_format-font = space. + wa_format-size = -1. + wa_format-bold = 1. + wa_format-align = 0. + wa_format-frametyp = -1. + wa_format-framecolor = -1. + +* get column header format from input record +* -> map input format + + if i_columns_header = 'X'. + wa_format-name = 'TESTHKEY'. + if i_format_col_header is not initial. + describe field i_format_col_header type l_typ components + li_col_num. + do li_col_num times. + if sy-index ne 1. " dun map range name + assign component sy-index of structure i_format_col_header + to <f_source>. + if <f_source> is not initial. + assign component sy-index of structure wa_format to <f_des>. + <f_des> = <f_source>. + unassign: <f_des>. + endif. + unassign: <f_source>. + endif. + enddo. + + clear: li_col_num. + endif. + + append wa_format to lt_format. + endif. + +* Zusammenfassen der Spalten mit gleicher Nachkommastellenzahl +* collect vertical cells (col) with the same number of decimal places +* to increase perfomance in currency cell format + + describe table currcells lines lines. + lines = lines - 1. + do lines times. + describe table currcells lines innerlines. + innerlines = innerlines - 1. + sort currcells by left top. + clear found. + do innerlines times. + read table currcells index sy-index into curritem. + counter = sy-index + 1. + read table currcells index counter into curritem2. + if curritem-left eq curritem2-left. + length = curritem-top + curritem-rows. + if length eq curritem2-top. + if curritem-decimals eq curritem2-decimals. + move curritem to curritem3. + curritem3-rows = curritem3-rows + curritem2-rows. + curritem-left = -1. + modify currcells index sy-index from curritem. + curritem2-left = -1. + modify currcells index counter from curritem2. + append curritem3 to currcells. + found = 'X'. + endif. + endif. + endif. + enddo. + if found is initial. + exit. + endif. + delete currcells where left = -1. + enddo. + +* Zusammenfassen der Zeilen mit gleicher Nachkommastellenzahl +* collect horizontal cells (row) with the same number of decimal places +* to increase perfomance in currency cell format + + describe table currcells lines lines. + lines = lines - 1. + do lines times. + describe table currcells lines innerlines. + innerlines = innerlines - 1. + sort currcells by top left. + clear found. + do innerlines times. + read table currcells index sy-index into curritem. + counter = sy-index + 1. + read table currcells index counter into curritem2. + if curritem-top eq curritem2-top and curritem-rows eq + curritem2-rows. + length = curritem-left + curritem-columns. + if length eq curritem2-left. + if curritem-decimals eq curritem2-decimals. + move curritem to curritem3. + curritem3-columns = curritem3-columns + curritem2-columns. + curritem-left = -1. + modify currcells index sy-index from curritem. + curritem2-left = -1. + modify currcells index counter from curritem2. + append curritem3 to currcells. + found = 'X'. + endif. + endif. + endif. + enddo. + if found is initial. + exit. + endif. + delete currcells where left = -1. + enddo. +* Ende der Zusammenfassung + + +* item data: format for currency cell, corresponding with currency + + call method lo_spreadsheet->cell_format + EXPORTING + cells = currcells + no_flush = no_flush. + +* item data: write item table content + + call method lo_spreadsheet->set_ranges_data + EXPORTING + ranges = ranges + contents = contents + no_flush = no_flush. + +* whole table range to format all table + + if i_columns_header = 'X'. + li_head_top = li_commentary_rows + 1. + else. + li_head_top = li_commentary_rows + 2. + help = help - 1. + endif. + + call method lo_spreadsheet->insert_range_dim + EXPORTING + name = 'WHOLE_TABLE' + top = li_head_top + left = i_left + rows = help + columns = datareal + no_flush = no_flush. + +* columns width auto fix +* this parameter = space in case use with exist template + + IF i_columns_autofit = 'X'. + call method lo_spreadsheet->fit_widest + EXPORTING + name = 'WHOLE_TABLE' + no_flush = no_flush. + ENDIF. + +* frame +* The parameter has 8 bits +*0 Left margin +*1 Top marginT +*2 Bottom margin +*3 Right margin +*4 Horizontal line +*5 Vertical line +*6 Thinness +*7 Thickness +* here 127 = 1111111 6-5-4-3-2-1 mean Thin-ver-hor-right-bot-top-left + +* ( final DOI method call, set no_flush = space +* equal to call method CL_GUI_CFW=>FLUSH ) + + call method lo_spreadsheet->set_frame + EXPORTING + rangename = 'WHOLE_TABLE' + typ = 127 + color = 1 + no_flush = space + IMPORTING + error = lo_error + retcode = lc_retcode. + + error_doi. + +* reformat subtotal / total line after format wholw table + + loop at subranges into subrangeitem. + l_sub_index = subrangeitem-rows + li_commentary_rows + rowmax. + + call method lo_spreadsheet->insert_range_dim + EXPORTING + name = subrangeitem-name + left = i_left + top = l_sub_index + rows = 1 + columns = datareal + no_flush = no_flush. + + wa_format-name = subrangeitem-name. + +* default format: +* - clolor: subtotal = light yellow, subtotal = yellow +* - frame: box + + IF subrangeitem-name(3) = 'SUB'. + wa_format-back = 36. "subtotal line + wa_format_temp = i_format_subtotal. + else. + wa_format-back = 27. "total line + wa_format_temp = i_format_total. + endif. + wa_format-FRAMETYP = 79. + wa_format-FRAMEcolor = 1. + wa_format-number = -1. + wa_format-align = -1. + +* get subtoal + total format from intput parameter +* overwrite default format + + if wa_format_temp is not initial. + describe field wa_format_temp type l_typ components li_col_num. + do li_col_num times. + if sy-index ne 1. " dun map range name + assign component sy-index of structure wa_format_temp + to <f_source>. + if <f_source> is not initial. + assign component sy-index of structure wa_format to <f_des>. + <f_des> = <f_source>. + unassign: <f_des>. + endif. + unassign: <f_source>. + endif. + enddo. + + clear: li_col_num. + endif. + + append wa_format to lt_format. + clear: wa_format-name. + clear: l_sub_index. + clear: wa_format_temp. + + endloop. + + if lt_format[] is not initial. + call method lo_spreadsheet->set_ranges_format + EXPORTING + formattable = lt_format + no_flush = no_flush. + refresh: lt_format. + endif. +*--------------------------------------------------------------------* + call method lo_spreadsheet->screen_update + EXPORTING + updating = 'X'. + + call method c_oi_errors=>flush_errors. + + lo_error_w = l_error. + lc_retcode = lo_error_w->error_code. + +** catch no_flush -> led to dump ( optional ) +* go_error = l_error. +* gc_retcode = go_error->error_code. +* error_doi. + + clear: + lt_sema, + wa_sema, + lt_hkey, + wa_hkey, + lt_vkey, + wa_vkey, + l_n_hrz_keys, + l_n_att_cols, + l_n_vrt_keys, + count, + datac, + datareal, + vkeycount, + all, + mit, + li_col_pos, + li_col_num, + ranges, + rangeitem, + contents, + contentsitem, + semaitem, + hkeyitem, + vkeyitem, + li_commentary_rows, + l_retcode, + li_head_top, + <f_excel_tab>. + + clear: + lo_error_w. + + unassign: + <line>, + <item>, + <f_excel_tab>. + +*--------------------------------------------------------------------* +* SESSION 5: SAVE AND CLOSE FILE +*--------------------------------------------------------------------* + +* ex of save path: 'FILE://C:\temp\test.xlsx' + concatenate 'FILE://' I_save_path + into ls_path. + + call method lo_proxy->save_document_to_url + EXPORTING + no_flush = 'X' + url = ls_path + IMPORTING + error = lo_error + retcode = lc_retcode + CHANGING + document_size = li_document_size. + + error_doi. + +* if save successfully -> raise successful message +* message i499(sy) with 'Document is Exported to ' p_path. + message i499(sy) with 'Data has been exported successfully'. + + clear: + ls_path, + li_document_size. + + close_document. + endmethod. + + + + + + + + method BIND_TABLE. +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (wi p) 2012-12-01 +* - ... +* aligning code +* message made to support multilinguality +*--------------------------------------------------------------------* +* issue #237 - Check if overlapping areas exist +* - Alessandro Iannacci 2012-12-01 +* changes: - Added raise if overlaps are detected +*--------------------------------------------------------------------* + + CONSTANTS: + lc_top_left_column TYPE zexcel_cell_column_alpha VALUE 'B', + lc_top_left_row TYPE zexcel_cell_row VALUE 3. + + DATA: + lv_row_int TYPE zexcel_cell_row, + lv_first_row TYPE zexcel_cell_row, + lv_last_row TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lt_field_catalog TYPE zexcel_t_fieldcatalog, + lv_id TYPE i, + lv_rows TYPE i, + lv_formula TYPE string, + ls_settings TYPE zexcel_s_table_settings, + lo_table TYPE REF TO zcl_excel_table, + lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line, + lv_value TYPE string, + lv_value_lowercase TYPE string, + lv_syindex TYPE char3, + lv_errormessage TYPE string, "ins issue #237 + + lv_columns TYPE i, + lt_columns TYPE zexcel_t_fieldcatalog, + lv_maxcol TYPE i, + lv_maxrow TYPE i, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_curtable TYPE REF TO zcl_excel_table. + + FIELD-SYMBOLS: + <ls_field_catalog> TYPE zexcel_s_fieldcatalog, + <ls_field_catalog_custom> TYPE zexcel_s_fieldcatalog, + <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY. + + ls_settings = is_table_settings. + + IF ls_settings-top_left_column IS INITIAL. + ls_settings-top_left_column = lc_top_left_column. + ENDIF. + + IF ls_settings-table_style IS INITIAL. + ls_settings-table_style = zcl_excel_table=>builtinstyle_medium2. + ENDIF. + + IF ls_settings-top_left_row IS INITIAL. + ls_settings-top_left_row = lc_top_left_row. + ENDIF. + + IF it_field_catalog IS NOT SUPPLIED. + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table ). + ELSE. + lt_field_catalog = it_field_catalog. + ENDIF. + + SORT lt_field_catalog BY position. + +*--------------------------------------------------------------------* +* issue #237 Check if overlapping areas exist Start +*--------------------------------------------------------------------* + "Get the number of columns for the current table + lt_columns = lt_field_catalog. + DELETE lt_columns WHERE dynpfld NE abap_true. + DESCRIBE TABLE lt_columns LINES lv_columns. + + "Calculate the top left row of the current table + lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). + lv_row_int = ls_settings-top_left_row. + + "Get number of row for the current table + DESCRIBE TABLE ip_table LINES lv_rows. + + "Calculate the bottom right row for the current table + lv_maxcol = lv_column_int + lv_columns - 1. + lv_maxrow = lv_row_int + lv_rows - 1. + ls_settings-bottom_right_column = zcl_excel_common=>convert_column2alpha( lv_maxcol ). + ls_settings-bottom_right_row = lv_maxrow. + + lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). + + lo_iterator = me->tables->if_object_collection~get_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + + lo_curtable ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF ( ( ls_settings-top_left_row GE lo_curtable->settings-top_left_row AND ls_settings-top_left_row LE lo_curtable->settings-bottom_right_row ) + OR + ( ls_settings-bottom_right_row GE lo_curtable->settings-top_left_row AND ls_settings-bottom_right_row LE lo_curtable->settings-bottom_right_row ) + ) + AND + ( ( lv_column_int GE zcl_excel_common=>convert_column2int( lo_curtable->settings-top_left_column ) AND lv_column_int LE zcl_excel_common=>convert_column2int( lo_curtable->settings-bottom_right_column ) ) + OR + ( lv_maxcol GE zcl_excel_common=>convert_column2int( lo_curtable->settings-top_left_column ) AND lv_maxcol LE zcl_excel_common=>convert_column2int( lo_curtable->settings-bottom_right_column ) ) + ). + lv_errormessage = 'Table overlaps with previously bound table and will not be added to worksheet.'(400). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + ENDWHILE. +*--------------------------------------------------------------------* +* issue #237 Check if overlapping areas exist End +*--------------------------------------------------------------------* + + CREATE OBJECT lo_table. + lo_table->settings = ls_settings. + lo_table->set_data( ir_data = ip_table ). + lv_id = me->excel->get_next_table_id( ). + lo_table->set_id( iv_id = lv_id ). +* lo_table->fieldcat = lt_field_catalog[]. + + me->tables->add( lo_table ). + +* It is better to loop column by column (only visible column) + LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true. + + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + + " Due restrinction of new table object we cannot have two column with the same name + " Check if a column with the same name exists, if exists add a counter + " If no medium description is provided we try to use small or long +* lv_value = <ls_field_catalog>-scrtext_m. + IF <ls_field_catalog>-scrtext_m IS NOT INITIAL. + lv_value = <ls_field_catalog>-scrtext_m. + <ls_field_catalog>-scrtext_l = lv_value. + ELSEIF <ls_field_catalog>-scrtext_s IS NOT INITIAL. + lv_value = <ls_field_catalog>-scrtext_s. + <ls_field_catalog>-scrtext_l = lv_value. + ELSEIF <ls_field_catalog>-scrtext_l IS NOT INITIAL. + lv_value = <ls_field_catalog>-scrtext_l. + ELSE. + lv_value = 'Column'. " default value as Excel does + <ls_field_catalog>-scrtext_l = lv_value. + ENDIF. + WHILE 1 = 1. + lv_value_lowercase = lv_value. + TRANSLATE lv_value_lowercase TO LOWER CASE. + READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH. + IF sy-subrc <> 0. + <ls_field_catalog>-scrtext_l = lv_value. + INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer. + EXIT. + ELSE. + lv_syindex = sy-index. + CONCATENATE <ls_field_catalog>-scrtext_l lv_syindex INTO lv_value. + ENDIF. + + ENDWHILE. + " First of all write column header + IF <ls_field_catalog>-style_header IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_value + ip_style = <ls_field_catalog>-style_header ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_value ). + ENDIF. + + ADD 1 TO lv_row_int. + LOOP AT ip_table ASSIGNING <fs_table_line>. + + ASSIGN COMPONENT <ls_field_catalog>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + " issue #290 Add formula support in table + IF <ls_field_catalog>-formula EQ abap_true. + IF <ls_field_catalog>-style IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = <fs_fldval> + ip_style = <ls_field_catalog>-style ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = <fs_fldval> ). + ENDIF. + ELSE. + IF <ls_field_catalog>-style IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> + ip_style = <ls_field_catalog>-style ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> ). + ENDIF. + ENDIF. + ADD 1 TO lv_row_int. + + ENDLOOP. + IF sy-subrc <> 0. "create empty row if table has no data + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = space ). + ADD 1 TO lv_row_int. + ENDIF. + +*--------------------------------------------------------------------* + " totals +*--------------------------------------------------------------------* + IF <ls_field_catalog>-totals_function IS NOT INITIAL. + lv_formula = lo_table->get_totals_formula( ip_column = <ls_field_catalog>-scrtext_l ip_function = <ls_field_catalog>-totals_function ). + IF <ls_field_catalog>-style_total IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = lv_formula + ip_style = <ls_field_catalog>-style_total ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = lv_formula ). + ENDIF. + ENDIF. + + lv_row_int = ls_settings-top_left_row. + ADD 1 TO lv_column_int. + +*--------------------------------------------------------------------* + " conditional formatting +*--------------------------------------------------------------------* + IF <ls_field_catalog>-cond_style IS NOT INITIAL. + lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header + lv_last_row = ls_settings-top_left_row + lv_rows. + <ls_field_catalog>-cond_style->set_range( ip_start_column = lv_column_alpha + ip_start_row = lv_first_row + ip_stop_column = lv_column_alpha + ip_stop_row = lv_last_row ). + ENDIF. + + ENDLOOP. + +*--------------------------------------------------------------------* + " Set field catalog +*--------------------------------------------------------------------* + lo_table->fieldcat = lt_field_catalog[]. + + es_table_settings = ls_settings. + es_table_settings-bottom_right_column = lv_column_alpha. + " >> Issue #291 + IF ip_table IS INITIAL. + es_table_settings-bottom_right_row = ls_settings-top_left_row + 2. "Last rows + ELSE. + es_table_settings-bottom_right_row = ls_settings-top_left_row + lv_rows + 1. "Last rows + ENDIF. + " << Issue #291 + + endmethod. + + + + + + + *--------------------------------------------------------------------* +* issue #293 - Roberto Bianco +* - Christian Assig 2014-03-14 +* +* changes: - Calculate widths using SAPscript font metrics +* (transaction SE73) +* - Calculate the width of dates +* - Add additional width for auto filter buttons +* - Add cell padding to simulate Excel behavior +*--------------------------------------------------------------------* +METHOD calculate_cell_width. + + CONSTANTS: + lc_default_font_name TYPE zexcel_style_font_name VALUE 'Calibri', "#EC NOTEXT + lc_default_font_height TYPE tdfontsize VALUE '110', + lc_excel_cell_padding TYPE float VALUE '0.75'. + + DATA: ld_cell_value TYPE zexcel_cell_value, + ld_current_character TYPE c LENGTH 1, + ld_style_guid TYPE zexcel_cell_style, + ls_stylemapping TYPE zexcel_s_stylemapping, + lo_table_object TYPE REF TO object, + lo_table TYPE REF TO zcl_excel_table, + ld_table_top_left_column TYPE zexcel_cell_column, + ld_table_bottom_right_column TYPE zexcel_cell_column, + ld_flag_contains_auto_filter TYPE abap_bool VALUE abap_false, + ld_flag_bold TYPE abap_bool VALUE abap_false, + ld_flag_italic TYPE abap_bool VALUE abap_false, + ld_date TYPE d, + ld_date_char TYPE c LENGTH 50, + ld_font_height TYPE tdfontsize VALUE lc_default_font_height, + lt_itcfc TYPE STANDARD TABLE OF itcfc, + ld_offset TYPE i, + ld_length TYPE i, + ld_uccp TYPE i, + ls_font_metric TYPE mty_s_font_metric, + ld_width_from_font_metrics TYPE i, + ld_font_family TYPE itcfh-tdfamily, + ld_font_name TYPE zexcel_style_font_name VALUE lc_default_font_name, + lt_font_families LIKE STANDARD TABLE OF ld_font_family, + ls_font_cache TYPE mty_s_font_cache. + + FIELD-SYMBOLS: <ls_font_cache> TYPE mty_s_font_cache, + <ls_font_metric> TYPE mty_s_font_metric, + <ls_itcfc> TYPE itcfc. + + " Determine cell content and cell style + me->get_cell( EXPORTING ip_column = ip_column + ip_row = ip_row + IMPORTING ep_value = ld_cell_value + ep_guid = ld_style_guid ). + + " ABAP2XLSX uses tables to define areas containing headers and + " auto-filters. Find out if the current cell is in the header + " of one of these tables. + LOOP AT me->tables->collection INTO lo_table_object. + " Downcast: OBJECT -> ZCL_EXCEL_TABLE + lo_table ?= lo_table_object. + + " Convert column letters to corresponding integer values + ld_table_top_left_column = + zcl_excel_common=>convert_column2int( + lo_table->settings-top_left_column ). + + ld_table_bottom_right_column = + zcl_excel_common=>convert_column2int( + lo_table->settings-bottom_right_column ). + + " Is the current cell part of the table header? + IF ip_column BETWEEN ld_table_top_left_column AND + ld_table_bottom_right_column AND + ip_row EQ lo_table->settings-top_left_row. + " Current cell is part of the table header + " -> Assume that an auto filter is present and that the font is + " bold + ld_flag_contains_auto_filter = abap_true. + ld_flag_bold = abap_true. + ENDIF. + ENDLOOP. + + " If a style GUID is present, read style attributes + IF ld_style_guid IS NOT INITIAL. + TRY. + " Read style attributes + ls_stylemapping = me->excel->get_style_to_guid( ld_style_guid ). + + " If the current cell contains the default date format, + " convert the cell value to a date and calculate its length + IF ls_stylemapping-complete_style-number_format-format_code = + zcl_excel_style_number_format=>c_format_date_std. + + " Convert excel date to ABAP date + ld_date = + zcl_excel_common=>excel_string_to_date( ld_cell_value ). + + " Format ABAP date using user's formatting settings + WRITE ld_date TO ld_date_char. + + " Remember the formatted date to calculate the cell size + ld_cell_value = ld_date_char. + + ENDIF. + + " Read the font size and convert it to the font height + " used by SAPscript (multiplication by 10) + IF ls_stylemapping-complete_stylex-font-size = abap_true. + ld_font_height = ls_stylemapping-complete_style-font-size * 10. + ENDIF. + + " If set, remember the font name + IF ls_stylemapping-complete_stylex-font-name = abap_true. + ld_font_name = ls_stylemapping-complete_style-font-name. + ENDIF. + + " If set, remember whether font is bold and italic. + IF ls_stylemapping-complete_stylex-font-bold = abap_true. + ld_flag_bold = ls_stylemapping-complete_style-font-bold. + ENDIF. + + IF ls_stylemapping-complete_stylex-font-italic = abap_true. + ld_flag_italic = ls_stylemapping-complete_style-font-italic. + ENDIF. + + CATCH zcx_excel ##NO_HANDLER. + " Style GUID is present, but style was not found + " Continue with default values + + ENDTRY. + ENDIF. + + " Check if the same font (font name and font attributes) was already + " used before + READ TABLE mth_font_cache + WITH TABLE KEY + font_name = ld_font_name + font_height = ld_font_height + flag_bold = ld_flag_bold + flag_italic = ld_flag_italic + ASSIGNING <ls_font_cache>. + + IF sy-subrc <> 0. + " Font is used for the first time + " Add the font to our local font cache + ls_font_cache-font_name = ld_font_name. + ls_font_cache-font_height = ld_font_height. + ls_font_cache-flag_bold = ld_flag_bold. + ls_font_cache-flag_italic = ld_flag_italic. + INSERT ls_font_cache INTO TABLE mth_font_cache + ASSIGNING <ls_font_cache>. + + " Determine the SAPscript font family name from the Excel + " font name + SELECT tdfamily + FROM tfo01 + INTO TABLE lt_font_families + UP TO 1 ROWS + WHERE tdtext = ld_font_name. + + " Check if a matching font family was found + " Fonts can be uploaded from TTF files using transaction SE73 + IF lines( lt_font_families ) > 0. + READ TABLE lt_font_families INDEX 1 INTO ld_font_family. + + " Load font metrics (returns a table with the size of each letter + " in the font) + CALL FUNCTION 'LOAD_FONT' + EXPORTING + family = ld_font_family + height = ld_font_height + printer = 'SWIN' + bold = ld_flag_bold + italic = ld_flag_italic + TABLES + metric = lt_itcfc + EXCEPTIONS + font_family = 1 + codepage = 2 + device_type = 3 + OTHERS = 4. + IF sy-subrc <> 0. + CLEAR lt_itcfc. + ENDIF. + + " For faster access, convert each character number to the actual + " character, and store the characters and their sizes in a hash + " table + LOOP AT lt_itcfc ASSIGNING <ls_itcfc>. + ld_uccp = <ls_itcfc>-cpcharno. + ls_font_metric-char = + cl_abap_conv_in_ce=>uccpi( ld_uccp ). + ls_font_metric-char_width = <ls_itcfc>-tdcwidths. + INSERT ls_font_metric + INTO TABLE <ls_font_cache>-th_font_metrics. + ENDLOOP. + + ENDIF. + ENDIF. + + " Calculate the cell width + " If available, use font metrics + IF lines( <ls_font_cache>-th_font_metrics ) = 0. + " Font metrics are not available + " -> Calculate the cell width using only the font size + ld_length = strlen( ld_cell_value ). + ep_width = ld_length * ld_font_height / lc_default_font_height + lc_excel_cell_padding. + + ELSE. + " Font metrics are available + + " Calculate the size of the text by adding the sizes of each + " letter + ld_length = strlen( ld_cell_value ). + DO ld_length TIMES. + " Subtract 1, because the first character is at offset 0 + ld_offset = sy-index - 1. + + " Read the current character from the cell value + ld_current_character = ld_cell_value+ld_offset(1). + + " Look up the size of the current letter + READ TABLE <ls_font_cache>-th_font_metrics + WITH TABLE KEY char = ld_current_character + ASSIGNING <ls_font_metric>. + IF sy-subrc = 0. + " The size of the letter is known + " -> Add the actual size of the letter + ADD <ls_font_metric>-char_width TO ld_width_from_font_metrics. + ELSE. + " The size of the letter is unknown + " -> Add the font height as the default letter size + ADD ld_font_height TO ld_width_from_font_metrics. + ENDIF. + ENDDO. + + " Add cell padding (Excel makes columns a bit wider than the space + " that is needed for the text itself) and convert unit + " (division by 100) + ep_width = ld_width_from_font_metrics / 100 + lc_excel_cell_padding. + ENDIF. + + " If the current cell contains an auto filter, make it a bit wider. + " The size used by the auto filter button does not depend on the font + " size. + IF ld_flag_contains_auto_filter = abap_true. + ADD 2 TO ep_width. + ENDIF. + +ENDMETHOD. + + + + method CALCULATE_COLUMN_WIDTHS. + TYPES: + BEGIN OF t_auto_size, + col_index TYPE int4, + width TYPE float, + END OF t_auto_size. + TYPES: tt_auto_size TYPE TABLE OF t_auto_size. + + DATA: column_dimensions TYPE zexcel_t_worksheet_columndime. + DATA: column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + + DATA: auto_size TYPE flag. + DATA: auto_sizes TYPE tt_auto_size. +* DATA: col_alpha TYPE zexcel_cell_column_alpha." issue #155 - less restrictive typing for ip_column + DATA: cell_value TYPE zexcel_cell_value. + DATA: cell_style TYPE REF TO zcl_excel_style. + DATA: count TYPE int4. + DATA: highest_row TYPE int4. + DATA: width TYPE float. + + FIELD-SYMBOLS: <column_dimension> LIKE LINE OF column_dimensions. + FIELD-SYMBOLS: <auto_size> LIKE LINE OF auto_sizes. + + column_dimensions[] = me->get_column_dimensions( ). + LOOP AT column_dimensions ASSIGNING <column_dimension>. + auto_size = <column_dimension>-column_dimension->get_auto_size( ). + IF auto_size = abap_true. + APPEND INITIAL LINE TO auto_sizes ASSIGNING <auto_size>. + <auto_size>-col_index = <column_dimension>-column_dimension->get_column_index( ). + <auto_size>-width = -1. + ENDIF. + ENDLOOP. + + " There is only something to do if there are some auto-size columns + IF NOT auto_sizes IS INITIAL. + highest_row = me->get_highest_row( ). + LOOP AT auto_sizes ASSIGNING <auto_size>. +* col_alpha = zcl_excel_common=>convert_column2alpha( <auto_size>-col_index )." issue #155 - less restrictive typing for ip_column + count = 1. + WHILE count <= highest_row. +* Do not check merged cells + IF is_cell_merged( + ip_column = <auto_size>-col_index + ip_row = count ) = abap_false. +* Start of change # issue 139 - Dateretention of cellstyles +* IF cell_style IS BOUND. +* CREATE OBJECT cell_style. +* ENDIF. +* me->get_cell( +* EXPORTING +* ip_column = col_alpha " Cell Column +* ip_row = count " Cell Row +* IMPORTING +* ep_value = cell_value " Cell Value +* ep_style = cell_style " Request Cell Style as well +* ). +* " For an easy start we just take the number of characters as the width +* width = strlen( cell_value ). +* " Addition to solve issue #120, contribution by Stefan Schm#ƒÂ#cker +* " Calculate width using Font Size and Font Type +* IF cell_style IS BOUND +* AND cell_style->font IS BOUND. +* width = cell_style->font->calculate_text_width( cell_value ). +* ENDIF. +* width = calculate_cell_width( ip_column = col_alpha " issue #155 - less restrictive typing for ip_column + width = calculate_cell_width( ip_column = <auto_size>-col_index " issue #155 - less restrictive typing for ip_column + ip_row = count ). +* End of change # issue 139 - Dateretention of cellstyles + IF width > <auto_size>-width. + <auto_size>-width = width. + ENDIF. + ENDIF. + count = count + 1. + ENDWHILE. +* column_dimension = me->get_column_dimension( col_alpha ). " issue #155 - less restrictive typing for ip_column + column_dimension = me->get_column_dimension( <auto_size>-col_index ). " issue #155 - less restrictive typing for ip_column + column_dimension->set_width( <auto_size>-width ). + ENDLOOP. + ENDIF. + + endmethod. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + METHOD change_cell_style. + " issue # 139 + DATA: stylemapping TYPE zexcel_s_stylemapping, + + complete_style TYPE zexcel_s_cstyle_complete, + complete_stylex TYPE zexcel_s_cstylex_complete, + + borderx TYPE zexcel_s_cstylex_border, + l_guid TYPE zexcel_cell_style. "issue # 177 + +* We have a lot of parameters. Use some macros to make the coding more structured + + DEFINE clear_initial_colorxfields. + if &1-rgb is initial. + clear &2-rgb. + endif. + if &1-indexed is initial. + clear &2-indexed. + endif. + if &1-theme is initial. + clear &2-theme. + endif. + if &1-tint is initial. + clear &2-tint. + endif. + END-OF-DEFINITION. + + DEFINE move_supplied_borders. + if ip_&1 is supplied. " only act if parameter was supplied + if ip_x&1 is supplied. " + borderx = ip_x&1. " use supplied x-parameter + else. + clear borderx with 'X'. +* clear in a way that would be expected to work easily + if ip_&1-border_style is initial. + clear borderx-border_style. + endif. + clear_initial_colorxfields ip_&1-border_color borderx-border_color. + endif. + move-corresponding ip_&1 to complete_style-&2. + move-corresponding borderx to complete_stylex-&2. + endif. + END-OF-DEFINITION. + +* First get current stylsettings + TRY. + me->get_cell( EXPORTING ip_column = ip_column " Cell Column + ip_row = ip_row " Cell Row + IMPORTING ep_guid = l_guid )." Cell Value ). "issue # 177 + + + stylemapping = me->excel->get_style_to_guid( l_guid ). "issue # 177 + complete_style = stylemapping-complete_style. + complete_stylex = stylemapping-complete_stylex. + CATCH zcx_excel. +* Error --> use submitted style + ENDTRY. + +* move_supplied_multistyles: complete. + IF ip_complete IS SUPPLIED. + IF ip_xcomplete IS NOT SUPPLIED. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Complete styleinfo has to be supplied with corresponding X-field'. + ENDIF. + MOVE-CORRESPONDING ip_complete TO complete_style. + MOVE-CORRESPONDING ip_xcomplete TO complete_stylex. + ENDIF. + + + + IF ip_font IS SUPPLIED. + DATA: fontx LIKE ip_xfont. + IF ip_xfont IS SUPPLIED. + fontx = ip_xfont. + ELSE. +* Only supplied values should be used - exception: Flags bold and italic strikethrough underline + MOVE 'X' TO: fontx-bold, + fontx-italic, + fontx-strikethrough, + fontx-underline_mode. + CLEAR fontx-color WITH 'X'. + clear_initial_colorxfields ip_font-color fontx-color. + IF ip_font-family IS NOT INITIAL. + fontx-family = 'X'. + ENDIF. + IF ip_font-name IS NOT INITIAL. + fontx-name = 'X'. + ENDIF. + IF ip_font-scheme IS NOT INITIAL. + fontx-scheme = 'X'. + ENDIF. + IF ip_font-size IS NOT INITIAL. + fontx-size = 'X'. + ENDIF. + IF ip_font-underline_mode IS NOT INITIAL. + fontx-underline_mode = 'X'. + ENDIF. + ENDIF. + MOVE-CORRESPONDING ip_font TO complete_style-font. + MOVE-CORRESPONDING fontx TO complete_stylex-font. +* Correction for undeline mode + ENDIF. + + IF ip_fill IS SUPPLIED. + DATA: fillx LIKE ip_xfill. + IF ip_xfill IS SUPPLIED. + fillx = ip_xfill. + ELSE. + CLEAR fillx WITH 'X'. + IF ip_fill-filltype IS INITIAL. + CLEAR fillx-filltype. + ENDIF. + clear_initial_colorxfields ip_fill-fgcolor fillx-fgcolor. + clear_initial_colorxfields ip_fill-bgcolor fillx-bgcolor. + + ENDIF. + MOVE-CORRESPONDING ip_fill TO complete_style-fill. + MOVE-CORRESPONDING fillx TO complete_stylex-fill. + ENDIF. + + + IF ip_borders IS SUPPLIED. + DATA: bordersx LIKE ip_xborders. + IF ip_xborders IS SUPPLIED. + bordersx = ip_xborders. + ELSE. + CLEAR bordersx WITH 'X'. + IF ip_borders-allborders-border_style IS INITIAL. + CLEAR bordersx-allborders-border_style. + ENDIF. + IF ip_borders-diagonal-border_style IS INITIAL. + CLEAR bordersx-diagonal-border_style. + ENDIF. + IF ip_borders-down-border_style IS INITIAL. + CLEAR bordersx-down-border_style. + ENDIF. + IF ip_borders-left-border_style IS INITIAL. + CLEAR bordersx-left-border_style. + ENDIF. + IF ip_borders-right-border_style IS INITIAL. + CLEAR bordersx-right-border_style. + ENDIF. + IF ip_borders-top-border_style IS INITIAL. + CLEAR bordersx-top-border_style. + ENDIF. + clear_initial_colorxfields ip_borders-allborders-border_color bordersx-allborders-border_color. + clear_initial_colorxfields ip_borders-diagonal-border_color bordersx-diagonal-border_color. + clear_initial_colorxfields ip_borders-down-border_color bordersx-down-border_color. + clear_initial_colorxfields ip_borders-left-border_color bordersx-left-border_color. + clear_initial_colorxfields ip_borders-right-border_color bordersx-right-border_color. + clear_initial_colorxfields ip_borders-top-border_color bordersx-top-border_color. + + ENDIF. + MOVE-CORRESPONDING ip_borders TO complete_style-borders. + MOVE-CORRESPONDING bordersx TO complete_stylex-borders. + ENDIF. + + IF ip_alignment IS SUPPLIED. + DATA: alignmentx LIKE ip_xalignment. + IF ip_xalignment IS SUPPLIED. + alignmentx = ip_xalignment. + ELSE. + CLEAR alignmentx WITH 'X'. + IF ip_alignment-horizontal IS INITIAL. + CLEAR alignmentx-horizontal. + ENDIF. + IF ip_alignment-vertical IS INITIAL. + CLEAR alignmentx-vertical. + ENDIF. + ENDIF. + MOVE-CORRESPONDING ip_alignment TO complete_style-alignment. + MOVE-CORRESPONDING alignmentx TO complete_stylex-alignment. + ENDIF. + + IF ip_protection IS SUPPLIED. + MOVE-CORRESPONDING ip_protection TO complete_style-protection. + IF ip_xprotection IS SUPPLIED. + MOVE-CORRESPONDING ip_xprotection TO complete_stylex-protection. + ELSE. + IF ip_protection-hidden IS NOT INITIAL. + complete_stylex-protection-hidden = 'X'. + ENDIF. + IF ip_protection-locked IS NOT INITIAL. + complete_stylex-protection-locked = 'X'. + ENDIF. + ENDIF. + ENDIF. + + + move_supplied_borders : borders_allborders borders-allborders, + borders_diagonal borders-diagonal , + borders_down borders-down , + borders_left borders-left , + borders_right borders-right , + borders_top borders-top . + + DEFINE move_supplied_singlestyles. + if ip_&1 is supplied. + complete_style-&2 = ip_&1. + complete_stylex-&2 = 'X'. + endif. + END-OF-DEFINITION. + + move_supplied_singlestyles: number_format_format_code number_format-format_code, + font_bold font-bold, + font_color font-color, + font_color_rgb font-color-rgb, + font_color_indexed font-color-indexed, + font_color_theme font-color-theme, + font_color_tint font-color-tint, + + font_family font-family, + font_italic font-italic, + font_name font-name, + font_scheme font-scheme, + font_size font-size, + font_strikethrough font-strikethrough, + font_underline font-underline, + font_underline_mode font-underline_mode, + fill_filltype fill-filltype, + fill_rotation fill-rotation, + fill_fgcolor fill-fgcolor, + fill_fgcolor_rgb fill-fgcolor-rgb, + fill_fgcolor_indexed fill-fgcolor-indexed, + fill_fgcolor_theme fill-fgcolor-theme, + fill_fgcolor_tint fill-fgcolor-tint, + + fill_bgcolor fill-bgcolor, + fill_bgcolor_rgb fill-bgcolor-rgb, + fill_bgcolor_indexed fill-bgcolor-indexed, + fill_bgcolor_theme fill-bgcolor-theme, + fill_bgcolor_tint fill-bgcolor-tint, + + fill_gradtype_type fill-gradtype-TYPE, + fill_gradtype_degree fill-gradtype-DEGREE, + fill_gradtype_bottom fill-gradtype-BOTTOM, + fill_gradtype_left fill-gradtype-LEFT, + fill_gradtype_top fill-gradtype-TOP, + fill_gradtype_right fill-gradtype-RIGHT, + fill_gradtype_position1 fill-gradtype-POSITION1, + fill_gradtype_position2 fill-gradtype-POSITION2, + fill_gradtype_position3 fill-gradtype-POSITION3, + + + + borders_diagonal_mode borders-diagonal_mode, + alignment_horizontal alignment-horizontal, + alignment_vertical alignment-vertical, + alignment_textrotation alignment-textrotation, + alignment_wraptext alignment-wraptext, + alignment_shrinktofit alignment-shrinktofit, + alignment_indent alignment-indent, + protection_hidden protection-hidden, + protection_locked protection-locked, + + borders_allborders_style borders-allborders-border_style, + borders_allborders_color borders-allborders-border_color, + borders_allbo_color_rgb borders-allborders-border_color-rgb, + borders_allbo_color_indexed borders-allborders-border_color-indexed, + borders_allbo_color_theme borders-allborders-border_color-theme, + borders_allbo_color_tint borders-allborders-border_color-tint, + + borders_diagonal_style borders-diagonal-border_style, + borders_diagonal_color borders-diagonal-border_color, + borders_diagonal_color_rgb borders-diagonal-border_color-rgb, + borders_diagonal_color_inde borders-diagonal-border_color-indexed, + borders_diagonal_color_them borders-diagonal-border_color-theme, + borders_diagonal_color_tint borders-diagonal-border_color-tint, + + borders_down_style borders-down-border_style, + borders_down_color borders-down-border_color, + borders_down_color_rgb borders-down-border_color-rgb, + borders_down_color_indexed borders-down-border_color-indexed, + borders_down_color_theme borders-down-border_color-theme, + borders_down_color_tint borders-down-border_color-tint, + + borders_left_style borders-left-border_style, + borders_left_color borders-left-border_color, + borders_left_color_rgb borders-left-border_color-rgb, + borders_left_color_indexed borders-left-border_color-indexed, + borders_left_color_theme borders-left-border_color-theme, + borders_left_color_tint borders-left-border_color-tint, + + borders_right_style borders-right-border_style, + borders_right_color borders-right-border_color, + borders_right_color_rgb borders-right-border_color-rgb, + borders_right_color_indexed borders-right-border_color-indexed, + borders_right_color_theme borders-right-border_color-theme, + borders_right_color_tint borders-right-border_color-tint, + + borders_top_style borders-top-border_style, + borders_top_color borders-top-border_color, + borders_top_color_rgb borders-top-border_color-rgb, + borders_top_color_indexed borders-top-border_color-indexed, + borders_top_color_theme borders-top-border_color-theme, + borders_top_color_tint borders-top-border_color-tint. + + +* Now we have a completly filled styles. +* This can be used to get the guid +* Return guid if requested. Might be used if copy&paste of styles is requested + ep_guid = me->excel->get_static_cellstyle_guid( ip_cstyle_complete = complete_style + ip_cstylex_complete = complete_stylex ). + me->set_cell_style( ip_column = ip_column + ip_row = ip_row + ip_style = ep_guid ). + +ENDMETHOD. + + + + + + method CONSTRUCTOR. + DATA: lv_title TYPE zexcel_sheet_title. + + me->excel = ip_excel. + + CALL FUNCTION 'GUID_CREATE' + IMPORTING + ev_guid_16 = me->guid. + + IF ip_title IS NOT INITIAL. + lv_title = ip_title. + ELSE. +* lv_title = me->guid. " del issue #154 - Names of worksheets + lv_title = me->generate_title( ). " ins issue #154 - Names of worksheets + ENDIF. + + me->set_title( ip_title = lv_title ). + + CREATE OBJECT sheet_setup. + CREATE OBJECT conditional_styles. + CREATE OBJECT data_validations. + CREATE OBJECT tables. + CREATE OBJECT ranges. " issue #163 + CREATE OBJECT drawings + EXPORTING + ip_type = zcl_excel_drawing=>type_image. + CREATE OBJECT charts + EXPORTING + ip_type = zcl_excel_drawing=>type_chart. + me->zif_excel_sheet_protection~initialize( ). + me->zif_excel_sheet_properties~initialize( ). + CREATE OBJECT hyperlinks. + +* initialize active cell coordinates + active_cell-cell_row = 1. + active_cell-cell_column = 1. + +* inizialize dimension range + lower_cell-cell_row = 1. + lower_cell-cell_column = 1. + upper_cell-cell_row = 1. + upper_cell-cell_column = 1. + + endmethod. + + + method DELETE_MERGE. + + DELETE sheet_content_merge INDEX 1. + DELETE sheet_content_merge INDEX 1. + + endmethod. + + + + + + METHOD delete_row_outline. + + DELETE me->mt_row_outlines WHERE row_from = iv_row_from + AND row_to = iv_row_to. + IF sy-subrc <> 0. " didn't find outline that was to be deleted + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Row outline to be deleted does not exist'. + ENDIF. + +ENDMETHOD. + + + + + + method FREEZE_PANES. + data: lv_xsplit type i, + lv_ysplit type i. + + IF ip_num_columns IS NOT SUPPLIED AND ip_num_rows IS NOT SUPPLIED. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Pleas provide number of rows and/or columns to freeze'. + ENDIF. + + IF ip_num_columns IS SUPPLIED AND ip_num_columns <= 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Number of columns to freeze should be positive'. + ENDIF. + + IF ip_num_rows IS SUPPLIED AND ip_num_rows <= 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Number of rows to freeze should be positive'. + ENDIF. + + freeze_pane_cell_column = ip_num_columns + 1. + freeze_pane_cell_row = ip_num_rows + 1. + endmethod. + + + + method GENERATE_TITLE. + DATA: lo_worksheets_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + errormessage TYPE string. + + DATA: t_titles TYPE HASHED TABLE OF zexcel_sheet_title WITH UNIQUE KEY table_line, + title TYPE zexcel_sheet_title, + sheetnumber TYPE i. + +* Get list of currently used titles + lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). + WHILE lo_worksheets_iterator->has_next( ) = abap_true. + lo_worksheet ?= lo_worksheets_iterator->get_next( ). + title = lo_worksheet->get_title( ). + INSERT title INTO TABLE t_titles. + ADD 1 TO sheetnumber. + ENDWHILE. + +* Now build sheetnumber. Increase counter until we hit a number that is not used so far + ADD 1 TO sheetnumber. " Start counting with next number + DO. + title = sheetnumber. + SHIFT title LEFT DELETING LEADING space. + CONCATENATE 'Sheet'(001) title INTO ep_title. + INSERT ep_title INTO TABLE t_titles. + IF sy-subrc = 0. " Title not used so far --> take it + EXIT. + ENDIF. + + ADD 1 TO sheetnumber. + ENDDO. + endmethod. + + + + + method GET_ACTIVE_CELL. + + DATA: lv_active_column TYPE zexcel_cell_column_alpha, + lv_active_row TYPE string. + + lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). + lv_active_row = active_cell-cell_row. + SHIFT lv_active_row RIGHT DELETING TRAILING space. + SHIFT lv_active_row LEFT DELETING LEADING space. + CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. + + endmethod. + + + + + + + + + + method GET_CELL. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + + ep_rc = sy-subrc. + ep_value = ls_sheet_content-cell_value. + ep_guid = ls_sheet_content-cell_style. " issue 139 - added this to be used for columnwidth calculation + + " Addition to solve issue #120, contribution by Stefan Schm#ƒÂ#cker + DATA: style_iterator TYPE REF TO cl_object_collection_iterator, + style TYPE REF TO zcl_excel_style. + IF ep_style IS REQUESTED. + style_iterator = me->excel->get_styles_iterator( ). + WHILE style_iterator->has_next( ) = 'X'. + style ?= style_iterator->get_next( ). + IF style->get_guid( ) = ls_sheet_content-cell_style. + ep_style = style. + EXIT. + ENDIF. + ENDWHILE. + ENDIF. + endmethod. + + + + + + method GET_COLUMN_DIMENSION. + FIELD-SYMBOLS: <fs_column_dimension> LIKE LINE OF column_dimensions. + DATA: lv_column_alpha TYPE zexcel_cell_column_alpha. " issue #155 - less restrictive typing for ip_column + + lv_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column )." issue #155 - less restrictive typing for ip_column + READ TABLE me->column_dimensions ASSIGNING <fs_column_dimension> + WITH KEY column = lv_column_alpha. " issue #155 - less restrictive typing for ip_column + + IF NOT <fs_column_dimension> IS ASSIGNED. + CREATE OBJECT r_column_dimension + EXPORTING + ip_index = lv_column_alpha " issue #155 - less restrictive typing for ip_column + ip_excel = me->excel " issue #157 - Allow style for columns + ip_worksheet = me. " issue #157 - Allow style for columns + APPEND INITIAL LINE TO me->column_dimensions ASSIGNING <fs_column_dimension>. + <fs_column_dimension>-column = lv_column_alpha. " issue #155 - less restrictive typing for ip_column + <fs_column_dimension>-column_dimension = r_column_dimension. + ELSE. + r_column_dimension = <fs_column_dimension>-column_dimension. + ENDIF. + + endmethod. + + + + method GET_COLUMN_DIMENSIONS. + r_column_dimension[] = me->column_dimensions[]. + endmethod. + + + + method GET_COND_STYLES_ITERATOR. + + eo_iterator = me->conditional_styles->get_iterator( ). + endmethod. + + + + method GET_DATA_VALIDATIONS_ITERATOR. + + eo_iterator = me->data_validations->get_iterator( ). + endmethod. + + + + method GET_DATA_VALIDATIONS_SIZE. + ep_size = me->data_validations->size( ). + endmethod. + + + + method GET_DEFAULT_COLUMN_DIMENSION. + IF me->default_column_dimension IS NOT BOUND. + CREATE OBJECT me->default_column_dimension + EXPORTING + ip_index = 'A' " ???? + ip_worksheet = me + ip_excel = me->excel. + ENDIF. + + r_column_dimension = me->default_column_dimension. + endmethod. + + + + method GET_DEFAULT_EXCEL_DATE_FORMAT. + CONSTANTS: c_lang_e TYPE lang VALUE 'E'. + + IF default_excel_date_format IS NOT INITIAL. + ep_default_excel_date_format = default_excel_date_format. + RETURN. + ENDIF. + + "try to get defaults + TRY. + cl_abap_datfm=>get_date_format_des( EXPORTING im_langu = c_lang_e + IMPORTING ex_dateformat = default_excel_date_format ). + CATCH cx_abap_datfm_format_unknown. + + ENDTRY. + + " and fallback to fixed format + IF default_excel_date_format IS INITIAL. + default_excel_date_format = zcl_excel_style_number_format=>c_format_date_ddmmyyyydot. + ENDIF. + + ep_default_excel_date_format = default_excel_date_format. + endmethod. + + + + method GET_DEFAULT_EXCEL_TIME_FORMAT. + DATA: l_timefm TYPE xutimefm. + + IF default_excel_time_format IS NOT INITIAL. + ep_default_excel_time_format = default_excel_time_format. + RETURN. + ENDIF. + +* Let's get default + l_timefm = cl_abap_timefm=>get_environment_timefm( ). + CASE l_timefm. + WHEN 0. +*0 24 Hour Format (Example: 12:05:10) + default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time6. + WHEN 1. +*1 12 Hour Format (Example: 12:05:10 PM) + default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. + WHEN 2. +*2 12 Hour Format (Example: 12:05:10 pm) for now all the same. no chnage upper lower + default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. + WHEN 3. +*3 Hours from 0 to 11 (Example: 00:05:10 PM) for now all the same. no chnage upper lower + default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. + WHEN 4. +*4 Hours from 0 to 11 (Example: 00:05:10 pm) for now all the same. no chnage upper lower + default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. + WHEN OTHERS. + " and fallback to fixed format + default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time6. + ENDCASE. + + ep_default_excel_time_format = default_excel_time_format. + endmethod. + + + + method GET_DEFAULT_ROW_DIMENSION. + IF me->default_row_dimension IS NOT BOUND. + CREATE OBJECT me->default_row_dimension. + ENDIF. + + r_row_dimension = me->default_row_dimension. + endmethod. + + + + + method GET_DIMENSION_RANGE. + + me->update_dimension_range( ). + IF upper_cell EQ lower_cell. "only one cell + " Worksheet not filled +* IF upper_cell-cell_coords = '0'. + IF upper_cell-cell_coords IS INITIAL. + ep_dimension_range = 'A1'. + ELSE. + ep_dimension_range = upper_cell-cell_coords. + ENDIF. + ELSE. + CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. + ENDIF. + + endmethod. + + + + + method GET_DRAWINGS. + + DATA: lo_drawing TYPE REF TO zcl_excel_drawing, + lo_iterator TYPE REF TO cl_object_collection_iterator. + + CASE ip_type. + WHEN zcl_excel_drawing=>type_image. + r_drawings = drawings. + WHEN zcl_excel_drawing=>type_chart. + r_drawings = charts. + WHEN space. + CREATE OBJECT r_drawings + EXPORTING + ip_type = ''. + + lo_iterator = drawings->get_iterator( ). + WHILE lo_iterator->has_next( ) = abap_true. + lo_drawing ?= lo_iterator->get_next( ). + r_drawings->include( lo_drawing ). + ENDWHILE. + lo_iterator = charts->get_iterator( ). + WHILE lo_iterator->has_next( ) = abap_true. + lo_drawing ?= lo_iterator->get_next( ). + r_drawings->include( lo_drawing ). + ENDWHILE. + WHEN OTHERS. + ENDCASE. + endmethod. + + + + + method GET_DRAWINGS_ITERATOR. + CASE ip_type. + WHEN zcl_excel_drawing=>type_image. + eo_iterator = drawings->get_iterator( ). + WHEN zcl_excel_drawing=>type_chart. + eo_iterator = charts->get_iterator( ). + ENDCASE. + endmethod. + + + + + method GET_FREEZE_CELL. + ep_row = me->freeze_pane_cell_row. + ep_column = me->freeze_pane_cell_column. + endmethod. + + + + METHOD get_guid. + + ep_guid = me->guid. + +ENDMETHOD. + + + + + method GET_HIGHEST_COLUMN. + me->update_dimension_range( ). + r_highest_column = me->lower_cell-cell_column. + endmethod. + + + + + METHOD get_highest_row. + me->update_dimension_range( ). + r_highest_row = me->lower_cell-cell_row. +ENDMETHOD. + + + + method GET_HYPERLINKS_ITERATOR. + eo_iterator = hyperlinks->get_iterator( ). + endmethod. + + + + method GET_HYPERLINKS_SIZE. + ep_size = hyperlinks->size( ). + endmethod. + + + + + method GET_MERGE. + + DATA: lv_column_start TYPE string, + lv_column_end TYPE string, + lv_row TYPE string, + lv_index TYPE sy-tabix, + ls_sheet_content TYPE zexcel_s_cell_data, + range_from TYPE string, + range_to TYPE string, + lv_merge_range TYPE string, + lv_count TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + DESCRIBE TABLE sheet_content_merge LINES lv_count. + + WHILE lv_count GT lv_index. +* LOOP AT sheet_content_merge ASSIGNING <fs_sheet_content>. + lv_index = lv_index + 1. + READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. + lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). + lv_row = <fs_sheet_content>-cell_row. + SHIFT lv_column_start RIGHT DELETING TRAILING space. + SHIFT lv_column_start LEFT DELETING LEADING space. + SHIFT lv_row RIGHT DELETING TRAILING space. + SHIFT lv_row LEFT DELETING LEADING space. + CONCATENATE lv_column_start lv_row + INTO range_from. + + lv_index = lv_index + 1. + READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. + lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). + lv_row = <fs_sheet_content>-cell_row. + SHIFT lv_column_end RIGHT DELETING TRAILING space. + SHIFT lv_column_end LEFT DELETING LEADING space. + SHIFT lv_row RIGHT DELETING TRAILING space. + SHIFT lv_row LEFT DELETING LEADING space. + CONCATENATE lv_column_end lv_row + INTO range_to. + + CONCATENATE range_from range_to INTO lv_merge_range + SEPARATED BY ':'. + APPEND lv_merge_range TO merge_range. + ENDWHILE. +* ENDLOOP. + +* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 1. +* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. +* lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). +* lv_row = <fs_sheet_content>-cell_row. +* SHIFT lv_column_start RIGHT DELETING TRAILING space. +* SHIFT lv_column_start LEFT DELETING LEADING space. +* SHIFT lv_row RIGHT DELETING TRAILING space. +* SHIFT lv_row LEFT DELETING LEADING space. +* CONCATENATE lv_column_start lv_row +* INTO range_from. +* ENDIF. +* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 2. +* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. +* lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). +* SHIFT lv_column_end RIGHT DELETING TRAILING space. +* SHIFT lv_column_end LEFT DELETING LEADING space. +* CONCATENATE lv_column_end lv_row +* INTO range_to. +* ENDIF. + +* IF range_from NE space AND range_to NE space. +* CONCATENATE range_from range_to INTO ep_merge_range +* SEPARATED BY ':'. +* ENDIF. + + endmethod. + + + + method GET_RANGES_ITERATOR. + + eo_iterator = me->ranges->get_iterator( ). + + endmethod. + + + + + METHOD GET_ROW_DIMENSION. + + FIELD-SYMBOLS: <ls_row_dimension> LIKE LINE OF me->row_dimensions. + + DATA: ls_row_dimension LIKE LINE OF me->row_dimensions. + + READ TABLE me->row_dimensions ASSIGNING <ls_row_dimension> + WITH TABLE KEY row = ip_row. + + IF NOT <ls_row_dimension> IS ASSIGNED. + CREATE OBJECT r_row_dimension + EXPORTING + ip_index = ip_row. + ls_row_dimension-row = ip_row. + ls_row_dimension-row_dimension = r_row_dimension. + INSERT ls_row_dimension INTO TABLE me->row_dimensions. + ELSE. + r_row_dimension = <ls_row_dimension>-row_dimension. + ENDIF. + +ENDMETHOD. + + + + METHOD get_row_dimensions. + + r_row_dimension[] = me->row_dimensions[]. + +ENDMETHOD. + + + + METHOD get_row_outlines. + + rt_row_outlines = me->mt_row_outlines. + +ENDMETHOD. + + + + method GET_TABCOLOR. + ev_tabcolor = me->tabcolor. + endmethod. + + + + method GET_TABLES_ITERATOR. + eo_iterator = tables->if_object_collection~get_iterator( ). + endmethod. + + + + method GET_TABLES_SIZE. + ep_size = tables->if_object_collection~size( ). + endmethod. + + + + + method GET_TITLE. + DATA lv_value TYPE string. + IF ip_escaped EQ abap_true. + lv_value = me->title. + ep_title = zcl_excel_common=>escape_string( lv_value ). + ELSE. + ep_title = me->title. + ENDIF. + endmethod. + + + + + + method GET_VALUE_TYPE. + DATA: lo_addit TYPE REF TO cl_abap_elemdescr, + ls_dfies TYPE dfies, + l_function TYPE funcname, + l_value(50) TYPE c. + + ep_value = ip_value. + ep_value_type = cl_abap_typedescr=>typekind_string. " Thats our default if something goes wrong. + + TRY. + lo_addit ?= cl_abap_typedescr=>describe_by_data( ip_value ). + CATCH cx_sy_move_cast_error. + CLEAR lo_addit. + ENDTRY. + IF lo_addit IS BOUND. + lo_addit->get_ddic_field( RECEIVING p_flddescr = ls_dfies + EXCEPTIONS not_found = 1 + no_ddic_type = 2 + OTHERS = 3 ) . + IF sy-subrc = 0. + ep_value_type = ls_dfies-inttype. + + IF ls_dfies-convexit IS NOT INITIAL. +* We need to convert with output conversion function + CONCATENATE 'CONVERSION_EXIT_' ls_dfies-convexit '_OUTPUT' INTO l_function. + SELECT SINGLE funcname INTO l_function + FROM tfdir + WHERE funcname = l_function. + IF sy-subrc = 0. + CALL FUNCTION l_function + EXPORTING + input = ip_value + IMPORTING +* LONG_TEXT = + output = l_value +* SHORT_TEXT = + EXCEPTIONS + OTHERS = 1. + IF sy-subrc <> 0. +* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO +* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. + ELSE. + ep_value = l_value. + ENDIF. + ENDIF. + ENDIF. + ELSE. + ep_value_type = lo_addit->get_data_type_kind( ip_value ). + ENDIF. + ENDIF. + + endmethod. + + + + + + + method IS_CELL_MERGED. + DATA lt_merge_range TYPE string_table. + + FIELD-SYMBOLS <lv_merge_range> LIKE LINE OF lt_merge_range. + + + lt_merge_range = me->get_merge( ). + + LOOP AT lt_merge_range ASSIGNING <lv_merge_range>. + rp_is_merged = zcl_excel_common=>is_cell_in_range( + ip_column = ip_column + ip_row = ip_row + ip_range = <lv_merge_range> ). + IF rp_is_merged = abap_true. + EXIT. + ENDIF. + ENDLOOP. +endmethod. + + + method PRINT_TITLE_SET_RANGE. +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns +* - Stefan Schmoecker, 2012-12-02 +*--------------------------------------------------------------------* + + + DATA: lo_range_iterator TYPE REF TO cl_object_collection_iterator, + lo_range TYPE REF TO zcl_excel_range, + lv_repeat_range_sheetname TYPE string, + lv_repeat_range_col TYPE string, + lv_row_char_from TYPE char10, + lv_row_char_to TYPE char10, + lv_repeat_range_row TYPE string, + lv_repeat_range TYPE string. + + +*--------------------------------------------------------------------* +* Get range that represents printarea +* if non-existant, create it +*--------------------------------------------------------------------* + lo_range_iterator = me->get_ranges_iterator( ). + WHILE lo_range_iterator->has_next( ) = abap_true. + + lo_range ?= lo_range_iterator->get_next( ). + IF lo_range->name = zif_excel_sheet_printsettings=>gcv_print_title_name. + EXIT. " Found it + ENDIF. + CLEAR lo_range. + + ENDWHILE. + + + IF me->print_title_col_from IS INITIAL AND + me->print_title_row_from IS INITIAL. +*--------------------------------------------------------------------* +* No print titles are present, +*--------------------------------------------------------------------* + IF lo_range IS BOUND. + me->ranges->remove( lo_range ). + ENDIF. + ELSE. +*--------------------------------------------------------------------* +* Print titles are present, +*--------------------------------------------------------------------* + IF lo_range IS NOT BOUND. + lo_range = me->add_new_range( ). + lo_range->name = zif_excel_sheet_printsettings=>gcv_print_title_name. + ENDIF. + + lv_repeat_range_sheetname = me->get_title( ). + lv_repeat_range_sheetname = zcl_excel_common=>escape_string( lv_repeat_range_sheetname ). + +*--------------------------------------------------------------------* +* Repeat-columns +*--------------------------------------------------------------------* + IF me->print_title_col_from IS NOT INITIAL. + CONCATENATE lv_repeat_range_sheetname + '!$' me->print_title_col_from + ':$' me->print_title_col_to + INTO lv_repeat_range_col. + ENDIF. + +*--------------------------------------------------------------------* +* Repeat-rows +*--------------------------------------------------------------------* + IF me->print_title_row_from IS NOT INITIAL. + lv_row_char_from = me->print_title_row_from. + lv_row_char_to = me->print_title_row_to. + CONCATENATE '!$' lv_row_char_from + ':$' lv_row_char_to + INTO lv_repeat_range_row. + CONDENSE lv_repeat_range_row NO-GAPS. + CONCATENATE lv_repeat_range_sheetname + lv_repeat_range_row + INTO lv_repeat_range_row. + ENDIF. + +*--------------------------------------------------------------------* +* Concatenate repeat-rows and columns +*--------------------------------------------------------------------* + IF lv_repeat_range_col IS INITIAL. + lv_repeat_range = lv_repeat_range_row. + ELSEIF lv_repeat_range_row IS INITIAL. + lv_repeat_range = lv_repeat_range_col. + ELSE. + CONCATENATE lv_repeat_range_col lv_repeat_range_row + INTO lv_repeat_range SEPARATED BY ','. + ENDIF. + + + lo_range->set_range_value( lv_repeat_range ). + ENDIF. + + + + endmethod. + + + + + + + + + + + + method SET_CELL. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string, + lv_col_alpha TYPE zexcel_cell_column_alpha, + lv_value TYPE zexcel_cell_value, + lv_data_type TYPE zexcel_cell_data_type, + lv_value_type TYPE abap_typekind, + lo_style TYPE REF TO zcl_excel_style, + lv_style_guid TYPE zexcel_cell_style, + lo_addit TYPE REF TO cl_abap_elemdescr, + lo_value TYPE REF TO data, + lo_value_new TYPE REF TO data. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_numeric> TYPE numeric, + <fs_date> TYPE d, + <fs_time> TYPE t, + <fs_value> TYPE simple. + + IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Please provide the value or formula'. + ENDIF. + +* Begin of change issue #152 - don't touch exisiting style if only value is passed +* lv_style_guid = ip_style. + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH TABLE KEY cell_row = ip_row " Changed to access via table key , Stefan Schmöcker, 2013-08-03 + cell_column = lv_column. + IF sy-subrc = 0. + IF ip_style IS INITIAL. + " If no style is provided as method-parameter and cell is found use cell's current style + lv_style_guid = <fs_sheet_content>-cell_style. + ELSE. + " Style provided as method-parameter --> use this + lv_style_guid = ip_style. + ENDIF. + ELSE. + " No cell found --> use supplied style even if empty + lv_style_guid = ip_style. + ENDIF. +* End of change issue #152 - don't touch exisiting style if only value is passed + + IF ip_value IS SUPPLIED. + "if data type is passed just write the value. Otherwise map abap type to excel and perform conversion + "IP_DATA_TYPE is passed by excel reader so source types are preserved +*First we get reference into local var. + CREATE DATA lo_value LIKE ip_value. + ASSIGN lo_value->* TO <fs_value>. + <fs_value> = ip_value. + IF ip_data_type IS SUPPLIED. + IF ip_abap_type IS NOT SUPPLIED. + get_value_type( EXPORTING ip_value = ip_value + IMPORTING ep_value = <fs_value> ) . + ENDIF. + lv_value = <fs_value>. + lv_data_type = ip_data_type. + ELSE. + IF ip_abap_type IS SUPPLIED. + lv_value_type = ip_abap_type. + ELSE. + get_value_type( EXPORTING ip_value = ip_value + IMPORTING ep_value = <fs_value> + ep_value_type = lv_value_type ). + ENDIF. + CASE lv_value_type. + WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2. + lo_addit = cl_abap_elemdescr=>get_i( ). + CREATE DATA lo_value_new TYPE HANDLE lo_addit. + ASSIGN lo_value_new->* TO <fs_numeric>. + IF sy-subrc = 0. + <fs_numeric> = <fs_value>. + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = <fs_numeric> ). + ENDIF. + + WHEN cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_packed. + lo_addit = cl_abap_elemdescr=>get_f( ). + CREATE DATA lo_value_new TYPE HANDLE lo_addit. + ASSIGN lo_value_new->* TO <fs_numeric>. + IF sy-subrc = 0. + <fs_numeric> = <fs_value>. + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = <fs_numeric> ). + ENDIF. + + WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_string OR cl_abap_typedescr=>typekind_num OR + cl_abap_typedescr=>typekind_hex. + lv_value = <fs_value>. + lv_data_type = 's'. + + WHEN cl_abap_typedescr=>typekind_date. + lo_addit = cl_abap_elemdescr=>get_d( ). + CREATE DATA lo_value_new TYPE HANDLE lo_addit. + ASSIGN lo_value_new->* TO <fs_date>. + IF sy-subrc = 0. + <fs_date> = <fs_value>. + lv_value = zcl_excel_common=>date_to_excel_string( ip_value = <fs_date> ) . + ENDIF. +* Begin of change issue #152 - don't touch exisiting style if only value is passed +* Moved to end of routine - apply date-format even if other styleinformation is passed +* IF ip_style IS NOT SUPPLIED. "get default date format in case parameter is initial +* lo_style = excel->add_new_style( ). +* lo_style->number_format->format_code = get_default_excel_date_format( ). +* lv_style_guid = lo_style->get_guid( ). +* ENDIF. +* End of change issue #152 - don't touch exisiting style if only value is passed + + WHEN cl_abap_typedescr=>typekind_time. + lo_addit = cl_abap_elemdescr=>get_t( ). + CREATE DATA lo_value_new TYPE HANDLE lo_addit. + ASSIGN lo_value_new->* TO <fs_time>. + IF sy-subrc = 0. + <fs_time> = <fs_value>. + lv_value = zcl_excel_common=>time_to_excel_string( ip_value = <fs_time> ). + ENDIF. +* Begin of change issue #152 - don't touch exisiting style if only value is passed +* Moved to end of routine - apply time-format even if other styleinformation is passed +* IF ip_style IS NOT SUPPLIED. "get default time format for user in case parameter is initial +* lo_style = excel->add_new_style( ). +* lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_date_time6. +* lv_style_guid = lo_style->get_guid( ). +* ENDIF. +* End of change issue #152 - don't touch exisiting style if only value is passed + + WHEN OTHERS. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Invalid data type of input value'. + ENDCASE. + ENDIF. + + ENDIF. + + IF ip_hyperlink IS BOUND. + ip_hyperlink->set_cell_reference( ip_column = ip_column + ip_row = ip_row ). + me->hyperlinks->add( ip_hyperlink ). + ENDIF. + +* Begin of change issue #152 - don't touch exisiting style if only value is passed +* Read table moved up, so that current style may be evaluated +* lv_column = zcl_excel_common=>convert_column2int( ip_column ). + +* READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row +* cell_column = lv_column. +* +* IF sy-subrc EQ 0. + IF <fs_sheet_content> IS ASSIGNED. +* End of change issue #152 - don't touch exisiting style if only value is passed + <fs_sheet_content>-cell_value = lv_value. + <fs_sheet_content>-cell_formula = ip_formula. + <fs_sheet_content>-cell_style = lv_style_guid. + <fs_sheet_content>-data_type = lv_data_type. + ELSE. + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + ls_sheet_content-cell_value = lv_value. + ls_sheet_content-cell_formula = ip_formula. + ls_sheet_content-cell_style = lv_style_guid. + ls_sheet_content-data_type = lv_data_type. + lv_row_alpha = ip_row. +* SHIFT lv_row_alpha RIGHT DELETING TRAILING space."del #152 - replaced with condense - should be faster +* SHIFT lv_row_alpha LEFT DELETING LEADING space. "del #152 - replaced with condense - should be faster + CONDENSE lv_row_alpha NO-GAPS. "ins #152 - replaced 2 shifts - should be faster + lv_col_alpha = zcl_excel_common=>convert_column2alpha( ip_column ). " issue #155 - less restrictive typing for ip_column + CONCATENATE lv_col_alpha lv_row_alpha INTO ls_sheet_content-cell_coords. " issue #155 - less restrictive typing for ip_column + INSERT ls_sheet_content INTO TABLE sheet_content ASSIGNING <fs_sheet_content>. "ins #152 - Now <fs_sheet_content> always holds the data +* APPEND ls_sheet_content TO sheet_content. +* SORT sheet_content BY cell_row cell_column. + " me->update_dimension_range( ). + + ENDIF. + +* Begin of change issue #152 - don't touch exisiting style if only value is passed +* For Date- or Timefields change the formatcode if nothing is set yet +* Enhancement option: Check if existing formatcode is a date/ or timeformat +* If not, use default + DATA: lo_format_code_datetime TYPE zexcel_number_format. + DATA: stylemapping TYPE zexcel_s_stylemapping. + CASE lv_value_type. + WHEN cl_abap_typedescr=>typekind_date. + TRY. + stylemapping = me->excel->get_style_to_guid( <fs_sheet_content>-cell_style ). + CATCH zcx_excel . + ENDTRY. + IF stylemapping-complete_stylex-number_format-format_code IS INITIAL OR + stylemapping-complete_style-number_format-format_code IS INITIAL. + lo_format_code_datetime = zcl_excel_style_number_format=>c_format_date_std. + ELSE. + lo_format_code_datetime = stylemapping-complete_style-number_format-format_code. + ENDIF. + me->change_cell_style( ip_column = ip_column + ip_row = ip_row + ip_number_format_format_code = lo_format_code_datetime ). + + WHEN cl_abap_typedescr=>typekind_time. + TRY. + stylemapping = me->excel->get_style_to_guid( <fs_sheet_content>-cell_style ). + CATCH zcx_excel . + ENDTRY. + IF stylemapping-complete_stylex-number_format-format_code IS INITIAL OR + stylemapping-complete_style-number_format-format_code IS INITIAL. + lo_format_code_datetime = zcl_excel_style_number_format=>c_format_date_time6. + ELSE. + lo_format_code_datetime = stylemapping-complete_style-number_format-format_code. + ENDIF. + me->change_cell_style( ip_column = ip_column + ip_row = ip_row + ip_number_format_format_code = lo_format_code_datetime ). + + ENDCASE. +* End of change issue #152 - don't touch exisiting style if only value is passed + +* Fix issue #162 + lv_value = ip_value. + IF lv_value CS cl_abap_char_utilities=>cr_lf. + me->change_cell_style( ip_column = ip_column + ip_row = ip_row + ip_alignment_wraptext = abap_true ). + ENDIF. +* End of Fix issue #162 + + endmethod. + + + + + + + method SET_CELL_FORMULA. + DATA: + lv_column TYPE zexcel_cell_column, + ls_sheet_content LIKE LINE OF me->sheet_content. + + FIELD-SYMBOLS: + <sheet_content> LIKE LINE OF me->sheet_content. + +*--------------------------------------------------------------------* +* Get cell to set formula into +*--------------------------------------------------------------------* + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + READ TABLE me->sheet_content ASSIGNING <sheet_content> WITH TABLE KEY cell_row = ip_row + cell_column = lv_column. + IF sy-subrc <> 0. " Create new entry in sheet_content if necessary + CHECK ip_formula IS INITIAL. " no need to create new entry in sheet_content when no formula is passed + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column. + INSERT ls_sheet_content INTO TABLE me->sheet_content ASSIGNING <sheet_content>. + ENDIF. + +*--------------------------------------------------------------------* +* Fieldsymbol now holds the relevant cell +*--------------------------------------------------------------------* + <sheet_content>-cell_formula = ip_formula. + + + endmethod. + + + + + + + method SET_CELL_STYLE. + + DATA: lv_column TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string, + lo_style TYPE REF TO zcl_excel_style, + lv_style_guid TYPE zexcel_cell_style. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_style_guid = ip_style. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row + cell_column = lv_column. + + IF sy-subrc EQ 0. + <fs_sheet_content>-cell_style = lv_style_guid. + ELSE. + set_cell( ip_column = ip_column ip_row = ip_row ip_value = '' ip_style = ip_style ). + ENDIF. + + endmethod. + + + + + + + method SET_COLUMN_WIDTH. + DATA: column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + DATA: width TYPE float. + + column_dimension = me->get_column_dimension( ip_column ). + +* if a fix size is supplied use this + IF ip_width_fix IS SUPPLIED. + TRY. + width = ip_width_fix. + IF width <= 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Please supply a positive number as column-width'. + ENDIF. + column_dimension->set_width( width ). + EXIT. + CATCH cx_sy_conversion_no_number. +* Strange stuff passed --> raise error + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Unable to interpret supplied input as number'. + ENDTRY. + ENDIF. + +* If we get down to here, we have to use whatever is found in autosize. + column_dimension->set_auto_size( ip_width_autosize ). + + + endmethod. + + + + + method SET_DEFAULT_EXCEL_DATE_FORMAT. + + IF ip_default_excel_date_format IS INITIAL. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Default date format cannot be blank'. + ENDIF. + + default_excel_date_format = ip_default_excel_date_format. + endmethod. + + + + + + + + method SET_MERGE. + + DATA: lv_column_start TYPE zexcel_cell_column, + lv_column_end TYPE zexcel_cell_column, + ls_sheet_content TYPE zexcel_s_cell_data, + lv_row_alpha TYPE string. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + + lv_column_start = zcl_excel_common=>convert_column2int( ip_column_start ). + lv_column_end = zcl_excel_common=>convert_column2int( ip_column_end ). + + ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_column = lv_column_start. + lv_row_alpha = ip_row. + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column_start lv_row_alpha INTO ls_sheet_content-cell_coords. + INSERT ls_sheet_content INTO TABLE sheet_content_merge. + + ls_sheet_content-cell_column = lv_column_end. + IF ip_row_to IS SUPPLIED. + ls_sheet_content-cell_row = ip_row_to. + lv_row_alpha = ip_row_to. + ELSE. + lv_row_alpha = ip_row. + ls_sheet_content-cell_row = ip_row. + ENDIF. + + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE ip_column_end lv_row_alpha INTO ls_sheet_content-cell_coords. + INSERT ls_sheet_content INTO TABLE sheet_content_merge. + + endmethod. + + + + method SET_PRINT_GRIDLINES. + me->print_gridlines = i_print_gridlines. + endmethod. + + + + + + method SET_ROW_HEIGHT. + DATA: row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + DATA: height TYPE float. + + row_dimension = me->get_row_dimension( ip_row ). + +* if a fix size is supplied use this + TRY. + height = ip_height_fix. + IF height <= 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Please supply a positive number as row-height'. + ENDIF. + row_dimension->set_row_height( height ). + EXIT. + CATCH cx_sy_conversion_no_number. +* Strange stuff passed --> raise error + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Unable to interpret supplied input as number'. + ENDTRY. + + + + endmethod. + + + + + + + METHOD set_row_outline. + + DATA: ls_row_outline LIKE LINE OF me->mt_row_outlines. + FIELD-SYMBOLS: <ls_row_outline> LIKE LINE OF me->mt_row_outlines. + + READ TABLE me->mt_row_outlines ASSIGNING <ls_row_outline> WITH TABLE KEY row_from = iv_row_from + row_to = iv_row_to. + IF sy-subrc <> 0. + IF iv_row_from <= 0. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'First row of outline must be a positive number'. + ENDIF. + IF iv_row_to < iv_row_from. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Last row of outline may not be less than first line of outline'. + ENDIF. + ls_row_outline-row_from = iv_row_from. + ls_row_outline-row_to = iv_row_to. + INSERT ls_row_outline INTO TABLE me->mt_row_outlines ASSIGNING <ls_row_outline>. + ENDIF. + + CASE iv_collapsed. + + WHEN abap_true + OR abap_false. + <ls_row_outline>-collapsed = iv_collapsed. + + WHEN OTHERS. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Unknown collapse state'. + + ENDCASE. +ENDMETHOD. + + + + method SET_SHOW_GRIDLINES. + me->show_gridlines = i_show_gridlines. + endmethod. + + + + method SET_SHOW_ROWCOLHEADERS. + me->show_rowcolheaders = i_show_rowcolheaders. + endmethod. + + + + method SET_TABCOLOR. + me->tabcolor = iv_tabcolor. + endmethod. + + + + + + + + + + + + method SET_TABLE. + + DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + lr_data TYPE REF TO data, + ls_newline TYPE REF TO data, + ls_header TYPE x030l, + lt_dfies TYPE ddfields, + lv_row_header TYPE zexcel_cell_row VALUE 2, + lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lv_cell_value TYPE zexcel_cell_value. + + + FIELD-SYMBOLS: <fs_table_line> TYPE ANY, + <fs_fldval> TYPE ANY, + <fs_dfies> TYPE dfies, + <fs_cell_value> TYPE zexcel_cell_value. + + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + lv_row_int = ip_top_left_row. + + CREATE DATA lr_data LIKE LINE OF ip_table. + + lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + + ls_header = lo_tabdescr->get_ddic_header( ). + + lt_dfies = lo_tabdescr->get_ddic_field_list( ). + +* It is better to loop column by column + LOOP AT lt_dfies ASSIGNING <fs_dfies>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + + IF ip_no_header = abap_false. + " First of all write column header + lv_cell_value = <fs_dfies>-scrtext_m. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = lv_cell_value + ip_style = ip_hdr_style ). + IF ip_transpose = abap_true. + ADD 1 TO lv_column_int. + ELSE. + ADD 1 TO lv_row_int. + ENDIF. + ENDIF. + + LOOP AT ip_table ASSIGNING <fs_table_line>. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. + MOVE <fs_fldval> TO lv_cell_value. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> "lv_cell_value + ip_style = ip_body_style ). + IF ip_transpose = abap_true. + ADD 1 TO lv_column_int. + ELSE. + ADD 1 TO lv_row_int. + ENDIF. + ENDLOOP. + IF ip_transpose = abap_true. + lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). + ADD 1 TO lv_row_int. + ELSE. + lv_row_int = ip_top_left_row. + ADD 1 TO lv_column_int. + ENDIF. + ENDLOOP. + + endmethod. + + + + + method SET_TITLE. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 The current coding for replacing a named ranges name +* after renaming a sheet should be checked if it is +* really working if sheetname should be escaped +*--------------------------------------------------------------------* + +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmoecker, (wip ) 2012-12-08 +* - ... +* changes: aligning code +* message made to support multilinguality +*--------------------------------------------------------------------* +* issue#243 - ' is not allowed as first character in sheet title +* - Stefan Schmoecker, 2012-12-02 +* changes: added additional check for ' as first character +*--------------------------------------------------------------------* + DATA: lo_worksheets_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + errormessage TYPE string, + lv_rangesheetname_old TYPE string, + lv_rangesheetname_new TYPE string, + lo_ranges_iterator TYPE REF TO cl_object_collection_iterator, + lo_range TYPE REF TO zcl_excel_range, + lv_range_value TYPE zexcel_range_value, + lv_errormessage TYPE string. " Can't pass '...'(abc) to exception-class + + +*--------------------------------------------------------------------* +* Check whether title consists only of allowed characters +* Illegal characters are: / \ [ ] * ? : --> http://msdn.microsoft.com/en-us/library/ff837411.aspx +* Illegal characters not in documentation: ' as first character +*--------------------------------------------------------------------* + IF ip_title CA '/\[]*?:'. + lv_errormessage = 'Found illegal character in sheetname. List of forbidden characters: /\[]*?:'(402). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + IF ip_title IS NOT INITIAL AND ip_title(1) = `'`. + lv_errormessage = 'Sheetname may not start with &'(403). " & used instead of ' to allow fallbacklanguage + REPLACE '&' IN lv_errormessage WITH `'`. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + +*--------------------------------------------------------------------* +* Check whether title is unique in workbook +*--------------------------------------------------------------------* + lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). + WHILE lo_worksheets_iterator->has_next( ) = 'X'. + + lo_worksheet ?= lo_worksheets_iterator->get_next( ). + CHECK me->guid <> lo_worksheet->get_guid( ). " Don't check against itself + IF ip_title = lo_worksheet->get_title( ). " Not unique --> raise exception + errormessage = 'Duplicate sheetname &'. + REPLACE '&' IN errormessage WITH ip_title. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = errormessage. + ENDIF. + + ENDWHILE. + +*--------------------------------------------------------------------* +* Remember old sheetname and rename sheet to desired name +*--------------------------------------------------------------------* + CONCATENATE me->title '!' INTO lv_rangesheetname_old. + me->title = ip_title. + +*--------------------------------------------------------------------* +* After changing this worksheet's title we have to adjust +* all ranges that are referring to this worksheet. +*--------------------------------------------------------------------* +* 2do§1 - Check if the following quickfix is solid +* I fear it isn't - but this implementation is better then +* nothing at all since it handles a supposed majority of cases +*--------------------------------------------------------------------* + CONCATENATE me->title '!' INTO lv_rangesheetname_new. + + lo_ranges_iterator = me->excel->get_ranges_iterator( ). + WHILE lo_ranges_iterator->has_next( ) = 'X'. + + lo_range ?= lo_ranges_iterator->get_next( ). + lv_range_value = lo_range->get_value( ). + REPLACE ALL OCCURRENCES OF lv_rangesheetname_old IN lv_range_value WITH lv_rangesheetname_new. + IF sy-subrc = 0. + lo_range->set_range_value( lv_range_value ). + ENDIF. + + ENDWHILE. + + + endmethod. + + + + METHOD update_dimension_range. + + DATA: ls_sheet_content TYPE zexcel_s_cell_data, + lt_sheet_content TYPE zexcel_t_cell_data_unsorted, + lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. + + CHECK sheet_content IS NOT INITIAL. + +* update dimension range + lt_sheet_content = sheet_content. + "upper left corner + SORT lt_sheet_content BY cell_row. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + upper_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = upper_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. + + "bottom right corner + SORT lt_sheet_content BY cell_row DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_row = ls_sheet_content-cell_row. + SORT lt_sheet_content BY cell_column DESCENDING. + READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. + lower_cell-cell_column = ls_sheet_content-cell_column. + + lv_row_alpha = lower_cell-cell_row. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). + SHIFT lv_row_alpha RIGHT DELETING TRAILING space. + SHIFT lv_row_alpha LEFT DELETING LEADING space. + CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. + +ENDMETHOD. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + method ADD. + + worksheets->add( ip_worksheet ). + + endmethod. + + + method CLEAR. + + worksheets->clear( ). + + endmethod. + + + method CONSTRUCTOR. + + CREATE OBJECT worksheets. + + endmethod. + + + + + method GET. + + DATA lv_index TYPE i. + lv_index = ip_index. + eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). + + endmethod. + + + + method GET_ITERATOR. + + eo_iterator ?= worksheets->if_object_collection~get_iterator( ). + + endmethod. + + + + method IS_EMPTY. + + is_empty = worksheets->if_object_collection~is_empty( ). + + endmethod. + + + + method REMOVE. + + worksheets->remove( ip_worksheet ). + + endmethod. + + + + method SIZE. + + ep_size = worksheets->if_object_collection~size( ). + + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + + + + + + + method CONSTRUCTOR. + me->column_index = zcl_excel_common=>convert_column2int( ip_index ). + me->width = -1. + me->auto_size = abap_false. + me->visible = abap_true. + me->outline_level = 0. + me->collapsed = abap_false. + me->excel = ip_excel. "ins issue #157 - Allow Style for columns + me->worksheet = ip_worksheet. "ins issue #157 - Allow Style for columns + + " set default index to cellXf + me->xf_index = 0. + + endmethod. + + + + method GET_AUTO_SIZE. + r_auto_size = me->auto_size. + endmethod. + + + + method GET_COLLAPSED. + r_Collapsed = me->Collapsed. + endmethod. + + + + method GET_COLUMN_INDEX. + r_column_index = me->column_index. + endmethod. + + + + + method GET_COLUMN_STYLE_GUID. + IF me->style_guid IS NOT INITIAL. + ep_style_guid = me->style_guid. + ELSE. + ep_style_guid = me->worksheet->zif_excel_sheet_properties~get_style( ). + ENDIF. + endmethod. + + + + method GET_OUTLINE_LEVEL. + r_outline_level = me->outline_level. + endmethod. + + + + method GET_VISIBLE. + r_Visible = me->Visible. + endmethod. + + + + method GET_WIDTH. + r_WIDTH = me->WIDTH. + endmethod. + + + + method GET_XF_INDEX. + r_xf_index = me->xf_index. + endmethod. + + + + + method SET_AUTO_SIZE. + me->auto_size = ip_auto_size. + r_worksheet_columndime = me. + endmethod. + + + + + method SET_COLLAPSED. + me->Collapsed = ip_Collapsed. + r_worksheet_columndime = me. + endmethod. + + + + + method SET_COLUMN_INDEX. + me->column_index = zcl_excel_common=>convert_column2int( ip_index ). + r_worksheet_columndime = me. + endmethod. + + + + + method SET_COLUMN_STYLE_BY_GUID. + DATA: stylemapping TYPE zexcel_s_stylemapping. + + IF me->excel IS NOT BOUND. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Internal error - reference to ZCL_EXCEL not bound'. + ENDIF. + TRY. + stylemapping = me->excel->get_style_to_guid( ip_style_guid ). + me->style_guid = stylemapping-guid. + + CATCH zcx_excel . + EXIT. " leave as is in case of error + ENDTRY. + + endmethod. + + + + method SET_OUTLINE_LEVEL. + me->outline_level = ip_outline_level. + endmethod. + + + + + method SET_VISIBLE. + me->Visible = ip_Visible. + r_worksheet_columndime = me. + endmethod. + + + + + + method SET_WIDTH. + TRY. + me->width = ip_width. + r_worksheet_columndime = me. + CATCH cx_sy_conversion_no_number. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Unable to interpret width as number'. + ENDTRY. + endmethod. + + + + + method SET_XF_INDEX. + me->XF_INDEX = ip_XF_INDEX. + r_worksheet_columndime = me. + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + ABAP + + + + + + + + + method CONSTRUCTOR. + " Initialise values + me->row_index = ip_index. + me->row_height = -1. + me->visible = abap_true. + me->outline_level = 0. + me->collapsed = abap_false. + + " set row dimension as unformatted by default + me->xf_index = 0. + endmethod. + + + + + METHOD get_collapsed. + + DATA: lt_row_outlines TYPE zcl_excel_worksheet=>mty_ts_outlines_row, + lv_previous_row TYPE i, + lv_following_row TYPE i. + + r_collapsed = me->collapsed. + + CHECK r_collapsed = abap_false. " Maybe new method for outlines is being used + CHECK io_worksheet IS BOUND. + +* If an outline is collapsed ( even inside an outer outline ) the line following the last line +* of the group gets the flag "collapsed" + IF io_worksheet->zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_off. + lv_following_row = me->row_index + 1. + lt_row_outlines = io_worksheet->get_row_outlines( ). + READ TABLE lt_row_outlines TRANSPORTING NO FIELDS WITH KEY row_from = lv_following_row " first line of an outline + collapsed = abap_true. " that is collapsed + ELSE. + lv_previous_row = me->row_index - 1. + lt_row_outlines = io_worksheet->get_row_outlines( ). + READ TABLE lt_row_outlines TRANSPORTING NO FIELDS WITH KEY row_to = lv_previous_row " last line of an outline + collapsed = abap_true. " that is collapsed + ENDIF. + CHECK sy-subrc = 0. " ok - we found it + r_collapsed = abap_true. + + +ENDMETHOD. + + + + + METHOD get_outline_level. + + DATA: lt_row_outlines TYPE zcl_excel_worksheet=>mty_ts_outlines_row. + FIELD-SYMBOLS: <ls_row_outline> LIKE LINE OF lt_row_outlines. + +* if someone has set the outline level explicitly - just use that + IF me->outline_level IS NOT INITIAL. + r_outline_level = me->outline_level. + RETURN. + ENDIF. +* Maybe we can use the outline information in the worksheet + CHECK io_worksheet IS BOUND. + + lt_row_outlines = io_worksheet->get_row_outlines( ). + LOOP AT lt_row_outlines ASSIGNING <ls_row_outline> WHERE row_from <= me->row_index + AND row_to >= me->row_index. + + ADD 1 TO r_outline_level. + + ENDLOOP. + +ENDMETHOD. + + + + method GET_ROW_HEIGHT. + r_row_height = me->row_height. + endmethod. + + + + method GET_ROW_INDEX. + r_row_index = me->row_index. + endmethod. + + + + + METHOD get_visible. + + DATA: lt_row_outlines TYPE zcl_excel_worksheet=>mty_ts_outlines_row. + FIELD-SYMBOLS: <ls_row_outline> LIKE LINE OF lt_row_outlines. + + r_visible = me->visible. + CHECK r_visible = 'X'. " Currently visible --> but maybe the new outline methodology will hide it implicitly + CHECK io_worksheet IS BOUND. " But we have to see the worksheet to make sure + + lt_row_outlines = io_worksheet->get_row_outlines( ). + LOOP AT lt_row_outlines ASSIGNING <ls_row_outline> WHERE row_from <= me->row_index + AND row_to >= me->row_index + AND collapsed = abap_true. " row is in a collapsed outline --> not visible + CLEAR r_visible. + RETURN. " one hit is enough to ensure invisibility + + ENDLOOP. + +ENDMETHOD. + + + + method GET_XF_INDEX. + r_xf_index = me->xf_index. + endmethod. + + + + method SET_COLLAPSED. + me->collapsed = ip_collapsed. + endmethod. + + + + + method SET_OUTLINE_LEVEL. + IF ip_outline_level < 0 + OR ip_outline_level > 7. + + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Outline level must range between 0 and 7.'. + + ENDIF. + me->outline_level = ip_outline_level. + endmethod. + + + + + method SET_ROW_HEIGHT. + TRY. + me->row_height = ip_row_height. + CATCH cx_sy_conversion_no_number. + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Unable to interpret ip_row_height as number'. + ENDTRY. + endmethod. + + + + method SET_ROW_INDEX. + me->row_index = ip_index. + endmethod. + + + + method SET_VISIBLE. + me->visible = ip_visible. + endmethod. + + + + method SET_XF_INDEX. + me->XF_INDEX = ip_XF_INDEX. + endmethod. + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + + + + + + + + + + + method ZIF_EXCEL_WRITER~WRITE_FILE. + me->excel = io_excel. + + ep_file = me->create( ). + endmethod. + + + + METHOD add_further_data_to_zip. +* Can be used by child classes like xlsm-writer to write additional data to zip archive +ENDMETHOD. + + + + method CREATE. + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_drawings TYPE REF TO zcl_excel_drawings. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_xl_drawing TYPE string, + lv_xl_drawing_rels TYPE string, + lv_syindex TYPE string, + lv_value TYPE string, + lv_drawing_index TYPE i. + +********************************************************************** +* Start of insertion # issue 139 - Dateretention of cellstyles + me->excel->add_static_styles( ). +* End of insertion # issue 139 - Dateretention of cellstyles + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sheet#.xml and drawing#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + lv_drawing_index = 1. + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_false. + ENDIF. + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet + iv_drawing_index = lv_drawing_index ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). + lv_content = me->create_xl_table( lo_table ). + + lv_value = lo_table->get_name( ). + CONCATENATE 'xl/tables/' lv_value '.xml' INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +* Add drawings ********************************** + lo_drawings = lo_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + MOVE lv_drawing_index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + + lv_content = me->create_xl_drawings( lo_worksheet ). + lv_xl_drawing = me->c_xl_drawings. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_syindex. + lo_zip->add( name = lv_xl_drawing + content = lv_content ). + + lv_content = me->create_xl_drawings_rels( lo_worksheet ). + lv_xl_drawing_rels = me->c_xl_drawings_rels. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_drawing_rels + content = lv_content ). + ADD 1 TO lv_drawing_index. + ENDIF. + + ENDWHILE. + +********************************************************************** +* STEP 11: Add media + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_content = lo_drawing->get_media( ). + lv_value = lo_drawing->get_media_name( ). + CONCATENATE 'xl/media/' lv_value INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 12: Add charts + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_content = lo_drawing->get_media( ). + + "-------------Added by Alessandro Iannacci - Only if template exist + IF lv_content IS NOT INITIAL AND me->excel->use_template EQ abap_true. + lv_value = lo_drawing->get_media_name( ). + CONCATENATE 'xl/charts/' lv_value INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ELSE. "ADD CUSTOM CHART!!!! + lv_content = me->create_xl_charts( lo_drawing ). + lv_value = lo_drawing->get_media_name( ). + CONCATENATE 'xl/charts/' lv_value INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDIF. + "------------------------------------------------- + ENDWHILE. + +* Second to last step: Allow further information put into the zip archive by child classes + me->add_further_data_to_zip( lo_zip ). + +********************************************************************** +* Last step: Create the final zip + ep_excel = lo_zip->save( ). + + endmethod. + + + + method CREATE_CONTENT_TYPES. + + +** Constant node name + DATA: lc_xml_node_types TYPE string VALUE 'Types', + lc_xml_node_override TYPE string VALUE 'Override', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + " Node namespace + lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', + " Node extension + lc_xml_node_rels_ext TYPE string VALUE 'rels', + lc_xml_node_xml_ext TYPE string VALUE 'xml', + " Node partnumber + lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', + lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', + lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', + lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', + lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', + lc_xml_node_chart_pn TYPE string VALUE '/xl/charts/chart#.xml', + " Node contentType + lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', + lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', + lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', + lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', + lc_xml_node_xml_ct TYPE string VALUE 'application/xml', + lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', + lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', + lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', + lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml', + lc_xml_node_table_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml', + lc_xml_node_drawings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawing+xml', + lc_xml_node_chart_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table. + + DATA: lv_worksheets_num TYPE i, + lv_worksheets_numc TYPE numc3, + lv_xml_node_worksheet_pn TYPE string, + lv_xml_size TYPE i, + lv_value TYPE string, + lv_drawing_index TYPE i VALUE 1, + lv_index_str TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'UTF-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node types + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_types_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_rels_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_rels_ct ). + lo_element_root->append_child( new_child = lo_element ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_xml_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_xml_ct ). + lo_element_root->append_child( new_child = lo_element ). + + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_theme_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_theme_ct ). + lo_element_root->append_child( new_child = lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_styles_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_styles_ct ). + lo_element_root->append_child( new_child = lo_element ). + + " Workbook node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_workb_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + lo_element_root->append_child( new_child = lo_element ). + + " Properties node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_props_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_props_ct ). + lo_element_root->append_child( new_child = lo_element ). + + " Worksheet node + lv_worksheets_num = excel->get_worksheets_size( ). + DO lv_worksheets_num TIMES. + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + + MOVE sy-index TO lv_worksheets_numc. + SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. + lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_xml_node_worksheet_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_worksheet_ct ). + lo_element_root->append_child( new_child = lo_element ). + ENDDO. + + lo_iterator = me->excel->get_worksheets_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). + + lv_value = lo_table->get_name( ). + CONCATENATE '/xl/tables/' lv_value '.xml' INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_table_ct ). + lo_element_root->append_child( new_child = lo_element ). + ENDWHILE. + + " Drawings + DATA: lo_drawings TYPE REF TO zcl_excel_drawings. + + lo_drawings = lo_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + lv_index_str = lv_drawing_index. + CONDENSE lv_index_str NO-GAPS. + CONCATENATE '/' me->c_xl_drawings INTO lv_value. + REPLACE '#' WITH lv_index_str INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_drawings_ct ). + lo_element_root->append_child( new_child = lo_element ). + + ADD 1 TO lv_drawing_index. + ENDIF. + ENDWHILE. + + " media mimes + DATA: lo_drawing TYPE REF TO zcl_excel_drawing, + lt_media_type TYPE TABLE OF mimetypes-extension, + lv_media_type TYPE mimetypes-extension, + lv_mime_type TYPE mimetypes-type. + + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) = abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_media_type = lo_drawing->get_media_type( ). + COLLECT lv_media_type INTO lt_media_type. + ENDWHILE. + + LOOP AT lt_media_type INTO lv_media_type. + CALL FUNCTION 'SDOK_MIMETYPE_GET' + EXPORTING + extension = lv_media_type + IMPORTING + mimetype = lv_mime_type. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lv_value = lv_media_type. + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lv_value ). + lv_value = lv_mime_type. + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDLOOP. + + " Charts + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) = abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lv_index_str = lo_drawing->get_index( ). + CONDENSE lv_index_str. + lv_value = lc_xml_node_chart_pn. + REPLACE ALL OCCURRENCES OF '#' IN lv_value WITH lv_index_str. + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_chart_ct ). + lo_element_root->append_child( new_child = lo_element ). + ENDWHILE. + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_strings_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_strings_ct ). + lo_element_root->append_child( new_child = lo_element ). + + " Strings node + lo_element = lo_document->create_simple_element( name = lc_xml_node_override + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_partname + value = lc_xml_node_core_pn ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_core_ct ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + method CREATE_DOCPROPS_APP. + + +** Constant node name + DATA: lc_xml_node_properties TYPE string VALUE 'Properties', + lc_xml_node_application TYPE string VALUE 'Application', + lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', + lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', + lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', + lc_xml_node_vector TYPE string VALUE 'vector', + lc_xml_node_variant TYPE string VALUE 'variant', + lc_xml_node_lpstr TYPE string VALUE 'lpstr', + lc_xml_node_i4 TYPE string VALUE 'i4', + lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', + lc_xml_node_company TYPE string VALUE 'Company', + lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', + lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', + lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', + lc_xml_node_appversion TYPE string VALUE 'AppVersion', + " Namespace prefix + lc_vt_ns TYPE string VALUE 'vt', + lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', + lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', + " Node attributes + lc_xml_attr_size TYPE string VALUE 'size', + lc_xml_attr_basetype TYPE string VALUE 'baseType'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element_vector TYPE REF TO if_ixml_element, + lo_sub_element_variant TYPE REF TO if_ixml_element, + lo_sub_element_lpstr TYPE REF TO if_ixml_element, + lo_sub_element_i4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lv_value TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node properties + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_props_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:vt' + value = lc_xml_node_props_vt_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Application + lo_element = lo_document->create_simple_element( name = lc_xml_node_application + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~application. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " DocSecurity + lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~docsecurity. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " ScaleCrop + lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop + parent = lo_document ). + lv_value = me->flag2bool( excel->zif_excel_book_properties~scalecrop ). + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " HeadingPairs + lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = '2' ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_variant ). + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_name( ). + lo_sub_element_lpstr->set_value( value = lv_value ). + lo_sub_element_variant->append_child( new_child = lo_sub_element_lpstr ). " lpstr node + + lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node + + " ** variant node + lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant + prefix = lc_vt_ns + parent = lo_document ). + + " *** i4 node + lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_i4->set_value( value = lv_value ). + lo_sub_element_variant->append_child( new_child = lo_sub_element_i4 ). " lpstr node + + lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node + + lo_element->append_child( new_child = lo_sub_element_vector ). " vector node + + lo_element_root->append_child( new_child = lo_element ). " HeadingPairs + + + " TitlesOfParts + lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts + parent = lo_document ). + + + " * vector node + lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector + prefix = lc_vt_ns + parent = lo_document ). + lv_value = excel->get_worksheets_size( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size + value = lv_value ). + lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype + value = lc_xml_node_lpstr ). + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " ** lpstr node + lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr + prefix = lc_vt_ns + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_worksheet->get_title( ). + lo_sub_element_lpstr->set_value( value = lv_value ). + lo_sub_element_vector->append_child( new_child = lo_sub_element_lpstr ). " lpstr node + ENDWHILE. + + lo_element->append_child( new_child = lo_sub_element_vector ). " vector node + + lo_element_root->append_child( new_child = lo_element ). " TitlesOfParts + + + + " Company + IF excel->zif_excel_book_properties~company IS NOT INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_company + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~company. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + " LinksUpToDate + lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate + parent = lo_document ). + lv_value = me->flag2bool( excel->zif_excel_book_properties~linksuptodate ). + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " SharedDoc + lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc + parent = lo_document ). + lv_value = me->flag2bool( excel->zif_excel_book_properties~shareddoc ). + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " HyperlinksChanged + lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged + parent = lo_document ). + lv_value = me->flag2bool( excel->zif_excel_book_properties~hyperlinkschanged ). + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " AppVersion + lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~appversion. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + method CREATE_DOCPROPS_CORE. + + +** Constant node name + DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', + lc_xml_node_creator TYPE string VALUE 'creator', + lc_xml_node_description TYPE string VALUE 'description', + lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', + lc_xml_node_created TYPE string VALUE 'created', + lc_xml_node_modified TYPE string VALUE 'modified', + " Node attributes + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', + " Node namespace + lc_cp_ns TYPE string VALUE 'cp', + lc_dc_ns TYPE string VALUE 'dc', + lc_dcterms_ns TYPE string VALUE 'dcterms', +* lc_dcmitype_ns TYPE string VALUE 'dcmitype', + lc_xsi_ns TYPE string VALUE 'xsi', + lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', + lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', + lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', + lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', + lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_value TYPE string, + lv_date TYPE sydatum, + lv_time TYPE syuzeit. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node coreProperties + lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties + prefix = lc_cp_ns + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:cp' + value = lc_xml_node_cp_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dc' + value = lc_xml_node_dc_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' + value = lc_xml_node_dcterms_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' + value = lc_xml_node_dcmitype_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:xsi' + value = lc_xml_node_xsi_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Creator node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~creator. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " Description node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_description + prefix = lc_dc_ns + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~description. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " lastModifiedBy node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby + prefix = lc_cp_ns + parent = lo_document ). + lv_value = excel->zif_excel_book_properties~lastmodifiedby. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " Created node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + + CONVERT TIME STAMP excel->zif_excel_book_properties~created TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. + CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. + REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. +* lv_value = excel->zif_excel_book_properties~created. +* lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " Modified node + lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified + prefix = lc_dcterms_ns + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + prefix = lc_xsi_ns + value = lc_xml_attr_target ). + CONVERT TIME STAMP excel->zif_excel_book_properties~modified TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. + CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. + REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. +* lv_value = excel->zif_excel_book_properties~modified. +* lv_value = '2010-07-04T14:58:53Z'. + lo_element->set_value( value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + method CREATE_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_rId1_id TYPE string VALUE 'rId1', + lc_xml_node_rId2_id TYPE string VALUE 'rId2', + lc_xml_node_rId3_id TYPE string VALUE 'rId3', + " Node type + lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + " Node target + lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', + lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', + lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + " Theme node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId3_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId3_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId3_tg ). + lo_element_root->append_child( new_child = lo_element ). + + " Styles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId2_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId2_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId2_tg ). + lo_element_root->append_child( new_child = lo_element ). + + " rels node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lc_xml_node_rId1_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rId1_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rId1_tg ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + + method CREATE_XL_CHARTS. + + +** Constant node name + CONSTANTS: lc_xml_node_chartspace TYPE string VALUE 'c:chartSpace', + lc_xml_node_ns_c TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/chart', + lc_xml_node_ns_a TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/main', + lc_xml_node_ns_r TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + lc_xml_node_date1904 TYPE string VALUE 'c:date1904', + lc_xml_node_lang TYPE string VALUE 'c:lang', + lc_xml_node_roundedcorners TYPE string VALUE 'c:roundedCorners', + lc_xml_node_altcont TYPE string VALUE 'mc:AlternateContent', + lc_xml_node_altcont_ns_mc TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006', + lc_xml_node_choice TYPE string VALUE 'mc:Choice', + lc_xml_node_choice_ns_requires TYPE string VALUE 'c14', + lc_xml_node_choice_ns_c14 TYPE string VALUE 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart', + lc_xml_node_style TYPE string VALUE 'c14:style', + lc_xml_node_fallback TYPE string VALUE 'mc:Fallback', + lc_xml_node_style2 TYPE string VALUE 'c:style', + + "---------------------------CHART + lc_xml_node_chart TYPE string VALUE 'c:chart', + lc_xml_node_autotitledeleted TYPE string VALUE 'c:autoTitleDeleted', + "plotArea + lc_xml_node_plotarea TYPE string VALUE 'c:plotArea', + lc_xml_node_layout TYPE string VALUE 'c:layout', + lc_xml_node_varycolors TYPE string VALUE 'c:varyColors', + lc_xml_node_ser TYPE string VALUE 'c:ser', + lc_xml_node_idx TYPE string VALUE 'c:idx', + lc_xml_node_order TYPE string VALUE 'c:order', + lc_xml_node_tx TYPE string VALUE 'c:tx', + lc_xml_node_v TYPE string VALUE 'c:v', + lc_xml_node_val TYPE string VALUE 'c:val', + lc_xml_node_cat TYPE string VALUE 'c:cat', + lc_xml_node_numref TYPE string VALUE 'c:numRef', + lc_xml_node_strref TYPE string VALUE 'c:strRef', + lc_xml_node_f TYPE string VALUE 'c:f', "this is the range + "note: numcache avoided + lc_xml_node_dlbls TYPE string VALUE 'c:dLbls', + lc_xml_node_showlegendkey TYPE string VALUE 'c:showLegendKey', + lc_xml_node_showval TYPE string VALUE 'c:showVal', + lc_xml_node_showcatname TYPE string VALUE 'c:showCatName', + lc_xml_node_showsername TYPE string VALUE 'c:showSerName', + lc_xml_node_showpercent TYPE string VALUE 'c:showPercent', + lc_xml_node_showbubblesize TYPE string VALUE 'c:showBubbleSize', + "plotArea->pie + lc_xml_node_piechart TYPE string VALUE 'c:pieChart', + lc_xml_node_showleaderlines TYPE string VALUE 'c:showLeaderLines', + lc_xml_node_firstsliceang TYPE string VALUE 'c:firstSliceAng', + "plotArea->line + lc_xml_node_linechart TYPE string VALUE 'c:lineChart', + lc_xml_node_symbol TYPE string VALUE 'c:symbol', + lc_xml_node_marker TYPE string VALUE 'c:marker', + lc_xml_node_smooth TYPE string VALUE 'c:smooth', + "plotArea->bar + lc_xml_node_invertifnegative TYPE string VALUE 'c:invertIfNegative', + lc_xml_node_barchart TYPE string VALUE 'c:barChart', + lc_xml_node_bardir TYPE string VALUE 'c:barDir', + lc_xml_node_gapwidth TYPE string VALUE 'c:gapWidth', + "plotArea->line + plotArea->bar + lc_xml_node_grouping TYPE string VALUE 'c:grouping', + lc_xml_node_axid TYPE string VALUE 'c:axId', + lc_xml_node_catax TYPE string VALUE 'c:catAx', + lc_xml_node_valax TYPE string VALUE 'c:valAx', + lc_xml_node_scaling TYPE string VALUE 'c:scaling', + lc_xml_node_orientation TYPE string VALUE 'c:orientation', + lc_xml_node_delete TYPE string VALUE 'c:delete', + lc_xml_node_axpos TYPE string VALUE 'c:axPos', + lc_xml_node_numfmt TYPE string VALUE 'c:numFmt', + lc_xml_node_majorgridlines TYPE string VALUE 'c:majorGridlines', + lc_xml_node_majortickmark TYPE string VALUE 'c:majorTickMark', + lc_xml_node_minortickmark TYPE string VALUE 'c:minorTickMark', + lc_xml_node_ticklblpos TYPE string VALUE 'c:tickLblPos', + lc_xml_node_crossax TYPE string VALUE 'c:crossAx', + lc_xml_node_crosses TYPE string VALUE 'c:crosses', + lc_xml_node_auto TYPE string VALUE 'c:auto', + lc_xml_node_lblalgn TYPE string VALUE 'c:lblAlgn', + lc_xml_node_lbloffset TYPE string VALUE 'c:lblOffset', + lc_xml_node_nomultilvllbl TYPE string VALUE 'c:noMultiLvlLbl', + lc_xml_node_crossbetween TYPE string VALUE 'c:crossBetween', + "legend + lc_xml_node_legend TYPE string VALUE 'c:legend', + "legend->pie + lc_xml_node_legendpos TYPE string VALUE 'c:legendPos', +* lc_xml_node_layout TYPE string VALUE 'c:layout', "already exist + lc_xml_node_overlay TYPE string VALUE 'c:overlay', + lc_xml_node_txpr TYPE string VALUE 'c:txPr', + lc_xml_node_bodypr TYPE string VALUE 'a:bodyPr', + lc_xml_node_lststyle TYPE string VALUE 'a:lstStyle', + lc_xml_node_p TYPE string VALUE 'a:p', + lc_xml_node_ppr TYPE string VALUE 'a:pPr', + lc_xml_node_defrpr TYPE string VALUE 'a:defRPr', + lc_xml_node_endpararpr TYPE string VALUE 'a:endParaRPr', + "legend->bar + legend->line + lc_xml_node_plotvisonly TYPE string VALUE 'c:plotVisOnly', + lc_xml_node_dispblanksas TYPE string VALUE 'c:dispBlanksAs', + lc_xml_node_showdlblsovermax TYPE string VALUE 'c:showDLblsOverMax', + "---------------------------END OF CHART + + lc_xml_node_printsettings TYPE string VALUE 'c:printSettings', + lc_xml_node_headerfooter TYPE string VALUE 'c:headerFooter', + lc_xml_node_pagemargins TYPE string VALUE 'c:pageMargins', + lc_xml_node_pagesetup TYPE string VALUE 'c:pageSetup'. + + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_cellanchor TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + DATA: lv_rel_id TYPE i. + + DATA lo_element TYPE REF TO if_ixml_element. + DATA lo_element2 TYPE REF TO if_ixml_element. + DATA lo_element3 TYPE REF TO if_ixml_element. + DATA lo_el_rootchart TYPE REF TO if_ixml_element. + DATA lo_element4 TYPE REF TO if_ixml_element. + DATA lo_element5 TYPE REF TO if_ixml_element. + DATA lo_element6 TYPE REF TO if_ixml_element. + DATA lo_element7 TYPE REF TO if_ixml_element. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_chartspace + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:c' + value = lc_xml_node_ns_c ). + lo_element_root->set_attribute_ns( name = 'xmlns:a' + value = lc_xml_node_ns_a ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_ns_r ). + +********************************************************************** +* STEP 4: Create chart + + DATA lo_chartb TYPE REF TO zcl_excel_graph_bars. + DATA lo_chartp TYPE REF TO zcl_excel_graph_pie. + DATA lo_chartl TYPE REF TO zcl_excel_graph_line. + DATA lo_chart TYPE REF TO zcl_excel_graph. + + DATA ls_serie TYPE zcl_excel_graph=>s_series. + DATA ls_ax TYPE zcl_excel_graph_bars=>s_ax. + DATA lv_str TYPE string. + + "Identify chart type + CASE io_drawing->graph_type. + WHEN zcl_excel_drawing=>c_graph_bars. + lo_chartb ?= io_drawing->graph. + WHEN zcl_excel_drawing=>c_graph_pie. + lo_chartp ?= io_drawing->graph. + WHEN zcl_excel_drawing=>c_graph_line. + lo_chartl ?= io_drawing->graph. + WHEN OTHERS. + ENDCASE. + + + lo_chart = io_drawing->graph. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_date1904 + parent = lo_element_root ). + lo_element->set_attribute_ns( name = 'val' + value = lo_chart->ns_1904val ). + + lo_element = lo_document->create_simple_element( name = lc_xml_node_lang + parent = lo_element_root ). + lo_element->set_attribute_ns( name = 'val' + value = lo_chart->ns_langval ). + + lo_element = lo_document->create_simple_element( name = lc_xml_node_roundedcorners + parent = lo_element_root ). + lo_element->set_attribute_ns( name = 'val' + value = lo_chart->ns_roundedcornersval ). + + lo_element = lo_document->create_simple_element( name = lc_xml_node_altcont + parent = lo_element_root ). + lo_element->set_attribute_ns( name = 'xmlns:mc' + value = lc_xml_node_altcont_ns_mc ). + + "Choice + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_choice + parent = lo_element ). + lo_element2->set_attribute_ns( name = 'Requires' + value = lc_xml_node_choice_ns_requires ). + lo_element2->set_attribute_ns( name = 'xmlns:c14' + value = lc_xml_node_choice_ns_c14 ). + + "C14:style + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_style + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chart->ns_c14styleval ). + + "Fallback + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_fallback + parent = lo_element ). + + "C:style + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_style2 + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chart->ns_styleval ). + + "---------------------------CHART + lo_element = lo_document->create_simple_element( name = lc_xml_node_chart + parent = lo_element_root ). + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_autotitledeleted + parent = lo_element ). + lo_element2->set_attribute_ns( name = 'val' + value = lo_chart->ns_autotitledeletedval ). + + "plotArea + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_plotarea + parent = lo_element ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout + parent = lo_element2 ). + CASE io_drawing->graph_type. + WHEN zcl_excel_drawing=>c_graph_bars. + "----bar + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_barchart + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_bardir + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartb->ns_bardirval ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_grouping + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartb->ns_groupingval ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_varycolors + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartb->ns_varycolorsval ). + + "series + LOOP AT lo_chartb->series INTO ls_serie. + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ser + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_idx + parent = lo_element4 ). + IF ls_serie-idx IS NOT INITIAL. + lv_str = ls_serie-idx. + ELSE. + lv_str = sy-tabix - 1. + ENDIF. + CONDENSE lv_str. + lo_element5->set_attribute_ns( name = 'val' + value = lv_str ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_order + parent = lo_element4 ). + lv_str = ls_serie-order. + CONDENSE lv_str. + lo_element5->set_attribute_ns( name = 'val' + value = lv_str ). + IF ls_serie-sername IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_tx + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_element5 ). + lo_element6->set_value( value = ls_serie-sername ). + ENDIF. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_invertifnegative + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = ls_serie-invertifnegative ). + IF ls_serie-lbl IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_cat + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_strref + parent = lo_element5 ). + lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_element6 ). + lo_element7->set_value( value = ls_serie-lbl ). + ENDIF. + IF ls_serie-ref IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_val + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_numref + parent = lo_element5 ). + lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_element6 ). + lo_element7->set_value( value = ls_serie-ref ). + ENDIF. + ENDLOOP. + "endseries + + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_dlbls + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showlegendkey + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartb->ns_showlegendkeyval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showval + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartb->ns_showvalval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showcatname + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartb->ns_showcatnameval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showsername + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartb->ns_showsernameval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showpercent + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartb->ns_showpercentval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showbubblesize + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartb->ns_showbubblesizeval ). + + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_gapwidth + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartb->ns_gapwidthval ). + + "axes + lo_el_rootchart = lo_element3. + LOOP AT lo_chartb->axes INTO ls_ax. + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid + parent = lo_el_rootchart ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axid ). + CASE ls_ax-type. + WHEN zcl_excel_graph_bars=>c_catax. + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_catax + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axid ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = ls_ax-orientation ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-delete ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axpos ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'formatCode' + value = ls_ax-formatcode ). + lo_element4->set_attribute_ns( name = 'sourceLinked' + value = ls_ax-sourcelinked ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-majortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-minortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-ticklblpos ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crossax ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crosses ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_auto + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-auto ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lblalgn + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-lblalgn ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lbloffset + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-lbloffset ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_nomultilvllbl + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-nomultilvllbl ). + WHEN zcl_excel_graph_bars=>c_valax. + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_valax + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axid ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = ls_ax-orientation ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-delete ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axpos ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majorgridlines + parent = lo_element3 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'formatCode' + value = ls_ax-formatcode ). + lo_element4->set_attribute_ns( name = 'sourceLinked' + value = ls_ax-sourcelinked ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-majortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-minortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-ticklblpos ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crossax ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crosses ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossbetween + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crossbetween ). + WHEN OTHERS. + ENDCASE. + ENDLOOP. + "endaxes + + WHEN zcl_excel_drawing=>c_graph_pie. + "----pie + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_piechart + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_varycolors + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartp->ns_varycolorsval ). + + "series + LOOP AT lo_chartp->series INTO ls_serie. + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ser + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_idx + parent = lo_element4 ). + IF ls_serie-idx IS NOT INITIAL. + lv_str = ls_serie-idx. + ELSE. + lv_str = sy-tabix - 1. + ENDIF. + CONDENSE lv_str. + lo_element5->set_attribute_ns( name = 'val' + value = lv_str ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_order + parent = lo_element4 ). + lv_str = ls_serie-order. + CONDENSE lv_str. + lo_element5->set_attribute_ns( name = 'val' + value = lv_str ). + IF ls_serie-sername IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_tx + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_element5 ). + lo_element6->set_value( value = ls_serie-sername ). + ENDIF. + IF ls_serie-lbl IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_cat + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_strref + parent = lo_element5 ). + lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_element6 ). + lo_element7->set_value( value = ls_serie-lbl ). + ENDIF. + IF ls_serie-ref IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_val + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_numref + parent = lo_element5 ). + lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_element6 ). + lo_element7->set_value( value = ls_serie-ref ). + ENDIF. + ENDLOOP. + "endseries + + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_dlbls + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showlegendkey + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartp->ns_showlegendkeyval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showval + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartp->ns_showvalval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showcatname + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartp->ns_showcatnameval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showsername + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartp->ns_showsernameval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showpercent + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartp->ns_showpercentval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showbubblesize + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartp->ns_showbubblesizeval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showleaderlines + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartp->ns_showleaderlinesval ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_firstsliceang + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartp->ns_firstsliceangval ). + WHEN zcl_excel_drawing=>c_graph_line. + "----line + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_linechart + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_grouping + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartl->ns_groupingval ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_varycolors + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartl->ns_varycolorsval ). + + "series + LOOP AT lo_chartl->series INTO ls_serie. + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ser + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_idx + parent = lo_element4 ). + IF ls_serie-idx IS NOT INITIAL. + lv_str = ls_serie-idx. + ELSE. + lv_str = sy-tabix - 1. + ENDIF. + CONDENSE lv_str. + lo_element5->set_attribute_ns( name = 'val' + value = lv_str ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_order + parent = lo_element4 ). + lv_str = ls_serie-order. + CONDENSE lv_str. + lo_element5->set_attribute_ns( name = 'val' + value = lv_str ). + IF ls_serie-sername IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_tx + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_element5 ). + lo_element6->set_value( value = ls_serie-sername ). + ENDIF. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_marker + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_symbol + parent = lo_element5 ). + lo_element6->set_attribute_ns( name = 'val' + value = ls_serie-symbol ). + IF ls_serie-lbl IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_cat + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_strref + parent = lo_element5 ). + lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_element6 ). + lo_element7->set_value( value = ls_serie-lbl ). + ENDIF. + IF ls_serie-ref IS NOT INITIAL. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_val + parent = lo_element4 ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_numref + parent = lo_element5 ). + lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_element6 ). + lo_element7->set_value( value = ls_serie-ref ). + ENDIF. + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_smooth + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = ls_serie-smooth ). + ENDLOOP. + "endseries + + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_dlbls + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showlegendkey + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartl->ns_showlegendkeyval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showval + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartl->ns_showvalval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showcatname + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartl->ns_showcatnameval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showsername + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartl->ns_showsernameval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showpercent + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartl->ns_showpercentval ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showbubblesize + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = lo_chartl->ns_showbubblesizeval ). + + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_marker + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartl->NS_MARKERVAL ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_smooth + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = lo_chartl->NS_SMOOTHVAL ). + + "axes + lo_el_rootchart = lo_element3. + LOOP AT lo_chartl->axes INTO ls_ax. + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid + parent = lo_el_rootchart ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axid ). + CASE ls_ax-type. + WHEN zcl_excel_graph_line=>c_catax. + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_catax + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axid ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = ls_ax-orientation ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-delete ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axpos ). +* lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt +* parent = lo_element3 ). +* lo_element4->set_attribute_ns( name = 'formatCode' +* value = ls_ax-formatcode ). +* lo_element4->set_attribute_ns( name = 'sourceLinked' +* value = ls_ax-sourcelinked ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-majortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-minortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-ticklblpos ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crossax ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crosses ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_auto + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-auto ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lblalgn + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-lblalgn ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lbloffset + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-lbloffset ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_nomultilvllbl + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-nomultilvllbl ). + WHEN zcl_excel_graph_line=>c_valax. + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_valax + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axid ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'val' + value = ls_ax-orientation ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-delete ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-axpos ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majorgridlines + parent = lo_element3 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'formatCode' + value = ls_ax-formatcode ). + lo_element4->set_attribute_ns( name = 'sourceLinked' + value = ls_ax-sourcelinked ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-majortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-minortickmark ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-ticklblpos ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crossax ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crosses ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossbetween + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = ls_ax-crossbetween ). + WHEN OTHERS. + ENDCASE. + ENDLOOP. + "endaxes + + WHEN OTHERS. + ENDCASE. + + "legend + IF lo_chart->print_label EQ abap_true. + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_legend + parent = lo_element ). + CASE io_drawing->graph_type. + WHEN zcl_excel_drawing=>c_graph_bars. + "----bar + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_legendpos + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chartb->ns_legendposval ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout + parent = lo_element2 ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_overlay + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chartb->ns_overlayval ). + WHEN zcl_excel_drawing=>c_graph_line. + "----line + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_legendpos + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chartl->ns_legendposval ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout + parent = lo_element2 ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_overlay + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chartl->ns_overlayval ). + WHEN zcl_excel_drawing=>c_graph_pie. + "----pie + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_legendpos + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chartp->ns_legendposval ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout + parent = lo_element2 ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_overlay + parent = lo_element2 ). + lo_element3->set_attribute_ns( name = 'val' + value = lo_chartp->ns_overlayval ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_txpr + parent = lo_element2 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_bodypr + parent = lo_element3 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lststyle + parent = lo_element3 ). + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_p + parent = lo_element3 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_ppr + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'rtl' + value = lo_chartp->ns_pprrtl ). + lo_element6 = lo_document->create_simple_element( name = lc_xml_node_defrpr + parent = lo_element5 ). + lo_element5 = lo_document->create_simple_element( name = lc_xml_node_endpararpr + parent = lo_element4 ). + lo_element5->set_attribute_ns( name = 'lang' + value = lo_chartp->ns_endpararprlang ). + WHEN OTHERS. + ENDCASE. + ENDIF. + + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_plotvisonly + parent = lo_element ). + lo_element2->set_attribute_ns( name = 'val' + value = lo_chart->ns_plotvisonlyval ). + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_dispblanksas + parent = lo_element ). + lo_element2->set_attribute_ns( name = 'val' + value = lo_chart->ns_dispblanksasval ). + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_showdlblsovermax + parent = lo_element ). + lo_element2->set_attribute_ns( name = 'val' + value = lo_chart->ns_showdlblsovermaxval ). + "---------------------------END OF CHART + + "printSettings + lo_element = lo_document->create_simple_element( name = lc_xml_node_printsettings + parent = lo_element_root ). + "headerFooter + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_headerfooter + parent = lo_element ). + "pageMargins + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_element ). + lo_element2->set_attribute_ns( name = 'b' + value = lo_chart->pagemargins-b ). + lo_element2->set_attribute_ns( name = 'l' + value = lo_chart->pagemargins-l ). + lo_element2->set_attribute_ns( name = 'r' + value = lo_chart->pagemargins-r ). + lo_element2->set_attribute_ns( name = 't' + value = lo_chart->pagemargins-t ). + lo_element2->set_attribute_ns( name = 'header' + value = lo_chart->pagemargins-header ). + lo_element2->set_attribute_ns( name = 'footer' + value = lo_chart->pagemargins-footer ). + "pageSetup + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_pagesetup + parent = lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + + method CREATE_XL_DRAWINGS. + + +** Constant node name + CONSTANTS: lc_xml_node_wsdr TYPE string VALUE 'xdr:wsDr', + lc_xml_node_ns_xdr TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing', + lc_xml_node_ns_a TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/main'. + + CONSTANTS: lc_on TYPE string VALUE '1', + lc_off TYPE string VALUE '0'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_cellanchor TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_drawings TYPE REF TO zcl_excel_drawings, + lo_drawing TYPE REF TO zcl_excel_drawing. + DATA: lv_rel_id TYPE i. + + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_wsdr + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns:xdr' + value = lc_xml_node_ns_xdr ). + lo_element_root->set_attribute_ns( name = 'xmlns:a' + value = lc_xml_node_ns_a ). + +********************************************************************** +* STEP 4: Create drawings + + CLEAR: lv_rel_id. + + lo_drawings = io_worksheet->get_drawings( ). + + lo_iterator = lo_drawings->get_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + ADD 1 TO lv_rel_id. + lo_element_cellanchor = me->create_xl_drawing_anchor( + io_drawing = lo_drawing + io_document = lo_document + ip_index = lv_rel_id ). + + lo_element_root->append_child( new_child = lo_element_cellanchor ). + + ENDWHILE. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + + method CREATE_XL_DRAWINGS_RELS. + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + lc_xml_node_rid_image_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', + lc_xml_node_rid_chart_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_drawings TYPE REF TO zcl_excel_drawings, + lo_drawing TYPE REF TO zcl_excel_drawing. + + DATA: lv_value TYPE string, + lv_counter TYPE i. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Add sheet Relationship nodes here + lv_counter = 0. + lo_drawings = io_worksheet->get_drawings( ). + lo_iterator = lo_drawings->get_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + ADD 1 TO lv_counter. + + lv_value = lv_counter. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + + lv_value = lo_drawing->get_media_name( ). + CASE lo_drawing->get_type( ). + WHEN zcl_excel_drawing=>type_image. + CONCATENATE '../media/' lv_value INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_image_tp ). + + WHEN zcl_excel_drawing=>type_chart. + CONCATENATE '../charts/' lv_value INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_chart_tp ). + + ENDCASE. + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDWHILE. + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + + + + method CREATE_XL_DRAWING_ANCHOR. + +** Constant node name + CONSTANTS: lc_xml_node_onecellanchor TYPE string VALUE 'xdr:oneCellAnchor', + lc_xml_node_twocellanchor TYPE string VALUE 'xdr:twoCellAnchor', + lc_xml_node_from TYPE string VALUE 'xdr:from', + lc_xml_node_to TYPE string VALUE 'xdr:to', + lc_xml_node_pic TYPE string VALUE 'xdr:pic', + lc_xml_node_ext TYPE string VALUE 'xdr:ext', + lc_xml_node_clientdata TYPE string VALUE 'xdr:clientData', + + lc_xml_node_col TYPE string VALUE 'xdr:col', + lc_xml_node_coloff TYPE string VALUE 'xdr:colOff', + lc_xml_node_row TYPE string VALUE 'xdr:row', + lc_xml_node_rowoff TYPE string VALUE 'xdr:rowOff', + + lc_xml_node_nvpicpr TYPE string VALUE 'xdr:nvPicPr', + lc_xml_node_cnvpr TYPE string VALUE 'xdr:cNvPr', + lc_xml_node_cnvpicpr TYPE string VALUE 'xdr:cNvPicPr', + lc_xml_node_piclocks TYPE string VALUE 'a:picLocks', + + lc_xml_node_sppr TYPE string VALUE 'xdr:spPr', + lc_xml_node_apgeom TYPE string VALUE 'a:prstGeom', + lc_xml_node_aavlst TYPE string VALUE 'a:avLst', + + lc_xml_node_graphicframe TYPE string VALUE 'xdr:graphicFrame', + lc_xml_node_nvgraphicframepr TYPE string VALUE 'xdr:nvGraphicFramePr', + lc_xml_node_cnvgraphicframepr TYPE string VALUE 'xdr:cNvGraphicFramePr', + lc_xml_node_graphicframelocks TYPE string VALUE 'a:graphicFrameLocks', + lc_xml_node_xfrm TYPE string VALUE 'xdr:xfrm', + lc_xml_node_aoff TYPE string VALUE 'a:off', + lc_xml_node_aext TYPE string VALUE 'a:ext', + lc_xml_node_agraphic TYPE string VALUE 'a:graphic', + lc_xml_node_agraphicdata TYPE string VALUE 'a:graphicData', + + lc_xml_node_ns_c TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/chart', + lc_xml_node_cchart TYPE string VALUE 'c:chart', + + lc_xml_node_blipfill TYPE string VALUE 'xdr:blipFill', + lc_xml_node_ablip TYPE string VALUE 'a:blip', + lc_xml_node_astretch TYPE string VALUE 'a:stretch', + lc_xml_node_ns_r TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'. + + + CONSTANTS: lc_on TYPE string VALUE '1', + lc_off TYPE string VALUE '0'. + + DATA: lo_element_graphicframe TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element2 TYPE REF TO if_ixml_element, + lo_element3 TYPE REF TO if_ixml_element, + lo_element_from TYPE REF TO if_ixml_element, + lo_element_to TYPE REF TO if_ixml_element, + lo_element_ext TYPE REF TO if_ixml_element, + lo_element_pic TYPE REF TO if_ixml_element, + lo_element_clientdata TYPE REF TO if_ixml_element, + + ls_position TYPE zexcel_drawing_position, + + lv_col TYPE string, " zexcel_cell_column, + lv_row TYPE string, " zexcel_cell_row. + lv_col_offset TYPE string, + lv_row_offset TYPE string, + lv_value TYPE string. + + ls_position = io_drawing->get_position( ). + + IF ls_position-anchor = 'ONE'. + ep_anchor = io_document->create_simple_element( name = lc_xml_node_onecellanchor + parent = io_document ). + ELSE. + ep_anchor = io_document->create_simple_element( name = lc_xml_node_twocellanchor + parent = io_document ). + ENDIF. + +* from cell ****************************** + lo_element_from = io_document->create_simple_element( name = lc_xml_node_from + parent = io_document ). + + lv_col = ls_position-from-col. + lv_row = ls_position-from-row. + lv_col_offset = ls_position-from-col_offset. + lv_row_offset = ls_position-from-row_offset. + CONDENSE lv_col NO-GAPS. + CONDENSE lv_row NO-GAPS. + CONDENSE lv_col_offset NO-GAPS. + CONDENSE lv_row_offset NO-GAPS. + + lo_element = io_document->create_simple_element( name = lc_xml_node_col + parent = io_document ). + lo_element->set_value( value = lv_col ). + lo_element_from->append_child( new_child = lo_element ). + + lo_element = io_document->create_simple_element( name = lc_xml_node_coloff + parent = io_document ). + lo_element->set_value( value = lv_col_offset ). + lo_element_from->append_child( new_child = lo_element ). + + lo_element = io_document->create_simple_element( name = lc_xml_node_row + parent = io_document ). + lo_element->set_value( value = lv_row ). + lo_element_from->append_child( new_child = lo_element ). + + lo_element = io_document->create_simple_element( name = lc_xml_node_rowoff + parent = io_document ). + lo_element->set_value( value = lv_row_offset ). + lo_element_from->append_child( new_child = lo_element ). + ep_anchor->append_child( new_child = lo_element_from ). + + IF ls_position-anchor = 'ONE'. + +* ext ****************************** + lo_element_ext = io_document->create_simple_element( name = lc_xml_node_ext + parent = io_document ). + + lv_value = io_drawing->get_width_emu_str( ). + lo_element_ext->set_attribute_ns( name = 'cx' + value = lv_value ). + lv_value = io_drawing->get_height_emu_str( ). + lo_element_ext->set_attribute_ns( name = 'cy' + value = lv_value ). + ep_anchor->append_child( new_child = lo_element_ext ). + + ELSEIF ls_position-anchor = 'TWO'. + +* to cell ****************************** + lo_element_to = io_document->create_simple_element( name = lc_xml_node_to + parent = io_document ). + + lv_col = ls_position-to-col. + lv_row = ls_position-to-row. + lv_col_offset = ls_position-to-col_offset. + lv_row_offset = ls_position-to-row_offset. + CONDENSE lv_col NO-GAPS. + CONDENSE lv_row NO-GAPS. + CONDENSE lv_col_offset NO-GAPS. + CONDENSE lv_row_offset NO-GAPS. + + lo_element = io_document->create_simple_element( name = lc_xml_node_col + parent = io_document ). + lo_element->set_value( value = lv_col ). + lo_element_to->append_child( new_child = lo_element ). + + lo_element = io_document->create_simple_element( name = lc_xml_node_coloff + parent = io_document ). + lo_element->set_value( value = lv_col_offset ). + lo_element_to->append_child( new_child = lo_element ). + + lo_element = io_document->create_simple_element( name = lc_xml_node_row + parent = io_document ). + lo_element->set_value( value = lv_row ). + lo_element_to->append_child( new_child = lo_element ). + + lo_element = io_document->create_simple_element( name = lc_xml_node_rowoff + parent = io_document ). + lo_element->set_value( value = lv_row_offset ). + lo_element_to->append_child( new_child = lo_element ). + ep_anchor->append_child( new_child = lo_element_to ). + + ENDIF. + + CASE io_drawing->get_type( ). + WHEN zcl_excel_drawing=>type_image. +* pic ********************************** + lo_element_pic = io_document->create_simple_element( name = lc_xml_node_pic + parent = io_document ). +* nvPicPr + lo_element = io_document->create_simple_element( name = lc_xml_node_nvpicpr + parent = io_document ). +* cNvPr + lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvpr + parent = io_document ). + lv_value = sy-index. + CONDENSE lv_value. + lo_element2->set_attribute_ns( name = 'id' + value = lv_value ). + lo_element2->set_attribute_ns( name = 'name' + value = io_drawing->title ). + lo_element->append_child( new_child = lo_element2 ). + +* cNvPicPr + lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvpicpr + parent = io_document ). + +* picLocks + lo_element3 = io_document->create_simple_element( name = lc_xml_node_piclocks + parent = io_document ). + lo_element3->set_attribute_ns( name = 'noChangeAspect' + value = '1' ). + + lo_element2->append_child( new_child = lo_element3 ). + lo_element->append_child( new_child = lo_element2 ). + lo_element_pic->append_child( new_child = lo_element ). + +* blipFill + lv_value = ip_index. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element = io_document->create_simple_element( name = lc_xml_node_blipfill + parent = io_document ). + lo_element2 = io_document->create_simple_element( name = lc_xml_node_ablip + parent = io_document ). + lo_element2->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_ns_r ). + lo_element2->set_attribute_ns( name = 'r:embed' + value = lv_value ). + lo_element->append_child( new_child = lo_element2 ). + + lo_element2 = io_document->create_simple_element( name = lc_xml_node_astretch + parent = io_document ). + lo_element->append_child( new_child = lo_element2 ). + + lo_element_pic->append_child( new_child = lo_element ). + +* spPr + lo_element = io_document->create_simple_element( name = lc_xml_node_sppr + parent = io_document ). + + lo_element2 = io_document->create_simple_element( name = lc_xml_node_apgeom + parent = io_document ). + lo_element2->set_attribute_ns( name = 'prst' + value = 'rect' ). + lo_element3 = io_document->create_simple_element( name = lc_xml_node_aavlst + parent = io_document ). + lo_element2->append_child( new_child = lo_element3 ). + lo_element->append_child( new_child = lo_element2 ). + + lo_element_pic->append_child( new_child = lo_element ). + ep_anchor->append_child( new_child = lo_element_pic ). + WHEN zcl_excel_drawing=>type_chart. +* graphicFrame ********************************** + lo_element_graphicframe = io_document->create_simple_element( name = lc_xml_node_graphicframe + parent = io_document ). +* nvGraphicFramePr + lo_element = io_document->create_simple_element( name = lc_xml_node_nvgraphicframepr + parent = io_document ). +* cNvPr + lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvpr + parent = io_document ). + lv_value = sy-index. + CONDENSE lv_value. + lo_element2->set_attribute_ns( name = 'id' + value = lv_value ). + lo_element2->set_attribute_ns( name = 'name' + value = io_drawing->title ). + lo_element->append_child( new_child = lo_element2 ). +* cNvGraphicFramePr + lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvgraphicframepr + parent = io_document ). + lo_element3 = io_document->create_simple_element( name = lc_xml_node_graphicframelocks + parent = io_document ). + lo_element2->append_child( new_child = lo_element3 ). + lo_element->append_child( new_child = lo_element2 ). + lo_element_graphicframe->append_child( new_child = lo_element ). + +* xfrm + lo_element = io_document->create_simple_element( name = lc_xml_node_xfrm + parent = io_document ). +* off + lo_element2 = io_document->create_simple_element( name = lc_xml_node_aoff + parent = io_document ). + lo_element2->set_attribute_ns( name = 'y' value = '0' ). + lo_element2->set_attribute_ns( name = 'x' value = '0' ). + lo_element->append_child( new_child = lo_element2 ). +* ext + lo_element2 = io_document->create_simple_element( name = lc_xml_node_aext + parent = io_document ). + lo_element2->set_attribute_ns( name = 'cy' value = '0' ). + lo_element2->set_attribute_ns( name = 'cx' value = '0' ). + lo_element->append_child( new_child = lo_element2 ). + lo_element_graphicframe->append_child( new_child = lo_element ). + +* graphic + lo_element = io_document->create_simple_element( name = lc_xml_node_agraphic + parent = io_document ). +* graphicData + lo_element2 = io_document->create_simple_element( name = lc_xml_node_agraphicdata + parent = io_document ). + lo_element2->set_attribute_ns( name = 'uri' value = lc_xml_node_ns_c ). + +* chart + lo_element3 = io_document->create_simple_element( name = lc_xml_node_cchart + parent = io_document ). + + lo_element3->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_ns_r ). + lo_element3->set_attribute_ns( name = 'xmlns:c' + value = lc_xml_node_ns_c ). + + lv_value = ip_index. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + lo_element3->set_attribute_ns( name = 'r:id' + value = lv_value ). + lo_element2->append_child( new_child = lo_element3 ). + lo_element->append_child( new_child = lo_element2 ). + lo_element_graphicframe->append_child( new_child = lo_element ). + ep_anchor->append_child( new_child = lo_element_graphicframe ). + + ENDCASE. + +* client data *************************** + lo_element_clientdata = io_document->create_simple_element( name = lc_xml_node_clientdata + parent = io_document ). + ep_anchor->append_child( new_child = lo_element_clientdata ). + + endmethod. + + + + method CREATE_XL_RELATIONSHIPS. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + " Node target + lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', + lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', + lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', + lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_syindex(3) TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size + 2. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_styles_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_styles_tg ). + lo_element_root->append_child( new_child = lo_element ). + + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_size = lv_size - 1. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_theme_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_theme_tg ). + lo_element_root->append_child( new_child = lo_element ). + + lv_size = excel->get_worksheets_size( ). + + DO lv_size TIMES. + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. + lv_syindex = sy-index. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_sheet_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_xml_node_ridx_tg ). + lo_element_root->append_child( new_child = lo_element ). + ENDDO. + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 3 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_shared_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_shared_tg ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + method CREATE_XL_SHAREDSTRINGS. + + +** Constant node name + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, + <fs_sheet_string> TYPE zexcel_s_shared_string. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + DESCRIBE TABLE lt_cell_data LINES lv_count. + MOVE lv_count TO lv_count_str. + + SHIFT lv_count_str RIGHT DELETING TRAILING space. + SHIFT lv_count_str LEFT DELETING LEADING space. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. + MOVE lv_uniquecount TO lv_uniquecount_str. + + SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. + SHIFT lv_uniquecount_str LEFT DELETING LEADING space. + + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. + MOVE <fs_sheet_content>-data_type TO ls_shared_string-string_type. + APPEND ls_shared_string TO shared_strings. + ENDLOOP. + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_count + value = lv_count_str ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount + value = lv_uniquecount_str ). + +********************************************************************** +* STEP 4: Create subnode + LOOP AT shared_strings ASSIGNING <fs_sheet_string>. + lo_element = lo_document->create_simple_element( name = lc_xml_node_si + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t + parent = lo_document ). + if <fs_sheet_string>-string_type EQ 's_leading_blanks'. + lo_sub_element->set_attribute( name = 'space' namespace = 'xml' value = 'preserve' ). + endif. + lo_sub_element->set_value( value = <fs_sheet_string>-string_value ). + lo_element->append_child( new_child = lo_sub_element ). + lo_element_root->append_child( new_child = lo_element ). + ENDLOOP. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + + + + METHOD create_xl_sheet. +*--------------------------------------------------------------------* +* issue #330 - Adding ColorScale conditional formatting +* - Ivan Femia, 2014-08-25 +*--------------------------------------------------------------------* + + TYPES: BEGIN OF colors, + colorrgb TYPE zexcel_color, + END OF colors. + +*--------------------------------------------------------------------* +* issue #237 - Error writing column-style +* - Stefan Schmöcker, 2012-11-01 +*--------------------------------------------------------------------* + + TYPES: BEGIN OF cfvo, + value TYPE zexcel_conditional_value, + type TYPE zexcel_conditional_type, + END OF cfvo. + +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 1 - start +*--------------------------------------------------------------------* + TYPES: BEGIN OF lty_table_area, + left TYPE i, + right TYPE i, + top TYPE i, + bottom TYPE i, + END OF lty_table_area. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 1 - end +*--------------------------------------------------------------------* +** Constants + CONSTANTS: + lc_dummy_cell_content TYPE zexcel_s_cell_data-cell_value VALUE '})~~~ This is a dummy value for ABAP2XLSX and you should never find this in a real excelsheet Ihope'. + + +** Constant node name + DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', + lc_xml_node_sheetpr TYPE string VALUE 'sheetPr', + lc_xml_node_tabcolor TYPE string VALUE 'tabColor', + lc_xml_node_outlinepr TYPE string VALUE 'outlinePr', + lc_xml_node_dimension TYPE string VALUE 'dimension', + lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', + lc_xml_node_sheetview TYPE string VALUE 'sheetView', + lc_xml_node_selection TYPE string VALUE 'selection', + lc_xml_node_pane TYPE string VALUE 'pane', + lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', + lc_xml_node_cols TYPE string VALUE 'cols', + lc_xml_node_col TYPE string VALUE 'col', + lc_xml_node_sheetdata TYPE string VALUE 'sheetData', + lc_xml_node_row TYPE string VALUE 'row', + lc_xml_node_c TYPE string VALUE 'c', + lc_xml_node_v TYPE string VALUE 'v', + lc_xml_node_f TYPE string VALUE 'f', + lc_xml_node_sheetprotection TYPE string VALUE 'sheetProtection', + lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', + lc_xml_node_pagesetup TYPE string VALUE 'pageSetup', + lc_xml_node_pagesetuppr TYPE string VALUE 'pageSetUpPr', + lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', + lc_xml_node_cfrule TYPE string VALUE 'cfRule', + lc_xml_node_color TYPE string VALUE 'color', " Databar by Albert Lladanosa + lc_xml_node_databar TYPE string VALUE 'dataBar', " Databar by Albert Lladanosa + lc_xml_node_colorscale TYPE string VALUE 'colorScale', + lc_xml_node_iconset TYPE string VALUE 'iconSet', + lc_xml_node_cfvo TYPE string VALUE 'cfvo', + lc_xml_node_formula TYPE string VALUE 'formula', + lc_xml_node_datavalidations TYPE string VALUE 'dataValidations', + lc_xml_node_datavalidation TYPE string VALUE 'dataValidation', + lc_xml_node_formula1 TYPE string VALUE 'formula1', + lc_xml_node_formula2 TYPE string VALUE 'formula2', + lc_xml_node_mergecell TYPE string VALUE 'mergeCell', + lc_xml_node_mergecells TYPE string VALUE 'mergeCells', + lc_xml_node_drawing TYPE string VALUE 'drawing', + lc_xml_node_headerfooter TYPE string VALUE 'headerFooter', + lc_xml_node_oddheader TYPE string VALUE 'oddHeader', + lc_xml_node_oddfooter TYPE string VALUE 'oddFooter', + lc_xml_node_evenheader TYPE string VALUE 'evenHeader', + lc_xml_node_evenfooter TYPE string VALUE 'evenFooter', + lc_xml_node_autofilter TYPE string VALUE 'autoFilter', + lc_xml_node_filtercolumn TYPE string VALUE 'filterColumn', + lc_xml_node_filters TYPE string VALUE 'filters', + lc_xml_node_filter TYPE string VALUE 'filter', + " Node attributes + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_summarybelow TYPE string VALUE 'summaryBelow', + lc_xml_attr_summaryright TYPE string VALUE 'summaryRight', + lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', + lc_xml_attr_showzeros TYPE string VALUE 'showZeros', + lc_xml_attr_zoomscale TYPE string VALUE 'zoomScale', + lc_xml_attr_zoomscalenormal TYPE string VALUE 'zoomScaleNormal', + lc_xml_attr_zoomscalepageview TYPE string VALUE 'zoomScalePageLayoutView', + lc_xml_attr_zoomscalesheetview TYPE string VALUE 'zoomScaleSheetLayoutView', + lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', + lc_xml_attr_showgridlines TYPE string VALUE 'showGridLines', + lc_xml_attr_gridlines TYPE string VALUE 'gridLines', + lc_xml_attr_showrowcolheaders TYPE string VALUE 'showRowColHeaders', + lc_xml_attr_activecell TYPE string VALUE 'activeCell', + lc_xml_attr_sqref TYPE string VALUE 'sqref', + lc_xml_attr_min TYPE string VALUE 'min', + lc_xml_attr_max TYPE string VALUE 'max', + lc_xml_attr_hidden TYPE string VALUE 'hidden', + lc_xml_attr_width TYPE string VALUE 'width', + lc_xml_attr_defaultwidth TYPE string VALUE '9.10', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_true TYPE string VALUE 'true', + lc_xml_attr_bestfit TYPE string VALUE 'bestFit', + lc_xml_attr_customheight TYPE string VALUE 'customHeight', + lc_xml_attr_customwidth TYPE string VALUE 'customWidth', + lc_xml_attr_collapsed TYPE string VALUE 'collapsed', + lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', + lc_xml_attr_defaultcolwidth TYPE string VALUE 'defaultColWidth', + lc_xml_attr_outlinelevelrow TYPE string VALUE 'x14ac:outlineLevelRow', + lc_xml_attr_outlinelevelcol TYPE string VALUE 'x14ac:outlineLevelCol', + lc_xml_attr_outlinelevel TYPE string VALUE 'outlineLevel', + lc_xml_attr_r TYPE string VALUE 'r', + lc_xml_attr_s TYPE string VALUE 's', + lc_xml_attr_spans TYPE string VALUE 'spans', + lc_xml_attr_t TYPE string VALUE 't', + lc_xml_attr_password TYPE string VALUE 'password', + lc_xml_attr_sheet TYPE string VALUE 'sheet', + lc_xml_attr_objects TYPE string VALUE 'objects', + lc_xml_attr_scenarios TYPE string VALUE 'scenarios', + lc_xml_attr_autofilter TYPE string VALUE 'autoFilter', + lc_xml_attr_deletecolumns TYPE string VALUE 'deleteColumns', + lc_xml_attr_deleterows TYPE string VALUE 'deleteRows', + lc_xml_attr_formatcells TYPE string VALUE 'formatCells', + lc_xml_attr_formatcolumns TYPE string VALUE 'formatColumns', + lc_xml_attr_formatrows TYPE string VALUE 'formatRows', + lc_xml_attr_insertcolumns TYPE string VALUE 'insertColumns', + lc_xml_attr_inserthyperlinks TYPE string VALUE 'insertHyperlinks', + lc_xml_attr_insertrows TYPE string VALUE 'insertRows', + lc_xml_attr_pivottables TYPE string VALUE 'pivotTables', + lc_xml_attr_selectlockedcells TYPE string VALUE 'selectLockedCells', + lc_xml_attr_selectunlockedcell TYPE string VALUE 'selectUnlockedCells', + lc_xml_attr_sort TYPE string VALUE 'sort', + lc_xml_attr_left TYPE string VALUE 'left', + lc_xml_attr_right TYPE string VALUE 'right', + lc_xml_attr_top TYPE string VALUE 'top', + lc_xml_attr_bottom TYPE string VALUE 'bottom', + lc_xml_attr_header TYPE string VALUE 'header', + lc_xml_attr_footer TYPE string VALUE 'footer', + lc_xml_attr_type TYPE string VALUE 'type', + lc_xml_attr_iconset TYPE string VALUE 'iconSet', + lc_xml_attr_showvalue TYPE string VALUE 'showValue', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_dxfid TYPE string VALUE 'dxfId', + lc_xml_attr_priority TYPE string VALUE 'priority', + lc_xml_attr_operator TYPE string VALUE 'operator', + lc_xml_attr_allowblank TYPE string VALUE 'allowBlank', + lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage', + lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage', + lc_xml_attr_errortitle TYPE string VALUE 'errorTitle', + lc_xml_attr_error TYPE string VALUE 'error', + lc_xml_attr_prompttitle TYPE string VALUE 'promptTitle', + lc_xml_attr_prompt TYPE string VALUE 'prompt', + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_blackandwhite TYPE string VALUE 'blackAndWhite', + lc_xml_attr_cellcomments TYPE string VALUE 'cellComments', + lc_xml_attr_copies TYPE string VALUE 'copies', + lc_xml_attr_draft TYPE string VALUE 'draft', + lc_xml_attr_errors TYPE string VALUE 'errors', + lc_xml_attr_firstpagenumber TYPE string VALUE 'firstPageNumber', + lc_xml_attr_fittopage TYPE string VALUE 'fitToPage', + lc_xml_attr_fittoheight TYPE string VALUE 'fitToHeight', + lc_xml_attr_fittowidth TYPE string VALUE 'fitToWidth', + lc_xml_attr_horizontaldpi TYPE string VALUE 'horizontalDpi', + lc_xml_attr_orientation TYPE string VALUE 'orientation', + lc_xml_attr_pageorder TYPE string VALUE 'pageOrder', + lc_xml_attr_paperheight TYPE string VALUE 'paperHeight', + lc_xml_attr_papersize TYPE string VALUE 'paperSize', + lc_xml_attr_paperwidth TYPE string VALUE 'paperWidth', + lc_xml_attr_scale TYPE string VALUE 'scale', + lc_xml_attr_usefirstpagenumber TYPE string VALUE 'useFirstPageNumber', + lc_xml_attr_useprinterdefaults TYPE string VALUE 'usePrinterDefaults', + lc_xml_attr_verticaldpi TYPE string VALUE 'verticalDpi', + lc_xml_attr_differentoddeven TYPE string VALUE 'differentOddEven', + lc_xml_attr_colid TYPE string VALUE 'colId', + lc_xml_attr_filtermode TYPE string VALUE 'filterMode', + lc_xml_attr_tabcolor_rgb TYPE string VALUE 'rgb', + lc_xml_attr_tabcolor_theme TYPE string VALUE 'theme', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006', + lc_xml_node_comp_pref TYPE string VALUE 'x14ac', + lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_2 TYPE REF TO if_ixml_element, + lo_element_3 TYPE REF TO if_ixml_element, + lo_element_4 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_table TYPE REF TO zcl_excel_table, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, + lo_row_dim_empty TYPE REF TO zcl_excel_worksheet_rowdimensi, + default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, + default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + DATA: lv_value TYPE string, + lt_range_merge TYPE string_table, + lv_merge TYPE string, + lv_column_p TYPE zexcel_cell_column_alpha, + lv_column TYPE zexcel_cell_column, + lv_cell_value TYPE zexcel_cell_value, + lv_style_guid TYPE zexcel_cell_style, + lv_flag TYPE c, + ls_databar TYPE zexcel_conditional_databar, " Databar by Albert Lladanosa + ls_colorscale TYPE zexcel_conditional_colorscale, + ls_iconset TYPE zexcel_conditional_iconset, + ls_cellis TYPE zexcel_conditional_cellis, + ls_expression TYPE zexcel_conditional_expression, + lt_cfvo TYPE TABLE OF cfvo, + ls_cfvo TYPE cfvo, + lt_colors TYPE TABLE OF colors, + ls_colors TYPE colors, + lv_cell_row_s TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping, + lv_freeze_cell_row TYPE zexcel_cell_row, + lv_freeze_cell_column TYPE zexcel_cell_column, + lv_freeze_cell_column_alpha TYPE zexcel_cell_column_alpha, + column_dimensions TYPE zexcel_t_worksheet_columndime, + row_dimensions TYPE zexcel_t_worksheet_rowdimensio, + ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping, + lv_relation_id TYPE i VALUE 0, + outline_level_row TYPE i VALUE 0, + outline_level_col TYPE i VALUE 0, + lv_current_row TYPE i, + lv_next_row TYPE i, + ls_sheet_content LIKE LINE OF io_worksheet->sheet_content, + ls_sheet_content_empty LIKE LINE OF io_worksheet->sheet_content, + lv_last_row TYPE i, + lts_row_dimensions TYPE zexcel_t_worksheet_rowdimensio, + lts_row_outlines TYPE zcl_excel_worksheet=>mty_ts_outlines_row, + col_count TYPE int4, + merge_count TYPE int4, + write_current_row TYPE boolean, + lt_values TYPE zexcel_t_autofilter_values, + ls_values TYPE zexcel_s_autofilter_values, + lv_guid TYPE uuid, + lo_autofilters TYPE REF TO zcl_excel_autofilters, + lo_autofilter TYPE REF TO zcl_excel_autofilter, + l_autofilter_hidden TYPE flag, + ls_area TYPE zexcel_s_autofilter_area, + lv_ref TYPE string, + lv_style_index TYPE i. " issue #237 + + + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data, + <fs_range_merge> LIKE LINE OF lt_range_merge, + <column_dimension> TYPE zexcel_s_worksheet_columndime, + <row_dimension> TYPE zexcel_s_worksheet_rowdimensio, + <ls_row_outline> LIKE LINE OF lts_row_outlines. + +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 2 - start +*--------------------------------------------------------------------* + DATA: lt_table_areas TYPE SORTED TABLE OF lty_table_area WITH NON-UNIQUE KEY left right top bottom, + ls_table_area LIKE LINE OF lt_table_areas. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 2 - end +*--------------------------------------------------------------------* + + + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:mc' + value = lc_xml_node_comp_ns ). + lo_element_root->set_attribute_ns( name = 'mc:Ignorable' + value = lc_xml_node_comp_pref ). + lo_element_root->set_attribute_ns( name = 'xmlns:x14ac' + value = lc_xml_node_ig_ns ). + + +********************************************************************** +* STEP 4: Create subnodes + " sheetPr + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetpr + parent = lo_document ). + " TODO tabColor + IF io_worksheet->tabcolor IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_tabcolor + parent = lo_element ). +* Theme not supported yet - start with RGB + lv_value = io_worksheet->tabcolor-rgb. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabcolor_rgb + value = lv_value ). + ENDIF. + + " outlinePr + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_outlinepr + parent = lo_document ). + + lv_value = io_worksheet->zif_excel_sheet_properties~summarybelow. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow + value = lv_value ). + + lv_value = io_worksheet->zif_excel_sheet_properties~summaryright. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright + value = lv_value ). + + lo_element->append_child( new_child = lo_element_2 ). + + IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_pagesetuppr + parent = lo_document ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_fittopage + value = `1` ). + lo_element->append_child( new_child = lo_element_2 ). " pageSetupPr node + ENDIF. + + lo_element_root->append_child( new_child = lo_element ). + + " dimension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension + parent = lo_document ). + lv_value = io_worksheet->get_dimension_range( ). + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " sheetViews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews + parent = lo_document ). + " sheetView node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview + parent = lo_document ). + IF io_worksheet->zif_excel_sheet_properties~show_zeros EQ abap_false. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showzeros + value = '0' ). + ENDIF. + IF iv_active = abap_true + OR io_worksheet->zif_excel_sheet_properties~selected EQ abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '1' ). + ELSE. + lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected + value = '0' ). + ENDIF. + " Zoom scale + IF io_worksheet->zif_excel_sheet_properties~zoomscale GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale + value = lv_value ). + IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_normal LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_normal. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalenormal + value = lv_value ). + ENDIF. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalepageview + value = lv_value ). + ENDIF. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 10. + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalesheetview + value = lv_value ). + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid + value = '0' ). + " showGridLines attribute + IF io_worksheet->show_gridlines = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines + value = '1' ). + ELSE. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines + value = '0' ). + ENDIF. + + " showRowColHeaders attribute + IF io_worksheet->show_rowcolheaders = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders + value = '1' ). + ELSE. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders + value = '0' ). + ENDIF. + + + " freeze panes + io_worksheet->get_freeze_cell( IMPORTING ep_row = lv_freeze_cell_row + ep_column = lv_freeze_cell_column ). + + IF lv_freeze_cell_row IS NOT INITIAL AND lv_freeze_cell_column IS NOT INITIAL. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_pane + parent = lo_element_2 ). + + IF lv_freeze_cell_row > 1. + lv_value = lv_freeze_cell_row - 1. + CONDENSE lv_value. + lo_element_3->set_attribute_ns( name = 'ySplit' + value = lv_value ). + ENDIF. + + IF lv_freeze_cell_column > 1. + lv_value = lv_freeze_cell_column - 1. + CONDENSE lv_value. + lo_element_3->set_attribute_ns( name = 'xSplit' + value = lv_value ). + ENDIF. + + lv_freeze_cell_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_freeze_cell_column ). + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_freeze_cell_row ). + CONCATENATE lv_freeze_cell_column_alpha lv_value INTO lv_value. + lo_element_3->set_attribute_ns( name = 'topLeftCell' + value = lv_value ). + + lo_element_3->set_attribute_ns( name = 'activePane' + value = 'bottomRight' ). + + lo_element_3->set_attribute_ns( name = 'state' + value = 'frozen' ). + + lo_element_2->append_child( new_child = lo_element_3 ). + ENDIF. + " selection node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection + parent = lo_document ). + lv_value = io_worksheet->get_active_cell( ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell + value = lv_value ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + lo_element_2->append_child( new_child = lo_element_3 ). " sheetView node + + lo_element->append_child( new_child = lo_element_2 ). " sheetView node + + lo_element_root->append_child( new_child = lo_element ). " sheetViews node + + + column_dimensions[] = io_worksheet->get_column_dimensions( ). + " Calculate col + IF NOT column_dimensions IS INITIAL. + io_worksheet->calculate_column_widths( ). + column_dimensions[] = io_worksheet->get_column_dimensions( ). + ENDIF. + row_dimensions[] = io_worksheet->get_row_dimensions( ). + " sheetFormatPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr + parent = lo_document ). + " defaultRowHeight + default_row_dimension = io_worksheet->get_default_row_dimension( ). + IF default_row_dimension IS BOUND. + IF default_row_dimension->get_row_height( ) >= 0. + lo_element->set_attribute_ns( name = lc_xml_attr_customheight + value = lc_xml_attr_true ). + lv_value = default_row_dimension->get_row_height( ). + ELSE. + lv_value = '12.75'. + ENDIF. + ELSE. + lv_value = '12.75'. + ENDIF. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight + value = lv_value ). + " defaultColWidth + default_col_dimension = io_worksheet->get_default_column_dimension( ). + IF default_col_dimension IS BOUND. + IF default_col_dimension->get_width( ) >= 0. + lv_value = default_col_dimension->get_width( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_defaultcolwidth + value = lv_value ). + ENDIF. + ENDIF. + " outlineLevelRow +* Excel is recalculating the outlinelevel on startup from the outline levels found in the rows +* If we place anything incorrect here it gets corrected, if don't place anything it gets added +* So no need to calculate the outlinelevel here ( at least for rows - probably for columns as well but I haven't tested yet +* LOOP AT row_dimensions ASSIGNING <row_dimension>. +* IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row. +* outline_level_row = <row_dimension>-row_dimension->get_outline_level( ). +* ENDIF. +* ENDLOOP. +* lv_value = outline_level_row. +* SHIFT lv_value RIGHT DELETING TRAILING space. +* SHIFT lv_value LEFT DELETING LEADING space. +* lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelrow +* value = lv_value ). + " outlineLevelCol + LOOP AT column_dimensions ASSIGNING <column_dimension>. + IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col. + outline_level_col = <column_dimension>-column_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + lv_value = outline_level_col. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelcol + value = lv_value ). +* lv_value = 0. +* SHIFT lv_value RIGHT DELETING TRAILING space. +* SHIFT lv_value LEFT DELETING LEADING space. +* lo_element->set_attribute_ns( name = lc_xml_attr_dydescent +* value = lv_value ). + + lo_element_root->append_child( new_child = lo_element ). " sheetFormatPr node + + IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL OR NOT column_dimensions IS INITIAL. + " cols node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cols + parent = lo_document ). + " This code have to be enhanced in order to manage also column style properties + " Now it is an out/out + IF NOT column_dimensions IS INITIAL. + LOOP AT column_dimensions ASSIGNING <column_dimension>. + " col node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = <column_dimension>-column_dimension->get_column_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_min + value = lv_value ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_max + value = lv_value ). + " Width + IF <column_dimension>-column_dimension->get_width( ) < 0. + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lc_xml_attr_defaultwidth ). + ELSE. + lv_value = <column_dimension>-column_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lv_value ). + ENDIF. + " Column visibility + IF <column_dimension>-column_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = lc_xml_attr_true ). + ENDIF. + " Auto size? + IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit + value = lc_xml_attr_true ). + ENDIF. + " Custom width? + IF default_col_dimension IS BOUND. + IF <column_dimension>-column_dimension->get_width( ) + <> default_col_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + + ENDIF. + ELSE. + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + ENDIF. + " Collapsed + IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed + value = lc_xml_attr_true ). + ENDIF. + " outlineLevel + IF <column_dimension>-column_dimension->get_outline_level( ) > 0. + lv_value = <column_dimension>-column_dimension->get_outline_level( ). + + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel + value = lv_value ). + ENDIF. + " Style +* lv_value = <column_dimension>-column_dimension->get_xf_index( ). "del issue #157 - set column style + lv_style_guid = <column_dimension>-column_dimension->get_column_style_guid( ). "ins issue #157 - set column style +* lv_value = me->excel->get_style_index_in_styles( lv_style_guid ). "del issue #237 + CLEAR ls_style_mapping. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid. +* lv_style_index = ls_style_mapping-style. "del issue #295 +* IF lv_style_index > 0. "ins issue #237 - del issue #295 +* lv_value = lv_style_index - 1. "ins issue #237 - del issue #295 + IF sy-subrc = 0. "ins issue #295 + lv_value = ls_style_mapping-style. "ins issue #295 + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. "ins issue #237 + + lo_element->append_child( new_child = lo_element_2 ). " col node + ENDLOOP. +* ELSE. "del issue #157 - set sheet style ( add missing columns +* IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL. "del issue #157 - set sheet style ( add missing columns +* Begin of insertion issue #157 - set sheet style ( add missing columns + ENDIF. +* Always pass through this coding + IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL. + DATA: lts_sorted_columns TYPE SORTED TABLE OF zexcel_cell_column WITH UNIQUE KEY table_line. + TYPES: BEGIN OF ty_missing_columns, + first_column TYPE zexcel_cell_column, + last_column TYPE zexcel_cell_column, + END OF ty_missing_columns. + DATA: t_missing_columns TYPE STANDARD TABLE OF ty_missing_columns WITH NON-UNIQUE DEFAULT KEY, + missing_column LIKE LINE OF t_missing_columns. + +* First collect columns that were already handled before. The rest has to be inserted now + LOOP AT column_dimensions ASSIGNING <column_dimension>. + lv_column = zcl_excel_common=>convert_column2int( <column_dimension>-column ). + INSERT lv_column INTO TABLE lts_sorted_columns. + ENDLOOP. + +* Now find all columns that were missing so far + missing_column-first_column = 1. + LOOP AT lts_sorted_columns INTO lv_column. + IF lv_column > missing_column-first_column. + missing_column-last_column = lv_column - 1. + APPEND missing_column TO t_missing_columns. + ENDIF. + missing_column-first_column = lv_column + 1. + ENDLOOP. + missing_column-last_column = zcl_excel_common=>c_excel_sheet_max_col. + APPEND missing_column TO t_missing_columns. +* Now apply stylesetting ( and other defaults - I copy it from above. Whoever programmed that seems to know what to do :o) + LOOP AT t_missing_columns INTO missing_column. +* End of insertion issue #157 - set column style + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). +* lv_value = zcl_excel_common=>c_excel_sheet_min_col."del issue #157 - set sheet style ( add missing columns + lv_value = missing_column-first_column. "ins issue #157 - set sheet style ( add missing columns + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_min + value = lv_value ). +* lv_value = zcl_excel_common=>c_excel_sheet_max_col."del issue #157 - set sheet style ( add missing columns + lv_value = missing_column-last_column. "ins issue #157 - set sheet style ( add missing columns + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_max + value = lv_value ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lc_xml_attr_defaultwidth ). + lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid. + lv_value = ls_style_mapping-style. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). " col node + ENDLOOP. "ins issue #157 - set sheet style ( add missing columns + + ENDIF. + lo_element_root->append_child( new_child = lo_element ). " cols node + ENDIF. + " sheetData node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata + parent = lo_document ). + " Get column count + col_count = io_worksheet->get_highest_column( ). + " Get autofilter + lv_guid = io_worksheet->get_guid( ) . + lo_autofilters = excel->get_autofilters_reference( ). + lo_autofilter = lo_autofilters->get( i_sheet_guid = lv_guid ) . + IF lo_autofilter IS BOUND. + lt_values = lo_autofilter->get_values( ) . + ls_area = lo_autofilter->get_filter_area( ) . + l_autofilter_hidden = abap_true. " First defautl is not showing + ENDIF. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - start +*--------------------------------------------------------------------* +* Build table to hold all table-areas attached to this sheet + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). + ls_table_area-left = zcl_excel_common=>convert_column2int( lo_table->settings-top_left_column ). + ls_table_area-right = lo_table->get_right_column_integer( ). + ls_table_area-top = lo_table->settings-top_left_row. + ls_table_area-bottom = lo_table->get_bottom_row_integer( ). + INSERT ls_table_area INTO TABLE lt_table_areas. + ENDWHILE. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - end +*--------------------------------------------------------------------* +* We have problems when the first rows or trailing rows are not set but we have rowinformation +* to solve this we add dummycontent into first and last line that will not be set +* Set first line if necessary + READ TABLE io_worksheet->sheet_content TRANSPORTING NO FIELDS WITH KEY cell_row = 1. + IF sy-subrc <> 0. + ls_sheet_content_empty-cell_row = 1. + ls_sheet_content_empty-cell_column = 1. + ls_sheet_content_empty-cell_value = lc_dummy_cell_content. + INSERT ls_sheet_content_empty INTO TABLE io_worksheet->sheet_content. + ENDIF. +* Set last line if necessary +* Last row with cell content + lv_last_row = io_worksheet->get_highest_row( ). +* Last line with row-information set directly ( like line height, hidden-status ... ) + lts_row_dimensions = io_worksheet->get_row_dimensions( ). + SORT lts_row_dimensions BY row DESCENDING. + READ TABLE lts_row_dimensions INDEX 1 ASSIGNING <row_dimension>. + IF sy-subrc = 0 AND <row_dimension>-row > lv_last_row. + lv_last_row = <row_dimension>-row. + ENDIF. +* Last line with row-information set indirectly by row outline + lts_row_outlines = io_worksheet->get_row_outlines( ). + LOOP AT lts_row_outlines ASSIGNING <ls_row_outline>. + IF <ls_row_outline>-collapsed = 'X'. + lv_current_row = <ls_row_outline>-row_to + 1. " collapsed-status may be set on following row + ELSE. + lv_current_row = <ls_row_outline>-row_to. " collapsed-status may be set on following row + ENDIF. + IF lv_current_row > lv_last_row. + lv_last_row = lv_current_row. + ENDIF. + ENDLOOP. + READ TABLE io_worksheet->sheet_content TRANSPORTING NO FIELDS WITH KEY cell_row = lv_last_row. + IF sy-subrc <> 0. + ls_sheet_content_empty-cell_row = lv_last_row. + ls_sheet_content_empty-cell_column = 1. + ls_sheet_content_empty-cell_value = lc_dummy_cell_content. + INSERT ls_sheet_content_empty INTO TABLE io_worksheet->sheet_content. + ENDIF. + + + CLEAR ls_sheet_content. + LOOP AT io_worksheet->sheet_content INTO ls_sheet_content. + READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. + IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. + CLEAR l_autofilter_hidden. + ENDIF. + CLEAR ls_style_mapping. +* Create row element +* issues #346,#154, #195 - problems when we have information in row_dimension but no cell content in that row +* Get next line that may have to be added. If we have empty lines this is the next line after previous cell content +* Otherwise it is the line of the current cell content + lv_current_row = ls_last_row-cell_row + 1. + IF lv_current_row > ls_sheet_content-cell_row. + lv_current_row = ls_sheet_content-cell_row. + ENDIF. +* Fill in empty lines if necessary - assign an emtpy sheet content + lv_next_row = lv_current_row. + WHILE lv_next_row <= ls_sheet_content-cell_row. + lv_current_row = lv_next_row. + lv_next_row = lv_current_row + 1. + IF lv_current_row = ls_sheet_content-cell_row. " cell value found in this row + ASSIGN ls_sheet_content TO <ls_sheet_content>. + ELSE. +* Check if empty row is really necessary - this is basically the case when we have information in row_dimension + lo_row_dim_empty = io_worksheet->get_row_dimension( lv_current_row ). + CHECK lo_row_dim_empty->get_row_height( ) >= 0 OR + lo_row_dim_empty->get_collapsed( io_worksheet ) = abap_true OR + lo_row_dim_empty->get_outline_level( io_worksheet ) > 0 OR + lo_row_dim_empty->get_xf_index( ) <> 0. + " Dummyentry A1 + ls_sheet_content_empty-cell_row = lv_current_row. + ls_sheet_content_empty-cell_column = 1. + ASSIGN ls_sheet_content_empty TO <ls_sheet_content>. + ENDIF. + + IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. + IF lo_autofilter IS BOUND. + IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header + ls_area-row_end < ls_last_row-cell_row . + CLEAR l_autofilter_hidden. + ENDIF. + ELSE. + CLEAR l_autofilter_hidden. + ENDIF. + IF ls_last_row-cell_row IS NOT INITIAL. + " Row visibility of previos row. + IF row_dimension->get_visible( io_worksheet ) = abap_false OR + l_autofilter_hidden = abap_true. + lo_element_2->set_attribute_ns( name = 'hidden' value = 'true'). + ENDIF. + lo_element->append_child( new_child = lo_element_2 ). " row node + ENDIF. + " Add new row + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + " r + lv_value = <ls_sheet_content>-cell_row. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + + lo_element_2->set_attribute_ns( name = lc_xml_attr_r + value = lv_value ). + " Spans + lv_value = col_count. + CONCATENATE '1:' lv_value INTO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_spans + value = lv_value ). + row_dimension = io_worksheet->get_row_dimension( <ls_sheet_content>-cell_row ). + " Do we need the row dimension attributes? + IF row_dimension->get_row_height( ) >= 0 OR + row_dimension->get_collapsed( io_worksheet ) = abap_true OR + row_dimension->get_outline_level( io_worksheet ) > 0 OR + row_dimension->get_xf_index( ) <> 0 OR + l_autofilter_hidden = abap_true. + " Row dimensions + IF row_dimension->get_row_height( ) >= 0. + lo_element_2->set_attribute_ns( name = 'customHeight' value = '1'). + lv_value = row_dimension->get_row_height( ). + lo_element_2->set_attribute_ns( name = 'ht' value = lv_value ). + ENDIF. + " Collapsed + IF row_dimension->get_collapsed( io_worksheet ) = abap_true. + lo_element_2->set_attribute_ns( name = 'collapsed' value = 'true'). + ENDIF. + " Outline level + IF row_dimension->get_outline_level( io_worksheet ) > 0. + lv_value = row_dimension->get_outline_level( io_worksheet ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = 'outlineLevel' value = lv_value ). + ENDIF. + " Style + IF row_dimension->get_xf_index( ) <> 0. + lv_value = row_dimension->get_xf_index( ). + lo_element_2->set_attribute_ns( name = 's' value = lv_value ). + lo_element_2->set_attribute_ns( name = 'customFormat' value = '1'). + ENDIF. + ENDIF. + l_autofilter_hidden = abap_true. " First default is not showing + ENDIF. + ENDWHILE. + + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c + parent = lo_document ). + + lo_element_3->set_attribute_ns( name = lc_xml_attr_r + value = <ls_sheet_content>-cell_coords ). + +* begin of change issue #157 - allow column cellstyle +* if no cellstyle is set, look into column, then into sheet + IF <ls_sheet_content>-cell_style IS NOT INITIAL. + lv_style_guid = <ls_sheet_content>-cell_style. + ELSE. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 2 - start +*--------------------------------------------------------------------* +* Check if cell in any of the table areas + LOOP AT lt_table_areas TRANSPORTING NO FIELDS WHERE top <= <ls_sheet_content>-cell_row + AND bottom >= <ls_sheet_content>-cell_row + AND left <= <ls_sheet_content>-cell_column + AND right >= <ls_sheet_content>-cell_column. + EXIT. + ENDLOOP. + IF sy-subrc = 0. + CLEAR lv_style_guid. " No style --> EXCEL will use built-in-styles as declared in the tables-section + ELSE. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 2 - end +*--------------------------------------------------------------------* + lv_column_p = zcl_excel_common=>convert_column2alpha( <ls_sheet_content>-cell_column ). + READ TABLE column_dimensions WITH KEY column = lv_column_p ASSIGNING <column_dimension>. + IF sy-subrc = 0. + lv_style_guid = <column_dimension>-column_dimension->get_column_style_guid( ). + IF lv_style_guid IS INITIAL. + lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). + ENDIF. + ELSE. + lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). + ENDIF. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 3 - start +*--------------------------------------------------------------------* + ENDIF. +*--------------------------------------------------------------------* +* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 3 - end +*--------------------------------------------------------------------* + ENDIF. +* IF <ls_sheet_content>-cell_style IS NOT INITIAL. +* READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. + IF lv_style_guid IS NOT INITIAL. + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid. +* end of change issue #157 - allow column cellstyles + lv_value = ls_style_mapping-style. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_3->set_attribute_ns( name = lc_xml_attr_s + value = lv_value ). + ENDIF. + + " For cells with formula ignore the value - Excel will calculate it + IF <ls_sheet_content>-cell_formula IS NOT INITIAL. + " fomula node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f + parent = lo_document ). + lv_value = <ls_sheet_content>-cell_formula. + CONDENSE lv_value. + lo_element_4->set_value( value = lv_value ). + lo_element_3->append_child( new_child = lo_element_4 ). " fomula node + ELSEIF <ls_sheet_content>-cell_value IS NOT INITIAL "cell can have just style or formula + AND <ls_sheet_content>-cell_value <> lc_dummy_cell_content. + IF <ls_sheet_content>-data_type IS NOT INITIAL. + IF <ls_sheet_content>-data_type EQ 's_leading_blanks'. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = 's' ). + ELSE. + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = <ls_sheet_content>-data_type ). + ENDIF. + ENDIF. + + " value node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v + parent = lo_document ). + + IF <ls_sheet_content>-data_type EQ 's' OR <ls_sheet_content>-data_type EQ 's_leading_blanks'. + lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). + CONDENSE lv_value. + lo_element_4->set_value( value = lv_value ). + ELSE. + lv_value = <ls_sheet_content>-cell_value. + CONDENSE lv_value. + lo_element_4->set_value( value = lv_value ). + ENDIF. + + lo_element_3->append_child( new_child = lo_element_4 ). " value node + ENDIF. + + lo_element_2->append_child( new_child = lo_element_3 ). " column node + ls_last_row = <ls_sheet_content>. + ENDLOOP. + IF sy-subrc = 0. + READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. + IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. + CLEAR l_autofilter_hidden. + ENDIF. + IF lo_autofilter IS BOUND. + IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header + ls_area-row_end < ls_last_row-cell_row . + CLEAR l_autofilter_hidden. + ENDIF. + ELSE. + CLEAR l_autofilter_hidden. + ENDIF. + " Row visibility of previos row. + IF row_dimension->get_visible( ) = abap_false OR + l_autofilter_hidden = abap_true. + lo_element_2->set_attribute_ns( name = 'hidden' value = 'true'). + ENDIF. + lo_element->append_child( new_child = lo_element_2 ). " row node + ENDIF. + DELETE io_worksheet->sheet_content WHERE cell_value = lc_dummy_cell_content. " Get rid of dummyentries + + lo_element_root->append_child( new_child = lo_element ). " sheetData node + + IF lo_autofilter IS BOUND. +* Create node autofilter + lo_element = lo_document->create_simple_element( name = lc_xml_node_autofilter + parent = lo_document ). + lv_ref = lo_autofilter->get_filter_range( ) . + CONDENSE lv_ref NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_ref + value = lv_ref ). + lt_values = lo_autofilter->get_values( ) . + IF lt_values IS NOT INITIAL. +* If we filter we need to set the filter mode to 1. + lo_element_2 = lo_document->find_from_name( name = lc_xml_node_sheetpr ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_filtermode + value = '1' ). +* Create node filtercolumn + CLEAR lv_column. + LOOP AT lt_values INTO ls_values. + IF ls_values-column <> lv_column. + IF lv_column IS NOT INITIAL. + lo_element_2->append_child( new_child = lo_element_3 ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_filtercolumn + parent = lo_element ). + lv_column = ls_values-column - lo_autofilter->filter_area-col_start. + lv_value = lv_column. + CONDENSE lv_value NO-GAPS. + lo_element_2->set_attribute_ns( name = lc_xml_attr_colid + value = lv_value ). + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_filters + parent = lo_element_2 ). + lv_column = ls_values-column. + ENDIF. + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_filter + parent = lo_element_3 ). + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = ls_values-value ). + lo_element_3->append_child( new_child = lo_element_4 ). " value node + ENDLOOP. + lo_element_2->append_child( new_child = lo_element_3 ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + IF io_worksheet->zif_excel_sheet_protection~protected EQ abap_true. + " sheetProtection node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetprotection + parent = lo_document ). + MOVE io_worksheet->zif_excel_sheet_protection~password TO lv_value. + IF lv_value IS NOT INITIAL. + lo_element->set_attribute_ns( name = lc_xml_attr_password + value = lv_value ). + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_protection~auto_filter. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_autofilter + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~delete_columns. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_deletecolumns + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~delete_rows. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_deleterows + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~format_cells. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_formatcells + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~format_columns. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_formatcolumns + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~format_rows. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_formatrows + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~insert_columns. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_insertcolumns + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~insert_hyperlinks. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_inserthyperlinks + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~insert_rows. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_insertrows + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~objects. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_objects + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~pivot_tables. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_pivottables + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~scenarios. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_scenarios + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~select_locked_cells. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_selectlockedcells + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~select_unlocked_cells. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_selectunlockedcell + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~sheet. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_sheet + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~sort. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_sort + value = lv_value ). + + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + " Merged cells + lt_range_merge = io_worksheet->get_merge( ). + IF lt_range_merge IS NOT INITIAL. + lo_element = lo_document->create_simple_element( name = lc_xml_node_mergecells + parent = lo_document ). + DESCRIBE TABLE lt_range_merge LINES merge_count. + lv_value = merge_count. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + LOOP AT lt_range_merge ASSIGNING <fs_range_merge>. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_mergecell + parent = lo_document ). + + lo_element_2->set_attribute_ns( name = lc_xml_attr_ref + value = <fs_range_merge> ). + lo_element->append_child( new_child = lo_element_2 ). + lo_element_root->append_child( new_child = lo_element ). + io_worksheet->delete_merge( ). + ENDLOOP. + ENDIF. + + " Conditional formatting node + lo_iterator = io_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_style_conditional->rule IS INITIAL. + CONTINUE. + ENDIF. + lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting + parent = lo_document ). + lv_value = lo_style_conditional->get_dimension_range( ) . + lo_element->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + + " cfRule node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule + parent = lo_document ). + lv_value = lo_style_conditional->rule. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = lo_style_conditional->priority. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_priority + value = lv_value ). + + CASE lo_style_conditional->rule. + " Start >> Databar by Albert Lladanosa + WHEN zcl_excel_style_conditional=>c_rule_databar. + + ls_databar = lo_style_conditional->mode_databar. + + CLEAR lt_cfvo. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_databar + parent = lo_document ). + + MOVE ls_databar-cfvo1_value TO ls_cfvo-value. + MOVE ls_databar-cfvo1_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + + MOVE ls_databar-cfvo2_value TO ls_cfvo-value. + MOVE ls_databar-cfvo2_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + + LOOP AT lt_cfvo INTO ls_cfvo. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lv_value = ls_cfvo-type. + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = ls_cfvo-value. + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_3->append_child( new_child = lo_element_4 ). " cfvo node + ENDLOOP. + + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_databar-colorrgb. + lo_element_4->set_attribute_ns( name = lc_xml_attr_tabcolor_rgb + value = lv_value ). + + lo_element_3->append_child( new_child = lo_element_4 ). " color node + + lo_element_2->append_child( new_child = lo_element_3 ). " databar node + " End << Databar by Albert Lladanosa + WHEN zcl_excel_style_conditional=>c_rule_colorscale. + + ls_colorscale = lo_style_conditional->mode_colorscale. + + CLEAR: lt_cfvo, lt_colors. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_colorscale + parent = lo_document ). + + MOVE ls_colorscale-cfvo1_value TO ls_cfvo-value. + MOVE ls_colorscale-cfvo1_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + + MOVE ls_colorscale-cfvo2_value TO ls_cfvo-value. + MOVE ls_colorscale-cfvo2_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + + MOVE ls_colorscale-cfvo3_value TO ls_cfvo-value. + MOVE ls_colorscale-cfvo3_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + + APPEND ls_colorscale-colorrgb1 TO lt_colors. + APPEND ls_colorscale-colorrgb2 TO lt_colors. + APPEND ls_colorscale-colorrgb3 TO lt_colors. + + LOOP AT lt_cfvo INTO ls_cfvo. + + IF ls_cfvo IS INITIAL. + CONTINUE. + ENDIF. + + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lv_value = ls_cfvo-type. + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = ls_cfvo-value. + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_3->append_child( new_child = lo_element_4 ). " cfvo node + ENDLOOP. + LOOP AT lt_colors INTO ls_colors. + + IF ls_colors IS INITIAL. + CONTINUE. + ENDIF. + + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_color + parent = lo_document ). + lv_value = ls_colors-colorrgb. + lo_element_4->set_attribute_ns( name = lc_xml_attr_tabcolor_rgb + value = lv_value ). + + lo_element_3->append_child( new_child = lo_element_4 ). " color node + ENDLOOP. + + lo_element_2->append_child( new_child = lo_element_3 ). " databar node + WHEN zcl_excel_style_conditional=>c_rule_iconset. + + ls_iconset = lo_style_conditional->mode_iconset. + + CLEAR lt_cfvo. + " iconset node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset + parent = lo_document ). + IF ls_iconset-iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. + lv_value = ls_iconset-iconset. + lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset + value = lv_value ). + ENDIF. + + " Set the showValue attribute + lv_value = ls_iconset-showvalue. + lo_element_3->set_attribute_ns( name = lc_xml_attr_showvalue + value = lv_value ). + + CASE ls_iconset-iconset. + WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR + zcl_excel_style_conditional=>c_iconset_3arrows OR + zcl_excel_style_conditional=>c_iconset_3arrowsgray OR + zcl_excel_style_conditional=>c_iconset_3flags OR + zcl_excel_style_conditional=>c_iconset_3signs OR + zcl_excel_style_conditional=>c_iconset_3symbols OR + zcl_excel_style_conditional=>c_iconset_3symbols2 OR + zcl_excel_style_conditional=>c_iconset_3trafficlights OR + zcl_excel_style_conditional=>c_iconset_3trafficlights2. + MOVE ls_iconset-cfvo1_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo1_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo2_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo2_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo3_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo3_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR + zcl_excel_style_conditional=>c_iconset_4arrowsgray OR + zcl_excel_style_conditional=>c_iconset_4rating OR + zcl_excel_style_conditional=>c_iconset_4redtoblack OR + zcl_excel_style_conditional=>c_iconset_4trafficlights. + MOVE ls_iconset-cfvo1_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo1_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo2_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo2_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo3_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo3_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo4_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo4_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR + zcl_excel_style_conditional=>c_iconset_5arrowsgray OR + zcl_excel_style_conditional=>c_iconset_5quarters OR + zcl_excel_style_conditional=>c_iconset_5rating. + MOVE ls_iconset-cfvo1_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo1_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo2_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo2_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo3_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo3_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo4_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo4_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + MOVE ls_iconset-cfvo5_value TO ls_cfvo-value. + MOVE ls_iconset-cfvo5_type TO ls_cfvo-type. + APPEND ls_cfvo TO lt_cfvo. + WHEN OTHERS. + CLEAR lt_cfvo. + ENDCASE. + + LOOP AT lt_cfvo INTO ls_cfvo. + " cfvo node + lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo + parent = lo_document ). + lv_value = ls_cfvo-type. + lo_element_4->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + lv_value = ls_cfvo-value. + lo_element_4->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_3->append_child( new_child = lo_element_4 ). " cfvo node + ENDLOOP. + + + lo_element_2->append_child( new_child = lo_element_3 ). " iconset node + WHEN zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis = lo_style_conditional->mode_cellis. + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_cellis-cell_style. + lv_value = ls_style_cond_mapping-dxf. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = lv_value ). + lv_value = ls_cellis-operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = ls_cellis-formula. + lo_element_3->set_value( value = lv_value ). + lo_element_2->append_child( new_child = lo_element_3 ). " formula node + WHEN zcl_excel_style_conditional=>c_rule_expression. + ls_expression = lo_style_conditional->mode_expression. + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_expression-cell_style. + lv_value = ls_style_cond_mapping-dxf. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid + value = lv_value ). + " formula node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lv_value = ls_expression-formula. + lo_element_3->set_value( value = lv_value ). + lo_element_2->append_child( new_child = lo_element_3 ). " formula node + ENDCASE. + + lo_element->append_child( new_child = lo_element_2 ). " cfRule node + + lo_element_root->append_child( new_child = lo_element ). " Conditional formatting node + ENDWHILE. + + IF io_worksheet->get_data_validations_size( ) GT 0. + " dataValidations node + lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations + parent = lo_document ). + " Conditional formatting node + lo_iterator = io_worksheet->get_data_validations_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_data_validation ?= lo_iterator->if_object_collection_iterator~get_next( ). + " dataValidation node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation + parent = lo_document ). + lv_value = lo_data_validation->type. + lo_element_2->set_attribute_ns( name = lc_xml_attr_type + value = lv_value ). + IF NOT lo_data_validation->operator IS INITIAL. + lv_value = lo_data_validation->operator. + lo_element_2->set_attribute_ns( name = lc_xml_attr_operator + value = lv_value ). + ENDIF. + IF lo_data_validation->allowblank EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank + value = lv_value ). + IF lo_data_validation->showinputmessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage + value = lv_value ). + IF lo_data_validation->showerrormessage EQ abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage + value = lv_value ). + IF NOT lo_data_validation->errortitle IS INITIAL. + lv_value = lo_data_validation->errortitle. + lo_element_2->set_attribute_ns( name = lc_xml_attr_errortitle + value = lv_value ). + ENDIF. + IF NOT lo_data_validation->error IS INITIAL. + lv_value = lo_data_validation->error. + lo_element_2->set_attribute_ns( name = lc_xml_attr_error + value = lv_value ). + ENDIF. + IF NOT lo_data_validation->prompttitle IS INITIAL. + lv_value = lo_data_validation->prompttitle. + lo_element_2->set_attribute_ns( name = lc_xml_attr_prompttitle + value = lv_value ). + ENDIF. + IF NOT lo_data_validation->prompt IS INITIAL. + lv_value = lo_data_validation->prompt. + lo_element_2->set_attribute_ns( name = lc_xml_attr_prompt + value = lv_value ). + ENDIF. + lv_cell_row_s = lo_data_validation->cell_row. + CONDENSE lv_cell_row_s. + CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. + IF lo_data_validation->cell_row_to IS NOT INITIAL. + lv_cell_row_s = lo_data_validation->cell_row_to. + CONDENSE lv_cell_row_s. + CONCATENATE lv_value ':' lo_data_validation->cell_column_to lv_cell_row_s INTO lv_value. + ENDIF. + lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref + value = lv_value ). + " formula1 node + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1 + parent = lo_document ). + lv_value = lo_data_validation->formula1. + lo_element_3->set_value( value = lv_value ). + + lo_element_2->append_child( new_child = lo_element_3 ). " formula1 node + " formula2 node + IF NOT lo_data_validation->formula2 IS INITIAL. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula2 + parent = lo_document ). + lv_value = lo_data_validation->formula2. + lo_element_3->set_value( value = lv_value ). + + lo_element_2->append_child( new_child = lo_element_3 ). " formula2 node + ENDIF. + + lo_element->append_child( new_child = lo_element_2 ). " dataValidation node + ENDWHILE. + lo_element_root->append_child( new_child = lo_element ). " dataValidations node + ENDIF. + + " Hyperlinks + DATA: lv_hyperlinks_count TYPE i, + lo_link TYPE REF TO zcl_excel_hyperlink. + + lv_hyperlinks_count = io_worksheet->get_hyperlinks_size( ). + IF lv_hyperlinks_count > 0. + lo_element = lo_document->create_simple_element( name = 'hyperlinks' + parent = lo_document ). + + lo_iterator = io_worksheet->get_hyperlinks_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_link ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lo_element_2 = lo_document->create_simple_element( name = 'hyperlink' + parent = lo_element ). + + lv_value = lo_link->get_ref( ). + lo_element_2->set_attribute_ns( name = 'ref' + value = lv_value ). + + IF lo_link->is_internal( ) = abap_true. + lv_value = lo_link->get_url( ). + lo_element_2->set_attribute_ns( name = 'location' + value = lv_value ). + ELSE. + ADD 1 TO lv_relation_id. + + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element_2->set_attribute_ns( name = 'r:id' + value = lv_value ). + + ENDIF. + + lo_element->append_child( new_child = lo_element_2 ). + ENDWHILE. + + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + + " PrintOptions + IF io_worksheet->print_gridlines = abap_true OR + io_worksheet->sheet_setup->vertical_centered = abap_true OR + io_worksheet->sheet_setup->horizontal_centered = abap_true. + lo_element = lo_document->create_simple_element( name = 'printOptions' + parent = lo_document ). + + IF io_worksheet->print_gridlines = abap_true. + lo_element->set_attribute_ns( name = lc_xml_attr_gridlines + value = 'true' ). + ENDIF. + + IF io_worksheet->sheet_setup->horizontal_centered = abap_true. + lo_element->set_attribute_ns( name = 'horizontalCentered' + value = 'true' ). + ENDIF. + + IF io_worksheet->sheet_setup->vertical_centered = abap_true. + lo_element->set_attribute_ns( name = 'verticalCentered' + value = 'true' ). + ENDIF. + + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins + parent = lo_document ). + + lv_value = io_worksheet->sheet_setup->margin_left. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_left + value = lv_value ). + lv_value = io_worksheet->sheet_setup->margin_right. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_right + value = lv_value ). + lv_value = io_worksheet->sheet_setup->margin_top. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_top + value = lv_value ). + lv_value = io_worksheet->sheet_setup->margin_bottom. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_bottom + value = lv_value ). + lv_value = io_worksheet->sheet_setup->margin_header. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_header + value = lv_value ). + lv_value = io_worksheet->sheet_setup->margin_footer. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_footer + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). " pageMargins node + +* pageSetup node + lo_element = lo_document->create_simple_element( name = lc_xml_node_pagesetup + parent = lo_document ). + + IF io_worksheet->sheet_setup->black_and_white IS NOT INITIAL. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_blackandwhite + value = `1` ). + ENDIF. + + IF io_worksheet->sheet_setup->cell_comments IS NOT INITIAL. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_cellcomments + value = io_worksheet->sheet_setup->cell_comments ). + ENDIF. + + IF io_worksheet->sheet_setup->copies IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->copies. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_copies + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->draft IS NOT INITIAL. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_draft + value = `1` ). + ENDIF. + + IF io_worksheet->sheet_setup->errors IS NOT INITIAL. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_errors + value = io_worksheet->sheet_setup->errors ). + ENDIF. + + IF io_worksheet->sheet_setup->first_page_number IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->first_page_number. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_firstpagenumber + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->fit_to_height. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_fittoheight + value = lv_value ). + lv_value = io_worksheet->sheet_setup->fit_to_width. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_fittowidth + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->horizontal_dpi IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->horizontal_dpi. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_horizontaldpi + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->orientation IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->orientation. + lo_element->set_attribute_ns( name = lc_xml_attr_orientation + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->page_order IS NOT INITIAL. + lo_element->set_attribute_ns( name = lc_xml_attr_pageorder + value = io_worksheet->sheet_setup->page_order ). + ENDIF. + + IF io_worksheet->sheet_setup->paper_height IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->paper_height. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_paperheight + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->paper_size IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->paper_size. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_papersize + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->paper_width IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->paper_width. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_paperwidth + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->scale IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->scale. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_scale + value = lv_value ). + ENDIF. + + IF io_worksheet->sheet_setup->use_first_page_num IS NOT INITIAL. + lo_element->set_attribute_ns( name = lc_xml_attr_usefirstpagenumber + value = `1` ). + ENDIF. + + IF io_worksheet->sheet_setup->use_printer_defaults IS NOT INITIAL. + lo_element->set_attribute_ns( name = lc_xml_attr_useprinterdefaults + value = `1` ). + ENDIF. + + IF io_worksheet->sheet_setup->vertical_dpi IS NOT INITIAL. + lv_value = io_worksheet->sheet_setup->vertical_dpi. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_verticaldpi + value = lv_value ). + ENDIF. + + lo_element_root->append_child( new_child = lo_element ). " pageSetup node + +* { headerFooter necessary? > + IF io_worksheet->sheet_setup->odd_header IS NOT INITIAL + OR io_worksheet->sheet_setup->odd_footer IS NOT INITIAL + OR io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_headerfooter + parent = lo_document ). + + " Different header/footer for odd/even pages? + IF io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. + lo_element->set_attribute_ns( name = lc_xml_attr_differentoddeven + value = '1' ). + ENDIF. + + " OddHeader + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_odd_header = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_oddheader + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + " OddFooter + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_odd_footer = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_oddfooter + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + " evenHeader + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_even_header = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_evenheader + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + " evenFooter + CLEAR: lv_value. + io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_even_footer = lv_value ) . + IF lv_value IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_evenfooter + parent = lo_document ). + lo_element_2->set_value( value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + ENDIF. + + + lo_element_root->append_child( new_child = lo_element ). " headerFooter + + ENDIF. + +* drawing + DATA: lo_drawings TYPE REF TO zcl_excel_drawings. + + lo_drawings = io_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + lo_element = lo_document->create_simple_element( name = lc_xml_node_drawing + parent = lo_document ). + ADD 1 TO lv_relation_id. + + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + lo_element->set_attribute( name = 'r:id' + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + +* tables + DATA lv_table_count TYPE i. + + lv_table_count = io_worksheet->get_tables_size( ). + IF lv_table_count > 0. + lo_element = lo_document->create_simple_element( name = 'tableParts' + parent = lo_document ). + lv_value = lv_table_count. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). + ADD 1 TO lv_relation_id. + + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + lo_element_2 = lo_document->create_simple_element( name = 'tablePart' + parent = lo_element ). + lo_element_2->set_attribute_ns( name = 'r:id' + value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). + + ENDWHILE. + + lo_element_root->append_child( new_child = lo_element ). + + ENDIF. + + + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + + METHOD create_xl_sheet_rels. + + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + lc_xml_attr_target_mode TYPE string VALUE 'TargetMode', + lc_xml_val_external TYPE string VALUE 'External', + " Node namespace + lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', + lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table', + lc_xml_node_rid_printer_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings', + lc_xml_node_rid_drawing_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', + lc_xml_node_rid_link_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table, + lo_link TYPE REF TO zcl_excel_hyperlink. + + DATA: lv_value TYPE string, + lv_relation_id TYPE i, + lv_index_str TYPE string. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_rels_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + " Add sheet Relationship nodes here + lv_relation_id = 0. + lo_iterator = io_worksheet->get_hyperlinks_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_link ?= lo_iterator->if_object_collection_iterator~get_next( ). + CHECK lo_link->is_internal( ) = abap_false. " issue #340 - don't put internal links here + ADD 1 TO lv_relation_id. + + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_link_tp ). + + lv_value = lo_link->get_url( ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_target_mode + value = lc_xml_val_external ). + lo_element_root->append_child( new_child = lo_element ). + ENDWHILE. + +* drawing + DATA: lo_drawings TYPE REF TO zcl_excel_drawings. + + lo_drawings = io_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 1 TO lv_relation_id. + + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_drawing_tp ). + + lv_index_str = iv_drawing_index. + CONDENSE lv_index_str NO-GAPS. + MOVE me->c_xl_drawings TO lv_value. + REPLACE 'xl' WITH '..' INTO lv_value. + REPLACE '#' WITH lv_index_str INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). + ADD 1 TO lv_relation_id. + + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_table_tp ). + + lv_value = lo_table->get_name( ). + CONCATENATE '../tables/' lv_value '.xml' INTO lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDWHILE. + +* IF io_worksheet->get_print_settings( )->is_empty( ) = abap_false. +* ADD 1 TO lv_relation_id. +* lv_value = lv_relation_id. +* CONDENSE lv_value. +* CONCATENATE 'rId' lv_value INTO lv_value. +* +* lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship +* parent = lo_document ). +* lo_element->set_attribute_ns( name = lc_xml_attr_id +* value = lv_value ). +* lo_element->set_attribute_ns( name = lc_xml_attr_type +* value = lc_xml_node_rid_printer_tp ). +* +* lv_index_str = iv_printer_index. +* CONDENSE lv_index_str NO-GAPS. +* MOVE me->c_xl_printersettings TO lv_value. +* REPLACE 'xl' WITH '..' INTO lv_value. +* REPLACE '#' WITH lv_index_str INTO lv_value. +* lo_element->set_attribute_ns( name = lc_xml_attr_target +* value = lv_value ). +* +* lo_element_root->append_child( new_child = lo_element ). +* ENDIF. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + METHOD create_xl_styles. + + +** Constant node name + CONSTANTS: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + " font + lc_xml_node_fonts TYPE string VALUE 'fonts', + lc_xml_node_font TYPE string VALUE 'font', + lc_xml_node_b TYPE string VALUE 'b', "bold + lc_xml_node_i TYPE string VALUE 'i', "italic + lc_xml_node_u TYPE string VALUE 'u', "underline + lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough + lc_xml_node_sz TYPE string VALUE 'sz', + lc_xml_node_color TYPE string VALUE 'color', + lc_xml_node_name TYPE string VALUE 'name', + lc_xml_node_family TYPE string VALUE 'family', + lc_xml_node_scheme TYPE string VALUE 'scheme', + " fill + lc_xml_node_fills TYPE string VALUE 'fills', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', + lc_xml_node_stop TYPE string VALUE 'stop', + " borders + lc_xml_node_borders TYPE string VALUE 'borders', + lc_xml_node_border TYPE string VALUE 'border', + lc_xml_node_left TYPE string VALUE 'left', + lc_xml_node_right TYPE string VALUE 'right', + lc_xml_node_top TYPE string VALUE 'top', + lc_xml_node_bottom TYPE string VALUE 'bottom', + lc_xml_node_diagonal TYPE string VALUE 'diagonal', + " numfmt + lc_xml_node_numfmts TYPE string VALUE 'numFmts', + lc_xml_node_numfmt TYPE string VALUE 'numFmt', + " Styles + lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', + lc_xml_node_xf TYPE string VALUE 'xf', + lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', + lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', + lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', + lc_xml_node_dxfs TYPE string VALUE 'dxfs', + lc_xml_node_dxf TYPE string VALUE 'dxf', + lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', + " Colors + lc_xml_node_colors TYPE string VALUE 'colors', + lc_xml_node_indexedcolors TYPE string VALUE 'indexedColors', + lc_xml_node_rgbcolor TYPE string VALUE 'rgbColor', + lc_xml_node_mrucolors TYPE string VALUE 'mruColors', + " Alignment + lc_xml_node_alignment TYPE string VALUE 'alignment', + " Protection + lc_xml_node_protection TYPE string VALUE 'protection', + " Node attributes + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_val TYPE string VALUE 'val', + lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_tint TYPE string VALUE 'tint', + lc_xml_attr_style TYPE string VALUE 'style', + lc_xml_attr_position TYPE string VALUE 'position', + lc_xml_attr_degree TYPE string VALUE 'degree', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', + lc_xml_attr_fontid TYPE string VALUE 'fontId', + lc_xml_attr_fillid TYPE string VALUE 'fillId', + lc_xml_attr_borderid TYPE string VALUE 'borderId', + lc_xml_attr_xfid TYPE string VALUE 'xfId', + lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', + lc_xml_attr_applyprotection TYPE string VALUE 'applyProtection', + lc_xml_attr_applyfont TYPE string VALUE 'applyFont', + lc_xml_attr_applyfill TYPE string VALUE 'applyFill', + lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_builtinid TYPE string VALUE 'builtinId', + lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', + lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', + lc_xml_attr_applyalignment TYPE string VALUE 'applyAlignment', + lc_xml_attr_horizontal TYPE string VALUE 'horizontal', + lc_xml_attr_formatcode TYPE string VALUE 'formatCode', + lc_xml_attr_vertical TYPE string VALUE 'vertical', + lc_xml_attr_wraptext TYPE string VALUE 'wrapText', + lc_xml_attr_textrotation TYPE string VALUE 'textRotation', + lc_xml_attr_shrinktofit TYPE string VALUE 'shrinkToFit', + lc_xml_attr_indent TYPE string VALUE 'indent', + lc_xml_attr_locked TYPE string VALUE 'locked', + lc_xml_attr_hidden TYPE string VALUE 'hidden', + lc_xml_attr_diagonalup TYPE string VALUE 'diagonalUp', + lc_xml_attr_diagonaldown TYPE string VALUE 'diagonalDown', + " Node namespace + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_attr_type TYPE string value 'type', + lc_xml_attr_bottom TYPE string value 'bottom', + lc_xml_attr_top TYPE string value 'top', + lc_xml_attr_right TYPE string value 'right', + lc_xml_attr_left TYPE string value 'left'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element_fonts TYPE REF TO if_ixml_element, + lo_element_font TYPE REF TO if_ixml_element, + lo_element_fills TYPE REF TO if_ixml_element, + lo_element_fill TYPE REF TO if_ixml_element, + lo_element_borders TYPE REF TO if_ixml_element, + lo_element_border TYPE REF TO if_ixml_element, + lo_element_numfmts TYPE REF TO if_ixml_element, + lo_element_numfmt TYPE REF TO if_ixml_element, + lo_element_cellxfs TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_iterator2 TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style TYPE REF TO zcl_excel_style. + + + DATA: lt_fonts TYPE zexcel_t_style_font, + ls_font TYPE zexcel_s_style_font, + lt_fills TYPE zexcel_t_style_fill, + ls_fill TYPE zexcel_s_style_fill, + lt_borders TYPE zexcel_t_style_border, + ls_border TYPE zexcel_s_style_border, + lt_numfmts TYPE zexcel_t_style_numfmt, + ls_numfmt TYPE zexcel_s_style_numfmt, + lt_protections TYPE zexcel_t_style_protection, + ls_protection TYPE zexcel_s_style_protection, + lt_alignments TYPE zexcel_t_style_alignment, + ls_alignment TYPE zexcel_s_style_alignment, + lt_cellxfs TYPE zexcel_t_cellxfs, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_styles_mapping TYPE zexcel_s_styles_mapping, + ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping, + ls_cellis TYPE zexcel_conditional_cellis, + ls_expression TYPE zexcel_conditional_expression, + lt_colors TYPE zexcel_t_style_color_argb, + ls_color LIKE LINE OF lt_colors. + + DATA: lv_value TYPE string, + lv_dfx_count TYPE i, + lv_fonts_count TYPE i, + lv_fills_count TYPE i, + lv_borders_count TYPE i, + lv_cellxfs_count TYPE i, + lv_index TYPE i, + lv_align_flag TYPE c. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +*********************************************************************** +* STEP 3: Create main node relationships + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + +********************************************************************** +* STEP 4: Create subnodes + + lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts + parent = lo_document ). + + lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills + parent = lo_document ). + + lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders + parent = lo_document ). + + lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs + parent = lo_document ). + + lo_element_numfmts = lo_document->create_simple_element( name = lc_xml_node_numfmts + parent = lo_document ). + + +* Compress styles + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_style ?= lo_iterator->if_object_collection_iterator~get_next( ). + ls_font = lo_style->font->get_structure( ). + ls_fill = lo_style->fill->get_structure( ). + ls_border = lo_style->borders->get_structure( ). + ls_alignment = lo_style->alignment->get_structure( ). + ls_protection = lo_style->protection->get_structure( ). + ls_numfmt = lo_style->number_format->get_structure( ). + + CLEAR ls_cellxfs. + + +* Compress fonts + READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fontid = sy-tabix. + ELSE. + APPEND ls_font TO lt_fonts. + DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fontid. + +* Compress alignment + READ TABLE lt_alignments FROM ls_alignment TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-alignmentid = sy-tabix. + ELSE. + APPEND ls_alignment TO lt_alignments. + DESCRIBE TABLE lt_alignments LINES ls_cellxfs-alignmentid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + +* Compress fills + READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-fillid = sy-tabix. + ELSE. + APPEND ls_fill TO lt_fills. + DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-fillid. + +* Compress borders + READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-borderid = sy-tabix. + ELSE. + APPEND ls_border TO lt_borders. + DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-borderid. + +* Compress protection + IF ls_protection-locked EQ c_on AND ls_protection-hidden EQ c_off. + ls_cellxfs-applyprotection = 0. + ELSE. + READ TABLE lt_protections FROM ls_protection TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-protectionid = sy-tabix. + ELSE. + APPEND ls_protection TO lt_protections. + DESCRIBE TABLE lt_protections LINES ls_cellxfs-protectionid. + ENDIF. + ls_cellxfs-applyprotection = 1. + ENDIF. + SUBTRACT 1 FROM ls_cellxfs-protectionid. + +* Compress number formats + + "----------- + IF ls_numfmt-numfmt NE zcl_excel_style_number_format=>c_format_date_std." and ls_numfmt-NUMFMT ne 'STD_NDEC'. " ALE Changes on going + "--- + IF ls_numfmt IS NOT INITIAL. + + READ TABLE lt_numfmts FROM ls_numfmt TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_cellxfs-numfmtid = sy-tabix. + ELSE. + APPEND ls_numfmt TO lt_numfmts. + DESCRIBE TABLE lt_numfmts LINES ls_cellxfs-numfmtid. + ENDIF. + ADD zcl_excel_common=>c_excel_numfmt_offset TO ls_cellxfs-numfmtid. " Add OXML offset for custom styles + ls_cellxfs-applynumberformat = 1. + ELSE. + ls_cellxfs-applynumberformat = 0. + ENDIF. + "----------- " ALE changes on going + ELSE. + ls_cellxfs-applynumberformat = 1. + IF ls_numfmt-numfmt EQ zcl_excel_style_number_format=>c_format_date_std. + ls_cellxfs-numfmtid = 14. +* elseif ls_numfmt-NUMFMT eq 'STD_NDEC'. +* ls_cellxfs-numfmtid = 2. + ENDIF. + ENDIF. + "--- + + IF ls_cellxfs-fontid NE 0. + ls_cellxfs-applyfont = 1. + ELSE. + ls_cellxfs-applyfont = 0. + ENDIF. + IF ls_cellxfs-alignmentid NE 0. + ls_cellxfs-applyalignment = 1. + ELSE. + ls_cellxfs-applyalignment = 0. + ENDIF. + IF ls_cellxfs-fillid NE 0. + ls_cellxfs-applyfill = 1. + ELSE. + ls_cellxfs-applyfill = 0. + ENDIF. + IF ls_cellxfs-borderid NE 0. + ls_cellxfs-applyborder = 1. + ELSE. + ls_cellxfs-applyborder = 0. + ENDIF. + +* Remap styles + READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. + IF sy-subrc EQ 0. + ls_styles_mapping-style = sy-tabix. + ELSE. + APPEND ls_cellxfs TO lt_cellxfs. + DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. + ENDIF. + SUBTRACT 1 FROM ls_styles_mapping-style. + ls_styles_mapping-guid = lo_style->get_guid( ). + APPEND ls_styles_mapping TO me->styles_mapping. + ENDWHILE. + + " create numfmt elements + LOOP AT lt_numfmts INTO ls_numfmt. + lo_element_numfmt = lo_document->create_simple_element( name = lc_xml_node_numfmt + parent = lo_document ). + lv_value = sy-tabix + zcl_excel_common=>c_excel_numfmt_offset. + CONDENSE lv_value. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + lv_value = ls_numfmt-numfmt. +* REPLACE ALL OCCURRENCES OF '.' IN lv_value WITH '\.'. + lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_formatcode + value = lv_value ). + lo_element_numfmts->append_child( new_child = lo_element_numfmt ). + ENDLOOP. + + " create font elements + LOOP AT lt_fonts INTO ls_font. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( new_child = lo_sub_element ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( new_child = lo_sub_element ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( new_child = lo_sub_element ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( new_child = lo_sub_element ). + ENDIF. + "size + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz + parent = lo_document ). + lv_value = ls_font-size. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( new_child = lo_sub_element ). + "color + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_element_font + is_color = ls_font-color ). + + "name + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name + parent = lo_document ). + lv_value = ls_font-name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( new_child = lo_sub_element ). + "family + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family + parent = lo_document ). + lv_value = ls_font-family. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( new_child = lo_sub_element ). + "scheme + IF ls_font-scheme IS NOT INITIAL. + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme + parent = lo_document ). + lv_value = ls_font-scheme. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( new_child = lo_sub_element ). + ENDIF. + lo_element_fonts->append_child( new_child = lo_element_font ). + ENDLOOP. + + " create fill elements + LOOP AT lt_fills INTO ls_fill. + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + + if ls_fill-gradtype is not initial. + "gradient + + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_gradientfill + parent = lo_document ). + if ls_fill-gradtype-degree is not initial. + lv_value = ls_fill-gradtype-degree. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_degree value = lv_value ). + endif. + if ls_fill-gradtype-type is not initial. + lv_value = ls_fill-gradtype-type. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_type value = lv_value ). + endif. + if ls_fill-gradtype-bottom is not initial. + lv_value = ls_fill-gradtype-bottom. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_bottom value = lv_value ). + endif. + if ls_fill-gradtype-top is not initial. + lv_value = ls_fill-gradtype-top. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_top value = lv_value ). + endif. + if ls_fill-gradtype-right is not initial. + lv_value = ls_fill-gradtype-right. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_right value = lv_value ). + endif. + if ls_fill-gradtype-left is not initial. + lv_value = ls_fill-gradtype-left. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_left value = lv_value ). + endif. + + if ls_fill-gradtype-position3 is not initial. + "create <stop> elements for gradients, we can have 2 or 3 stops in each gradient + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_stop + parent = lo_sub_element ). + lv_value = ls_fill-gradtype-position1. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_position value = lv_value ). + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-bgcolor + iv_color_elem_name = lc_xml_node_color ). + lo_sub_element->append_child( new_child = lo_sub_element_2 ). + + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_stop + parent = lo_sub_element ). + + lv_value = ls_fill-gradtype-position2. + + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_position + value = lv_value ). + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-fgcolor + iv_color_elem_name = lc_xml_node_color ). + lo_sub_element->append_child( new_child = lo_sub_element_2 ). + + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_stop + parent = lo_sub_element ). + + lv_value = ls_fill-gradtype-position3. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_position + value = lv_value ). + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-bgcolor + iv_color_elem_name = lc_xml_node_color ). + lo_sub_element->append_child( new_child = lo_sub_element_2 ). + + else. + "create <stop> elements for gradients, we can have 2 or 3 stops in each gradient + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_stop + parent = lo_sub_element ). + lv_value = ls_fill-gradtype-position1. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_position value = lv_value ). + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-bgcolor + iv_color_elem_name = lc_xml_node_color ). + lo_sub_element->append_child( new_child = lo_sub_element_2 ). + + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_stop + parent = lo_sub_element ). + + lv_value = ls_fill-gradtype-position2. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_position + value = lv_value ). + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-fgcolor + iv_color_elem_name = lc_xml_node_color ). + lo_sub_element->append_child( new_child = lo_sub_element_2 ). + endif. + + + + + else. + "pattern + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element + is_color = ls_fill-fgcolor + iv_color_elem_name = lc_xml_node_fgcolor ). + + IF ls_fill-fgcolor-rgb IS INITIAL AND + ls_fill-fgcolor-indexed EQ zcl_excel_style_color=>c_indexed_not_set AND + ls_fill-fgcolor-theme EQ zcl_excel_style_color=>c_theme_not_set AND + ls_fill-fgcolor-tint IS INITIAL AND ls_fill-bgcolor-indexed EQ zcl_excel_style_color=>c_indexed_sys_foreground. + + " bgcolor + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element + is_color = ls_fill-bgcolor + iv_color_elem_name = lc_xml_node_bgcolor ). + + ENDIF. + endif. + + lo_element_fill->append_child( new_child = lo_sub_element )."pattern + lo_element_fills->append_child( new_child = lo_element_fill ). + ENDLOOP. + + " create border elements + LOOP AT lt_borders INTO ls_border. + lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border + parent = lo_document ). + + IF ls_border-diagonalup IS NOT INITIAL. + lv_value = ls_border-diagonalup. + CONDENSE lv_value. + lo_element_border->set_attribute_ns( name = lc_xml_attr_diagonalup + value = lv_value ). + ENDIF. + + IF ls_border-diagonaldown IS NOT INITIAL. + lv_value = ls_border-diagonaldown. + CONDENSE lv_value. + lo_element_border->set_attribute_ns( name = lc_xml_attr_diagonaldown + value = lv_value ). + ENDIF. + + "left + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left + parent = lo_document ). + IF ls_border-left_style IS NOT INITIAL. + lv_value = ls_border-left_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element + is_color = ls_border-left_color ). + + lo_element_border->append_child( new_child = lo_sub_element ). + + "right + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right + parent = lo_document ). + IF ls_border-right_style IS NOT INITIAL. + lv_value = ls_border-right_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element + is_color = ls_border-right_color ). + + lo_element_border->append_child( new_child = lo_sub_element ). + + "top + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top + parent = lo_document ). + IF ls_border-top_style IS NOT INITIAL. + lv_value = ls_border-top_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element + is_color = ls_border-top_color ). + + lo_element_border->append_child( new_child = lo_sub_element ). + + "bottom + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom + parent = lo_document ). + IF ls_border-bottom_style IS NOT INITIAL. + lv_value = ls_border-bottom_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element + is_color = ls_border-bottom_color ). + + lo_element_border->append_child( new_child = lo_sub_element ). + + "diagonal + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal + parent = lo_document ). + IF ls_border-diagonal_style IS NOT INITIAL. + lv_value = ls_border-diagonal_style. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + ENDIF. + + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element + is_color = ls_border-diagonal_color ). + + lo_element_border->append_child( new_child = lo_sub_element ). + lo_element_borders->append_child( new_child = lo_element_border ). + ENDLOOP. + + " update attribute "count" + DESCRIBE TABLE lt_fonts LINES lv_fonts_count. + MOVE lv_fonts_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_fills LINES lv_fills_count. + MOVE lv_fills_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_fills->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_borders LINES lv_borders_count. + MOVE lv_borders_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_borders->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. + MOVE lv_cellxfs_count TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + + " Append to root node + lo_element_root->append_child( new_child = lo_element_numfmts ). + lo_element_root->append_child( new_child = lo_element_fonts ). + lo_element_root->append_child( new_child = lo_element_fills ). + lo_element_root->append_child( new_child = lo_element_borders ). + + " cellstylexfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = c_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid + value = c_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid + value = c_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid + value = c_off ). + + lo_element->append_child( new_child = lo_sub_element ). + lo_element_root->append_child( new_child = lo_element ). + + LOOP AT lt_cellxfs INTO ls_cellxfs. + lo_element = lo_document->create_simple_element( name = lc_xml_node_xf + parent = lo_document ). + MOVE ls_cellxfs-numfmtid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid + value = lv_value ). + MOVE ls_cellxfs-fontid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fontid + value = lv_value ). + MOVE ls_cellxfs-fillid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_fillid + value = lv_value ). + MOVE ls_cellxfs-borderid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_borderid + value = lv_value ). + MOVE ls_cellxfs-xfid TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_xfid + value = lv_value ). + IF ls_cellxfs-applynumberformat EQ 1. + MOVE ls_cellxfs-applynumberformat TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfont EQ 1. + MOVE ls_cellxfs-applyfont TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfont + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyfill EQ 1. + MOVE ls_cellxfs-applyfill TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyfill + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyborder EQ 1. + MOVE ls_cellxfs-applyborder TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyborder + value = lv_value ). + ENDIF. + IF ls_cellxfs-applyalignment EQ 1. " depends on each style not for all the sheet + MOVE ls_cellxfs-applyalignment TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element->set_attribute_ns( name = lc_xml_attr_applyalignment + value = lv_value ). + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_alignment + parent = lo_document ). + ADD 1 TO ls_cellxfs-alignmentid. "Table index starts from 1 + READ TABLE lt_alignments INTO ls_alignment INDEX ls_cellxfs-alignmentid. + SUBTRACT 1 FROM ls_cellxfs-alignmentid. + IF ls_alignment-horizontal IS NOT INITIAL. + MOVE ls_alignment-horizontal TO lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_horizontal + value = lv_value ). + ENDIF. + IF ls_alignment-vertical IS NOT INITIAL. + MOVE ls_alignment-vertical TO lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_vertical + value = lv_value ). + ENDIF. + IF ls_alignment-wraptext EQ abap_true. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_wraptext + value = c_on ). + ENDIF. + IF ls_alignment-textrotation IS NOT INITIAL. + MOVE ls_alignment-textrotation TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_textrotation + value = lv_value ). + ENDIF. + IF ls_alignment-shrinktofit EQ abap_true. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_shrinktofit + value = c_on ). + ENDIF. + IF ls_alignment-indent IS NOT INITIAL. + MOVE ls_alignment-indent TO lv_value. + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indent + value = lv_value ). + ENDIF. + + lo_element->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_cellxfs-applyprotection EQ 1. + MOVE ls_cellxfs-applyprotection TO lv_value. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_applyprotection + value = lv_value ). + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_protection + parent = lo_document ). + ADD 1 TO ls_cellxfs-protectionid. "Table index starts from 1 + READ TABLE lt_protections INTO ls_protection INDEX ls_cellxfs-protectionid. + SUBTRACT 1 FROM ls_cellxfs-protectionid. + IF ls_protection-locked IS NOT INITIAL. + MOVE ls_protection-locked TO lv_value. + CONDENSE lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_locked + value = lv_value ). + ENDIF. + IF ls_protection-hidden IS NOT INITIAL. + MOVE ls_protection-hidden TO lv_value. + CONDENSE lv_value. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = lv_value ). + ENDIF. + lo_element->append_child( new_child = lo_sub_element_2 ). + ENDIF. + lo_element_cellxfs->append_child( new_child = lo_element ). + ENDLOOP. + + lo_element_root->append_child( new_child = lo_element_cellxfs ). + + " cellStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '1' ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle + parent = lo_document ). + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = 'Normal' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid + value = c_off ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid + value = c_off ). + + lo_element->append_child( new_child = lo_sub_element ). + lo_element_root->append_child( new_child = lo_element ). + + " dxfs node + lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs + parent = lo_document ). + + lo_iterator = me->excel->get_worksheets_iterator( ). + " get sheets + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + " Conditional formatting styles into exch sheet + lo_iterator2 = lo_worksheet->get_cond_styles_iterator( ). + WHILE lo_iterator2->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_style_conditional ?= lo_iterator2->if_object_collection_iterator~get_next( ). + CASE lo_style_conditional->rule. + WHEN zcl_excel_style_conditional=>c_rule_cellis. + "if style defined + ls_cellis = lo_style_conditional->mode_cellis. + IF ls_cellis-cell_style IS INITIAL. + CONTINUE. + ENDIF. + READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = ls_cellis-cell_style. + ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0 + READ TABLE lt_cellxfs INTO ls_cellxfs INDEX ls_styles_mapping-style. + ADD 1 TO ls_cellxfs-fillid. " the numbering starts from 0 + + " Style already mapped? + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY style = ls_styles_mapping-style. + IF sy-subrc EQ 0. + ls_style_cond_mapping-guid = ls_cellis-cell_style. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ELSE. + ls_style_cond_mapping-guid = ls_cellis-cell_style. + ls_style_cond_mapping-style = ls_styles_mapping-style. + ls_style_cond_mapping-dxf = lv_dfx_count. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ADD 1 TO lv_dfx_count. + + " dxf node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_dxf + parent = lo_document ). + + "Conditional formatting font style correction by Alessandro Iannacci START + lv_index = ls_cellxfs-fontid + 1. + READ TABLE lt_fonts INTO ls_font INDEX lv_index. + IF ls_font IS NOT INITIAL. + lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font + parent = lo_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_b + parent = lo_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_i + parent = lo_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_u + parent = lo_document ). + lv_value = ls_font-underline_mode. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_val + value = lv_value ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_font-strikethrough EQ abap_true. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_strike + parent = lo_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + "color + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_element_font + is_color = ls_font-color ). + lo_sub_element->append_child( new_child = lo_element_font ). + ENDIF. + "---Conditional formatting font style correction by Alessandro Iannacci END + + + READ TABLE lt_fills INTO ls_fill INDEX ls_cellxfs-fillid. + IF ls_fill IS NOT INITIAL. + " fill properties + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-fgcolor + iv_color_elem_name = lc_xml_node_fgcolor ). + + IF ls_fill-fgcolor-rgb IS INITIAL AND + ls_fill-fgcolor-indexed EQ zcl_excel_style_color=>c_indexed_not_set AND + ls_fill-fgcolor-theme EQ zcl_excel_style_color=>c_theme_not_set AND + ls_fill-fgcolor-tint IS INITIAL AND ls_fill-bgcolor-indexed EQ zcl_excel_style_color=>c_indexed_sys_foreground. + + " bgcolor + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-bgcolor + iv_color_elem_name = lc_xml_node_bgcolor ). + + ENDIF. + + lo_element_fill->append_child( new_child = lo_sub_element_2 ). "pattern + + lo_sub_element->append_child( new_child = lo_element_fill ). + ENDIF. + ENDIF. + + lo_element->append_child( new_child = lo_sub_element ). + WHEN zcl_excel_style_conditional=>c_rule_expression. + "if style defined + ls_expression = lo_style_conditional->mode_expression. + IF ls_expression-cell_style IS INITIAL. + CONTINUE. + ENDIF. + READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = ls_expression-cell_style. + ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0 + READ TABLE lt_cellxfs INTO ls_cellxfs INDEX ls_styles_mapping-style. + ADD 1 TO ls_cellxfs-fillid. " the numbering starts from 0 + + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY style = ls_styles_mapping-style. + IF sy-subrc EQ 0. + ls_style_cond_mapping-guid = ls_expression-cell_style. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ELSE. + ls_style_cond_mapping-guid = ls_expression-cell_style. + ls_style_cond_mapping-style = ls_styles_mapping-style. + ls_style_cond_mapping-dxf = lv_dfx_count. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ADD 1 TO lv_dfx_count. + + " dxf node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_dxf + parent = lo_document ). + + READ TABLE lt_fills INTO ls_fill INDEX ls_cellxfs-fillid. + IF ls_fill IS NOT INITIAL. + " fill properties + lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill + parent = lo_document ). + "pattern + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_patternfill + parent = lo_document ). + lv_value = ls_fill-filltype. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_patterntype + value = lv_value ). + " fgcolor + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-fgcolor + iv_color_elem_name = lc_xml_node_fgcolor ). + + IF ls_fill-fgcolor-rgb IS INITIAL AND + ls_fill-fgcolor-indexed EQ zcl_excel_style_color=>c_indexed_not_set AND + ls_fill-fgcolor-theme EQ zcl_excel_style_color=>c_theme_not_set AND + ls_fill-fgcolor-tint IS INITIAL AND ls_fill-bgcolor-indexed EQ zcl_excel_style_color=>c_indexed_sys_foreground. + + " bgcolor + create_xl_styles_color_node( + io_document = lo_document + io_parent = lo_sub_element_2 + is_color = ls_fill-bgcolor + iv_color_elem_name = lc_xml_node_bgcolor ). + + ENDIF. + + lo_element_fill->append_child( new_child = lo_sub_element_2 ). "pattern + + lo_sub_element->append_child( new_child = lo_element_fill ). + ENDIF. + ENDIF. + + lo_element->append_child( new_child = lo_sub_element ). + WHEN OTHERS. + CONTINUE. + ENDCASE. + ENDWHILE. + ENDWHILE. + + lv_value = lv_dfx_count. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + + " tableStyles node + lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_count + value = '0' ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle + value = zcl_excel_table=>builtinstyle_medium9 ). + lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle + value = zcl_excel_table=>builtinstyle_pivot_light16 ). + lo_element_root->append_child( new_child = lo_element ). + + "write legacy color palette in case any indexed color was changed + IF excel->legacy_palette->is_modified( ) = abap_true. + lo_element = lo_document->create_simple_element( name = lc_xml_node_colors + parent = lo_document ). + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_indexedcolors + parent = lo_document ). + lo_element->append_child( new_child = lo_sub_element ). + + lt_colors = excel->legacy_palette->get_colors( ). + LOOP AT lt_colors INTO ls_color. + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_rgbcolor + parent = lo_document ). + lv_value = ls_color. + lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + lo_sub_element->append_child( new_child = lo_sub_element_2 ). + ENDLOOP. + + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + + + + METHOD create_xl_styles_color_node. + DATA: lo_sub_element TYPE REF TO if_ixml_element, + lv_value TYPE string. + + CONSTANTS: lc_xml_attr_theme TYPE string VALUE 'theme', + lc_xml_attr_rgb TYPE string VALUE 'rgb', + lc_xml_attr_indexed TYPE string VALUE 'indexed', + lc_xml_attr_tint TYPE string VALUE 'tint'. + + "add node only if at least one attribute is set + CHECK is_color-rgb IS NOT INITIAL OR + is_color-indexed <> zcl_excel_style_color=>c_indexed_not_set OR + is_color-theme <> zcl_excel_style_color=>c_theme_not_set OR + is_color-tint IS NOT INITIAL. + + lo_sub_element = io_document->create_simple_element( + name = iv_color_elem_name + parent = io_parent ). + + IF is_color-rgb IS NOT INITIAL. + lv_value = is_color-rgb. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb + value = lv_value ). + ENDIF. + + IF is_color-indexed <> zcl_excel_style_color=>c_indexed_not_set. + lv_value = zcl_excel_common=>number_to_excel_string( is_color-indexed ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_indexed + value = lv_value ). + ENDIF. + + IF is_color-theme <> zcl_excel_style_color=>c_theme_not_set. + lv_value = zcl_excel_common=>number_to_excel_string( is_color-theme ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_theme + value = lv_value ). + ENDIF. + + IF is_color-tint IS NOT INITIAL. + lv_value = zcl_excel_common=>number_to_excel_string( is_color-tint ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_tint + value = lv_value ). + ENDIF. + + io_parent->append_child( new_child = lo_sub_element ). +ENDMETHOD. + + + + + METHOD create_xl_table. + + DATA: lc_xml_node_table TYPE string VALUE 'table', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_display_name TYPE string VALUE 'displayName', + lc_xml_attr_ref TYPE string VALUE 'ref', + lc_xml_attr_totals TYPE string VALUE 'totalsRowShown', + " Node namespace + lc_xml_node_table_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element2 TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + + lv_table_name TYPE string, + lv_id TYPE i, + lv_match TYPE i, + lv_syindex TYPE char3, + lv_ref TYPE string, + lv_value TYPE string, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lv_num_columns TYPE i, + ls_fieldcat TYPE zexcel_s_fieldcatalog. + + +********************************************************************** +* STEP 1: Create xml + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node table + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table + parent = lo_document ). + + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_table_ns ). + + lv_id = io_table->get_id( ). + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_id ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_id + value = lv_value ). + + FIND ALL OCCURRENCES OF REGEX '[^_a-zA-Z0-9]' IN io_table->settings-table_name IGNORING CASE MATCH COUNT lv_match. + IF io_table->settings-table_name IS NOT INITIAL AND lv_match EQ 0. + lv_table_name = io_table->settings-table_name. + ELSE. + lv_table_name = io_table->get_name( ). + ENDIF. + lo_element_root->set_attribute_ns( name = lc_xml_attr_name + value = lv_table_name ). + + lo_element_root->set_attribute_ns( name = lc_xml_attr_display_name + value = lv_table_name ). + + lv_ref = io_table->get_reference( ). + lo_element_root->set_attribute_ns( name = lc_xml_attr_ref + value = lv_ref ). + IF io_table->has_totals( ) = abap_true. + lo_element_root->set_attribute_ns( name = 'totalsRowCount' + value = '1' ). + ELSE. + lo_element_root->set_attribute_ns( name = lc_xml_attr_totals + value = '0' ). + ENDIF. + +********************************************************************** +* STEP 4: Create subnodes + + " autoFilter + IF io_table->settings-nofilters EQ abap_false. + lo_element = lo_document->create_simple_element( name = 'autoFilter' + parent = lo_document ). + + lv_ref = io_table->get_reference( ip_include_totals_row = abap_false ). + lo_element->set_attribute_ns( name = 'ref' + value = lv_ref ). + + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + "columns + lo_element = lo_document->create_simple_element( name = 'tableColumns' + parent = lo_document ). + +* lo_columns = io_table->get_columns( ). + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + ADD 1 TO lv_num_columns. + ENDLOOP. + + lv_value = lv_num_columns. + CONDENSE lv_value. + lo_element->set_attribute_ns( name = 'count' + value = lv_value ). + + lo_element_root->append_child( new_child = lo_element ). + + LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. + lo_element2 = lo_document->create_simple_element_ns( name = 'tableColumn' + parent = lo_element ). + + lv_value = ls_fieldcat-position. + SHIFT lv_value LEFT DELETING LEADING '0'. + lo_element2->set_attribute_ns( name = 'id' + value = lv_value ). + lv_value = ls_fieldcat-scrtext_l. + lo_element2->set_attribute_ns( name = 'name' + value = lv_value ). + + IF ls_fieldcat-totals_function IS NOT INITIAL. + lo_element2->set_attribute_ns( name = 'totalsRowFunction' + value = ls_fieldcat-totals_function ). + ENDIF. + + lo_element->append_child( new_child = lo_element2 ). + ENDLOOP. + + + lo_element = lo_document->create_simple_element( name = 'tableStyleInfo' + parent = lo_element_root ). + + lo_element->set_attribute_ns( name = 'name' + value = io_table->settings-table_style ). + + lo_element->set_attribute_ns( name = 'showFirstColumn' + value = '0' ). + + lo_element->set_attribute_ns( name = 'showLastColumn' + value = '0' ). + + IF io_table->settings-show_row_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showRowStripes' + value = lv_value ). + + IF io_table->settings-show_column_stripes = abap_true. + lv_value = '1'. + ELSE. + lv_value = '0'. + ENDIF. + + lo_element->set_attribute_ns( name = 'showColumnStripes' + value = lv_value ). + + lo_element_root->append_child( new_child = lo_element ). +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + +ENDMETHOD. + + + + method CREATE_XL_THEME. + + +* @TODO * + + DATA: lv_xl_theme TYPE string, + lv_xl_theme_01 TYPE string, + lv_xl_theme_02 TYPE string, + lv_xl_theme_03 TYPE string, + lv_xl_theme_04 TYPE string, + lv_xl_theme_05 TYPE string, + lv_xl_theme_06 TYPE string, + lv_xl_theme_07 TYPE string, + lv_xl_theme_08 TYPE string, + lv_xl_theme_09 TYPE string, + lv_xl_theme_10 TYPE string, + lv_xl_theme_11 TYPE string, + lv_xl_theme_12 TYPE string, + lv_xl_theme_13 TYPE string, + lv_xl_theme_14 TYPE string, + lv_xl_theme_15 TYPE string, + lv_xl_theme_16 TYPE string, + lv_xl_theme_17 TYPE string, + lv_xl_theme_18 TYPE string, + lv_xl_theme_19 TYPE string, + lv_xl_theme_20 TYPE string, + lv_xl_theme_21 TYPE string, + lv_xl_theme_22 TYPE string, + lv_xl_theme_23 TYPE string, + lv_xl_theme_24 TYPE string, + lv_xl_theme_25 TYPE string, + lv_xl_theme_26 TYPE string, + lv_xl_theme_27 TYPE string, + lv_xl_theme_28 TYPE string, + lv_xl_theme_29 TYPE string, + lv_xl_theme_30 TYPE string, + lv_xl_theme_31 TYPE string, + lv_xl_theme_32 TYPE string. + + lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. + lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. + lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. + lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. + lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. + lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. + lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. + lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. + lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. + lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. + lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. + lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. + lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. + lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. + lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. + lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. + lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. + lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. + lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. + lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. + lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. + lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. + lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. + lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. + lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. + lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. + lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. + lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. + + + CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 + lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 + lv_xl_theme_31 lv_xl_theme_32 + INTO lv_xl_theme SEPARATED BY space. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + text = lv_xl_theme + IMPORTING + buffer = ep_content. + + + endmethod. + + + + method CREATE_XL_WORKBOOK. +*--------------------------------------------------------------------* +* issue #230 - Pimp my Code +* - Stefan Schmöcker, (done) 2012-11-07 +* - ... +* changes: aligning code +* adding comments to explain what we are trying to achieve +*--------------------------------------------------------------------* +* issue#235 - repeat rows/columns +* - Stefan Schmöcker, 2012-12-01 +* changes: correction of pointer to localSheetId +*--------------------------------------------------------------------* + +** Constant node name + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + lc_xml_node_workbookprotection TYPE string VALUE 'workbookProtection', + lc_xml_node_definednames TYPE string VALUE 'definedNames', + lc_xml_node_definedname TYPE string VALUE 'definedName', + " Node attributes + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_activetab TYPE string VALUE 'activeTab', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_state TYPE string VALUE 'state', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + lc_xml_attr_lockrevision TYPE string VALUE 'lockRevision', + lc_xml_attr_lockstructure TYPE string VALUE 'lockStructure', + lc_xml_attr_lockwindows TYPE string VALUE 'lockWindows', + lc_xml_attr_revisionspassword TYPE string VALUE 'revisionsPassword', + lc_xml_attr_workbookpassword TYPE string VALUE 'workbookPassword', + lc_xml_attr_hidden TYPE string VALUE 'hidden', + lc_xml_attr_localsheetid TYPE string VALUE 'localSheetId', + " Node namespace + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_range TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_iterator_range TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_autofilters TYPE REF TO zcl_excel_autofilters, + lo_autofilter TYPE REF TO zcl_excel_autofilter. + + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string, + l_guid TYPE uuid, + lv_active_sheet TYPE zexcel_active_worksheet. + +********************************************************************** +* STEP 1: Create [Content_Types].xml into the root of the ZIP + lo_ixml = cl_ixml=>create( ). + +********************************************************************** +* STEP 2: Set document attributes + lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian + character_set = 'utf-8' ). + lo_document = lo_ixml->create_document( ). + lo_document->set_encoding( lo_encoding ). + lo_document->set_standalone( abap_true ). + +********************************************************************** +* STEP 3: Create main node + lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook + parent = lo_document ). + lo_element_root->set_attribute_ns( name = 'xmlns' + value = lc_xml_node_ns ). + lo_element_root->set_attribute_ns( name = 'xmlns:r' + value = lc_xml_node_r_ns ). + +********************************************************************** +* STEP 4: Create subnode + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_appname + value = 'xl' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lastedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited + value = '4' ). + lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild + value = '4506' ). + lo_element_root->append_child( new_child = lo_element ). + + " fileVersion node + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_themeversion + value = '124226' ). + lo_element_root->append_child( new_child = lo_element ). + + " workbookProtection node + IF me->excel->zif_excel_book_protection~protected EQ abap_true. + lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookprotection + parent = lo_document ). + MOVE me->excel->zif_excel_book_protection~workbookpassword TO lv_value. + IF lv_value IS NOT INITIAL. + lo_element->set_attribute_ns( name = lc_xml_attr_workbookpassword + value = lv_value ). + ENDIF. + MOVE me->excel->zif_excel_book_protection~revisionspassword TO lv_value. + IF lv_value IS NOT INITIAL. + lo_element->set_attribute_ns( name = lc_xml_attr_revisionspassword + value = lv_value ). + ENDIF. + MOVE me->excel->zif_excel_book_protection~lockrevision TO lv_value. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_lockrevision + value = lv_value ). + MOVE me->excel->zif_excel_book_protection~lockstructure TO lv_value. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_lockstructure + value = lv_value ). + MOVE me->excel->zif_excel_book_protection~lockwindows TO lv_value. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_lockwindows + value = lv_value ). + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + + " bookviews node + lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews + parent = lo_document ). + " bookview node + lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview + parent = lo_document ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow + value = '120' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth + value = '19035' ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight + value = '8445' ). + " Set Active Sheet + lv_active_sheet = excel->get_active_sheet_index( ). + IF lv_active_sheet > 1. + lv_active_sheet = lv_active_sheet - 1. + lv_value = lv_active_sheet. + CONDENSE lv_value. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_activetab + value = lv_value ). + ENDIF. + lo_element->append_child( new_child = lo_sub_element )." bookview node + lo_element_root->append_child( new_child = lo_element )." bookviews node + + " sheets node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets + parent = lo_document ). + lo_iterator = excel->get_worksheets_iterator( ). + + " ranges node + lo_element_range = lo_document->create_simple_element( name = lc_xml_node_definednames " issue 163 + + parent = lo_document ). " issue 163 + + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " sheet node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet + parent = lo_document ). + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_syindex = sy-index. " question by Stefan Schmöcker 2012-12-02: sy-index seems to do the job - but is it proven to work or purely coincedence + lv_value = lo_worksheet->get_title( ). + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid + value = lv_syindex ). + IF lo_worksheet->zif_excel_sheet_properties~hidden EQ zif_excel_sheet_properties=>c_hidden. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_state + value = 'hidden' ). + ELSEIF lo_worksheet->zif_excel_sheet_properties~hidden EQ zif_excel_sheet_properties=>c_veryhidden. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_state + value = 'veryHidden' ). + ENDIF. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_id + prefix = lc_r_ns + value = lv_xml_node_ridx_id ). + lo_element->append_child( new_child = lo_sub_element ). " sheet node + + " issue 163 >>> + lo_iterator_range = lo_worksheet->get_ranges_iterator( ). + +*--------------------------------------------------------------------* +* Defined names sheetlocal: Ranges, Repeat rows and columns +*--------------------------------------------------------------------* + WHILE lo_iterator_range->if_object_collection_iterator~has_next( ) EQ abap_true. + " range node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedname + parent = lo_document ). + lo_range ?= lo_iterator_range->if_object_collection_iterator~get_next( ). + lv_value = lo_range->name. + + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + +* lo_sub_element->set_attribute_ns( name = lc_xml_attr_localsheetid "del #235 Repeat rows/cols - EXCEL starts couting from zero +* value = lv_xml_node_ridx_id ). "del #235 Repeat rows/cols - and needs absolute referencing to localSheetId + lv_value = lv_syindex - 1. "ins #235 Repeat rows/cols + CONDENSE lv_value NO-GAPS. "ins #235 Repeat rows/cols + lo_sub_element->set_attribute_ns( name = lc_xml_attr_localsheetid + value = lv_value ). + + lv_value = lo_range->get_value( ). + lo_sub_element->set_value( value = lv_value ). + lo_element_range->append_child( new_child = lo_sub_element ). " range node + + ENDWHILE. + " issue 163 <<< + + ENDWHILE. + lo_element_root->append_child( new_child = lo_element )." sheets node + + +*--------------------------------------------------------------------* +* Defined names workbookgolbal: Ranges +*--------------------------------------------------------------------* +* " ranges node +* lo_element = lo_document->create_simple_element( name = lc_xml_node_definednames " issue 163 - +* parent = lo_document ). " issue 163 - + lo_iterator = excel->get_ranges_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + " range node + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedname + parent = lo_document ). + lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_value = lo_range->name. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lv_value = lo_range->get_value( ). + lo_sub_element->set_value( value = lv_value ). + lo_element_range->append_child( new_child = lo_sub_element ). " range node + + ENDWHILE. + +*--------------------------------------------------------------------* +* Defined names - Autofilters ( also sheetlocal ) +*--------------------------------------------------------------------* + lo_autofilters = excel->get_autofilters_reference( ). + IF lo_autofilters->is_empty( ) = abap_false. + lo_iterator = excel->get_worksheets_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + lv_syindex = sy-index - 1 . + l_guid = lo_worksheet->get_guid( ). + lo_autofilter = lo_autofilters->get( i_sheet_guid = l_guid ) . + IF lo_autofilter IS BOUND. + lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedname + parent = lo_document ). + lv_value = lo_autofilters->c_autofilter. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_name + value = lv_value ). + lv_value = lv_syindex. + CONDENSE lv_value NO-GAPS. + lo_sub_element->set_attribute_ns( name = lc_xml_attr_localsheetid + value = lv_value ). + lv_value = '1'. " Always hidden + lo_sub_element->set_attribute_ns( name = lc_xml_attr_hidden + value = lv_value ). + lv_value = lo_autofilter->get_filter_reference( ). + lo_sub_element->set_value( value = lv_value ). + lo_element_range->append_child( new_child = lo_sub_element ). " range node + ENDIF. + + ENDWHILE. + ENDIF. + lo_element_root->append_child( new_child = lo_element_range ). " ranges node + + + " calcPr node + lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_calcid + value = '125725' ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 5: Create xstring stream + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + + + method FLAG2BOOL. + + + IF ip_flag EQ abap_true. + ep_boolean = 'true'. + ELSE. + ep_boolean = 'false'. + ENDIF. + endmethod. + + + + + METHOD get_shared_string_index. + + + DATA ls_shared_string TYPE zexcel_s_shared_string. + + READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value BINARY SEARCH. + ep_index = ls_shared_string-string_no. + +ENDMETHOD. + + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + method ZIF_EXCEL_WRITER~WRITE_FILE. + me->excel = io_excel. + ep_file = me->create( ). + endmethod. + + + + method CREATE. + +* .csv format with ; delimiter + + ep_excel = me->CREATE_CSV( ). + + endmethod. + + + + method CREATE_CSV. + + TYPES: BEGIN OF lty_format, + cmpname TYPE SEOCMPNAME, + attvalue TYPE SEOVALUE, + END OF lty_format. + DATA: lt_format TYPE STANDARD TABLE OF lty_format, + ls_format LIKE LINE OF lt_format, + lv_date TYPE DATS, + lv_tmp TYPE string, + lv_time TYPE CHAR08. + + DATA: lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + lv_row TYPE sytabix, + lv_col TYPE sytabix, + lv_string TYPE string, + lc_value TYPE string, + lv_attrname TYPE SEOCMPNAME. + + DATA: ls_numfmt TYPE zexcel_s_style_numfmt, + lo_style TYPE REF TO zcl_excel_style. + + FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + +* --- Retrieve supported cell format + REFRESH lt_format. + SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_format + FROM seocompodf + WHERE clsname = 'ZCL_EXCEL_STYLE_NUMBER_FORMAT' + AND typtype = 1 + AND type = 'ZEXCEL_NUMBER_FORMAT'. + +* --- Retrieve SAP date format + CLEAR ls_format. + SELECT ddtext INTO ls_format-attvalue FROM dd07t WHERE domname = 'XUDATFM' + AND ddlanguage = sy-langu. + ls_format-cmpname = 'DATE'. + CONDENSE ls_format-attvalue. + CONCATENATE '''' ls_format-attvalue '''' INTO ls_format-attvalue. + APPEND ls_format TO lt_format. + ENDSELECT. + + + LOOP AT lt_format INTO ls_format. + TRANSLATE ls_format-attvalue TO UPPER CASE. + MODIFY lt_format FROM ls_format. + ENDLOOP. + + +* STEP 1: Collect strings from the first worksheet + lo_iterator = excel->get_worksheets_iterator( ). + data: current_worksheet_title type ZEXCEL_SHEET_TITLE. + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + + IF worksheet_name IS NOT INITIAL. + current_worksheet_title = lo_worksheet->get_title( ). + CHECK current_worksheet_title = worksheet_name. + ELSE. + IF worksheet_index IS INITIAL. + worksheet_index = 1. + ENDIF. + CHECK worksheet_index = sy-index. + ENDIF. + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + EXIT. " Take first worksheet only + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content + + SORT lt_cell_data BY cell_row + cell_column. + lv_row = 1. + lv_col = 1. + CLEAR lv_string. + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. + +* --- Retrieve Cell Style format and data type + CLEAR ls_numfmt. + IF <fs_sheet_content>-data_type IS INITIAL AND <fs_sheet_content>-cell_style IS NOT INITIAL. + lo_iterator = excel->get_styles_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_style ?= lo_iterator->if_object_collection_iterator~get_next( ). + CHECK lo_style->get_guid( ) = <fs_sheet_content>-cell_style. + ls_numfmt = lo_style->number_format->get_structure( ). + EXIT. + ENDWHILE. + ENDIF. + IF <fs_sheet_content>-data_type IS INITIAL AND ls_numfmt IS NOT INITIAL. + " determine data-type + CLEAR lv_attrname. + CONCATENATE '''' ls_numfmt-NUMFMT '''' INTO ls_numfmt-NUMFMT. + TRANSLATE ls_numfmt-numfmt TO UPPER CASE. + READ TABLE lt_format INTO ls_format WITH KEY attvalue = ls_numfmt-NUMFMT. + IF sy-subrc = 0. + lv_attrname = ls_format-cmpname. + ENDIF. + + IF lv_attrname IS NOT INITIAL. + FIND FIRST OCCURRENCE OF 'DATETIME' IN lv_attrname. + IF sy-subrc = 0. + <fs_sheet_content>-data_type = 'd'. + ELSE. + FIND FIRST OCCURRENCE OF 'TIME' IN lv_attrname. + IF sy-subrc = 0. + <fs_sheet_content>-data_type = 't'. + ELSE. + FIND FIRST OCCURRENCE OF 'DATE' IN lv_attrname. + IF sy-subrc = 0. + <fs_sheet_content>-data_type = 'd'. + ELSE. + FIND FIRST OCCURRENCE OF 'CURRENCY' IN lv_attrname. + IF sy-subrc = 0. + <fs_sheet_content>-data_type = 'n'. + ELSE. + FIND FIRST OCCURRENCE OF 'NUMBER' IN lv_attrname. + IF sy-subrc = 0. + <fs_sheet_content>-data_type = 'n'. + ELSE. + FIND FIRST OCCURRENCE OF 'PERCENTAGE' IN lv_attrname. + IF sy-subrc = 0. + <fs_sheet_content>-data_type = 'n'. + ENDIF. " Purcentage + ENDIF. " Number + ENDIF. " Currency + ENDIF. " Date + ENDIF. " TIME + ENDIF. " DATETIME + ENDIF. " lv_attrname IS NOT INITIAL. + ENDIF. " <fs_sheet_content>-data_type IS INITIAL AND ls_numfmt IS NOT INITIAL. + +* --- Add empty rows + WHILE lv_row < <fs_sheet_content>-cell_row. +* CONCATENATE lv_string cl_abap_char_utilities=>newline INTO lv_string. +* CONCATENATE lv_string cl_abap_char_utilities=>cr_lf INTO lv_string. + CONCATENATE lv_string zcl_excel_writer_csv=>eol INTO lv_string. + lv_row = lv_row + 1. + lv_col = 1. + ENDWHILE. + +* --- Add empty columns + WHILE lv_col < <fs_sheet_content>-cell_column. +* CONCATENATE lv_string ';' INTO lv_string. + CONCATENATE lv_string zcl_excel_writer_csv=>delimiter INTO lv_string. + lv_col = lv_col + 1. + ENDWHILE. + +* ----- Use format to determine the data type and display format. + CASE <fs_sheet_content>-data_type. +* WHEN 'n' OR 'N'. +* lc_value = zcl_excel_common=>excel_number_to_string( ip_value = <fs_sheet_content>-cell_value ). + + WHEN 'd' OR 'D'. + lc_value = zcl_excel_common=>excel_string_to_date( ip_value = <fs_sheet_content>-cell_value ). + TRY. + lv_date = lc_value. + CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL' + EXPORTING + DATE_INTERNAL = lv_date + IMPORTING + DATE_EXTERNAL = lv_tmp + EXCEPTIONS + DATE_INTERNAL_IS_INVALID = 1 + OTHERS = 2 + . + IF SY-SUBRC = 0. + lc_value = lv_tmp. + ENDIF. + + CATCH CX_SY_CONVERSION_NO_NUMBER. + + ENDTRY. + + WHEN 't' OR 'T'. + lc_value = zcl_excel_common=>excel_string_to_time( ip_value = <fs_sheet_content>-cell_value ). + write lc_value to lv_time USING EDIT MASK '__:__:__'. + lc_value = lv_time. + WHEN OTHERS. + lc_value = <fs_sheet_content>-cell_value. + + ENDCASE. + +* REPLACE ALL OCCURRENCES OF '"' in lc_value with '""'. + CONCATENATE zcl_excel_writer_csv=>enclosure zcl_excel_writer_csv=>enclosure INTO lv_tmp. + CONDENSE lv_tmp. + REPLACE ALL OCCURRENCES OF zcl_excel_writer_csv=>enclosure in lc_value with lv_tmp. + +* FIND FIRST OCCURRENCE OF ';' IN lc_value. + FIND FIRST OCCURRENCE OF zcl_excel_writer_csv=>delimiter IN lc_value. + IF sy-subrc = 0. + CONCATENATE lv_string zcl_excel_writer_csv=>enclosure lc_value zcl_excel_writer_csv=>enclosure INTO lv_string. + ELSE. + CONCATENATE lv_string lc_value INTO lv_string. + ENDIF. + + ENDLOOP. " AT lt_cell_data + + CLEAR ep_content. + + CALL FUNCTION 'SCMS_STRING_TO_XSTRING' + EXPORTING + TEXT = lv_string +* MIMETYPE = ' ' +* ENCODING = + IMPORTING + BUFFER = ep_content + EXCEPTIONS + FAILED = 1 + OTHERS = 2 + . + + endmethod. + + + + method SET_ACTIVE_SHEET_INDEX. + CLEAR WORKSHEET_NAME. + WORKSHEET_INDEX = i_active_worksheet. + endmethod. + + + + method SET_ACTIVE_SHEET_INDEX_BY_NAME. + CLEAR WORKSHEET_INDEX. + WORKSHEET_NAME = i_worksheet_name. + endmethod. + + + + method SET_DELIMITER. + delimiter = ip_value. + endmethod. + + + + method SET_ENCLOSURE. + zcl_excel_writer_csv=>enclosure = ip_value. + endmethod. + + + + method SET_ENDOFLINE. + zcl_excel_writer_csv=>eol = ip_value. + endmethod. + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + METHOD add_further_data_to_zip. + + super->add_further_data_to_zip( io_zip = io_zip ). + +* Add vbaProject.bin to zip + io_zip->add( name = me->c_xl_vbaproject + content = me->excel->zif_excel_book_vba_project~vbaproject ). + +ENDMETHOD. + + + method CREATE. + + +* Office 2007 file format is a cab of several xml files with extension .xlsx + + DATA: lo_zip TYPE REF TO cl_abap_zip, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_active_worksheet TYPE REF TO zcl_excel_worksheet, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_nested_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_drawings TYPE REF TO zcl_excel_drawings. + + DATA: lv_content TYPE xstring, + lv_active TYPE flag, + lv_xl_sheet TYPE string, + lv_xl_sheet_rels TYPE string, + lv_xl_drawing TYPE string, + lv_xl_drawing_rels TYPE string, + lv_syindex TYPE string, + lv_value TYPE string, + lv_drawing_index TYPE i. + +********************************************************************** +* Start of insertion # issue 139 - Dateretention of cellstyles + me->excel->add_static_styles( ). +* End of insertion # issue 139 - Dateretention of cellstyles + +********************************************************************** +* STEP 1: Create archive object file (ZIP) + CREATE OBJECT lo_zip. + +********************************************************************** +* STEP 2: Add [Content_Types].xml to zip + lv_content = me->create_content_types( ). + lo_zip->add( name = me->c_content_types + content = lv_content ). + +********************************************************************** +* STEP 3: Add _rels/.rels to zip + lv_content = me->create_relationships( ). + lo_zip->add( name = me->c_relationships + content = lv_content ). + +********************************************************************** +* STEP 4: Add docProps/app.xml to zip + lv_content = me->create_docprops_app( ). + lo_zip->add( name = me->c_docprops_app + content = lv_content ). + +********************************************************************** +* STEP 5: Add docProps/core.xml to zip + lv_content = me->create_docprops_core( ). + lo_zip->add( name = me->c_docprops_core + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_relationships( ). + lo_zip->add( name = me->c_xl_relationships + content = lv_content ). + +********************************************************************** +* STEP 6: Add xl/_rels/workbook.xml.rels to zip + lv_content = me->create_xl_theme( ). + lo_zip->add( name = me->c_xl_theme + content = lv_content ). + +********************************************************************** +* STEP 7: Add xl/workbook.xml to zip + lv_content = me->create_xl_workbook( ). + lo_zip->add( name = me->c_xl_workbook + content = lv_content ). + +********************************************************************** +* STEP 8: Add xl/workbook.xml to zip +* lv_content = me->create_xl_styles_static( ). + lv_content = me->create_xl_styles( ). + lo_zip->add( name = me->c_xl_styles + content = lv_content ). + +********************************************************************** +* STEP 9: Add sharedStrings.xml to zip + lv_content = me->create_xl_sharedstrings( ). + lo_zip->add( name = me->c_xl_sharedstrings + content = lv_content ). + +********************************************************************** +* STEP 10: Add sheet#.xml and drawing#.xml to zip + lo_iterator = me->excel->get_worksheets_iterator( ). + lo_active_worksheet = me->excel->get_active_worksheet( ). + lv_drawing_index = 1. + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). + lv_active = abap_true. + ELSE. + lv_active = abap_false. + ENDIF. + + lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet + iv_active = lv_active ). + lv_xl_sheet = me->c_xl_sheet. + MOVE sy-index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet + content = lv_content ). + + lv_xl_sheet_rels = me->c_xl_sheet_rels. + lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet + iv_drawing_index = lv_drawing_index ). + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_sheet_rels + content = lv_content ). + + lo_nested_iterator = lo_worksheet->get_tables_iterator( ). + + WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). + lv_content = me->create_xl_table( lo_table ). + + lv_value = lo_table->get_name( ). + CONCATENATE 'xl/tables/' lv_value '.xml' INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +* Add drawings ********************************** + lo_drawings = lo_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + MOVE lv_drawing_index TO lv_syindex. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + + lv_content = me->create_xl_drawings( lo_worksheet ). + lv_xl_drawing = me->c_xl_drawings. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_syindex. + lo_zip->add( name = lv_xl_drawing + content = lv_content ). + + lv_content = me->create_xl_drawings_rels( lo_worksheet ). + lv_xl_drawing_rels = me->c_xl_drawings_rels. + REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_syindex. + lo_zip->add( name = lv_xl_drawing_rels + content = lv_content ). + ADD 1 TO lv_drawing_index. + ENDIF. + ENDWHILE. + +********************************************************************** +* STEP 11: Add media + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_content = lo_drawing->get_media( ). + lv_value = lo_drawing->get_media_name( ). + CONCATENATE 'xl/media/' lv_value INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 12: Add charts + lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lv_content = lo_drawing->get_media( ). + lv_value = lo_drawing->get_media_name( ). + CONCATENATE 'xl/charts/' lv_value INTO lv_value. + lo_zip->add( name = lv_value + content = lv_content ). + ENDWHILE. + +********************************************************************** +* STEP 9: Add vbaProject.bin to zip + lo_zip->add( name = me->c_xl_vbaproject + content = me->excel->zif_excel_book_vba_project~vbaproject ). + +********************************************************************** +* STEP 12: Create the final zip + ep_excel = lo_zip->save( ). + + endmethod. + + + method CREATE_CONTENT_TYPES. +** Constant node name + DATA: lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.ms-excel.sheet.macroEnabled.main+xml', + lc_xml_node_default TYPE string VALUE 'Default', + " Node attributes + lc_xml_attr_partname TYPE string VALUE 'PartName', + lc_xml_attr_extension TYPE string VALUE 'Extension', + lc_xml_attr_contenttype TYPE string VALUE 'ContentType', + lc_xml_attr_codename TYPE string VALUE 'codeName', + lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', + lc_xml_node_bin_ext TYPE string VALUE 'bin', + lc_xml_node_bin_ct TYPE string VALUE 'application/vnd.ms-office.vbaProject'. + + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_document_xml TYPE REF TO cl_xml_document, + lo_element_root TYPE REF TO if_ixml_node, + lo_element TYPE REF TO if_ixml_element, + lo_collection TYPE REF TO if_ixml_node_collection, + lo_iterator TYPE REF TO if_ixml_node_iterator, + lo_node TYPE REF TO if_ixml_node, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_subrc TYPE sysubrc, + lv_contenttype TYPE string, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 3: Create standard contentType + ep_content = super->create_content_types( ). + +********************************************************************** +* STEP 2: modify XML adding the extension bin definition + + CREATE OBJECT lo_document_xml. + lv_subrc = lo_document_xml->parse_xstring( ep_content ). + + lo_document ?= lo_document_xml->m_document. + lo_element_root = lo_document->if_ixml_node~get_first_child( ). + + " extension node + lo_element = lo_document->create_simple_element( name = lc_xml_node_default + parent = lo_document ). + lo_element->set_attribute_ns( name = lc_xml_attr_extension + value = lc_xml_node_bin_ext ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_bin_ct ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 3: modify XML changing the contentType of node Override /xl/workbook.xml + + lo_collection = lo_document->get_elements_by_tag_name( 'Override' ). + lo_iterator = lo_collection->create_iterator( ). + lo_element ?= lo_iterator->get_next( ). + WHILE lo_element IS BOUND. + lv_contenttype = lo_element->get_attribute_ns( lc_xml_attr_partname ). + IF lv_contenttype EQ lc_xml_node_workb_pn. + lo_element->remove_attribute_ns( lc_xml_attr_contenttype ). + lo_element->set_attribute_ns( name = lc_xml_attr_contenttype + value = lc_xml_node_workb_ct ). + EXIT. + ENDIF. + lo_element ?= lo_iterator->get_next( ). + ENDWHILE. + +********************************************************************** +* STEP 3: Create xstring stream + CLEAR ep_content. + lo_ixml = cl_ixml=>create( ). + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + method CREATE_XL_RELATIONSHIPS. + +** Constant node name + DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', + lc_xml_node_relationship TYPE string VALUE 'Relationship', + " Node attributes + lc_xml_attr_id TYPE string VALUE 'Id', + lc_xml_attr_type TYPE string VALUE 'Type', + lc_xml_attr_target TYPE string VALUE 'Target', + " Node id + lc_xml_node_ridx_id TYPE string VALUE 'rId#', + " Node type + lc_xml_node_rid_vba_tp TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', + " Node target + lc_xml_node_rid_vba_tg TYPE string VALUE 'vbaProject.bin'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_document_xml TYPE REF TO cl_xml_document, + lo_element_root TYPE REF TO if_ixml_node, + lo_element TYPE REF TO if_ixml_element, + lo_node TYPE REF TO if_ixml_node, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_xml_node_ridx_tg TYPE string, + lv_xml_node_ridx_id TYPE string, + lv_size TYPE i, + lv_subrc TYPE sysubrc, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 3: Create standard relationship + ep_content = super->create_xl_relationships( ). + +********************************************************************** +* STEP 2: modify XML adding the vbaProject relation + + CREATE OBJECT lo_document_xml. + lv_subrc = lo_document_xml->parse_xstring( ep_content ). + + lo_document ?= lo_document_xml->m_document. + lo_element_root = lo_document->if_ixml_node~get_first_child( ). + + + lv_size = excel->get_worksheets_size( ). + + " Relationship node + lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship + parent = lo_document ). + ADD 4 TO lv_size. + lv_syindex = lv_size. + SHIFT lv_syindex RIGHT DELETING TRAILING space. + SHIFT lv_syindex LEFT DELETING LEADING space. + lv_xml_node_ridx_id = lc_xml_node_ridx_id. + REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = lv_xml_node_ridx_id ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_vba_tp ). + lo_element->set_attribute_ns( name = lc_xml_attr_target + value = lc_xml_node_rid_vba_tg ). + lo_element_root->append_child( new_child = lo_element ). + +********************************************************************** +* STEP 3: Create xstring stream + CLEAR ep_content. + lo_ixml = cl_ixml=>create( ). + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + + endmethod. + + + method CREATE_XL_SHEET. + +** Constant node name + DATA: lc_xml_attr_codename TYPE string VALUE 'codeName'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_document_xml TYPE REF TO cl_xml_document, + lo_element_root TYPE REF TO if_ixml_node, + lo_element TYPE REF TO if_ixml_element, + lo_collection TYPE REF TO if_ixml_node_collection, + lo_iterator TYPE REF TO if_ixml_node_iterator, + lo_node TYPE REF TO if_ixml_node, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_subrc TYPE sysubrc, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 3: Create standard relationship + ep_content = super->create_xl_sheet( io_worksheet = io_worksheet + iv_active = iv_active ). + +********************************************************************** +* STEP 2: modify XML adding the vbaProject relation + + CREATE OBJECT lo_document_xml. + lv_subrc = lo_document_xml->parse_xstring( ep_content ). + + lo_document ?= lo_document_xml->m_document. + lo_element_root = lo_document->if_ixml_node~get_first_child( ). + +* lo_collection = lo_document->get_elements_by_tag_name( 'fileVersion' ). +* lo_iterator = lo_collection->create_iterator( ). +* lo_element ?= lo_iterator->get_next( ). +* WHILE lo_element IS BOUND. +* lo_element->set_attribute_ns( name = lc_xml_attr_codename +* value = me->excel->zif_excel_book_vba_project~codename ). +* lo_element ?= lo_iterator->get_next( ). +* ENDWHILE. + + lo_collection = lo_document->get_elements_by_tag_name( 'sheetPr' ). + lo_iterator = lo_collection->create_iterator( ). + lo_element ?= lo_iterator->get_next( ). + WHILE lo_element IS BOUND. + lo_element->set_attribute_ns( name = lc_xml_attr_codename + value = io_worksheet->zif_excel_sheet_vba_project~codename_pr ). + lo_element ?= lo_iterator->get_next( ). + ENDWHILE. + +********************************************************************** +* STEP 3: Create xstring stream + CLEAR ep_content. + lo_ixml = cl_ixml=>create( ). + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + endmethod. + + + method CREATE_XL_WORKBOOK. + +** Constant node name + DATA: lc_xml_attr_codename TYPE string VALUE 'codeName'. + + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_document_xml TYPE REF TO cl_xml_document, + lo_element_root TYPE REF TO if_ixml_node, + lo_element TYPE REF TO if_ixml_element, + lo_collection TYPE REF TO if_ixml_node_collection, + lo_iterator TYPE REF TO if_ixml_node_iterator, + lo_node TYPE REF TO if_ixml_node, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer. + + DATA: lv_subrc TYPE sysubrc, + lv_syindex(2) TYPE c. + +********************************************************************** +* STEP 3: Create standard relationship + ep_content = super->create_xl_workbook( ). + +********************************************************************** +* STEP 2: modify XML adding the vbaProject relation + + CREATE OBJECT lo_document_xml. + lv_subrc = lo_document_xml->parse_xstring( ep_content ). + + lo_document ?= lo_document_xml->m_document. + lo_element_root = lo_document->if_ixml_node~get_first_child( ). + + lo_collection = lo_document->get_elements_by_tag_name( 'fileVersion' ). + lo_iterator = lo_collection->create_iterator( ). + lo_element ?= lo_iterator->get_next( ). + WHILE lo_element IS BOUND. + lo_element->set_attribute_ns( name = lc_xml_attr_codename + value = me->excel->zif_excel_book_vba_project~codename ). + lo_element ?= lo_iterator->get_next( ). + ENDWHILE. + + lo_collection = lo_document->get_elements_by_tag_name( 'workbookPr' ). + lo_iterator = lo_collection->create_iterator( ). + lo_element ?= lo_iterator->get_next( ). + WHILE lo_element IS BOUND. + lo_element->set_attribute_ns( name = lc_xml_attr_codename + value = me->excel->zif_excel_book_vba_project~codename_pr ). + lo_element ?= lo_iterator->get_next( ). + ENDWHILE. + +********************************************************************** +* STEP 3: Create xstring stream + CLEAR ep_content. + lo_ixml = cl_ixml=>create( ). + lo_streamfactory = lo_ixml->create_stream_factory( ). + lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). + lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). + lo_renderer->render( ). + endmethod. + + + + *"* local class implementation for public class +*"* use this source file for the implementation part of +*"* local helper classes + *"* use this source file for any type declarations (class +*"* definitions, interfaces or data types) you need for method +*"* implementation or private method's signature + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + + + + + + method IF_MESSAGE~GET_LONGTEXT. + + IF me->error IS NOT INITIAL + OR me->syst_at_raise IS NOT INITIAL. +*--------------------------------------------------------------------* +* If message was supplied explicitly use this as longtext as well +*--------------------------------------------------------------------* + result = me->get_text( ). + ELSE. +*--------------------------------------------------------------------* +* otherwise use standard method to derive text +*--------------------------------------------------------------------* + super->if_message~get_longtext( EXPORTING + preserve_newlines = preserve_newlines + RECEIVING + result = result ). + ENDIF. + endmethod. + + + method IF_MESSAGE~GET_TEXT. + + IF me->error IS NOT INITIAL. +*--------------------------------------------------------------------* +* If message was supplied explicitly use this +*--------------------------------------------------------------------* + result = me->error . + ELSEIF me->syst_at_raise IS NOT INITIAL. +*--------------------------------------------------------------------* +* If message was supplied by syst create messagetext now +*--------------------------------------------------------------------* + MESSAGE ID syst_at_raise-msgid TYPE syst_at_raise-msgty NUMBER syst_at_raise-msgno + WITH syst_at_raise-msgv1 syst_at_raise-msgv2 syst_at_raise-msgv3 syst_at_raise-msgv4 + INTO result. + ELSE. +*--------------------------------------------------------------------* +* otherwise use standard method to derive text +*--------------------------------------------------------------------* + CALL METHOD super->if_message~get_text + RECEIVING + result = result. + ENDIF. + endmethod. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZABAP2XLSX_DEMO_SHOW +*&---------------------------------------------------------------------* +REPORT zabap2xlsx_demo_like_se83. + + +*----------------------------------------------------------------------* +* CLASS lcl_perform DEFINITION +*----------------------------------------------------------------------* +CLASS lcl_perform DEFINITION CREATE PRIVATE. + PUBLIC SECTION. + CLASS-METHODS: setup_objects, + collect_reports, + + handle_nav FOR EVENT double_click OF cl_gui_alv_grid + IMPORTING e_row. + + PRIVATE SECTION. + TYPES: BEGIN OF ty_reports, + progname TYPE reposrc-progname, + sort TYPE reposrc-progname, + filename TYPE string, + END OF ty_reports. + + CLASS-DATA: + lo_grid TYPE REF TO cl_gui_alv_grid, + lo_text TYPE REF TO cl_gui_textedit, + cl_document TYPE REF TO i_oi_document_proxy, + + t_reports TYPE STANDARD TABLE OF ty_reports WITH NON-UNIQUE DEFAULT KEY. + CLASS-DATA:error TYPE REF TO i_oi_error, + t_errors TYPE STANDARD TABLE OF REF TO i_oi_error WITH NON-UNIQUE DEFAULT KEY, + cl_control TYPE REF TO i_oi_container_control. "Office Dokument + +ENDCLASS. "lcl_perform DEFINITION + + +START-OF-SELECTION. + lcl_perform=>collect_reports( ). + lcl_perform=>setup_objects( ). + +END-OF-SELECTION. + + WRITE '.'. " Force output + + +*----------------------------------------------------------------------* +* CLASS lcl_perform IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS lcl_perform IMPLEMENTATION. + METHOD setup_objects. + DATA: lo_split TYPE REF TO cl_gui_splitter_container, + lo_container TYPE REF TO cl_gui_container. + + DATA: it_fieldcat TYPE lvc_t_fcat, + is_layout TYPE lvc_s_layo, + is_variant TYPE disvariant. + FIELD-SYMBOLS: <fc> LIKE LINE OF it_fieldcat. + + + CREATE OBJECT lo_split + EXPORTING + parent = cl_gui_container=>screen0 + rows = 1 + columns = 3 + no_autodef_progid_dynnr = 'X'. + lo_split->set_column_width( EXPORTING id = 1 + width = 20 ). + lo_split->set_column_width( EXPORTING id = 2 + width = 40 ). + +* Left: List of reports + lo_container = lo_split->get_container( row = 1 + column = 1 ). + + CREATE OBJECT lo_grid + EXPORTING + i_parent = lo_container. + SET HANDLER lcl_perform=>handle_nav FOR lo_grid. + + is_variant-report = sy-repid. + is_variant-handle = '0001'. + + is_layout-cwidth_opt = 'X'. + + APPEND INITIAL LINE TO it_fieldcat ASSIGNING <fc>. + <fc>-fieldname = 'PROGNAME'. + <fc>-tabname = 'REPOSRC'. + + APPEND INITIAL LINE TO it_fieldcat ASSIGNING <fc>. + <fc>-fieldname = 'SORT'. + <fc>-ref_field = 'PROGNAME'. + <fc>-ref_table = 'REPOSRC'. + + + lo_grid->set_table_for_first_display( EXPORTING + is_variant = is_variant + i_save = 'A' + is_layout = is_layout + CHANGING + it_outtab = t_reports + it_fieldcatalog = it_fieldcat + EXCEPTIONS + invalid_parameter_combination = 1 + program_error = 2 + too_many_lines = 3 + OTHERS = 4 ). + +* Middle: Text with coding + lo_container = lo_split->get_container( row = 1 + column = 2 ). + CREATE OBJECT lo_text + EXPORTING + parent = lo_container. + lo_text->set_readonly_mode( cl_gui_textedit=>true ). + lo_text->set_font_fixed( ). + + + +* right: DemoOutput + lo_container = lo_split->get_container( row = 1 + column = 3 ). + + c_oi_container_control_creator=>get_container_control( IMPORTING control = cl_control + error = error ). + APPEND error TO t_errors. + + cl_control->init_control( EXPORTING inplace_enabled = 'X' + no_flush = 'X' + r3_application_name = 'Demo Document Container' + parent = lo_container + IMPORTING error = error + EXCEPTIONS OTHERS = 2 ). + APPEND error TO t_errors. + + cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL + no_flush = ' ' + IMPORTING document_proxy = cl_document + error = error ). + APPEND error TO t_errors. +* Errorhandling should be inserted here + + + ENDMETHOD. "setup_objects + + "collect_reports + METHOD collect_reports. + FIELD-SYMBOLS:<report> LIKE LINE OF t_reports. + DATA: t_source TYPE STANDARD TABLE OF text255 WITH NON-UNIQUE DEFAULT KEY. + +* Get all demoreports + SELECT progname + INTO CORRESPONDING FIELDS OF TABLE t_reports + FROM reposrc + WHERE progname LIKE 'ZDEMO_EXCEL%' + AND progname <> sy-repid + AND subc = '1'. + + LOOP AT t_reports ASSIGNING <report>. + +* Check if already switched to new outputoptions + READ REPORT <report>-progname INTO t_source. + IF sy-subrc = 0. + FIND 'INCLUDE zdemo_excel_outputopt_incl.' IN TABLE t_source IGNORING CASE. + ENDIF. + IF sy-subrc <> 0. + DELETE t_reports. + CONTINUE. + ENDIF. + + +* Build half-numeric sort + <report>-sort = <report>-progname. + REPLACE REGEX '(ZDEMO_EXCEL)(\d\d)\s*$' IN <report>-sort WITH '$1\0$2'. " REPLACE REGEX '(ZDEMO_EXCEL)([^][^])*$' IN <report>-sort WITH '$1$2'.REPLACE REGEX '(ZDEMO_EXCEL)([^][^])*$' IN <report>-sort WITH '$1$2'.REPLACE + + REPLACE REGEX '(ZDEMO_EXCEL)(\d)\s*$' IN <report>-sort WITH '$1\0\0$2'. + ENDLOOP. + SORT t_reports BY sort progname. + + ENDMETHOD. "collect_reports + + METHOD handle_nav. + CONSTANTS: filename TYPE text80 VALUE 'ZABAP2XLSX_DEMO_SHOW.xlsx'. + DATA: wa_report LIKE LINE OF t_reports, + t_source TYPE STANDARD TABLE OF text255, + t_rawdata TYPE solix_tab, + wa_rawdata LIKE LINE OF t_rawdata, + bytecount TYPE i, + length TYPE i, + add_selopt TYPE flag. + + + READ TABLE t_reports INTO wa_report INDEX e_row-index. + CHECK sy-subrc = 0. + +* Set new text into middle frame + READ REPORT wa_report-progname INTO t_source. + lo_text->set_text_as_r3table( EXPORTING table = t_source ). + + +* Unload old xls-file + cl_document->close_document( ). + +* Get the demo +* If additional parameters found on selection screen, start via selection screen , otherwise start w/o + CLEAR add_selopt. + FIND 'PARAMETERS' IN TABLE t_source. + IF sy-subrc = 0. + add_selopt = 'X'. + ELSE. + FIND 'SELECT-OPTIONS' IN TABLE t_source. + IF sy-subrc = 0. + add_selopt = 'X'. + ENDIF. + ENDIF. + IF add_selopt IS INITIAL. + SUBMIT (wa_report-progname) AND RETURN + WITH p_backfn = filename + WITH rb_back = 'X' + WITH rb_down = ' ' + WITH rb_send = ' ' + WITH rb_show = ' '. + ELSE. + SUBMIT (wa_report-progname) VIA SELECTION-SCREEN AND RETURN + WITH p_backfn = filename + WITH rb_back = 'X' + WITH rb_down = ' ' + WITH rb_send = ' ' + WITH rb_show = ' '. + ENDIF. + + OPEN DATASET filename FOR INPUT IN BINARY MODE. + IF sy-subrc = 0. + DO. + CLEAR wa_rawdata. + READ DATASET filename INTO wa_rawdata LENGTH length. + IF sy-subrc <> 0. + APPEND wa_rawdata TO t_rawdata. + ADD length TO bytecount. + EXIT. + ENDIF. + APPEND wa_rawdata TO t_rawdata. + ADD length TO bytecount. + ENDDO. + CLOSE DATASET filename. + ENDIF. + + cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL + no_flush = ' ' + IMPORTING document_proxy = cl_document + error = error ). + + cl_document->open_document_from_table( EXPORTING document_size = bytecount + document_table = t_rawdata + open_inplace = 'X' ). + + ENDMETHOD. "handle_nav + +ENDCLASS. "lcl_perform IMPLEMENTATION + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZANGRY_BIRDS +*& Just for fun +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zangry_birds. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_border_light TYPE REF TO zcl_excel_style_border, + lo_style_color0 TYPE REF TO zcl_excel_style, + lo_style_color1 TYPE REF TO zcl_excel_style, + lo_style_color2 TYPE REF TO zcl_excel_style, + lo_style_color3 TYPE REF TO zcl_excel_style, + lo_style_color4 TYPE REF TO zcl_excel_style, + lo_style_color5 TYPE REF TO zcl_excel_style, + lo_style_color6 TYPE REF TO zcl_excel_style, + lo_style_color7 TYPE REF TO zcl_excel_style, + lo_style_credit TYPE REF TO zcl_excel_style, + lo_style_link TYPE REF TO zcl_excel_style, + lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink. + +DATA: lv_style_color0_guid TYPE zexcel_cell_style, + lv_style_color1_guid TYPE zexcel_cell_style, + lv_style_color2_guid TYPE zexcel_cell_style, + lv_style_color3_guid TYPE zexcel_cell_style, + lv_style_color4_guid TYPE zexcel_cell_style, + lv_style_color5_guid TYPE zexcel_cell_style, + lv_style_color6_guid TYPE zexcel_cell_style, + lv_style_color7_guid TYPE zexcel_cell_style, + lv_style_credit_guid TYPE zexcel_cell_style, + lv_style_link_guid TYPE zexcel_cell_style, + lv_style TYPE zexcel_cell_style. + +DATA: lv_col_str TYPE zexcel_cell_column_alpha, + lv_row TYPE i, + lv_col TYPE i, + lt_mapper TYPE TABLE OF zexcel_cell_style, + ls_mapper TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'angry_birds.xlsx'. + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + + " Creates active sheet + CREATE OBJECT lo_excel. + + CREATE OBJECT lo_border_light. + lo_border_light->border_color-rgb = zcl_excel_style_color=>c_white. + lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. + + " Create color white + lo_style_color0 = lo_excel->add_new_style( ). + lo_style_color0->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color0->fill->fgcolor-rgb = 'FFFFFFFF'. + lo_style_color0->borders->allborders = lo_border_light. + lv_style_color0_guid = lo_style_color0->get_guid( ). + + " Create color black + lo_style_color1 = lo_excel->add_new_style( ). + lo_style_color1->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color1->fill->fgcolor-rgb = 'FF252525'. + lo_style_color1->borders->allborders = lo_border_light. + lv_style_color1_guid = lo_style_color1->get_guid( ). + + " Create color dark green + lo_style_color2 = lo_excel->add_new_style( ). + lo_style_color2->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color2->fill->fgcolor-rgb = 'FF75913A'. + lo_style_color2->borders->allborders = lo_border_light. + lv_style_color2_guid = lo_style_color2->get_guid( ). + + " Create color light green + lo_style_color3 = lo_excel->add_new_style( ). + lo_style_color3->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color3->fill->fgcolor-rgb = 'FF9DFB73'. + lo_style_color3->borders->allborders = lo_border_light. + lv_style_color3_guid = lo_style_color3->get_guid( ). + + " Create color green + lo_style_color4 = lo_excel->add_new_style( ). + lo_style_color4->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color4->fill->fgcolor-rgb = 'FF92CF56'. + lo_style_color4->borders->allborders = lo_border_light. + lv_style_color4_guid = lo_style_color4->get_guid( ). + + " Create color 2dark green + lo_style_color5 = lo_excel->add_new_style( ). + lo_style_color5->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color5->fill->fgcolor-rgb = 'FF506228'. + lo_style_color5->borders->allborders = lo_border_light. + lv_style_color5_guid = lo_style_color5->get_guid( ). + + " Create color yellow + lo_style_color6 = lo_excel->add_new_style( ). + lo_style_color6->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color6->fill->fgcolor-rgb = 'FFC3E224'. + lo_style_color6->borders->allborders = lo_border_light. + lv_style_color6_guid = lo_style_color6->get_guid( ). + + " Create color yellow + lo_style_color7 = lo_excel->add_new_style( ). + lo_style_color7->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_color7->fill->fgcolor-rgb = 'FFB3C14F'. + lo_style_color7->borders->allborders = lo_border_light. + lv_style_color7_guid = lo_style_color7->get_guid( ). + + " Credits + lo_style_credit = lo_excel->add_new_style( ). + lo_style_credit->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_credit->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. + lo_style_credit->font->size = 20. + lv_style_credit_guid = lo_style_credit->get_guid( ). + + " Link + lo_style_link = lo_excel->add_new_style( ). + lo_style_link->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_link->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. +* lo_style_link->font->size = 20. + lv_style_link_guid = lo_style_link->get_guid( ). + + " Create image map " line 2 + DO 30 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 3 + DO 28 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 5 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 4 + DO 27 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 5 + DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 15 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 6 + DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 13 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 7 + DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 5 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 11 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 5 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 8 + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 9 + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 10 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 11 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 7 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 12 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 13 + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 8 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 14 + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 12 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 15 + DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 8 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 16 + DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 7 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 5 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 17 + DO 8 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 13 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 18 + DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 23 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 19 + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 27 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 20 + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 23 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 21 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 19 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 22 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 17 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 23 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 17 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 8 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 24 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 25 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 8 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 26 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color6_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 27 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color6_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 28 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color6_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 29 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 30 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 31 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 32 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 8 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 33 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 34 + DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 35 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 36 + DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 37 + DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 38 + DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 39 + DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 22 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 40 + DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 17 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 41 + DO 8 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 15 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 42 + DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 5 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 43 + DO 11 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 5 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. + DO 7 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 44 + DO 13 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 6 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. + DO 8 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 45 + DO 16 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 13 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + " line 46 + DO 18 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. + DO 8 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. + APPEND INITIAL LINE TO lt_mapper. " escape + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Angry Birds' ). + + lv_row = 1. + lv_col = 1. + + LOOP AT lt_mapper INTO ls_mapper. + lv_col_str = zcl_excel_common=>convert_column2alpha( lv_col ). + IF ls_mapper IS INITIAL. + lo_row_dimension = lo_worksheet->get_row_dimension( ip_row = lv_row ). + lo_row_dimension->set_row_height( ip_row_height = 8 ). + lv_col = 1. + lv_row = lv_row + 1. + CONTINUE. + ENDIF. + lo_worksheet->set_cell( ip_column = lv_col_str + ip_row = lv_row + ip_value = space + ip_style = ls_mapper ). + lv_col = lv_col + 1. + + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = lv_col_str ). + lo_column_dimension->set_width( ip_width = 2 ). + ENDLOOP. + + lo_worksheet->set_show_gridlines( i_show_gridlines = abap_false ). + + lo_worksheet->set_cell( ip_column = 'AP' + ip_row = 15 + ip_value = 'Created with abap2xlsx' + ip_style = lv_style_credit_guid ). + + lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'http://www.abap2xlsx.org' ). + lo_worksheet->set_cell( ip_column = 'AP' + ip_row = 24 + ip_value = 'http://www.abap2xlsx.org' + ip_style = lv_style_link_guid + ip_hyperlink = lo_hyperlink ). + + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'AP' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + lo_worksheet->set_merge( ip_row = 15 ip_column_start = 'AP' ip_row_to = 22 ip_column_end = 'AR' ). + lo_worksheet->set_merge( ip_row = 24 ip_column_start = 'AP' ip_row_to = 26 ip_column_end = 'AR' ). + + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +* " This method is only available on AS ABAP > 6.40 +* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). +* lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_CALENDAR +*& abap2xlsx Demo: Create Calendar with Pictures +*&---------------------------------------------------------------------* +*& This report creates a monthly calendar in the specified date range. +*& Each month is put on a seperate worksheet. The pictures for each +*& month can be specified in a tab delimited file called "Calendar.txt" +*& which is saved in the Export Directory. By default this is the SAP +*& Workdir. The file contains 3 fields: +*& +*& Month (with leading 0) +*& Image Filename +*& Image Description +*& URL for the Description +*& +*& The Images should be landscape JPEG's with a 3:2 ratio and min. +*& 450 pixel height. They must also be saved in the Export Directory. +*& In my tests I've discovered a limit of 20 MB in the +*& cl_gui_frontend_services=>gui_download method. So keep your images +*& smaller or chnage to a server export using OPEN DATASET. +*&---------------------------------------------------------------------* + +REPORT zdemo_calendar. + +TYPE-POOLS: abap. +CONSTANTS: gc_save_file_name TYPE string VALUE 'Calendar.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. +INCLUDE zdemo_calendar_classes. + +DATA: lv_workdir TYPE string. + +PARAMETERS: p_from TYPE dfrom DEFAULT '20130101', + p_to TYPE dto DEFAULT '20131231'. + +SELECTION-SCREEN BEGIN OF BLOCK orientation WITH FRAME TITLE orient. +PARAMETERS: p_portr TYPE flag RADIOBUTTON GROUP orie, + p_lands TYPE flag RADIOBUTTON GROUP orie DEFAULT 'X'. +SELECTION-SCREEN END OF BLOCK orientation. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + orient = 'Orientation'(000). + +START-OF-SELECTION. + + DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, + lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi, + hyperlink TYPE REF TO zcl_excel_hyperlink, + lo_drawing TYPE REF TO zcl_excel_drawing. + + DATA: lo_style_month TYPE REF TO zcl_excel_style, + lv_style_month_guid TYPE zexcel_cell_style. + DATA: lo_style_border TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lv_style_border_guid TYPE zexcel_cell_style. + DATA: lo_style_center TYPE REF TO zcl_excel_style, + lv_style_center_guid TYPE zexcel_cell_style. + + DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + + DATA: lv_full_path TYPE string, + image_descr_path TYPE string, + lv_file_separator TYPE c. + DATA: lv_content TYPE xstring, + width TYPE i, + lv_height TYPE i, + lv_from_row TYPE zexcel_cell_row. + + DATA: month TYPE i, + month_nr TYPE fcmnr, + count TYPE i VALUE 1, + title TYPE zexcel_sheet_title, + value TYPE string, + image_path TYPE string, + date_from TYPE datum, + date_to TYPE datum, + row TYPE zexcel_cell_row, + to_row TYPE zexcel_cell_row, + to_col TYPE zexcel_cell_column_alpha, + to_col_end TYPE zexcel_cell_column_alpha, + to_col_int TYPE i. + + DATA: month_names TYPE TABLE OF t247. + FIELD-SYMBOLS: <month_name> LIKE LINE OF month_names. + + TYPES: BEGIN OF tt_datatab, + month_nr TYPE fcmnr, + filename TYPE string, + descr TYPE string, + url TYPE string, + END OF tt_datatab. + + DATA: image_descriptions TYPE TABLE OF tt_datatab. + FIELD-SYMBOLS: <img_descr> LIKE LINE OF image_descriptions. + + CONSTANTS: lv_default_file_name TYPE string VALUE 'Calendar', "#EC NOTEXT + c_from_row_portrait TYPE zexcel_cell_row VALUE 28, + c_from_row_landscape TYPE zexcel_cell_row VALUE 38, + from_col TYPE zexcel_cell_column_alpha VALUE 'C', + c_height_portrait TYPE i VALUE 450, " Image Height in Portrait Mode + c_height_landscape TYPE i VALUE 670, " Image Height in Landscape Mode + c_factor TYPE f VALUE '1.5'. " Image Ratio, default 3:2 + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name '.xlsx' INTO lv_full_path. "#EC NOTEXT + + " Read Image Names for Month and Description + CONCATENATE p_path lv_file_separator lv_default_file_name '.txt' INTO image_descr_path. "#EC NOTEXT + cl_gui_frontend_services=>gui_upload( + EXPORTING + filename = image_descr_path " Name of file + filetype = 'ASC' " File Type (ASCII, Binary) + has_field_separator = 'X' + read_by_line = 'X' " File Written Line-By-Line to the Internal Table + CHANGING + data_tab = image_descriptions " Transfer table for file contents + 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 <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create Styles + " Create an underline double style + lo_style_month = lo_excel->add_new_style( ). + " lo_style_month->font->underline = abap_true. + " lo_style_month->font->underline_mode = zcl_excel_style_font=>c_underline_single. + lo_style_month->font->name = zcl_excel_style_font=>c_name_roman. + lo_style_month->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_month->font->family = zcl_excel_style_font=>c_family_roman. + lo_style_month->font->bold = abap_true. + lo_style_month->font->size = 36. + lv_style_month_guid = lo_style_month->get_guid( ). + " Create border object + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + "Create style with border + lo_style_border = lo_excel->add_new_style( ). + lo_style_border->borders->allborders = lo_border_dark. + lo_style_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. + lo_style_border->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. + lv_style_border_guid = lo_style_border->get_guid( ). + "Create style alignment center + lo_style_center = lo_excel->add_new_style( ). + lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_center->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. + lv_style_center_guid = lo_style_center->get_guid( ). + + " Get Month Names + CALL FUNCTION 'MONTH_NAMES_GET' + TABLES + month_names = month_names. + + zcl_date_calculation=>months_between_two_dates( + EXPORTING + i_date_from = p_from + i_date_to = p_to + i_incl_to = abap_true + IMPORTING + e_month = month + ). + + date_from = p_from. + + WHILE count <= month. + IF count = 1. + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + ELSE. + lo_worksheet = lo_excel->add_new_worksheet( ). + ENDIF. + + lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. + + title = count. + value = count. + CONDENSE title. + CONDENSE value. + lo_worksheet->set_title( title ). + lo_worksheet->set_print_gridlines( abap_false ). + lo_worksheet->sheet_setup->paper_size = zcl_excel_sheet_setup=>c_papersize_a4. + lo_worksheet->sheet_setup->horizontal_centered = abap_true. + lo_worksheet->sheet_setup->vertical_centered = abap_true. + lo_col_dim = lo_worksheet->get_column_dimension( 'A' ). + lo_col_dim->set_width( '1.0' ). + lo_col_dim = lo_worksheet->get_column_dimension( 'B' ). + lo_col_dim->set_width( '2.0' ). + IF p_lands = abap_true. + lo_worksheet->sheet_setup->orientation = zcl_excel_sheet_setup=>c_orientation_landscape. + lv_height = c_height_landscape. + lv_from_row = c_from_row_landscape. + lo_worksheet->sheet_setup->margin_top = '0.10'. + lo_worksheet->sheet_setup->margin_left = '0.10'. + lo_worksheet->sheet_setup->margin_right = '0.10'. + lo_worksheet->sheet_setup->margin_bottom = '0.10'. + ELSE. + lo_col_dim = lo_worksheet->get_column_dimension( 'K' ). + lo_col_dim->set_width( '3.0' ). + lo_worksheet->sheet_setup->margin_top = '0.80'. + lo_worksheet->sheet_setup->margin_left = '0.55'. + lo_worksheet->sheet_setup->margin_right = '0.05'. + lo_worksheet->sheet_setup->margin_bottom = '0.30'. + lv_height = c_height_portrait. + lv_from_row = c_from_row_portrait. + ENDIF. + + " Add Month Name + month_nr = date_from+4(2). + IF p_portr = abap_true. + READ TABLE month_names WITH KEY mnr = month_nr ASSIGNING <month_name>. + CONCATENATE <month_name>-ltx ` ` date_from(4) INTO value. + row = lv_from_row - 2. + to_col = from_col. + ELSE. + row = lv_from_row - 1. + to_col_int = zcl_excel_common=>convert_column2int( from_col ) + 32. + to_col = zcl_excel_common=>convert_column2alpha( to_col_int ). + to_col_int = to_col_int + 1. + to_col_end = zcl_excel_common=>convert_column2alpha( to_col_int ). + CONCATENATE month_nr '/' date_from+2(2) INTO value. + to_row = row + 2. + lo_worksheet->set_merge( + EXPORTING + ip_column_start = to_col " Cell Column Start + ip_column_end = to_col_end " Cell Column End + ip_row = row " Cell Row + ip_row_to = to_row " Cell Row + ). + ENDIF. + lo_worksheet->set_cell( + EXPORTING + ip_column = to_col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = lv_style_month_guid + ). + +* to_col_int = zcl_excel_common=>convert_column2int( from_col ) + 7. +* to_col = zcl_excel_common=>convert_column2alpha( to_col_int ). +* +* lo_worksheet->set_merge( +* EXPORTING +* ip_column_start = from_col " Cell Column Start +* ip_column_end = to_col " Cell Column End +* ip_row = row " Cell Row +* ip_row_to = row " Cell Row +* ). + + " Add drawing from a XSTRING read from a file + UNASSIGN <img_descr>. + READ TABLE image_descriptions WITH KEY month_nr = month_nr ASSIGNING <img_descr>. + IF <img_descr> IS ASSIGNED. + value = <img_descr>-descr. + IF p_portr = abap_true. + row = lv_from_row - 3. + ELSE. + row = lv_from_row - 2. + ENDIF. + IF NOT <img_descr>-url IS INITIAL. + hyperlink = zcl_excel_hyperlink=>create_external_link( <img_descr>-url ). + lo_worksheet->set_cell( + EXPORTING + ip_column = from_col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_hyperlink = hyperlink + ). + ELSE. + lo_worksheet->set_cell( + EXPORTING + ip_column = from_col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ). + ENDIF. + lo_row_dim = lo_worksheet->get_row_dimension( row ). + lo_row_dim->set_row_height( '22.0' ). + + " In Landscape mode the row between the description and the + " dates should be not so high + IF p_lands = abap_true. + row = lv_from_row - 3. + lo_worksheet->set_cell( + EXPORTING + ip_column = from_col " Cell Column + ip_row = row " Cell Row + ip_value = ' ' " Cell Value + ). + lo_row_dim = lo_worksheet->get_row_dimension( row ). + lo_row_dim->set_row_height( '7.0' ). + row = lv_from_row - 1. + lo_row_dim = lo_worksheet->get_row_dimension( row ). + lo_row_dim->set_row_height( '5.0' ). + ENDIF. + + CONCATENATE p_path lv_file_separator <img_descr>-filename INTO image_path. + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 1 + ip_from_col = 'B' ). + + lv_content = zcl_helper=>load_image( image_path ). + width = lv_height * c_factor. + lo_drawing->set_media( ip_media = lv_content + ip_media_type = zcl_excel_drawing=>c_media_type_jpg + ip_width = width + ip_height = lv_height ). + lo_worksheet->add_drawing( lo_drawing ). + ENDIF. + + " Add Calendar + CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH' + EXPORTING + day_in = date_from + IMPORTING + last_day_of_month = date_to. + IF p_portr = abap_true. + zcl_helper=>add_calendar( + EXPORTING + i_date_from = date_from + i_date_to = date_to + i_from_row = lv_from_row + i_from_col = from_col + i_day_style = lv_style_border_guid + i_cw_style = lv_style_center_guid + CHANGING + c_worksheet = lo_worksheet + ). + ELSE. + zcl_helper=>add_calendar_landscape( + EXPORTING + i_date_from = date_from + i_date_to = date_to + i_from_row = lv_from_row + i_from_col = from_col + i_day_style = lv_style_border_guid + i_cw_style = lv_style_center_guid + CHANGING + c_worksheet = lo_worksheet + ). + ENDIF. + count = count + 1. + date_from = date_to + 1. + ENDWHILE. + + lo_excel->set_active_sheet_index_by_name( '1' ). +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + *&---------------------------------------------------------------------* +*& Include ZDEMO_CALENDAR_CLASSES +*&---------------------------------------------------------------------* + +*&---------------------------------------------------------------------* +*& Class ZCL_DATE_CALCULATION +*&---------------------------------------------------------------------* +* Text +*----------------------------------------------------------------------* +CLASS zcl_date_calculation DEFINITION. + PUBLIC SECTION. + CLASS-METHODS: months_between_two_dates + IMPORTING + i_date_from TYPE datum + i_date_to TYPE datum + i_incl_to TYPE flag + EXPORTING + e_month TYPE i. +ENDCLASS. "ZCL_DATE_CALCULATION + + +*----------------------------------------------------------------------* +* CLASS ZCL_DATE_CALCULATION IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_date_calculation IMPLEMENTATION. + METHOD months_between_two_dates. + DATA: date_to TYPE datum. + DATA: BEGIN OF datum_von, + jjjj(4) TYPE n, + mm(2) TYPE n, + tt(2) TYPE n, + END OF datum_von. + + DATA: BEGIN OF datum_bis, + jjjj(4) TYPE n, + mm(2) TYPE n, + tt(2) TYPE n, + END OF datum_bis. + + e_month = 0. + + CHECK NOT ( i_date_from IS INITIAL ) + AND NOT ( i_date_to IS INITIAL ). + + date_to = i_date_to. + IF i_incl_to = abap_true. + date_to = date_to + 1. + ENDIF. + + datum_von = i_date_from. + datum_bis = date_to. + + e_month = ( datum_bis-jjjj - datum_von-jjjj ) * 12 + + ( datum_bis-mm - datum_von-mm ). + ENDMETHOD. "MONTHS_BETWEEN_TWO_DATES +ENDCLASS. "ZCL_DATE_CALCULATION IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS zcl_date_calculation_test DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_date_calculation_test DEFINITION FOR TESTING + " DURATION SHORT + " RISK LEVEL HARMLESS + "#AU Duration Medium + "#AU Risk_Level Harmless + . + PUBLIC SECTION. + METHODS: + months_between_two_dates FOR TESTING. +ENDCLASS. "zcl_date_calculation_test DEFINITION +*----------------------------------------------------------------------* +* CLASS zcl_date_calculation_test IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_date_calculation_test IMPLEMENTATION. + METHOD months_between_two_dates. + + DATA: date_from TYPE datum VALUE '20120101', + date_to TYPE datum VALUE '20121231'. + DATA: month TYPE i. + + zcl_date_calculation=>months_between_two_dates( + EXPORTING + i_date_from = date_from + i_date_to = date_to + i_incl_to = abap_true + IMPORTING + e_month = month + ). + + cl_aunit_assert=>assert_equals( + exp = 12 " Data Object with Expected Type + act = month " Data Object with Current Value + msg = 'Calculated date is wrong' " Message in Case of Error + ). + + ENDMETHOD. "months_between_two_dates +ENDCLASS. "zcl_date_calculation_test IMPLEMENTATION +*----------------------------------------------------------------------* +* CLASS zcl_helper DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_helper DEFINITION. + PUBLIC SECTION. + CLASS-METHODS: + load_image + IMPORTING + filename TYPE string + RETURNING value(r_image) TYPE xstring, + add_calendar + IMPORTING + i_date_from TYPE datum + i_date_to TYPE datum + i_from_row TYPE zexcel_cell_row + i_from_col TYPE zexcel_cell_column_alpha + i_day_style TYPE zexcel_cell_style + i_cw_style TYPE zexcel_cell_style + CHANGING + c_worksheet TYPE REF TO zcl_excel_worksheet, + add_calendar_landscape + IMPORTING + i_date_from TYPE datum + i_date_to TYPE datum + i_from_row TYPE zexcel_cell_row + i_from_col TYPE zexcel_cell_column_alpha + i_day_style TYPE zexcel_cell_style + i_cw_style TYPE zexcel_cell_style + CHANGING + c_worksheet TYPE REF TO zcl_excel_worksheet, + add_a2x_footer + IMPORTING + i_from_row TYPE zexcel_cell_row + i_from_col TYPE zexcel_cell_column_alpha + CHANGING + c_worksheet TYPE REF TO zcl_excel_worksheet, + add_calender_week + IMPORTING + i_date TYPE datum + i_row TYPE zexcel_cell_row + i_col TYPE zexcel_cell_column_alpha + i_style TYPE zexcel_cell_style + CHANGING + c_worksheet TYPE REF TO zcl_excel_worksheet. +ENDCLASS. "zcl_helper DEFINITION + +*----------------------------------------------------------------------* +* CLASS zcl_helper IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_helper IMPLEMENTATION. + METHOD load_image. + "Load samle image + DATA: lt_bin TYPE solix_tab, + lv_len TYPE i. + + CALL METHOD cl_gui_frontend_services=>gui_upload + EXPORTING + filename = filename + filetype = 'BIN' + IMPORTING + filelength = lv_len + CHANGING + data_tab = lt_bin + 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 <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_len + IMPORTING + buffer = r_image + TABLES + binary_tab = lt_bin + EXCEPTIONS + failed = 1 + OTHERS = 2. + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + ENDMETHOD. "load_image + METHOD add_calendar. + DATA: day_names TYPE TABLE OF t246. + DATA: row TYPE zexcel_cell_row, + row_max TYPE i, + col_int TYPE zexcel_cell_column, + col_max TYPE i, + from_col_int TYPE zexcel_cell_column, + col TYPE zexcel_cell_column_alpha, + lr_col_dim TYPE REF TO zcl_excel_worksheet_columndime, + lr_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi. + DATA: lv_date TYPE datum, + value TYPE string, + weekday TYPE wotnr, + weekrow TYPE wotnr VALUE 1, + day TYPE i, + width TYPE f, + height TYPE f. + DATA: hyperlink TYPE REF TO zcl_excel_hyperlink. + + FIELD-SYMBOLS: <day_name> LIKE LINE OF day_names. + + lv_date = i_date_from. + from_col_int = zcl_excel_common=>convert_column2int( i_from_col ). + " Add description for Calendar Week + c_worksheet->set_cell( + EXPORTING + ip_column = i_from_col " Cell Column + ip_row = i_from_row " Cell Row + ip_value = 'CW'(001) " Cell Value + ip_style = i_cw_style + ). + + " Add Days + CALL FUNCTION 'DAY_NAMES_GET' + TABLES + day_names = day_names. + + LOOP AT day_names ASSIGNING <day_name>. + row = i_from_row. + col_int = from_col_int + <day_name>-wotnr. + col = zcl_excel_common=>convert_column2alpha( col_int ). + value = <day_name>-langt. + c_worksheet->set_cell( + EXPORTING + ip_column = col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = i_cw_style + ). + ENDLOOP. + + WHILE lv_date <= i_date_to. + day = lv_date+6(2). + CALL FUNCTION 'FIMA_X_DAY_IN_MONTH_COMPUTE' + EXPORTING + i_datum = lv_date + IMPORTING + e_wochentag_nr = weekday. + + row = i_from_row + weekrow. + col_int = from_col_int + weekday. + col = zcl_excel_common=>convert_column2alpha( col_int ). + + value = day. + CONDENSE value. + + c_worksheet->set_cell( + EXPORTING + ip_column = col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = i_day_style " Single-Character Indicator + ). + + IF weekday = 7. + " Add Calender Week + zcl_helper=>add_calender_week( + EXPORTING + i_date = lv_date + i_row = row + i_col = i_from_col + i_style = i_cw_style + CHANGING + c_worksheet = c_worksheet + ). + weekrow = weekrow + 1. + ENDIF. + lv_date = lv_date + 1. + ENDWHILE. + " Add Calender Week + zcl_helper=>add_calender_week( + EXPORTING + i_date = lv_date + i_row = row + i_col = i_from_col + i_style = i_cw_style + CHANGING + c_worksheet = c_worksheet + ). + " Add Created with abap2xlsx + row = row + 2. + zcl_helper=>add_a2x_footer( + EXPORTING + i_from_row = row + i_from_col = i_from_col + CHANGING + c_worksheet = c_worksheet + ). + col_int = from_col_int. + col_max = from_col_int + 7. + WHILE col_int <= col_max. + col = zcl_excel_common=>convert_column2alpha( col_int ). + IF sy-index = 1. + width = '5.0'. + ELSE. + width = '11.4'. + ENDIF. + lr_col_dim = c_worksheet->get_column_dimension( col ). + lr_col_dim->set_width( width ). + col_int = col_int + 1. + ENDWHILE. + row = i_from_row + 1. + row_max = i_from_row + 6. + WHILE row <= row_max. + height = 50. + lr_row_dim = c_worksheet->get_row_dimension( row ). + lr_row_dim->set_row_height( height ). + row = row + 1. + ENDWHILE. + ENDMETHOD. "add_calendar + METHOD add_a2x_footer. + DATA: value TYPE string, + hyperlink TYPE REF TO zcl_excel_hyperlink. + + value = 'Created with abap2xlsx. Find more information at http://abap2xlsx.org.'(002). + hyperlink = zcl_excel_hyperlink=>create_external_link( 'http://abap2xlsx.org' ). "#EC NOTEXT + c_worksheet->set_cell( + EXPORTING + ip_column = i_from_col " Cell Column + ip_row = i_from_row " Cell Row + ip_value = value " Cell Value + ip_hyperlink = hyperlink + ). + + ENDMETHOD. "add_a2x_footer + METHOD add_calendar_landscape. + DATA: day_names TYPE TABLE OF t246. + + DATA: lv_date TYPE datum, + day TYPE i, + value TYPE string, + weekday TYPE wotnr. + DATA: row TYPE zexcel_cell_row, + from_col_int TYPE zexcel_cell_column, + col_int TYPE zexcel_cell_column, + col TYPE zexcel_cell_column_alpha. + DATA: lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, + lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi. + + FIELD-SYMBOLS: <day_name> LIKE LINE OF day_names. + + lv_date = i_date_from. + " Add Days + CALL FUNCTION 'DAY_NAMES_GET' + TABLES + day_names = day_names. + + WHILE lv_date <= i_date_to. + day = lv_date+6(2). + CALL FUNCTION 'FIMA_X_DAY_IN_MONTH_COMPUTE' + EXPORTING + i_datum = lv_date + IMPORTING + e_wochentag_nr = weekday. + " Day name row + row = i_from_row. + col_int = from_col_int + day + 2. + col = zcl_excel_common=>convert_column2alpha( col_int ). + READ TABLE day_names ASSIGNING <day_name> + WITH KEY wotnr = weekday. + value = <day_name>-kurzt. + c_worksheet->set_cell( + EXPORTING + ip_column = col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = i_cw_style + ). + + " Day row + row = i_from_row + 1. + value = day. + CONDENSE value. + + c_worksheet->set_cell( + EXPORTING + ip_column = col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = i_day_style " Single-Character Indicator + ). + " width + lo_col_dim = c_worksheet->get_column_dimension( col ). + lo_col_dim->set_width( '3.6' ). + + + lv_date = lv_date + 1. + ENDWHILE. + " Add ABAP2XLSX Footer + row = i_from_row + 2. + c_worksheet->set_cell( + EXPORTING + ip_column = col " Cell Column + ip_row = row " Cell Row + ip_value = ' ' " Cell Value + ). + lo_row_dim = c_worksheet->get_row_dimension( row ). + lo_row_dim->set_row_height( '5.0' ). + row = i_from_row + 3. + zcl_helper=>add_a2x_footer( + EXPORTING + i_from_row = row + i_from_col = i_from_col + CHANGING + c_worksheet = c_worksheet + ). + + " Set with for all 31 coulumns + WHILE day < 32. + day = day + 1. + col_int = from_col_int + day + 2. + col = zcl_excel_common=>convert_column2alpha( col_int ). + " width + lo_col_dim = c_worksheet->get_column_dimension( col ). + lo_col_dim->set_width( '3.6' ). + ENDWHILE. + ENDMETHOD. "ADD_CALENDAR_LANDSCAPE + + METHOD add_calender_week. + DATA: week TYPE kweek, + week_int TYPE i, + value TYPE string. + " Add Calender Week + CALL FUNCTION 'DATE_GET_WEEK' + EXPORTING + date = i_date " Date for which the week should be calculated + IMPORTING + week = week. " Week for date (format:YYYYWW) + value = week+4(2). + week_int = value. + value = week_int. + CONDENSE value. + c_worksheet->set_cell( + EXPORTING + ip_column = i_col " Cell Column + ip_row = i_row " Cell Row + ip_value = value " Cell Value + ip_style = i_style + ). + ENDMETHOD. "add_calender_week +ENDCLASS. "zcl_helper IMPLEMENTATION + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel. + +DATA: lv_workdir TYPE string, + lv_upfile TYPE string. + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = sy-lisel ). + CONCATENATE p_path sy-lisel '01_HelloWorld.xlsx' INTO lv_upfile. + + SUBMIT zdemo_excel1 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Hello world + SUBMIT zdemo_excel2 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Styles + SUBMIT zdemo_excel3 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: iTab binding + SUBMIT zdemo_excel4 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Multi sheets, page setup and sheet properties + SUBMIT zdemo_excel5 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Conditional formatting + SUBMIT zdemo_excel6 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Formulas + SUBMIT zdemo_excel7 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Conditional formatting + SUBMIT zdemo_excel8 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Ranges + SUBMIT zdemo_excel9 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Data validation + SUBMIT zdemo_excel10 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Bind table with field catalog + " zdemo_excel11 is not added because it has a selection screen and + " you also need to have business partners maintained in transaction BP + SUBMIT zdemo_excel12 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Column size + SUBMIT zdemo_excel13 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Merge cell + SUBMIT zdemo_excel14 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Alignment + " zdemo_excel15 added at the end + SUBMIT zdemo_excel16 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Drawing + SUBMIT zdemo_excel17 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Lock sheet + SUBMIT zdemo_excel18 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Lock workbook + SUBMIT zdemo_excel19 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Set active sheet + " zdemo_excel20 is not added because it uses ALV and cannot be processed (OLE2) + SUBMIT zdemo_excel21 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Color Picker + SUBMIT zdemo_excel22 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Bind table with field catalog & sheet style + SUBMIT zdemo_excel23 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Multiple sheets with and w/o grid lines, print options + SUBMIT zdemo_excel24 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Multiple sheets with different default date formats + SUBMIT zdemo_excel25 AND RETURN. " abap2xlsx Demo: Create and xlsx on Application Server (could be executed in batch mode) + " zdemo_excel26 is not added because it uses ALV and cannot be processed (Native) + SUBMIT zdemo_excel27 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Conditional Formatting + SUBMIT zdemo_excel28 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: CSV writer + " SUBMIT zdemo_excel29 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Macro enabled workbook + SUBMIT zdemo_excel30 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: ABAP Cell data types + leading blanks string + SUBMIT zdemo_excel31 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Autosize Column with different Font sizes + " zdemo_excel32 is not added because it uses ALV and cannot be processed (Native) + SUBMIT zdemo_excel33 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Table autofilter + SUBMIT zdemo_excel34 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Static Styles Chess + SUBMIT zdemo_excel35 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Static Styles + SUBMIT zdemo_excel36 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Style applied to sheet, column and single cell + SUBMIT zdemo_excel37 WITH p_upfile = lv_upfile + WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Simplest call of the reader and writer - passthrough data + SUBMIT zdemo_excel38 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Show off integration of drawings ( here using the SAP-Icons ) + SUBMIT zdemo_excel39 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Charts + SUBMIT zdemo_excel40 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Demo Printsettings + SUBMIT zdemo_excel41 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Inheritance + " + " Reader/Writer Demo must always run at the end + " to make sure all documents where created + " + SUBMIT zdemo_excel15 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. " Read Excel and write it back + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL1 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel1. + + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +CONSTANTS: gc_save_file_name TYPE string VALUE '01_HelloWorld.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). +* lo_worksheet->set_title( ip_title = 'Sheet1' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = sy-datum ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = sy-uzeit ). + lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'http://www.abap2xlsx.org' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 4 ip_value = 'Click here to visit abap2xlsx homepage' ip_hyperlink = lo_hyperlink ). + + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + column_dimension->set_width( ip_width = 11 ). + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL10 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel10. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional2 TYPE REF TO zcl_excel_style_conditional, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_table_settings TYPE zexcel_s_table_settings, + ls_iconset TYPE zexcel_conditional_iconset. + +CONSTANTS: gc_save_file_name TYPE string VALUE '10_iTabFieldCatalog.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'Internal table' ). + + ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_5arrows. + ls_iconset-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo1_value = '0'. + ls_iconset-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo2_value = '20'. + ls_iconset-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo3_value = '40'. + ls_iconset-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo4_value = '60'. + ls_iconset-cfvo5_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo5_value = '80'. + ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_true. + + "Conditional style + lo_style_conditional2 = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional2->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional2->mode_iconset = ls_iconset. + lo_style_conditional2->priority = 1. + + DATA lt_test TYPE TABLE OF sflight. + SELECT * FROM sflight INTO TABLE lt_test. "#EC CI_NOWHERE + + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_test ). + + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'CARRID'. + <fs_field_catalog>-position = 3. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_count. + WHEN 'CONNID'. + <fs_field_catalog>-position = 4. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FLDATE'. + <fs_field_catalog>-position = 2. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'PRICE'. + <fs_field_catalog>-position = 1. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_sum. + <fs_field_catalog>-cond_style = lo_style_conditional2. + WHEN OTHERS. + <fs_field_catalog>-dynpfld = abap_false. + ENDCASE. + ENDLOOP. + + ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. + + lo_worksheet->bind_table( ip_table = lt_test + is_table_settings = ls_table_settings + it_field_catalog = lt_field_catalog ). + + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'D' ). "make date field a bit wider + column_dimension->set_width( ip_width = 13 ). + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL11 +*& Export Organisation and Contact Persons using ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel11. + +TYPE-POOLS: abap. + +DATA: central_search TYPE bapibus1006_central_search, + addressdata_search TYPE bapibus1006_addr_search, + others_search TYPE bapibus1006_other_data. +DATA: searchresult TYPE TABLE OF bapibus1006_bp_addr, + return TYPE TABLE OF bapiret2. +DATA: lines TYPE i. +FIELD-SYMBOLS: <searchresult_line> LIKE LINE OF searchresult. +DATA: centraldata TYPE bapibus1006_central, + centraldataperson TYPE bapibus1006_central_person, + centraldataorganization TYPE bapibus1006_central_organ. +DATA: addressdata TYPE bapibus1006_address. +DATA: relationships TYPE TABLE OF bapibus1006_relations. +FIELD-SYMBOLS: <relationship> LIKE LINE OF relationships. +DATA: relationship_centraldata TYPE bapibus1006002_central. +DATA: relationship_addresses TYPE TABLE OF bapibus1006002_addresses. +FIELD-SYMBOLS: <relationship_address> LIKE LINE OF relationship_addresses. + +DATA: lt_download TYPE TABLE OF zexcel_s_org_rel. +FIELD-SYMBOLS: <download> LIKE LINE OF lt_download. + +CONSTANTS: gc_save_file_name TYPE string VALUE '11_Export_Org_and_Contact.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +PARAMETERS: md TYPE flag RADIOBUTTON GROUP act. + +SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-00a. +PARAMETERS: partnerc TYPE bu_type DEFAULT 2, " Organizations + postlcod TYPE ad_pstcd1 DEFAULT '8334*', + country TYPE land1 DEFAULT 'DE', + maxsel TYPE bu_maxsel DEFAULT 100. +SELECTION-SCREEN END OF BLOCK a. + +PARAMETERS: rel TYPE flag RADIOBUTTON GROUP act DEFAULT 'X'. + +SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-00b. +PARAMETERS: reltyp TYPE bu_reltyp DEFAULT 'BUR011', + partner TYPE bu_partner DEFAULT '191'. +SELECTION-SCREEN END OF BLOCK b. + +START-OF-SELECTION. + IF md = abap_true. + " Read all Companies by Master Data + central_search-partnercategory = partnerc. + addressdata_search-postl_cod1 = postlcod. + addressdata_search-country = country. + others_search-maxsel = maxsel. + others_search-no_search_for_contactperson = 'X'. + + CALL FUNCTION 'BAPI_BUPA_SEARCH_2' + EXPORTING + centraldata = central_search + addressdata = addressdata_search + OTHERS = others_search + TABLES + searchresult = searchresult + return = return. + + SORT searchresult BY partner. + DELETE ADJACENT DUPLICATES FROM searchresult COMPARING partner. + ELSEIF rel = abap_true. + " Read by Relationship + SELECT but050~partner1 AS partner FROM but050 + INNER JOIN but000 ON but000~partner = but050~partner1 AND but000~type = '2' + INTO CORRESPONDING FIELDS OF TABLE searchresult + WHERE but050~partner2 = partner + AND but050~reltyp = reltyp. + ENDIF. + + DESCRIBE TABLE searchresult LINES lines. + WRITE: / 'Number of search results: ', lines. + + LOOP AT searchresult ASSIGNING <searchresult_line>. + " Read Details of Organization + CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + centraldataorganization = centraldataorganization. + " Read Standard Address of Organization + CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + addressdata = addressdata. + + " Add Organization to Download + APPEND INITIAL LINE TO lt_download ASSIGNING <download>. + " Fill Organization Partner Numbers + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <searchresult_line>-partner + IMPORTING + businesspartnerout = <download>-org_number + businesspartnerguidout = <download>-org_guid. + + MOVE-CORRESPONDING centraldataorganization TO <download>. + MOVE-CORRESPONDING addressdata TO <download>. + CLEAR: addressdata. + + " Read all Relationships + CLEAR: relationships. + CALL FUNCTION 'BAPI_BUPA_RELATIONSHIPS_GET' + EXPORTING + businesspartner = <searchresult_line>-partner + TABLES + relationships = relationships. + DELETE relationships WHERE relationshipcategory <> 'BUR001'. + LOOP AT relationships ASSIGNING <relationship>. + " Read details of Contact person + CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' + EXPORTING + businesspartner = <relationship>-partner2 + IMPORTING + centraldata = centraldata + centraldataperson = centraldataperson. + " Read details of the Relationship + CALL FUNCTION 'BAPI_BUPR_CONTP_GETDETAIL' + EXPORTING + businesspartner = <relationship>-partner1 + contactperson = <relationship>-partner2 + IMPORTING + centraldata = relationship_centraldata. + " Read relationship address + CLEAR: relationship_addresses. + + CALL FUNCTION 'BAPI_BUPR_CONTP_ADDRESSES_GET' + EXPORTING + businesspartner = <relationship>-partner1 + contactperson = <relationship>-partner2 + TABLES + addresses = relationship_addresses. + + READ TABLE relationship_addresses + ASSIGNING <relationship_address> + WITH KEY standardaddress = 'X'. + + IF <relationship_address> IS ASSIGNED. + " Read Relationship Address + CLEAR addressdata. + CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' + EXPORTING + businesspartner = <searchresult_line>-partner + addressguid = <relationship_address>-addressguid + IMPORTING + addressdata = addressdata. + + APPEND INITIAL LINE TO lt_download ASSIGNING <download>. + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <relationship>-partner1 + IMPORTING + businesspartnerout = <download>-org_number + businesspartnerguidout = <download>-org_guid. + + CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' + EXPORTING + businesspartner = <relationship>-partner2 + IMPORTING + businesspartnerout = <download>-contpers_number + businesspartnerguidout = <download>-contpers_guid. + + MOVE-CORRESPONDING centraldataorganization TO <download>. + MOVE-CORRESPONDING addressdata TO <download>. + MOVE-CORRESPONDING centraldataperson TO <download>. + MOVE-CORRESPONDING relationship_centraldata TO <download>. + + WRITE: / <relationship>-partner1, <relationship>-partner2. + WRITE: centraldataorganization-name1(20), centraldataorganization-name2(10). + WRITE: centraldataperson-firstname(15), centraldataperson-lastname(15). + WRITE: addressdata-street(25), addressdata-house_no, + addressdata-postl_cod1, addressdata-city(25). + ENDIF. + ENDLOOP. + + ENDLOOP. + + DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_body TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + + DATA: lv_style_body_even_guid TYPE zexcel_cell_style, + lv_style_body_green TYPE zexcel_cell_style. + + DATA: row TYPE zexcel_cell_row. + + DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + + DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_table_settings TYPE zexcel_s_table_settings. + + DATA: column TYPE zexcel_cell_column, + column_alpha TYPE zexcel_cell_column_alpha, + value TYPE zexcel_cell_value. + + FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create border object + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + "Create style with border even + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->fgcolor-rgb = zcl_excel_style_color=>c_yellow. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_even_guid = lo_style_body->get_guid( ). + "Create style with border and green fill + lo_style_body = lo_excel->add_new_style( ). + lo_style_body->fill->fgcolor-rgb = zcl_excel_style_color=>c_green. + lo_style_body->borders->allborders = lo_border_dark. + lv_style_body_green = lo_style_body->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'Internal table' ). + + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_download ). + + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'ORG_NUMBER'. + <fs_field_catalog>-position = 1. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'CONTPERS_NUMBER'. + <fs_field_catalog>-position = 2. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'NAME1'. + <fs_field_catalog>-position = 3. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'NAME2'. + <fs_field_catalog>-position = 4. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'STREET'. + <fs_field_catalog>-position = 5. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'HOUSE_NO'. + <fs_field_catalog>-position = 6. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'POSTL_COD1'. + <fs_field_catalog>-position = 7. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'CITY'. + <fs_field_catalog>-position = 8. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'COUNTRYISO'. + <fs_field_catalog>-position = 9. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FIRSTNAME'. + <fs_field_catalog>-position = 10. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'LASTNAME'. + <fs_field_catalog>-position = 11. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FUNCTIONNAME'. + <fs_field_catalog>-position = 12. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'DEPARTMENTNAME'. + <fs_field_catalog>-position = 13. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'TEL1_NUMBR'. + <fs_field_catalog>-position = 14. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'TEL1_EXT'. + <fs_field_catalog>-position = 15. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FAX_NUMBER'. + <fs_field_catalog>-position = 16. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'FAX_EXTENS'. + <fs_field_catalog>-position = 17. + <fs_field_catalog>-dynpfld = abap_true. + WHEN 'E_MAIL'. + <fs_field_catalog>-position = 18. + <fs_field_catalog>-dynpfld = abap_true. + WHEN OTHERS. + <fs_field_catalog>-dynpfld = abap_false. + ENDCASE. + ENDLOOP. + + ls_table_settings-top_left_column = 'A'. + ls_table_settings-top_left_row = '2'. + ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. + + lo_worksheet->bind_table( ip_table = lt_download + is_table_settings = ls_table_settings + it_field_catalog = lt_field_catalog ). + LOOP AT lt_download ASSIGNING <download>. + row = sy-tabix + 2. + IF NOT <download>-org_number IS INITIAL + AND <download>-contpers_number IS INITIAL. + " Mark fields of Organization which can be changed green + lo_worksheet->set_cell_style( + ip_column = 'C' + ip_row = row + ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'D' + ip_row = row + ip_style = lv_style_body_green + ). +* CATCH zcx_excel. " Exceptions for ABAP2XLSX + ELSEIF NOT <download>-org_number IS INITIAL + AND NOT <download>-contpers_number IS INITIAL. + " Mark fields of Relationship which can be changed green + lo_worksheet->set_cell_style( + ip_column = 'L' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'M' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'N' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'O' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'P' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'Q' ip_row = row ip_style = lv_style_body_green + ). + lo_worksheet->set_cell_style( + ip_column = 'R' ip_row = row ip_style = lv_style_body_green + ). + ENDIF. + ENDLOOP. + " Add Fieldnames in first row and hide the row + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog> + WHERE position <> '' AND dynpfld = abap_true. + column = <fs_field_catalog>-position. + column_alpha = zcl_excel_common=>convert_column2alpha( column ). + value = <fs_field_catalog>-fieldname. + lo_worksheet->set_cell( ip_column = column_alpha + ip_row = 1 + ip_value = value + ip_style = lv_style_body_even_guid ). + ENDLOOP. + " Hide first row + row_dimension = lo_worksheet->get_row_dimension( 1 ). + row_dimension->set_visible( abap_false ). + + DATA: highest_column TYPE zexcel_cell_column, + count TYPE int4, + col_alpha TYPE zexcel_cell_column_alpha. + + highest_column = lo_worksheet->get_highest_column( ). + count = 1. + WHILE count <= highest_column. + col_alpha = zcl_excel_common=>convert_column2alpha( ip_column = count ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = col_alpha ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + count = count + 1. + ENDWHILE. +* " Set Column width manuall +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). +* column_dimension->set_width( ip_width = 11 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). +* column_dimension->set_width( ip_width = 11 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). +* column_dimension->set_width( ip_width = 35 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ). +* column_dimension->set_width( ip_width = 18 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'F' ). +* column_dimension->set_width( ip_width = 5 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'G' ). +* column_dimension->set_width( ip_width = 6 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'H' ). +* column_dimension->set_width( ip_width = 12 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'I' ). +* column_dimension->set_width( ip_width = 3 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'J' ). +* column_dimension->set_width( ip_width = 13 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'K' ). +* column_dimension->set_width( ip_width = 13 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'L' ). +* column_dimension->set_width( ip_width = 13 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'M' ). +* column_dimension->set_width( ip_width = 13 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'N' ). +* column_dimension->set_width( ip_width = 12 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'O' ). +* column_dimension->set_width( ip_width = 9 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'P' ). +* column_dimension->set_width( ip_width = 12 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'Q' ). +* column_dimension->set_width( ip_width = 9 ). +* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'R' ). +* column_dimension->set_width( ip_width = 40 ). + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL12 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel12. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: gc_save_file_name TYPE string VALUE '12_HideSizeOutlineRowsAndColumns.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'Sheet1' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world in AutoSize column' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Hello world in a column width size 50' ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Hello world (hidden column)' ). + lo_worksheet->set_cell( ip_column = 'F' ip_row = 2 ip_value = 'Outline column level 0' ). + lo_worksheet->set_cell( ip_column = 'G' ip_row = 2 ip_value = 'Outline column level 1' ). + lo_worksheet->set_cell( ip_column = 'H' ip_row = 2 ip_value = 'Outline column level 2' ). + lo_worksheet->set_cell( ip_column = 'I' ip_row = 2 ip_value = 'Small' ). + + + lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Hello world (hidden row)' ). + lo_worksheet->set_cell( ip_column = 'E' ip_row = 5 ip_value = 'Hello world in a row height size 20' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 9 ip_value = 'Simple outline rows 10-16 ( collapsed )' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 19 ip_value = '3 Outlines - Outlinelevel 1 is collapsed' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 19 ip_value = 'One of the two inner outlines is expanded, one collapsed' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 20 ip_value = 'Inner outline level - expanded' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 24 ip_value = 'Inner outline level - lines 25-28 are collapsed' ). + + lo_worksheet->zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_off. " By default is on + lo_worksheet->zif_excel_sheet_properties~summaryright = zif_excel_sheet_properties=>c_right_off. " By default is on + + " Column Settings + " Auto size + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'I' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + " Manual Width + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). + column_dimension->set_width( ip_width = 50 ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'D' ). + column_dimension->set_visible( ip_visible = abap_false ). + " Implementation in the Writer is not working yet ===== TODO ===== + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'F' ). + column_dimension->set_outline_level( ip_outline_level = 0 ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'G' ). + column_dimension->set_outline_level( ip_outline_level = 1 ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'H' ). + column_dimension->set_outline_level( ip_outline_level = 2 ). + + row_dimension = lo_worksheet->get_row_dimension( ip_row = 1 ). + row_dimension->set_visible( ip_visible = abap_false ). + row_dimension = lo_worksheet->get_row_dimension( ip_row = 5 ). + row_dimension->set_row_height( ip_row_height = 20 ). +* obsolete, not intuitive. Use new method shown below +* " Implementation in the Writer is not working yet ===== TODO ===== +* row_dimension = lo_worksheet->get_row_dimension( ip_row = 6 ). +* row_dimension->set_outline_level( ip_outline_level = 0 ). +* row_dimension = lo_worksheet->get_row_dimension( ip_row = 7 ). +* row_dimension->set_outline_level( ip_outline_level = 1 ). +* row_dimension = lo_worksheet->get_row_dimension( ip_row = 8 ). +* row_dimension->set_outline_level( ip_outline_level = 2 ). + +* Define an outline rows 10-16, collapsed on startup + lo_worksheet->set_row_outline( iv_row_from = 10 + iv_row_to = 16 + iv_collapsed = abap_true ). " collapsed + +* Define an inner outline rows 21-22, expanded when outer outline becomes extended + lo_worksheet->set_row_outline( iv_row_from = 21 + iv_row_to = 22 + iv_collapsed = abap_false ). " expanded + +* Define an inner outline rows 25-28, collapsed on startup + lo_worksheet->set_row_outline( iv_row_from = 25 + iv_row_to = 28 + iv_collapsed = abap_true ). " collapsed + +* Define an outer outline rows 20-30, collapsed on startup + lo_worksheet->set_row_outline( iv_row_from = 20 + iv_row_to = 30 + iv_collapsed = abap_true ). " collapsed + +* Hint: the order you create the outlines can be arbitrary +* You can start with inner outlines or with outer outlines + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL13 +*& +*&---------------------------------------------------------------------* +*& Example by: Alvaro "Blag" Tejada Galindo. +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel13. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_style_bold_border_guid TYPE zexcel_cell_style, + lo_style_bold_border TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '13_MergedCells.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'sheet1' ). + + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + + lo_style_bold_border = lo_excel->add_new_style( ). + lo_style_bold_border->font->bold = abap_true. + lo_style_bold_border->font->italic = abap_false. + lo_style_bold_border->font->color-rgb = zcl_excel_style_color=>c_black. + lo_style_bold_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_bold_border->borders->allborders = lo_border_dark. + lv_style_bold_border_guid = lo_style_bold_border->get_guid( ). + + lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = 'Test' ). + + lo_worksheet->set_cell( ip_row = 2 ip_column = 'B' ip_value = 'Banana' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 2 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 2 ip_column = 'E' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 2 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 2 ip_column = 'G' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Apple' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = '' ip_style = lv_style_bold_border_guid ). + + lo_worksheet->set_merge( ip_row = 4 ip_column_start = 'B' ip_column_end = 'G' ). + + " Test also if merge works when oher merged chells are empty + lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Tomato' ). + lo_worksheet->set_merge( ip_row = 6 ip_column_start = 'B' ip_column_end = 'G' ). + + " Test the patch provided by Victor Alekhin to merge cells in one column + lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = 'Merge cells also over multiple rows by Victor Alekhin' ). + lo_worksheet->set_merge( ip_row = 8 ip_column_start = 'B' ip_column_end = 'G' ip_row_to = 10 ). + + " Test the patch provided by Alexander Budeyev with different column merges + lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = 'Merge cells with different merges by Alexander Budeyev' ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = 'Test' ). + + lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = 'Banana' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = 'Apple' ip_style = lv_style_bold_border_guid ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). + + " Test merge (issue) + lo_worksheet->set_merge( ip_row = 13 ip_column_start = 'B' ip_column_end = 'C' ip_row_to = 15 ). + lo_worksheet->set_merge( ip_row = 13 ip_column_start = 'D' ip_column_end = 'D' ip_row_to = 14 ). + lo_worksheet->set_merge( ip_row = 13 ip_column_start = 'E' ip_column_end = 'F' ). + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL14 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel14. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_center TYPE REF TO zcl_excel_style, + lo_style_right TYPE REF TO zcl_excel_style, + lo_style_left TYPE REF TO zcl_excel_style, + lo_style_general TYPE REF TO zcl_excel_style, + lo_style_bottom TYPE REF TO zcl_excel_style, + lo_style_middle TYPE REF TO zcl_excel_style, + lo_style_top TYPE REF TO zcl_excel_style, + lo_style_justify TYPE REF TO zcl_excel_style, + lo_style_mixed TYPE REF TO zcl_excel_style, + lo_style_mixed_wrap TYPE REF TO zcl_excel_style, + lo_style_rotated TYPE REF TO zcl_excel_style, + lo_style_shrink TYPE REF TO zcl_excel_style, + lo_style_indent TYPE REF TO zcl_excel_style, + lv_style_center_guid TYPE zexcel_cell_style, + lv_style_right_guid TYPE zexcel_cell_style, + lv_style_left_guid TYPE zexcel_cell_style, + lv_style_general_guid TYPE zexcel_cell_style, + lv_style_bottom_guid TYPE zexcel_cell_style, + lv_style_middle_guid TYPE zexcel_cell_style, + lv_style_top_guid TYPE zexcel_cell_style, + lv_style_justify_guid TYPE zexcel_cell_style, + lv_style_mixed_guid TYPE zexcel_cell_style, + lv_style_mixed_wrap_guid TYPE zexcel_cell_style, + lv_style_rotated_guid TYPE zexcel_cell_style, + lv_style_shrink_guid TYPE zexcel_cell_style, + lv_style_indent_guid TYPE zexcel_cell_style. + +DATA: lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + +CONSTANTS: gc_save_file_name TYPE string VALUE '14_Alignment.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'sheet1' ). + + "Center + lo_style_center = lo_excel->add_new_style( ). + lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lv_style_center_guid = lo_style_center->get_guid( ). + "Right + lo_style_right = lo_excel->add_new_style( ). + lo_style_right->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. + lv_style_right_guid = lo_style_right->get_guid( ). + "Left + lo_style_left = lo_excel->add_new_style( ). + lo_style_left->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_left. + lv_style_left_guid = lo_style_left->get_guid( ). + "General + lo_style_general = lo_excel->add_new_style( ). + lo_style_general->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_general. + lv_style_general_guid = lo_style_general->get_guid( ). + "Bottom + lo_style_bottom = lo_excel->add_new_style( ). + lo_style_bottom->alignment->vertical = zcl_excel_style_alignment=>c_vertical_bottom. + lv_style_bottom_guid = lo_style_bottom->get_guid( ). + "Middle + lo_style_middle = lo_excel->add_new_style( ). + lo_style_middle->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. + lv_style_middle_guid = lo_style_middle->get_guid( ). + "Top + lo_style_top = lo_excel->add_new_style( ). + lo_style_top->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. + lv_style_top_guid = lo_style_top->get_guid( ). + "Justify + lo_style_justify = lo_excel->add_new_style( ). + lo_style_justify->alignment->vertical = zcl_excel_style_alignment=>c_vertical_justify. + lv_style_justify_guid = lo_style_justify->get_guid( ). + + "Shrink + lo_style_shrink = lo_excel->add_new_style( ). + lo_style_shrink->alignment->shrinktofit = abap_true. + lv_style_shrink_guid = lo_style_shrink->get_guid( ). + + "Indent + lo_style_indent = lo_excel->add_new_style( ). + lo_style_indent->alignment->indent = 5. + lv_style_indent_guid = lo_style_indent->get_guid( ). + + "Middle / Centered / Wrap + lo_style_mixed_wrap = lo_excel->add_new_style( ). + lo_style_mixed_wrap->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_mixed_wrap->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. + lo_style_mixed_wrap->alignment->wraptext = abap_true. + lv_style_mixed_wrap_guid = lo_style_mixed_wrap->get_guid( ). + + "Middle / Centered / Wrap + lo_style_mixed = lo_excel->add_new_style( ). + lo_style_mixed->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_mixed->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. + lv_style_mixed_guid = lo_style_mixed->get_guid( ). + + "Center + lo_style_rotated = lo_excel->add_new_style( ). + lo_style_rotated->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_rotated->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. + lo_style_rotated->alignment->textrotation = 165. " -75° == 90° + 75° + lv_style_rotated_guid = lo_style_rotated->get_guid( ). + + + " Set row size for first 7 rows to 40 + DO 7 TIMES. + lo_row_dimension = lo_worksheet->get_row_dimension( sy-index ). + lo_row_dimension->set_row_height( 40 ). + ENDDO. + + "Horizontal alignment + lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Centered Text' ip_style = lv_style_center_guid ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 'Right Text' ip_style = lv_style_right_guid ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Left Text' ip_style = lv_style_left_guid ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 'General Text' ip_style = lv_style_general_guid ). + + " Shrink & indent + lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'Text shrinked' ip_style = lv_style_shrink_guid ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 'Text indented' ip_style = lv_style_indent_guid ). + + "Vertical alignment + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Bottom Text' ip_style = lv_style_bottom_guid ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Middle Text' ip_style = lv_style_middle_guid ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 'Top Text' ip_style = lv_style_top_guid ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 'Justify Text' ip_style = lv_style_justify_guid ). + + " Wrapped + lo_worksheet->set_cell( ip_row = 10 ip_column = 'B' + ip_value = 'This is a wrapped text centered in the middle' + ip_style = lv_style_mixed_wrap_guid ). + + " Rotated + lo_worksheet->set_cell( ip_row = 10 ip_column = 'D' + ip_value = 'This is a centered text rotated by -75°' + ip_style = lv_style_rotated_guid ). + + " forced line break + DATA: lv_value TYPE string. + CONCATENATE 'This is a wrapped text centered in the middle' cl_abap_char_utilities=>cr_lf + 'and a manuall line break.' INTO lv_value. + lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' + ip_value = lv_value + ip_style = lv_style_mixed_guid ). + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL15 +*& +*&---------------------------------------------------------------------* +*& 2010-10-30, Gregor Wolf: +*& Added the functionality to ouput the read table content +*& 2011-12-19, Shahrin Shahrulzaman: +*& Added the functionality to have multiple input and output files +*&---------------------------------------------------------------------* + +REPORT zdemo_excel15. + +TYPE-POOLS: abap. + +TYPES: + BEGIN OF t_demo_excel15, + input TYPE string, + END OF t_demo_excel15. + +DATA: excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + reader TYPE REF TO zif_excel_reader. + +DATA: ex TYPE REF TO zcx_excel, + msg TYPE string. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_workdir TYPE string, + output_file_path TYPE string, + input_file_path TYPE string, + lv_file_separator TYPE c. + +DATA: worksheet TYPE REF TO zcl_excel_worksheet, + highest_column TYPE zexcel_cell_column, + highest_row TYPE int4, + column TYPE zexcel_cell_column VALUE 1, + col_str TYPE zexcel_cell_column_alpha, + row TYPE int4 VALUE 1, + value TYPE zexcel_cell_value. + +DATA: + lt_files TYPE TABLE OF t_demo_excel15. +FIELD-SYMBOLS: <wa_files> TYPE t_demo_excel15. + +PARAMETERS: p_path TYPE zexcel_export_dir, + p_noout TYPE xfeld DEFAULT abap_true. + + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + + APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. + <wa_files>-input = '01_HelloWorld.xlsx'. + APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. + <wa_files>-input = '02_Styles.xlsx'. + APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. + <wa_files>-input = '03_iTab.xlsx'. + APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. + <wa_files>-input = '04_Sheets.xlsx'. + APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. + <wa_files>-input = '08_Range.xlsx'. + APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. + <wa_files>-input = '13_MergedCells.xlsx'. + APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. + <wa_files>-input = '31_AutosizeWithDifferentFontSizes.xlsx'. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + + LOOP AT lt_files ASSIGNING <wa_files>. + CONCATENATE p_path lv_file_separator <wa_files>-input INTO input_file_path. + CONCATENATE p_path lv_file_separator '15_' <wa_files>-input INTO output_file_path. + REPLACE '.xlsx' IN output_file_path WITH 'FromReader.xlsx'. + + TRY. + CREATE OBJECT reader TYPE zcl_excel_reader_2007. + excel = reader->load_file( input_file_path ). + + IF p_noout EQ abap_false. + worksheet = excel->get_active_worksheet( ). + highest_column = worksheet->get_highest_column( ). + highest_row = worksheet->get_highest_row( ). + + WRITE: 'Highest column: ', highest_column, 'Highest row: ', highest_row. + WRITE: /. + + WHILE row <= highest_row. + WHILE column <= highest_column. + col_str = zcl_excel_common=>convert_column2alpha( column ). + worksheet->get_cell( + EXPORTING + ip_column = col_str + ip_row = row + IMPORTING + ep_value = value + ). + WRITE: value. + column = column + 1. + ENDWHILE. + WRITE: /. + column = 1. + row = row + 1. + ENDWHILE. + ENDIF. + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( excel ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +* " This method is only available on AS ABAP > 6.40 +* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). +* lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = output_file_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + CATCH zcx_excel INTO ex. " Exceptions for ABAP2XLSX + msg = ex->get_text( ). + WRITE: / msg. + ENDTRY. + ENDLOOP. + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL16 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel16. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_drawing TYPE REF TO zcl_excel_drawing. + + +DATA: ls_io TYPE skwf_io. + +CONSTANTS: gc_save_file_name TYPE string VALUE '16_Drawings.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +PARAMETERS: p_objid TYPE sdok_docid DEFAULT '456694429165174BE10000000A1550C0', " Question mark in standard Web Dynpro WDT_QUIZ + p_class TYPE sdok_class DEFAULT 'M_IMAGE_P', + pobjtype TYPE skwf_ioty DEFAULT 'P'. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + "Load samle image + DATA: lt_bin TYPE solix_tab, + lv_len TYPE i, + lv_content TYPE xstring, + ls_key TYPE wwwdatatab. + + CALL METHOD cl_gui_frontend_services=>gui_upload + EXPORTING + filename = 'c:\Program Files\SAP\FrontEnd\SAPgui\wwi\graphics\W_bio.bmp' + filetype = 'BIN' + IMPORTING + filelength = lv_len + CHANGING + data_tab = lt_bin + 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 <> 0. +* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno +* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_len + IMPORTING + buffer = lv_content + TABLES + binary_tab = lt_bin + EXCEPTIONS + failed = 1 + OTHERS = 2. + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'Sheet1' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Image from web repository (SMW0)' ). + + " create global drawing, set position and media from web repository + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 3 + ip_from_col = 'B' ). + + ls_key-relid = 'MI'. + ls_key-objid = 'SAPLOGO.GIF'. + lo_drawing->set_media_www( ip_key = ls_key + ip_width = 166 + ip_height = 75 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " another drawing from a XSTRING read from a file + lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Image from a file (c:\Program Files\SAP\FrontEnd\SAPgui\wwi\graphics\W_bio.bmp)' ). + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 9 + ip_from_col = 'B' ). + lo_drawing->set_media( ip_media = lv_content + ip_media_type = zcl_excel_drawing=>c_media_type_bmp + ip_width = 83 + ip_height = 160 ). + + lo_worksheet->add_drawing( lo_drawing ). + + ls_io-objid = p_objid. + ls_io-class = p_class. + ls_io-objtype = pobjtype. + IF ls_io IS NOT INITIAL. + " another drawing from a XSTRING read from a file + lo_worksheet->set_cell( ip_column = 'B' ip_row = 18 ip_value = 'Mime repository (by default Question mark in standard Web Dynpro WDT_QUIZ)' ). + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 19 + ip_from_col = 'B' ). + lo_drawing->set_media_mime( ip_io = ls_io + ip_width = 126 + ip_height = 145 ). + + lo_worksheet->add_drawing( lo_drawing ). + ENDIF. + + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL17 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel17. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_protection TYPE REF TO zcl_excel_style, + lv_style_protection_guid TYPE zexcel_cell_style, + lo_style TYPE REF TO zcl_excel_style, + lv_style TYPE zexcel_cell_style. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '17_SheetProtection.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +PARAMETERS: p_pwd TYPE zexcel_aes_password LOWER CASE DEFAULT 'secret'. + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. +* lo_worksheet->zif_excel_sheet_protection~password = 'DAA7'. "it is the encoded word "secret" + lo_worksheet->zif_excel_sheet_protection~password = zcl_excel_common=>encrypt_password( p_pwd ). + lo_worksheet->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_active. + lo_worksheet->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_active. + lo_worksheet->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_active. + " First style to unlock a cell + lo_style_protection = lo_excel->add_new_style( ). + lo_style_protection->protection->locked = zcl_excel_style_protection=>c_protection_unlocked. + lv_style_protection_guid = lo_style_protection->get_guid( ). + " Another style which should not affect the unlock style + lo_style = lo_excel->add_new_style( ). + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style->fill->fgcolor-rgb = 'FFCC3333'. + lv_style = lo_style->get_guid( ). + lo_worksheet->set_cell( ip_row = 3 ip_column = 'C' ip_value = 'This cell is locked locked and has the second formating' ip_style = lv_style ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'This cell is locked as all the others empty cell' ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'This cell is locked as all the others empty cell' ). + + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL18 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel18. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_style_protection_guid TYPE zexcel_cell_style. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '18_BookProtection.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " Get active sheet + lo_excel->zif_excel_book_protection~protected = zif_excel_book_protection=>c_protected. + lo_excel->zif_excel_book_protection~lockrevision = zif_excel_book_protection=>c_locked. + lo_excel->zif_excel_book_protection~lockstructure = zif_excel_book_protection=>c_locked. + lo_excel->zif_excel_book_protection~lockwindows = zif_excel_book_protection=>c_locked. + + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). + + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL19 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel19. + +TYPE-POOLS: abap. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '19_SetActiveSheet.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +PARAMETERS: p_noout TYPE xfeld DEFAULT abap_true. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " First Worksheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'First' ). + lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'This is Sheet 1' ). + + " Second Worksheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( 'Second' ). + lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'This is Sheet 2' ). + + " Third Worksheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( 'Third' ). + lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'This is Sheet 3' ). + + IF p_noout EQ abap_false. + " lo_excel->set_active_sheet_index_by_name( data_sheet_name ). + DATA: active_sheet_index TYPE zexcel_active_worksheet. + active_sheet_index = lo_excel->get_active_sheet_index( ). + WRITE: 'Sheet Index before: ', active_sheet_index. + ENDIF. + lo_excel->set_active_sheet_index( '2' ). + IF p_noout EQ abap_false. + active_sheet_index = lo_excel->get_active_sheet_index( ). + WRITE: 'Sheet Index after: ', active_sheet_index. + ENDIF. + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL2 +*& Test Styles for ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel2. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_bold TYPE REF TO zcl_excel_style, + lo_style_underline TYPE REF TO zcl_excel_style, + lo_style_filled TYPE REF TO zcl_excel_style, + lo_style_border TYPE REF TO zcl_excel_style, + lo_style_button TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_bold_guid TYPE zexcel_cell_style, + lv_style_underline_guid TYPE zexcel_cell_style, + lv_style_filled_guid TYPE zexcel_cell_style, + lv_style_filled_green_guid TYPE zexcel_cell_style, + lv_style_border_guid TYPE zexcel_cell_style, + lv_style_button_guid TYPE zexcel_cell_style, + lv_style_filled_turquoise_guid TYPE zexcel_cell_style, + lv_style_gr_cornerlb_guid TYPE zexcel_cell_style, + lv_style_gr_cornerlt_guid TYPE zexcel_cell_style, + lv_style_gr_cornerrb_guid TYPE zexcel_cell_style, + lv_style_gr_cornerrt_guid TYPE zexcel_cell_style, + lv_style_gr_horizontal90_guid TYPE zexcel_cell_style, + lv_style_gr_horizontal270_guid TYPE zexcel_cell_style, + lv_style_gr_horizontalb_guid TYPE zexcel_cell_style, + lv_style_gr_vertical_guid TYPE zexcel_cell_style, + lv_style_gr_vertical2_guid TYPE zexcel_cell_style, + lv_style_gr_fromcenter_guid TYPE zexcel_cell_style, + lv_style_gr_diagonal45_guid TYPE zexcel_cell_style, + lv_style_gr_diagonal45b_guid TYPE zexcel_cell_style, + lv_style_gr_diagonal135_guid TYPE zexcel_cell_style, + lv_style_gr_diagonal135b_guid TYPE zexcel_cell_style . + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. +DATA: lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi. + +CONSTANTS: gc_save_file_name TYPE string VALUE '02_Styles.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + + +START-OF-SELECTION. + + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create border object + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + CREATE OBJECT lo_border_light. + lo_border_light->border_color-rgb = zcl_excel_style_color=>c_gray. + lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. + " Create a bold / italic style + lo_style_bold = lo_excel->add_new_style( ). + lo_style_bold->font->bold = abap_true. + lo_style_bold->font->italic = abap_true. + lo_style_bold->font->name = zcl_excel_style_font=>c_name_arial. + lo_style_bold->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_bold->font->color-rgb = zcl_excel_style_color=>c_red. + lv_style_bold_guid = lo_style_bold->get_guid( ). + " Create an underline double style + lo_style_underline = lo_excel->add_new_style( ). + lo_style_underline->font->underline = abap_true. + lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. + lo_style_underline->font->name = zcl_excel_style_font=>c_name_roman. + lo_style_underline->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_underline->font->family = zcl_excel_style_font=>c_family_roman. + lv_style_underline_guid = lo_style_underline->get_guid( ). + " Create filled style yellow + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-theme = zcl_excel_style_color=>c_theme_accent6. + lv_style_filled_guid = lo_style_filled->get_guid( ). + " Create border with button effects + lo_style_button = lo_excel->add_new_style( ). + lo_style_button->borders->right = lo_border_dark. + lo_style_button->borders->down = lo_border_dark. + lo_style_button->borders->left = lo_border_light. + lo_style_button->borders->top = lo_border_light. + lv_style_button_guid = lo_style_button->get_guid( ). + "Create style with border + lo_style_border = lo_excel->add_new_style( ). + lo_style_border->borders->allborders = lo_border_dark. + lo_style_border->borders->diagonal = lo_border_dark. + lo_style_border->borders->diagonal_mode = zcl_excel_style_borders=>c_diagonal_both. + lv_style_border_guid = lo_style_border->get_guid( ). + " Create filled style green + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_green. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_filled_green_guid = lo_style_filled->get_guid( ). + + " Create filled with gradients + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_cornerlb. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_cornerlb_guid = lo_style_filled->get_guid( ). + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_cornerlt. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_cornerlt_guid = lo_style_filled->get_guid( ). + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_cornerrb. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_cornerrb_guid = lo_style_filled->get_guid( ). + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_cornerrt. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_cornerrt_guid = lo_style_filled->get_guid( ). + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_horizontal90. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_horizontal90_guid = lo_style_filled->get_guid( ). + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_horizontal270. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_horizontal270_guid = lo_style_filled->get_guid( ). + + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_horizontalb. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_horizontalb_guid = lo_style_filled->get_guid( ). + + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_vertical. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_vertical_guid = lo_style_filled->get_guid( ). + + + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_vertical. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_vertical2_guid = lo_style_filled->get_guid( ). + + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_fromcenter. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_fromcenter_guid = lo_style_filled->get_guid( ). + + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_diagonal45. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_diagonal45_guid = lo_style_filled->get_guid( ). + + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_diagonal45b. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_diagonal45b_guid = lo_style_filled->get_guid( ). + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_diagonal135. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_diagonal135_guid = lo_style_filled->get_guid( ). + + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_gradient_diagonal135b. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue. + lo_style_filled->fill->bgcolor-rgb = zcl_excel_style_color=>c_white. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_gr_diagonal135b_guid = lo_style_filled->get_guid( ). + + + + " Create filled style turquoise using legacy excel ver <= 2003 palette. (https://code.sdn.sap.com/spaces/abap2xlsx/tickets/92) + lo_style_filled = lo_excel->add_new_style( ). + lo_excel->legacy_palette->set_color( "replace built-in color from palette with out custom RGB turquoise + ip_index = 16 + ip_color = '0040E0D0' ). + + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-indexed = 16. + lv_style_filled_turquoise_guid = lo_style_filled->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Styles' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 9 ip_value = 'Modified color for Excel 2003' ip_style = lv_style_filled_turquoise_guid ). + " Fill the cell and apply one style + lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). + " Change the style + lo_worksheet->set_cell_style( ip_column = 'B' ip_row = 6 ip_style = lv_style_filled_green_guid ). + " Add Style to an empty cell to test Fix for Issue + "#44 Exception ZCX_EXCEL thrown when style is set for an empty cell + " https://code.sdn.sap.com/spaces/abap2xlsx/tickets/44-exception-zcx_excel-thrown-when-style-is-set-for-an-empty-cell + lo_worksheet->set_cell_style( ip_column = 'E' ip_row = 6 ip_style = lv_style_filled_green_guid ). + + + lo_worksheet->set_cell( ip_column = 'B' ip_row = 10 ip_style = lv_style_gr_cornerlb_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_cornerlb ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 10 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 11 ip_style = lv_style_gr_cornerlt_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_cornerlt ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 11 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 12 ip_style = lv_style_gr_cornerrb_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_cornerrb ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 12 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 13 ip_style = lv_style_gr_cornerrt_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_cornerrt ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 13 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 14 ip_style = lv_style_gr_horizontal90_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_horizontal90 ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 14 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 15 ip_style = lv_style_gr_horizontal270_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_horizontal270 ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 15 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 16 ip_style = lv_style_gr_horizontalb_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_horizontalb ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 16 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 17 ip_style = lv_style_gr_vertical_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_vertical ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 17 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 18 ip_style = lv_style_gr_vertical2_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_vertical ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 18 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 19 ip_style = lv_style_gr_fromcenter_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_fromcenter ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 19 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 20 ip_style = lv_style_gr_diagonal45_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_diagonal45 ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 20 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 21 ip_style = lv_style_gr_diagonal45b_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_diagonal45b ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 21 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 22 ip_style = lv_style_gr_diagonal135_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_diagonal135 ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 22 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 23 ip_style = lv_style_gr_diagonal135b_guid ip_value = zcl_excel_style_fill=>c_fill_gradient_diagonal135b ). + lo_row_dim = lo_worksheet->get_row_dimension( ip_row = 23 ). + lo_row_dim->set_row_height( ip_row_height = 30 ). + + + +* CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. +* lv_file = lo_excel_writer->write_file( lo_excel ). +* +* " Convert to binary +* CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' +* EXPORTING +* buffer = lv_file +* IMPORTING +* output_length = lv_bytecount +* TABLES +* binary_tab = lt_file_tab. +** " This method is only available on AS ABAP > 6.40 +** lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). +** lv_bytecount = xstrlen( lv_file ). +* +* " Save the file +* cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount +* filename = lv_full_path +* filetype = 'BIN' +* CHANGING data_tab = lt_file_tab ). + + lcl_output=>output( lo_excel ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *--------------------------------------------------------------------* +* REPORT ZDEMO_EXCEL20 +* Demo for method zcl_excel_worksheet-bind_alv: +* export data from ALV (CL_GUI_ALV_GRID) object to excel +*--------------------------------------------------------------------* +REPORT zdemo_excel20. + +*----------------------------------------------------------------------* +* CLASS lcl_handle_events DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_handle_events DEFINITION. + PUBLIC SECTION. + METHODS: + on_user_command FOR EVENT added_function OF cl_salv_events + IMPORTING e_salv_function. +ENDCLASS. "lcl_handle_events DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_handle_events IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_handle_events IMPLEMENTATION. + METHOD on_user_command. + PERFORM user_command." using e_salv_function text-i08. + ENDMETHOD. "on_user_command +ENDCLASS. "lcl_handle_events IMPLEMENTATION + +*--------------------------------------------------------------------* +* DATA DECLARATION +*--------------------------------------------------------------------* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_alv TYPE REF TO cl_gui_alv_grid, + lo_salv TYPE REF TO cl_salv_table, + gr_events TYPE REF TO lcl_handle_events, + lr_events TYPE REF TO cl_salv_events_table, + gt_sbook TYPE TABLE OF sbook, + gt_listheader TYPE slis_t_listheader, + wa_listheader LIKE LINE OF gt_listheader. + +DATA: l_path TYPE string, " local dir + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: + lv_default_file_name TYPE string VALUE '20_BindAlv.xlsx'. +*--------------------------------------------------------------------* +*START-OF-SELECTION +*--------------------------------------------------------------------* + +START-OF-SELECTION. + +* get data +* ------------------------------------------ + + SELECT * + INTO TABLE gt_sbook[] + FROM sbook "#EC CI_NOWHERE + UP TO 10 ROWS. + +* Display ALV +* ------------------------------------------ + + TRY. + cl_salv_table=>factory( + EXPORTING + list_display = abap_false + IMPORTING + r_salv_table = lo_salv + CHANGING + t_table = gt_sbook[] ). + CATCH cx_salv_msg . + ENDTRY. + + TRY. + lo_salv->set_screen_status( + EXPORTING + report = sy-repid + pfstatus = 'ALV_STATUS' + set_functions = lo_salv->c_functions_all ). + CATCH cx_salv_msg . + ENDTRY. + + lr_events = lo_salv->get_event( ). + CREATE OBJECT gr_events. + SET HANDLER gr_events->on_user_command FOR lr_events. + + lo_salv->display( ). + + +*&---------------------------------------------------------------------* +*& Form USER_COMMAND +*&---------------------------------------------------------------------* +* ALV user command +*--------------------------------------------------------------------* +FORM user_command . + IF sy-ucomm = 'EXCEL'. + +* get save file path + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = l_path ). + cl_gui_cfw=>flush( ). + cl_gui_frontend_services=>directory_browse( + EXPORTING initial_folder = l_path + CHANGING selected_folder = l_path ). + + IF l_path IS INITIAL. + cl_gui_frontend_services=>get_sapgui_workdir( + CHANGING sapworkdir = lv_workdir ). + l_path = lv_workdir. + ENDIF. + + cl_gui_frontend_services=>get_file_separator( + CHANGING file_separator = lv_file_separator ). + + CONCATENATE l_path lv_file_separator lv_default_file_name + INTO l_path. + +* export file to save file path + + PERFORM export_to_excel. + + ENDIF. +ENDFORM. " USER_COMMAND + +*--------------------------------------------------------------------* +* FORM EXPORT_TO_EXCEL +*--------------------------------------------------------------------* +* This subroutine is principal demo session +*--------------------------------------------------------------------* +FORM export_to_excel. + +* create zcl_excel_worksheet object + + CREATE OBJECT lo_excel. + lo_worksheet = lo_excel->get_active_worksheet( ). + +* get ALV object from screen + + CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' + IMPORTING + e_grid = lo_alv. + +* build list header + + wa_listheader-typ = 'H'. + wa_listheader-info = sy-title. + APPEND wa_listheader TO gt_listheader. + + wa_listheader-typ = 'S'. + wa_listheader-info = 'Created by: ABAP2XLSX Group'. + APPEND wa_listheader TO gt_listheader. + + wa_listheader-typ = 'A'. + wa_listheader-info = + 'Project hosting at https://cw.sdn.sap.com/cw/groups/abap2xlsx'. + APPEND wa_listheader TO gt_listheader. + +* write to excel using method Bin_ALV + + lo_worksheet->bind_alv_ole2( + EXPORTING +* I_DOCUMENT_URL = SPACE " excel template +* I_XLS = 'X' " create in xls format? + i_save_path = l_path + io_alv = lo_alv + it_listheader = gt_listheader + i_top = 2 + i_left = 1 +* I_COLUMNS_HEADER = 'X' +* I_COLUMNS_AUTOFIT = 'X' +* I_FORMAT_COL_HEADER = +* I_FORMAT_SUBTOTAL = +* I_FORMAT_TOTAL = + EXCEPTIONS + miss_guide = 1 + ex_transfer_kkblo_error = 2 + fatal_error = 3 + inv_data_range = 4 + dim_mismatch_vkey = 5 + dim_mismatch_sema = 6 + error_in_sema = 7 + OTHERS = 8 + ). + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + +ENDFORM. "EXPORT_TO_EXCEL + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL21 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel21. + +TYPES: + BEGIN OF t_color_style, + color TYPE zexcel_style_color_argb, + style TYPE zexcel_cell_style, + END OF t_color_style. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_filled TYPE REF TO zcl_excel_style. + +DATA: color_styles TYPE TABLE OF t_color_style. + +FIELD-SYMBOLS: <color_style> LIKE LINE OF color_styles. + +CONSTANTS: max TYPE i VALUE 255, + step TYPE i VALUE 51. + +DATA: red TYPE i, + green TYPE i, + blue TYPE i, + red_hex(1) TYPE x, + green_hex(1) TYPE x, + blue_hex(1) TYPE x, + red_str TYPE string, + green_str TYPE string, + blue_str TYPE string. + +DATA: color TYPE zexcel_style_color_argb, + tint TYPE zexcel_style_color_tint. + +DATA: row TYPE i, + row_tmp TYPE i, + column TYPE zexcel_cell_column VALUE 1, + col_str TYPE zexcel_cell_column_alpha. + +CONSTANTS: gc_save_file_name TYPE string VALUE '21_BackgroundColorPicker.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + WHILE red <= max. + green = 0. + WHILE green <= max. + blue = 0. + WHILE blue <= max. + red_hex = red. + red_str = red_hex. + green_hex = green. + green_str = green_hex. + blue_hex = blue. + blue_str = blue_hex. + " Create filled + CONCATENATE 'FF' red_str green_str blue_str INTO color. + APPEND INITIAL LINE TO color_styles ASSIGNING <color_style>. + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-rgb = color. + <color_style>-color = color. + <color_style>-style = lo_style_filled->get_guid( ). + blue = blue + step. + ENDWHILE. + green = green + step. + ENDWHILE. + red = red + step. + ENDWHILE. + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'Color Picker' ). + LOOP AT color_styles ASSIGNING <color_style>. + row_tmp = ( max / step + 1 ) * 3. + IF row = row_tmp. + row = 0. + column = column + 1. + ENDIF. + row = row + 1. + col_str = zcl_excel_common=>convert_column2alpha( column ). + + " Fill the cell and apply one style + lo_worksheet->set_cell( ip_column = col_str + ip_row = row + ip_value = <color_style>-color + ip_style = <color_style>-style ). + ENDLOOP. + + row = row + 2. + tint = '-0.5'. + DO 10 TIMES. + column = 1. + DO 10 TIMES. + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-theme = sy-index - 1. + lo_style_filled->fill->fgcolor-tint = tint. + <color_style>-style = lo_style_filled->get_guid( ). + col_str = zcl_excel_common=>convert_column2alpha( column ). + lo_worksheet->set_cell_style( ip_column = col_str + ip_row = row + ip_style = <color_style>-style ). + + ADD 1 TO column. + ENDDO. + ADD '0.1' TO tint. + ADD 1 TO row. + ENDDO. + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL22 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel22. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style TYPE REF TO zcl_excel_style, + lo_style_date TYPE REF TO zcl_excel_style, + lo_style_editable TYPE REF TO zcl_excel_style, + lo_data_validation TYPE REF TO zcl_excel_data_validation. + +DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, + ls_table_settings TYPE zexcel_s_table_settings, + ls_table_settings_out TYPE zexcel_s_table_settings. + +DATA: lv_style_guid TYPE zexcel_cell_style. + +DATA: lv_row TYPE char10. + +FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. + +CONSTANTS: gc_save_file_name TYPE string VALUE '22_itab_fieldcatalog.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'PN_MASSIVE'). + + DATA lt_test TYPE TABLE OF sflight. + SELECT * FROM sflight INTO TABLE lt_test. "#EC CI_NOWHERE + + " sheet style (white background) + lo_style = lo_excel->add_new_style( ). + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style->fill->fgcolor-rgb = zcl_excel_style_color=>c_white. + lv_style_guid = lo_style->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->zif_excel_sheet_properties~set_style( lv_style_guid ). + lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. + lo_worksheet->zif_excel_sheet_protection~password = zcl_excel_common=>encrypt_password( 'test' ). + lo_worksheet->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_active. + lo_worksheet->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_active. + lo_worksheet->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_active. + + " Create cell style for display only fields + lo_style = lo_excel->add_new_style( ). + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style->fill->fgcolor-rgb = zcl_excel_style_color=>c_gray. + lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_text. + + " Create cell style for display only date field + lo_style_date = lo_excel->add_new_style( ). + lo_style_date->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_date->fill->fgcolor-rgb = zcl_excel_style_color=>c_gray. + lo_style_date->number_format->format_code = zcl_excel_style_number_format=>c_format_date_ddmmyyyy. + + " Create cell style for editable fields + lo_style_editable = lo_excel->add_new_style( ). + lo_style_editable->protection->locked = zcl_excel_style_protection=>c_protection_unlocked. + + lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_test ). + + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'CARRID'. + <fs_field_catalog>-position = 3. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-style = lo_style->get_guid( ). + WHEN 'CONNID'. + <fs_field_catalog>-position = 1. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-style = lo_style->get_guid( ). + WHEN 'FLDATE'. + <fs_field_catalog>-position = 2. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-style = lo_style_date->get_guid( ). + WHEN 'PRICE'. + <fs_field_catalog>-position = 4. + <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-style = lo_style_editable->get_guid( ). + <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_sum. + WHEN OTHERS. + <fs_field_catalog>-dynpfld = abap_false. + ENDCASE. + ENDLOOP. + + ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2. + ls_table_settings-show_row_stripes = abap_true. + + lo_worksheet->bind_table( EXPORTING + ip_table = lt_test + it_field_catalog = lt_field_catalog + is_table_settings = ls_table_settings + IMPORTING + es_table_settings = ls_table_settings_out ). + + lo_worksheet->freeze_panes( ip_num_rows = 3 ). "freeze column headers when scrolling + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_custom. + lv_row = ls_table_settings_out-top_left_row. + CONDENSE lv_row. + CONCATENATE 'ISNUMBER(' ls_table_settings_out-top_left_column lv_row ')' INTO lo_data_validation->formula1. + lo_data_validation->cell_row = ls_table_settings_out-top_left_row. + lo_data_validation->cell_column = ls_table_settings_out-top_left_column. + lo_data_validation->cell_row_to = ls_table_settings_out-bottom_right_row. + lo_data_validation->cell_column_to = ls_table_settings_out-bottom_right_column. + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL23 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel23. + +TYPE-POOLS: abap. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '23_Sheets_with_and_without_grid_lines.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet1' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet with grid lines and print centered horizontal & vertical' ). + lo_worksheet->set_show_gridlines( i_show_gridlines = abap_true ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet2!B2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is a link to the second sheet' ip_hyperlink = lo_hyperlink ). + + lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. + lo_worksheet->zif_excel_sheet_properties~zoomscale = 150. + lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_NORMAL = 150. + + lo_worksheet->sheet_setup->vertical_centered = abap_true. + lo_worksheet->sheet_setup->horizontal_centered = abap_true. + + " Second sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet with grid lines in display and print' ). + lo_worksheet->set_show_gridlines( i_show_gridlines = abap_true ). + lo_worksheet->set_print_gridlines( i_print_gridlines = abap_true ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet3!B2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to the third sheet' ip_hyperlink = lo_hyperlink ). + + lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. + lo_worksheet->zif_excel_sheet_properties~zoomscale = 160. + lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_PAGELAYOUTVIEW = 200. + + " Third sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet3' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the third sheet without grid lines in display and print' ). + lo_worksheet->set_show_gridlines( i_show_gridlines = abap_false ). + lo_worksheet->set_print_gridlines( i_print_gridlines = abap_false ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet4!B2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to the fourth sheet' ip_hyperlink = lo_hyperlink ). + + lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. + lo_worksheet->zif_excel_sheet_properties~zoomscale = 170. + lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_SHEETLAYOUTVIEW = 150. + + " Fourth sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet4' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the fourth sheet with grid lines and print centered ONLY horizontal' ). + lo_worksheet->set_show_gridlines( i_show_gridlines = abap_true ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet1!B2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to the first sheet' ip_hyperlink = lo_hyperlink ). + + lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. + lo_worksheet->zif_excel_sheet_properties~zoomscale = 150. + lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_NORMAL = 150. + +" lo_worksheet->sheet_setup->vertical_centered = abap_true. + lo_worksheet->sheet_setup->horizontal_centered = abap_true. + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL23 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel24. + +TYPE-POOLS: abap. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +DATA: lv_value TYPE string. + +CONSTANTS: gc_save_file_name TYPE string VALUE '24_Sheets_with_different_default_date_formats.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet1' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Default Date Format' ). + " Insert current date + lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Current Date:' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = sy-datum ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet2!A1' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 6 ip_value = 'This is a link to the second sheet' ip_hyperlink = lo_hyperlink ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + + + " Second sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_default_excel_date_format( zcl_excel_style_number_format=>c_format_date_yyyymmdd ). + lo_worksheet->set_title( ip_title = 'Sheet2' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Date Format set to YYYYMMDD' ). + " Insert current date + lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Current Date:' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = sy-datum ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet3!B2' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 6 ip_value = 'This is link to the third sheet' ip_hyperlink = lo_hyperlink ). + + " Third sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + " TODO: It seems that the zcl_excel_style_number_format=>c_format_date_yyyymmddslash + " does not produce a valid output + lo_worksheet->set_default_excel_date_format( zcl_excel_style_number_format=>c_format_date_yyyymmddslash ). + lo_worksheet->set_title( ip_title = 'Sheet3' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Date Format set to YYYY/MM/DD' ). + " Insert current date + lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Current Date:' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = sy-datum ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet4!B2' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 6 ip_value = 'This is link to the 4th sheet' ip_hyperlink = lo_hyperlink ). + + " 4th sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + " Illustrate the Problem caused by: + " Excel 2000 incorrectly assumes that the year 1900 is a leap year. + " http://support.microsoft.com/kb/214326/en-us + lo_worksheet->set_title( ip_title = 'Sheet4' ). + " Loop from Start Date to the Max Date current data in daily steps + CONSTANTS: lv_max type d VALUE '19000302'. + + DATA: lv_date TYPE d VALUE '19000226', + lv_row TYPE i. + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'Formated date' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Integer value for this date' ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 3 ip_value = 'Date as string' ). + + lv_row = 4. + WHILE lv_date < lv_max. + lo_worksheet->set_cell( ip_column = 'B' ip_row = lv_row ip_value = lv_date ). + lv_value = zcl_excel_common=>date_to_excel_string( lv_date ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = lv_row ip_value = lv_value ). + lv_value = lv_date. + lo_worksheet->set_cell( ip_column = 'D' ip_row = lv_row ip_value = lv_value ). + lv_date = lv_date + 1. + lv_row = lv_row + 1. + ENDWHILE. + + lv_row = lv_row + 1. + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet1!B2' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = lv_row ip_value = 'This is link to the first sheet' ip_hyperlink = lo_hyperlink ). + + lo_excel->set_active_sheet_index_by_name( 'Sheet1' ). + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL25 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel25. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_exception TYPE REF TO cx_root. + +DATA: lv_file TYPE xstring. + +CONSTANTS: lv_file_name TYPE string VALUE '25_HelloWorld.xlsx'. +DATA: lv_default_file_name TYPE string. +DATA: lv_error TYPE string. + +CALL FUNCTION 'FILE_GET_NAME_USING_PATH' + EXPORTING + logical_path = 'LOCAL_TEMPORARY_FILES' " Logical path' + file_name = lv_file_name " File name + IMPORTING + file_name_with_path = lv_default_file_name. " File name with path +" Creates active sheet +CREATE OBJECT lo_excel. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->set_title( ip_title = 'Sheet1' ). +lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + +CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. +lv_file = lo_excel_writer->write_file( lo_excel ). + +TRY. + OPEN DATASET lv_default_file_name FOR OUTPUT IN BINARY MODE. + TRANSFER lv_file TO lv_default_file_name. + CLOSE DATASET lv_default_file_name. + CATCH cx_root INTO lo_exception. + lv_error = lo_exception->get_text( ). + MESSAGE lv_error TYPE 'I'. +ENDTRY. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *--------------------------------------------------------------------* +* REPORT ZDEMO_EXCEL26 +* Demo for method zcl_excel_worksheet-bind_object: +* export data from ALV (CL_GUI_ALV_GRID) object or cl_salv_table object +* to Excel. +*--------------------------------------------------------------------* +report zdemo_excel26. + +*----------------------------------------------------------------------* +* CLASS lcl_handle_events DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +class lcl_handle_events definition. + public section. + methods: + on_user_command for event added_function of cl_salv_events + importing e_salv_function. +endclass. "lcl_handle_events DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_handle_events IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +class lcl_handle_events implementation. + method on_user_command. + perform user_command." using e_salv_function text-i08. + endmethod. "on_user_command +endclass. "lcl_handle_events IMPLEMENTATION + +*--------------------------------------------------------------------* +* DATA DECLARATION +*--------------------------------------------------------------------* + +data: lo_excel type ref to zcl_excel, + lo_worksheet type ref to zcl_excel_worksheet, + lo_salv type ref to cl_salv_table, + gr_events type ref to lcl_handle_events, + lr_events type ref to cl_salv_events_table, + gt_sbook type table of sbook. + +data: l_path type string, " local dir + lv_workdir type string, + lv_file_separator type c. + +constants: + lv_default_file_name type string value '26_Bind_ALV.xlsx'. +*--------------------------------------------------------------------* +*START-OF-SELECTION +*--------------------------------------------------------------------* + +start-of-selection. + +* get data +* ------------------------------------------ + + select * + into table gt_sbook[] + from sbook "#EC CI_NOWHERE + up to 10 rows. + +* Display ALV +* ------------------------------------------ + + try. + cl_salv_table=>factory( + exporting + list_display = abap_false + importing + r_salv_table = lo_salv + changing + t_table = gt_sbook[] ). + catch cx_salv_msg . + endtry. + + try. + lo_salv->set_screen_status( + exporting + report = sy-repid + pfstatus = 'ALV_STATUS' + set_functions = lo_salv->c_functions_all ). + catch cx_salv_msg . + endtry. + + lr_events = lo_salv->get_event( ). + create object gr_events. + set handler gr_events->on_user_command for lr_events. + + lo_salv->display( ). + + +*&---------------------------------------------------------------------* +*& Form USER_COMMAND +*&---------------------------------------------------------------------* +* ALV user command +*--------------------------------------------------------------------* +form user_command . + if sy-ucomm = 'EXCEL'. + +* get save file path + cl_gui_frontend_services=>get_sapgui_workdir( changing sapworkdir = l_path ). + cl_gui_cfw=>flush( ). + cl_gui_frontend_services=>directory_browse( + exporting initial_folder = l_path + changing selected_folder = l_path ). + + if l_path is initial. + cl_gui_frontend_services=>get_sapgui_workdir( + changing sapworkdir = lv_workdir ). + l_path = lv_workdir. + endif. + + cl_gui_frontend_services=>get_file_separator( + changing file_separator = lv_file_separator ). + + concatenate l_path lv_file_separator lv_default_file_name + into l_path. + +* export file to save file path + perform export_to_excel. + + endif. +endform. " USER_COMMAND + +*--------------------------------------------------------------------* +* FORM EXPORT_TO_EXCEL +*--------------------------------------------------------------------* +* This subroutine is principal demo session +*--------------------------------------------------------------------* +form export_to_excel. + data: lo_converter type ref to zcl_excel_converter. +* create zcl_excel_worksheet object + + create object lo_excel. + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet1' ). + +* write to excel using method Bin_object + try. + lo_worksheet->bind_alv( + io_alv = lo_salv + it_table = gt_sbook + i_top = 2 + i_left = 1 + ). + catch zcx_excel . + endtry. + + perform write_file. + +endform. "EXPORT_TO_EXCEL +*&---------------------------------------------------------------------* +*& Form WRITE_FILE +*&---------------------------------------------------------------------* +* text +*----------------------------------------------------------------------* +* --> p1 text +* <-- p2 text +*----------------------------------------------------------------------* +form write_file . + data: lt_file type solix_tab, + l_bytecount type i, + l_file type xstring. + + data: lo_excel_writer type ref to zif_excel_writer. + + data: ls_seoclass type seoclass. + + create object lo_excel_writer type zcl_excel_writer_2007. + l_file = lo_excel_writer->write_file( lo_excel ). + + select single * into ls_seoclass + from seoclass + where clsname = 'CL_BCS_CONVERT'. + + if sy-subrc = 0. + call method (ls_seoclass-clsname)=>xstring_to_solix + exporting + iv_xstring = l_file + receiving + et_solix = lt_file. + + l_bytecount = xstrlen( l_file ). + else. + " Convert to binary + call function 'SCMS_XSTRING_TO_BINARY' + exporting + buffer = l_file + importing + output_length = l_bytecount + tables + binary_tab = lt_file. + endif. + + cl_gui_frontend_services=>gui_download( exporting bin_filesize = l_bytecount + filename = l_path + filetype = 'BIN' + changing data_tab = lt_file ). + +endform. " WRITE_FILE + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL27 +*& Test Styles for ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel27. + +CONSTANTS: c_fish TYPE string VALUE 'Fish'. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lo_style_1 TYPE REF TO zcl_excel_style, + lo_style_2 TYPE REF TO zcl_excel_style, + lv_style_1_guid TYPE zexcel_cell_style, + lv_style_2_guid TYPE zexcel_cell_style, + ls_cellis TYPE zexcel_conditional_cellis. + + +DATA: lv_title TYPE zexcel_sheet_title. + +CONSTANTS: gc_save_file_name TYPE string VALUE '27_ConditionalFormatting.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + + " Creates active sheet + CREATE OBJECT lo_excel. + + lo_style_1 = lo_excel->add_new_style( ). + lo_style_1->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_1->fill->bgcolor-rgb = zcl_excel_style_color=>c_green. + lv_style_1_guid = lo_style_1->get_guid( ). + + lo_style_2 = lo_excel->add_new_style( ). + lo_style_2->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_2->fill->bgcolor-rgb = zcl_excel_style_color=>c_red. + lv_style_2_guid = lo_style_2->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lv_title = 'Data Validation'. + lo_worksheet->set_title( lv_title ). + " Set values for dropdown + lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = c_fish ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Anchovy' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 'Carp' ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 'Catfish' ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 'Cod' ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 'Eel' ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'A' ip_value = 'Haddock' ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = c_fish. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 9 ). + + " 1st validation + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = c_fish. + lo_data_validation->cell_row = 2. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = 'Select a value' ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '"Anchovy"'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. + ls_cellis-cell_style = lv_style_1_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 1. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 2 + ip_stop_column = 'C' + ip_stop_row = 2 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '"Carp"'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. + ls_cellis-cell_style = lv_style_2_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 2. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 2 + ip_stop_column = 'C' + ip_stop_row = 2 ). + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL28 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel28. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_file_name TYPE string, + lv_file_path TYPE string, + lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE '28_HelloWorld.csv'. + +PARAMETERS: p_path TYPE string. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = p_path + CHANGING selected_folder = p_path ). + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet1' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = sy-datum ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = sy-uzeit ). + + column_dimension = lo_worksheet->get_column_dimension( 'B' ). + column_dimension->set_width( 11 ). + + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). + + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_csv. + zcl_excel_writer_csv=>set_delimiter( ip_value = cl_abap_char_utilities=>horizontal_tab ). + zcl_excel_writer_csv=>set_enclosure( ip_value = '''' ). + zcl_excel_writer_csv=>set_endofline( ip_value = cl_abap_char_utilities=>cr_lf ). + + zcl_excel_writer_csv=>set_active_sheet_index( i_active_worksheet = 2 ). +* zcl_excel_writer_csv=>set_active_sheet_index_by_name( I_WORKSHEET_NAME = 'Sheet2' ). + + lv_file = lo_excel_writer->write_file( lo_excel ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +* " This method is only available on AS ABAP > 6.40 +* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). +* lv_bytecount = xstrlen( lv_file ). + + " Save the file + REPLACE FIRST OCCURRENCE OF '.csv' IN lv_full_path WITH '_Sheet2.csv'. + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + +* zcl_excel_writer_csv=>set_active_sheet_index( i_active_worksheet = 2 ). + zcl_excel_writer_csv=>set_active_sheet_index_by_name( I_WORKSHEET_NAME = 'Sheet1' ). + lv_file = lo_excel_writer->write_file( lo_excel ). + REPLACE FIRST OCCURRENCE OF '_Sheet2.csv' IN lv_full_path WITH '_Sheet1.csv'. + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +* " This method is only available on AS ABAP > 6.40 +* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). +* lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL26 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel29. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_excel_reader TYPE REF TO zif_excel_reader. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_filename TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +PARAMETERS: p_path TYPE zexcel_export_dir OBLIGATORY. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + + DATA: lt_filetable TYPE filetable, + lv_rc TYPE i. + + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + + CALL METHOD cl_gui_frontend_services=>file_open_dialog + EXPORTING + window_title = 'Select Macro-Enabled Workbook template' + default_extension = '*.xlsm' + file_filter = 'Excel Macro-Enabled Workbook (*.xlsm)|*.xlsm' + initial_directory = lv_workdir + CHANGING + file_table = lt_filetable + rc = lv_rc + EXCEPTIONS + file_open_dialog_failed = 1 + cntl_error = 2 + error_no_gui = 3 + not_supported_by_gui = 4 + OTHERS = 5. + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + READ TABLE lt_filetable INTO lv_filename INDEX 1. + p_path = lv_filename. + +START-OF-SELECTION. + + lv_full_path = p_path. + + CREATE OBJECT lo_excel_reader TYPE zcl_excel_reader_xlsm. + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_xlsm. + lo_excel = lo_excel_reader->load_file( lv_full_path ). + lv_file = lo_excel_writer->write_file( lo_excel ). + REPLACE '.xlsm' IN lv_full_path WITH 'FromReader.xlsm'. + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel3. + +TYPE-POOLS: abap. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: ls_table_settings TYPE zexcel_s_table_settings. + + +DATA: lv_title TYPE zexcel_sheet_title, + lt_carr TYPE TABLE OF scarr, + row TYPE zexcel_cell_row VALUE 2, + lo_range TYPE REF TO zcl_excel_range. +DATA: lo_data_validation TYPE REF TO zcl_excel_data_validation. +FIELD-SYMBOLS: <carr> LIKE LINE OF lt_carr. + +CONSTANTS: c_airlines TYPE string VALUE 'Airlines'. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '03_iTab.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +PARAMETERS: p_empty TYPE flag. + +START-OF-SELECTION. + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Internal table'). + + DATA lt_test TYPE TABLE OF sflight. + + IF p_empty <> abap_true. + SELECT * FROM sflight INTO TABLE lt_test. "#EC CI_NOWHERE + ENDIF. + + ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2. + ls_table_settings-show_row_stripes = abap_true. + ls_table_settings-nofilters = abap_true. + + lo_worksheet->bind_table( ip_table = lt_test + is_table_settings = ls_table_settings ). + + lo_worksheet->freeze_panes( ip_num_rows = 3 ). "freeze column headers when scrolling + + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ). "make date field a bit wider + column_dimension->set_width( ip_width = 11 ). + " Add another table for data validations + lo_worksheet = lo_excel->add_new_worksheet( ). + lv_title = 'Data Validation'. + lo_worksheet->set_title( lv_title ). + lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = c_airlines ). + SELECT * FROM scarr INTO TABLE lt_carr. "#EC CI_NOWHERE + LOOP AT lt_carr ASSIGNING <carr>. + lo_worksheet->set_cell( ip_row = row ip_column = 'A' ip_value = <carr>-carrid ). + row = row + 1. + ENDLOOP. + row = row - 1. + lo_range = lo_excel->add_new_range( ). + lo_range->name = c_airlines. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'A' + ip_start_row = 2 + ip_stop_column = 'A' + ip_stop_row = row ). + " Set Data Validation + lo_excel->set_active_sheet_index( 1 ). + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = c_airlines. + lo_data_validation->cell_row = 4. + lo_data_validation->cell_column = 'C'. + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL1 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel30. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + + +DATA: lv_value TYPE string, + lv_count TYPE i VALUE 10, + lv_packed TYPE p LENGTH 16 DECIMALS 1 VALUE '1234567890.5'. + +CONSTANTS: lc_typekind_string TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_string, + lc_typekind_packed TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_packed, + lc_typekind_num TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_num, + lc_typekind_date TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_date, + lc_typekind_s_ls TYPE string VALUE 's_leading_blanks'. + +CONSTANTS: gc_save_file_name TYPE string VALUE '30_CellDataTypes.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Cell data types' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Number as String' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = '11' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 1 ip_value = 'String' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = ' String with leading spaces' + ip_data_type = lc_typekind_s_ls ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = ' Negative Value' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 1 ip_value = 'Packed' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 2 ip_value = '50000.01-' + ip_abap_type = lc_typekind_packed ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 1 ip_value = 'Number with Percentage' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 2 ip_value = '0 %' + ip_abap_type = lc_typekind_num ). + lo_worksheet->set_cell( ip_column = 'E' ip_row = 1 ip_value = 'Date' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'E' ip_row = 2 ip_value = '20110831' + ip_abap_type = lc_typekind_date ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'Positive Value' + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = '5000.02' + ip_abap_type = lc_typekind_packed ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 3 ip_value = '50 %' + ip_abap_type = lc_typekind_num ). + + WHILE lv_count <= 15. + lv_value = lv_count. + CONCATENATE 'Positive Value with' lv_value 'Digits' INTO lv_value SEPARATED BY space. + lo_worksheet->set_cell( ip_column = 'B' ip_row = lv_count ip_value = lv_value + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = lv_count ip_value = lv_packed + ip_abap_type = lc_typekind_packed ). + CONCATENATE 'Positive Value with' lv_value 'Digits formated as string' INTO lv_value SEPARATED BY space. + lo_worksheet->set_cell( ip_column = 'D' ip_row = lv_count ip_value = lv_value + ip_abap_type = lc_typekind_string ). + lo_worksheet->set_cell( ip_column = 'E' ip_row = lv_count ip_value = lv_packed + ip_abap_type = lc_typekind_string ). + lv_packed = lv_packed * 10. + lv_count = lv_count + 1. + ENDWHILE. + + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). + column_dimension->set_auto_size( abap_true ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + column_dimension->set_auto_size( abap_true ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). + column_dimension->set_auto_size( abap_true ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'D' ). + column_dimension->set_auto_size( abap_true ). + column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ). + column_dimension->set_auto_size( abap_true ). + + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL1 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel31. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + + +DATA: fieldval TYPE text80, + row TYPE i, + style_column_a TYPE REF TO zcl_excel_style, + style_column_a_guid TYPE zexcel_cell_style, + style_column_b TYPE REF TO zcl_excel_style, + style_column_b_guid TYPE zexcel_cell_style, + style_column_c TYPE REF TO zcl_excel_style, + style_column_c_guid TYPE zexcel_cell_style, + style_font TYPE REF TO zcl_excel_style_font. + +CONSTANTS: gc_save_file_name TYPE string VALUE '31_AutosizeWithDifferentFontSizes.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + " Use active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Regular Font' ). + + style_column_a = lo_excel->add_new_style( ). + style_column_a->font->size = 32. " quite large + style_column_a_guid = style_column_a->get_guid( ). + + style_column_c = lo_excel->add_new_style( ). + style_column_c->font->size = 16. " not so large + style_column_c_guid = style_column_c->get_guid( ). + + + DO 20 TIMES. + row = sy-index. + CLEAR fieldval. + DO sy-index TIMES. + CONCATENATE fieldval 'X' INTO fieldval. + ENDDO. + lo_worksheet->set_cell( ip_column = 'A' ip_row = row ip_value = fieldval ip_style = style_column_a_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = row ip_value = fieldval ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = row ip_value = fieldval ip_style = style_column_c_guid ). + ENDDO. + + column_dimension = lo_worksheet->get_column_dimension( 'A' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + column_dimension = lo_worksheet->get_column_dimension( 'B' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + column_dimension = lo_worksheet->get_column_dimension( 'C' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + + " Add sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Bold Font' ). + + style_column_a = lo_excel->add_new_style( ). + style_column_a->font->size = 32. " quite large + style_column_a->font->bold = abap_true. + style_column_a_guid = style_column_a->get_guid( ). + + style_column_b = lo_excel->add_new_style( ). + style_column_b->font->bold = abap_true. + style_column_b_guid = style_column_b->get_guid( ). + + style_column_c = lo_excel->add_new_style( ). + style_column_c->font->size = 16. " not so large + style_column_c->font->bold = abap_true. + style_column_c_guid = style_column_c->get_guid( ). + + DO 20 TIMES. + row = sy-index. + CLEAR fieldval. + DO sy-index TIMES. + CONCATENATE fieldval 'X' INTO fieldval. + ENDDO. + lo_worksheet->set_cell( ip_column = 'A' ip_row = row ip_value = fieldval ip_style = style_column_a_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = row ip_value = fieldval ip_style = style_column_b_guid ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = row ip_value = fieldval ip_style = style_column_c_guid ). + ENDDO. + + column_dimension = lo_worksheet->get_column_dimension( 'A' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + column_dimension = lo_worksheet->get_column_dimension( 'B' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + column_dimension = lo_worksheet->get_column_dimension( 'C' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + + " Add sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Italic Font' ). + + style_column_a = lo_excel->add_new_style( ). + style_column_a->font->size = 32. " quite large + style_column_a->font->italic = abap_true. + style_column_a_guid = style_column_a->get_guid( ). + + style_column_b = lo_excel->add_new_style( ). + style_column_b->font->italic = abap_true. + style_column_b_guid = style_column_b->get_guid( ). + + style_column_c = lo_excel->add_new_style( ). + style_column_c->font->size = 16. " not so large + style_column_c->font->italic = abap_true. + style_column_c_guid = style_column_c->get_guid( ). + + DO 20 TIMES. + row = sy-index. + CLEAR fieldval. + DO sy-index TIMES. + CONCATENATE fieldval 'X' INTO fieldval. + ENDDO. + lo_worksheet->set_cell( ip_column = 'A' ip_row = row ip_value = fieldval ip_style = style_column_a_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = row ip_value = fieldval ip_style = style_column_b_guid ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = row ip_value = fieldval ip_style = style_column_c_guid ). + ENDDO. + + column_dimension = lo_worksheet->get_column_dimension( 'A' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + column_dimension = lo_worksheet->get_column_dimension( 'B' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + column_dimension = lo_worksheet->get_column_dimension( 'C' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + + " Add sheet for merged cells + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Merged cells' ). + + lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'This is a very long header text' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = 'Some data' ). + lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Some more data' ). + + lo_worksheet->set_merge( + EXPORTING + ip_column_start = 'A' + ip_column_end = 'C' + ip_row = 1 ). + + column_dimension = lo_worksheet->get_column_dimension( 'A' ). + column_dimension->set_auto_size( ip_auto_size = abap_true ). + + lo_excel->set_active_sheet_index( i_active_worksheet = 1 ). + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *--------------------------------------------------------------------* +* REPORT ZDEMO_EXCEL32 +* Demo for export options from ALV GRID: +* export data from ALV (CL_GUI_ALV_GRID) object or cl_salv_table object +* to Excel. +*--------------------------------------------------------------------* +REPORT zdemo_excel32. + +*----------------------------------------------------------------------* +* CLASS lcl_handle_events DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_handle_events DEFINITION. + PUBLIC SECTION. + METHODS: + on_user_command FOR EVENT added_function OF cl_salv_events + IMPORTING e_salv_function. +ENDCLASS. "lcl_handle_events DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_handle_events IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_handle_events IMPLEMENTATION. + METHOD on_user_command. + PERFORM user_command." using e_salv_function text-i08. + ENDMETHOD. "on_user_command +ENDCLASS. "lcl_handle_events IMPLEMENTATION + +*--------------------------------------------------------------------* +* DATA DECLARATION +*--------------------------------------------------------------------* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_salv TYPE REF TO cl_salv_table, + gr_events TYPE REF TO lcl_handle_events, + lr_events TYPE REF TO cl_salv_events_table, + gt_sbook TYPE TABLE OF sbook. + +DATA: l_path TYPE string, " local dir + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: + lv_default_file_name TYPE string VALUE '32_Export_ALV.xlsx', + lv_default_file_name2 TYPE string VALUE '32_Export_Convert.xlsx'. +*--------------------------------------------------------------------* +*START-OF-SELECTION +*--------------------------------------------------------------------* + +START-OF-SELECTION. + +* get data +* ------------------------------------------ + + SELECT * + INTO TABLE gt_sbook[] + FROM sbook "#EC CI_NOWHERE + UP TO 100 ROWS. + +* Display ALV +* ------------------------------------------ + + TRY. + cl_salv_table=>factory( + EXPORTING + list_display = abap_false + IMPORTING + r_salv_table = lo_salv + CHANGING + t_table = gt_sbook[] ). + CATCH cx_salv_msg . + ENDTRY. + + TRY. + lo_salv->set_screen_status( + EXPORTING + report = sy-repid + pfstatus = 'ALV_STATUS' + set_functions = lo_salv->c_functions_all ). + CATCH cx_salv_msg . + ENDTRY. + + lr_events = lo_salv->get_event( ). + CREATE OBJECT gr_events. + SET HANDLER gr_events->on_user_command FOR lr_events. + + lo_salv->display( ). + + +*&---------------------------------------------------------------------* +*& Form USER_COMMAND +*&---------------------------------------------------------------------* +* ALV user command +*--------------------------------------------------------------------* +FORM user_command . + +* get save file path + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = l_path ). + cl_gui_cfw=>flush( ). + cl_gui_frontend_services=>directory_browse( + EXPORTING initial_folder = l_path + CHANGING selected_folder = l_path ). + + IF l_path IS INITIAL. + cl_gui_frontend_services=>get_sapgui_workdir( + CHANGING sapworkdir = lv_workdir ). + l_path = lv_workdir. + ENDIF. + + cl_gui_frontend_services=>get_file_separator( + CHANGING file_separator = lv_file_separator ). + + + +* export file to save file path + CASE sy-ucomm. + WHEN 'EXCELBIND'. + CONCATENATE l_path lv_file_separator lv_default_file_name + INTO l_path. + PERFORM export_to_excel_bind. + + WHEN 'EXCELCONV'. + + CONCATENATE l_path lv_file_separator lv_default_file_name2 + INTO l_path. + PERFORM export_to_excel_conv. + + ENDCASE. +ENDFORM. " USER_COMMAND +*--------------------------------------------------------------------* +* FORM EXPORT_TO_EXCEL_CONV +*--------------------------------------------------------------------* +* This subroutine is principal demo session +*--------------------------------------------------------------------* +FORM export_to_excel_conv. + DATA: lo_converter TYPE REF TO zcl_excel_converter. + + CREATE OBJECT lo_converter. +*TRY. + lo_converter->convert( + EXPORTING + io_alv = lo_salv + it_table = gt_sbook + i_row_int = 2 + i_column_int = 2 +* i_table = +* i_style_table = +* io_worksheet = +* CHANGING +* co_excel = + ). +* CATCH zcx_excel . +*ENDTRY. + lo_converter->write_file( i_path = l_path ). + +ENDFORM. "EXPORT_TO_EXCEL_CONV + +*--------------------------------------------------------------------* +* FORM EXPORT_TO_EXCEL_BIND +*--------------------------------------------------------------------* +* This subroutine is principal demo session +*--------------------------------------------------------------------* +FORM export_to_excel_bind. +* create zcl_excel_worksheet object + CREATE OBJECT lo_excel. + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet1' ). + +* write to excel using method Bin_object +*try. + lo_worksheet->bind_alv( + io_alv = lo_salv + it_table = gt_sbook + i_top = 2 + i_left = 1 + ). +* catch zcx_excel . +*endtry. + + + PERFORM write_file. + +ENDFORM. "EXPORT_TO_EXCEL_BIND +*&---------------------------------------------------------------------* +*& Form WRITE_FILE +*&---------------------------------------------------------------------* +* text +*----------------------------------------------------------------------* +* --> p1 text +* <-- p2 text +*----------------------------------------------------------------------* +FORM write_file . + DATA: lt_file TYPE solix_tab, + l_bytecount TYPE i, + l_file TYPE xstring. + + DATA: lo_excel_writer TYPE REF TO zif_excel_writer. + + DATA: ls_seoclass TYPE seoclass. + + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + l_file = lo_excel_writer->write_file( lo_excel ). + + SELECT SINGLE * INTO ls_seoclass + FROM seoclass + WHERE clsname = 'CL_BCS_CONVERT'. + + IF sy-subrc = 0. + CALL METHOD (ls_seoclass-clsname)=>xstring_to_solix + EXPORTING + iv_xstring = l_file + RECEIVING + et_solix = lt_file. + + l_bytecount = XSTRLEN( l_file ). + ELSE. + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = l_file + IMPORTING + output_length = l_bytecount + TABLES + binary_tab = lt_file. + ENDIF. + + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = l_bytecount + filename = l_path + filetype = 'BIN' + CHANGING data_tab = lt_file ). + +ENDFORM. " WRITE_FILE + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel33. + +TYPE-POOLS: abap. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_converter TYPE REF TO zcl_excel_converter, + lo_autofilter TYPE REF TO zcl_excel_autofilter. + +DATA lt_test TYPE TABLE OF t005t. + +DATA: l_cell_value TYPE zexcel_cell_value, + ls_area TYPE zexcel_s_autofilter_area. + +CONSTANTS: c_airlines TYPE string VALUE 'Airlines'. + +CONSTANTS: gc_save_file_name TYPE string VALUE '33_autofilter.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Internal table'). + + SELECT * UP TO 2 ROWS FROM t005t INTO TABLE lt_test. "#EC CI_NOWHERE + + CREATE OBJECT lo_converter. + + lo_converter->convert( EXPORTING + it_table = lt_test + i_row_int = 1 + i_column_int = 1 + io_worksheet = lo_worksheet + CHANGING + co_excel = lo_excel ) . + + lo_autofilter = lo_excel->add_new_autofilter( io_sheet = lo_worksheet ) . + + ls_area-row_start = 1. + ls_area-col_start = 1. + ls_area-row_end = lo_worksheet->get_highest_row( ). + ls_area-col_end = lo_worksheet->get_highest_column( ). + + lo_autofilter->set_filter_area( is_area = ls_area ). + + lo_worksheet->get_cell( EXPORTING + ip_column = 'C' + ip_row = 2 + IMPORTING + ep_value = l_cell_value ). + lo_autofilter->set_value( i_column = 3 + i_value = l_cell_value ). + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL2 +*& Test Styles for ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel34. + +CONSTANTS: width TYPE f VALUE '10.14'. +CONSTANTS: height TYPE f VALUE '57.75'. + +DATA: current_row TYPE i, + col TYPE i, + col_alpha TYPE zexcel_cell_column_alpha, + row TYPE i, + row_board TYPE i, + colorflag TYPE i, + color TYPE zexcel_style_color_argb, + + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, + + writing1 TYPE string, + writing2 TYPE string. + + + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +CONSTANTS: gc_save_file_name TYPE string VALUE '34_Static Styles_Chess.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Spassky_vs_Bronstein' ). + +* Header + current_row = 1. + + ADD 1 TO current_row. + lo_worksheet->set_cell( ip_row = current_row ip_column = 'B' ip_value = 'White' ). + lo_worksheet->set_cell( ip_row = current_row ip_column = 'C' ip_value = 'Spassky, Boris V -- wins in turn 23' ). + + ADD 1 TO current_row. + lo_worksheet->set_cell( ip_row = current_row ip_column = 'B' ip_value = 'Black' ). + lo_worksheet->set_cell( ip_row = current_row ip_column = 'C' ip_value = 'Bronstein, David I' ). + + ADD 1 TO current_row. +* Set size of column + Writing above chessboard + DO 8 TIMES. + + writing1 = zcl_excel_common=>convert_column2alpha( sy-index ). + writing2 = sy-index . + row = current_row + sy-index. + + col = sy-index + 1. + col_alpha = zcl_excel_common=>convert_column2alpha( col ). + +* Set size of column + column_dimension = lo_worksheet->get_column_dimension( col_alpha ). + column_dimension->set_width( width ). + +* Set size of row + row_dimension = lo_worksheet->get_row_dimension( row ). + row_dimension->set_row_height( height ). + +* Set writing on chessboard + lo_worksheet->set_cell( ip_row = row + ip_column = 'A' + ip_value = writing2 ). + lo_worksheet->change_cell_style( ip_column = 'A' + ip_row = row + ip_alignment_vertical = zcl_excel_style_alignment=>c_vertical_center ). + lo_worksheet->set_cell( ip_row = row + ip_column = 'J' + ip_value = writing2 ). + lo_worksheet->change_cell_style( ip_column = 'J' + ip_row = row + ip_alignment_vertical = zcl_excel_style_alignment=>c_vertical_center ). + + row = current_row + 9. + lo_worksheet->set_cell( ip_row = current_row + ip_column = col_alpha + ip_value = writing1 ). + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = current_row + ip_alignment_horizontal = zcl_excel_style_alignment=>c_horizontal_center ). + lo_worksheet->set_cell( ip_row = row + ip_column = col_alpha + ip_value = writing1 ). + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_alignment_horizontal = zcl_excel_style_alignment=>c_horizontal_center ). + ENDDO. + column_dimension = lo_worksheet->get_column_dimension( 'A' ). + column_dimension->set_auto_size( abap_true ). + column_dimension = lo_worksheet->get_column_dimension( 'J' ). + column_dimension->set_auto_size( abap_true ). + +* Set win-position + CONSTANTS: c_pawn TYPE string VALUE 'Pawn'. + CONSTANTS: c_rook TYPE string VALUE 'Rook'. + CONSTANTS: c_knight TYPE string VALUE 'Knight'. + CONSTANTS: c_bishop TYPE string VALUE 'Bishop'. + CONSTANTS: c_queen TYPE string VALUE 'Queen'. + CONSTANTS: c_king TYPE string VALUE 'King'. + + row = current_row + 1. + lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = c_rook ). + lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_rook ). + lo_worksheet->set_cell( ip_row = row ip_column = 'G' ip_value = c_knight ). + row = current_row + 2. + lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'D' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_queen ). + lo_worksheet->set_cell( ip_row = row ip_column = 'H' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'I' ip_value = c_king ). + row = current_row + 3. + lo_worksheet->set_cell( ip_row = row ip_column = 'I' ip_value = c_pawn ). + row = current_row + 4. + lo_worksheet->set_cell( ip_row = row ip_column = 'D' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_knight ). + row = current_row + 5. + lo_worksheet->set_cell( ip_row = row ip_column = 'E' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_queen ). + row = current_row + 6. + lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = c_bishop ). + row = current_row + 7. + lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'H' ip_value = c_pawn ). + lo_worksheet->set_cell( ip_row = row ip_column = 'I' ip_value = c_pawn ). + row = current_row + 8. + lo_worksheet->set_cell( ip_row = row ip_column = 'G' ip_value = c_rook ). + lo_worksheet->set_cell( ip_row = row ip_column = 'H' ip_value = c_king ). + +* Set Chessboard + DO 8 TIMES. + IF sy-index <= 3. " Black + color = zcl_excel_style_color=>c_black. + ELSE. + color = zcl_excel_style_color=>c_white. + ENDIF. + row_board = sy-index. + row = current_row + sy-index. + DO 8 TIMES. + col = sy-index + 1. + col_alpha = zcl_excel_common=>convert_column2alpha( col ). + TRY. +* Borders around outer limits + IF row_board = 1. + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_borders_top_style = zcl_excel_style_border=>c_border_thick + ip_borders_top_color_rgb = zcl_excel_style_color=>c_black ). + ENDIF. + IF row_board = 8. + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_borders_down_style = zcl_excel_style_border=>c_border_thick + ip_borders_down_color_rgb = zcl_excel_style_color=>c_black ). + ENDIF. + IF col = 2. + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_borders_left_style = zcl_excel_style_border=>c_border_thick + ip_borders_left_color_rgb = zcl_excel_style_color=>c_black ). + ENDIF. + IF col = 9. + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_borders_right_style = zcl_excel_style_border=>c_border_thick + ip_borders_right_color_rgb = zcl_excel_style_color=>c_black ). + ENDIF. +* Style for writing + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_font_color_rgb = color + ip_font_bold = 'X' + ip_font_size = 16 + ip_alignment_horizontal = zcl_excel_style_alignment=>c_horizontal_center + ip_alignment_vertical = zcl_excel_style_alignment=>c_vertical_center + ip_fill_filltype = zcl_excel_style_fill=>c_fill_solid ). +* Color of field + colorflag = ( row + col ) MOD 2. + IF colorflag = 0. + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_fill_fgcolor_rgb = 'FFB5866A' + ip_fill_filltype = zcl_excel_style_fill=>c_fill_gradient_diagonal135 ). + ELSE. + lo_worksheet->change_cell_style( ip_column = col_alpha + ip_row = row + ip_fill_fgcolor_rgb = 'FFF5DEBF' + ip_fill_filltype = zcl_excel_style_fill=>c_fill_gradient_diagonal45 ). + ENDIF. + + + + CATCH zcx_excel . + ENDTRY. + + ENDDO. + ENDDO. + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL2 +*& Test Styles for ABAP2XLSX +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel35. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_bold TYPE REF TO zcl_excel_style, + lo_style_underline TYPE REF TO zcl_excel_style, + lo_style_filled TYPE REF TO zcl_excel_style, + lo_style_border TYPE REF TO zcl_excel_style, + lo_style_button TYPE REF TO zcl_excel_style, + lo_border_dark TYPE REF TO zcl_excel_style_border, + lo_border_light TYPE REF TO zcl_excel_style_border. + +DATA: lv_style_bold_guid TYPE zexcel_cell_style, + lv_style_underline_guid TYPE zexcel_cell_style, + lv_style_filled_guid TYPE zexcel_cell_style, + lv_style_filled_green_guid TYPE zexcel_cell_style, + lv_style_border_guid TYPE zexcel_cell_style, + lv_style_button_guid TYPE zexcel_cell_style, + lv_style_filled_turquoise_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE '35_Static_Styles.xlsx'. + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>GET_DESKTOP_DIRECTORY( CHANGING DESKTOP_DIRECTORY = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + + sy-title = 'ZDEMO_EXCEL2;Issue 139: Change cellstyle retroactivly'. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create border object + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + CREATE OBJECT lo_border_light. + lo_border_light->border_color-rgb = zcl_excel_style_color=>c_gray. + lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. + " Create a bold / italic style + lo_style_bold = lo_excel->add_new_style( ). + lo_style_bold->font->bold = abap_true. + lo_style_bold->font->italic = abap_true. + lo_style_bold->font->name = zcl_excel_style_font=>c_name_arial. + lo_style_bold->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_bold->font->color-rgb = zcl_excel_style_color=>c_red. + lv_style_bold_guid = lo_style_bold->get_guid( ). + " Create an underline double style + lo_style_underline = lo_excel->add_new_style( ). + lo_style_underline->font->underline = abap_true. + lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. + lo_style_underline->font->name = zcl_excel_style_font=>c_name_roman. + lo_style_underline->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_underline->font->family = zcl_excel_style_font=>c_family_roman. + lv_style_underline_guid = lo_style_underline->get_guid( ). + " Create filled style yellow + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-theme = zcl_excel_style_color=>c_theme_accent6. + lv_style_filled_guid = lo_style_filled->get_guid( ). + " Create border with button effects + lo_style_button = lo_excel->add_new_style( ). + lo_style_button->borders->right = lo_border_dark. + lo_style_button->borders->down = lo_border_dark. + lo_style_button->borders->left = lo_border_light. + lo_style_button->borders->top = lo_border_light. + lv_style_button_guid = lo_style_button->get_guid( ). + "Create style with border + lo_style_border = lo_excel->add_new_style( ). + lo_style_border->borders->allborders = lo_border_dark. + lo_style_border->borders->diagonal = lo_border_dark. + lo_style_border->borders->diagonal_mode = zcl_excel_style_borders=>c_diagonal_both. + lv_style_border_guid = lo_style_border->get_guid( ). + " Create filled style green + lo_style_filled = lo_excel->add_new_style( ). + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_green. + lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. + lv_style_filled_green_guid = lo_style_filled->get_guid( ). + + " Create filled style turquoise using legacy excel ver <= 2003 palette. (https://code.sdn.sap.com/spaces/abap2xlsx/tickets/92) + lo_style_filled = lo_excel->add_new_style( ). + lo_excel->legacy_palette->set_color( "replace built-in color from palette with out custom RGB turquoise + ip_index = 16 + ip_color = '0040E0D0' ). + + lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_filled->fill->fgcolor-indexed = 16. + lv_style_filled_turquoise_guid = lo_style_filled->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Styles' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 9 ip_value = 'Modified color for Excel 2003' ip_style = lv_style_filled_turquoise_guid ). + " Fill the cell and apply one style + lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). + " Change the style + lo_worksheet->set_cell_style( ip_column = 'B' ip_row = 6 ip_style = lv_style_filled_green_guid ). + " Add Style to an empty cell to test Fix for Issue + "#44 Exception ZCX_EXCEL thrown when style is set for an empty cell + " https://code.sdn.sap.com/spaces/abap2xlsx/tickets/44-exception-zcx_excel-thrown-when-style-is-set-for-an-empty-cell + lo_worksheet->set_cell_style( ip_column = 'E' ip_row = 6 ip_style = lv_style_filled_green_guid ). + + +* Demonstrate how to retroactivly change the cellstyle +*Filled text and underlinded text + lo_worksheet->change_cell_style( ip_column = 'B' + ip_row = 5 + ip_font_bold = abap_true + ip_font_italic = abap_true ). + + lo_worksheet->change_cell_style( ip_column = 'D' + ip_row = 4 + ip_font_bold = abap_true + ip_font_italic = abap_true ). + + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +* " This method is only available on AS ABAP > 6.40 +* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). +* lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL36 +REPORT zdemo_excel36. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + col TYPE i. + +DATA: lo_style_arial20 TYPE REF TO zcl_excel_style, + lo_style_times11 TYPE REF TO zcl_excel_style, + lo_style_cambria8red TYPE REF TO zcl_excel_style. + +DATA: lv_style_arial20_guid TYPE zexcel_cell_style, + lv_style_times11_guid TYPE zexcel_cell_style, + lv_style_cambria8red_guid TYPE zexcel_cell_style. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '36_DefaultStyles.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create a bold / italic style + lo_style_arial20 = lo_excel->add_new_style( ). + lo_style_arial20->font->name = zcl_excel_style_font=>c_name_arial. + lo_style_arial20->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_arial20->font->size = 20. + lv_style_arial20_guid = lo_style_arial20->get_guid( ). + + lo_style_times11 = lo_excel->add_new_style( ). + lo_style_times11->font->name = zcl_excel_style_font=>c_name_roman. + lo_style_times11->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_times11->font->size = 11. + lv_style_times11_guid = lo_style_times11->get_guid( ). + + lo_style_cambria8red = lo_excel->add_new_style( ). + lo_style_cambria8red->font->name = zcl_excel_style_font=>c_name_cambria. + lo_style_cambria8red->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_cambria8red->font->size = 8. + lo_style_cambria8red->font->color-rgb = zcl_excel_style_color=>c_red. + lv_style_cambria8red_guid = lo_style_cambria8red->get_guid( ). + + lo_excel->set_default_style( lv_style_arial20_guid ). " Default for all new worksheets + +* 1st sheet - do not change anything --> defaultstyle from lo_excel should apply + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'Style for complete document' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 4 ip_value = 'All cells in this sheet are set to font Arial, fontsize 20' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 5 ip_value = 'because no separate style was passed for this sheet' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 6 ip_value = 'but a default style was set for the complete instance of zcl_excel' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 1 ip_value = space ). " Missing feature "set active cell - use this to simulate that + + +* 2nd sheet - defaultstyle for this sheet set explicitly ( set to Times New Roman 11 ) + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( 'Style for this sheet' ). + lo_worksheet->zif_excel_sheet_properties~set_style( lv_style_times11_guid ). + + lo_worksheet->set_cell( ip_column = 2 ip_row = 4 ip_value = 'All cells in this sheet are set to font Times New Roman, fontsize 11' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 5 ip_value = 'because this style was passed for this sheet' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 6 ip_value = 'thus the default style from zcl_excel does not apply to this sheet' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 1 ip_value = space ). " Missing feature "set active cell - use this to simulate that + + +* 3rd sheet - defaultstyle for columns ( set to Times New Roman 11 ) + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( 'Style for 3 columns' ). + column_dimension = lo_worksheet->get_column_dimension( 'B' ). + column_dimension->set_column_style_by_guid( ip_style_guid = lv_style_times11_guid ). + column_dimension = lo_worksheet->get_column_dimension( 'C' ). + column_dimension->set_column_style_by_guid( ip_style_guid = lv_style_times11_guid ). + column_dimension = lo_worksheet->get_column_dimension( 'F' ). + column_dimension->set_column_style_by_guid( ip_style_guid = lv_style_times11_guid ). + + lo_worksheet->set_cell( ip_column = 2 ip_row = 4 ip_value = 'The columns B,C and F are set to Times New Roman' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 10 ip_value = 'All other cells in this sheet are set to font Arial, fontsize 20' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 11 ip_value = 'because no separate style was passed for this sheet' ). + lo_worksheet->set_cell( ip_column = 2 ip_row = 12 ip_value = 'but a default style was set for the complete instance of zcl_excel' ). + + lo_worksheet->set_cell( ip_column = 8 ip_row = 1 ip_value = 'Of course' ip_style = lv_style_cambria8red_guid ). + lo_worksheet->set_cell( ip_column = 8 ip_row = 2 ip_value = 'setting a specific style to a cell' ip_style = lv_style_cambria8red_guid ). + lo_worksheet->set_cell( ip_column = 8 ip_row = 3 ip_value = 'takes precedence over all defaults' ip_style = lv_style_cambria8red_guid ). + lo_worksheet->set_cell( ip_column = 8 ip_row = 4 ip_value = 'Here: Cambria 8 in red' ip_style = lv_style_cambria8red_guid ). + + +* Set entry into each of the first 10 columns + DO 20 TIMES. + col = sy-index. + CASE col. + WHEN 2 " B + OR 3 " C + OR 6." F + lo_worksheet->set_cell( ip_column = col ip_row = 6 ip_value = 'Times 11' ). + WHEN OTHERS. + lo_worksheet->set_cell( ip_column = col ip_row = 6 ip_value = 'Arial 20' ). + ENDCASE. + ENDDO. + + lo_worksheet->set_cell( ip_column = 2 ip_row = 1 ip_value = space ). " Missing feature "set active cell - use this to simulate that + + + + lo_excel->set_active_sheet_index( 1 ). + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + + + + + + + + + + + + + + + + + + REPORT zdemo_excel37. + +DATA: excel TYPE REF TO zcl_excel, + reader TYPE REF TO zif_excel_reader, + go_error TYPE REF TO cx_root, + gv_memid_gr8 TYPE text255, + gv_message TYPE string, + lv_extension TYPE string, + gv_error_program_name TYPE syrepid, + gv_error_include_name TYPE syrepid, + gv_error_line TYPE i. + +DATA: gc_save_file_name TYPE string VALUE '37- Read template and output.&'. + +SELECTION-SCREEN BEGIN OF BLOCK blx WITH FRAME. +PARAMETERS: p_upfile TYPE string LOWER CASE MEMORY ID gr8. +SELECTION-SCREEN END OF BLOCK blx. + +INCLUDE zdemo_excel_outputopt_incl. + +SELECTION-SCREEN BEGIN OF BLOCK cls WITH FRAME TITLE text-cls. +PARAMETERS: lb_read TYPE seoclsname AS LISTBOX VISIBLE LENGTH 40 LOWER CASE OBLIGATORY DEFAULT 'Autodetect'(001). +PARAMETERS: lb_write TYPE seoclsname AS LISTBOX VISIBLE LENGTH 40 LOWER CASE OBLIGATORY DEFAULT 'Autodetect'(001). +SELECTION-SCREEN END OF BLOCK cls. + +SELECTION-SCREEN BEGIN OF BLOCK bl_err WITH FRAME TITLE text-err. +PARAMETERS: cb_errl AS CHECKBOX DEFAULT 'X'. +SELECTION-SCREEN BEGIN OF LINE. +PARAMETERS: cb_dump AS CHECKBOX DEFAULT space. +SELECTION-SCREEN COMMENT (60) cmt_dump FOR FIELD cb_dump. +SELECTION-SCREEN END OF LINE. +SELECTION-SCREEN END OF BLOCK bl_err. + +INITIALIZATION. + PERFORM setup_listboxes. + cmt_dump = text-dum. + GET PARAMETER ID 'GR8' FIELD gv_memid_gr8. + p_upfile = gv_memid_gr8. + + IF p_upfile IS INITIAL. + p_upfile = 'c:\temp\whatever.xlsx'. + ENDIF. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_upfile. + PERFORM f4_p_upfile CHANGING p_upfile. + + +START-OF-SELECTION. + IF cb_dump IS INITIAL. + TRY. + PERFORM read_template. + PERFORM write_template. +*** Create output + CATCH cx_root INTO go_error. + MESSAGE 'Error reading excelfile' TYPE 'I'. + gv_message = go_error->get_text( ). + IF cb_errl = ' '. + IF gv_message IS NOT INITIAL. + MESSAGE gv_message TYPE 'I'. + ENDIF. + ELSE. + go_error->get_source_position( IMPORTING program_name = gv_error_program_name + include_name = gv_error_include_name + source_line = gv_error_line ). + WRITE:/ 'Errormessage:' ,gv_message. + WRITE:/ 'Errorposition:', + AT /10 'Program:' ,gv_error_program_name, + AT /10 'include_name:' ,gv_error_include_name, + AT /10 'source_line:' ,gv_error_line. + ENDIF. + ENDTRY. + ELSE. " This will dump if an error occurs. In some cases the information given in cx_root is not helpful - this will show exactly where the problem is + PERFORM read_template. + PERFORM write_template. + ENDIF. + + + +*&---------------------------------------------------------------------* +*& Form F4_P_UPFILE +*&---------------------------------------------------------------------* +FORM f4_p_upfile CHANGING p_upfile TYPE string. + + DATA: lv_repid TYPE syrepid, + lt_fields TYPE dynpread_tabtype, + ls_field LIKE LINE OF lt_fields, + lt_files TYPE filetable, + lv_file_filter TYPE string. + + lv_repid = sy-repid. + + CALL FUNCTION 'DYNP_VALUES_READ' + EXPORTING + dyname = lv_repid + dynumb = '1000' + request = 'A' + TABLES + dynpfields = lt_fields + EXCEPTIONS + invalid_abapworkarea = 01 + invalid_dynprofield = 02 + invalid_dynproname = 03 + invalid_dynpronummer = 04 + invalid_request = 05 + no_fielddescription = 06 + undefind_error = 07. + READ TABLE lt_fields INTO ls_field WITH KEY fieldname = 'P_UPFILE'. + p_upfile = ls_field-fieldvalue. + + lv_file_filter = 'Excel Files (*.XLSX;*.XLSM)|*.XLSX;*.XLSM'. + cl_gui_frontend_services=>file_open_dialog( EXPORTING + default_filename = p_upfile + file_filter = lv_file_filter + CHANGING + file_table = lt_files + rc = sy-tabix + EXCEPTIONS + OTHERS = 1 ). + READ TABLE lt_files INDEX 1 INTO p_upfile. + +ENDFORM. " F4_P_UPFILE + + +*&---------------------------------------------------------------------* +*& Form SETUP_LISTBOXES +*&---------------------------------------------------------------------* +FORM setup_listboxes . + + DATA: lv_id TYPE vrm_id, + lt_values TYPE vrm_values, + lt_implementing_classes TYPE seo_relkeys. + + FIELD-SYMBOLS: <ls_implementing_class> LIKE LINE OF lt_implementing_classes, + <ls_value> LIKE LINE OF lt_values. + +*--------------------------------------------------------------------* +* Possible READER-Classes +*--------------------------------------------------------------------* + lv_id = 'LB_READ'. + APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>. + <ls_value>-key = 'Autodetect'(001). + <ls_value>-text = 'Autodetect'(001). + + + PERFORM get_implementing_classds USING 'ZIF_EXCEL_READER' + CHANGING lt_implementing_classes. + CLEAR lt_values. + LOOP AT lt_implementing_classes ASSIGNING <ls_implementing_class>. + + APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>. + <ls_value>-key = <ls_implementing_class>-clsname. + <ls_value>-text = <ls_implementing_class>-clsname. + + ENDLOOP. + + CALL FUNCTION 'VRM_SET_VALUES' + EXPORTING + id = lv_id + values = lt_values + EXCEPTIONS + id_illegal_name = 1 + OTHERS = 2. + +*--------------------------------------------------------------------* +* Possible WRITER-Classes +*--------------------------------------------------------------------* + lv_id = 'LB_WRITE'. + APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>. + <ls_value>-key = 'Autodetect'(001). + <ls_value>-text = 'Autodetect'(001). + + + PERFORM get_implementing_classds USING 'ZIF_EXCEL_WRITER' + CHANGING lt_implementing_classes. + CLEAR lt_values. + LOOP AT lt_implementing_classes ASSIGNING <ls_implementing_class>. + + APPEND INITIAL LINE TO lt_values ASSIGNING <ls_value>. + <ls_value>-key = <ls_implementing_class>-clsname. + <ls_value>-text = <ls_implementing_class>-clsname. + + ENDLOOP. + + CALL FUNCTION 'VRM_SET_VALUES' + EXPORTING + id = lv_id + values = lt_values + EXCEPTIONS + id_illegal_name = 1 + OTHERS = 2. + +ENDFORM. " SETUP_LISTBOXES + + +*&---------------------------------------------------------------------* +*& Form GET_IMPLEMENTING_CLASSDS +*&---------------------------------------------------------------------* +FORM get_implementing_classds USING iv_interface_name TYPE clike + CHANGING ct_implementing_classes TYPE seo_relkeys. + + DATA: lo_oo_interface TYPE REF TO cl_oo_interface, + lo_oo_class TYPE REF TO cl_oo_class, + lt_implementing_subclasses TYPE seo_relkeys. + + FIELD-SYMBOLS: <ls_implementing_class> LIKE LINE OF ct_implementing_classes. + + TRY. + lo_oo_interface ?= cl_oo_interface=>get_instance( iv_interface_name ). + CATCH cx_class_not_existent. + RETURN. + ENDTRY. + ct_implementing_classes = lo_oo_interface->get_implementing_classes( ). + + LOOP AT ct_implementing_classes ASSIGNING <ls_implementing_class>. + TRY. + lo_oo_class ?= cl_oo_class=>get_instance( <ls_implementing_class>-clsname ). + lt_implementing_subclasses = lo_oo_class->get_subclasses( ). + APPEND LINES OF lt_implementing_subclasses TO ct_implementing_classes. + CATCH cx_class_not_existent. + ENDTRY. + ENDLOOP. + + +ENDFORM. " GET_IMPLEMENTING_CLASSDS + + +*&---------------------------------------------------------------------* +*& Form READ_TEMPLATE +*&---------------------------------------------------------------------* +FORM read_template RAISING zcx_excel . + + CASE lb_read. + WHEN 'Autodetect'(001). + FIND REGEX '(\.xlsx|\.xlsm)\s*$' IN p_upfile SUBMATCHES lv_extension. + TRANSLATE lv_extension TO UPPER CASE. + CASE lv_extension. + + WHEN '.XLSX'. + CREATE OBJECT reader TYPE zcl_excel_reader_2007. + excel = reader->load_file( p_upfile ). + "Use template for charts + excel->use_template = abap_true. + + WHEN '.XLSM'. + CREATE OBJECT reader TYPE zcl_excel_reader_xlsm. + excel = reader->load_file( p_upfile ). + "Use template for charts + excel->use_template = abap_true. + + WHEN OTHERS. + MESSAGE 'Unsupported filetype' TYPE 'I'. + RETURN. + + ENDCASE. + + WHEN OTHERS. + CREATE OBJECT reader TYPE (lb_read). + excel = reader->load_file( p_upfile ). + "Use template for charts + excel->use_template = abap_true. + + ENDCASE. + +ENDFORM. " READ_TEMPLATE + + +*&---------------------------------------------------------------------* +*& Form WRITE_TEMPLATE +*&---------------------------------------------------------------------* +FORM write_template RAISING zcx_excel. + + CASE lb_write. + + WHEN 'Autodetect'(001). + FIND REGEX '(\.xlsx|\.xlsm)\s*$' IN p_upfile SUBMATCHES lv_extension. + TRANSLATE lv_extension TO UPPER CASE. + CASE lv_extension. + + WHEN '.XLSX'. + REPLACE '&' IN gc_save_file_name WITH 'xlsx'. " Pass extension for standard writer + lcl_output=>output( excel ). + + WHEN '.XLSM'. + REPLACE '&' IN gc_save_file_name WITH 'xlsm'. " Pass extension for macro-writer + lcl_output=>output( cl_excel = excel + iv_writerclass_name = 'ZCL_EXCEL_WRITER_XLSM' ). + + WHEN OTHERS. + MESSAGE 'Unsupported filetype' TYPE 'I'. + RETURN. + + ENDCASE. + + WHEN OTHERS. + lcl_output=>output( cl_excel = excel + iv_writerclass_name = lb_write ). + ENDCASE. + +ENDFORM. " WRITE_TEMPLATE + + + + + + + + + REPORT. + + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lo_drawing TYPE REF TO zcl_excel_drawing. + +TYPES: BEGIN OF gty_icon, +* name TYPE icon_name, "Fix #228 + name TYPE iconname, "Fix #228 + objid TYPE w3objid, + END OF gty_icon, + gtyt_icon TYPE STANDARD TABLE OF gty_icon WITH NON-UNIQUE DEFAULT KEY. + +DATA: lt_icon TYPE gtyt_icon, + lv_row TYPE sytabix, + ls_wwwdatatab TYPE wwwdatatab, + lt_mimedata TYPE STANDARD TABLE OF w3mime WITH NON-UNIQUE DEFAULT KEY, + lv_xstring TYPE xstring. + +FIELD-SYMBOLS: <icon> LIKE LINE OF lt_icon, + <mimedata> LIKE LINE OF lt_mimedata. + +CONSTANTS: gc_save_file_name TYPE string VALUE '38_SAP-Icons.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +TABLES: icon. +SELECT-OPTIONS: s_icon FOR icon-name DEFAULT 'ICON_LED_*' OPTION CP. + +START-OF-SELECTION. + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo Icons' ). + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). + lo_column_dimension->set_auto_size( 'X' ). + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + lo_column_dimension->set_auto_size( 'X' ). + +* Get all icons + SELECT name + INTO TABLE lt_icon + FROM icon + WHERE name IN s_icon + ORDER BY name. + LOOP AT lt_icon ASSIGNING <icon>. + + lv_row = sy-tabix. +*--------------------------------------------------------------------* +* Set name of icon +*--------------------------------------------------------------------* + lo_worksheet->set_cell( ip_row = lv_row + ip_column = 'A' + ip_value = <icon>-name ). +*--------------------------------------------------------------------* +* Check whether the mime-repository holds some icondata for us +*--------------------------------------------------------------------* + +* Get key + SELECT SINGLE objid + INTO <icon>-objid + FROM wwwdata + WHERE text = <icon>-name. + CHECK sy-subrc = 0. " :o( + lo_worksheet->set_cell( ip_row = lv_row + ip_column = 'B' + ip_value = <icon>-objid ). + +* Load mimedata + CLEAR lt_mimedata. + CLEAR ls_wwwdatatab. + ls_wwwdatatab-relid = 'MI' . + ls_wwwdatatab-objid = <icon>-objid. + CALL FUNCTION 'WWWDATA_IMPORT' + EXPORTING + key = ls_wwwdatatab + TABLES + mime = lt_mimedata + EXCEPTIONS + wrong_object_type = 1 + import_error = 2 + OTHERS = 3. + CHECK sy-subrc = 0. " :o( + + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = lv_row + ip_from_col = 'C' ). + CLEAR lv_xstring. + LOOP AT lt_mimedata ASSIGNING <mimedata>. + CONCATENATE lv_xstring <mimedata>-line INTO lv_xstring IN BYTE MODE. + ENDLOOP. + + lo_drawing->set_media( ip_media = lv_xstring + ip_media_type = zcl_excel_drawing=>c_media_type_jpg + ip_width = 16 + ip_height = 14 ). + lo_worksheet->add_drawing( lo_drawing ). + + ENDLOOP. + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL16 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel39. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_drawing TYPE REF TO zcl_excel_drawing. + +DATA lv_value TYPE i. + +DATA: ls_io TYPE skwf_io. + +DATA: ls_upper TYPE zexcel_drawing_location, + ls_lower TYPE zexcel_drawing_location. + +DATA lo_bar1 TYPE REF TO zcl_excel_graph_bars. +DATA lo_bar2 TYPE REF TO zcl_excel_graph_bars. +DATA lo_pie TYPE REF TO zcl_excel_graph_pie. +DATA lo_line TYPE REF TO zcl_excel_graph_line. + +CONSTANTS: gc_save_file_name TYPE string VALUE '39_Charts.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +START-OF-SELECTION. + + " Create a pie chart and series + CREATE OBJECT lo_pie. + + CALL METHOD lo_pie->create_serie + EXPORTING + ip_order = 0 + ip_sheet = 'Values' + ip_lbl_from_col = 'B' + ip_lbl_from_row = '1' + ip_lbl_to_col = 'B' + ip_lbl_to_row = '3' + ip_ref_from_col = 'A' + ip_ref_from_row = '1' + ip_ref_to_col = 'A' + ip_ref_to_row = '3' + ip_sername = 'My serie 1'. + + " Set style + lo_pie->set_style( zcl_excel_graph=>c_style_15 ). + + " Create a bar chart, series and axes + CREATE OBJECT lo_bar1. + + CALL METHOD lo_bar1->create_serie + EXPORTING + ip_order = 0 + ip_invertifnegative = zcl_excel_graph_bars=>c_invertifnegative_no + ip_lbl = 'Values!$D$1:$D$3' + ip_ref = 'Values!$C$1:$C$3' + ip_sername = 'My serie 1'. + + CALL METHOD lo_bar1->create_serie + EXPORTING + ip_order = 1 + ip_invertifnegative = zcl_excel_graph_bars=>c_invertifnegative_no + ip_lbl = 'Values!$B$1:$B$3' + ip_ref = 'Values!$A$1:$A$3' + ip_sername = 'My serie 2'. + + CALL METHOD lo_bar1->create_ax + EXPORTING +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_catax +* ip_orientation = +* ip_delete = +* ip_axpos = +* ip_formatcode = +* ip_sourcelinked = +* ip_majortickmark = +* ip_minortickmark = +* ip_ticklblpos = +* ip_crossax = +* ip_crosses = +* ip_auto = +* ip_lblalgn = +* ip_lbloffset = +* ip_nomultilvllbl = +* ip_crossbetween = + . + + CALL METHOD lo_bar1->create_ax + EXPORTING +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_valax +* ip_orientation = +* ip_delete = +* ip_axpos = +* ip_formatcode = +* ip_sourcelinked = +* ip_majortickmark = +* ip_minortickmark = +* ip_ticklblpos = +* ip_crossax = +* ip_crosses = +* ip_auto = +* ip_lblalgn = +* ip_lbloffset = +* ip_nomultilvllbl = +* ip_crossbetween = + . + + " Set style + lo_bar1->set_style( zcl_excel_graph=>c_style_default ). + + " Set label to none + lo_bar1->set_print_lbl( zcl_excel_graph_bars=>c_show_false ). + + " Create a bar chart, series and axes + CREATE OBJECT lo_bar2. + + CALL METHOD lo_bar2->create_serie + EXPORTING + ip_order = 0 + ip_invertifnegative = zcl_excel_graph_bars=>c_invertifnegative_yes + ip_lbl = 'Values!$D$1:$D$3' + ip_ref = 'Values!$C$1:$C$3' + ip_sername = 'My serie 1'. + + CALL METHOD lo_bar2->create_ax + EXPORTING +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_catax +* ip_orientation = +* ip_delete = +* ip_axpos = +* ip_formatcode = +* ip_sourcelinked = +* ip_majortickmark = +* ip_minortickmark = +* ip_ticklblpos = +* ip_crossax = +* ip_crosses = +* ip_auto = +* ip_lblalgn = +* ip_lbloffset = +* ip_nomultilvllbl = +* ip_crossbetween = + . + + CALL METHOD lo_bar2->create_ax + EXPORTING +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_valax +* ip_orientation = +* ip_delete = +* ip_axpos = +* ip_formatcode = +* ip_sourcelinked = +* ip_majortickmark = +* ip_minortickmark = +* ip_ticklblpos = +* ip_crossax = +* ip_crosses = +* ip_auto = +* ip_lblalgn = +* ip_lbloffset = +* ip_nomultilvllbl = +* ip_crossbetween = + . + + " Set layout + lo_bar2->set_show_legend_key( zcl_excel_graph_bars=>c_show_true ). + lo_bar2->set_show_values( zcl_excel_graph_bars=>c_show_true ). + lo_bar2->set_show_cat_name( zcl_excel_graph_bars=>c_show_true ). + lo_bar2->set_show_ser_name( zcl_excel_graph_bars=>c_show_true ). + lo_bar2->set_show_percent( zcl_excel_graph_bars=>c_show_true ). + lo_bar2->set_varycolor( zcl_excel_graph_bars=>c_show_true ). + + " Create a line chart, series and axes + CREATE OBJECT lo_line. + + CALL METHOD lo_line->create_serie + EXPORTING + ip_order = 0 + ip_symbol = zcl_excel_graph_line=>c_symbol_auto + ip_smooth = zcl_excel_graph_line=>c_show_false + ip_lbl = 'Values!$D$1:$D$3' + ip_ref = 'Values!$C$1:$C$3' + ip_sername = 'My serie 1'. + + CALL METHOD lo_line->create_serie + EXPORTING + ip_order = 1 + ip_symbol = zcl_excel_graph_line=>c_symbol_none + ip_smooth = zcl_excel_graph_line=>c_show_false + ip_lbl = 'Values!$B$1:$B$3' + ip_ref = 'Values!$A$1:$A$3' + ip_sername = 'My serie 2'. + + CALL METHOD lo_line->create_serie + EXPORTING + ip_order = 2 + ip_symbol = zcl_excel_graph_line=>c_symbol_auto + ip_smooth = zcl_excel_graph_line=>c_show_false + ip_lbl = 'Values!$F$1:$F$3' + ip_ref = 'Values!$E$1:$E$3' + ip_sername = 'My serie 3'. + + CALL METHOD lo_line->create_ax + EXPORTING +* ip_axid = + ip_type = zcl_excel_graph_line=>c_catax +* ip_orientation = +* ip_delete = +* ip_axpos = +* ip_majortickmark = +* ip_minortickmark = +* ip_ticklblpos = +* ip_crossax = +* ip_crosses = +* ip_auto = +* ip_lblalgn = +* ip_lbloffset = +* ip_nomultilvllbl = +* ip_crossbetween = + . + + CALL METHOD lo_line->create_ax + EXPORTING +* ip_axid = + ip_type = zcl_excel_graph_line=>c_valax +* ip_orientation = +* ip_delete = +* ip_axpos = +* ip_formatcode = +* ip_sourcelinked = +* ip_majortickmark = +* ip_minortickmark = +* ip_ticklblpos = +* ip_crossax = +* ip_crosses = +* ip_auto = +* ip_lblalgn = +* ip_lbloffset = +* ip_nomultilvllbl = +* ip_crossbetween = + . + + + + + + + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet (Pie sheet) + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( 'PieChart' ). + + " Create global drawing, set type as pie chart, assign chart, set position and media type + lo_drawing = lo_worksheet->excel->add_new_drawing( + ip_type = zcl_excel_drawing=>type_chart + ip_title = 'CHART PIE' ). + lo_drawing->graph = lo_pie. + lo_drawing->graph_type = zcl_excel_drawing=>c_graph_pie. + + "Set chart position (anchor 2 cells) + ls_lower-row = 30. + ls_lower-col = 20. + lo_drawing->set_position2( + EXPORTING + ip_from = ls_upper + ip_to = ls_lower ). + + lo_drawing->set_media( + EXPORTING + ip_media_type = zcl_excel_drawing=>c_media_type_xml ). + + lo_worksheet->add_drawing( lo_drawing ). + + " BarChart1 sheet + + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'BarChart1' ). + + " Create global drawing, set type as bar chart, assign chart, set position and media type + lo_drawing = lo_worksheet->excel->add_new_drawing( + ip_type = zcl_excel_drawing=>type_chart + ip_title = 'CHART BARS WITH 2 SERIES' ). + lo_drawing->graph = lo_bar1. + lo_drawing->graph_type = zcl_excel_drawing=>c_graph_bars. + + "Set chart position (anchor 2 cells) + ls_upper-row = 0. + ls_upper-col = 11. + ls_lower-row = 22. + ls_lower-col = 21. + lo_drawing->set_position2( + EXPORTING + ip_from = ls_upper + ip_to = ls_lower ). + + lo_drawing->set_media( + EXPORTING + ip_media_type = zcl_excel_drawing=>c_media_type_xml ). + + lo_worksheet->add_drawing( lo_drawing ). + + " BarChart2 sheet + + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'BarChart2' ). + + " Create global drawing, set type as bar chart, assign chart, set position and media type + lo_drawing = lo_worksheet->excel->add_new_drawing( + ip_type = zcl_excel_drawing=>type_chart + ip_title = 'CHART BARS WITH 1 SERIE' ). + lo_drawing->graph = lo_bar2. + lo_drawing->graph_type = zcl_excel_drawing=>c_graph_bars. + + "Set chart position (anchor 2 cells) + ls_upper-row = 0. + ls_upper-col = 0. + ls_lower-row = 30. + ls_lower-col = 20. + lo_drawing->set_position2( + EXPORTING + ip_from = ls_upper + ip_to = ls_lower ). + + lo_drawing->set_media( + EXPORTING + ip_media_type = zcl_excel_drawing=>c_media_type_xml ). + + lo_worksheet->add_drawing( lo_drawing ). + + " LineChart sheet + + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'LineChart' ). + + " Create global drawing, set type as line chart, assign chart, set position and media type + lo_drawing = lo_worksheet->excel->add_new_drawing( + ip_type = zcl_excel_drawing=>type_chart + ip_title = 'CHART LINES' ). + lo_drawing->graph = lo_line. + lo_drawing->graph_type = zcl_excel_drawing=>c_graph_line. + + "Set chart position (anchor 2 cells) + ls_upper-row = 0. + ls_upper-col = 0. + ls_lower-row = 30. + ls_lower-col = 20. + lo_drawing->set_position2( + EXPORTING + ip_from = ls_upper + ip_to = ls_lower ). + + lo_drawing->set_media( + EXPORTING + ip_media_type = zcl_excel_drawing=>c_media_type_xml ). + + lo_worksheet->add_drawing( lo_drawing ). + + " Values sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Values' ). + + " Set values for chart + lv_value = 1. + lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = lv_value ). + lv_value = 2. + lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = lv_value ). + lv_value = 3. + lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = lv_value ). + + " Set labels for chart + lo_worksheet->set_cell( ip_column = 'B' ip_row = 1 ip_value = 'One' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Two' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'Three' ). + + " Set values for chart + lv_value = 3. + lo_worksheet->set_cell( ip_column = 'C' ip_row = 1 ip_value = lv_value ). + lv_value = 2. + lo_worksheet->set_cell( ip_column = 'C' ip_row = 2 ip_value = lv_value ). + lv_value = -1. + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = lv_value ). + + " Set labels for chart + lo_worksheet->set_cell( ip_column = 'D' ip_row = 3 ip_value = 'One (Minus)' ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 2 ip_value = 'Two' ). + lo_worksheet->set_cell( ip_column = 'D' ip_row = 1 ip_value = 'Three' ). + + " Set values for chart + lv_value = 3. + lo_worksheet->set_cell( ip_column = 'E' ip_row = 1 ip_value = lv_value ). + lv_value = 1. + lo_worksheet->set_cell( ip_column = 'E' ip_row = 2 ip_value = lv_value ). + lv_value = 2. + lo_worksheet->set_cell( ip_column = 'E' ip_row = 3 ip_value = lv_value ). + + " Set labels for chart + lo_worksheet->set_cell( ip_column = 'F' ip_row = 3 ip_value = 'Two' ). + lo_worksheet->set_cell( ip_column = 'F' ip_row = 2 ip_value = 'One' ). + lo_worksheet->set_cell( ip_column = 'F' ip_row = 1 ip_value = 'Three' ). + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL4 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel4. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + + lo_hyperlink TYPE REF TO zcl_excel_hyperlink, + + lv_tabcolor TYPE zexcel_s_tabcolor, + + ls_header TYPE zexcel_s_worksheet_head_foot, + ls_footer TYPE zexcel_s_worksheet_head_foot. + +CONSTANTS: gc_save_file_name TYPE string VALUE '04_Sheets.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet1' ). + lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet' ). +* Set color to tab with sheetname - Red + lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = 'FF' + ip_green = '00' + ip_blu = '00' ). + lo_worksheet->set_tabcolor( lv_tabcolor ). + + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet2!B2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to second sheet' ip_hyperlink = lo_hyperlink ). + + " Page printing settings + lo_worksheet->sheet_setup->set_page_margins( ip_header = '1' ip_footer = '1' ip_unit = 'cm' ). + lo_worksheet->sheet_setup->black_and_white = 'X'. + lo_worksheet->sheet_setup->fit_to_page = 'X'. " you should turn this on to activate fit_to_height and fit_to_width + lo_worksheet->sheet_setup->fit_to_height = 0. " used only if ip_fit_to_page = 'X' + lo_worksheet->sheet_setup->fit_to_width = 2. " used only if ip_fit_to_page = 'X' + lo_worksheet->sheet_setup->orientation = zcl_excel_sheet_setup=>c_orientation_landscape. + lo_worksheet->sheet_setup->page_order = zcl_excel_sheet_setup=>c_ord_downthenover. + lo_worksheet->sheet_setup->paper_size = zcl_excel_sheet_setup=>c_papersize_a4. + lo_worksheet->sheet_setup->scale = 80. " used only if ip_fit_to_page = SPACE + + " Header and Footer + ls_header-right_value = 'print date &D'. + ls_header-right_font-size = 8. + ls_header-right_font-name = zcl_excel_style_font=>c_name_arial. + + ls_footer-left_value = '&Z&F'. "Path / Filename + ls_footer-left_font = ls_header-right_font. + ls_footer-right_value = 'page &P of &N'. "page x of y + ls_footer-right_font = ls_header-right_font. + + lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header + ip_odd_footer = ls_footer ). + + + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet2' ). +* Set color to tab with sheetname - Green + lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = '00' + ip_green = 'FF' + ip_blu = '00' ). + lo_worksheet->set_tabcolor( lv_tabcolor ). + lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet1!B2' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to first sheet' ip_hyperlink = lo_hyperlink ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 4 ip_value = 'Sheet3 is hidden' ). + + lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header + ip_odd_footer = ls_footer ). + + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet3' ). +* Set color to tab with sheetname - Blue + lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = '00' + ip_green = '00' + ip_blu = 'FF' ). + lo_worksheet->set_tabcolor( lv_tabcolor ). + lo_worksheet->zif_excel_sheet_properties~hidden = zif_excel_sheet_properties=>c_hidden. + + lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header + ip_odd_footer = ls_footer ). + + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Sheet4' ). +* Set color to tab with sheetname - other color + lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = '00' + ip_green = 'FF' + ip_blu = 'FF' ). + lo_worksheet->set_tabcolor( lv_tabcolor ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Cell B3 has value 0' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 0 ). + lo_worksheet->zif_excel_sheet_properties~show_zeros = zif_excel_sheet_properties=>c_hidezero. + + lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header + ip_odd_footer = ls_footer ). + + lo_excel->set_active_sheet_index_by_name( 'Sheet1' ). + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + REPORT. + + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_row TYPE zexcel_cell_row, + lv_col TYPE i, + lv_row_char TYPE char10, + lv_value TYPE string, + ls_fontcolor TYPE zexcel_style_color_argb. + +CONSTANTS: gc_save_file_name TYPE string VALUE '40_Printsettings.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + + +START-OF-SELECTION. + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo Printsettings' ). + +*--------------------------------------------------------------------* +* Prepare sheet with trivial data +* - first 4 columns will have fontocolor set +* - first 3 rows will have fontcolor set +* These marked cells will be used for repeatable rows/columns on printpages +*--------------------------------------------------------------------* + DO 100 TIMES. " Rows + + lv_row = sy-index . + WRITE lv_row TO lv_row_char. + + DO 20 TIMES. + + lv_col = sy-index - 1. + CONCATENATE sy-abcde+lv_col(1) lv_row_char INTO lv_value. + lv_col = sy-index. + lo_worksheet->set_cell( ip_row = lv_row + ip_column = lv_col + ip_value = lv_value ). + + TRY. + IF lv_row <= 3. + lo_worksheet->change_cell_style( ip_column = lv_col + ip_row = lv_row + ip_fill_filltype = zcl_excel_style_fill=>c_fill_solid + ip_fill_fgcolor_rgb = zcl_excel_style_color=>c_yellow ). + ENDIF. + IF lv_col <= 4. + lo_worksheet->change_cell_style( ip_column = lv_col + ip_row = lv_row + ip_font_color_rgb = zcl_excel_style_color=>c_red ). + ENDIF. + CATCH zcx_excel . + ENDTRY. + + ENDDO. + + + + ENDDO. + + +*--------------------------------------------------------------------* +* Printsettings +*--------------------------------------------------------------------* + TRY. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = 'A' + iv_columns_to = 'D' ). + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = 1 + iv_rows_to = 3 ). + CATCH zcx_excel . + ENDTRY. + + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + + + + + + + PROCESS BEFORE OUTPUT. + MODULE STATUS_9000. + +PROCESS AFTER INPUT. + MODULE USER_COMMAND_9000 AT EXIT-COMMAND. + MODULE USER_COMMAND_9000. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + REPORT. + +CONSTANTS: gc_save_file_name TYPE string VALUE 'ABAP2XLSX Inheritance.xlsx'. + +*--------------------------------------------------------------------* +* Demo inheritance ZCL_EXCEL1 +* Variation of ZCL_EXCEL that creates numerous sheets +*--------------------------------------------------------------------* +CLASS lcl_my_zcl_excel1 DEFINITION INHERITING FROM zcl_excel. + PUBLIC SECTION. + METHODS: constructor IMPORTING iv_sheetcount TYPE i DEFAULT 5. +ENDCLASS. + +CLASS lcl_my_zcl_excel1 IMPLEMENTATION. + METHOD constructor. + DATA: lv_sheets_to_create TYPE i. + super->constructor( ). + lv_sheets_to_create = iv_sheetcount - 1. " one gets created by standard class + DO lv_sheets_to_create TIMES. + TRY. + me->add_new_worksheet( ). + CATCH zcx_excel. + ENDTRY. + ENDDO. + me->set_active_sheet_index( 1 ). + + ENDMETHOD. +ENDCLASS. + +*--------------------------------------------------------------------* +* Demo inheritance ZCL_EXCEL_WORKSHEET +* Variation of ZCL_EXCEL_WORKSHEET ( and ZCL_EXCEL that calls the new type of worksheet ) +* that sets a fixed title +*--------------------------------------------------------------------* +CLASS lcl_my_zcl_excel2 DEFINITION INHERITING FROM zcl_excel. + PUBLIC SECTION. + METHODS: constructor. +ENDCLASS. + +CLASS lcl_my_zcl_excel_worksheet DEFINITION INHERITING FROM zcl_excel_worksheet. + PUBLIC SECTION. + METHODS: constructor IMPORTING ip_excel TYPE REF TO zcl_excel + ip_title TYPE zexcel_sheet_title OPTIONAL " Will be ignored - keep parameter for demonstration purpose + RAISING zcx_excel. +ENDCLASS. + +CLASS lcl_my_zcl_excel2 IMPLEMENTATION. + METHOD constructor. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet. + + super->constructor( ). + +* To use own worksheet we have to remove the standard worksheet + lo_worksheet = get_active_worksheet( ). + me->worksheets->remove( lo_worksheet ). +* and replace it with own version + CREATE OBJECT lo_worksheet TYPE lcl_my_zcl_excel_worksheet + EXPORTING + ip_excel = me + ip_title = 'This title will be ignored'. + me->worksheets->add( lo_worksheet ). + + ENDMETHOD. +ENDCLASS. + +CLASS lcl_my_zcl_excel_worksheet IMPLEMENTATION. + METHOD constructor. + super->constructor( ip_excel = ip_excel + ip_title = 'Inherited Worksheet' ). + + ENDMETHOD. +ENDCLASS. + +DATA: go_excel1 TYPE REF TO lcl_my_zcl_excel1. +DATA: go_excel2 TYPE REF TO lcl_my_zcl_excel2. + + +SELECTION-SCREEN BEGIN OF BLOCK bli WITH FRAME TITLE text-bli. +PARAMETERS: rbi_1 RADIOBUTTON GROUP rbi DEFAULT 'X' , " Simple inheritance + rbi_2 RADIOBUTTON GROUP rbi. +SELECTION-SCREEN END OF BLOCK bli. + +INCLUDE zdemo_excel_outputopt_incl. + +END-OF-SELECTION. + + CASE 'X'. + + WHEN rbi_1. " Simple inheritance of zcl_excel, object created directly + CREATE OBJECT go_excel1 + EXPORTING + iv_sheetcount = 5. + lcl_output=>output( go_excel1 ). + + WHEN rbi_2. " Inheritance of zcl_excel_worksheet, inheritance of zcl_excel needed to allow this + CREATE OBJECT go_excel2. + lcl_output=>output( go_excel2 ). + + + ENDCASE. + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL5 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel5. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional. + +DATA: ls_iconset TYPE zexcel_conditional_iconset. + + + +CONSTANTS: gc_save_file_name TYPE string VALUE '05_Conditional.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + + + ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. + ls_iconset-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo1_value = '0'. + ls_iconset-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo2_value = '33'. + ls_iconset-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset-cfvo3_value = '66'. + ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_true. + + lo_style_conditional->mode_iconset = ls_iconset. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). + + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. + ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_false. + lo_style_conditional->mode_iconset = ls_iconset. + lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 4 + ip_stop_column = 'E' + ip_stop_row = 8 ). + + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 100 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 1000 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = 150 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = 500 ). + + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL6 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel6. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_row TYPE syindex, + lv_formula TYPE string. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '06_Formulas.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + +*--------------------------------------------------------------------* +* Get some testdata +*--------------------------------------------------------------------* + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = -10 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). + + +*--------------------------------------------------------------------* +* Demonstrate using formulas +*--------------------------------------------------------------------* + lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_formula = 'SUM(C4:C8)' ). + + +*--------------------------------------------------------------------* +* Demonstrate standard EXCEL-behaviour when copying a formula to another cell +* by calculating the resulting formula to put into another cell +*--------------------------------------------------------------------* + DO 10 TIMES. + + lv_formula = zcl_excel_common=>shift_formula( iv_reference_formula = 'SUM(C4:C8)' + iv_shift_cols = 0 " Offset in Columns - here we copy in same column --> 0 + iv_shift_rows = sy-index ). " Offset in Row - here we copy downward --> sy-index + lv_row = 9 + sy-index. " Absolute row = sy-index rows below reference cell + lo_worksheet->set_cell( ip_row = lv_row ip_column = 'C' ip_formula = lv_formula ). + + ENDDO. + +*--------------------------------------------------------------------* +*** Create output +*--------------------------------------------------------------------* + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL7 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel7. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional. + +DATA: ls_iconset3 TYPE zexcel_conditional_iconset, + ls_iconset4 TYPE zexcel_conditional_iconset, + ls_iconset5 TYPE zexcel_conditional_iconset, + ls_databar TYPE zexcel_conditional_databar, + ls_colorscale2 TYPE zexcel_conditional_colorscale, + ls_colorscale3 TYPE zexcel_conditional_colorscale. + +CONSTANTS: gc_save_file_name TYPE string VALUE '07_ConditionalAll.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + ls_iconset3-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset3-cfvo1_value = '0'. + ls_iconset3-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset3-cfvo2_value = '33'. + ls_iconset3-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset3-cfvo3_value = '66'. + ls_iconset3-showvalue = zcl_excel_style_conditional=>c_showvalue_true. + + ls_iconset4-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset4-cfvo1_value = '0'. + ls_iconset4-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset4-cfvo2_value = '25'. + ls_iconset4-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset4-cfvo3_value = '50'. + ls_iconset4-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset4-cfvo4_value = '75'. + ls_iconset4-showvalue = zcl_excel_style_conditional=>c_showvalue_true. + + ls_iconset5-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset5-cfvo1_value = '0'. + ls_iconset5-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset5-cfvo2_value = '20'. + ls_iconset5-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset5-cfvo3_value = '40'. + ls_iconset5-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset5-cfvo4_value = '60'. + ls_iconset5-cfvo5_type = zcl_excel_style_conditional=>c_cfvo_type_percent. + ls_iconset5-cfvo5_value = '80'. + ls_iconset5-showvalue = zcl_excel_style_conditional=>c_showvalue_true. + + ls_databar-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. + ls_databar-cfvo1_value = '0'. + ls_databar-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_max. + ls_databar-cfvo2_value = '0'. + ls_databar-colorrgb = 'FF638EC6'. + + ls_colorscale2-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. + ls_colorscale2-cfvo1_value = '0'. + ls_colorscale2-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percentile. + ls_colorscale2-cfvo2_value = '50'. + ls_colorscale2-colorrgb1 = 'FFF8696B'. + ls_colorscale2-colorrgb2 = 'FF63BE7B'. + + ls_colorscale3-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. + ls_colorscale3-cfvo1_value = '0'. + ls_colorscale3-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percentile. + ls_colorscale3-cfvo2_value = '50'. + ls_colorscale3-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_max. + ls_colorscale3-cfvo3_value = '0'. + ls_colorscale3-colorrgb1 = 'FFF8696B'. + ls_colorscale3-colorrgb2 = 'FFFFEB84'. + ls_colorscale3-colorrgb3 = 'FF63BE7B'. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + +* ICONSET + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3arrows. + + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 5 + ip_stop_column = 'B' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'C_ICONSET_3ARROWS' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'B' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3arrowsgray. + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 5 + ip_stop_column = 'C' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'C_ICONSET_3ARROWSGRAY' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = 50 ). + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3flags. + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 5 + ip_stop_column = 'D' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'C_ICONSET_3FLAGS' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'D' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 5 + ip_stop_column = 'E' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'C_ICONSET_3TRAFFICLIGHTS' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'E' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 5 + ip_stop_column = 'F' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'C_ICONSET_3TRAFFICLIGHTS2' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'F' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'F' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'F' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'F' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3signs. + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'G' + ip_start_row = 5 + ip_stop_column = 'G' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = 'C_ICONSET_3SIGNS' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'G' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'G' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'G' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'G' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'G' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3symbols. + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'H' + ip_start_row = 5 + ip_stop_column = 'H' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'H' ip_value = 'C_ICONSET_3SYMBOLS' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'H' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'H' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'H' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'H' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'H' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3symbols2. + lo_style_conditional->mode_iconset = ls_iconset3. + lo_style_conditional->set_range( ip_start_column = 'I' + ip_start_row = 5 + ip_stop_column = 'I' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'I' ip_value = 'C_ICONSET_3SYMBOLS2' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'I' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'I' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'I' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'I' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'I' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4arrows. + lo_style_conditional->mode_iconset = ls_iconset4. + lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 12 + ip_stop_column = 'B' + ip_stop_row = 16 ). + + lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = 'C_ICONSET_4ARROWS' ). + lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 14 ip_column = 'B' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 15 ip_column = 'B' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 16 ip_column = 'B' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4arrowsgray. + lo_style_conditional->mode_iconset = ls_iconset4. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 12 + ip_stop_column = 'C' + ip_stop_row = 16 ). + + lo_worksheet->set_cell( ip_row = 11 ip_column = 'C' ip_value = 'C_ICONSET_4ARROWSGRAY' ). + lo_worksheet->set_cell( ip_row = 12 ip_column = 'C' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'C' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 14 ip_column = 'C' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 15 ip_column = 'C' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 16 ip_column = 'C' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4redtoblack. + lo_style_conditional->mode_iconset = ls_iconset4. + lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 12 + ip_stop_column = 'D' + ip_stop_row = 16 ). + + lo_worksheet->set_cell( ip_row = 11 ip_column = 'D' ip_value = 'C_ICONSET_4REDTOBLACK' ). + lo_worksheet->set_cell( ip_row = 12 ip_column = 'D' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 15 ip_column = 'D' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 16 ip_column = 'D' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4rating. + lo_style_conditional->mode_iconset = ls_iconset4. + lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 12 + ip_stop_column = 'E' + ip_stop_row = 16 ). + + lo_worksheet->set_cell( ip_row = 11 ip_column = 'E' ip_value = 'C_ICONSET_4RATING' ). + lo_worksheet->set_cell( ip_row = 12 ip_column = 'E' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 14 ip_column = 'E' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 15 ip_column = 'E' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 16 ip_column = 'E' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4trafficlights. + lo_style_conditional->mode_iconset = ls_iconset4. + lo_style_conditional->set_range( ip_start_column = 'F' + ip_start_row = 12 + ip_stop_column = 'F' + ip_stop_row = 16 ). + + lo_worksheet->set_cell( ip_row = 11 ip_column = 'F' ip_value = 'C_ICONSET_4TRAFFICLIGHTS' ). + lo_worksheet->set_cell( ip_row = 12 ip_column = 'F' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 14 ip_column = 'F' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 15 ip_column = 'F' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 16 ip_column = 'F' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5arrows. + lo_style_conditional->mode_iconset = ls_iconset5. + lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 19 + ip_stop_column = 'B' + ip_stop_row = 23 ). + + lo_worksheet->set_cell( ip_row = 18 ip_column = 'B' ip_value = 'C_ICONSET_5ARROWS' ). + lo_worksheet->set_cell( ip_row = 19 ip_column = 'B' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 20 ip_column = 'B' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 21 ip_column = 'B' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 22 ip_column = 'B' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 23 ip_column = 'B' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5arrowsgray. + lo_style_conditional->mode_iconset = ls_iconset5. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 19 + ip_stop_column = 'C' + ip_stop_row = 23 ). + + lo_worksheet->set_cell( ip_row = 18 ip_column = 'C' ip_value = 'C_ICONSET_5ARROWSGRAY' ). + lo_worksheet->set_cell( ip_row = 19 ip_column = 'C' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 20 ip_column = 'C' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 21 ip_column = 'C' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 22 ip_column = 'C' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 23 ip_column = 'C' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5rating. + lo_style_conditional->mode_iconset = ls_iconset5. + lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 19 + ip_stop_column = 'D' + ip_stop_row = 23 ). + + lo_worksheet->set_cell( ip_row = 18 ip_column = 'D' ip_value = 'C_ICONSET_5RATING' ). + lo_worksheet->set_cell( ip_row = 19 ip_column = 'D' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 20 ip_column = 'D' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 21 ip_column = 'D' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 22 ip_column = 'D' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 23 ip_column = 'D' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional->priority = 1. + ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5quarters. + lo_style_conditional->mode_iconset = ls_iconset5. + lo_style_conditional->set_range( ip_start_column = 'E' + ip_start_row = 19 + ip_stop_column = 'E' + ip_stop_row = 23 ). + +* DATABAR + + lo_worksheet->set_cell( ip_row = 25 ip_column = 'B' ip_value = 'DATABAR' ). + lo_worksheet->set_cell( ip_row = 26 ip_column = 'B' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 27 ip_column = 'B' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 28 ip_column = 'B' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 29 ip_column = 'B' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 30 ip_column = 'B' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_databar. + lo_style_conditional->priority = 1. + lo_style_conditional->mode_databar = ls_databar. + lo_style_conditional->set_range( ip_start_column = 'B' + ip_start_row = 26 + ip_stop_column = 'B' + ip_stop_row = 30 ). + +* COLORSCALE + + lo_worksheet->set_cell( ip_row = 25 ip_column = 'C' ip_value = 'COLORSCALE 2 COLORS' ). + lo_worksheet->set_cell( ip_row = 26 ip_column = 'C' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 27 ip_column = 'C' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 28 ip_column = 'C' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 29 ip_column = 'C' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 30 ip_column = 'C' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_colorscale. + lo_style_conditional->priority = 1. + lo_style_conditional->mode_colorscale = ls_colorscale2. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 26 + ip_stop_column = 'C' + ip_stop_row = 30 ). + + + lo_worksheet->set_cell( ip_row = 25 ip_column = 'D' ip_value = 'COLORSCALE 3 COLORS' ). + lo_worksheet->set_cell( ip_row = 26 ip_column = 'D' ip_value = 10 ). + lo_worksheet->set_cell( ip_row = 27 ip_column = 'D' ip_value = 20 ). + lo_worksheet->set_cell( ip_row = 28 ip_column = 'D' ip_value = 30 ). + lo_worksheet->set_cell( ip_row = 29 ip_column = 'D' ip_value = 40 ). + lo_worksheet->set_cell( ip_row = 30 ip_column = 'D' ip_value = 50 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_colorscale. + lo_style_conditional->priority = 1. + lo_style_conditional->mode_colorscale = ls_colorscale3. + lo_style_conditional->set_range( ip_start_column = 'D' + ip_start_row = 26 + ip_stop_column = 'D' + ip_stop_row = 30 ). + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL8 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel8. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range. + +DATA: lv_title TYPE zexcel_sheet_title. + +CONSTANTS: gc_save_file_name TYPE string VALUE '08_Range.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + + +START-OF-SELECTION. + + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lv_title = 'Sheet1'. + lo_worksheet->set_title( lv_title ). + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'range'. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + + " Define another Range with a name longer than 40 characters that + " tests the fix of issue #168 ranges namescan be only up to 20 chars + + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'A_range_with_a_name_that_is_longer_than_20_characters'. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'D' + ip_start_row = 4 + ip_stop_column = 'D' + ip_stop_row = 5 ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Range Value 1' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Range Value 2' ). + + " issue #163 + " Define another Range with sheet visibility + lo_range = lo_worksheet->add_new_range( ). + lo_range->name = 'A_range_with_sheet_visibility'. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'E' + ip_start_row = 4 + ip_stop_column = 'E' + ip_stop_row = 5 ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'Range Value 3' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 'Range Value 4' ). + " issue #163 + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_EXCEL9 +*& +*&---------------------------------------------------------------------* +*& abap2xlsx Demo: Data validations +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel9. + +CONSTANTS: c_fruits TYPE string VALUE 'Fruits', + c_vegetables TYPE string VALUE 'Vegetables', + c_meat TYPE string VALUE 'Meat', + c_fish TYPE string VALUE 'Fish'. + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation. + +DATA: row TYPE zexcel_cell_row. + + +DATA: lv_title TYPE zexcel_sheet_title. + + +CONSTANTS: gc_save_file_name TYPE string VALUE '09_DataValidation.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +PARAMETERS: p_sbook TYPE flag. + + +START-OF-SELECTION. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lv_title = 'Data Validation'. + lo_worksheet->set_title( lv_title ). + " Set values for dropdown + lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = c_fish ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Anchovy' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 'Carp' ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 'Catfish' ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 'Cod' ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 'Eel' ). + lo_worksheet->set_cell( ip_row = 9 ip_column = 'A' ip_value = 'Haddock' ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = c_fish. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 9 ). + + lo_worksheet->set_cell( ip_row = 2 ip_column = 'B' ip_value = c_meat ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Pork' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 'Beef' ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Chicken' ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 'Turkey' ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = c_meat. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'B' + ip_start_row = 4 + ip_stop_column = 'B' + ip_stop_row = 7 ). + + lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = c_fruits ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = c_fruits. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'C' + ip_start_row = 4 + ip_stop_column = 'C' + ip_stop_row = 8 ). + + lo_worksheet->set_cell( ip_row = 2 ip_column = 'D' ip_value = c_vegetables ). + lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Cucumber' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Sweet pepper ' ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 'Lettuce' ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = c_vegetables. + lo_range->set_value( ip_sheet_name = lv_title + ip_start_column = 'D' + ip_start_row = 4 + ip_stop_column = 'D' + ip_stop_row = 6 ). + + lo_worksheet = lo_excel->add_new_worksheet( ). + lv_title = 'Table with Data Validation'. + lo_worksheet->set_title( lv_title ). + + " Maximum Text length + lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'Validate Maximum Text length of <= 10 in Cell A2:' ). + lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = 'abcdefghij' ). + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_textlength. + lo_data_validation->operator = zcl_excel_data_validation=>c_operator_lessthanorequal. + lo_data_validation->formula1 = 10. + lo_data_validation->cell_row = 2. + lo_data_validation->cell_column = 'A'. + + " Integer Value between 1 and 10 + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Validate Integer Value between 1 and 10 in Cell A5:' ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = '5' ). + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_whole. + lo_data_validation->operator = zcl_excel_data_validation=>c_operator_between. + lo_data_validation->formula1 = 1. + lo_data_validation->formula2 = 10. + lo_data_validation->prompttitle = 'Range'. + lo_data_validation->prompt = 'Enter a value between 1 and 10'. + lo_data_validation->errortitle = 'Error'. + lo_data_validation->error = 'You have entered a wrong value. Please use only numbers between 1 and 10.'. + lo_data_validation->cell_row = 5. + lo_data_validation->cell_column = 'A'. + + " Evaluation by Formula from issue #161 + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 'Validate if B8 contains a "-":' ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 'Text' ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = '-' ). + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_custom. + lo_data_validation->formula1 = '"IF(B8<>"""";INDIRECT(LEFT(B8;SEARCH(""-"";B8;1)));EMPTY)"'. + lo_data_validation->cell_row = 8. + lo_data_validation->cell_column = 'A'. + + " There was an error when data validation was combined with cell merges this should test that: + lo_worksheet->set_cell( ip_row = 10 ip_column = 'A' ip_value = 'Demo for data validation with a dropdown list' ). + lo_worksheet->set_merge( ip_row = 10 ip_column_start = 'A' ip_column_end = 'F' ). + + " Headlines + lo_worksheet->set_cell( ip_row = 11 ip_column = 'A' ip_value = c_fruits ). + lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = c_vegetables ). + + row = 12. + WHILE row < 20. " Starting with 14500 the data validation is dropped 14000 are still ok + " 1st validation + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = c_fruits. + lo_data_validation->cell_row = row. + lo_data_validation->cell_column = 'A'. + lo_worksheet->set_cell( ip_row = row ip_column = 'A' ip_value = 'Select a value' ). + " 2nd + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = c_vegetables. + lo_data_validation->cell_row = row. + lo_data_validation->cell_column = 'B'. + lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = 'Select a value' ). + " 3rd + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = c_meat. + lo_data_validation->cell_row = row. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = 'Select a value' ). + " 4th + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = c_fish. + lo_data_validation->cell_row = row. + lo_data_validation->cell_column = 'D'. + lo_worksheet->set_cell( ip_row = row ip_column = 'D' ip_value = 'Select a value' ). + " Increment row + row = row + 1. + ENDWHILE. + + IF p_sbook = abap_true. + DATA: bookings type TABLE OF sbook. + + lo_worksheet = lo_excel->add_new_worksheet( ). + lv_title = 'SBOOK'. + lo_worksheet->set_title( lv_title ). + + SELECT * from sbook INTO TABLE bookings UP TO 4000 ROWS. + + lo_worksheet->bind_table( + EXPORTING + ip_table = bookings +* it_field_catalog = " Table binding field catalog +* is_table_settings = " Excel table binding settings +* IMPORTING +* es_table_settings = " Excel table binding settings + ). + ENDIF. + + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + *&---------------------------------------------------------------------* +*& Include ZDEMO_EXCEL_OUTPUTOPT_INCL +*&---------------------------------------------------------------------* +CLASS lcl_output DEFINITION CREATE PRIVATE. + PUBLIC SECTION. + CLASS-METHODS: + output IMPORTING cl_excel TYPE REF TO zcl_excel + iv_writerclass_name TYPE clike OPTIONAL, + f4_path RETURNING VALUE(selected_folder) TYPE string, + parametertexts. + + PRIVATE SECTION. + METHODS: + download_frontend, + download_backend, + display_online, + send_email. + + DATA: xdata TYPE xstring, " Will be used for sending as email + t_rawdata TYPE solix_tab, " Will be used for downloading or open directly + bytecount TYPE i. " Will be used for downloading or open directly +ENDCLASS. "lcl_output DEFINITION + + +SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE txt_bl1. +PARAMETERS: rb_down RADIOBUTTON GROUP rb1 USER-COMMAND space. + +PARAMETERS: rb_back RADIOBUTTON GROUP rb1. + +PARAMETERS: rb_show RADIOBUTTON GROUP rb1 DEFAULT 'X' . + +PARAMETERS: rb_send RADIOBUTTON GROUP rb1. + +PARAMETERS: p_path TYPE string LOWER CASE MODIF ID pat. +PARAMETERS: p_email TYPE string LOWER CASE MODIF ID ema OBLIGATORY DEFAULT 'insert_your_emailadress@here'. +PARAMETERS: p_backfn TYPE text40 NO-DISPLAY. +SELECTION-SCREEN END OF BLOCK bl1. + + +AT SELECTION-SCREEN OUTPUT. + LOOP AT SCREEN. + + IF rb_down IS INITIAL AND screen-group1 = 'PAT'. + screen-input = 0. + screen-invisible = 1. + ENDIF. + + IF rb_send IS INITIAL AND screen-group1 = 'EMA'. + screen-input = 0. + screen-invisible = 1. + ENDIF. + + MODIFY SCREEN. + + ENDLOOP. + +INITIALIZATION. + IF sy-batch IS INITIAL. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = p_path ). + cl_gui_cfw=>flush( ). + ENDIF. + lcl_output=>parametertexts( ). " If started in language w/o textelements translated set defaults + sy-title = gc_save_file_name. + txt_bl1 = 'Output options'(bl1). + p_backfn = gc_save_file_name. " Use as default if nothing else is supplied by submit + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + p_path = lcl_output=>f4_path( ). + + +*----------------------------------------------------------------------* +* CLASS lcl_output IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS lcl_output IMPLEMENTATION. + METHOD output. + + DATA: cl_output TYPE REF TO lcl_output, + cl_writer TYPE REF TO zif_excel_writer. + + IF iv_writerclass_name IS INITIAL. + CREATE OBJECT cl_output. + CREATE OBJECT cl_writer TYPE zcl_excel_writer_2007. + ELSE. + CREATE OBJECT cl_output. + CREATE OBJECT cl_writer TYPE (iv_writerclass_name). + ENDIF. + cl_output->xdata = cl_writer->write_file( cl_excel ). + +* After 6.40 via cl_bcs_convert + cl_output->t_rawdata = cl_bcs_convert=>xstring_to_solix( iv_xstring = cl_output->xdata ). + cl_output->bytecount = xstrlen( cl_output->xdata ). + +* before 6.40 +* CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' +* EXPORTING +* buffer = cl_output->xdata +* IMPORTING +* output_length = cl_output->bytecount +* TABLES +* binary_tab = cl_output->t_rawdata. + + CASE 'X'. + WHEN rb_down. + IF sy-batch IS INITIAL. + cl_output->download_frontend( ). + ELSE. + MESSAGE e001(00) WITH 'Frontenddownload impossible in background processing'. + ENDIF. + + WHEN rb_back. + cl_output->download_backend( ). + + WHEN rb_show. + IF sy-batch IS INITIAL. + cl_output->display_online( ). + ELSE. + MESSAGE e001(00) WITH 'Online display absurd in background processing'. + ENDIF. + + WHEN rb_send. + cl_output->send_email( ). + + ENDCASE. + ENDMETHOD. "output + + METHOD f4_path. + DATA: new_path TYPE string, + repid TYPE syrepid, + dynnr TYPE sydynnr, + lt_dynpfields TYPE TABLE OF dynpread, + ls_dynpfields LIKE LINE OF lt_dynpfields. + +* Get current value + dynnr = sy-dynnr. + repid = sy-repid. + ls_dynpfields-fieldname = 'P_PATH'. + APPEND ls_dynpfields TO lt_dynpfields. + + CALL FUNCTION 'DYNP_VALUES_READ' + EXPORTING + dyname = repid + dynumb = dynnr + TABLES + dynpfields = lt_dynpfields + EXCEPTIONS + invalid_abapworkarea = 1 + invalid_dynprofield = 2 + invalid_dynproname = 3 + invalid_dynpronummer = 4 + invalid_request = 5 + no_fielddescription = 6 + invalid_parameter = 7 + undefind_error = 8 + double_conversion = 9 + stepl_not_found = 10 + OTHERS = 11. + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + EXIT. + ENDIF. + + READ TABLE lt_dynpfields INTO ls_dynpfields INDEX 1. + + new_path = ls_dynpfields-fieldvalue. + selected_folder = new_path. + + cl_gui_frontend_services=>directory_browse( + EXPORTING + window_title = 'Select path to download EXCEL-file' + initial_folder = new_path + CHANGING + selected_folder = new_path + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + not_supported_by_gui = 3 + OTHERS = 4 + ). + cl_gui_cfw=>flush( ). + CHECK new_path IS NOT INITIAL. + selected_folder = new_path. + + ENDMETHOD. "f4_path + + METHOD parametertexts. +* If started in language w/o textelements translated set defaults +* Furthermore I don't have to change the selectiontexts of all demoreports. + DEFINE default_parametertext. + if %_&1_%_app_%-text = '&1' or + %_&1_%_app_%-text is initial. + %_&1_%_app_%-text = &2. + endif. + END-OF-DEFINITION. + + default_parametertext: rb_down 'Save to frontend', + rb_back 'Save to backend', + rb_show 'Direct display', + rb_send 'Send via email', + + p_path 'Frontend-path to download to', + p_email 'Email to send xlsx to'. + + ENDMETHOD. "parametertexts + + METHOD: download_frontend. + DATA: filename TYPE string. +* I don't like p_path here - but for this include it's ok + filename = p_path. +* Add trailing "\" or "/" + IF filename CA '/'. + REPLACE REGEX '([^/])\s*$' IN filename WITH '$1/' . + ELSE. + REPLACE REGEX '([^\\])\s*$' IN filename WITH '$1\\'. + ENDIF. + + CONCATENATE filename gc_save_file_name INTO filename. +* Get trailing blank + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = bytecount + filename = filename + filetype = 'BIN' + CHANGING data_tab = t_rawdata ). + ENDMETHOD. "download_frontend + + METHOD download_backend. + DATA: bytes_remain TYPE i. + FIELD-SYMBOLS: <rawdata> LIKE LINE OF t_rawdata. + + OPEN DATASET p_backfn FOR OUTPUT IN BINARY MODE. + CHECK sy-subrc = 0. + + bytes_remain = bytecount. + + LOOP AT t_rawdata ASSIGNING <rawdata>. + + AT LAST. + CHECK bytes_remain >= 0. + TRANSFER <rawdata> TO p_backfn LENGTH bytes_remain. + EXIT. + ENDAT. + + TRANSFER <rawdata> TO p_backfn. + SUBTRACT 255 FROM bytes_remain. " Solix has length 255 + + ENDLOOP. + + CLOSE DATASET p_backfn. + + + + + IF sy-calld = 'X'. " no need to display anything if download was selected and report was called for demo purposes + LEAVE PROGRAM. + ELSE. + MESSAGE 'Data transferred to default backend directory' TYPE 'I'. + ENDIF. + ENDMETHOD. "download_backend + + METHOD display_online. + DATA:error TYPE REF TO i_oi_error, + t_errors TYPE STANDARD TABLE OF REF TO i_oi_error WITH NON-UNIQUE DEFAULT KEY, + cl_control TYPE REF TO i_oi_container_control, "OIContainerCtrl + cl_document TYPE REF TO i_oi_document_proxy. "Office Dokument + + c_oi_container_control_creator=>get_container_control( IMPORTING control = cl_control + error = error ). + APPEND error TO t_errors. + + cl_control->init_control( EXPORTING inplace_enabled = 'X' + no_flush = 'X' + r3_application_name = 'Demo Document Container' + parent = cl_gui_container=>screen0 + IMPORTING error = error + EXCEPTIONS OTHERS = 2 ). + APPEND error TO t_errors. + + cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL + no_flush = ' ' + IMPORTING document_proxy = cl_document + error = error ). + APPEND error TO t_errors. +* Errorhandling should be inserted here + + cl_document->open_document_from_table( EXPORTING document_size = bytecount + document_table = t_rawdata + open_inplace = 'X' ). + + WRITE: '.'. " To create an output. That way screen0 will exist + ENDMETHOD. "display_online + + METHOD send_email. +* Needed to send emails + DATA: bcs_exception TYPE REF TO cx_bcs, + errortext TYPE string, + cl_send_request TYPE REF TO cl_bcs, + cl_document TYPE REF TO cl_document_bcs, + cl_recipient TYPE REF TO if_recipient_bcs, + cl_sender TYPE REF TO cl_cam_address_bcs, + t_attachment_header TYPE soli_tab, + wa_attachment_header LIKE LINE OF t_attachment_header, + attachment_subject TYPE sood-objdes, + + sood_bytecount TYPE sood-objlen, + mail_title TYPE so_obj_des, + t_mailtext TYPE soli_tab, + wa_mailtext LIKE LINE OF t_mailtext, + send_to TYPE adr6-smtp_addr, + sent TYPE os_boolean. + + + mail_title = 'Mail title'. + wa_mailtext = 'Mailtext'. + APPEND wa_mailtext TO t_mailtext. + + TRY. +* Create send request + cl_send_request = cl_bcs=>create_persistent( ). +* Create new document with mailtitle and mailtextg + cl_document = cl_document_bcs=>create_document( i_type = 'RAW' "#EC NOTEXT + i_text = t_mailtext + i_subject = mail_title ). +* Add attachment to document +* since the new excelfiles have an 4-character extension .xlsx but the attachment-type only holds 3 charactes .xls, +* we have to specify the real filename via attachment header +* Use attachment_type xls to have SAP display attachment with the excel-icon + attachment_subject = gc_save_file_name. + CONCATENATE '&SO_FILENAME=' attachment_subject INTO wa_attachment_header. + APPEND wa_attachment_header TO t_attachment_header. +* Attachment + sood_bytecount = bytecount. " next method expects sood_bytecount instead of any positive integer *sigh* + cl_document->add_attachment( i_attachment_type = 'XLS' "#EC NOTEXT + i_attachment_subject = attachment_subject + i_attachment_size = sood_bytecount + i_att_content_hex = t_rawdata + i_attachment_header = t_attachment_header ). + +* add document to send request + cl_send_request->set_document( cl_document ). + +* set sender in case if no own email is availabe +* cl_sender = cl_cam_address_bcs=>create_internet_address( 'sender@sender.sender' ). +* cl_send_request->set_sender( cl_sender ). + +* add recipient(s) - here only 1 will be needed + send_to = p_email. + IF send_to IS INITIAL. + send_to = 'no_email@no_email.no_email'. " Place into SOST in any case for demonstration purposes + ENDIF. + cl_recipient = cl_cam_address_bcs=>create_internet_address( send_to ). + cl_send_request->add_recipient( cl_recipient ). + +* Und abschicken + sent = cl_send_request->send( i_with_error_screen = 'X' ). + + COMMIT WORK. + + IF sent IS INITIAL. + MESSAGE i500(sbcoms) WITH p_email. + ELSE. + MESSAGE s022(so). + MESSAGE 'Document ready to be sent - Check SOST or SCOT' TYPE 'I'. + ENDIF. + + CATCH cx_bcs INTO bcs_exception. + errortext = bcs_exception->if_message~get_text( ). + MESSAGE errortext TYPE 'I'. + + ENDTRY. + ENDMETHOD. "send_email + + +ENDCLASS. "lcl_output IMPLEMENTATION + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED1 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched1. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo01' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_reader TYPE REF TO zif_excel_reader, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +DATA: lt_files TYPE filetable, + ls_file TYPE file_table, + lv_rc TYPE i, + lv_value TYPE zexcel_cell_value. + +CONSTANTS: gc_save_file_name TYPE string VALUE 'TechEd01.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +START-OF-SELECTION. + +******************************* +* abap2xlsx read XLSX * +******************************* + CREATE OBJECT lo_excel_reader TYPE zcl_excel_reader_2007. + lo_excel = lo_excel_reader->load_file( lv_full_path ). + + lo_excel->set_active_sheet_index( 1 ). + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_worksheet->get_cell( EXPORTING ip_column = 'C' + ip_row = 10 + IMPORTING ep_value = lv_value ). + + WRITE: 'abap2xlsx total score is ', lv_value. + +*** Create output + lcl_output=>output( lo_excel ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED2 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched2. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lv_style_title_guid TYPE zexcel_cell_style. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lo_drawing TYPE REF TO zcl_excel_drawing, + lv_style_title_guid TYPE zexcel_cell_style, + ls_key TYPE wwwdatatab. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + + " add logo from SMWO + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 2 + ip_from_col = 'B' ). + + ls_key-relid = 'MI'. + ls_key-objid = 'WBLOGO'. + lo_drawing->set_media_www( ip_key = ls_key + ip_width = 140 + ip_height = 64 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_range TYPE REF TO zcl_excel_range, + lv_style_title_guid TYPE zexcel_cell_style, + ls_key TYPE wwwdatatab. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + + " add logo from SMWO + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 2 + ip_from_col = 'B' ). + + ls_key-relid = 'MI'. + ls_key-objid = 'WBLOGO'. + lo_drawing->set_media_www( ip_key = ls_key + ip_width = 140 + ip_height = 64 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " Add new sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Values' ). + + " Set values for range + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'Values'. + lo_range->set_value( ip_sheet_name = 'Values' + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 8 ). + + lo_excel->set_active_sheet_index( 1 ). + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lv_style_title_guid TYPE zexcel_cell_style, + ls_key TYPE wwwdatatab. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). + + " add logo from SMWO + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 2 + ip_from_col = 'B' ). + + ls_key-relid = 'MI'. + ls_key-objid = 'WBLOGO'. + lo_drawing->set_media_www( ip_key = ls_key + ip_width = 140 + ip_height = 64 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " Add new sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Values' ). + + " Set values for range + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'Values'. + lo_range->set_value( ip_sheet_name = 'Values' + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 8 ). + + lo_excel->set_active_sheet_index( 1 ). + + " add data validation + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 7. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). + + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 8. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lv_style_title_guid TYPE zexcel_cell_style, + ls_key TYPE wwwdatatab. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). + + " add logo from SMWO + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 2 + ip_from_col = 'B' ). + + ls_key-relid = 'MI'. + ls_key-objid = 'WBLOGO'. + lo_drawing->set_media_www( ip_key = ls_key + ip_width = 140 + ip_height = 64 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " Add new sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Values' ). + + " Set values for range + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'Values'. + lo_range->set_value( ip_sheet_name = 'Values' + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 8 ). + + lo_excel->set_active_sheet_index( 1 ). + + " add data validation + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 7. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). + + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 8. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). + + " add autosize (column width) + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lv_style_title_guid TYPE zexcel_cell_style, + ls_key TYPE wwwdatatab. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). + + lo_worksheet->set_cell( ip_column = 'B' ip_row = 10 ip_value = 'Total score' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 10 ip_formula = 'SUM(C7:C8)' ). + + " add logo from SMWO + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 2 + ip_from_col = 'B' ). + + ls_key-relid = 'MI'. + ls_key-objid = 'WBLOGO'. + lo_drawing->set_media_www( ip_key = ls_key + ip_width = 140 + ip_height = 64 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " Add new sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Values' ). + + " Set values for range + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'Values'. + lo_range->set_value( ip_sheet_name = 'Values' + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 8 ). + + lo_excel->set_active_sheet_index( 1 ). + + " add data validation + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 7. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). + + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 8. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). + + " add autosize (column width) + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lo_style_green TYPE REF TO zcl_excel_style, + lo_style_yellow TYPE REF TO zcl_excel_style, + lo_style_red TYPE REF TO zcl_excel_style, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_style_title_guid TYPE zexcel_cell_style, + lv_style_green_guid TYPE zexcel_cell_style, + lv_style_yellow_guid TYPE zexcel_cell_style, + lv_style_red_guid TYPE zexcel_cell_style, + ls_cellis TYPE zexcel_conditional_cellis, + ls_key TYPE wwwdatatab. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. + +DATA: lv_full_path TYPE string, + lv_workdir TYPE string, + lv_file_separator TYPE c. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* Selection screen management * +******************************* + +PARAMETERS: p_path TYPE zexcel_export_dir. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +START-OF-SELECTION. + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). + + lo_worksheet->set_cell( ip_column = 'B' ip_row = 10 ip_value = 'Total score' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 10 ip_formula = 'SUM(C7:C8)' ). + + " add logo from SMWO + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 2 + ip_from_col = 'B' ). + +* ls_key-relid = 'MI'. +* ls_key-objid = 'WBLOGO'. +* lo_drawing->set_media_www( ip_key = ls_key +* ip_width = 140 +* ip_height = 64 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " Add new sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Values' ). + + " Set values for range + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'Values'. + lo_range->set_value( ip_sheet_name = 'Values' + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 8 ). + + lo_excel->set_active_sheet_index( 1 ). + + " add data validation + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 7. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). + + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 8. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). + + " add autosize (column width) + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + + " defne conditional styles + lo_style_green = lo_excel->add_new_style( ). + lo_style_green->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_green->fill->bgcolor-rgb = zcl_excel_style_color=>c_green. + lv_style_green_guid = lo_style_green->get_guid( ). + + lo_style_yellow = lo_excel->add_new_style( ). + lo_style_yellow->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_yellow->fill->bgcolor-rgb = zcl_excel_style_color=>c_yellow. + lv_style_yellow_guid = lo_style_yellow->get_guid( ). + + lo_style_red = lo_excel->add_new_style( ). + lo_style_red->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_red->fill->bgcolor-rgb = zcl_excel_style_color=>c_red. + lv_style_red_guid = lo_style_red->get_guid( ). + + " add conditional formatting + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '5'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. + ls_cellis-cell_style = lv_style_green_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 1. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 10 + ip_stop_column = 'C' + ip_stop_row = 10 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '5'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. + ls_cellis-cell_style = lv_style_yellow_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 2. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 10 + ip_stop_column = 'C' + ip_stop_row = 10 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '0'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. + ls_cellis-cell_style = lv_style_red_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 3. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 10 + ip_stop_column = 'C' + ip_stop_row = 10 ). + + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab ). + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_TECHED3 +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_teched3. + +******************************* +* Data Object declaration * +******************************* + +DATA: lo_excel TYPE REF TO zcl_excel, + lo_excel_writer TYPE REF TO zif_excel_writer, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + +DATA: lo_style_title TYPE REF TO zcl_excel_style, + lo_style_green TYPE REF TO zcl_excel_style, + lo_style_yellow TYPE REF TO zcl_excel_style, + lo_style_red TYPE REF TO zcl_excel_style, + lo_drawing TYPE REF TO zcl_excel_drawing, + lo_range TYPE REF TO zcl_excel_range, + lo_data_validation TYPE REF TO zcl_excel_data_validation, + lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_style_title_guid TYPE zexcel_cell_style, + lv_style_green_guid TYPE zexcel_cell_style, + lv_style_yellow_guid TYPE zexcel_cell_style, + lv_style_red_guid TYPE zexcel_cell_style, + ls_cellis TYPE zexcel_conditional_cellis, + ls_key TYPE wwwdatatab. + +DATA: lo_send_request TYPE REF TO cl_bcs, + lo_document TYPE REF TO cl_document_bcs, + lo_sender TYPE REF TO cl_sapuser_bcs, + lo_recipient TYPE REF TO cl_sapuser_bcs, + lo_recipient_i TYPE REF TO CL_CAM_ADDRESS_BCS. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lv_bytecount_c TYPE sood-objlen, + lt_file_tab TYPE solix_tab. + +CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. + +******************************* +* abap2xlsx create XLSX * +******************************* + + " Create excel instance + CREATE OBJECT lo_excel. + + " Styles + lo_style_title = lo_excel->add_new_style( ). + lo_style_title->font->bold = abap_true. + lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. + lv_style_title_guid = lo_style_title->get_guid( ). + + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_title( ip_title = 'Demo TechEd' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). + + lo_worksheet->set_cell( ip_column = 'B' ip_row = 10 ip_value = 'Total score' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 10 ip_formula = 'SUM(C7:C8)' ). + + " add logo from SMWO + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 2 + ip_from_col = 'B' ). + + ls_key-relid = 'MI'. + ls_key-objid = 'WBLOGO'. + lo_drawing->set_media_www( ip_key = ls_key + ip_width = 140 + ip_height = 64 ). + + " assign drawing to the worksheet + lo_worksheet->add_drawing( lo_drawing ). + + " Add new sheet + lo_worksheet = lo_excel->add_new_worksheet( ). + lo_worksheet->set_title( ip_title = 'Values' ). + + " Set values for range + lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). + lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). + lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). + lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). + lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). + + lo_range = lo_excel->add_new_range( ). + lo_range->name = 'Values'. + lo_range->set_value( ip_sheet_name = 'Values' + ip_start_column = 'A' + ip_start_row = 4 + ip_stop_column = 'A' + ip_stop_row = 8 ). + + lo_excel->set_active_sheet_index( 1 ). + + " add data validation + lo_worksheet = lo_excel->get_active_worksheet( ). + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 7. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). + + + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_type_list. + lo_data_validation->formula1 = 'Values'. + lo_data_validation->cell_row = 8. + lo_data_validation->cell_column = 'C'. + lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). + + " add autosize (column width) + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). + lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). + + " defne conditional styles + lo_style_green = lo_excel->add_new_style( ). + lo_style_green->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_green->fill->bgcolor-rgb = zcl_excel_style_color=>c_green. + lv_style_green_guid = lo_style_green->get_guid( ). + + lo_style_yellow = lo_excel->add_new_style( ). + lo_style_yellow->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_yellow->fill->bgcolor-rgb = zcl_excel_style_color=>c_yellow. + lv_style_yellow_guid = lo_style_yellow->get_guid( ). + + lo_style_red = lo_excel->add_new_style( ). + lo_style_red->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style_red->fill->bgcolor-rgb = zcl_excel_style_color=>c_red. + lv_style_red_guid = lo_style_red->get_guid( ). + + " add conditional formatting + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '5'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. + ls_cellis-cell_style = lv_style_green_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 1. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 10 + ip_stop_column = 'C' + ip_stop_row = 10 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '5'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. + ls_cellis-cell_style = lv_style_yellow_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 2. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 10 + ip_stop_column = 'C' + ip_stop_row = 10 ). + + lo_style_conditional = lo_worksheet->add_new_conditional_style( ). + lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. + ls_cellis-formula = '0'. + ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. + ls_cellis-cell_style = lv_style_red_guid. + lo_style_conditional->mode_cellis = ls_cellis. + lo_style_conditional->priority = 3. + lo_style_conditional->set_range( ip_start_column = 'C' + ip_start_row = 10 + ip_stop_column = 'C' + ip_stop_row = 10 ). + + + " Create xlsx stream + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + +******************************* +* Output * +******************************* + + " Convert to binary + lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). + lv_bytecount = xstrlen( lv_file ). + lv_bytecount_c = lv_bytecount. + + " Send via email + lo_document = cl_document_bcs=>create_document( i_type = 'RAW' + i_subject = 'Demo TechEd' ). + + lo_document->add_attachment( i_attachment_type = 'EXT' + i_attachment_subject = 'abap2xlsx.xlsx' + i_attachment_size = lv_bytecount_c + i_att_content_hex = lt_file_tab ). + + lo_sender = cl_sapuser_bcs=>create( sy-uname ). + lo_recipient = cl_sapuser_bcs=>create( sy-uname ). +* lo_recipient_i = cl_cam_address_bcs=>create_internet_address( 'ivan.femia@techedge.it' ). + + lo_send_request = cl_bcs=>create_persistent( ). + lo_send_request->set_document( lo_document ). + lo_send_request->set_sender( lo_sender ). + lo_send_request->add_recipient( lo_recipient ). + lo_send_request->set_send_immediately( abap_true ). + lo_send_request->send( ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/ABAP2XLSX_V_7_0_3.nugg.zip b/build/ABAP2XLSX_V_7_0_3.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..b01422fb8656522135795dfd292203d9c46c244a GIT binary patch literal 321144 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 z∨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­0WyOug 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

o@+=={sUFPguCl(&T9_Pb43W}1=~e7%lUee1 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%0AW84=3whKup!n%lYk|ijF8}ZFk=f9&Y5s+%LHa$% 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

+VwP57lv= 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

!!@Zc90o1;}z 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%0Ar6L<7>3`tl+LDLb|#@kHT@RTG!k4?}e5}m&GR2 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

8S!$^_}xwajB|@!J^9Lw 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

QqXE zOqMg_J6UMf>pN&1&GqhEZihp|K0B&K5!GLl21pKrTq)fyE0@;yIKF}XO)Ce8xlt7qbAlHMdQM-X@bQcVQg!-@afft}4n_`qi$u z)t&Fx(=>mDhstP;j0v#5ItygF9l7S~9^`tKr;Y81QjM2TSSaH(;1&e$=!!T^AeF6W zeW-fpx8w5Tr0<~y<0NMuEBgK%Cbr65g1q5|R7?X47wLuCzR&OmbqT^MiJq$kHS49g z5%@jr`5b<;L%I~bq?maKToAcd7wjCLeSDbL3%R^14sMA|n98obdn6>uj)+!1`)-jz z^AfOfxnFOd0Jx_7XP$db!jzYCf6$q~EbMZ$>ayRl$u$@-6TMGlYB1=S=+ zEPiRwiBV<7*I)u~mIZttn*H$Hht_f%nHj~|aAs}9@ftOQvSh$*-UgAc9ZQ!Fmfolb zx%5^_Clk#6NIAkxfOjav`(Etz{7}ZFit9lnQsPe5v%cVDzKi%Vv1WEQ`bRhkIJW#g zAg;WP%!i&}KE|C^0_z3d#l{63f_j&(C;-%bOJ=kQ0Rq26a(_O2w)fqbS}!4hkM{e) zI>QkDhuQf}%#*98FaY2pN()b?QtOk51p^&~3~XjncwLky&0LDFIeaV%efS0B!r0sN zZ}v)Mv)|tV+-3VtoN^g=+{$vb_%ur{K;7N7@SioQ~ad7%3nD; zQGVXYnQq+q1oM!?m0y?P@I}nMLvL-*?@lhFMm%K``SdHkachxzQe`o&qI%&}#Z-H` z-H&>GF<#sqlV!=KIR()ayJc8iB&*Bd(0A$Vf|s znX}9TP)paVk{N6(Xh&nwizV?epFeG35E>Q$c*l%QOO_S;x6M9OaZxh%xOEldG)~Cd zwMpcL-LL>w5(4GV#3DZv!nhN|k4(($T@8KAwzLpxin3STx&8$vE-Y?<3lHR2z@mwU zYuUz#+zC$RtJ_+MP;?9TQqOK{p=R&S1B4VJCis~!Ha^&~+^EuxqoY4jmdCLi=3gNC z$8V_WNa%|{NnI8F)~WZ3=bu_%jlB??Ae z|CBZNCCi;zP3l=i`){K$Cru`o{k9SNam0Z_FXK?6klWIba!NbLN($N1sEOZ`lWf>~ zP4aJhap{ej?HFpv;1W;VZuuf<66V%`k%% zmzc+Hew0{-+{H*+OB?6V!a$13UmCC~C1)0!r?`?D7 z$GloYsYLv8h`)Czve_~Qf-0Dih>SW?y>g?&sPJXwPeoQy0mm&%=60*Ld>S2<+JyTZ z^&w-nl~IQtg`r^Ugn++4_t;Nc0C24y$(FZC71l?2SqmMu81m_yJUf1+1h&7J&)?dg z><8c6cID@>63nb2>trKs) zY^DqLwnEJS8=QMqO98t2SPc`3VQl7AIr&s2*sNKcGy3Ojt0t($T@Vm(=oO$)hnxZb zC>&@oVGL6cWW4eV(qg<)YQ?O5g0cL*m^_IY50dL|+wbbDRS!Ce3Q!S9vCz|qtoLRA zbG+*~@$DH|7IDSLNj8^_vd2|&Sgb;R9js%}Q<9;o=&oi4{6+Ms^luqAL4+hIgd(c+0tTC0qN4&6hpE?k&zy~e1>Cwtd7s3-0+&f8_#2#Am&1~p zJ3{*HJeJ0_p1;0x)l;P_3!k%V%}`bhz((CNCANKr6tJ;EEX{}avV^mr8f(|KKK}tW zQYH?F_h6ni5eO{{=tyC;fd#KFK5F8~HS$rJ!VD#eZX~?rGH)*trAV&|)h@j1%0&>N zIn8#7YsSxb5m$!1FxKmLAJ?o-schYf`nxYpi$j~{mv@fBIGGoADvX{CHE(MQ`;$(H>_Jj71#}HS1-3SI^S6(#X>Gr_A8*`^fnbZl9CB ztPe530y-dBzAvz{r|-E9X6Kni+BZ1n4j-ADXE%e-%Z#?KQ9cdWJ#bRA?V6b6W>u?; z=v2K(AO2x2H|ovXAaoUVo4RkmNORUWylh2sqEV%4MQtFlw?KmS3V1GM(<*prZ;Q0x zoSry@@!-F?I3Har(YS4(5f!$RtsaKz>KQ|EspyBGO_Nt-Ikdty!mo1{# z9Y4gr&i4M8kpz$`(&)SU=g5{7A-=e}|LGp@po6jY`Im8EP$>IeJyC_Oyt?^#fx^2u z8IiDilDIE_Uc|V(eDUnNIF6-XGwA)D{GA1*>8aGFMoNgT3I=<)8|tl2GIIGH?7)8&kAq`PdCgnK1+d*&;Qa|MQHME@^YD_WPWKBV#h}29?>(y&Zyi zd^=`+Ch8Ir88A!KNj)yVm3)e1#xltAds{-MvCay&*M1CpiXbgLaxE_2 zX`e^2mV@+)L(Qg&*kN*>???JD-ks=Jss*Pn;js_A@jnniB~d3(f)wIkp9A7na->-STEJnzu^hj<1McB<w2W!~~w5YV#^1E=6rX_{lgBTc)kQgA(z-qi80Uo2_v3Nkdus35EReP4&$myOAb z1Npb!`PxLfta>~}a#6!Dkp}9pvg#R^q#x6A~&+M6v($10>bCtg9{&*t(iElySP2nCsE^}OL#{l)qZrmiZe4JeD& zC_LjrAacemn@;OYxZtqky#JnU zcG8YoVu7>q^7CN!mf~4=Q^yA(Rvok%_!z9E_2p16o0|X5pq7>}%}K>Q`=IUK<{!(C z2+8tRG1X6LdYfXyP5$$<$QOmf65p;JY=CQO1=lzG*>{VK4uGce$J<-4z9++{&*FXoc`? zs~amvNilkkeB+ghyw3MupX6z{7LykXRbUUjxzK28)D+6~FLKttc$;uS{I0-Z6DCG} zyC@Sy(C9~vC~3;iddU%>j1-Ru@#h1k*U^%u2$RUT=nimK+|5DS6j(Tzw=>m=?oAF7 z*)nuw;71&r{Qm&Vr^4!G_ef6-Q*59E`za5-*EYuROQj9s^6*AYv3F9D^9-V}+uU9j z*59pTio6-;BzsEF6r8c{UVbI4H`=fklBl|h-jDZ1rLy;^TCci)deu|v7kC<0Lo9h0 zwvMSo#WUcEm>#oZ*GCZYk2SJ}#OWmN0x6B?ZV{B~Pe^(U@6O@*gfgE&?FurY?(?AkprOLsF`%HQqt*uLtco zz=#xl3exLw$&u!}E=QXId;HH#E?#xdjiCQ)0w!hf|FS%1^rg-Df$uf&+=1>(80?)K zF&)rL{lt-qAD3~ z*OxH)dWKdX8vKZtaqX1&yDyEqxe$M-U!61OotZ`kr_+cdKY*2N;S!2;COSFpFg$)E zCPXAUZ`^Bfyz6l5Z}_hW2nW5y`kj`yq=VCgNE<`FqB50{KlPH|Q_&@#{_+(aK5D## z-ro=uWovRC-_^RN7i}hxk}3QrK3wTH+snmjZ!GDydKOZCaMzYsFdQw%c|;@fJEN-5Bu2(gLJR_aO~ z3fcCSMM{GkoL?{2M6PdqrJ6Z(&asDUbk>9+{C#bG@%$p*^fr$LNfACE*N}=^L>l8g z#p>Dzjl=tUL`S!(5rJ{A#r#6Ema6NfZ!@-0OoA~?15lrkefQJ94117YghCzmoyD9Z zAnpqNA>fWOHvBXs9YqkZ=!W#!ihW-*bfZPSDy-77~I(hY8v?+B<*YOAmC%51mhYhaoe=(9hvwt>aG2+ ztTU&_UmYmUxpT6etyYnVtsAZ<=ya}Wfl)!~UPv^ za_w#;f9c%;uO^(df5+b~ZLb}$_a6e$;yV^F)SPgyj+U5O1JWx>TIjj*_eip;#PCDA z*}3S7F$)3n8IZmHWY8iPjbzP4O9WwanetNvi#WG!MM+h!XB5}bXO5m(7$P(({1Lq3OOtVH}@?X2&X37^s ze6z)3AJ|WaOo~A~Q8`zbrJ7WKsF*dC+|fR*VbiPq@mWe+P4Ycs*rQm_SIEQYUu#}%}h_2D{G6ZEZ7!v2W>3TJV+ z(yZ5up0!VNyW5&BL!Es1*mK>Hgw^iRj~#bJD&4k3by2tne*X~Pj4<8CTO{0^eUyP< z*i>sMm3)iC^9PqE+lj%om)+4n(=Hp))GxWl&!}!QGLO4uJko@R77rI47QcBMj%63)sp*ZmWGWZuzf^ z+nWCibFk{zd8pZH7j#*Lt{W{I%+?6^=<*8<`o!qjJvLyU(t1ATo9^o@%ShRR0QW;G zmh^coz)uD>MV)~_QBgSf_wR-ag8NgfsAD*?8q3@Cmv2*o_-yiQyqxmzXYp~2H*{)u z9PByfa8Z;XTB_^Abg$Ep*vAsP%?mgd1R-$63B1`{ORHIaomzJrAnT(9K|EflcMna^ z(EHCD-Y)jvXgKea!@KxVKHlXCT9Xxy8<}ZMQmEv{k3-s%hx7VIOE=F?h{hIL(6fKw zvM!=V{?&`usQLu<`CB7Usf+nWd;EkJM+ck4K}U8V=L7b?x6Ol!W2^A~tC<~8_?#Wh z%dYNpDaVy3)~Y3f7eShW)IWcJa?+I^tk;QUP~%rp$o|2&;&sz^WPBWbcv=pV4ZV@7 zPG3xQ+e#-z2p)yV;QvDm!}F0(qOR&UvsrBpIe@gxN%L=9z2LHE{%ek1MraP9APaRt zL50(m|I#GmZFzZXzEHVc&V5GTmr#qb(*Uxx6?6coF;4P`GMjA&cbm-34&&+eJkq2U z{1nU7rMYu1!QM%$Tt=i&!~1z_ckBZPo54ysz3YfmZ6Bub^uB%74SuxFl}xf7x}8q& z^x^*UypoXQxbcZzGTLvc(c~$fd1bUYL!L-)AE()*zD|Wg#n02I3eWpu@tcU5XNvRQ z7Wm>|A6H6BIyK#GBNznoloF!;Qk^o%bL@5V4G!yN0673iM@=c9prAzq8;e&qu|-L9$~K8FhHifJU}&lr9?cYM@A3$^{$+DTcSNR_-^ z{jyh6Lx6EPM(p=IkQ;ke&UDv#G_ygO#BD%<9%x>|@)!9-YR^IuNtx5vgR_<%nRW(B z@P40u-QMWh7KJ5h|0$7!n;PRTMzfW)Kvs5x_sLs2>qJ$28ydi zLp&@oH>RXcqL!#&KpkPvw$4}p8L&umx&A_S_}uo^&XI|*d97c=@IEE6L%e;g?VVUT^IP;4AJwfT*l+e5*3I3Mr#Iv((=Bg5ga;kz2k@Ue^t*7S@hG;GJ{&tRb@SkDku>h1B0n$t0#jpcXgeyNCc?59oY{<}Cht_VNPzxeJs{|DKdf7N-bNhrEM>@iue z_w|?KWhLPShB!(Dr7n$RADe`2I0m#yS`61;Lb>_p>&yyRYif~)zW;juisD4dCS3Jw zr4GxBZE9ZlXZ53)FKHsi*Nq=*T>zLF1VcXSZaLCEJ731LjJGU*IIq?oe)YiD(8?;` z;@;wp+`Nj1Z&OlA#xZSrYX5nwM}FQek)dF+D>yoI<9H1Mk$bVb(Imr%4E^DOU!>nb8W5D#|x9bz9o2O?l zyaHRzZ}*pst|ksjYw@ZhI;yYIQV$Ppntg(P{7QT>uJ!ohC%l(AQ$tp=xsXSk&`RD; zIG13#H@+&bXzj<+~V$mkiG9|6ni*4^@^6ci*g{REvH2?R5 zgeP{(-e-Ye2%oOc@EKBPvmL%DYRWFx@9Z=U5aIC3=b66QCmU>^d#6#bboPty>%EqaHf!d|t99Av1$U76`DfB! za24`vp;kgjtt1cO3C_pdEHXp)0paz%l1k?k;Xb)DXl!fk2eq_J?6X^pH6R(_e|*P% z**)XY*m!)!7Jfq@0UHVV5J9Q%Ry?0Q&h-*2?sOSvzelw-Kt%5<4|jZEHa$*oZxw0K z+23B2f4Z39mk6%xHyOj?+!!l?JPu|QFP&L;(xRg;3+6nk$Q8?KLp*NomsP`kiG@~d zwZ^V`mXl&nniV$B>n1kX7Kl}r%_WL-0u9qs#Ziy#!Uz7=o8M^-QIF!FtFKjwum)GB zWuyoPwnl+RWWn7vl7L5DJFT1>NOG+=tz!bIUFYu0fuP9GiF2D<2P(_8y>#CIv1^qO zURez;kc=_LD)C;;MXUrC4M2;JsIn^YU%v~@Bl0kEnSeW7;&x^Q=1&{n4|i_0byM;N z4OQzNIxBDHv6I4t`mIOa7#Z3vPt~f8_X%1$rKS8~2fpO-@})l}2ebk5HD7P)fVYmy zMFpC<;=Lg6FF(H{vzroMpCyV1Q=XoR61ka|ObB#8cQ;ksOeuJ6VmRDjKqUIHy7y(y z+VY!bPG*(uVQK{=%O?fo*B~mtu~qD8sZK4=fY^Z=_K&~ZgyC)u{BlqRVc;uk0T4?7^nG&sx!DYDp|*W`PG~e@4U8idhwiYs-97Z&eee z7r70xSnBGl6X^t!idgip^s{V&V0TStS8uX2!!0}Pv|*p&$MK=B33zI@#W!cx_fPPX zU=&gBmOnp>db>Q%0j5$7H|aBIuNmCNsIv-xPw&ag%4V7uGkfJ3VMaAev+V_36kxC!HRXm6mFqxKuoFs3AHSaro zDzm#Py7_2XdAVpC2w&Law8i@v+CWHCRt3cbSfV2kycj&@)I-sHXK#|fdBn&BGc`8s z7QlM)K;F$T&ctqby(^JA*TW0v*$lFZ&W=*n#snY?4LYXT4PFWwj=ck4!WecZ`Ew zl&e7U`uw)f*s_XdNs4coisW%X!L=_M=BP?W!t(Q4wCuaVPfrT}GOJEE<*+GAFJF2; zLU4>3zSI^b7Jb0+wl{eXf~gkR$gyz|?R$4Vc39lSSVuO#xXRxr@tRW*Il~&PqqQOI zYk|q^2v5e!K4<+T^Gw`t*z6RvMbTR1MKoUUSoorr+FO`Bia-n^ZKHUSER7V0|2!#b0nU9&8j zUXPSwuDPm1Zp(^fRgQO=Va5PoKug5$hU(wnw2R-r?^pdV)@*~aL%qtKl%T%LtuMwC z;KX`H7r0&+`BZ>|?fQz2Db5yWy!Rhwy<;CP@NVm%I~khs{yILi3tHG}a&bhKL=R7=0&s&xgKZh}GS75+ zAuplA#U=&xHfC1Cjr??5dT+7Mu#csM<8C{fX{bJHlJq|DvlH1Gz|6Fdf3|2QQTv4c zr?l3BFMSrDy9`8nrMr2hJa)ABh;}7~u#JYL9RnQV-;-+}kKT!4_mVnB-}3ZFkx`CH z#g;@=_In2~;CKAF#<8*CIG&oVi}MW$G*;N}rZ^}G1uYO#LxWN$Mj_33LXx?|7vi{AzrBZgm?VR{fz4HsFy3%L?V#GEi) z^d6x(vn!Sa`Dc~nE;aPJI=cQX0WbV(M|tNx54TNk1woc48y{SdllPcNV%UP77CS%^9(I$g?1yNtbgz|TBkA~7Ns{Khux9<5a*y6ll#bwt~* z{vol?wY0nvtXGq77aDHOA~X`9BSge+d`R_{JDe)6bl8tdXOP~CK|n=2lAI&+M)OU$ zd>J-~B7EBx;oD;Lr#?hFaZ^$4!FKOOH!Y?IE5|(R6lpO5`;B1NwX0}qsL(y(IiCBq zs&4xyQ4{;QeP$SYc&_BqMCEZ{sf}cRx%RzzD80xa8sM?+F)%-wE4&p({{mH|`OU#o z>{iKGj_6HK-6wNFV&3A?BzQ!yPpU@l+3%TC394Vm?=FD%HWF_? zRF}nSTl;P|Y`%9apwujmCzO^XoFU2=H^7(Duo?!(gSKI1v+z8nQ(TPwHm@>o1+kYe zK*I)uqRZuHE-#Ouy4|Wn_;EJ%dan8m;_@+yzmK9igBeBxw%9FeTo)yG6Th?7NAGG- zSWyDU#orj`O&8r<)A9$5GO%qst64>1iP-bB$mdz((a0|SvinC%bV_80cl$r$C4@0v z7S0?3?fzgY!Ca(Yp4c_*Q{7kOWrM!GN{*H{CgtGA+c#T(>qJh$JRUYo+P# z9Jp6vta&SLvzxoXj=2(M5e*-jcAR z?=Dft2^SRy2TT06c~x7xjawC8AS;4(88s6qwuwQJqOd^A3dHGC6XiNQG?SduJN zt_Jf+5hY-`j6G=T8h-?nl` z%hwRZ+pGvkrX}{6`s%$nw1q7x`Ra=XO`kq61-OYsv$VCSQ17xVaTs(l^0NL)gE zZkwoL z9o*gRn>37W?l?N)F>eFW&BGndyw^;}+Flh`EQQ#+0+=?B)+egYi&ScLSN{7u- zrh%>8few97G#|hbErQ+zZ$Cpn-Kih-<7D5t2+E0BHP-d>0LTSEhLGtvcwQR1k4M)a4zMZz9vL`m(buS|A`r;-FX9&Ld+o)xhWK*iZMbO? za^|Bp9iY8aL|CL-H%3cl1$V`iMXYM=36{!Z*I5F5Ye8vRb`3knUS7a~D<9k8e z@38-EZrni;sjUCowamI;hkDu7Aiz~kwcG49Tm8WF(p56e6h6+u9A|6iM;cmID|5(H znK6wbI>5PV#T+TuGKD6X>Q(U~?qkvlnf4|Z0cW0ZB2&y*5BHP1vwQ$o*$=M2CQ@kj zCVxCj=$k4ah3@aHQh&MVUA6*62wXgCRaTqFu7MiW1b5(lPM-*|-xX_z=CW3{Veh|M zE_bBsvj~>On&gBz@a-_hXJ5AH}fo#8J_$!ms-(T_nu@Sg4c9 zA7(HxU9*EPq@|zkwOkM#kalKWodN_gtas4Jj$;MaEekgSDES1Jd@>rMTp`t8uZ3Z* zsK)hHoubc-ZDP#xNYAVnmT_?Sa2V&KRc{ZfH@}Ifx})kzQ{v5#*wQ!y-1!B+4>dnl z<>?f#U;Jvo)OvAy6x&n0#@e7ogf}PN7Ro*WunOa0U|P&Y;FNeM>0nH4PDsov9IQcB zZ+%Cvc0R!NA}MRff0iS5JjU0Xlg?|5-$e!s%d|wdWg|lu`1EYg)0oMYEmEW#Ap}&r z#RN_>RE`azNfsAH5gI;pMKk%-Y=fImt@|wx*JApWwNOQ@W+rQu=H~szg#3Y`a9W*p zLax1tavD+_6SZNVV&j0=%S!%{n)&!xNL>g`q6+pYEg(yHNm8fn@DKCJbXb?LqlJU{c7>0Ii3J(kl)?hc{A$U6~umwC2MrjvBuij&|*V}Z!~1}`g{Dq zv1YYXXQY$@QL#ycmn%<8Li*!4rF5)Tut?m6Pu`Jb-0HL~f1IL=^L|&q&t=FN*O(nP zWs!Cj;j@MKEu3!)O?_nKKNX#_^Q2$D9h86jH`(=z$}Y}cb59j8L~J;O*H8`>33z4k z(VW@mUCwCzkh55yH^Sy2x`$sh2W)n~C1&{ctC^cCmY${g?ngJCHS|ilVh3>5JQ1ru zB4#QQ6$arCPM2?)IGQxwOw5!+?&xwyFRA-^O9Wytj=YUn_lC%&L!h4hU4!6in6#ce;uurB3* zYyAGKeRN~MWc;)=q1iv==^=g245cv$z7*^yBbus?5;vi!-@kPRd-oL4n{5tXIpET6 zFE(DEPj+QJ3|qR(?2kLJ0|7B=!6jO5`6gakEr(x3?!LyyP3`7OW5m|sf5|u;wK9_Ms7pcK~1<0g`75 zGCahU2JHVA`rAt7t|JtLB5W^xeH>4NyC$T^ei1S<$=6^ExAch?o>qI{RavO_dOcfg zAzDnOKg2Oz{}VwtKUO{mn%WJ9Obt2SP@^WcgC#P=>}mHxDW?d_7c>(OG}}9bb?`%7 zT*znAz@;Z#S{d5)Jmv9;_Y7{odO%0eARD`p8tZMt#yh)df_rkkPm9iUH&Z3(ST~n1 zSLu;=m@Xl!`ZhLq*&20`)8kC>CFEEWHCjQRGum3q4u(@m0#gTu-lfz1w*$ehCBD8S3-VE_8gf=9YYUF z)@kp=iA>OB3kzM#;txli^?PV(&!9t8Y%$o@H2d#u#F89hdHl*2LWZWm$rDw7GmS@k zKoM2JR}24SjEE{9s+P#mKCEvd|PCgVmb|9j(fL0e6YdN}zA?xjB(A&Ma4<$q>CH z9WAffY+YkbvKk$07FMQd;fj!=w}(L?0sg7I2h(LLYp*g#HZF_Kn_JNGpNG!!M*KcG zdHv$q{%-IABR+3hL4cghM#z6M2Y5^O?&npNrfQ?y6;h_HhxJP!*~iM)UBZZ&QnJJc zQE1?8x(U!y+`wXx?=(V!JtTx)<`PHeJGK|Yc8c^H{+gg^wJJwGx_^)#%$Tg~3|g+w z%X;IBzM*hTf;@AjidlCCK{h-MxwzCu86}&Myd|x|*^$jhv?X{*@q-RV;WV(uA)Hdfdx5{7^>{_Ni*BzhNn&@r_uA*O<2Aj38!IS4zfx`v+>D`OXEZGV( z0>N5eH(@CyxSc)=UNU>58i46}pA>}y@yf4yx|@9O1z^VFW8$JXP(c}ZE1!?3&XP5t zZs%i*o>urf5tuENVtLTsXtoZlvJDqDa2>{#t6Y!i5#nF&)oNNBExqQ#1+y?#EuC!@ z@S(yLi0k3BE@G&QFs?Xf_<=Vmm=QH;Ib-W!2&-Hym7SuRgIBeQ!klB<4C|NI$+IPj zJ`vAw4kW*Mzj~W?Xhs))xCzs5(FF6!<;-VL>>JbUd?ZO(7c)vSzNa%)pC*Z_!_+iw z)~|@S#?1ASi{P^=^tuUT_bn7p&5NmkM?bmcO>`)acJ)DE7#j}(mZUST;Yf+{Ow&lU z)6q!lSgzqHYYJ&QW58xqt~aoKtkEh=Pm4&jP01UIB*t;g*F)POA}1rmI<6Pv=Wj{t z9lAb3Bffuw9XSVCl6k=mou;eYyFBkwC-UkdJ0tg=XpwQBv1K0Y-_o@rLHneXY4;|(e);vsrLWI)!8iC zp@ORPs8%n_31XCGncNo*bRci%nTEc%@zKt!@lxVkMMx20iBf# z1?*VhK^_Mv89@@=tk*kg^jJ`CPQm7{x9{uH;j%*{@R17C*x{ABZ(w z4ye{AqX)dA*f*O7z539~?JBe#XQHQ_+K<&)`Dm`;Hi4zJs8gS=*r41HD?CK31qbac zJxo+dT`Z<`tLY_(sftf#H<4DX8mn2d$}_U;olhJcVnxL>{Pc`MW)!csit4BB&e#N5 zuX{CH_Ep!dZ)6s9NECk?$EBXDyvpoCcCNF(<~U80vtU+NESd{U%lR;nmST*E5c3*D z7@lJ2+hso#kr2^ND=wmaS!8P6i={Y;AQL+a+UglLv9&Ygn?;huE{{OkVKo&R;jg=h zFSKTJ9s__^*u4s8k@WL!VV>MqQlZ1|W_F@_%t9w#q6EILp`V9r%Znzxaxf^Db-_0|eUGwKRvRJ_|wh7TF5U?}&_ny3V6{%@jLz-r%I^qNTb9D>h zi9mnd3rqmqxc5Z3|ML_~yDX1sG2;AEOz)SeX*L05o`zlV2W&FHE5R#vL~^2321to0 zPw%)kW{a}d!|6={*dnQ&)pmz`v;x%O4?o^S0_g>{1;+*~{N*`SkCtS*Z8`e~ibSxZ3K^6XGwRif%6^?23g z7a`-cWxHJLmdBW#$^Ean&4}uI@8Tl~I^itJp(KiF|6Pd@q9+12mu7aWxz^Q)T-lb2 z1^lMs`B=>(gRKF{oOw+;j{jjTF<}D%%lF!AbHr}CRq*D%L_rmiIm1_>q_g!py8fHKK`HQGR3Xkks zk=YGIP0?>fU#p5r+tG?OObb2Scv~J}vT8nfT@S7;gltKGIoGJxBW6T>Ch#wZKIeiR z3PgV;qvtJxHU(Md@dVc5`Plbo5=vY%mY5T?uIPhv7dLt(pvW}BL(!+TDu)q+)8EGUNn`AjN;F#dK60J${vR36` zNWDb-6!%!t!6`>{Z!`#{$Sdt>Q;}R!8N~*{_cO}Y&o#uaix6g*|9qGevG0cc_mm8d zR3UvLuUM_969Nc0S8!AiLNmQqdBU0n@II0HUSFzP?Xs>ci*(z(d&LE?(J+%6us%$$ zrx8fBv!7#hQRrVys{Zam9K^eWtpH#M0m((z`)MR|+D&YUGmN1etgFiM4gt_}?45Hy zXbiIUyw3X6uyj>O$`vVGvhEG%$Ei_gT`2Xg-DT$V{%n@!a-kZf|g;MDiSOGS^t(wG|6d&SXqezUB9Ca0aW$?h~)dq^UBk(-^e_&A2sXVX9V zCkYEQ2HGYY&yc3SR$;v(mCApC^OWVh^&KmP=wni(vliaNzDXB?q~T(Zs88teOj^RPz|2-^5Zo}BDLI#PElsgBaeFp*}c#c!9|ki*lB#UWSZs1dw9=B z9IFL~BwM6lLu#1enR)HfYOLSb>Ex3$hJ!B!&J}>kQ&6mAzcjzGMBcAgQ%lcIVO@5Y zLSN+jjO)Yapre&FKl!m;nGD}HFBfOSpl#dsKkQ?mHkz3A`PfUgxLb?F<_mH<7>@mz zDzf7_IHR#FdRN!g}BNC87KIw*=FAR9`SPKf?pvj|* z3XZ!Z9HnXuA4^h@7Gc7_uaZ`DSu#1b(pH%#p1)3OI6;GR=F0fC^5HLPQE>OwXc+qJ z`pVmH>=0P{8?Jx4%E;fB!qMz94zD;=0GOD2>iz| zZ4~#yoyf^taJwn+G<3KHwj8>nbtUIQMs$6oKEn{D*iE;dE&Q_cAKk6JJ%4wE<$j;%lKS_^!trGWkvwf2p--e~#h?fDZ z0b+?~A7oVI7gxSmXNy|8U4lh{^wfvXLZZ{E<$`tTkz#IXpCvV>d4Tn)aX}uXJO1sA za?N>$C{_seq~MiPHG3`^%kXO%;$8N~E4h8yurGCop~1vALFuD zcbIiA{KX9d-16y1QmJr5uEK)rhH3IQva>$b5N|j$xqTY*dnM6Dz`(g%$%Dp^qt{f# z052}AP{?Td0EVdCgT;m6ty@Ct!zm}`fUm|%8I%LZ?b3}{)YqS_hEOiUBnMMXVxmK# zb-}qKNfGOWRtLve4_UgcPLa9Q_Wk;_U>h~Vq?`@4@<~rBY5czCN@syTRr-2GT0hTR zf4dQ|Y@cTj7!oq3!?IJ%md}POdYfkrUD|%0vw)HsxZc4+Oq)utQ29gg2+zwB`};-2 z;31k@5y#m>(t+fYd;JGElr?sZm8HuVolJ$Lh&Cmc{*__zv1)GswlA91NV>YKwGKFw z*VPb*b6IB(XgAxJ%1*UI$hrGDMs!d{e(c)*n^?EA+m|qED{>UZkh`KidfZA%J~`K| zd#!zSNm`^aN6$u>FTDNR;5MsMiz(Vnj*0m#Hkf*v0FrQIoAyT|7Piu3P_44~vkPU} zkFBG)FcL&u=(NpxwzGad^wbtxM%lyClvjo66vTk-_u538CC>|?)FmT z#31O=nARv2xKy}e&9)Y zZoA~S35)owm&<+m-z`Qo>w;J2QKUaQ#~#H5yA78&GYxo{=%T(Gn|__0R~#Ozh)^y4 zo=5ehoYg)9{EH3cJ=f>57$g~_|2(ynG1?Ke`&WA-)13S!$Z$}+&RkdSWQ@Lg96)I5 zdE3P3W4UK*p$N`^j!&ouLpq>$O-)l|5Grb7^a*7wqNy!bgv6S_OyVA{&n=NUyDOLAgAC{SpV*%O*RL1D|MP}^ptSh5v&Mf{ zBk(6&-(#Uf3B%rVLEf$>h+zE7UvUg3+jM_2z6g2$p`U4iTJ@6nqVKABWw_&XYj)O@ z6DM5e#+7qp?6aHoXf!5#pg=_sw@8KBC36*|BzgBEAfNlvIWR1dHhP!HM`v1UpJa>E z*=GDjz$?*(sU{SLu}g;MADe~n-5&AKH6_x&GL>(xUykRKkMjlCUB2(x)5Dd!I8n0{ z=uFBArBXiMr|sWk>0hCxc;+lXPbM+=R9KCD(30@?V>{+IC2s1dJ)%aZd4(UW{dPV@ zX9|)@#F~+H(74%0!g2z+tZYp$TFtc#h`NaURD8=M)=uj$s>BQ8dK>}akOgU1O|uM0 zvJtNH!1+~xbtM5gN3K6Bl1 z{-i}83JZz!CJ%CgYhQq{bv98fT)F66g*E`_L~y+pbgFC0o-hDtH_4q;B=4bW5zKRv zr=C1f=(}t4K2OWQeO^i~I3Qg=sGa}%cMCm39Sejdl?M3h0C3bM(F%kgd#SMq!HX0L zWrr4v;0;B_`1IsosL*=(A9~QF`G9-aaCc%2N?WKlk7vnnW z8`jBvv79MPVGNtO_AjTXNlyVyVcThZ-#8X?b-(f7y(;+_VZAx<>$OoklUDd3@4K?Q? zP9*e%@F2e6r?emky$wxN{z2sKP&h+*J?PuYT=vdYW=3_Cyj=wv2mb`me#1&Bj*Fj_ zpH3;#K8fk5{qBsJ0!mf?_Bf{oPfkd!6AAMdJKaz(-Bx|S@ z;2dMlk@ER+UqSH8%6+Us8L_-4>|3iiOS<(Gr(THm)=j^L|Jp0{yW??FOvof=?Tvhb z*pz<#xbJLxfQpY(RJnZ5A(b4W$jU2iNZpyO$ z1J&LQ2?Fk#7d{!|T;8CtX8O3W7e18nwDe6lr^6e}89pPo_ZX190WLNwfU(?jPlxUM z3bJKIUr|`s8nbvw+bqHwkNZ}wn1rmX#zSh_sq*UcUJ_WlT&cZO*j!F@tW_`aI&a-0 z;&X<8)49vc(XL}FpzrTqIObOA-u0vQe0wQ~jnmv1_Zd4qy?PiOgZn#}eeSh;R84io zk8TPZj-LS1gX!e+GH>|Yhi}+uk1_R{d%>G60jpOaduEsF2uZ6U-(2L|_?-E!F$Y=_ zEPp&MHb|iw>^>%mIb#Q`wk)?YXF$=j_;yzofFkNcE$6#)MeHSE$D!rcEi2r_1=!mTc z>|so6Wd8*?E5G3{4vaJ$E<){hb>6C~?{_~vWITw_Jm5#2@2yqa=Y5mub+sqrjfl@B z8!W0+7!4qUP@+U_)%!?d2G{Tvan;o|M+0Il<0HOo`NeT8>PCvbopER`x>Ja*T`LOm z)$6q98L8-?**O7**Rvf5WYCo91g94`YpOkQ>W(HMHajW~;M?^LdPRrdS0??xlCZYU z*sJZq6SDQ8PNQG=VtU}lD^wwa$sU|YuQL0n_c4P$eX@7&T7vsCL(bwOBOd#=+yT|; zWIBSZ#)K{5e_hYN9JHVM5Hkn_Ow=0d2^F2``-uAhg6Czr4sh?;s@eMNGXWxMyALy? z{(i=ka^iHOO-8K@$5g|~7sQ-eC ziPp7FBBFSmqWH)^>cri5?J1iY^yakCO~yV2l6tH!Qz`{u|8{>{-ZDCwQC>V;(kwiQ z+BbZXEC$6&aFty7N7eS%II0&t{c{RB?}MRs%>VOPYl;6sJmATUFYt&2Twd7xcDIZo zU^4v}+r1avi+1>_XZF>s%h_N2e~LL2>O79>g(Ku))Sm*sO$cDfHNzgSGHPtbI3p!v zvcK@zt7iV5?!Dv&TxV5~2|l@IoFs57*?#qJLIX`RfyP$M7dERtKab+_n8E@YktRLo%7r*KXg=XtnovV^<`dKu6SvHUy1G}|tz$j1y z*7*&UVxGICN50<8VYMQnjTO$Q37Lu9uxk4K?-C~7V_n)cWa~>tRUsyYJXNjX zjhRCp$kh+C_%$E@)H~aiSAj2Rm(P_2iRmsEa`akrh$~?wx((L4IYguAm2jQP#;$z* z1hfg}EPDqX;~$r~cL;1=Zf=IoG9AFtyJCVW?quaOW%DPUy&C3#(0swK0amz82*&=- zqz8%On8dfpKzh)Ww$qe^m@i!7z$(GCTD>gBz=>LAax3?YeK46SsPrs`aR5L47p{66 ztLV$&?HwiUTmN%MDsS!7N5DY2FkM{ugiW59D0nBPZVPYOwC^*tF8?r<;@L0e8hkP$ z%6ZC}&oQ%vJ*g5Rr*DAr#^9&ucLFCK>fo8pnpWRopm4hLR@UV8lw}-O)epB=Y6Xb^ zm;P94+}3wD?>Bi2nus^zyZ6N^N60|#sCu=z=h6+ZFgyp-y zv)KV-GxX(Vwz!vIH=BzWHaZM^M7W@)SEr5>OIku-Z6BObZRosw4{^VLCg!#6(Y5M&(;!3z_LV$nqh zmlL2h@gm{gN^u(+VDHP-pkcVATTlCHefwtpGB&~hV~Z;CNF>MAt26AJz53X}VeOY} z*)ulOh`4Rb1y$hQ8IQ4JlwmSidWWAE4W<5gUwOXQkC8ir(V|=2^J%IS$7)zUUe{nd zd5ciW<2NBaJE>D)M-hI~(3v!G0;1rLWe*;Z(D|zYMI@3@9aGfnlTFm~l_{w7o{p1k zA!4A!3`sKR4SWc$D_5XOx)lO@BET^$Z?g@f9$yfY(-gp@;?R zH=zYNUw(%rJo@*fDRPzHzM3{1!EYZSSu-!Kq&HsL0QATQD?w#Az6lH;{yA+thiX$uIC<&q^y46SL%1@96_&D-jh>I5_1ofEV(ho zjH}qoy3mhZ7s)nX07k{vYO>;hCZnvt?~khG)LWRJBU5HyU7gM)9c=P`Q_BdXU``Wy za`3lJ5jw=wfUGpd|Hrx!a%#pRC$M=F>e||*sQuFC#B^o|67ea zoVartmq;ktv9$C{z;A!kNcocj!W*^ZIlS`06Tw5HDFBJD5#*VTI=up2$5LhH1-mMW zv|>QFJ;EQifPeo9LJ9~tD`%&A6aTOgSL#zl#QVv*R<1s@-RCPvp{B0iQVZ``EHuN* zx$VcMPhXH^d;bw?eQ;aLWoYC~$ewbRaXGC|X!N75S|i;uSILvvWY43o9)cu3<~Z@$ zrCa;P=*J<}g)ZH*(ZQ36Gy$LX0|45>snyvi@pnr+Vyn_80z3ZLQZw&(`tYm9ywo>o zcr+r%qo_8ye6B}7V?e&Fs&b^lE4s&$@ab5$g}J(0dkQy!uR&RreGvFXy*!G@2T=Uf zu5x#y-qo!9E3m>lWXx|P8Y^pD+DB(*(h1m4ur%jMl77!QWq@DHFJzxJmb+d$Y5l#a zeqpK|Qm~UC7oeT~mjpz?VKc8@(x3bzu+1%K%GEne?-A=Ce@DM#**&)Tw?r?OBRC43 z-mIaND(>F@uG0`n6YdZkRVf^J_afudkH7wa$^m&z4^wAJ(3~?iU)*8%hqNhX75-h% z1Db^?Fki$wG00+xBn$0Q>`gr#?+b30VxI2c_BASrIDDypRYU=jHxe!+!rmhQ3qLpw z2jV@BYAqU6Xc!Dp-|@d5$} zAfr@#bK)1~b%2b?%ZhisqFY77o8vE9*KJ15HByQOS19JqsWyu{Wm0b6DsQIJ1AV49 zNsm5&>zKy;Dc|P4B)q-jYf~|LU;JUR;1lb6sHiD`;2%8}4-T&J`qjU~=sZjJ`P+ z`Ctl%E_WYGt{#JD4Llgc=z#ljuce-*@t=XY)~?IFcY>-vE{RW9nMs#;T?K>$N>0z| zByYIQzs1gKXALLJ(zT2GO2x95go++0`0O|JclCY=V|4%12R1jWM3~Gq(F%p>&`>YN zJyd>eKM5S>IywE0Y+t`rqH13~U0@TtcK!HqiYC)VJAmLQ={DS?|2&zoraD8Pf!NuM zo3*{b%wMG>uEEkuc>Nx`wTT|*I8TjMgIpdybzbtD$V3FEX|8B}_KZ#wmPb?acIXjq zvs7al_S+U>nX)(5_S%>-LLjiOvHk4ro%^WpiJ~#J7m_DJ_(MA*J!s*%Z{hLBM)U=+{6iM+I&b-^N4z&(x5ET86Q|0ub?#C~IPy zNxY^HW1joBOi|6oKc9zJ(1KnYW#fRIlO)N8BFcA*>HQO#E$<}4mi-?9%n2I|HiZJk zS5t9zi;FCo0Rv|rh0?Z#rUt{=E0){kvX|G z6))}4(V+Zh!3z5L!= z!B++3Le)C9(ePLFjguQl(m@l7B`q&GZN)2ZR+RMBHJe!+e8Yt5Wp@a*_{}squ6DPV z%Gg9jQWV9Dl#)Lnj5~`G1^kb(EwVVqlUS>mGv3~FNO^F%Xc}!#7JL81nmFn?Cqx9W zwvc`1cb4_3vu(?5%KF5*@kV-bgyh#^Z>~;1LoBw#1OMN>f`6*%IcSLUMVtTrfRL20 zYb%mZY3xTh(z|lXs&zE4=&u zHaKfjxo)XtoH{&h;4=PjZ$9m2EdNfJc>#-iiD*f{;`1ZNe6qlgW(a#%(Y~KdOX1fQ zK0}pT-_b16E}64qW(={@OS?L)a!}x)pUE1yBzE3>fKz89sK}lAg?j)zSvX4v#vlcs zQ>g#<+9{lCnLo@=mpb=`bNcShgtM1C@8GoWtZgaWd_|o&Xbx3Ge&awIo}mOp9uoOQ z9<(L*l~k2%O(;oCjLapHEM8s>Hc-g9t(#4rb4J+v*X%R7mHY{$2O`&42Xf!4CtJ-G ziqA257``W^mP5@ZJ*;Tn^7{(F0rmlht9EislL;BvfX2984B@bGf-(|k;#PeM&8g|j zPqg2>gfzN6YN@K0yuyyEkCregJm51l^!o`DrW!80_pm7zL$#Jc(1u`36PxZh4Ec7z zL@LBLv>>Ll`R87n!-o<8FoPM@6SYOP+Z*gF!b27Ar>Iqs@#irp*`F|it;3y#v*foX z*=i$Vf@5vMx9Ow-L0cx1n8m7>2}F^TfkcHO$>t9gC!Z>pIXGE0JYdqbt;+RuT1!AY z&t-|MGDNgg-}F;20HeOssEXye6{wuHq%-Z496bVriXC8C18i zH1OT@czmK|_P$odn5bvMGu!@G0TqEKx9QJJV!&Pca~BtG;gv8@g>Im19Pt31vraz# zE&u^_AG@e6o%Vn?2Xci!u!*Gvlx<^oe8d8Oid`A^KZs0GH!<}+MhzTwd*O!|tfMBl z$CKvW4zSuca^4bv9|FT>=5Tx5D1F3$ zWLmWzP)YJY!YrniJB7=^&CC(GD6;srIryz6a_DC^OXXh@o@vo=zNRa8%go+{QL+>OG1F)&DE`S0*a5(URGsLz@5AMXxwWmBenEzyL>(up`(l*a`g?q?n*}c z15<8IlKNX2YeUyBGS`K_mdo5cZ27?AwNLh_`0j06!_-&gjNf>aOFKC%Zrlnl`-Ss! zjn6wI9_4nwZ&dm2vA-&3U`amCHh{b17p{Kotubb+Ma!Cm?Gg8pJtf}$PJmfL0iH}y zN~WGa&}REu-N@pney*2fl%`6rJ=Tib08;pYp)Q|2ZU=AkVr5)$)b4wkn6>sNudW)s z8vfX{k{#E&ei5CBe4ShkC+E#IBp_AoH~(v$lvSC_E#fjy`ILC9IL%hKM3m4bJHirx#R_~O+|}U9h2qKmw1I9O5HOYA=CX7 z06t8W${|pU4XR4b2q3QEwIe$N*?MkX%sO^BgUt|9J81u4yu`x^wC-!OfJY4K< z*jIaz^GM*qym9RqnQpvTs9J;|YhLUh%eNmAXT3!bAu!U@xaMGdY+Gc`&3kc;1%lazSHhtw=04N* z8WsjENoP_X{hd#DsDAnoWHsgHS!U~FELE6(+PhSk%A^eYFM&yU=^WpKXu+Kf;qv40 zV5+;0s$csGL-;Ghll6yqQD*ppL@I0qVc*N#cG{ZdJUFuI|kNrDzQ;Y(;(irHc_Fp8HaXCbR0jwVoTFr{z{W%?BM$D z6HN2aW{@|{Dhu)4-~zXOEmruB%lA8Q78f+>HKOeB78}+X`Sg)qmoRXUrAI{OO$+C- z#q0Iu@sT8?-1RtM4qX;m&~W#oO@Q%9h{l9BNyeJ|9ok`|U0I|3vg8QhQ@}5Wkburi zgN-Vo0%yaV7VBw+5Wv@Io^8mx~Svt+!PhStXYl$~Fa4 z#RGhrG>87WobP(RwSO^Ec6f2B4QU)aPMhImSplA>QYA^dDfuf znU$g9Db-OEmFU|z8z*GDJbok51buxf(0J#aS+OC59#&7!i@M%@FgQn#t4v@@&T0Ya z8n?d~w`2#c?t8nZ9umkra7}A_|Kj4oJKV;K?22Tr4mlL(m~~SjhUVJj&sr=(YG*Z3 z8?uspT9lG?R^lAuZL)=-tyX3*H-o}Ic1gSJ%a=o9J3Vh>*DqbOtL5nbEIYF0eHkhQ z`8FhITW4+X#yYsC#!51g!^64^B0cxpx}G0vGmN7(*up-k^F}eM{;Vd$xPd0nF-<@J zlaPV_wbe1P*(t29qgo3^$^0{rk_-qF*xLgTLSCSaxWeN^K7%gT|^;&Bvd8 zX-6v+`1S^6`a~o~9rJ)G_H%gl)gf6ig@ku+-56m)q=(z(QF0%mRY!iGr&bKyiBTGu zeCH@f;Rn_{M_jS!mBeT8C55Z#r&oiyGc)$5?Xjy|@Ty$hI^nh9@rQ`SO@^q;4KXP7 zc_x-;@ifcD*|zx^2It@Rtn>i;{($sI&a`Hy?Y-iI0aNdtHTUi>BRg&|2V=aIJ6BxQAC?fRqj^?rPk$9_hby=i*`fN}jG>&X za#P*g6Y76lRx8yvXYc%1{ot4UE^pS>@>L%3U_~#<_-0cJRKNbU*X2(?lbX4FM67nC zlWc^AL0jzi_uxm&N34fFvCH%{qvNf^a%4D{LWqnWb=DAM4!Au$oCc`skD&E?swy>A z3K^X4zGNB9Dv~0$)IdiPl^Zn?x`BH%QemusLZcIR*}!t!CvTpr!B==j&0B6-h5q9& zYN^wlNzH+12}WD+R7#jSCs;&pp? zbC$9Xri^@t;6UE4yj(;xbiwu6*l(1!?Wo>SJIy#5jA^TnOKf;F|)qn{+zD&p; zKc6$AhU;ypt8Js(uV;hakjM=H!6pZ<)EDrs9&e+FJ8MDFI<>zj#I#Dv#+V{L{ zP%m2$Edkl4MD#R^EEi6GB+5$bB0dSvL;}lDA^Ppp*F()eCQ_dNk{@`@E`5?3lWieR z+CQU8UA7P`%|EUlGo4Z-Tfe7c7}&RR6&0}HifE&9LI*7+kZliBsJ(O=f~U^+s#u-@ zCr^i|o&`F0fZE?L<|aJqS?{r0v89N}ScIwzsV9l2FSd}?htaO^@CH8W zTGI81&x-yu2$@4~@hui@NiiKWRtYixy9mDGcJkQSzpM;rZ=ITFO__vP}6cQBR}uffG`S1UTYEf{V8|V>Uisi<2#pl=uE(fsNiHM@cGqN z`jvb#B0&$I4=_*T z?u-`DViYfFQSb3fglN34qv5)tP4YPC<~!YE=%gxpIQ^n)Osw0R7D@6PB@2?ek1>A4 z1u9L1_fUb|lzxIc5~jE?GwPQ19)Dh$8Gda^{4$&_ny?APZ^DUM-$mKV1s@a2=IVP6 za{iRoI8<(2-P`#76!vznl?1W?iwfhD>7?XhHZ{s&E-O9CC^PWg`os4b^mbpb!inG?0M zTP*g)f}TnwS>RQxoe`FQQ|?9=3)x;G5R*rnvDk-&&UbsuWa{2=SPg z%GYuNub+KY#QwXfX4zYY0qy92uM_uw9!?GShK){%ON^Y}y7peT#M(5|ECI2z-Eg*T zF;}Q}dH4ktnRI+;5?}>C`e3g`mHY7wg{lw3MLo*=q1iK+`7tY=-gxuu*bQ0V5wFN1 zTKX>Dw~NW>r>N*L+~^%HNV1qPq75payXLDU0G6yc!&7BO|6lYczIzX`twVIstq#kN=Br{Xu|Za zuv`VzIK7vSd3Ycxe%70rDFyOhxInX%k%@4K`>KDO*o*qM@5uS!<)s9wL$w>9`Sri& zH@zX{E)7Q>Y>18R>fs~+fl12GBMdm(4g0Q5blR-DynkP+;)hZ(S`4U#(PLDiaVPKR z`%!Drj3%FbQ#f6S<)(f!C1uwBOH@T>rnL=o(}N_7%i_qv)@n3Ny(w7zg{vWFs4)>R z?PEF9hAo}0E1qE~m8+rpC&zEg@J}czCfEAH{@X;yd@L3smpRY=4OTH&C20PgGhgJj zmIkEp4iY~2#Rqxydo$_sHShuRqFlEPPt{r0ix~t8dd32e1)s|O0(CBcZ$Flz2nRst z3*oE*s3{9jsQR0BJ${%--i}*OliSY&*PS8hlpfYpymq0K#hQ${cji5X&AQDqU~Lju zOYB(EHtXd(CpOa>$NHWE=NaWO?}bgPYe(H0jkqb*Gf$Ck&0H$cf=9j1c=<51o*Mh! zIUhO|j_b_uqZdFYBK03b;O0&+c5b3!!*lCr%j#2JvPyVHXGI z;f*3sg?i=~^_$%#cWi-^n4ovgi%?wK)<0fY98SVrb9^B29wU{g9Y2{B<(RD1`Og_5 z#hY$P%<6_^P`Z0nOZix^_{8<3dai*i6n&af_E?d@^Nk)PdaSXPmd9?bB@*T@yQ8?d zH!h~HBK1n&R=oF`aP*?)CjH(E+UNT>(ylV74QGk}TMD$Lz#ocBD8-6Dic6q{LXe^* z!J)VncY+is?p}(!BtUV8;+_!PrMOFi1$#2{$B&2cnALEzcuoBr#D+*YH^Jg29dL7B$MT9Rnmt=tQuAK$Guv@lhr z(Aig3H8GO?FF5I}u5MrRVd0WU9PVDQUp~6ROpzm@9Uma$jh`*>N1Ke&qih$ z^jO-k4KyM-sP=_+)7y|SFGTlmQ;j%SfqI(#rg~b15~lY?Uy=EHMfG3kHw^+6z3;7@ zoX+%!?2rWP6-gMII9g~47AI;m@!7&QLhQ*(Hu4HvmT({g$*|0dC=WDHS33Gyx zf&iyt!Z&vYPE?&Zo~XCJ=8P~Kq4#C)js*4RUer};ki_5NANY4!au=@rH~vM^)5*aC|7?Qo^W?Hnf^*?f?7nX$b|~6EQK!LclI#|B zcWe6`xhZl#{~#DFlD9Zbb_*7wTVHvJJVNXK$m%)w8VySOAbQd2Q(%h=)d0_S#p`l* z*QiO{|F#l&domG!oBo|`B{bouMhAoMXr+hi_Af0`t@n1nt?itqHA)MsOl#D>u zp0B)ljV6*jOjmzVpQo*~b_w>caIuS?dCA&AfXsmOZqe%)X&0`Xj9wmo_LtZ7pa9M* zjpz5qBf&qLsgfWb5;9V++oqYX$c!Qw9$&walC5;49*oF|Io&vM@hu+_hp+}$DFSxC zYxnB(ewn832iKPO#N)TjkyJ>WKD=*9&+NBS&B^NJ{3OERqWm$sd2*s#*W9Fz8-2G> zwVbQ8>-Y6ql9XX7(n#e10QK&ugJ60%6s)20X91l5 z8*>H5`z6b8yL=UQMwx$y6>SE-)@jzOC~yYDQ#q=ZBjf(>Zu9THtO+9Mg5{pe}ah0+F_>_ajk{b;(-EZuUV-LQ%y$b&%C zP@G)gX5k|GOV?p{0&kUdpR0{~zzlqzWJ!!rasKW%ZzpjN)nbxxU^0Chr9J@66NhvZe)O`hbOIG%XN6GO#xqh>rTX@%Xxg_PIV9c#jAf5 zUBR*!L}LG=PaMPQ{A6ujN#**PXjI;tn*q`)&T^sf>6o97Xv_I1+-vvs<*1^fr)`-| zBwIu2&@azkqM4i(eZjTRkRvbA&wcUikCZ#M(#!VB_VyTaa{fHsuYC2F4w_meHyiat zzmIfIv}7PKMMS<>ek_?rHcz9g9FS%rDaQI2x9zQ8uiGd4Y{wh6d%#%OvdfL=OibfZ z#&l`IxbE7;%Zet9;W~-Y+UZ9*C(Sqmih2OOg26zI>JCl=m*ITH6Fs=z4cyp3EXU*) zRfRvfHvVYJD#+avuvi!?Zht~ja#O6h1071M9|hh7|cZ8GNJuRQ5|$#aMha38^n zkodmPR#Md|F4m{1G9+&5|K`@#e_pox$kzK;{@7)Plw09NAt67;D?0BOv};_e2Rd&= zlKW?e-J7Pw!||fB9sTt;wXwU4zuXzona^lyxl`did)0wPq!6dbdAQaMza2JZWp%*v z@er}Tq>0(f$J30XOnq&a8$7({Zex$gSxe54Q{T zMwP2v1na-!tu^V-XalvxqYm}Bss%JZ5wD~Kbg~$@Y^7GIJYov+S6}(uMlk(eRrfMY zx3-s)+|WGIr(GUe>9RmOPmzu5pIF4OpU0@N;cqg9L&VD_E_Xe7JLYOQzr^gEz-%uT%n};D1m*0u|vB3Mpon( zC|PjGn+EvBz*2q*P%-7lQVn4tCTqlISl8TZ5DClsehVG*TKLYeX@G+H_%v@E_o4^J z3{V$&hAa#nkFfzONawRdo|7`Jn-!6=2NT$t9G=%e@@g57e}Jv?t+_WDiF*%B_K7o# zHlBv&Kxu)k%)8=mFIL|T35CR7s32O&SR#iuY&Bz@$VWevIJ^(}BaKoY`T43xULC6V zV___TnDeM7wXH4Asc~yl@O9*KmIq0ZG!OSXZb=9?%uv=t*G4v%ka30W>L%vekz>3y z3HY1Rp5B?W)hzpGBry|EI)%tnfFe!0@~7%;(8_?x`x#bOmN~9bNGWC8V1{i}A=1vB zN8WazR)pZU;z!db>!3yb8#TYoxMeMMhi@+|+zb8$O?{>h_0XwXYNa+y2RGFAr5VdV3n9tl&Dk`{GveL>( zk2Q1Eynz?CruiBGo4j3JBG7W&`5NlbJ!JiI6d5?-p3+EgOWz+{D<94s!&P=OvBOne zj8aC4EWKPy@*MFNiQiT{JC6ID?Bgv)&JY1ad_sQN8riRURZTGnm$~$cEgj)crp6ZB zu-x@fH)JV&K5S>2o#0EmOUzn|dIIwYff@G?%X_L-UKsdzsS+=-=|spjn&*m?NnEC# ze@Hy_M_-I(#Yr!eC0XF6h7L_R=Two5s6i6;79`rMl}?szEaLMtB-iH14(P@74Mi*4 ziL$=9&mT@dO6@TDidnt++)}T;urFkDZf{yy!@%5DHs#*Z60G32viOYFL6}yYQBJUV z4Q+G2`NPYuzNuK;=MnF*Tcw_dSe^G((S&bX$C4G@w}nt>^pT3~rP~?(rY~RWy*1wI zs$Tu98y2w!x9D1*G;3;Lp#@a>BZPLT+v1QMcNr~4=RXWTc;7J#zT1lNL|_6}kOdiw zA>z)bEf}Gi{)gzRbGE-1QcN@3fc`Yr|A|i>=iou*ylazk`l%yqT6O`zQMD;s%2TCn zcX9CK0>y+K0o-r}NDUm)RZGcO;Oi6?O}?TmxCV>Uh@t~}X!?fNlO{eiseV$IWv3{B9FU`Y%NPh+bw?DZ0qQYGzT)^zVUqAfI2_szAE)bBu6SPpb& ziWKH*aKDSWU!=w#k|WP#Od4<;nI9YONn?HAA*7?2uu8d?xR)rqhe!_Liq>M-Jc?^U zM~`%Kip%gtZh`7-s!Q@NY=T68vb1!4H8(+SMGmfQC5>=O;7dkLX@?tAN|ETZDRm}C zJ%?7YyWriFbC$B>aKO7IWzh`g?{N1CY;iPA|29C88RP%il!i3wS{{v6vehy8rEkt`cIRww9A+^H%=#yabwy zr;l6w7~NZA`_@KaX2$=A**ybQ>}$qOrYu@ZdXeH6!8ca2Lc>Ytip0P-0F6`rr^7cs z@g>XVfEdkGNF=A?Z== z&%O7o?)LHS@LCvK;LzPR%5L6W$-3lL{q``Qg8)@`hr^;!E^QyRrx)2C?=EN(Y%}S^ zyiL$wEnQqK#(=1Be7T>Z>~%aI?M3OE`VUAK{LD`EaMZuMb6|QZ3(vb2{+@81{8+5Q z@1!VkT01JR`#H{^wa@dXxRZB&Csls|RmmUXgE*LHV!k~p*|}Ov4qDP;@{b>NY53Ke z>WFo$9L?2OBKI8M)6NFJq$M4@Tobhw+WN&*US}A(428LO{-?fy>(|La%{l zgO<8HphcJLl>p;c<~3X62aMTOuEFV%YNK3@PyB%@9b4Of;izq6ytAX)9ZncD2W+^6 zi_V#4;&u!brq6|)oqPP+d~~SMOajb#*~DXT$ zGOS~bP+&RBD#S6cse!y#IrTn|Ixp)zwnLTGpP2l1Wi`(=r*Do=@{CMc4rGZ=WQV4+ zcy?Wa`^c&rbnxbe+B@x1N{3X7Z~a4^=AZ0FNrb19Mh%$_6b_FpJlpThvKk?IXxOn- zjj*2gL~I&GR2-_Vd3IiE1>$>)LcjRj`3kT=X~%AAt2=AumkT$b<7res9S|indt< z+D+>O6w|J`Z)|$#u+C)couRqysI5;F=y>t@dyDwREW(A&=rxChf;rfv@?H*)`q0i% zENMrbp~7&=$Tcqx!(+bha@?eUTikqO#M4c)RgACyqY35-AKJw6D;sEj0t~*KHm8R; zJn@(<23&>y*=6d`P((mtmjT=n&!bR$5USjJL#RNZ34-3>29B;$7~lFf&E) z{;|>mh5g;6tmm}X6CTwk-LzG+J4o`R`8=dU;!P(lw)W~-$_v$o1b;#H1`b(EVIRHF zo6fQT@S0*HfEp@X*SMq!ai)&Q(+&A46*KeO445T5mviQ1ZZ1>(P7pcIqoOld#$DYU z-y~AxsQ)SsEaFj5ulsQ!ly5$(P9*@63a*yp?%**G=CD6VkaLjyyWn=B&T_pv*leE1 zu|<^s#w_m#1ApyK>R96w7V(0c??v$YiYiIt@*dq7>U0D@dox_K*l=8Oe`+nFssOwz zGX~3x%Ns|*P8%7Az}W{Y=-2J-)d0=Cy7^9aDgVJgb|W3i@6J@N8;w(8gg1?TCM*Vp z8s*coGE5y{BKjM+34>UPxo}3g#%`$PJ-9Sk5ro>K)~~u#aVFm1EJIf>dpcD+EEFT0 zypR>iv`~D|AXj0lw&KH~Zrmz0^c0L`eXSEc@x69<-H_?S_$Y>(17$j&0uA?5G^h~B zJya`YV8I>86RiJUe|=mf!L}Wc|K|Qp<|y}R6^W6*^rJJDI#y%xy#3eiF;0eXCa4KK zVy1vk4_?|GRZdLq0~9ILYHg{~smWGE5J?>mO7@#j+bp{E_<>$=TPhk7n?kiiEQa?I zPVBVqe*DqE;`CVSXDi}QrFS*z@6&UPd!^lY5(1AslzZRfN(2q+sjKB~&q&13@NqmZ z<6#6Gf~q3ED&E!BLe?g#^S~EMCvF$kW^5E4eX9!}wKTd-BY6=m2^wq%y}Z#Ww=^^l z%77aYon4PuPp;GQCneR?yLqvn0vj2#!~5i$VOGn~zj~@II`y{uEvSQ9!Q0lUMrrC~S0n;RmO;L}dRc`-@c(sH8Gd zia}EO#s1pFqS8ipakw$i=SRDpq|Xnk>F(mDnt@Q&m)+i10+(*rC)Oq>R~Se@o{!68 z+>(e75qqYQJudA6Z`nwVO6OZpdkiOaG4i)Bd7InYJ}}=alxY5t_X$@T9lD_lSAET) z$b8S6vDFL`L2YKY^$v0YONGqz2zi@XcALA$+2GO?Yd$mLrMW9D+^3+QdB3*sJNVw| zUADOb7g8u*&QIJquuamKaL9k+Jx;*Puvuw28OX0FKaV5yDy+JqzFmC+fGA~rM2mJF zJ@>g}aT6*cN(HESs#4qw2G}~_HOp}f z*(dGG<}4&S%hi90jIbl&^vumucROc)JL?k1j<&q^H=e2RtJ?&e;t#rJgSWQI*wzKX zrOD!-?a~&Vg9vNU5gQk9#9ku;I8sGYN*N(wX_6jjw2UiM%Hn(%)R$0M|HUi9#90Ao zuO%SIhr8W*l(>IAX;bMK%KiML?R;Z*rVSMK7ns}WosE(%)t`QMK`BCBY^w=b0IV3r zr$jLm(^}=LYX?Fp|E2lD@4t>^2hRLy{Px}-ifG)(v`gNUDrVnJ`h=Oy-29zUAJ;oC zjI8!wadgGhdA*$s>gLn8_8!8NT&0x|yLVg6FnnRY16S=!lY*EDFGt#L2H6FM@s$=A z-cflnh45-?9m0&D4|y{2{g;M@fOv@_OV^Ljly?KR1A%h7GvW2u#d4bM@VV4=Q7o?WBb(L?UB_2<4Z8)&GH zn86A=tA65eZ>!~-QFRryb|l{$%j7!pOCedP=`QeYYdyN%SMUwQ$3w=U6htYIldX=W z_wZK>t#I^LPVIqE2d-$(T61#s6!Bv_C$L5GI()3Isn^+CgMRvfs3#K3Aj{RjK^q05 z9?P;xItX3zac3k`4Lh9YPtZ0Qse+W4ULt4{?^}Uy z+skVnAuW}^8*+P=xCT1j(NEp^WyF*x^ z6$_UPPtopFcKqMezces%R;UI zXPG6fxFyTZ9UL0LxuFfNFGmDVq*-@=Ex<|CCgq#SofgT*Y21A+8}KDPgwXG9i%q#UYOW-58Ow8@BMxYVSlMh@ zbVpl%lZP61WUIs;##ow2M}Ts*o>mjOE&Um+rfKZPO`S5cxae*IDJEmGoP~>>**E0y zQuz{y#&)Cqq&q%yv0_YAn=;i?CgwOm7~=N#v6wkJw<9*+t*2faxQ@*Mhl_BGIMKGc zIHHC>`tD+VuaM)`sZKQ-Om}!q0y&uTB(bc~pouhXH!RPRtt!93O`NLN6`0exQ=JEVDWb3oQl}iyLlm}PuB&DpK~R?!{O*}wWVL(amWnXR?BMidTij}uE4#wJ z>x4-K9WBC_UpNgzORyOP_l;$$Uh^jlikzx|Lyx>?A2-uL5-c=b5!6*$R~WQUX5}Qi zvK~XW*!zh3LB&2xj6m^M|*YO#YJ^3ID@V>SeSI`~vYf4~b42|lGN zTX6WbcL*S7=(Z?aGwMH^`wCp{x>2GOM59K-eYbGd;MMN~Qg^8p3{z~&^|Y{LQi*a~&PxKi``rAmd-!4KJA z-jH8zL@XO8NiGFCIG%XoI1)d_dfwCZvkKz8ArqaHoFdWMoZC3QxP7ZEwKcUr72;=QG{ zA`a)fk65|I;K;SVv|i4gq~wZpddp!UH-YzDYm9FEy>y$oix|gNIMA9vv7!3SnG34-gs7kogdhbQ3(S3ZLO)R zqO9LC`BgbhbffN(ZAWLB#II%_f>`Ge*tD--mK=Fc{+KBPMUA|x053?;s*BUr$wzh0 z&-OQC?KjsKbyr+@C6JcKHY)Y*IA_kkjN3x;2P6whnFflr6SIC5Gsxd5Utt>kEZ595 zM~H>nO~Umf$w&JR?06YF2*TrTnilwr^Q&{)LfJVFgG1i#8!G~{bs!B1iM@3Tuj*%4 z6W@Pim~$7T=XE8u;YqDAFI?eO^+AcAgPexVril25ZN#_y09o|pOeW>}>obP~>4p(J zMe1+MY!v-#9EHkKt~dxNq|z^_rVxRKB7kH@Sj-~<8!}s>=dCR{ZCKNJJ^7jFG%ti^3;RW`PNg@9Kg^&Sn_>X zLULfYT9;fkUzaQPlKbU*-*xq`(xffAE6y>y2z%AfvA3?y&rX5{*umwE5CC&*^YuQ9whrex+`y z&&?uRx7Bo%75eeZ0*sMCm5NHv`^5IJouQcU=>0q#+OzC-qu}G^B7=;M?y6LE2USFK z1+pbT7r8;i6j@&qc)4*@GifRD_lP6gY})h73v4>!=eifzPo>&?78*E|C9^3>{VCDmV2PY>zj6Z z7Q2{gl#zR;-Ad|wG)8;5`5@C7KT0U~qxQK4MH)KhQfp~mvLn@CrgrIQ5=N7w*jr1- z7TYoZ{9H{_H*istz2T-txMePdqHyuMMMHyz{rewF%O7Dp+=@+nqxKH_uZ1V7WbKt< z3r`!;;s(l--!xbSfn=PVyXShYdCdiOs7P*+>rZ`Y3mdKaVwYiIjRy1a^ny~n67+{v zSaE)Rcc;xtr04dMj1ZJrybo}Ot9K^8b7Tb8lT&rFn$SjiVhuGY^1lwOh*msK#EJ4k zhwUyhOD&tbhy)QlAdVQ*ih*fvvsQ->WN-WVz#O9~gCXxiKJ9;49_m8{Y);wrN7QqP z84txFO&nCQG~)qQcExUg0(26ux{S^g@A=?N-_IN(6(mQo4T^0e3dGX9^jd7+NS^QX z8uE^Q9@>Ue-Yi3QG=$L_xvnm?S8{h`#ct2nCKQ)^J}hxzl~LN9XGT%j zI~?Qb`+flJ2ckRJu?&Cr({A>U@R|PI-f!0wy`Y9csCG0zJr6Juv%**S3;%bD?|Cs? zY<&Y&#+;>WQh~Ip8aOI+A__(XJEYC+75PTM)M{l70TwCdIgXy70Wy|^(9qOWt%$?8 z#4x|1^9P2wd*=+y%^B|aN{ox@CmK|xKn@5SHjYnM8OMP7cC=%zNIS=5lI&+x6$c0G z5;up+5o3H!qF?9Op7U!jeO^9_%N`TtoB7k_I==6ZZBIF`l=L%RN=M@0O!5oYI$L_&Y_ z{gr-3LudcO^;4FYH&mNtX;L}|ek&R?Z@U+p>~s9W&e$>xB9pUx_3flB1xY2p=L6ib zKn2L923Kt>jAxJ^s4JcPfjLjwvhY}IuqJhzNUjvt6e8FOXjJHT<$)-mV6$d%g~BOZ zyx)qYRyv=WBVn;$_}bfIBs0m1RZ;0VrE0Q%qRXF!N*8VJ*9iq9 zY$B3{0>OvQ7gR+MNr;1g{c^rYb@bGzx*drs6A3fyie{r^nzH8ib6PZRH;+iYRa(O# z3#OXKwfq7~c$8j;=8{}P+aqfe#Ft%+xyLKoS-~~$noMkcKlRj=Nd(a+fEW2k4pZ!| z$wVb%5gR;-g~DpNwqUOi=AQC4x-3TdD$XUnl9|VoqD7;Su%&rbi;NAP0X{FTj3A6KCeUf#UINJXc2?zp{PC?SNwd+XKpw9>6cyq${RB zlm2b}D5HE7{@4I^w~{H|#gwUWdMx?Tmbd?i?ouCHk&${FVOv+3wdTA#=jFpUIY zO3__*4Z6zr;}dK#Aj|>hb}hwZOy~5o=5q^SN3Pw~oTF<=Vdq_J?u-Xe>cG3Md4^CG zsoMGzg=zDUw|6mI57uq#VaHj@P!yJJSl10D-|^0LN5X}aIQO^G-G(#krwC`XP~~>h z+#Z374?=VouD%D{ZrJgYueT6E!|7M|eaaJ_Sdly&u>vg-ztE1E(o6c+9v>VWh59)+ zD;n~cv9h+UeT?2BUDvj+c4=YQwR26F{T*U+_O`UgF~lbjypCWuEm%?$?0g91LTyjIQepyrTOk3e6_5J zJ?{$t#Vl!HyK7DRv}-~Jx)=MiOp=)>nLei$pCfJd5$sub!dOvB0`4=i0%;Orusra5 zjA7|hN7`t26@CA6TKSWs;@R}2w9L7*Q$){ao#Dl>ou)dCiW!^tw0D*%s+f(sx^?@e z=%Qn9kru6|n!)+)bT z8dLPsT|)tB%9eObsz5%86=h&2w+B$2 zu4NO>b~eXt)vEZG*R6%E<&eD3{%(7+M(JXMQl<&n(Dya}%{J}97F7$&fzM|6%SqR$w;xi>ifGQ1SD5pZFXQ&UvON znI+ij$5^SHHQ#)M)v6WhD+r7s+(>0?BjVwG%}MVqXcf>$&J&AQ_2)0Cg_oQAGdape z{T4+s4S4jPl87`Gqij6xDCZ1t$#^lsmKcbXmNAi_3AgJpmN#Oiky7xv>Ty@J$?3<# zX@+Y@Nd}-NUp4Ljx$g72(Pb(JH|>#6E(|u{RFvi zw~b^4E19EccDnMU(0J&;Qy+C>2_sD^BqeztS~mE&_9?Ch8e4vzP?khpm*Ln?3O@}iT$qKEk%(7WETD528+XtZP#8I=Fk<@R@1wcFz zPrGr)tZRqaRt}-ch*6jcy6k@!zwojXZb$d;>GKgFyQH zM`Jmg*I1Vj1^raeQKNFzs#BI-NGPvPI=iXS&sg{G5TJ@v59)l8^=Qmld4Cf6c(Sgn$$GMm%$K0WlX z({DEnQ^x)~4Y{|+v$*Kqn;Wesvp;O_pFen&{Qao6+O3cN_}lOiKM&RX*XtJ4FYw3X zcYok8uvOwccz=(3H~X}0alTyqhMm9P?Z~BnMZ{>+Cm9V!Xo>zmf&+5p@8)|SR~tL? zZ}Yuyr+Je1#`|1p>*ZI?XaePrxGYuWrGo0hx1XeDl2f$=+0`v_h3YO5&-i24_~Jai z#>I`i|AVegh&|hqh%jBNcMEK+SDb`gpij3v#r?FHD-+Eo=hmYXqt$59v9ZhzaO!T9 z2})BKMY^S9 zKxygj4o6zLK@pIWP-z&thwdDtd*~V%q-JQOo7wfZy=Uv}?mu&$bI*MDzW0si-uJul zUA@YHSS~}PWGUI??T?AQz`br$&l{sEqR!7Nuz6DL195+^{r}LD{sla0 zKrH{V9hw}%HS58juQhR+-{8lV(YSDDuDSo@t{Y1w6=xwYzhEZs)aGp6HQ!}%8fuG!8rVkwCO|C57NF>?KMLADLYGEvT#! z@g)=BG)!@LBN#NYmcy6irv0P3DsWukd?<*dzSMm-n3!onU@GRIp@lU$aFgzMc_VMP-9jz=lX-`Y^OQf5C4v=e^DGdd z?6t~ZHBb6NH|xv=7CZomcV)Ul&CqTC%g#68Y!p8#F7wEH7|{#H5zhcGKlO+0-8G$6 zs4J^lGUa#s3~dChQV;j#&L?+N7#!a3R-zIRPU*hCEUM}w2D}hpdklL4%5(i2yN+9Pw4@t(qOuIc_ zIwG_ascsTIF>{t-{51p)qg+@NU=Y+_a1cv_-2uhK_J+ATuS6kr_GBZBx}25!yUXoX z=DTK3>C-P1A|srlHiCFDkMFEzu*TBJq_ZUn|4NGg00u_>HsYaCyFTv-`17Hi24hX4 zuD%{56&-Xu`JoLechRKl;>}PCs%O z@^9JlpKxeB?$gX`x2GD zyh2RddTT&$^to9kTp?gR*$|K}=RUr=9Zh;6HBwNw99d;K~b-4 z)uNEI5Gh`fh?H-SVmXt7dbpEgfi=7z8VrtEZ;;vlNHo1;tY5KwITC5c@#pcl5bi>B zAN>hlY{KjuL---FQcf1rLKf58t_<<=gsv}?{ZdF%ZbHml>40&0C2~g~L_PJn~pnC(cRy6o3b;J?UISLZmw$%?Bf$mbv zyG4v>Dud1{ei#du&{#D*Ub&nH9=L@-`6!>JioFj_lG9EHBJlr1R{bLkg}RZFA#Z8toe%NEgkNHL zq`%W9TqD1x_MER5hIR3#(s+$^NX+igi}8=YaZlU9|6u=;{``9DOW#EqIxol ztj1g-u*JpY-Wr#$0#65-)$C@C3eRdbzD`qnK zam?h~5WjT3AR2^y>-A-G2s?(ZsxBZjfNPGx$8v@cBGN)JdNeJIXedla;(M(&f+=aVS&4tB=%Dl6 zeM3UdcY7#gA7TsL`&r2@EdgD8{GV~=e*!BVrTdY$^dl{ey?o?zSsjG(vebIJKyM4M zuwNI2smSk%LhL+hnIv(sxCuT*%VzKYB9Kov*{WwDc#7GHK96#~@QgB*PL0x~F2m?3 znh*}y0TXK7J`EZKrjI;+$KRdj7U);-a`_L$%E8$Ddt&{)U&qS-o>-%r5EVZ&`|9Q~ zesM`)bmdmopY)Rp5EVotx`$4A;dC_Fh!WS0F=xO=Gzyw{o{{{2GpY>8Z-W~-sKG}3 z&#f<2zkc=0I^h%p#5orqhjPlur(|`AgxY=$ZhSh~p{bwWdN9$em`=QIzECXwNFw=Q zti_rOM1l$%u6cG0?iXi&0gbGyaXVZ@7QuT+5c;_?k-0jyMYxYiIKbQv^_^%+rApTQ zdx2NtEAi}AHQJ95(+0yv+U&bZe_)YHv=1}9DKxD((h-I5Cb=^8)WvsjhjKvIRB9_uBg5(8_Lqe#BMISL!J@@Vs zo}aQ~fK*JA36#!j&e8%X=xOuGW6w=OsS6I{b%7kG)UWW*!6-NGr8kxwPn3zACqktu!N`O)I~li(>J*wEWa_< zgDaO*O%oBZPWvIpQiQmj-)O3mP!qjDul$)Bwk>+RT=^S^*C!E`?7We`GZOFOTG-49 z)sict^b!`V>TBgVmPgDW?I@Z7 zw3I$LyLJT*Ow0T{*i4-(Dp+`yna;{{;GF$j)K*)Y^?QAA{>6K+C4R!G&G5%d>zi&y zVsW#qSo=lujzuE9UHS{tEnYvRnJVRW7_-s1RSyG~L0Xw_=aMkn3~)Sdv4-sj4a1o% z!poDMXEyd0NfPPcGI-6!u=_62WMqGPr-7@bG;=M8?%#*tzlS%=2>f44Pt4u&&igB+ zi#)`zAPs!(baJ1|?;b^HRxjgt4pULYcz5GdHcRCaO4(ext{oo|y>?Y%78xaD%2mJP z&@FdF=4>YxK5>p2y0%2BhEK+S@IJA!O;*EaX*oWKLai!-d_mz|r^ch+PvU}=J$G?H zG2vdpK1cqlp;PPRcim0?YV6SjmC&Z=Cz2*2xztz5ePe7If!(6p>6|lyDNTL$LQDvI ziy&Rd_gOnzlZ0IA8K$EsAkOf$77KyuHlvPWC1)I%(~>IxbeWeBvG$#ti{QsCO;Tg0 zfRo6qbW%X3+E?7sg6EG<8)uL{GZp3$(MXSXy_dVE!D70yR=Ij-(2wB5;R?W>#h&{< z$*h)mSbF-=;y7rlm20^V;MAB}ZCBsA3fda}6c<1GF1G1X*Jw(_ zxtX||=*^2Uz8L~;pBD(8g`8(#0oyY!5orm1CV1E+??W4WFIolJ{;gI11;l~bWB2%= zbmlimwtMIk4+T z685vrs3)UnkIf~hBwb$L=SFV+z!7R(GbT*h{p6o!{H|U}P9qj?tXDK~z`YDjkIt1( zT09%th6dfG@AD|wvGHr4q0X4>0XVH?+?3CpfJlMS*Nuqe3iyiMW7%b=v%ouY)Uo>C znt)XhMevISeJ3v$U;Wj49hrMwJohk6m|l_Gd5e-sdF>qNIf}aJzeV^QTprBz{zokL zufbU+>Q}=LD5<&0k$<_Xx$Z>J31h{D5O7LyB6Bj($!?r&%RS7J6a= zOSB-f^ev0F6}tjIa^T{n<#(s;w+-$sr<%Jn(;3?z7WU}#xr!CJ@Lx~f^D^9Tx$rCs zv!|$YYtG_ZBrI0NKiP?mHfL5I=Ud~ia0zeYvGRg(t{uniVGCiC?5)m6 zDvE>Nrq-VLgO7bNSW+iKoNS|8?2T1m06^9$-6>Y;2Uk2cS?>H(axck`XB7T?xB86- zFAFzuW~qvtHXi_1M}N*wrx~em;ntQ*Aq5-ls+!2NUp?OR#y4S#^SEz&Aam51XmzE< z@qJHAUFG)=+P_;Kv#*+?sN8>8zMMBq(Fuany`@B@ zdfoQ>Y*UZD*+cx6{t7SoBX|Ca)41udleG1EGsb;^Dm9ML^6$4SRKmk63tt>zlNqCHB#w4y$82l_xoysP+C|*3=$bdb&wgo{r`{d1h~Ycg@_CoaQ}{up zjY7{m+%qs(jJ1Y&hZcO%K-zu6*}D4q;$EL;R>nZUun3w-KVJni(!kIV2%+$_*=)KALhM_&ks2Aa1sygOMH9NWZpLR&7ma(t`VjI*!0iRF*D zo|QHz4>Uk%zVp%P{fyqi6ny(<5@SH|{M*LhB}ur$Q$zkxwAFAheXP zQ=p%9uci%cA)4_Dqui1WPJz|PGFkdi&TC{m|%<@f$szw_=gQ7p1) zl9fW^{$&&?BrRj=3@QAHau0p2f(>GFUBMkxbps5zjM|V)OZRq0U8czgu1V6a7M@%_ zS`dzWg33RTTxp#@(U?2R6ldQ2oWM$9F?4sizI=Blk_Fp+E_pqW)Z51rd?P!D`gBx* zis}sPhb&!;Fa!~UAU=U9tih=DuMqB>^KZmAU`YzBtU)$=eOd+_wH3m>Umd?i?0ppi z1-sSrq=L4+xLDO1mtooymaCL%^%_j|P{B3U<%4of#X+-qlodoTMJyn_aM@$mO#HVk z5g3$p?-#=U%*ghFN_Jg5GiGbeJW2&E*TyLJ;TG%){Zm1H?SPP&~eX|<$Fh}UGEICR?R{ICPMq!;vu&-x5a%b z6Csq}O3i}|vp5wyBm6y$SEqOd?rlDpn7Y<2Ii4b?kiBD4{<)*qO@NW1ju1IzKnt*0 z4S)IV^;gqnqdop<&c&KVKXH3w$-Vf^w1-#C%!oN=-12zAXjQfl^Lz%c?r2%GeZx71|R8`_e>>`4&H$5 z(=mD36H@B?XKKO#vXj^Ce)+UX2aZOGQ?M^rlG19lNWZjHwM7ZYPbX*GajmyRbCSHL z&o52IWz@1?nWMU=zOMTn5&=RnKirb2s@eNyUU8<$1M#+yG}k7-7pU;kG(Ng?dOU!4?e$JoRR;75JHzAaMJ8wbx9@Rz_AbD1c~xQQ_&_f7&sr5{!Kz?ov&{` zJGgLfLC>P5ak)05i@PPp35+-c#$`A(#s2p1c`lF|KzKc62;pZR4wCx#`wB}7dsK&R zclyS-vN8gKTrc7K8Pj_Qw14Q#?Dp2k{v3C6R2Wt5?W4u1m~pPGgNvZt;DwVm-SenT zR(|Z=%w*r+Kc%zd7g6#Irqa&5;%T}_BeaqiYa+VPK@`RM|549ei zx=;Jc6fS3413LS-9nWI#|JL<&6!9N*{Om^lWqndI7zP zZLhzEZ)SU1*QTiq$=+G15CJZX?KjI!*N`UT`)77?MtHgcB06jZl}&h}e7o6{l$~^< zQbM784kw@}i>2xZL$qaV`vHnWX^*?o7)0eneEis|) z%mubhKF$Fp*IJz3^I`}%OS3m2hT2nf;jz`OZ!{oN=^jsWl{mFbi|OV&kG*%KTxULk zJ|78LWrNdMC2Q8Pd+XO2yNKMG`Yu@k*-4Z;$VO3S0gRsxKLuX}`H>D8%p>o;*}Crd zYF*U6WlNx8NVrkB2963}rD*Q|9f#hwKs|U{--$SNM+SG-j#Ql!eTPTY%p-3%(T5rBH$LQuup>>!G@VSecb12KGO$v|Od4&+ z5ZM&P?*LC!1?pX8;I1=zClf9Z?QJNR`-{cg{4c63__W=u?Mu+0Q_)@9=;h zV1Kul+=}6m4bV}`*UT(L89}Gyzk0+Lqx+Mr z?CB^pP}CfFmIhE#9@J{lB7E}Rk$4aPp_LuXBdpD7IQki6ueyl{W_K2? zTA`a*C4dF5#c)1sJ=G<%5xp?NgcIB$kYxp4jfn7vu%*g{X9LL^N9531zUR3lnoGxd zIrs7TZtfk|yw1FQgC9yk%xje4y=NDCrYTHUH1RMH(z9%vV@%d$b!8|=jKeHZTzEtP zfoZO3-|24LZa+Kc*ES@ZiFFCUdG~puJN+`_ZWlKWUV}l3n`f``c#`ap0?W-;iZ2yi z&-=_KcpsrY6SK)nyE0f)atY>wV%@4WMCByZtv3u}eQ!3&Cbw#poDGMBqzstw!!26A zA=$rnq-_5Fp~mNktvU`LF%XE82XpE=6xOD|RCE1`bjM}p&5tk89;V7t{)F4d)HV*h z4`K)WVf!A|&L(A#gG}7nce)|SZ_fB$It{ji&4&%-3qm(n(|cS*4h?$U%y_#=J~1(L-|AZXUZ2jmtXWUd{Gjh)8p|ZkY=b;=S~JT0Bscw( zprts?x8+&@>s=;j$W2``_R>N~Ic6qiaOJw?Lv>;Rxe2n)l=I_W@0S~!0n+He_|5CI zhT^_;JJ=;Bl)=ctjm6$4W^iY&(T&@ncXge5Pq3PzwM*KWIk|* zKmPNQ=|nGd^6Dn=a--o{ryP)~d{{yv?)x5`%jy#v*kU13>B zO9)36?j}xi95~+$;8mWyqLp)+MVjnp?gB~|1Dc+jPV(qdg|}Z-ShN<1imZQCG3j<7 z^E%`o=&XpELZh9OSd|bcif~Pfepp|OxmyIpxa9nnmZ|hWj0ILeadAr)#7&aFL2Q0FJhIUN;uh4bx4XIdsXF2=&jQkyC!C34G+9aXN&}${Re1lNY0B+=hUK>cvaRf z8ZDZqH1`OK%M5LHKrWSq)`_zl+3;`F5u6z{bZ5g1AcJ8qF}1ZHr(Ww7I=^L87b~m=wdp>$k;q_Qx9bY&`9xxq!^^pYtWs!zZ zn7<&%Kjk7pr`MvG55_OEiFN z=|NJb58(@_&~~kM&Bkk}P;Awwnd8qJPs7hS-FkD)0-yu!(2k|>f-*r)1BwqaB=&jO~2zPC^p##Fzjk9+!FwB zmGeH6-fOQ?G%2N>&=Nq*TRr{K8cVw7y3f0|`+!zWm1h9y_NKn|>iJ;W!HctnlS?|M z4pB*ruNVrQLJr>!D#PfDHPSD=mpeVYJHb~DlL1PQD<;lsac+uxzkp%aoZ`Q!Q zykF*Ns5x^~8wUHf>=_Q!M}-WIKGOD_@qIt0wqUTke8^&FGi_m2XJKT3o546SyX!mj zet(B>QOrN8N|oCyb@8oU$35T%ms15FS&LS~ytn3P!#tVmr*KH0Zw#U;V?|97#MIk! zyI6GX3a-r?QocmUrgoVYv}V`)QnWyh;i;d!%>b=!!!8dZTtY8f@;s8?85^Yt9LFu` z^&64S2iQyxOSe||l&x7R#M*nrwGWO96!9;u7P=oZhRiq1B0Jn2hYq}*j^9bn`|qo7 zkq0X_=o1o2AhyV9MLPypP@D#Aj3AiwwjL8DhF^$a?0D z9TIfX{0MNaT;|u_vSB+$vfE|fGl`Wjm})SJ-xfsS4KI1IGTcEhlkTSI=49^t$?e!$ z)9ga6d>XxoiNE@=roq&JP zrXqxQOol!tmMo%dls_rd(Lwbkiul{kWScJ^NujmPh{bnnO6Skwu(f#t;wGP~Rh(|h z1W@Rl%}b@6e{astzj{==hbD`HQYJ(Sq~RuXr79(=X*8ti-H8_q_F&FEe_JdAYu7dv zy+f>_o7d;?Rg+Cx%Mz;DH4gpY9-S_jQ+6pnawv!^CGPP!SqJHN%SArp`c;e_)TejN z=EyX%-75IViexvhRy*1Q_Ih5EcgB{vCw~=|8(s12&C`)->Cq|hS5DC!)UV|UOw~7G zzMubc-R*)etUmka{1E7j;e-dz7ha=`*S z0y_hDL7oJ$l$v=gtT9}@=5+i8EJuq983%EifS)tZI8fdo_>ma+NyzdKawY|0jzhZ# zLO+>@e{Mg3Lqb`NBipeqoH5;U`}}rERy;1o&Z*9>iA|ZF12r^DvCHH8Nb6WfvvD*H z9V6vr&hVVjx7wSPz=U;d-nXPC&Nkk@UjusVw-v=jG7nSO`c_XL4tc?kyPOK$L_4k; zOz-_1A%sVuqJm~{Z*ooF&FuM=SJzB#ofvkn&vtoI8q;9z#mPNr`?=mq7SdO^_v7A> z1rP{arZbgt8Om=dGbcLZ7CkBuxp?@X?c|_Jp04%11kLyJM4(#Ll7m>-JyGvIp@nmE zEYB6@n`?5^9`X#TPigo-kB&7WiAPFI{wJS0la#_S zR__>!|=sL~bE};j>&%NmN$y`lV zSU1t)^?iDCLREdl!^rzcWa&|m{H8^xb)uLYK6ZuyMX&AFtThT_7`@MBNCo_Qf?y(- zwPGfsPW^FAd-bOz^=g;erPJ8XyNG4npTIG(+c{U*QDb$FMgeDxptOFu3XP+*UKZ2S zt%oz%vX^%6Pqi+>6<}uUiIufCfg5pO61&yJw%JMZ&m!KYd}Kar7k#vut9+eS%{f9x z3z)0}4jYs94a+$gWt%c&pXYz*VmD{cSFw0w)@uV(;}xBCGBWAMtIIyJ_w#<3e~&F_ z`%L0QE!f;VCO~mM=fxy>LfTUfTp_lgPD4ToYP15geeN)pBjA^R;T>lU%ndW_#mR`$YJ?| zGWV&hyswc+?+(=jZev%G_(!AgRX;kplBV#)+OAYfM>gN*A}>Z{IfO)1WvxQv=`;!o> zIG2NB(QjV|&D|Q)Y`Nc>+IzUvUN;GE?=VK?E&k-U_7(f8tz-cI_W;q2!lMZr!j*qL}>)K8m74mh1q<&Y%jsv(J3puy$s z;1k9jy3Mw-Zd`)QEQ;aQ0HQ}NP84p?2q~6n@ zKR%`V%4&}uTg4V!@uciotntGg;f5^QL&X#7hf$NrAx8V>-mf1@uZ#G9bF2pwZ@0c@ znPD_3k3ssYGN_3x0*|@z4W>Zpg35(Uk4h=)p$_tETzIQ@Tlz)PpYcMe2! zmmjNZ=Mdz|u*DoI^uq_`>|n)w@X-rDYQYz%?NBM$icfF7+*7bLY?ZG z{hg^>n4{8oX_2mWX&_WR{R^M|-hPfSV_lAx3S5lzRM+Hi+Z6mb^|saoDh{{Mju5gn zB(^zN8or&nh`%oOSDcOPm!Xa1Cpi=!uJybXv-MT*43`rII%VtmA%iR1BC3Z0p^4zB7CpUo5q)(R*oyZ9!MJ!D(a(i^EJOfC~j zaaGK|>YU>M>9R5F5vUMIK|MLtrC5< zG~-ftCpxos&J=m(jS0FKOB=uI4zmC>d2h(g$?DQTiUHtM*RTVP>(hs7Ogk&7@h;p=sNNW@nD&a!OK{IFKTusHde|)YJ)P$}h*HI~ z%){`Ti(7Xxqt#;K7)gD!YQ`$2W?J4S6<%X0d>3dsq9fhq>M@+$g-#q01hXY-n;_ki z-m|Ec2}4cdyR(&~SI7wwyFqN=NJr_&m;2L9Rf0>w7#Mkmk&@>>VCq{`e$|-5lbBdN zUJfM!kkb9$r<{^uG^QeSa>o3YPZ;xMMn$Ex*cq!cKLs;VhLu$8E2|9MH)FVGVwSKu zlJDoFZSi)lg_3i)IBobI#B5uJ&Dm!GiXebV89B$kHQ+tUb^X zxUWR$Qs6BuyGiJvb(|INTqKPpsSry8f#rxZYpIL$oyZ|I<7%A?Elr#&z#inYr>)K} zBy(F&mRn;jVn>q|X!KdG!GTuXuX249aJ&f852u&^Uh`obk95DvM(yKvf&BNPWcMNN z!}=uXt2%ONC+(bRapo7X4>+`;Mo~-{<~anOUDu1FUAHdX}I-~f!YwGB8MRG+M$Qa zPZ#u{qT*JbG_UXdViz`<-f2!(G?HHU z$fU6wr5jMGfm_tsAd6Qae`l7}YEg4(9(NmN_JmvGDWT%W1w%8=jXKYPN}kz5zLE6N zvg~|X(GqC^>79kQT;HHPc}2n!P~V>7538fJ^W%?Wf5+Ha1;qg*VK^KXJOmFGG&sQ> z65M@(1r~QbJS+~uVS&XxxIsi&^z1_WaP1RJ*|I#z{_k7)*T$Ed` z9W(+pSCpk}gPh%+VDmC~lvEMo#(!M&#vxjI>A_uvnw@Om!$*%Rz(>;LsU^07#(H8Z zHGl1|r$FnC%&wPX;RD$spT`31hT-vw1WA4*XJXc5;6U8atjH=xdZ5o7{R64P@YGkT z&?vqF)y>H$u0)OW-;pBjK#4nv62VQ;f=U2@JY7l(jSm40Zd`Rpve6dz`gsAgq!#8BltC@J8 zNOP@>_m%(5;Icu2`d*{xenvx+cCMULB=3nGN-%Thb(}?{`_hficKy*Y;^mXve1Ks7 z*|@9|8U5w7cMM+<8K0t@l}2fP2S@j;5^8$LA(t_rGQnJ+!1D$Q4IthLLYXHma7IxRPjl?ow+RU z60Yd<31i0tKmh?)T?W^=lMjb}H84Tu)@v5dZCT5srYCY+uA>*?f5FR>e__|~`cKCQ z4-v;6^*d3;-oD;H{!GitQ(w#oND}#N-y1r#**+wuI22i`FuCKw;M-(^d(BRp^Y?iw zn%3XdR4A4d#B<$zA(Z6kS)cy$`XU4=v-k_oelYrN8m=jZK$@os1dhKq(meKNxb1Ua z#k+Aj(Y4K)cSdA6dKAD);=7!9@6dPF#3o=|@lHQ%XKXJgykr30nv!$ztnm78hT_N& zEKOnh=yygv%)7>>e$bV73-EL_12+H=qiP}(e8+*Og`2hR9CPql1Lo{&B=m=G|2KL) zG3*Dyd_l}V8jvWT4A8WOf}ll0uaRVBmq?IY&+TK{qV8}}Rh zxoW+axi1dVYgD{*3Jq#gGU4I!hju#Vq z_u~AWQy2EK`JR7;FHo!wT1gDFbKl^du^dAmFEAVqGH5`sh>R=YqB++EANBh!}GhgGjh`0*) z+0Veih+9GKmu^B3`m(Hm6%xnvprWGwjV*z|N-$_X$Gq1rGp!a~=E>^CjsD8W0vV-Z zR|Y1&JEHz+TCRl8n+_1-NIx9xga9T~zAksE)F)tH&;d(=-!dljmCMr~>HcOn1L)9e zJzKqWFz$B@puN=@jkcgWahZDpmCng>%Ng5CPkm)y3L97%(0(SQVben)wFErzUs8VoQe3@I3JNt+(dAmCsCx^ksD46Q8Jud%2? zqyCP@x$qdj=6Y9=sVCxkrxe@-r3Rt<5?^nFXQ2@I#wydxDBB4<`*BQx?u8#89Un)BW{fsL4$GJu7AEm$m+* zsnYW9J2uPIKM1>2H^xX_orF~;&e$2_D;0uwJZxOKkiTbAP6E~oZ}Tg!m!aSE1-XC4 zUE3g_>N3G`DV|0({Eerat;?%KgRKL8n?8vBaE7(5I#5Va0Sm}Z77m!aE*mej00MY~ zB{f4PNZG&vzOQAK3KO-J8YyE#Xnz;WKaPEOsGcs;QQ>e?SZ6n9vk1ieYFPwnr^73V zYftn)@E$C$Os4Z_|4HVM0!Wlw1yydj1(bRjx3a4P8!m&`3TqcfKSX_xoH?0Qr_V4! zAZ)m?gez{8d_QRG?7TRy(EX#vx{cLEwEtgI0~wker6$@4RXZn@DZL)jU3e2!FVk~9 zk!V%4_~BrgLW(x51Mar4Rdkv+^lzgG={3l9APi9`K_PCrZ_?l92L->rMCU&&5IN+1 zCr|r@#x1{&RD6a!?zB#Z`R%tGnNjZMJxUkBx47HwZ+@-zxf>cNx#!L&f}D<-VndYG zmtDW$ANpxFa}d}GI}w*+y=Np40rMm>Hk!Wiw{YW)z4sES0}5z0^R2(?rh|V@oRhES zo}Uxc3BX$>v(@IOFs%tUNR>YFYqkdrb>N5aICX5#PV>Yz_p=Jc5mWOzKi$@dEhSwi z)3QiFv#cBcQY0ox931ez33vA_cq>U13PTp-2X4|ujF$0RxJ6}q-3gdRu9J_Q<5=LL zx~6Z4mcgM_%)zMs#7r2sOo%H0?2pg(Mna9#mkn~3MqKXQre6QG;Bz7Aj1(@kiPG;S zsPhoK;JxIttOx%B`wfx;h&7$HsPeOezSm`|f zL0jmEp!99x?^99@+QwwQCCt2xpr|M2#>`F1+qn*`4{6Blcc6-A7UYn3Hyl?l*f;H7gVdqS7-3{}q9O}db{sAPv)5FA{pGnUfSmSApQJmcU4 zl!dGsA+EGKMg;NND1_|}h=k zGtS?z{Ty_xKl&<$PydK{PydI|0Da4c37ggCU;s|uar(3=2Su>eD8Lw%LR6rJ1DcjN6eJGw5di!K#rHst^UyE9qD zmCtEMiXI?4WnH|cex}LjF{NTLoSk2@-4V0z*h_JNQqy8TYwDLO48}B$tUovEzy7>6 zFq~+A?BvJSPK6F0Ki`o2=(u5jX}n#HOI~`=f3)qDWk~p8B2m(;r=8Ak2_ZJT?3}6W zV84__>)CEYm9HON@F8%H=|HKr62#Ik6EnePj}Joa&nGf?=i&*Mdq28IL8JYY6*xFA z@ne?Yy^NvP-BF;p;R+x@&c0ukpc=Co1*e>plxz6*2|jI_1}AUSBw?%znb^P*Deta9@uF}^rZfpX*gW!I;;~@oAXO@&S)^%7x-0g z7!0}|9($ZF^(?%k;VQz@9X&Rr=1Ee8S9ixRETrbO`e>DMxar2~yu0Yyt!}eBoZ}OD z?3MKx9V;0d`)5B&GkVi)cLQ^l{PDl5wsD~o?SX)*vn7(GJ8p(aR9 zRqck3G3Is-S;!yS${(}=&nV9}&!7Dcovm7y5zpwj4q2J_Kbx8Y{6%;~c-ojWvAFlC zizb(pU9J8-ZmCUcu4eUTwKZ>Nl1(J?&rqP919#lLl zoGjs2@+qgn14G>zkiP0~VxP3suBa|t_y1BM4(Bmg(~^h#m;teCL*Ubi&T}k}SH$Cf zzN?xUg^B9S-G4|b1QI~&kHlT8X}Iz2pSsjM?A!T46R#*Kf3>WizCPFI)kqg{{(i2i zexlfJD&likF+7)<*^cX(tn2PM+~{mQ_PcI?g(5p-m5;M()eDE?eYU_~TGb%x2V35y zBZ7j^5{&-#=#lPe6R$%#xEY<)U7)f0B)>RH|9RABE4iJ%#vQt02n&T5v>z0sqCEnB z#p`ogA#Jq7EigMlPDMKlQ21(Ol2@xeDDb?apE5(W+~^s_nz zXq4*NY)|@E8N%BAC9*0>Q*st)e&zhEqp}6FU+)Pl@x>kt5vg9o=?AFf19$mXkyQ<@_w|tE92NIQU-;3t+0}krqE$mD2 zW)YFac7LG2E)|BweCs>^$nnc*PXi{$skv{i_vtk=SY@Ub8&n2qrsU(}-3q7QWK5q- z#T6aT|BzmhkpEiY-dF2Ho&VU0krq*-xw-QIEs3Frifp=Elev9ncj;Zvx=~bRG^!Tt z6+vB_&IEsw%Qwos+wP?kzwxeO!d|{qrqx)RJH^t}go_V%Kbn8#h2B$`zci=kuCG*8 z%5J1@9hW&%GNOsofE2a2Q$&w!gu7C3#@%B5vpCzh{G^3*j_#pFRHGlHz-^W=R`gI% z#drh!y*Eh6@gprZgH=`}n-HdBFNB}k9^0RFBf=vj!h^wWsk5a3A#-$S=pZw9*uEP> zF;STTflsI{$?J}p?dA7iNo%Q*%(=Ew%4hyaNzDvOyIId+N~#>fSP-k}ORwgYFl0mv zKiXZ*9Ir*1Fq8s4o1|3-LlPer^M2CLiR= zbJ$9ks{6?+#QmgYqe0^NPa`8FUdcb~u?U@9J zm3SjTImVu%NJ7KvD>Wl-3I^TTUd{t#($6SGT9hJsMTH}y8@?ddsQh`(ElQ0OG9uCq zS*L9K5Nk80#0lg%5S$ex?qGmi3M`yP+sb&m78qi98Jn|QSd7Z#_zGY@h{gGAC~Zz5zJ8{YJ_({tEt&K4YP-&1~YO+nlt5d z*5|sJLHM)DuJM^H+l`_=Zl?*DEnJpOO_EOjLr%^ouUDbVX|N>&8UcyFFJ9!GXbi+M zw{`fjxmL{D(>8_8Ea2Uo%Wuyrrx-NPN&R4I*=UP8tt~&EiWB5|`B(ynW*r)#U098t z*t(FP8e9>1oPqL$$I>0abPVKM6nPd3Eum}NW5L9V{D((2bH9?}UI07yk8(7_{orgX z&@vE+q>=7lqSnJ>fOjVWj8XTd=>1PifIH9c%+OMvE=4a?o4j^M zB{|(DJN_uO6>*YFZciy8wkEMte22hg?CcyQt?8+=iUQ%@N4o+4a7qNi?g?G~4HJXx z4^+tC{!Ua--&IbQgiUH(WB zOPO9fgl4}*U%-CGt_AYMV~JnYp@H59c8T-&Yej?Rg2#yWiYRvs6d+_pW7ShhxI$1j z3Ck!3*b3>?S_oBH^;I3NOt%^(aVsV}LtqD)1)O%YDRZ58$t_ z%QMKvRd-csB8@~G=l6bnCV41SxDe7S?($btqNEi|genz2=+~@kME#m<)nXCxAo>zq zL`3}Ft3y>H3S5uUR<`UE4M*of=uG@wH!EQChxk7|m&f3XzqKpc{vL&#CrzmontBM$ zqH!^x+6R~t<)_v|N;p>DWODo@*9qpNdQe++B1FrNkx9eW@ZH))n?3}wkh$ZqpyJQ7s;kZfLDLA{yDLjihaB?pgDfx| z&=>6&)LB7-a)0pF#3ICPVlmS|ZFemJ7Nl2F5zA&?^Owv|?_C|NqGCrEYL{GVTk>vI z1d4p9+gW%1eoTIJE{1*ojn3w8w;TzKdmFl6+O-BwkZbaJF|3Ul<2*U;_G1rLP_hP9 zUxGLHyJ)(OvYFFYDHi|m8b;gPSbCy#!v*;3QuL1d`%_y)Z!E^_u74UZB(y}OnFk|z zk8~4?><&OyQoz<4jmAgWS}LqC13Dg0@{SS)^Pac9DqA(qH_dW7vjX!~@k=TtOl>VX zILV&BR(>3pjeKcSSrj9(zyHqss&h#5n%DLkphM^>j@EZ=Xd7VURm|oC@#=}&6H@i& zWUVi5cRnU;w4fFp9bOAkn;R3i3@SNgf)1=IMBq=bD2b|RAVLH&as*^^uE%~c)jN(2 zZx(i43cYfUiRA*u#JZSX|H;^U2f@KB|3;SMAdzpvOy8ijD#tKBox8JqKbcsoS*)+q zP4ix@d!=l0`Jd?7{}I@W|07?irfp+&{D;9nZBs%1>OO>o5lQz6*9JiIP9{)Gp9vi| zvZE-EA3{+gZJ5u`Oskm(P{4mi5)b735?r(1D|bea)$&obeMKcAd*0=}h^^MCXy58Q z&uX?nop}v`ta7l;!6~D8VS>Q^z#ftCg?A{#*9hr;L=U$5^rmG*e7F@?in(t;v^tyRNp*Tx&+wkT2=hDYbKA@&NXTv z>gDzMq=rmyALXcfvRV5ihBXf0Qo+}$tuM*C6QFN^BfH%b~>F%f4O+M8wbFur^F4AEG z|D&nNYxisB1wyu0^_1_{%!Tx5R(e!QgioEM*U{OP#;p<=5>G*7OanGt0 z;5G=&aNG&SM%9qZUkmQzn4%iyIuV(*sYoZ=XTKDcbi{>dqW%`siF_Ci4wqE!iaOFiUhl z!sH#jePpXPG8BIh91T`9Y3`YG325B6TCdLgc(N1%hXt%H_VfhKhKbVl&(`UEy0)6# zKasIF-?u}hV0DkfiVK5F#DMerWstWMh2Ma$37OR|AZ>vh6v1yLMYkQhS5~bEwCA z7KhzP#oE4jcrAiOqI#OWIe0~`(1h7rvq>Xe>MF-)Oq7G4JMd!cTua3#$1gQr#+Y~M z<|;d_lf`oT zho2F)1IzAh<1DY-ivQ^Xg$ej<1j&g9qIZVjZP4BQB}Z_@9N3glrPoPx?!NG0T*fZ@ zR`bXxLj2ClxZ`7{;l*Gct{r4Lvsque+l!z}*v4KXRy%4)`!9~e9@GW)+I{VJ zX^vOP2N<1QJ$v>&pv|qJQpYLP-Db_;<|^c&4_$e@c~7I5KTw+T=l$p=RT|M?K;i`7 zeY)#`8@mQO@@u?gWXe}vp|k6RE*}UPu(5h*O?H2 zONKw(ai)KZN@n*-Vu<3eTI9V)tQ@@e#au_7K{JZ!JDWY+=TE}+L@vd%?Si-UtQ((*J~)4Qf91EOV?bx>KXQ(KWdrYv7XX+DLP4qHS8x z(!K%GGXDc{pX0dQ=f6Y%+bbi&Tq@my_EXAqOmb`MyIq%_B`{~tnh%y?w zYxB^&qmfmBsiS3}Gfi}M9yEvpLQc)`WxWzBK|9mFf`r+S{b2z6=dd~*K@!N)L7NV$ zaa2=U>l0F$YJ2$xe$)P_s!h!~`9(@3ch_j<;yn~A{?Sy~_z$8aDSzMLU$H8<*H`)( zZLd~`n)M9r%C7yxb1(P_N58n1w@RmfoDE0TC7a9jr$LSSG&lR=MOtJE@q$B1$#~v& zgoA4P?ncfYrK}YZXXb$H6eA3XllN4nZS1gx>aa$(XgH5QM)2Sste=Q$i>He>XSqO} z6u`?b)f!T@n~2@`WIA$9+<{eYzL(!CX=>e8id@={~`b>)~BNXjYn_(Ri zL|qkPXKa^N1!th>NrrDR;JyQ%U@w)iVG@z$-1Lx=>1`{ct!=JhoEwkq<`KOU| zAx>6?-F3h9_&*G?2={{wg`qj@mDO`U43^JX|ET9T@?0px zT%3qsj7f9dskzOQM*+Tu14OxP$4b$1c7$z4W)0VUkStRt5}hJ7;oYqMrt}IXszjR> zJx;TxS)H zF=AMiAz6Kc&w6qH4He%Ci*%ZP(L=8DHJt0c)cG96CyAo=3=iYpSxQy|+7GFu4RrUp zZ{!v!cwD|ug=JSNE^i}up!EZa#@@F58cHpVx+TInzd%ppK`bl~!iNYSYl0`=V|!uS zvbI)c%Vt%uxciFLW^5ySm0XQSE5DzTRd$h891@G7Wt$t4K03FZKRk58Klp1H%arrR?oQfSEF%^3d0I( z&8j@;tFx1y4Jv0d7)WpH;d)Xj^<7EVBm5_RX8pc{BLE{c5rwglw#F@u*R*l;j229t zyX{xIG}ZCz*5ORRFfEVnJ@ZcnQ!9U}`v--^lfllISDICQs0uFAShDyW?s1Q+P^6{? z21nSYA;Yu(naBqcP;{pa$oT01l47)fuluR%I(5B1Tg!`n^kF`X10q>XjPE!OJs^F4 zwdw_EPEGmlMmvP;QE2h*waVNA$!T-}LgacL4i&c7i!apwxSUAC^jup1!vxuRF7XGS zT}^6Ho8c3BnDL?_p6Z#`33+7<$`zD;Z0ilmcvuSQ*ggM>S`lUf@8|6kTrppW`bCL< zReQE#wrhF9XE1=;ri#4lSYBCp7UaoF2kFO0;13x~qIi9pF5*#-mc7auI|yF9TatVf z!YK`3#6M{%QIg2N74!IfK_lpBrx{zmtr5afuhwRBH2IE#a%2w4IsAe2w5Bf9n3{*G zfDfXO{~(vwDh||U)XK;Bj3GMl`NEf^lnYmON9l)D>Rq*^la#4APy^Yw~l8@;gL5}lP8z#^&1JiMZsVv6iP|Cy+6JtNM`vB&ylk! za+ovYTog|_mk$ng&hXi}(9xU1K9=zt)8iV*pUGmaWe@}bwXd2V8S&w|NeS9HBraEH zHond7C4dj^e@hYX57h`=i)$d&#qqM|U3>hYUYi|W3n+yg@weXv`Qqu^<8H4krn?eS zlF(M%7no1K%(wBRIw8Di^<5|~`P#dABt^LgBLZb_b6? zaEW0p^SfWfNA&a6@4NZ~u|gN8UqdYQps^Gtd{nac&7ujCe3DLFg^-wNPJAzPSI#_c z1ir;W0(W+f6prPpM|l;DuR%aHIw?8VvNxCZOY$uFILbwJ_j|VXptYvbaYpN)^O`)l z%wECaZLx8K2ksEoOsFLvdmL_}I9XZa5 znG2|%IDTyTT>g~RD~({GCX`8zOC(K-i%yui=+fHOsmVZL{iCeenH7GDV~Vl6=i4Wj zEaucusJ`>a`juCpt7E^n;cC9{uVcj7(|1R{G$xv*Q8g&Q!UC4g_r16HLl3SM-Eo+J zMO-m<%rbm|d!rvp?9WO;P!n;r`_n0J;fEc1vb_VH!PUsRwGC*~<<+M=jfK4fCR12u~;U~y@M{d>gPbgwa)leE%|^+nQXtEFS1#U4tN*es&OoOg@W-~p%l8jNn*%X z7zb)gq{A)ba;6endt}s*CAkZZsKEQD$_nz$O|8c2n1S{HK_r1KvcZ|LhMB2Zzwe!_ z_iPly3y;)lIg)a}CVqr3pt(}i2z{tI84lGY8_L?$tp0UNcTo_xNIoW4PkRb)#OkoB2NJ#YEaDiCcI z@~{Z*6j(vVD+=G5qLsMCX}%H_*lJ092J|fN-oiGLS&XE708)LQ6&trkwrXbSc$Q~i zZ(1THorde0Ou94%Vuz1!bOzWBt(uzF-G9cDr!F86ue422tpry$gsjj|K~$0fAHc~a z%ts5l9cGU)*ZFhk3X|+9XJi*A-Lgx5z*3sYM_{0*A*ezI_u@skBcXx#oJ0^yw|ee; zE+09jeBkw4Nc9Wxu7_aapAo4Sf+yKi);-wm@C@RVZdZUgY(q!M!N)?#3e*wmu_S!P57* z&@4;hD8TUwi!{oaD9l0-&T3kg+Q43Z3X#yD9PobJN!c1UL*irCx!s0Z8YQl;##V7D$m}H zdifr0HwI{~xYJjrYqjp$>+MoHINGRDM9U3q+ z9&W$5V2{TmMd#Spdi)Vz@(eVjEGXfb>Qq8&I3OCDyL-+Osg7Obcn%IASXGLBP|=^~ z2Ia@D@;_rz_Wu^Yk#92It6Robi~ag~hWZnT)}ekF=42~vT&Cv5D}6+ggghz%Qb_U?2se4$x=Tm zityP{r|nVy!02H>wuS)U;v(yb2!isvyvJ60*|z!d=Z@_P+WVv35-U=q@BXh41&{?g?-5@#9PHYQQ_3TH|F;W*vAZPTy-#JxIZw zR;6y=2%TRdC$HP8`1ibFZgX<b3e>4%8O;Cm0eKqKYupPfVVMy7LJ`xt1 z6-F!^YlS@3u?&*jPv_bL*5yRW z#D}4O{N{rNHSy}lRrhJi8t?5|dfT>}i8*a?H;b~V`X?mKazx<|q82TtB*3488NE&Q zD0d4_CF+&ipx?3V&~l-wo{<>*;IJtnc(C`~vITM?Q?YFF4f?TEGG)o;G{#*@q@B3c zzm?5ub`LmJedpaoZ0`n;3w8(me#VQAq)4B<_3FoJzSUoR#Hl+Gtc}v6c22`LSh^1v z*PG(${JzjBU(i$^3<^~cS<`{@Y%m*&)$xL=hHHpA+}MBBxM_Dz6lmurtZ9IsZ7lKO zmZ>#dRA7qjuQha=RuAg0%^7k`sd7|$i{%wq4Z25OJL{4mu19I3}#-3CvQj7uz;5%Xll$*px6#wEQXg=Oc7&T z-uFot0SN0<+}vUZ34|BIfU$6JB$IJB#i^f zUvF_Z;k)7ar|g+-3+a)=7X=T@`bydDcr*$iriYfw+8;0ir4nG2+q&kBB=O7lSMF#bk4y=- zw5b=Rr5l`_gA`51XL=z@!oGfMDwyOJ8#?F1f&T@i=O3I)S%^Q;z^uFt3HlQn)eBxf zd1-UmeOzd?MOA#3mGbc_sVq@Beu@Pa5g|ltumxg|7UsL8>h~v z_Wu>9XkT^J+NQ4Gp?ky8Dm>FfeQsy3n;DecRxhUuhWIt_m3~h5;wFfDX~xF-jy6;M zGV|ocsRfh>2ac?CCM0ZR9D~$L2+; zg)Pf;sujXc9Po%M==AX>@(f#esIP8&=wAVaIr)oo6+Or6?#~tCjTsHIlrMhGM5kgzw6_yjqeae^U%8qp+W9spl{@Q8lY@f+JQ~^8$l=~r<=+g%e{u>O z4s~t$72L4u$K|!7!w-R&?jH@UV{k6DR>EYrNE!ES?4sv3L0U7~w&e$DcCru7<|QH_ zW!fBFNYd;&b6c}B-UESqsq)|a{LEt=U07@NLZls@E(rr$o=|C8q(2HVS%ahGxR7FJ ze3FF|6!lx{J3AoSo=3>PBxv|mA6oyj1kKq0Q9;6IvTkVU7hkd_u$B9-n1MC0;M(bZ z0?16s-hD-7`HCB0XQ|24tQtFCoK+be0HzlgunNtib+6rlDuu!_XF(dL&+pGUq7Sinl}V<^zEe}KiBS`6x5&GU*s01 z_t`7Vj}+B`d~kf($(xqye+0&ApD>+owf)sd{!5e7^o;E%D!B1&N1A_@CbnxXr9hHU zeyNY{6?=xnsAoANLCF}!%t-eWm%@cg=>XC~Bx@Ft-4q*%YZfPmQ_gJXUR@7`$KOf{ zY$G5*ka?H6tIf>O^@1*+cSe8r3RS0I#wd^v#LKO36bm)SPnk)ZZ|I&GVmX9ZL~kv0 zJ_=P%+Use4f0-Lv$PJu*DBaiZu3Zb4@AmUEE%$R^1vSG3&Rvj;a9G}zE3E@N>B%$u z+%rK2noFW*@^ebU4S+Q&Oht#A`0&DeqwR}@X5&eE3KXVS7_qO*Y%DYVgr5f zOp8C>64vA>jp5(SV&T3@cB2_ z6>Db{>=W%asZDqm6`rXmZ+*=jl9k9vj^Jm*bJb`3pDxVkM`>r&3C&>0wW030iWoK7 zGan6!IjhLXnCTaV+xE1XTMC#iy;$A|}jj#Ws5tYYg~mL==u3xdF_yV6kcJ=2nIvLw}}=pO_9# znq|0RpsjD)rcPVU9EBr*VmQVi^0@7JslL}9#?=(`Ggsv1{6Sboi0)W(4#3woaQFZ0 z`DRl)y@Bz1-)enx*u-(a%v+rFxjy(^;yeti=73Jt;7&{`9>>yJ%SQ2Mp0#+rkp*-8 zKzElO`k}$cKETw&!(+_odP9sf5TblIH&j7Fz7l8sX2ZT6#kAxhrcd>Bed_i&^afzz zyTIl8Mz~E>V%h0t%*QxOKERUmG16cA)+G5(lR%x zUFULAq)x%S%Uo3^MSq0l_5^O7eUKmwqR;m8U@|ggKWJO?bG@)1fiI{0>1V`xOJ7@C z!`oOI>)`4Jvj!iRyAm5xCLg%h(Jb&5@L%0QkER$7+!dU~_j7`)U_gelPLbQB==H(# z-q($K^wU4`B(ws6_f5gvGsj9_GT`5DYotDxgK*;YPKUEBUndZSTH5b(2)^Q48vPOd z5;{@eg#!I}zu4%?za@aX^#1uw_Y!Mq2YynGLn8(o?&)M@-?Z-UXEp@&iy7fo5OaSx zY~9SXd8~|J9=5C1;lM-_PK^UKLLCWo&T-<%t+14i{)A@e};*NN3OU>XYvDLK<@Q=Dl)R8JpRU zIiY4w?k|oh(USDxqH#@5W}mMjLNB#FE@5WaJv?=ClhnSehB76jym{|6OtQShIi@Pg zef`l4^M-%_2eBzAM4Ntu#eDQuP&dd^P_|4|Mbk6pPOk_AB~q%(yF>J-37_9$?@V06k`1M=9z0+(ALSo6z4HB`!|1+rh1c|nd0(4X+4S2{o#2Gp z_ah4K;bRoBrkD}jX_LME9V~)$3RRX%#Cxka+a-y+OYopgBeIvfgD$95c}6&>4%!`8 zutx#V1!1a!s*wiF`^dEiyHI>MD<610NUo+W?+~ttGe&8QM!hE2qAHwT53NVX?I;_C zoeFpe{}9^Cdq_acXgX+5izlQmASb3XN^FWX%OcDkkWH8kVhRo;@Ky?lit@dc@n-P; zW;EI`RL#G07}KmtSBA0HbCH`uZ>ciD4oKu;+Ur31Ia^T6lC^o#uJ(qhRIU;)gD=dy z&X3UDXaj;4z`e`G+%OyFq9Y>nBr$E4S^8Untgmg<*pWU4+?R1nD%@XkzQ`I=1!!xR zhd82;zQ1iFdE4pkQrXzyt;tGyF(}RP_9pI!X+o4Ld_8s`kccNbdo&c+J-!mJD8^X2HCOJ~qxdVUTjnehKgv7*$fMBpG3f&RQcb>O@R^8x8s*><13 zCf0)(tSK>d-a?$q)1{sLmEDyB|DdI)<^-Jt{u@W~v9N}7M0qP(K0U#5tko9?&0P;s zejRVV4K<0UUs9uQfAI?Q6&LDtQA9c}SBVhZmp#NCF00{t+p8$GlgIsyjA}v*tchI9 zvI}Ot)g^S1Q|H{-Mz9`^Ak!q1M0eO!L3b)&7 znp`m`!+fsgsxki|HQ!M1bdN zr-;bk3H)(l4>(hzk{{C4j@~1W=hWDI0-E8%bu!TcG~qd+w%@MVo`jTtChqvXVX&_8 z9Y|FdvNDzXS~v_^y5SU=+@e?^XIHNoe&yg5txypFpf0(oDy=eL)$T9+vD+*v57mRZ z7Mm;_jT8m(7ZyZ+rZfuuh;%ZIgmG3a!JX!FoHbT8&bDSFbbd>yAUoGc?~p%A$x7T9 z&3*02y(kpq{%SO-E_T#c=XFa%h$-4U+giOj=_3hYkU_Stot8S;r~K(RbnFDyAuGo3 z8(0M1JBvKi^UG07;)_3IBSD%d)hW+A@T71%TKIO_f+_r5@9|A!lV-FVrfjf2XS>37 zmlbW(I_h>8lx;A(UuY`Q)7lR_BCpYtX!qf+2&j<*%m~!o*)$b#bynFn-=a`#s07{> z65ru3W#KmTqIix)S0{51_6Ex{xl~Imn2Lz3TX#Jj8h2Zrp(mW3i6KfU_A?D((oi1s z-Q-C?FmX}F3h&RFBm#pwSL_(Rz7;iQun60H_fR8^7~ItC(fto&qR!G z5}zIgXMNqo)8|FD(rh|L97c`peD1z61W=L?I@xU)8@0A_1@Gl8sT>2oGpsfR)|oD? zJQJuo8exBrp6|}C!<@}jsc!4>@-W{0)Z^7wBqWx?-JRY*aU;pz{NZI7UH%IZ6aiIPM zrP7DVFJCqMKhY92Yt6VeAtS(9hh8IKI}pjT#-J&f7EOBw394olX+8{TPoahcr_K`E z6f97O7;Ra!9t{leS(r26l5I(di{M@oAFQphi$30ozCB+U4yI;1-PI*?eW)N_uus(O z$|Zjd#^kqtjrgt=`!!;79z_^JGX?+7eWq@-+n6z+@&>1c^Frf_f8obj*K>{Q&iy6XB@VWht9MEe=uq&J)S87SM6Smd^q8d;w_^hs*ON*Guk2-iIkPh+|&kY@@YMWqyN9?hk{{`tMlHB)rrh1!9e)T@b;5bmD$F zaw^Tx=u^WI{SJQ5iGX3k5n`=UEH}pNu9;hq_8kbid>z* zx0%vcj)p}pVE1USkm!q7iplfR_c4Y7Ri}%&npstwPn^XY%^AeI_ID|DC#DA7KnqHpcCw_)uOUbWQjXw?r9w5icVAk^Tf6zz10qd&x?DD`@ z<(xN!$MVI-BpeH#($@%6kx1(2NeT-^E3)y#_PUW}fI*Eva8TM|F7Kc7|0ocx%n-!u zw2fAl_9lg1G!AU|XIht%aFLNwg>=2pnXw*;nl0wpaC{4@*s~PU8Sq5g9A3RxF}HD9 zCD#$8D#hlp`6y#^dh8I|Tr4y#=c(3%ze|AGAZ#4D=j5yAUM0+^(k{@PNsaI2#*7(D z=2p@azt!ACdQLOwn@37kHsy(@VXC>;By-vQ);+69VZgKgDsZ=e=EkEQsCf&TiIQB% zeWJJ85t9A=m8co_+Mzv-X|V9FI>*+Eli;~K(Hq4GoCTmh0eJ#K`zH`V$b>oGi-y=0|TU!nF_5ZGkDL+x@DFVZ#rK zET?1S;evvzwLk1x_a%;QR++iTa!RAFpJ)%Kq$NyT5G57>^E2OH=3HK6|Ak)ACJ9O# zz`Ll+dx8avqLL`qcWFmK!fR>f`8`4;i1{F-xe&kVGYiFRpB=r^2BilrS>)reRvb-q zex(rC;^#spV(qDc`v&iZEwNLY=6rz$npoIA2HLEr;DnI~s)pt2^v#-lcmu`j7zO~w z%{bvx#)&I*&+(?tMNHEtf>nFBt z*+dE1DYYG3R(7UBaj3#YR-bt!x;;)Sb1UR7C!SzzD)N$qahy19EXWmEOnsQc6Xn! zS9S}Z5t?*#+|i4*yY0B|zDN7t5WObDQ=-L5 zNH;Zz%OGu{u|5kC`v%;Cxs52Z^086FW;N8B@zd@vL-*GFC4nB}y04aG@(v%M;VXdvmaQZnhXgb8CAC4(EeLp& zw%352%qo6Omey0y?Xn$PW7~-&ik`R8?xg)EsT0 zuC}ocZ~NL-T~E562$4s#-S+Hdqp7dj#w~Qx2WCw2YbIpoGAH6=*TW0}-@^A`8D(Xo zSXx}{1z|uPU*qn#h-v*Vo@(Zf`_yJ~ai>C;J!)ze0kEm>y~Yj%adRa%oXAiZiVouw z)BqLehuiSY#w80c+``#adPqK>6sVbc5n#_q1d|y=w+s>v73U2-eBEucHg7a4n;vkN zXWN;ca&r4RTP|#&(>c)sdN;s=Tn!U@V-F|dhFm#6J=F&qQ<$txcIPby@huq@saX>f zh<|otyqN1o*A!59wq5H}(NiO|_*!UQ^wyN4DK@|nJCFK(G1F~u?;`s=sZlE_-v-P< zyuEBOh`C{QZ!ga3_g2G`_QYawMXTbaYO2AzBQZ1Q>E>A3(7xc>;*$?5lP1SC8rED0 z8>%Z#@a77?e|v80p)Fd-2M)`Ah0lJ)Abr=D#g8v*AYaA4TCl{Ipa~0~ks^t{>><5vxI$c^(d0MC*lPr zPh=}36sFOW`~YNBha;jO3P=w+ahhZX3A-HNcNx4vZJiFKZZsp0T9|U=CyPS(Zd9DL zw3^!)`ekXxt|QjXn#|WtCs_88Q-7+z*MxnU7vsaho> z*Vl@)?PzTPYkBrv;a696x!GrpjUH*MkuA@1Q$0{>m7scf0&u7+i7mqPT^KNnQG%M# zf)~zkpROZ$Vot=1Zer|#DRffOk5d&Tlkyz$74n#$jbq-n1U|#e#-t#Z4`xZ)+wvP! zQ5nF&WxZeFytUPT5;Zq`mOEC|8|BWKnM_?4bQ% zUJt=A#H@ZlBvEf;U2o$a?s`&C^aT_L=e&~x;R?=Z-mrJZZ6nPe zqysHGaSz7#hLRmib!-M^cRKYO!tF+^+-K_$(@nz-*VAgrELTb<^{{-}JwvNACuFIE zOFj2T>o3Azxo>;(F1!}q!ny@X&1Tcdd>RgR+ja;37LuH9XOj;QE`sP&@9HsFphRHG+{UePB&ExEHl40x{`AUQqI~sDh@nyK`Ww^5+a94pB zcNAC|M2$|e$2bR8%qZK#(+e+@gvE~{WR>`ogY~h~49ycR%b-^-vVXx z_;+H8G7-BYl5Js$Zq)i}cH(_u(>Qv}WSid3?E#`~aFon#GReP?!Zw`Y6^pXzzz%Mx zycc&SQ1hdV#T`Rb@6I*(Bo9ku!L*!vn6i&GqKD@Jc>Q9qx}!=WTPMSQhjNyd_rQHT zCZ03^&x`8f*{rfnKA4G!K+=a1LjC#@sVBtAcoKt9#b)SKjsUI!PfkFA6)AJQS}UCp zcz{)E4OA7eiH(%;l7@M`)M}TQ@qu!tN9*nIdf))UBpQ{TnE}qZ2<3hajADiOd{m`f zKL*U865dQhY7}y%jrVCdsmXjIYC!*L?jK%Y(>es6_;v!a>nW%jC@IL-OFd>Ol~PAr z1%b9Wx|@MAAf&=0b+~-@4Y~KUzXnZ9N0EeO>%h^=v2Qj0_dP2y_s;oYrfu9iuI;G%mODw8yzx?F&=DS(TcK{PCLx1&l^L zT8Agu1Xx|)NN&{1FlybtbAP(C4ktX0ep8ivPf-F-d64>Tdj5PdG{2~@PmScP)oofn z&b`Wz=|TTNbGXQ}6^_h*)BB3E)uX*?_o+bcPE~%xEu_^695KP>6UujKHSY%hx;)c} z^k9vvCSB&vTi0IlV7p`k?T~-k{^UfC_1dT zi_KG%clG(8z-H%r?2RIL%wiaz)_j!thh{@>A$^g~Ki`(d##lXr^M8gQte}tnc)_0I zU-7~VT&v@rg!og>*ZcpZ=WF2h{MYF;>CPnNFK3Pm`&ei}$}fd=dv!(UufxAeMdthE z(ipF0>Xs#zs}kc3ApF#39r#?n&_v_vVDS9BEI4vldb;qBXPW!#bk|0UP9f zbXNwtt1AbkJ`tIMTK`p1!aq10*ARZ9f+VL^MDQn6$`=}RC@CUxd0RH+hp5w2eb!aR z!`j1?oz^l0%b4Z~d16-b^Lsy>MOIt!6t#A?`9AAmxTzSOYV!8rE096_Eyg2P29)G!*PZzB*D?pKW1**y`csG=jZ90q z0J75mh{ErkB}~6?xHWxF`4@>y9wsDMBis;07iwo@t}#p&v4nuf9|4x*LayNNw?y-= zQ^c?+)7QlKWfmQ_4PeguB;W8a{whd5RM64?Oom@$0bzN2B3|a^C()c33Tn@qbq?G4PVBWB z`3Z)6W1QGBEj+Cr-wMgvFxC4 zO93_dNhFOW;b@g$Kyvbm!1I`sX)#!V?6=p5{3p}h`B%Xg(K{Hrfj_f5+kwARAc-rx zT#Wz*=%U7g$z&69ne-@pcCv1vnf%f3Op`t1kghVjco7$3mifal%DSFq$gZsNjdK4R zjqk4RS+K{UyIQjrRR=8HI`4op!*(kku=#-8IHn(tf{fqE=iohvm*ma@nJ4=5({W?G>S8})5ft7u~00Dma$ZOWW51a>|G%qT2a;D%PR zQzq#$Dyou3I*YfNGNT?*UckN6;WJEju$^9~7oo6oZ)Me>|JYJ8T=#@Rlk*wU;-D#f zSTnQrr0ChTnROF#+Iw)94Cleebo5UX+*1_SPh4)v*wADfl%WyWK#v z*FQKr!vX@b1LnfAgAFOQZixNL64wxb6#1$S=9sh1vl-123b5_5FhsG+g~O?Uj?LdF zHvHR7-b2cXtrp1}HoG{J2vU?%ZM;f-!-3)-oKxkl!8f58e8XqF76S+Dok4r)LYy`p z_SY*zz*j>I)4XXpx}%ba2QqG*`dpVojCTz2(gT>+F4oS-CAiHpPc>g2Sy}cSHv>S)Ias@9XZD8^`n3Xw-#HyKySm%WXqx_?grl5k1NHdtRYKNH&!JsRn|7% z3ukF_Ufj3GY+16_GIq$CJe0;ACKD>u&p8`7fcP_y0&)PsFL)B>7E6wegk?*qHKQ`j zBR8Imkv8MAuGk!p?KND29|g63(|Z3q)2x2;*RDYp#)cF5C!ksv{#5(PywJ68GvBSq z{M9N>X_XF}m`UfbYvaQWT1j{sI+aj?;l>*h{ag+5XGFE=%Z{K#-dxWXXe zE*DTEFN}vcmZ(R1$I-C=QO>yayP^lQQY`XJENaBu zw%WVRfA(Mw<|tEJQb6NP!b!Dp^qSynJf3>-I8y=W4vY|#W=T^ni38BT#|UJaRj*gL zEdO$D1pYxRd>jm)1tmEu6=T*G;fptT;E8!)Q4<%V8D0#cD};=@WNAC@=2Is>g`2P& z_&hyEAo&fZJ&B%WK@fhab~o>StN!z@OGb(Vg9HbICYYX1bibD)3VRWsVLNVSab{k& zwRjZM`hOutQ9OtJHE*LvsYriji2YM}WW^jyEgV#`2|cMeP=Y&3ym-JpRbl3 z^*mD=hyb+8Vp7AYYzNI&!vncXHCAu0x!!KszC7g{=l)ytWAu=2pevS_tJJskZ8#s9 zXD2ILJKi)Boy{EW3E8!3isf-He|%?4KJPdSHP(;xXpt zeDSs)B7L*U+R!&(DX`PC(Yp3>fPnnS0J|+#`^?~aSnRii&c8C}hXsD3C*=I-gYuWC zM-V`Mu8iA!_z*S=wj~~^x2ZsX6@fs>VG|bK;8Y~izEyR~nevj3rFsPGe36gg%%j;C z$n_d72*W>Kp19#Ki zc|75B$)%)ns-LA*aG5`!bVTjy3Fh=SJeavxPyBEi7p$b zz9fM+t7li5;uSpBeyC4pO8*hPufxCkMqu8dhfBHqrPG2_%jzXk;PLgdmX5_H+8joq zkQC#bZezTB0_=Gm2GONX$i;d+UVfx2W|E3PH97F1I(4DH4jCC~vk*pM5s@;B3lj31 z;rmx6%Dm3+Np5LwscNQ(P6N-%ePbnf*1vu$yqtmfg1J5LDU9?*X1BL z*hl=jj=miq2Rb+BIQ5xgDle&b>6e&ocDa`dM;nO-2Z32pZocV zb5x8T&&V5-0mG6AB6nJ+%bh7_Li5r2!Jqnb2HEhxV(V^=KS0VFeG&UseltMrmmoV3 z8kJRBb4-B#VB6Cgi((t#c3k|V9J*@KX%9)^=SCA9@zcrQbgS(ArnBAsblRj(x8EnQ z%0pWP;7QAzsh2yz8WKCv8I``S;ccdylo!wisCa(3FljKN9q%AOm>zyaPA>bf!<}_i zc5S@iYqHSZ1%GZJso`MY+u9RfojS$=czocl|Xy0%?JhZ@6@*V$fzOW)tRrECbHrzh4W|UY(bm|o7`fj?oGdDqHuP_+^ zdd$}ExET+1S+YnuepI+n##2~X#~e2|GA%~{bUkb3ndE9?UnZuCSd%r=|1(wmY7&(4 ziO@+dc2-DzPZ?6OROI@MVmhDLFqDc1{KTk^_&q+pA|BX2@^}(n^x$P9)c_~&6#!&z zj{P+}Xv$0V$`y99kJz}^E*)k^f9lX&+0R>G-Gy@v`~q*)Ln)SXUc7-yTK9h9pWncQ zG=#GVRMxzUE3RdU0vi|Im7H1t(NB!Xj!ld-eehY#owxyd;v6j{qBasOkBD~}KcLG4 zR?3ghISy&{FmD6o-1V&(fnnu+ZeZS?vZZf_5vZpnu3wg3Txx;l+1Ft6T<0OL?H6&Cd>CU;i7esgCcd-?T{Fs))jxl9o9@C zpH7fu=PRr*?g635AB>AV~6qlryEosWp&Jy1o3ox==J{8EOfgs2E`tW zH5suElf8R=zy#3X`6Ls-CRM1kY$|Hu$}x=NS91p#o45p40ZNk|1<51EU40M4?%AW_SsmDsyBNS+-6!+t-uVLSpqJ^uQO<1DxPmvtY+HY!5Vx}SG}D0y5GP9 znv0PF!}4mb!do?}j32xN@=UE3T%wG>D0iNJgpunMe@oQ=ZT<{ z=$6iEy;f2#R1BWEmVJiSA8+y$FE(kH>XA1y3A1?iKs6Kk8k6aL)!YqQVcZW9Fe}^< z8M>tetE#E@FE{CAy$4yFFxV?w@^iC`Vhu<{M^IiILiWR@(ltg3Ki(TRYgyWuBDd;n zo{}FtxN=}Z0KED(&!Op!%$wq8PmRw<$g~^ZsqJUtPPF5C2^KR~_zU-K=xc^O$dh#} zeo#-VbzSIwLDrXz!=P;H1#h2Gv~kUxL@~Pm!=i9O;naThY+?B$J=|dT|?u{WYExz-VWuEk*}r&Nt0yvTDBhG>KB z#Ef}KaABS~5ktXU3^Sp-80HhNm=OMZ45(ktbgvoG>5>@Wl!e{*C@<2|<_J#xGItdI zi-`&|BqZYEaq82Lq)tz0ZT3uWW;W@w1`T*nSt$aQ0%2i-{XxsZRFt;l4>O>E56HGO z%bzEg-&g*AFy;2hqD`+S}1baWF=nOJwFN?(tKuyeWaLJeJqoS)#qM( zl=oe;C7i{Z;J_9c?K%UGwi#8raRjS zq^_N9%cnm0n^R?kU1KCq74jTbrHSKz6Wy5+d`*wnh6(>RBWBnrpNYC54*GQVCPRlp zB1%<;fjg1oVBDw{d&gsl>df9h)LzU&)Qp*oH20{e)Q3X#(EUc))E3Z!(yR-MD5S62 z`7XZlHR|}$gW)kFDTP_3f;6V~W}ZkK*t$lb3~Rpx=e8GRqAN+U$Wj!&!wf#&j<-a^J5Z{cx+-s%~#o(&cfpZvVc-;d%~P_h-} zq%1io_w#PePig6~E!7-TH%zU+^+=*oMP9m=KbA|rsj?C+3n$zTo8FFV0@su{ZdUoO z&;ZR+6bLW9qgMefMyD*&|FHpHC4DH~#x$1nAF90w<$iruCB;iv5AtZ=`=?S_SuZIw zI(lauD+iQIhEUkwxO5%a7SwS$0=#B^`4IZdyHCay4}N#2NHPcHWY`ft;f{wnpBult z98d*_&Xqz>ZnFwHLqm1M{E^sdn&#^ismVk%#3AhK%HXLf)Q_^UzG!i)OD~ zIwchB%UijUWLBfiEqWmWTt3_RTL;(lvG~i!D%;t{RUm&!;J0La&5c42GqEh+u8v1tG%j*b z`q_C9JP9wlciCAFn3kIPLj8>PwX-IbI#(_*J|VN?7T`-_ z(f+r>-C;rX3bMKh#t!DN4nN9YW*B|bDDDQpYH{Pv*sbkbL4~6hR=3q3NAm**OaQ~t z;p6ec@Od$iX#y5jFsLq{2wcB+@311!%AUOpD+Ir3d&V&`U^~w~(mWLU z%Lj))n}@jGwLJSe554&}=OIC95{cT8`|!i}FLcIOn|JpMO^YjZ2rh_9@~J?lIVqJ4W9L&2|_l7q*Stf8r*$Qe2`{dloVYDI*I!e|@C4Q(m_ni_vVmkn#nYS8MeIo(yx4^>zk2QAmAXjevYb-VfsM;P?; z%;fcLC>!M6z%!$7RS)WVvwZ5$fgQ#pQ+`@N|I*yq7$76XyMoth#`k$i3y+KbuI+j@WbIa^Ok| zMUJVDh90_Fcp-qxE8E2)U$R)Zsj)xSBXqTv%D_}yvQVU{B@#qzEH%cLI2Vqh+N&~a zfKu2_w~er8i`sq;me^Q#%*hAICTBLb3(fsW1hjlJ0jdtZyjsSpZ#DNAKi(O>|72D5RGsPFS^YDou8j6dB2L_Z&Ul2GBTqDztu z`{^_na)ec@8r!m%6ZD|y)AKR(1{D_8R>Vk04w&{1M5prOf*Ft_n+2GqBI`%{iiAu} z`qSN@m-<0kn5R6$`X@nSSzL8*Aji@x8Z4lfV!g3OLNtNiaj!QsD|O952^H7-Ed*|6 z?wqZz^>+6m6p`JuZK(JGx|&)l(zLVKdAIe?;{0U6ecGwzeuu%q*mkad7=jz}Z)}b` zjC{Pl65RrCBUYroy@>HG8PiMeCS$vLo2S8kes<)||Lx~_=;s|ys%6hGWgHPnYOwdG z*Ks9(366vRx1{G*fmY1C5`l${|#YhJHbS~Sf`c8wcAi?F&!8=Ja> z4`ns#1jdF(C$TeRqN*|pZ4T({~E*`fX3GVzm?=B(OnM2>)z1@;ejmfTtv( z^tvj*<@?m*U`T9Gy*(oiuTct{l+fx^Q>QAwe?nTZOR0UF)kH& z)|Z6gV}`>?;Pu5J(H5N?)O$EX+8T`C=L5sStN<~>tB4Vv&;a>_AIBeV@#Eupo#`v= zWME{D6zkoHeQYF52zHWynkUzYKFlDN@ag|~`r`dvk`s}6xb1hR`E8tEBs;($m_b4C zeDm}I?ly4Pb#U-)JPL-c_?OE0*(y>wzx^>S^85al0!CGLffZ-=YLzMS!bQ;3~8gNuZuL$@X}$%bswuYqaDU%c+DQ?np4i1d68A&L>(j>IE9~Ym1V7C zSU}mDIaNwaoT8j^S9gJB@!ECG?T}mm+f9it;XGTb;WWBCN(tDCg3*41H{h@Zhr>2N zcg!eUH+4CHAGGV89y&8F+0?XY_{+~7W2>L(jK&Ok%b_i9I|`xi+)Zv->j7lIwA_4d zPeiv6F0;1*mC@p$`;sD#m;0A1-?IO_0PWp8K%(%E3wh4Rf1BFBB|~N;W&BoMx~89> z-_}0oD0vSvqp~z1oz!9`{p=aZc!5)%YrFoNNAXcECePPmNB&R$vs{1B+z9e*+r%-J zHvN=$9a+bF?62ku7f@|%k5~h2k zXiH3=o8_o_CvGHCX)379t2wb;SY3G@sy>I9=+v+sYcGcc6y5p|M8po;11R6c4rjBA zo$@4S8?YZOPV>peu#yJnQLr~mel!v7P*TGqEP%ni_&(q`Tw|s16WXcN;Ng3$=A0S% zQlcXm^55P)=L2oGOm_nBycdqCA~>JsbM}?}eh;i4j=|{X5+6wKEueoB+ovA6E;*MF zi6I_4z0bD*(;F0^Y+;A0>LvM{CD*t?w8+(ktb#HkF?95*zGsu}Le*rfpf9u?S6nb^ zM7bEwMDZcj;a)~;pAYk>xM;kWuY*y1+q5AYhZ-(a2xpAhtmw*g^w@-?w9!o~X`?e% zf%7kxi5^HqkZ_^Nw;)b7l^zxe!A?Xa!mr`fZ0*iE! zGM}&UU#z7Ptk+(eayBx%&fqVW!dogpZ zDOX0YZ){f{GQAdhX6*!6+Bj;R?cz{byuBK@j~Y417kR_M7x)fa-q);Wlr20Nw2PKHu>hK@Ds)xOH>*S!!b$d?KJ1>vdwSdWKe zg)Vc6ThhPx*IJnC5~!qjx0>%KRddy<+O{m_VLd3C+mM@^x}xTNPdKx^R)@Z6@4yDu z;p(xDvCRTZ-l$|FnaT6q98?!vHw`rw>G45#fkOZU0~||xQxnkzZ5Rfn6EUt)F_Cy4 zbZ0)fWw_^j|F>YD*bVkrVzA#atfc-&!Tw)!8A(pWN0e!_c<6ik?w(C`;3BJ1b+d{E zuSs@SD=*dI9jeWs3GK1Wh+&bYLSy(FFBX*{(B_FHMg;wP=|J*FO#81^zj%sx{P(;$ z7s0p+`z(W)*r%1#nbH^pDD4+FHUUibqPp>co0>uCKI5rH*^Oh72pQwvL0l$yWMWi) zNnr)+FbC~)w_x~OY5j{jt43L2Hz(>QKRS(H3!yxCzI8@3`}m9oA?{TW|Bw?R17owG zoARD6T1mT~81C@ak!d*IrYpL2+=_N4beUlB`IDpJdcfFE8cH5cbrM$IIcI3TcR)vS z1ZXemuVVy@XAhn1ykVvpEHofxe40OD$3VGU1d2$NDeX{GT_2OJ_o$a=h+Jblpdv`- z4>h@htWV?HGf;nRmQ|}>LBg$-L+La{J5%4s0;2nQ;!FXSiyMyPFO|AeN|x=fE@l-J zP3?aI$Q|YJXp;8!Yy#^hCX=#ezrn!rgTi8y=ShQeMku8xOYAXiipqs3+4$C6VTo`I zyFT1B5R$yPxsEduS_4O7&m}=yCVNVQcHOZGNX(k*JZ-=l7O3poIJSOLU%rjCr6G+y zIhvzizU^6#ad(qZlI^4QPOLn-gR)fFPsNfFYg*w3w0I$#2ZGAu8~4=k{LH{KZj)qU zBE|c*G2iPLtvd^mamET3&m9xE>!v~ZN;~WPz4L)|gefF^bz`u^*-D;MwcZO!K66ma z33TkyLtYAs2QnpmP!@FHH>5ZDra*PhFB<62-|S4Q?Z|3GF({b!e(FZ$`}l7J(3g%{ zq!p#rR`6SVH0d4Q$OM~NqPWKuobe8GNV|&sru#!HkElXU4i9x}?K*5f(P70G;%q_b z0H)$skgHvF%#sM(y!Kp30JZdW%sKPqmhns!WJavtt?iXaEFsiX!os@-65tOhp13jl zw>KBRGaK!`&OV|KD{h8-pM9>nvk*5v+flO4#}c%;n2Oj=N)=vWVka0VNejx+Srzhv z$O-}NQSmY6jwh<5j`Id*?^E(^ecJIDyce3IaDzof4y;^O{I-$o#C4%B_W++a_CpQX zj6HGX`4aNombdzWv%~tg9Gm(23<2)d{$=RIPpw`$iXd;N87OSA`lw|^TIgY`McMRG z`LZS4(Dq1VJkra(BnsA+HBxPwW3H$@9y@a&nXpi!(n)8dq>ap2m2m6zUAks&5s%TF z7GI&AnOwq!(&O7hOj96xlO!)Y`5qu))%2lL><6kNn@V*zSNcR%pf&}{4#ys63MdQ2 z_`hwI-+r6NC78m`w>bKoQ4#5T5`0C6Vuh1`-^Fz@1@jobB$kN3l`H=!?mPHif$H=T z6I3*nX)3>@0Rs9>b8>_W)-Ywu`kSuC12|@oJhiup%abTTv^mtXNtdf~vXNyGcvcx% zhV`W12$!zpbuZHL!qmYL^8Fw!+hpkA%8ND|!|BaIE2N{mqG;4i0!L&af#$OG^X+pR zy3>drz&I#&-V@MaUBuC2C$)dq^x@jg__j&=qN%pmKk-HEV$0 z6B?$CF|HxnMH`{SJDL7oOfNx+aPR*z9{!+hVnc8Bgqr3Y<$x)h6|uxWyqAN((r3re zM~_-qI;g)JiUjo-o{uZJZP4;yv#hDtEtXrAD5=SGGrxg$b{RD-3fq3hjdRE=X|aB~ zj@G~wKk!=ep0D!88hzcZEgE=0;WNLk&`Fc}1P0H>q|hD${#%p!Uz^hocv8ie=xx?J z^CR2ALXj%ujS(nb6r(C@NVn@cT%rki`PGX(J=tjd-Gr`uOg_sK538SK+i|QH z(!wp{?GVz|M?8xu{Kj`F{UE98Z>?+Fjslo5{#ue$)TM0qQg-p$aITnN5k9OoJb1m3 zgx72{8&0hD(d|64Pcy~3(}^&tJ!x-#Z@yK!CXDQ8azET3_lfF&TxIcm>P^d*tUCLi zgf+U*6WjvckY6P8>9qua#>GcJHdasgoJJ%+1}=#&j4u5O#u_C;7jFNcJ_~yD9#^6oJ_^a?ca!S$T2GR@2yq*o^sQhbqL9trz z(u6JHcljo3Mt>xXak;x@K@9xvE2m!IzfDHwaP^BEl>3Dg#%_CwRQ*yP>}U6dL4!DC zi!}ABF)m#47UyZEzg^s}^*9yEDhU^BLHb~%_bLnj$&aSpPED^>FMI5S`kX5a=Npni z_Vju1v?dP8^lVojOY;J$L@iguO^-H;f%8%kcY?Rq>a`Q+9}mMPH-w-h>PIXoY{ZIk(?pOijkH=E$1~L-GiSwSU-51MzgO#MM&B!>w-@H1+P}|h% z9eX{ueSIt=58iH`g%W4Uzm8`czok@B4KX2eDo#E17tj9^s7X4a6RP{prvCvw;=Gl4Lv>9Lr)z@Tyas-OYWh7U<^b#QY;dB{EM*jeW!zVi^8%0w&bIsua7vfa{&t* z8ClK=6&7aEZZMz7*341y8R(B2pOYxTf>_<38ymZX4P{ZV+4cb)ki)=^t@|DK7_t|` z+7is)ov zeA7>7pS>8E&24s4Nn65H>;Bjyu~PUEdnEjUs80uCkDsPKo3_P4A-yfA3^p{#q@~s_ zkrtk>^0@*}mF9O5wz|Lw-am`$P*oBfqx&C-B_DZ{NW6EnJa3p*tO4tup#cCU`TPW* z2sibh_^O)5p77u&{IN2|fMI-qll=0IFb2@=G2Og5)`f^(tj44e`H{=3vY-l7H%2?E zUqmY=89E@@Hlvv>92SWOMEZ&zz&398-1FG9_&V8-8h9kbF+^!nKCyk$Qt;oNAZ&|p znf;9p|Bub(+js^NaV##e_WpO9kIH5)OXi(V*Z5Ok3aMQjnbJAdAH8^qHE{Or)2+-G z>I-TjixZ{HhXij@%qG4TOZq!(pL=*mI%rXUd14=ns9wsuG5GOye%n5_fk6Bx~M}OVdu~~E~$bBOc z)&}Ro+4&wzA5O>qvP{^7@bS>vSSGwEU#)iQy|;YL0206TYBgeuVhxYMuI(c=pMpPY zK0lv_P>@6)ob;zczxR|2?v%R@96r;Ry3x0R_JDmXRxsc zznl{p3&4LZH9PiPUqv7HpLeeRp!yQn&k?wfWA=>Xi!V*xnT&9CNX^~uj+?eK9tb>m zsq371r;Z*g%KjNK*??&KAy(<+uT`oZhgs zu=Y(;9Up_H0gVCz_|*q?L%q7FTM}Qj%vv)Bo`J1ZrPrtp`!w7i>Ac9Y8|nutoUF{f znmtNx&u!f<7*zb=G3_1e{5$pMvI#XPwhmXFKHtdx@_fj&>jt~mWP)(2!{*%77cqoL|o3oiw5 z9m;mGh>bIewnm{)m35c~Y6JP2#(^>}POT2-lC1adv$|%eFlFObgy-4$+Bl`+!HB$U zAZ@2A^GHSk%CKxkMusH(cyGAn6w6158}%O^KR*Wn^Oqt{2VVrBE< zEaAp@?(thnFgNds+NK=4zdg;2n?d>0gu!9;zA?%9w4Aan!b7CUTgI6;2 zuhJ$|v+PFxWWcR67lEpb3c%{;u=rzQq03$8_~Os*f4dcz;nJ}q{nIJvFU$b@q-(NZ z1*zh;bu(iZ|oTZZ+JkSJX{@i@48;qfl5| zirfx|nRu6nBLcm0r0%(!rCpB3btIbe3|6&va0;M4jDLB-3Ob)nVPrxO(Bg?b9NW;A zBD;~H#}+sr_Znxgt>`xCxTI;0i1&_ORd%MH$zCMnQ-87VIj(lUB`6q%^A1qXyp=L{kJ0@%1tB${1ElK&1A#j!Kitdb z2+@)g32Ypd#+P5TIy=H%@+w^znS$<^8O20fKHBW$q#~95D~@+T!hHKa*X{GnkedQc z3>Uc3@@FX|Dqi@?4$a#+xDoElBK9APn+hhHEVf_L9;u60L!i#&92cdguqQi#ea#= zQD_UQ=RD!ppoi4&20ebP<~>o;$@b4BoxeA$X*x*7-bepr#rOW+k)&rD#Wj2TX&zS8 zyvi;VEXG*1rR(FUo75;KVZ6p{^>z9|w919h=Yh%mTibpnXEFsMyI@OpwkwZL8NT`K zT+$Nc8596GhSeM2JRo(N`?Wj7zlA;`mp@j<1YpV#0W-HKRaoO?K)&BBP|F*XY-BWf zo@7!}>Xx613gBOR3LVfFAhz*p#5NwR6@S$mT1{LP3o&%}C`IRIWEM{)&dFI{xqiNZZPIY7bVpOdS{S8_N+d^^L} z5h|AlaMnj(_H(youoO>N5l*zfa)D#tt<_@6>BMcPy)iMrGw=HZ>2*A5ay%>@H%WKk zc(rlEb;ze^K)qb=FpdQmPY)Vf?pz6Z0Cagwm;H<4@tY5-mn&vQmrio(Wzf^1ONI)D zJFP;5vB?LOi>=UN@=kF%2EL7`%(!fm^A9>O(k7l}uXh%wd+x!|8G6yQy?0)8=uSIF z2G)&4!krx^XrTy>P&Ld}6|h+3b6#tOpHRe}VyJ-)oK#~&6UMqzVR z+hK$Tdj9ZPCgZsCjV=oItCL9tDxk_!gH-6DcNUp9qzd9#B zpy=c7SZN)~7BlE*Bbc>{}=u*O} zr@gLGv?xd$s@3Nj z^9*)s5k)uaM9~di)SNad9=x__@lEj{r`~R}bj=(R{~(>z>JM(?TDkrop4n0YLQWDP zF-B|Uf14Pz0Em%olk_taUN5Du4mvOFH$u}WuoaPP_mMle}! zoy@DBD(HS^IxMPQK`N=A4V4d*P<_H|nyr~{6lV-bUB#5-7e4rCdAmkjq9m=pE7D*g zCo8vU?nMhiDoMn_v1lI*EaZSbPuU)RZ0JKOHf-?)%#G(Ogv-O78bkP>|}sxaN|$;?WfYd-P6(SG6yHuNOzXY60eW}CS7kt8~P!Pi;$vZRhYw$=UqBZ z%~a3uUx`h3$i&MI6{ga=$1GnMck@*m(o(XLCDon$2SEKLEu!?ubqSPcyX%H`&%G%q z&06&g$ON$U-7LpagvxU_Zf@^CQ6ce*4>(Uyx9f?E(J^6&D_5O>HQLow|7nBwP~jdML-+nYZ)qQ?I^A~sg`!3(x!6@tRe zNlH?qh3UUcmyl;C<67F9W$Y&vU=tzptFwIKPpSUxn<0WQR)*rr7%S-y; zt!&~ELyqg=d=^?tKiZe2`6~ZI@|jjJcEQlji4CXK;!@QfKLMooYlY1E$K{*c8D~2k31Fn{`TmPzEscSNd7F? zPkD#$t8BK6EnpXZ&I-Y-miZV5j>`AxKzZ3C=ZnS(!*kk=B3b%q!2|ph& z1$b694rDQN=8Izww+eCxZf-Llkk|Yw5TiaTDp8IS(F&_VbIC7PeOZ_u8$kptR%1TH z(?Smy&3dW1Bii5$sVJh>6TM(ZB9i5Z9VjIBHEzOnzPJZx@ik|zeZ6D-HD`*<-%_ej zgv9%oo2-045$Rli)a5-ei7h%Ex!6}5 zo<+CUccRSw9mH-#OE_%k=B~SG0HK?NIZVFZ=W&hoJ8*^Qrp#;xP%LT)I3yBFcq|qt zUM*OC|BJoh4jbnG`LliB&GASQM{+tF$sP8?TTG_f9F(bF<`Nc8+>X65XMXuO+g;`b zhF!P}c*>2q)%A^gs-AIpb@4#`g%Jv z@pT>{zQU~ERKOgz<7DQ)J%Qa8;o6C3L#jCawhZl5x$Gwu{>TqXx4#wN|JjUu{$&5( z&B!_8W`q;}VNVhMGXsP9x)~8oE~s$+E~b|viRpc-9!D@HsPyt*zQ`L*e$kXq3dYi8 z)8KmHa*>G>;mB}Dyc>`0 zauk0W(&FA`D9jGgvEH97ca)dNCjDt?bHD{WMO1}PiaP3l zW~aOBkdsw)^OhapNqT>fPrzU_eY80=#Yz1Mj9-1=M(-`ZQ=VfWzfyFf=gjKZEHr(w zI_v&OX9GjXloy5j@&FtiwU*AGMpTOx?;`nFr>o{_S3dtxG134rJxXMoSbbjP=}vph zzvv#BhWnnGYngUhp`QsQp!4tFm)>L5|E(#JFn)j}N|N>S{_vYi!UGo>PdlAa|3F@& z)yZ@a^26l;ZKpF|s$u(yc!A9I88;O!F3Ag%GA`Tya6j_(Ef6l^TObcl36n46P#4~` zb^!c`wd)LPYRjVf6jVe|kS0FtR~k)|TOgY-_M2?UiQJp$636hY}V5L%>n zLJ>mmO*%vfEo5%uj5_mt^L#V@;XB{`bHl!8pR@PcYp?x*rGMTd&{*N+^HIGNTj>w2 zVdTp>nKznh6HoCfjcjaa578sLbex`a0b*j({gx)9`z>2NVPbQD@d^cPRs5ZB#!G5Q zjq9k4vjyP!?pKiBN8-4eyA2MhYr`XT{Lx%M&HdbeZNB!5!0V=*zbhK>ElA4vS8H{+ z$8oj2WVz7b7fkG4>y6Hf_7xVI$-jG7T|0#sggBlM1t`c16D$Nb+^m42diu{-*nVzl zxU{M*#7{rU!FRPlI`CPX%B6lPs~n?waMm;f6u!KGm-Da2DFqImB?i zzI#VZv3LCuI6c<`0aT3FT=C~%1Um|L*ABRxTpK{8)k%^vK0~8u6sTN zYwTmf^?HbHR$c(s>spJ}4`OSBF7LIh7A;qr+)O`sjg;f2(&%&P*h6aURZD`C94yr7 zG1nhmxx=l{yY;?OUdK7H;vo`?yW-(4$5DNVwY+;1CjG=dSl4$y14aH|c{6R78E>hZ z6^ZfR;{G5f;*%+inulrP22X1Pqziat2K=rJy2N;H!V+Jz@X=Vo{qCwH$)h{o!7j~{ z9j&P({@qmVrF&;3?a#gT%TgN`ayH@0a#GRBw|y8?RWjk+1}X*-i*>NZse3Qa>FMb= zXVr$aT;t0oL1eq2PbZB;jnKZPLNpdfiS%B0Iqff2epPcYR%d=$%xaV?Cg_^@L|@w+ zQx+LR&SBKrN~k1w%6+j~WIykIC~?Cr9IxJaF%|_JnAJB|0ABqRO*>V_nqKIKBn=SP z!G9N{+7(B+;VtF4wle;mFdfi?U~o3E8mJzVW%s0-U6zQ@r>GBH``EPdK0KH}<71Uf zX6LfBljqd(+&bnI;c*n?h^=_wD@2UiuaaaHsJ_!Y@0+^TaLi<<{v7Xi_M*CHvVn>b z?UK!Ca+O_e5WF;cGqb?J!T(s64I}3rJaVN(!SUHq&g{D6pGzmza(_`#bM5|5S@1;P}iGnSLdV)jLYyT%`~sROUYVuGLVC=wmdQDgSd21^L6KBf2ELk2+(p zzTe5%G>N@+Sapqevk&ARE4brzCW~c}6zB3Gd&OWw*I93FaXrKOteSup8fdnnTYqK6 z2X9mW%Gl!NMYpAB9wc?q6J74#NmZ5vl~?0YpC2rNO$tK}ULh^H)rwjdN;?taeYRcG zZc)mRw@Yvd73$2?xLoI1V{s3(&Zm!XdAHY_r9flx;?lkvL0KFx1ZU}=*&TnrTw{{P zr$(d$=6&B$Y#)*XuCEP~WiT)~IHeH~QvZg@g0XBvk)A*6HR5>M12-edoJGhda8RG< zv2kU287#^Arl{gNmW_RS!Jv4sX%~hOSG1)nVmY8m!uvqV9<=9 zqF%QscvXw$ax zX@ho0=529dcuP;|+cxyIjNG;=ERl-AyAT_p(TFD8j(w}l5aa%Oa~==`>RUtS5!rED z=Kkd22|*hOjbvU(X$MH27x$Ao%Rlx7YBM|_mN^RmqSF9A5{Eo>>ZI+F zVv@SEKQFTI7eJ^B9taIQnm&;Hp)s>|i9$-1;%ZfHCod(b5b-jWU=Mm4074u4GZzzk zawAm{R*0N(I6qF`OE26`sQWIh>~-PKibhMWZlXnx7k3j^@a=P#^0p8bpAca>{B?$_jGG3ijg+_iY z=zr@loFo5e^VuxftjCX{UpgV&zP!)tAWUS%0sGxprO0GlCvHe1k?=4cJBy4vA(CyHFy7q6rAAm5WRO}wpZl{FDZVC4E@!X_QpmGr$H z=K`ItCX_`V-~~dQ|DFkV-8%7p?%1p<|3g2YB8_^$Omw*ZFJ(E_lpB(!1~@-&0g^@j zJo2fDlSee?{R4qQ+W+1-Hy|X4lc2JogisrVkP(omQdEx_TBtlv$jjTOUy3DRu7FF~ zNIwt0Vk)4iqAAwYC6u$=S~dq`e=lwd-7k647a}Gk^J2NaoHJXEUK^)8hhu=^{5zTI zGvdW(Q**q3>m}FI-oxDLQ<^neY~9EE_hi6q5&$2E5AR30;QjlL_&b)93g_pZijB!a zU!{2f^z+%-XU`d_<0U&zOL9^O>|AiN8Cr5O)ia+f1Mg#-kiVo;Rt3>Hnm~(BQ{|c` zE`6)m;;7#QIO;bT$9;&UCb-)}P)miyQa!a0@#$_MO9?C}JuT{GBmE@!=!?W7#34m* zBz>>2%?PMRR6GrYsR%md<|0J{B1vL&xLyq<8X2_^04&b7jA%X`XQ%5`vi)eORqEkI zsH2@OKx#-v$H$D86t2E^7K1*X*(4th@6>**5)_IQ-|iW|0&^QifcVA}_9>G0SwiD* zA}pN```UHXke-d><(rTNuif>V8_CB2eyz@DOcGU+#LsNapIy%Ke$l|Vk;rA){MA6; z2SKu$T6x z`&U~c_dcE$f&q#gbwtNB-3u*Jb&YB=8(0>TFvkFD0}puIs5P}gI9$$3dF}jNC{QX<|l?Fge!~>B9Vj_$6=q=mA&t)U1 z(kSJq*&!^xZ3frW+57QK6O7%l${5%d*hb#yJQ9Q+#RMW7b{_l_BFTSPHr~LV!TWsb zoKed+pXU-je&@k?-za`To?fWE|D}gfZ|oK7C8Nnmr|pBSGFW0ASeSxK_Iwf-Y=n2@ z1O(n+eB(r0wjO^#`!{(GRuw{2iTeo$8Y9V&YuhpfB`S+Z_8_YW!xbb1Lx>7v|Gcs@ z60+7^geq^oaV>_8Y9C#{4c01ihwxqSBPs$2w8TagbxZU93XR}uqdXHkPN>QY)yX|s zgT2y4fvKQloC1SFBG@x3Sc(AmduU|d#+fisl68v3NbYeslxQQZa`H+-sqjq}9GW84v9D+}5d zS;Pqwdm1-%@>sS9CjGo}rh3OWmViiz>fVaKW=dfqD2U1Qpu#S&1CBa98@`X_+E};e zd-8=ZcWvM)=XYxJabFsV`FG7nJn7k`&srS^X#;R@8~d-6iybe=e;R&JKy~J~IG)&v zjIfqbq`GCS40^^wgzTzJO8PmOkEbtnA3Jq|OtF#>($-?XF-17)MffTP)3Z80I=C`v z8As^Nd{oTyrKbl{Jvj`TZ;*<3l z%O=YZNvX@-L?p*?qwa!jrH!!~CPW#B)ZK4kwFr{lbN|3tG&Lft#fhcM(68Qc#|E4P zx5vV3J?Z~4aR0OAf#(z*Uhs3{7=h3?v)KS(UhP%lBw$BdtL!Bk`>Eb%GCpfvnZa4A zqNmKxW6I2wIDJQOB1$69ha{K(!*Wc;dc1t_&u>_3fEov?+Z_pXP7_Fx@{P;639r_- z%_5G_gQL}6UpJLmaWQYQJP#0Q*U0dWo;6|$;idGuPz2MN_O3(llEnpK4jOgaCbX@x zj%PLQhBtoBpF6CGJ2Ag^YuhuqnJQpqEXxj>NZ|BbNnQtZx&zDOyV;FKQ@Jk0M^rDg zc>Oo;64&9v->o0$Jk|caCmq;J9st70XwjSc{tZiUv}#=A>9v{Z?T;JC`ZDv$9_rp0 z%y0We?W^=+jF;1nK6{zRa^^}qw*KeN;J;iBkX#F%w`uyMF)~ea{prV@$12j85Q?k| z!|xy%k~jujgO=~-1$D0IgNcpSrRf9Lpvn!fH1vVqT%>*Ofb{TNWr(!={m1*a;`eK- z<_2*)aF><7w_Cd_V|yK7Y$-n7zcYSCLBM zThk)_Ojo7s^LM8&9o2jf2(Ii&sT7@3Pa_xtZJP!M`m8uCPaQ&63&0LOGA$VZlvrSD__8SQ)>UxTH+4r$`@L-rY?aD7oZ zOF<=h9y5mbyK3e4$Hw9IVzt8>yOaR;{qG<0-#uL2RKpqK9Lz{l;@fS_DhQAj&-%8- zeLnY0p#ClQyUPNSc7C*L0NHKVYDDIhlL2vZ0GCXllJ+My{o~wvH($43+TTw}snM;YzG6T8r-pWiSGYd6S zW(VhTcz^SatOO;io7*VmVd)y!faVSZjU_nRHg{i7}+! z*7aLhS*lj)JX`IVWJgu-UF=Vd2i#o~#gqT&D)pt#eAoCh!+7!w!R4r5QrRt{?ww#P z4#h!6bWBLFE?9khr-HgEe}}Eg^-N6-<{a)?#%bsMbcXU5c?;=+(FSY)60m1nVK$8^;!H0f2Z!YdT*GL)b4hT)fkMpRu7k z^COZrDCb_mmLqH}-$LM0!`NKyLu2r>(3~Y-ZSn#=@?nesY#5+n`B@CMcP1DaD!m(1 z;-J}gA2(r*4$QgNm6M=XWjHYmmk4zxW6pClets;n-=O#2OR=YUH?VR>v;r8a_mKOC zG(guyIov+<1Q(F4`~oqLe=S|}cG+>}q4Lg;%lr<1bU5ps%qTLJCVgZ|Njv2z?>UM4 zi zkL#Q3_~xu}O_QiJ5ecfkyKdj2B2$pReDv+x)9u-L!mBXyeUM>lUZak*{0+&Et#eRS z1H?Tol>Zf@q@*EkqB+AQvLLM`ab4~%bl&}$gnE<0;;M+_J;cTAuRWz0+NDeRIXC|o zk+V&OFY5MZHR41RzZI;jaCjCj(!MNb7C?G2pjdOAK=mwL8Ee#1^YBOiNn2Ube<|6{*A!o+rvReCr(kc*h-blhx4c7@9W!EFfErx59j_)x7|@* zmp<)HrV{1WMe$5k4PM_`N zl5YLhsxPFDL#}QBRaaN=yCsKsobaF#eZj^ z-!V9QSS1U2Mfs^ZE?@#fI^B9-d*FphDs^;=G$o{R^p#~Kv9R*J#`vX#Oqe175BW0+ zjv|w*&|JorH%&Tnpq00vr$RDHu!^L!ZK$RQ1+mpdt*2Pj9>w40ng8*TdlEf$5Uor(!UJVBs9S|jNXTFfs_w~+Nrop_m&gNG06MPb^~ z)#-F*_q`aI#^UaTM>*^Z3B0YZsXEhD{`&9r;C^e-6OQWifb40B7L|-ww)IaO7 zb%=OACD&`3l(@@m?mLS$L#s&&-# z#qEx#H3kzzSGEOGB&?S@(+k&EOFC4K_3FsFC|aLs>L_8SjIKqSoZctasxavnP8xbl zHW#%WeRrO0_-!;gcif{ve;Fw<1@bhz`fAsL+ z6&^0VfO;g^{&j=m<7eEkop8>he&d(ez+?}mS-It(DBx!8EY?e{{BCp-z3p9n0(R|k z#@UP7(?>O<0L)*q_ou1PUxxL1j-U;F&QapZOy#v`t@dp8d=w@JNWBUq{4dhVb2s&b z-O1*F6~Wv?&&XopHMXW_Rw+b_Lyr&oi{3GJZt+@*xuTrJFwpHk_i*Xv6R)i#1ob;y z1Fho2M@khAR*sKLY^5nRlFhxDBR!?*+F2p|oEtz#-NDZ^(0U>$aF(GKwx~PzwGsU5 ze9jU4&~=@AB{By-_v)oa!rDqUV}_o*81(A`?RnE|8gq=1k*ty)O|bkl1?u7ZyPxF; z)5ilr8?d$aYYof}9Ci}Vy;g|e;|3-bzeS9XBSra?6x9ubuBS&E8HZo#PcPhE!3}Ir z;?cr5I&B3UEth#Q*wd*!lo90h_zGi%`Dq4iHdH}j)Cod9zJif&TxxHr;(|2onQ3p^_F zf7cm9IQhk#EZC1B>F0U=TGb582jDMj_KyJu@Z;L_=O99 z`C=$1kXB$*2LpMDIP4|-Qyt%~IY(=$8LsWSiRzTwao;n$l7LjAM*_s$ux{6l^GHhaumdk0oVb$STZOFKtcYi7&?Ol@7>_-a&M=NQ{ z=q}zN_SaZR;<@l9TA(b)%MSkenY$6x9pm^DpT>=a2=Pbd_;B37oT!Hux24o?7n}Ez zZidTe`PIeLlO+R)2u#$~3kx*|5|&Q1xEXrNXYbkDIW`>8kqox7LEIl&G@pKo z8(}2P=T@U_rSk%8gc;@`9Kub738$`z(-ABXf(jMK99P}pk7WjOG1_)%JTjrai9@PNG&rwCfC56IZ4PhSi* zu&rocD~%rHyz>cN>iE*Jje;m`KtDh*l2601PpFS`8{(gHC;+p-8+C9*?2f@&7@sa4 zsbUs(1CT1GQ+vTn$RzHaZ9GzC|86vbT&oF6vLgSR+75pQ^DS&M|7*zVcv*8@uZAnd z{|o7TeTa?3Ljtr|YY~ksLv(u&}V zFdDwu$GNo@Gm3GvhX_k8FrP9xJ?t7xzyjb@EXv~IP$Z*J)DT0k43@mE#-8)739Y2c_m1!p974vZ#gO)#K=akISzNO&r8U3si!#O)_;C7?>;e zmzD!?Mtj%J0!3Xoy&tr>6sq7023vW0^~1VU&-q4R+7Q%FFltxV6(r)>GHy22bZYw= zfASVn(zC%R7g-Kss8sTxyDU0a8APh>pT8_E+Pt>+!y=__8~&6#f+A3IQvTYLmGD&h zHnm?0Ztrl^9A{7`^uKC$o`I1Mn%gw1=}O0bhtWrWau;>ZG$^WIry=e5v7U(n84PHL z|F!d7SG8a8hXN`3_7FDiilyX=wam$~NH9{H$J}lk=o6a5Sc;k>?Q2!ta;8u$ESY6$ z8)=`Smmba_Z}z*7_PF&uVm_l)6u1+j5U*R37{#qIvkMeI#$ZfNZ&`9s;^TsVb1vYg zw$vByQGZLnAtVpa`qo@MDQ+9a{E^x35r+)Hzk1g{DZXNS_{e0hd)xNZ^BY%;RdrMf z+plSY0qk`Km8cbFPvV~2Eyz_w~Zh{zIU&t9%p^bBUK+} zyZZ?VL7j7Lqi|@?FGR90KhQVGN-@sVSzaR--k+XIG{wPw(Km38Wwst#x)ZJ%dg7Dal@>$M! z@;iT%ZdhRN$Qi%S(4iq>@SL}^*{+xqg`sC(y7{O&Z|SIU6Umi_aWqbmS!(CiHFJc* z^6C#`)wh6@IDn?nPjhf&du(9Ud;=)-xc>RSHvPe;NpMynu?z$cf0w!9&=uTPX(1b$IQH@`6A@d( z2^m(-52Iz;(z?p5{T3`tHK4r*rHpB3qdp661D1URpQFZ`7Aejwp;?MO1_Ej~ouN>@; z;ggUuM$e?b9@+Fu6?)XFJPrx*UVE9BP4veXb;bsHn=j=lrbm9kw069BuQhA6@?I1~ zr3uX_2bOw!g~N|L;lv?-!{4C@IYqb}4>lfnBIribIl*mcTOHWz{ffhD15aVwf=pN~ zQ4F16KVNAbu~A%ne|z7?BzFl&oz+>~=ox2NtCc}gLH?3y1X4NfvjNylnoDTjIx0mE zc8KC3RKQZ)lOVT6>zbqciRI*(*32pv13KV6-kUAcv{A=hgxQn+9~1#Vsw3feCMvnO zVXocRaB}o%(-)+gW2A}0fKklQ{CtYP)QebZ+U*&KoJ!(bQ$`o2mo8SH^cqXv4eqXK zd3mG?v^oXawEdZvvI_%T)%mfET~2y{gGF)kqE&>?7UgLz;{hK>kI~dJl=p8}_zaN! zj|`CKLBdf^QNyOR!&>8`s|rJ)7j~a@Kn>K#b~=H$THVMTQ4JO^X}R34w9FgSc?Eip zdr<_t7lMmvcDw4O)1#k21`e3V?~j!ldpyf1+GN|CulXwzf!`kx;7oEl;rR68k4P4r z1||zHBhTHteOLc>@h7747#z*Qh_)d%*xMz9boNnFxeEXh_t5HZa_E2+8~;xLuoe0e zv_CipN>N!;ZZd@KUF-EO9gQeyk{qk5~j5*=Tb$)Ee+17mo ze<$mXAiGDmIO&&P6I^<58s8OhkLSe3*E+_3^o&m)Q4Kl3#9kL}^ZJ!a5qV!2LL{V> zrLb?1K{)^!;Jh`3Hb##6ErX`iHG;dLgx%?Giw;^_yn_<^F$z8|og!&Q?t@doT{W2V zT@^E&Vyrr;-y9VS!%{+`4SdLfjThzP@!V(SCeBgU3Owvzro_S&l(;2sv zU?Cz-zZtsUdLfg~#t;kI8VJ|p6e=SCB(ve&7(GyT6AYW({$JK@d(!UN*OMbF)If%oRc?AA)0+_G;KQb8}-JzrwB zh}R)Izofh+D%xN&l{SuxexxsKN3djU_*$_jK)P@$gypCW@R%fQd<^rS&u|KQ3i4OE z)|jxhmPfs_m3RLMtN*U{zRhAAR(!NS%CnIx8Uj>lg#ZL9>5mB1S{(i~KjJFu6804* z@BcHV53IQzm55m@`xO|U;}@pS#VD+%_P1K#=*-oV-nXf9VX_QI{e)uP(%e>{=GkD4 zDVsbw)-YXOXr+Diw%hbOSqh~zt)2P?+TUL2Ocan_5=D!AXi6s1a!-}=BJ&)Hu!q+M zRgf)}iRaKBY>OC>uklru)?Yl`88N~eZI^Rn4ik%16@?QwPs1iIKy=L1+zp>)^Js0j ziXXhRpMP4@BGT!(!6V-}J3>M2nCOX7xUD57ie}TW3M(@0i0rK|ez6)F3!kNHHJ#_@ z4779Zr=J}icirdW%xj%hfmO0asm*R?YU@U{WjVO2{0|S;oR8x-s~yj}@^>;NxWM@8 z(^1)|BlSub$q0CF8yz$V*q_dAm=)T5@PzTU@Fib6TctOUZ74Ab0M;Xp5<*6NKq-IT z$I!ouhxVRQaz!V9prGkgHLe~r0=A-8UfZFcbsY(7-0{3Cp~+8&C@B8XFqys|rfv z(s+G+OYpP~KVZ`J))B{k_^YZtZ1B7RtbR7dSCd4A*aOYlH;9akW-p}|=1&ooh15JgCE4#i zV8;rvoEqm-C4@WDJ!Q6Giyd6LN8aaDP(cJ~+jakVi)&4XDHjZVqd zvC6GTOVok0O-}B^5`>;bRq3t?a!;Qjor9Eq8g&JER+`~OQ$gNn?|@tRlRQubn)!4L z*K)_e@aM6f`mxS2f`}?S_v@Hvh;Rq?Yg>;yNK28Huy!4LRYU@0wi;|tuBmv;_o59o zV{yynGcgy_d->Olu@TEJLgmf4c{l<6)VGD#cF4vijq zyD_vCv>Yyc7RBmz`(+MeCdFkLY0wYO7B(RwZeSSEDyQHHk+F=s?S*Zzmh;Mm;b_iG z--@Ozp+UCVyDbqLt!45wF|1&{8@YU%5YMTl#u6fx8c~xFwE4N1i&3bq6ze$oT*n8e z++Gm)ugbXG>4Z&Yf)MdY%qZRzF65km9~UfJ|S8SwYOgTwl{|}gWOa#;5z9RWybB+(U#f{S|-;` zSypv|)FUBHH}&EsXdj0#xq{CKC$8xAIn2ikI)mx8x!BK)C=Berf9%?;y+MXOo>XSq zOsNdXYj=#q?9{d^Sb^KJw<6u>MRZln;3GN9ipIZZ`Hd~X@**lsLz+i~Z=y|?s@D=K zqV5(cwXx)?(@uLQF@r-4nxLWPrCNUFk87;^lQMS9SF1<#23~GA(M{&t)o*=l^_VH( zyvJT@-91;zwQXRR(Z0b{rE3%As3HV|i1yz#pC#deLpsj6&fQvnXgNp!rXyCw)Jc>V z^l~82`oAxZ|#GlLmRYV<(izU@W7;M{{aWWPuE5xrvGHnFqB#ooX4}5 z7QX*mA=vn&E0@S-;)&o9zNlG+vZZi2X6N3=P@Q0%$ax{yiN_-cm9qS$2|0U-S&K7~ zC7jo_Q`~R$He&`QMIfbE*Fwcr`sEAIa&x7AzLsSL)hAm;f^kwdF){oC{CZNz2-Q{P z@X1^y&e0L$Dwyu-d2^|SD5up|jkXNVCzr|sMh+c0_h6VM?a!c>JbIRQ`rovTaG1y) z3YJUR?B>NDbH92C+SBH7_9}YPvmJwLMIw|RJ4`zJjhn=7p*Vc9b~s9GOZuJ1!sVDx z^){P5(!?(fh5r)% zPuZ13Q_!0q6J=<0?kdFgT&bI$_e{2oRX?m{`Ow5~YgCC)!5nXGu4GjJ)>vF;2BSxy-Gs^+~IDOC2P(QG;Mbdr)_0Rxwo^6 zes>Pbnt@ABqbcwEk)Zhg9KN+L6uolJwxMsl2vs@zETRn=rU ztui@k(o*e$;i?Xc=pfFl+4tK`U(2gio;$1PiX)RK*I4Fx>jh@+m(qoGuG|>|V$Xu3{iSoW+-+LrDN3hKGwz*B@^c{H zAcwv#kljWVP5Sab?&9wgv*kgn=8C)&fWIDet6g|>b09iql2~oc)kpDhf`!{cDC^eB ziGo_(%nceDBU34NOyNFuLvxSbni+o zwbZgKxxD!HdAt6(=kCm&duN_A&)hT5%;)=bkS@IVZb!}A;AXOOEG+xN3~5v~!TxZr zGit_O9%7|v=auL@+VO5QWdrzR*nF>P_&0oqgk_k%4KEHAE&Z4(e5Ra7ecyi3Q$)z{ zi&)h-<+RyB2CVs6MG`tcPgKusw@P?J+J{fl46V-q?okgbyQz1k+-~_LY)?;1=T*DshkzgU$EU-&=g) zDyc$7fPxcR*eg&DcUgE2Q|^*LztbBcWVGWq;#$s?Z%OibFB_Z#Gt@hjkz5y{;%4Gx?9!@VG z^B*>NZSLy7e)Qw;g_D$*X4{yKZR(xTB-=#v7GzcJY*;`dWX;8@G+GwJ)L<|1QHXvE zYPI1qu1-X&zaxQm^zGZj3;CHqc zLvF247rxE^I=nn&WOYH=bkYfZs5)ID+`S2B#T=SsgZimHnZJMNCnkLlTE*z?1S)xO zbexDPhwOPQVZ;TTKARxw_Nmf)D{^#xq*b#5_rxh**NyG!3f*--ieLA!Dg?}GS#7i= z;md&VLvL`~bYzO?!>~HM$2}Srt11E)-8vZwaXoxv1v*x)S0%bqr>DRW$gjvf5!;r4 zp)R6fV9jD`_hs5`<3g&~caKqVbo8mQUjNz1tqb)QJTu_QUPop?I!H!;%h(?Bq}d7$ za<7X#6KFO;V;Qv-^b#las%!U>w`O$H4n0fvyzg*(D-h7074SK^Rt({pEPnelo{PEf z){mj^r*kD66B}HGj}ER%DB1 zb_OF&-J6wXE^*Evm6&_6@2^ewKUQfwfQoL&b9`er@n_!+)pZ6FpcgA$dK&}sYZ`mu zm-&l~IcK-})qZO>0rRb85hXWlm3-gK4AlAWZiNnDUd^>^;UzaiZ41&XtZO#6q#uU& zz~jtkX@z^p`rZ?)#Crwf_S~Fc;!w4L#(9+lcVRQ;K!ky1gzx~Ju9j==fR+|}A$!G} zl%;)Xlvm}645sf6YQMO1ylU$js4>IU)WKhh?x>#jPObem-d`~znizGDnl^30%rJt% zF~Y(5gQ}qLeZM}q=e3{R3?94KSKb2>m>&A_>&W5sy$9do_;2EWe7R(15)T<+36|gX zwd7Uw#}B%m=A+WQU52V6-3;duA+PX&V0+6!Rg?JK_Ryf+T(9eAXPsxHYOT&m-m%zY&!L?6L_O)%fl| zrxX7`fIB0OLTP;REpkHpdUa=JfV_o)?X<3!00;zMroMzcU7+lj5$?2%r0ZE}H|T<`=+_ zt|y66v<{bfj}vpNfvO5%**{v9k^5q25q0J+`YKcRMC18J31`HhYQWEB3$_`2ZE5gN zu@zAAMyrF=#3B3B`$yz~flqqnL?Vh}*99MPy{I?Gn|PM+^uAMYvrp|kT5Z0;rRu*6Sxg|8@}Q0fB&0g z#w2#^U_wV6KCAyh6js&TP9uA-IN4Lt0EP^{3T@n_o+L51w{t$OFW$T<${+T~lB~SsfTlZ<9+5Wy5XGsS=qxitE+rz3_8IZFOP>SVc}0 zc23?kv8c{o!nfHt>+TN^=6Go`dDjG3V6JUmaa)5%p9K|B=;+A?=dqLNwrjz?f-X@V zN)23YESKgVmf^t3xR%sBBo~?HJ)EKobWdHK_lpL8eoG+e+?aC_PTr1^{9Y(hWA6*UNgH|-&Fa_O`F~Zt8g8ys5RIMzf1(H z2f>5x224MLU#K2(=aJ9)b?za=W_|X%O^J4h@aijiIM+YYe8)J(A7oYZ8glJyfRxy1 z2YQgp^9|wzh*I!AVB6t>B2YBUeOzld1$6wz+09_vLg zD&6bQRta#-t@z-}7d=|aQ~jG+wj^F@o905pT|WQ4(_n(s3cst3S>EzP`t=(Xp4I&P2>AIHCKE<*>}amo)C=|loer8Xz8&_ z@wb1q&vVkO<6(Gn_HyLF2R`&nU8mRR*li7z>D$N-B5)-4ZuwR{bp}6ZKjV-6R_Zdw z3Omj4Vn&*ns#ca;aO!*o9H)4$mudOTTbR?rT;MC}x!`JD4oN5Sl<)_5ppp2dx#~(i zw;#$$ogtSWn>XT<*E~oWtqWPg8E>t)5m!#Mdn^&-%j~_fy00i1-)*r$%;11`81^+9+6VsHU6h@B zr=!ikHnuae-0H)K{xEs4{k*q6F<#ihxV8`v;03eMNeJxvbtKogYi}b$ClU{1z(f*ubi~RJn)c&+RZ1DV&J6s15Fvb56auucV1qq?IvUshOURS-Vd`=Ma z7O+jQw7nzq?O>MRTYX39huPUI*H<-Ssew9Zd6Dn>qs2CP=mN{fH%D(ObSSp)pf#G6 zD2IZMc?a#tzSs$f4um4(?324~yfO~*EpH*DNZ1xfR~?2RZ<2pFP~&_gUZGg0TO@>?RPpNpd6JjNw0?_ z^Bet5#Cl7w8+>fjZd@ZkE{X}!F<%he!AQQTyf5Zo@C7Zg!vS1t!y6K}zqdrflUK^5^ zQJjyFJ-H2eQ}LV=uBrmoVkf^?ao}Iv+@a2}E_b#@uImNE7^fa$tiUIM+bwfUOGnHin zx+at|W(0)NrMH|FHV(v-$quvutJ}W<67`Q;EL*Ji(WzR|tecih0LXd3%;2TDCIayj zG6RBeouLiAyS|LhcGT1l9Y=zj#U3jvh0=sjfnqJcHrNq~hU#HV>Kap>ygSm)>^2`D zUKPn6Wt24Pa*qtLJ;st<9Dj4~UCMV0&RAFBI5jYcP%2 zshq4XAp;;oco<-8t*ar-7cbX~&vz^zHH{OLWoLIP@R-7#X%5@xlaI;RudXglC-^m- zCVFjG;yN{6Rl;#!X0QohY()h+o!UNIdSbuE;p*xf+O!@8vsG(n@s^VKKf7?}!JB*O zTcg0NP_crPAbt{oNaJ33+Ts-kzojqG9;?3g{~n4=OKTaD@gm6m>JVkj)|ZON=8mrW z<~?%a8@P6?ncvOC4V4;w7N<1MG!)=p9SDNm&<}Z^W=n}{{a!?E3^>V6sA#m74gOJ6GCgGt}-=#6W6QI@5wfHvH!6hsLkcR6S> zyh1An!9|?P<}@b$0!ivKlQWGpni}GoqG~Ai761hAehPI~#tx zII~LzFA3`Qaq;IO#TmOF3||Iag00xq7%V>{OOB~z&xV80xIg2E4&Mgx8UD0K0o_fR z;{SP+zvkp|h7wpXeR94m(?+Dp>Q%TP?=?YSbRuQwdn(?(ek_ltFpSFwT?1OQMdLFS z{xJ4Q+t2rT9yB<7C-1G+p7i%cpY7{959oe!zTOe^hu_U@phCdr&I1_Hxq(_3=g~?L zZx+~^eCi`)eUU&9@Z&PxaiT}nS8%RWg`;fd$YxdJ3;xaH9dDY|bNvESihSmV7RgDu znol-TV$)2&5Icp9P4HvtRm0cHFb)I`xuK-uj<;=ipmEImLbj&CTs!v}M)S~8G8BEr z_jPOq$((be5-vTCX#B0z<0PZYunY{R{c~ew+{9zqMv$bJ8Mj-~ldqZrk5i-s4w(BY z2c;|?+GsW(Mabv*M5;sRCp*=1EVX67rR-i2$1P6Z(|YUq6}sd zG|e2m zkB#f2@~xlSdGprBu%H{CL@k(Q%>=jQHf^3aHhnp5jK&6vaR*R59OA!Q*GmldU+=)J z>?BZhF}9QlF8Wcn*+JgAR?6*@2b-hEkH8Etn>wQ^kZs;|)%sIl!+O@U*oQI2`Ye1a zGAnKgcfknTri%pQlje6jttHYelgBCsEi=c<+8r+2w0*k}NZbUNSJ3o|K#y|NX9C$d zh9|SeFS6;=waJhC#zysHQrsd;$P0hmIRB77ON%#9-eO)}%Mu%L>9$w^6#mTxnV-L& z7Zji{zJqNGpbkE`)UAG1zfF8)y^?BVG~%%SMEY2E$9oqmRkdS9qDQod!U2lr%`X=!bqrq0E9pNFtTCN(JIZ52TvwmZGxuisV2NyQ zw~!(F*;#UQ*vUg|F&Cn-R@4gB`kE{yj!XHe*%qsHEY=L1urHIt__`#NoF6%;55mJLP= z9h?e7#3NfYuBBZmBMOvoA^e(aE3w0R*SS*sr^+rl1v2<%BzhxqT4%2ona8)Y6i>b{ z-tVUeEwSv>rCpGPh>j&#O)TAYr9JNcu&a}u^2t)tedQW5X{V0+TBNVX0xFR9X{ntL z2X$;usKtr<#FJIZn-P($5yltsoEB||X;NxNj0>i*9@};AR{W-gMmCBaVx>Wrpf)1P zS7t*;;Yym-Qk>NxYR2uKFLa%@jE!0oH{~q7n?^;L6C++O;6SnM-lZ6jA*;QdQg+}9 z4T@CK-pS@cHb@S#${t!Sho}Z0ix>iQGGC48bVqO72MDiTh?QEkLlt+rlIGy7Al`{Y zX8M!$6WV>UEt63_$lmuW>Ip>a#ELPh#V0pMNwZ>zo7LY)Ij}iirfG%MNUB-!Xm7b2 z5Dv)s${lb^(ZsiJh^SlX)^1$shCE_*GCeRxv=>Te&bOS&UkPT)WGdJDxGU2?O;VlSD)YQfMl1rj zS8ksF61!Bv)I`_%fX6)F7Q0k0{rAzLdstV5r|{Wr_9HJjp>jN6R54D8Mq&%W}1(M8agM#ut=bf%sr@7 z7z$`|c2v7g(wB!R%IR}IEsG@x@m`N(25=gP28J=l4BZCc$PQ&8BG5sSa7A!a4P99J z$DwG^{L&t{Zowtl&lN!!Dz%LFPam5(TaP9Fz@v>x4O&yRXCLeeF&w}y8oyv$N2W|C zr2H}&oA}U9-h6;+7`j9Yu^WZK12zpoAp)!Y#u?^T=cQmKde^pmWI`}2eLdg zTl@xg4-D!OeX~MvFan!U zP1$#7z$74)DONP(#hXF|Q|@A5ccMinOm2JS zB^6KOkLCc>o}q!aLzkmZGo(xag<$4s_>ICXoVEGKljlV;&=U4NUS$K+(b-}T|M8{r zq;-(d+BF5(!=!^CiGPQr8WTuvgN&MfRqq~0u)Gpq(wX5EXO+~SJ6q608mCN`D|C-W zo6a~X(ltD=TdC55rs;{mha|Dy_*ktv&b_P#_mpF9m$Fb;yP&_c_s8VP0*&|kCP2;7 z0Nh|E1*=n0tHM5;aMp4_G3Ajn?OBv*d&-CQI1$1TUSzokf#`o4sJBOSv%V(?8s1>!88h}8Yac8>s(jR@LgUqOv~;ioAS^-fxiOa_fi z;Rz$Z`P^J5Re6#2=#>San6EON%laYPIw^c$u{|i+)oOX&F(Ym;2Q#txnI;{R_}sgG z-`5rWa7{u2?u(0x@dV}sj96zt$$PTxXz#(ECcLP6#_`W&MkdKSilpR+eKaaQKrsZK zsQPP$k^ZD)EHX0%tA>lT1Y^!fZi~&czO+eWj}vaj?&D`>6a&u-BD^&5HRcsbOz{_) zjyJ%>hcbZooYJLhY584|uR?*D71t#~`G*zMlr|?GYk1fDwwpP| zUGd0CI66&_bh)EQQtCI)^gnC&wcQZfHZwyiT(3ln>Nm~;*qT(Jc(jmTnBl9b3x#n! zu+r4hE=(ua8**FR^~s{jNbvhF`a3QU2{%PLadPrW8jiVludKc4%x(m$yHhIc?;D!H z(1NKCE?p1CKA^R-q*k0c!h*p-@RgX^dPWxNbt^xfm0c&BQ1L8};weJlaGPs_Hy}rJ_SfgB zU_!O4eLu1y-!&B=G9yQ0g)MsLrWyZD9>XnRLJ1gYDcXO zfXHe@B(uf@L(q}d?|$Y)uGng8>|16!GAuAZtJ7zjb1XZHldazmbt8bq4OxGu^Ee6^a5PFZ zJll)zijLfe2$Ti!-m>+?2S^E?8Y$593%waks%N;hs|%+++cz#6pJjgdb$@r9!zeYi zhUJ$@8!}l+UQtYZtF36doDg$90E zRP@Z>MOcUyLGNz^;23{DWO%0NW@G2Fndxm&nM&0^_bwNC-)>;Iv|0w`20G0=mi+I>i&Bu(Z^(VGb1-LQsLJi(X znbBREC(2Xv4CE2VW+zC4!*!`Vt$(F`+#pw3MGz=TO3*L|Z^jK5e@Z$LB;F@t_I@8P zdX96rV8%`vCWivXXp zC@O{|$cq?vpNJz`KO@GJsV8=m(DUYLL*p`mEc(x7eC`{&rxb_Zb+!gc%g(jLRM=gh z&rTH4_xLN~CFzP^7vLFA#c#QXPCGr24OiVx;IwA`8d_4_wBfol-N0{YF4;@C{h%90 zYU*r{S+RM9>pQB z0mUAk4Om09!V_#@(TfgC2d7?@GUMmT!vGCJI>s z(K)}EVKowa#$bfSK7JCEBOj2Gt2}(V_o!KPFI&cgBazE|q(ge4gofJGzI^YFyYoR> z1CY9MUBxlKPHbgnh_a-R))&l6D%u~#guLZZ(PlRhIS$W%`@D9t80)<8;lqndrlFKb zCj34+>bxXal1+ZU@*3O!lhExxGtot7q2xjbx*ZLn)w zXi>n@k&nE|KAFI2$U}~cX<@in!dU5}1wIvT25$>6wo0e6T4WUFid>`x3;@(eqO>+Rn|v1b&Ajr&^6QF5;#|`xhYmifKpY2 zjiBM#&Tr4JXQGevOP7JiDa_U_kfe~%mCrZRS9{uyBSBiq>q6%03fu7hJ6NICyIkrJUhd*P>wsoAn--{G6lMQOt*bL&6*Vq+y{S zFi4@uUO%Up$v%0#OhfEhU27O&<8cck4$8a5@0)%htf6$WIoiz=d~$5W&*UZY?+UnZ zCw2dhWWhpOGj99^En0#1J6g0Wp)L3YdbK|3KE8(**>1n@?q>Tgc)Pz&_@Q(qY&6L7 z5v`h+EH~?F^y@{UGC-J)0#MW4G|8k5+$0PF znAz&4U+QP(b_l}OIjF}n?DC7#sMiwx`h2^{<~q{s5!duIQ@aL~6)FvD=#m<$pBZWr zGowEMoemrq18x<)r?tq1H9QVf^(7sDXBvaU7u#I1?jMJx z(pX3H4VNnXbholcj8S`iqN-Of%{oe=+bX_$Xr*tF^N)AqNH+s9x2 zEETkJr)4E|r)7nFfp}1GDlyEG{6(8wGZRt%t|@v7$T6w2`v0*M23(j%|L~;}a&P(){wN)w|V? zd?^uS;QFI|2ioR5yR$S?bJ_KUNzmXdzy>0m6NZ{Y@cKq4x}{gSD(S)EjPD3;!+|g+ z^78F+`?EuX+?xrAI%3>Cue1Ah&F^FCoz%eJK^!mrFDQSPFy5z5pySVHetp0{-QX7= z*7>lOdm{IeH2q!xo_?=oPEqV*I4zV6C#Plg4}n`wPM!uO3>G-8!%m(4B^&?m6_tN* za=2bbb>8;bY3ssLIAIy>CV-7JMdg)&hf7)YgY{$ZJ?&gWcqaSq8O)cfVO69C_--nN z`DZ5%?s9@m8R$T;lXm^=Yok6tHfPP&`fxj}7!HxzUklT3WH{ zLri%|TBHx4bW*68eyb{W!uJUR08xOiwMATN4PV@rcsIejr@~Hl5OIojm#tCNcX<)O zEpH(tn}%xt^97{u`8x_VU>=L*Z#4#D_R zRC2%58QUHIPF7^w@aMPl(-aftb#wvUi9 z6X{_Q5>ho6!A5g(WH2v81=Pvq{`y$=wf-V=9d<(3?bz4Aj;|)y*8o@#l17bK6*2z{>Ixbcc%6ueD5- zbP85y#Ic{!M@P^d4ST)u-u&UQXhP+V?33=iAw}ur)X0}yBw9u<%R4nSy~|2Z)YUeN z^8a}S{-UbcBAgI+(awzurkkSK8es9f0TFZYTuY7ib4G%jpU|MU?QElw({F5SMTFv} zGD^5hKImo_b((s1o}f2d2>VC3TODXxY`?XVh(?6OF43Beu@)!Unr5uUt^nmpvR7lp zDwdyqWy*UJ!x{vCZsdOje$`oHBV)Wnx$>Q)+Vi}z7l{k#wml}K6FmfMYJR`xf$ewQ zT=A;Y$wno0z(pl&u=TFyxp!Rl2Z<6doi>-FE79LbKryoAsiZrq&u(f(jewyFl{BCSrb zYl>&#VMm?d0TD^VW@M*F1L!wb))nbasIJ5LuK*}a(0%466aWWqg~7xma)j&`wAOp8 zJi5V{p(v_02wls=l7_ooWi2ii zppX#hQ#z~ovu$9PC-KbzbA&@ablI0|B5a=sK5^x9NPijs5=zrm<4Fe8uNrHOZSZt1=}8>{cV7>Cg6zI!<3HDLu0ohk~ie85pvzxhp-c%Ym;$5x?@yxMWQ2w zFm$+`Px+*?=@#Xaj+kv?n7Zx-jn5;A_pgRMJUnv0ix`OiK%yZBv_In_+sf*@PJbGi zPSRZtOTV7ihhbn{QsU%4Z|3`ro{;h^GVfQ52$e?p&ve6|5-|zXncs0XLO3`HVFn9iR_ya=eQzY5dX4Twip zknUrIVR)Sj1m7HUWg~wHF%(_Dqh!J`v^}0zq_EX1Xq^oAV2M)w;-`&<*NQbht54{J zPdBA0C&{V#6JI|5XiR5lPPk$>Yi_+4s6FpxE;6qd4By_0z*0S)FHOoEDFLr7j+M|? zXfk#y?SK3Yj7A^1#)7XddYj$!qR>dyN-BOD09~7oJ%B1 zbAXy$iDz@I7(&8JaGcFZ1;iZ7a9V;ryEc0rEV9YFP@>@``f|+Y=#wLX{)UAQOjOT1 zQG#a|gq*9-V~=d_hn-)MD#{#D#4!lglm-C#!TZG^62V!9qzBng9@X`RVfF6+y3FuG zwV#DY>R9uA8glwcD-FXWnHN$F;Q6qdh$iW*u-?)C(&U#dtKKP&zSnLWf<{j-W)O%2 zwU`eatAN8&0;Nh65Ii}#BgzHUrYo}c6%+zj7((tTqmk)CV5>nJNMQVE8VuDs;QQV+Fe@pb=B=_qL+*Z6bwLmtX5qa zpTYUZU2#~a0L~w{f|9oz&uYj;D@*l9>ycWmL=|4i$R5`&rR%)w6(7JCd!Y6$lfm@O z^Cqf%|3YqWuvL!;6Ev-Jt;H)o%rDZ4jCXP5U9$?`&YdnrN_o!Jf)WkAB9MmjS$ajZ zKDkkYzPO~lkqOacMe${Qx0_%q{aOOAc}5?)D~+T409FbW$>Y5dyWhZ^mU>V^u_AjU zu`O8VPP_ptx?(92k$y+$b|&X}An-mh{Q&WU{D?RZ{GJEP!(Ov&qVa@ z#8g_gY&(gYbE%p1O?|&9c`JO$`W?{5@=Cq=;6rNHmuM9=e3R_F))1xChs3Ck!ZB)V zsc7?@AB*9~y%RnyX)~oLquuG$(#eE(P=)ku!h#TDa+>ka?B+#h_6MQBnJ1557@pOc zaDAcOmqa%xlJkIb48g_9q6$yc-R0Hrk~a|b{&wXu|Lr&R+~q`ZaH2cY#9P=R3Q{zS zm3r&F+~)l4nIKulu#oo!Rc+|qG}5@+Oe{}cFEMu=gy3q`IHA#K`3|bWn7;9}+{@t>c*FTK+%Lq8!dma0ItIv&n zQfupZt=Xz$a;RtN+hihm0FmP<<%>@SiI|uc5Ar3Jq*g^64J6+VN#-QUxG8_|SvQ}( zsfw9$_%N;}VZMQOmeVg81GQ9+iClK*mAv|{>Rqn@y??vGCAm(|R+NxR43x!l4Sv^i znS!808OVMUZt@O>1sLY6zsZd5#D?3(d^~7&gg_k>asGX{qJ^n^)g4cMsta!M$9rk# z?uvpg;3I}Z%^7hP{p~Tz%VOK=p=NAcO70ddtgc8S7v7Xdc1Hw3o}7Y}g26YBkOF5i zI$znB{8hXXiJ%uW# zK`4*pMrl~9PY3n!o7%P0eBMhrJK^&&C|^g=S{dTWS?0Tjd`p<@!7y`8aaqm6rE=2V zx$y1zbL{EYSnMD?Vf?*r^%i67S)b-b%?6LuYo!$B z3^xV8j%}7auo``&-BYi=s=G+MP1=p7L6AA`eG=xtHcmt4GPjoMAzZP+k68O*Cem8( zWrAY0rYeKdpawq3N6ZB(7OgNlJqmxQsAjA(N8jns|~Co=**`;q?~zqh64g?=^v3* zXvXoOEKHih{Yo=u(;3$hhZI1(3y#2AqCyjCx(r4q8H3~e`Lx#E6yHWbZeu5y!J=>T zQaytDYKqJwt*U~btbC7Wf}69WVz}mwbd3_jLi4we`Z>cCl-5B)_iJbhePEkfiMvS} zI$G%-7rR+L@hYbyM$7n!4%Tiy{0iP$(&_xot%B9A1oKarVjT1qSk2thr}7{B+N^VG zAghD*KL+IIWX6t9%4#&?5;ASt@LR{MV;(x!`Wy=^v(|OX=~R$UozA7hUp1O`FmlzL zJG6Rkb4P}@5zuaI2nOj0j4}sV3W27$z}SG*G!9ZCYcQ{KN$b5>X-`~dUe zX#8GSt9Fu}LD>lC__O&7MwpK{t&%O9ZMW$$4pnK!>lJk>3Y(1B!rHZy6{0GxNcHY6 zx0Yi{=CcC{g}o-mO+vGT9ZF^0^XyxA)W93f;B}S0o0hhK*D|HrQj$MIm=E?#l)VwI zp9kJtA1iC~)~|Z1UKz>E!Gjwjfg@51olG0vZZIOP(ca9&Rve68)r?qu9EsQ4sr_Rd zJb-}X!Ab9{jgr&BA%$qqaoh7zjtGFK#fK|nE!r5H`IgRi^{7e8SH}LWZZq}5)+;vj z#!Xh0AqaP6BQ%?aiSbJaM$G$t^}hKaR@_lmpoY9Z5n}R`{ZW3{z3L>02IFOoVfoSAaF5#o0Wk}ZX( zFzc&D?z-K?NI^jMOqSE2owFr3>qCId-c(7a&{x-ht_S{URqwMPo047*acr_KTnNL~ zkTeFljaE%2G&_s9V}ojQjY=85jsXiBsGGheZI57lcvE9YKWP_gcZ^6gIC4T(RV35{ z2mE#@X5I>;4>(14q2onab7zoKtu_sT`G9|laQ~B+Il=;SQXn*Jf&c~SGqB<5JQE3S zlZozDlkCzqsv#B-e!w3rgeO0qSc5j_Po9i_4O}K!pjuw|%rrfeLuO znh;zgB|o**0A9D`BxP1ff+G6xV;u1}SAod3962w&o>-%0`Tzn?VKc%FmA8grHrqK~ z?9D?Q*rjEI{1-;-{KFmCtpY>Dwj}O*8H^K@!>Z!3hfY2&Gy7c zG}I=l`k?voCog0>@&rW^dh-qX$|BP9~)1_O;7(6BPLis_=0;d zYgqH9Q>R+OXpn5DxS}nA(5f?RsaBGR=5P^bmCvXjKXoGidTUw1%9Sb7VlLldHr)cJ zT&YGbABW%+o_%!b_Z&zGlH$O&c^UgsXP zb@hd{`sb>|m5f(cB`R1!J8ra=>Eu8oKE512dhQy)5z(xVM zd4;dbYbWB=4mi-<4!1K_k)5E2-DK4_TX=dH%yg*eB8H{$v!srnm?xmtbZ(I7ySq%& z;&Z*;X4onLXIA$QUnkx07&OghqZfvt-PZlyJE{O>OO8SQRwreOb0bgx1-#mYoEYQ! z42ZbCiPwQN&g^P!{jAI|RQ^jX+Q&{iZZG}m0=;T6*Dxkj} zpzze*x@-8?6@ZzF{3^q z<4g|zgZ?63f&4kYPA)Ys{qQ}?FR`vl3^}de61{(IVg7^+aOXXkkiMS(DAx7=vJGNt zeEKWLED0~-_-9GhJZeNy1Srw7WT$W#yDrg*UTQm(2KQfN?&Iex}5S*=Pyry)s}eK)lHCp(%LAmy;O+e0vy z>zPirX3AP$T(MHtXEdqOvfm(02>@_DYZ{52t(VMk$GKlq=7TSxRiNC5v^Ic7_( z^#0*n*?TSC+;%*ii3h%ge9gz5W~l;UbP7V?vFvaR^H1mIsqb~+#aeExu~0Rb)?w~> z!JlHa7i;;ooyEPSrk8YpX^(ku2&;~cIqcxx{r5m39w%iJ@xK$a+7t9 ze+vSJ@jQmWb(i7gZ>$xx(DVy;QhUC{VUbFD0sM*?LTZ{HFxNo!pn`0mAL}DQMw-S$ zOljas-UYA!VdpdDu+@$>>$Ai{dpFwut|?KCitB#JwtL~&%xz_X@U--&<8CEPv<#*@ zt+$XtNt`IMp33nCgqu|b#e5dU$@VtR_`_W06;6llgt1D=I$b9G+$vq=Q#mg82ONID zhjeDX1W_{Sc17i-++DV(cj90GjLE*n&9Hypda-84Llf8!e)9Nn2T@WR{2hP27k{8z zWe;>~dqA%^d9!5`Z1Df^#hCNDd;W_t8(nGH{jKj3@;o5nGd3|NeN1Q;+?+4B-S7Dp zDa@R-Xz1o?2W1}{vNsxG+UbKc#@zbv=_=@8X#HXIZW*;JyOB9wq*>vt+E5V!M&ZnO)W!fBTRB(y-=lH{PHBVmwdiJtnMwi@o1ayQO9i zy&k%!E=`P}pwNi0)qL!OFu8kd_fr!=QNPWBAmeb3$_p_>I8mS87Nm8q%YSaLr%{jE z_aL1L#9^Az4Wq+Lvz)%T^C26mv#?AAiI^M;RLtugs;n6+#tTe4pRys{qDc*)#?DR& z0q#8g z6$VK};--I+-qn84RL*|TWe++am3kkBLJ*oqTJ#*tQ@ZKVe@kj7&zBv8<`HwstmDCg zgOLvkpT<7um;JjUo`1V>)}1>s6JPd3%Tw2%&-}%_1(;x8nH~ zga-g=Yfw41)CUjeYptd9P3KLzckfJH@F-K5Fx~eAFBF7wPodwJp^Bv+HpD37nV^>J6uxIcl&b?R!)~ zshLKz3W(YXvxU_r|DnL0_$BRnX}XR)8sPHd{6X?b3?OkuAF~+E|7y#!-)uC z22{jDzN2gV38;pOqGAe(O?2PdwDm2U8I0sHQ>Ue(c;zBW*uBrraT)tjN6)Bk`Y61u zUvknsEwq`mlQehmH7p{cj=Oud4l0`rF6BI7qbDjXz@uSvPQ2uz8^pg?sZ`szRrBml z_b`%mcl<*cznl$*nmh6UA@aF`r#Fac*ZaIOT9f#ll^(A$Vs!9@O<~4 zN#V;e^minb6kif*8l#H&{y6{tWkWl~kbgdZGH|#e21s|D%yQTZtjatsu9!ip)M)C+ zbJ5Z_H`|CVC%EQJtd%)Y^Jt+~sW#wUCCfNd);ct(qB{w?XlCDRnmLnCy#3jsT9U;vQl*Pr~in<>RR{9le@Egie*e_H*ttUeONvdKG4ljFn2EYMXaaCVzMn$nM%uSyj)abya;tGt-|J+^dpL7vc7QC7d z?ggbi)s@4#w8Xu)eJf7-Y{E1(SM#(10bNE|5kQRUS>6xamQ{?3_%g4H%T8#;yfiuZ zh%$t3gqAeD@DDVIwjf^gQe&-N4HacIhGhY4-*bj7`s;+Tzsufk2Mo3qhw43(6YwQG zhTXkNR`ICg&`jTFUWC+vZQibOLa=v(LIDFUx)Vryyxqe~*NpJ?abgjU8{K+Vz6Tw8tq>?!(hdvK%E_7iZOw$bYvUcBb=7>TH_-CJwU?0 z`(2pJxYbU&T!_p5?BLLV_abr6vlkuyPsmU8(l%6lUl3!z4br%gUPcE4zad&5^)YDb zhMMcFTuMo2R!*Ux?e3Pr_Sw9VZ9K!U>|rh-FC+_os1^;SwKyXA1pUGnC^FEMWV7?U z_@nyE9p}Sbam``{icW?2e=?Kg@N$CE5?@3#5dcI72I#$|Rjp8iwcPNwOB zYgXechK)_vw6?;rCF;PY1%rb!{$0fz%I_-h#4K!a@iHr3kyc;{GU){Px;5k|$8#Qt zwz7!ER;9-$zU!j)R+jg;dCU~0hu3ZyyP2b8QUkl7;Zg{p-WNHI8R@Jhusvkc6vA8U zf#JglJ$b1F=qZ!lY+72j}CCYLN zfNfKS$r03ap-15@S(|u8c{~%_Mjk5n?6uKZUDYfViRrPN!)<=zoi&`t5wfXc7Fzs< z@YCt{ZkZIS7jqMqstjM8~qex+n|95(HLoB6Lf#c z2>T08MJpC5I$@MU7RI7_9jkauYsYJh`)gMm;v<{s#D<{7^Lnka00yZY3vgeFRQ{Lp z^U|`6sv8+&IR8*|s4L<=l=vx7N!c!H`L4JQPik(dAP~53^X>p8Fh{V7_kaf&h|hgc z%}L7D{`qp%z@y3?GQ;EkHEhY|=%hrsBB^Y2pW-ibe+ zT>|3eHa4>9heh$!7Ch(Ln%5PH+=|B!(KSi#lh$JAnu5E~%nYZQ`OoB;O3xg1FZ1vj zKLbyXdONw(f9+xAXIt2}wg})-<=+l`wMMMOpA6y9w-d#ibvh~zntN(~u<4ljj6Tz` zhJ=VHG@NTq?ignmc zl^|Mt>e!6!PsjE+_`VYSuFAQ!9`DyN&*gGAe;lh~2H%47{gytRX*4dapo5(*fHTro0L_F~)Wb6czdDJ-2 zCVBG{u@p`C=3_pmRe}IK`E-UbHYk#yFi$H4A%-+(f2;)lee)BhXHjik{GHl+bhd+p zDrw0QYv9+AK~9>~fy+2Y%i(0MyNwIO4c8qX*dW1dSY+>Ndsxz$9`r7B8o^*TPdHta zd+f>B?3eo=<<{|-sd{I96M(s`c z_cdKnL&?2^ zP(tf!6vdE}2Pf2VS>4>Z=SZ4mbKz+nyQyzF7Z@J>4 zvPVhZ#6zsPM0YK0v8Ilw4+6;D-3C=sw@W9dd~(k8Ul{}D&JAj+qRyGadXAp%3$%|t z0qb<2F0Pn_XJXJtAk2loQ8!81YhC)8(06#P@K6V>H{30p%(c|ei%VyIi`nQFz=v2# zoXv2>(=mLBixZq&oOtbWW7a$89e5tmIJoEW#NFjB6GRTP4rQ6I-fm}`dtkW#T(A9{ z%+l@i5x{xf9EtxmgdZi(?H=Fi&;dLe!pJPT>(ujFZ~fiScYQ+^TExmb8Y1Fl9d_~6 zPp}M&&U%CT`fHc^2555IODkW7zY^@@f8p@K&ks-ZkROmvxHgo_4VO`Rqn>%D#&D9~ z7-hb^^A=%285b>}s5-DjX{hQ8ip7rz+{L_E<(_Ju&;T|aB_5W=v9kmgNK+w{ve!?i zLUR#xvR@Ar@M^{KygkW8nSV+b5lA=aU2$ysl^|%y^qniEe(Zf&%Jt{^xM9Phoh~l4 zr_SZ|er^baSvNfdf@?00ji4R?hlevad)PCsEB>s1g{sHUPJh7BjO7dIK))*b7ei)dCm>?_9|O>yzrYWl5(a&LMpf zLOUF;+wM}msf9QO&W+^}wX_%IHud}OTR*Z7H^bPJ?trjd9e6JlZEj@zIaY1#7iXfR zHDuF%av&{+gDKof8|ZqW9aJofEN&)CRd{Y^czLePmeVqsMKZcobRp}OYoHkQ7_Pw^ zX9_lq+LC?ACJooYJ;@JGy%V$~P~at6t;n|+7<2a0b4TdQ$pC~YxuWGi*m(mJO)sBV zKl8A03#IeB;P%y6Av_gTY(|k;wELOf-cAZJ)^35JiL{Ia?7#IYp=6Gh`6gNy_O#EP zy^4z$pevHJv|gz_xiY(BysDI$I7`HYT}_E*{-K^%xUF4(O!@JbLnPX)sSrT2m=lD_ z($eT}nYZx_ ze(PhV(!;@2SSz&sF?-6XJ~lQ=DoXF6%XgLkl5o)?P*4H?NfBV_Ghbj#I-X@ms6W`^dyvyO=QO}D7FgcKiRZpZZRUj-P zE+if`$YEUECBQW3pAxpT*=e(8S8Qt_Y$4o=pGJC%FT7OuA^>bL!&N-j^vV<1YDwzd z#3jqJI7N_$02V5W+|T-X*)wGIa+7C4y4=*4EG!V(1~T7FI?99#w#@|2kH{7lGs!F1~} z&;Scs`w+`7=QbtiRds+XR~dlKrf?sMIhU5GR!tDUNH^A(Ae135M=R^`ah4@V^r}%{`2azPQauk4lXi_)0h6JqR)GUGhy$DU0 zozYC1FAcz%h{ZETc4CU&9m(@bnUIHkypQy|w|eu7zDSb5-CgA#p0MczA*UD7nt;z| zZ%xy}Nj$qQ_17Iyd4?p#QHzaFt;8(Ei3*CyUu(zT zHH(Gzty4*jn)GZFS{lj$5XgKUdB-;(B;d&!=ec{D<9M2}3&uRm-k38S*nZW*D>=BA z`mKCPKA|!&J961<)7cBVI$mmtS}_hc2ZC!Q5*L?r=d`C}YGk+T^mvM4 z8VR>`HL6(o+}0B1t5fc{r?)u`M$s}hhiI93p3a%{jB@aPz73%aDTEax2}P9)`{D)FG?(+%}RFkbIhGQzMNwDo0&)OLCgRpL}COcFNx z=DJ=tac;G~4s}YVl znDag)&4nidoG^Bu;5rvwNu37`bP+4S!uurjy*5F7S$$=n8(v2KOlTF%^PSOw9()do zI^+G48C=?hZEIG(PWBRQwjwx$`_k(tf`KNSrC~OfS9UQ@r2*;U%Xx&|*W^rXyzGN} zkt@3MeuB*{8!lX!Nn8>0UD8WzkxyAxGQLvt&n0FrJ#$BaUtASm8|mK^ywIiCGE+^D zJ7rgl$cV8x)kN_xa9G3raS8s0AwYsH(qt)`{AP^Jc7@RW<>!cglWk8<{gaFvZb*qm z%prhlMayWOir9h#H8F~>UOmSFtpH0eC*R!cCqn@q2E}wz0}z`c{dcXtp z{RrciTAD5-pZAzuITF<)J6;`lFl)Q*paB{A3e7mR_Y@*N=e%s zqom;F8S=XXDIPSPTp;FbGilXc$IC{!^rPF~pYO`__} zbR*vEgm}TweSZh4QT#>6{T^{a0^1yEX<}vbuIoZoI-R_u*l`BbujgjmW6TJIiE4{;K!)nWl08;3HV}w<1m&Y zQ)ePqVT;q}I$8USTZU(o&pfN^Uc#54ZABIpZ?yRykN`DIMeB(|y}A^fUwr3(o7!Ym ztp8?mS7y+a4pzZwQhpC(a?7-*#MsetGd+8jaFW+@C(@dTHV~{c2vm@4kGU2u%8QkR zp)nkX-{j64WwyuLw6fnKw8yh2j7xERFLP>l6zlfViPVn{LNAqHCF8+oHC}G1$VnS- z6*)D|4v4ox02o!t^s56PHQ!4fcf?xl)t;I;(|D>IrDDw)1I*M?#%gL3%!0%~IqrmK zA7n$T`$|NY{Sxl>5Q;ktwpt{hB2AMD{5o~7=m@jKlj(rsPUa(&V~H156m=FP z(C~~^^FI7mWr!vz#Ve?3R-F*jTL4*|Y&kVOFewT{T08>_MJ0sV&2Fhop%^ue3)fB2*O(@`xMO2#R-=WahG` zafQT~ToC;MA5C)Mw&Ku71}amU)?G75--jCq5|Eem&Bdg9?3q#uM(_HFDSC;_BnmAOKOW%B z9{wS<2Kz0V$V*rvQ!e1Z%yz()RVae~I@mFIDQP%`@f^-tU?qjWkZ&UGS@w&Tp8JxcU0kXbR)&k2?_{lN-#Hzc+dZ0AUn=*EN43#C)1%Ylf&p@Y^rbawch{7g zdNQeuv+e${Z?ouF#-S}S(z${$RR2y>m1k)G@+;wH zEtW}bjSeq;mG34>E<=$+9-|zPVe!?;Zf|VAX`7qZORIXR<7+TqA5mBigK6bE%In@d zg{qCL@)Bx`M(Td?>sb7+8EaYPeJf&G8cpi27Ja$babU;HGvbFcw3LVYDDu6PTlwAl zPs3PR&Pe7PCu&GrYO5z9I*<9g=~)1i>u-;!itJMG9fD7^88bYC(|BzqdG5ktk(rU^ zl7)G!9J3Nz!=mjp3Y{REi?7eIXSsx^paP?DrH!SJ$Y-zpv%?jjH}1TA?#wl zHRy1jHg?r88anOt#>fm|pQrxbL0!iec&QYO_s(#{$MGK84SQ7N#q$# zWI=hEtt<%w0Ardv4UYV#_1V5XW}F9fPPPbPPCHero%NjlJV+Tsh#<=kF!0p_IxCaJ zx|y|HHZj28aKGW_nTL_aBQzy_X8xFHAdF18V}91evC3=($W!JoLSWQoA2One({ z4~K4B$o1_Y(M#@=yJmwo=@{F+IidodmmtoUC-z3l<<^H@jndSzx9KK#2<&oL|MO4$ z3Clh5uZj{qzu=TV!NSKvu*XU$CkhAn+*1)L=9k&TMc9*naMY?Zqc$OXld&qoB}3fg zO6F)ghM{|0q~-o^*_si$Y>qkHkKbWeP*=7gVGY%lv|j~dFxHh=I#n<5IjiPYE>M1X zb$#Fzz%qcz>A1KFqHo@GM(&xYHKAwrk21CZ^-mpWiC+JzS~aS0`&G3n=6E|ShZuOr zv?hX)nWT?STzsh$D8C5qzj~5hJ%+>g?_e{wjbpjTp+Ms~Y#qS0BknIi3QLvlGs@@k^MM!sC;9rnDOcU! z(DXcTNjY4>qO+8L(=n^8rb=wv*`=IZM#}^0LAJnju7lgn*D5_6(JU^MO51ywca08N zmtu}G=J+iQruQD8ek)rlglcxKI+lu*rNW4*27Q< zJPcJ!^)bU=6pAsS{3_7I5s|e03uDHP2V+JpN^y)kS8gm}=+>c%)!b}c@+RN)lHLD< zVB6ne6F+_v2;^T`d;hG=i4N}BLz$D@NWcI^_!tU9{<}}!*o{T(i;54GMirGZ&$(Zq zjdAhEjh|+RaR|dg(RA%AG~H$IA|Aa{H#FT3T$+|vuq^gQayn;~jZ`y7e(0BuDVOaN z*?ohl-JjCansFJXv$V>2-3$Q#A?BQZA9Hk|;l;lfb5J?N?mv&YM~JOsirV&_Xvm7+~Vjqro4d$mAIjfMDmerS%4B0U42j{-pSnaTs{$Vh6gK+Ow z^k@Iczw91I{3=^~ihN)YW%j2bIplwKBQK^XNGeUA_NJ(<}2p0Tt%ig99{OMKqb^10+|cR&~7xsWytHzHm$p z_D#NpBVUd-e*a;(u78)HT1tY$Zjb^xZ=caZyi-LCEp*>c1+^|BaSgNzc#*zmkFuCv zyp?*L8rL0a=&gP&HznWN+@GM(YF!&wdw+6;^&g+?-)_2L$#@J-L=-oHSAQFv>HWVC z&X9-T%>5>8HuD&q+%udCh0LKD9XLj~Hdz-B&Z)P!x{l?)?p%L=2BmtKK{LmJI2!bo z;z8)J8u5Ayx>31hk{V8Rpbl)hi8_rSC%sIq!;u*$3&mn8zL)^${LnHk=q{X#@@Ul3 zXn1C(I@DC4zL$Q0X^%~2$f&N5IqU!k?9$x=Ke|^>Xd1(<-@B;<@N%d%$id_|3lyaDVI8$qohV@&ow7U=6A5L?hG18lyO7^lcQZM@OqH zzP#<2uW}$RbS~RDGGE|x_a=snR(ziXgfoBLv$E2YQ&k_XiI=;%Rl4o0)B9R(qTr`c zdcXhrxz>Z~!=eN@d4R1zHEDKWqa>qhY*^Ddy;>f;RM;YX7PaMf+2FRSkCHJJ>XI#h z@{hbCTdy^LnN`|w*3!EDw%8~Px5I<+qvn41kwBj|^kbu+8dH0W0iZIBJOb+}dh|D% z_g&1K3^^+hLeg&G7vvYfOo9lL>D_cUiTU5Lc9n5WM_u>@>F$t{MjDYW0TEC_q@nBx+X7`?mXR79`f8uRfX3EMe{ zR`5^V2P_|Lo+4#hVkN^+C`hnG1gt*=N@4?xDv`iL(+WxFQK&fSl1ZFdEk}+RX`OZ} z=KJO!y1z#EGv1F@i!DXpSutf_ zIk>x7rZTqbbyD6<-@&01re*Azmo}o#GwaWlqQ$h@q3<+_u3W%3V7j!~LM5ke*<9~C zQlh3D4y!Xo;KET&xr<#6HeG`@EkiojN~I|OQ=0Ym0natbrGp4-tSyA8Ot3Mvl7T^z z#ge_J>Gh5DM{`jDYY33&prUuh{l!rs8xtLLkDVXL~=V?G5?(tJCYai|Uu*qkYt;^qy{eJ+T-i`|#Z; zId0kh>$&xF_t_1aqJ#eFZ!S_Z5xX={iBhVyZQ^t-t=ZtcbaG9s%Wy zzTo=(JEf=6^5>)tA3x{JyTc*(HqR>I2W;dlXXo5m10%9}&m&dQhGA+|{MSF*FwMBY zC}(l_A*z_snw0CFG^i!)SHtFAQq`Qe`J6801Xa%&OD*M;e7-$#6X7aZ_3S`mB`+-* zPZb(VcGbBl33Z4Iw-6YcNsG%BcW{6qJ39L`7PAf=_+Xd!je+ZvRjVK|H_?VNz0Jhz zk)v&{X`+N%+mdM&`R91Nb!nQ>x8AD#(B&nLUayfPKvuv zT^4&RS5Xz0C-D5Sb*pLOl;7HaIi8YPb%jrbR;8*G@1;hZ1h)BlRbwa%Baqy$Tt*c^ zwi*G^r3y7yoBy2AZmUYcx?f6 zWXbev4ycDN9_eUHRH7Q?f+?NW-^w2;_$>Dc$Ps5Zxb%zZr|@+)IYqQdt@D7EEUmVHtqK^BK?1raBL5n08p{+OETDw#%Og!=09 zy(@$&h4(cB&*$s{6>lkHf(!GjIrKJ~24yKA>D}5}T_v<1O1ATzgzG*7@jd9BP?ug$ zh}1DtFwzSGmFAevZH~sL)K0x$3l^h?-onTQu>zX&O~z2l-%KhMR-e=h%A6=7=Cq?uz)Ze?l%r+4Q~~#ZJF36n;~d z5@07X+0q_(lA=qQH?=CZEov5DJ70c)t)jaNCwJ&iJ~p0KeI z0d5C3Abn6hTBsi3@!iWR_ujOew$}2h@m-MPyDpl#Q){=GT`J%2LQZ_RNLblCQJQpK zQ@d~;UTjN7w85&o7#28Jv~Z5yzc*=-xc}yR;!yFckn8@^LMI}68rMD8{11=@s#r~| zb_##6VwdVdA{ZuH+4wQvgK=by+Y65k`!p~4wP)AIoA|d#wq?JW*c>*J7k(L91Vt9u zy-7O7Z<20#$a~~dX^dkyIEcTKnYpS&--N#`PSGqfvo5Sjdi*#Ih?8}@qUncc-_Gb> z?ph<^u=ILlPm6K(l=R@1V^HSznMy_mrn#;ry9}vp8nZ%FDtWQ$Qy$*=mcM8B6#o7T zsat-cjAMlVM*86A4jYpwKbQ^u(%|Vf+yVT&`ZBGCnnu1waNi3hKGTlhs0YUFjd7qH zKNv-W7K?@Ytp-I=IQPZq4518{DdlV(a)U+4h8*f(ViMe%brd)DGS8Qji5;nDTAh+{ z`tJ^!l|2x3lTostjvWRsH@|mAjNZ6UdPSe9mNhq;X(vz7S={X#;bTpoQ#89)_D1n#1NKD&#{}?Ob(@LJU`Ay;mRo_^rB& zzu-?dWdPbry4g`hT&$5|gj_Ita2>7m!YC(9Zt{O~sXY7Ugllu`_)_d-t@(?3f7A9; zLr>Z?#Ou3Xyr0Qexx1i0HrDGDJl^}xTz#i_iTgl8{~?2I>m@MSFLad7nwwtgi;?yW z@kH5r+!rg264aAWlA88og_>a$WS7EQ;SdE+R0()qPA80)91k5YnaoBlH92K zM6Oe2hoeFspr&{;kf-a9gLR#IF$b5_);{8d{pslH%1Gdlg+V0B(d%&xi1R+qx}v|- zJA;YahAa5@L-|eX9yw~dmflQi;ZkKg9tc~;8WZsaUEh@f9N(l2JhkgN-ksAQI&Z53 zxDTa%wy3=Y%Ul4drO(ycBPw4|0%Fzme$(g9Sqh17^Oazt43j$k>45;_?)QUJ8@R;d zxBJ#{UN=s8to54ez3wFN1*uq7bVEfmFokZgH_0sCZ{VkVdnNE>hp;RAc!Mubx5C|# zipMj{I)pFOpErQ-9xwAv+6PS6=FjR06$t{cfxdwWDQl|v_Oq$n{jj$><7k{yMZ$dC z&1Xjau}1k=npZHouuek}vI*?91t;u}Nk#M7)Aq0Qq9U9nE6+!~sc)B+3^$To?b-d%qBN!pWI=gv7nnVf5i}7Q)^7-E1kSiqW)RwE7Ld80p-I{su!i7I(Y72u zkPI*49G+a|vdt21T)0M8)AkyHmceCeT-b_<7fwxRXOiCRl1r7hb}LHq;$w3C_LObv zRRbuho$xCRD)VtQi&5NuA!Ms}yYiiE;nyWKYa9S(o3IDL`fJkm^b4C}!c-&Yt_XXm zNhe#0x|duiSuw-$Vh?}hJ>i}1!3IxVzqg1n2ki&&g~*9LraezjYm->IqsGe8{!68D zBY}wKC40Lm2`Xepf5ZIMANtFEHhVWLrGv(6azQGT@9t1=KF%EjxlN=agkkNHt9M)tlAP;Qn_oRIXG`)Lgz?BC<6A)3egZ#E z3~bd+IM-Q*LK`bDD*6TumGb5r7KY{XW0S%qV;#nhYPk5q>F+3{ z);G#>KiK#dtyQMuC1*QSw9OA(cxKwGVUYx;Ocn8(t@;mBgo`*&jFRyjFdx0_&xqQtY_y-sgHX zICwG=n&x!vZBFJdM+ao|E(T8dzQIZ9e5jPBpUvXqKYu2+4ESuAw%C`l)$qdWo%J{< z+Q#ZDhdhobGoc>4p151aIK{$Pu;}}=E+-%uI~Z98v=wKwMHqjjxt|ao9i1P3s@_NA zaV|kYR&9?$5wpOou2mg^lJ#LGe*#9GV^U=5EMG8bId^EG2FX+y(e)I9u+) z3QFvU_4%r*k{~ugZz_yQ*W)IvD*Yz1smm5DTI+Wy%4abzW%njgCUp*f!*Z*xw1*AW zXW1x}64Su^REDPE1WAK8GvwfH;~1I#63ZhJDG|8uwd=xfX3k>K3<+wGDv-MG z4(m%B*uK9;EkgT#gURt4VvejX`E8hI4R;&Y&FGbSEq9DSga+;BZp3h7UYlI7XSxNwOqr(0l1TBJ6n zw*IM|MVtTKRV&zfe7paeeh!`-(A2u0`?K*m$_xx98S*vG&!axTR%)T=X$#0& zX+Fn_Sk(Jgv%bNUp}M@G_||y6GsBLk;D_kKiE#>C0yf1;;s|M3&G2b5^)5-(sYQCs!0IK#ug`Zwht^KaQGJ)*A)~m~bajpGlDs?x2feyH3`9B*~ZRCkhRw z$B4B&j{CTT1F)(xbFvB7m7(zQjE}1>iSFLyRPn)qtbc1dq5OvSz^JUy#J$0(VtvYb zpzeGXKJBO)!A_(_!rY~tdKR6lmc$X8of4IxAyiW^IgcY(t7uVc%SCUOPv=>z8Ah$zR>W2VRo9`b(U7|^|QIdPw_6fB{yF( zrNxt0roby6aD)}tqxP0ou6q1*i(U_=V165JP<5$OdZHQRyEi#Q0+#PKud7rKA00AA&D}k~w)56-zxID z$GuOK!TPU}r}4G-2Pl6k3L-P2AczwncFQsNe{H*2J^oRcilBolwX90)bzQ^P4QQ=T zn0t66;CU_G#h(mx^tq7VRdccK8e>a4!Ct>a{CBU@{bRvriuCb$D&G=M&TsxmX1Q=O zB~KFQcci-G=VmBRlfFYDwG2W~u@I_crFcJurJCm7ZM?!M^Q@p#vLM)DQ?bnFE6320 zfD(LLGg9qLn1rZlF=mo_=Z0#TyQ-Bg;UC25N$NGng|em4cP|r`G1+uKR+V|TaqDVS z6~YI5ML{%t{=ig;_nEVGc%$*cbwEy=e|xU z%sO1A)gnMUmv32U_>*{i0`7%X{%nc=fe8MD{s^1gR~l;lKf(6GO!isuci8UmMS|AU zLT3oDzdSnvDfYdt;OiiEv^>2Zpt-!w!uJ?!IR30nd}7I$heOa37+L4%VeZe-kWW3E z17)9}|9(mDvHA$`kAP4B4_Jprej-84j(hUM&qOGXI`WNm94S_xD$BWvtPi;c1zyw6 zuK>RaOzqoH2)zVb^*8RT*6?iz8;Y#5#FR;P@&Lz%i)uT5BXyz>w8y<%vAgE|h^;yx z+0>D~0F7Aoo>`VEj=SL}A$p-eGc;PW>na=?c!tEnaH4bfX2~ZY#4L9$@yea~BBjHS zk)rO#_OumHc6~>PyEpjlzU`mF+ynyrs&@z&9){=qsrGYMkJ@gBBf8i@W{IbSW9ScG z)IpWE|NbM+6N5a#BPOqT1rdx7ECroU*x(Oto*zSwJ4rve$mZYVw6?M_~d5fzE?>aI|t<%Wi#%C4@-H&D|IvIo9bz zlik`jCKIxuy)H44#<0y0FRP-`!x2ejsVEAEEYvh5#wiwt{)9tlZU4qwHNyJdE7d4b z4r{B@E;10Cn%g?R42zU$<95pVxLrt8H+MA-TH{np#A$0-0 zbwKR@BAlf_`5t#oWao0V?N7UQE{KYtL?Fs5+U-;gCi9V~qXviI${^tV$l#77Vgq1O zP4%tn(6_GBRgaz++r59#oQZdy>6v6Sw;1%+2 z^XY-wHh~bjIfqSZ&xzjKklq&?o;TV?k9r;dsMoIjq-t)hPa$q?w7Tvo_k(&f7d7v3 zF=K_5=W-mTWQAQuBOjm_P2gxsZKm-}(SYi~(t`ed3;jEyL+*yyuPPP?=V&MFkLh+z zm@|H0>odR+-QvgS;OZTcj2|k@4^HW&mK-1`nt=t@W)E@?`!BeQrLX-+3m7KTU~S2&?e!ZsA;b^beE(b> zC=^yJ+9f2K@X_u-ZMRm^)%uzx=|h)crvT8Kf55E`M=Hv?ZqENAHyTP9Z9E_by@(i$ zEo2sExK@|Fs>dj8MYFWhSRadDo?McUdZ|*LqX0h9W?U57?peQIAsQeSgFLA5Oko|t z-O2lZX@64fH@|f4g-gQDlRv>V?~IR>`AiU3tXxNPu1_+CsGR!4Z@#|&4JN&8C=5@O zPnF>voj&a}5_QJ_<#MB2_wI_e78VM_1I?$6q^Riu=D%V2|3U;>qg>9PO`om6i!>O1 zMdE(&3u2s|ze6%m^bN_$eK5;4g@-nkei$k~`cQL$^ZX~g5>oOk(DT)@6>@3DJ(GqN z)CVZtH>q6B-roBZO3x2Xo~I>n^O6! zlo>&Ou*dULc3l7-)s%9M<-2X);`Ctt3aZ{a7w%rlCV81x{P5`&`$2%A`QP>6v{j>0 zr-8}AjkT|^ZDFr|X|AChr|Cp#@eKA+2(>0KsNv+opRz*!bm!PuvC`0Z)zEe9+zU`Bi+D!d|p@z!TTxp{iez ztz%`WShy13Hl=d?4}T?k5BmIyf!q`2SfIa!?Ue0&(h~0~ zh*DA}B%QJ{W~bB7Z9fA>Cu*Zep`KBjj;{GSc?M+U15UKUT4JDkM)Lggq9XCXb_u@& zloH&?FYQN7WOm&9kUbC_CX`udOzk1NwUf{SyBkhwB-(eWl2hzlT9habZO-fVZ;o@~ zkG0D{MN}>#x<|n@y)N389gO3>fX9@fL^!p)E=o0E)9992RxcizwXBVJQrO2arg_!D z=9cAAe>af9C*ukYt`8xNYW2YvTwjy~|1_GsA-;qDYhUmOF%~*-5C1D|xZJ`K`BR(3 zi%HpMD1JxNCj@gdi#jS2?$oYpVefKg zB{xna&?{f?#r%G4{^~-FTNs64WEjm{d|bL#CW9jmx-MaHb@I)zG^G z;>@dFo^Ka@S`y{dti6J0>()v15Uzx#EbS%~66;bu zArwBV|Bm(lD*ty&}^smVQsS8*TXSa*!jc(2=| z_8N*R{yI!BJsu{ejDsnfN{!PX=ba+}(F;9-2bc#RVBV%%6f*B$huEWUgr+@u0xrv| zmC3_~OO}6IQU0}f*>w49;tj4!Cg=8_bud0hdBBQNL>BnKMN~_WN0W4T>R2B?FYi+$n(RWhRaaF*;{Il+&e_JeENZuXt0-dnxmUa-S)A4J>!mb|Ziqz=U zx+iT*C4d86b%PCR9}R;V2XzZMOhT-n-l`HlpodxadwrCSayaAVdHcyTqW1glM!mzE z#4hqejv1=BCRJwzv`ANXglG-X!$T9-c~(MSC36<*PvjpCQAdDPcx=sz73D36-``!` zU7FjkToRe`Ysvi|nd%h&(22ev9?u#7Q%0;ZW)x>so~=**Vtl=N$57iJpGzEXLO?X; zyBE`G2$s#umNm_~(}$TP|5>lvKYy`WC;1)3OW~f??)=wJshS+;f~`8jgqpB`r43zKGNEsUiv z9Ur$-a}5Urz|tL2Ut9Ca2xe-ZYihL~u`Pu07he$wIPE*|XI^dY)x!f89N`yrIKjR* ztF7>x3l)@K#qxE{`bP! z?FsSYt`Ih1xE%Z`WwmiY32b{{kzy$g0Q*-T<4Z;oiPMwl8z{zEuB}C-qq_PAJ6`!O zR_j?DjiR8O!@b&72{=u@C5wOHlFHZCjqNXRa93q737O;aKb^nOZVL4bl*&mi&r%#rjMXJ<02J?{)yUeChL*g2Uhv{obw$?7L`X#DavR% zfJtv&xqm;eU&UWS{Zz{Xn*vC`5|6?M~1qT5qWYA31h z4}1RRC}poLRe5?=V-sM}OSfiP9sa$pBcC98=xYCa)A2~h=H+=w1hy@`_`*(~Rt=Bs z*_`bdMcEB)Q)@%>c?0%Ob2R|kt$XP|TkHG=M6DnDIP)vmKb)<&$F7_i`e?;PeT51|9Hrs`qs1&>XzH>Vtq|GsyD&AX_;C)!Bx|mz1jSySMC-8Uc>x=fy0v zeeUemKiNWUilhwWcIdXktpkHcfvIdWKWrDXn%_>a{HHQhb=wM4Ie1{6Q7xY!Auczh$Za=*7Gf^~d2c6P}gQpg-o^B9=2s zWPzEkygGx@ZWEn_`d1P4{y$&M`loluk@Ak@N_~&aR>@S^aXk&a(oj_wnR-xR;a;X- zbAxN9uPO7Ejt6xvlqh&uMF=A^9C|Tx0+pBw?pn(+HH81(k1r=W!4BXtxOHu9H+up^ zv@=r)8lkjMCB?HVSQbqz7rTOi06t>Y7-8sPI767!pa4y zp_0pW6nlJjn~mD%lJj^1$E@LViqsoxN;0If-!d4SMd+oba%IOo`H^1!;F2-}*&FkX ziG`3ZHm&Q2OqwT{ABdz+AV&mon(Jirzx9jwmXR%U_jy+!~op@SI*Af zyH6%(GGNl)p`#uKY+S+J*lwXeJB_@6@8&7mVks^z(`&76fLP>0z-DZGpc)Xv?jR(^ z&#z+Q*>d9#5TkK}xBy2$xWCupa{|Se*RCFF*SYH9Eew$OX|D$f3 zg774D>Ptv}lQQB6ot#m^_51Ik*X)|KHf^0noHmgvBJs9$4*s=u02ZK@;J&B*qOEe_ z9oGHo^CjESsKvpp56HRs*DVm-sZNuHOR;N{o#Ot)Y4T$P`emy08ZYoWBk6cugL|a8 zf)8MJi}=%Tx?AVM#L+wUmrGxUb?o7Vu`WND*y0QRSXDNsh^lBbuVp)M-z>BL)#Hq4 zFEhS&_-7f4I3F_4RqoQ6ZeMu&6i(H!wzIpOa zHkv%0cneqaltAPSl>?}0J+A_s8L#a?|MuMsu!A&Mlik#ne+kR9PK?e!(ztG%_Veld zG0m)NF0pgFA?Qu@lvO2Q7Oid`Yv!dyG*uKu&i?fv&R7~A+R@KJ@f>kQ)Z4df!%pLEdH6ZenIOZdfF0^3P)o?=R^5-3{mo>`azjf_jdP3>Q3Ufr_fh z^cr#aumc0VIbr6bFr@J;X$t{y;cEA}%dn@bZ@0)C$9F$eB|qD?)g3z&NYVAu zI%0w2`>>qdU6ez#rgE7CXA|2@Z(lH%@_ClMX{;JNW5B&~*g($5rW+KNtdPAWtq?ql zyvKU1Qv*6oV+TZffDLcBHwxUPVO`s+p7}*Yi!MakuLQ!{lF-@CER&$xxT|pE0JM&EE3yl4(>8*{S1Of1>P=ZTGPs59=nCC zwxQq1AG?0d>rEDPW_2p_Adx6>YbCU}~B zgmd{=?m%fOH>+2`CT;NM{SWnx zxrpxFvUl@y3*GKxFi~tnbDjFegf#+hsYGf(RcTh-+1sxfvnH~Q(HQ3irNgSa^9e!i zY}Z}$Wv(Q(gRg|Bb@Ua~NF{Chw!jGUG67l#+SRKwI)jy+yd`6;+!fA(=%VhhnF`yx z>zgI9`zw#D3o5b3b*zuMJoEEa0Y$nzw{}M3PkBTk6_ESTA=a!Cll7IlXDP|a_ILv) zS6ck&Mr|^OiBE!OxRv)Pp_8hPtJQUENKBNdxhD6ot9ZdLY<{%KgS4vj80F1Q#7qw1 z2ue&``<=cFCIK(E%yqQW2SL6J)^&BZKB{3{E#WG)vhyomn#E+4uDK?;N=9BW{nm6g zsTyJC$K||z#788EwO!0T3r`Ai)|+TsdlL)YEu}!z4oML;;`&+ z@QQ?N2ewP+5aJlA5pQg&%qmKjeir2GSq>008#qJe;@HztW7BFt_;whi0G`0~OU18# zl9l|t)k={lNx63^dZGisb7(jnO<%0)S?+{!VXUZ@7O_@O-5NaJmC(MTbffc*Ou4^^ zA;d!?WTMYSsbSR;VAW_lK#wI}sD97};%rHXXCz)WO9>yB1~hk)9Ewj~f7>jtYIif% zF4ZhyCT>O7_f*Yx6K*bhJ9$kuk9O9pt>SM=W7CBn1g&B|eM1v*0iPf9^7}PWH#Xh}RdPMX zcCW9ik~~1ZR~G>*7Pt~yA6ZS?K6Ime*GHJ)Aa|`2c`JCnDT@jY-5Ne)H>b!~u@D=U zps-S;-u=|E*t<4V^aCqpT$h@{-j--8$~K6(Dw(1;HT*0;ry`ZDh*r;{Bppl5hF>U} zH&-y~gE>{a;AFR~P~Tp3G)Ca9W2>zm`MzoFMc5tkVxHOh~dE-UZ?@98KivgE$R=m-!?$E~S+rt-DQ;T%@RzWjR0C32ROVSG$I8nYH; zwvSP%IkdND7${T`!~d4>NoLi3^-)%?JeaSh1&amXlC(eQebND&im=@Q9J8{wuvCBQoy zt(bi~`3lyQ-fZ@{zHJj@9M?I(8)4_zc^^YXib61pC9*a%!_I>VY&HSc{N(C4Y>HVW z@l&Ucb>Bpv#BC@k94GcPAqANe{{*%i_5f<*?TAE3^Y9b91sdBXVh41^%dz)Hj20Pd zH&j!?a0xQ*L68s5*nSune*{&eXwhQ0!%g`Z%CjrN+3iImP|?^7Zac}#xPHspRfa{utWiPf?(PslN;(7q z0hJO^x{;0rmTr(nx?4hNq#IVcyIVk58tGVI?}GP!-u}KDKbB{9Sa^2doq6Y-IcLt< zQdCITSL~!TLl(6SQn}yVxpvf<$Ieq z1xDj8y4CJ|2byKYq(0^o<=Re!UTzgDTe-}I=s2GX$9IfSkOK=0V+E3RR}2Q58z zlcBF%Bo0{u6lU@DIXnkoG*qR9qQSp~AOr)Q984863cv#dxR!xz9l4cRJX|KiN)7U-dM8(E$T zS$fAAby5iqy_4a>5$l|S%u|G~(O$~t&Dt?kT=040woM8>I1<=PXW$}IFI3z6GB-~$ zIsqUsLHeUA?e+JcN@czUVtGFbn(k0%?bGXd3KOOUM5)8H%9!G;997478)kWBkUo_U zESk?6E6f>hew3{?yDT(KVO&^ZXPV_b5>K+kE6Pzod$l}PX+=5Ai`FcGud%kulPIrI zJ^zfsE6`M%X-4=OQ;~4Ayiwv7vz#8_arFn~}Qu^$yn$}ES_?`)UV~YG}X6jis3?EueaD5t->O6WKx zmV?R#T^r_tqVq4xTj{g%q=T4N9b@vi2>R9-5!Id|g9?;vR?>a)G|Qz!-@5xX|IA+M#R#QmgO3sl(d*8R4bp3-m}L(JN+BGNvgliHLq zP$Y?MCe-%cWy))OAVoVvEgp@?L!(F&N9!;lDVj+&KD1Q;#$@#DP_U$)K0|gBPAAE5 zGg%)rvJ`7Y>{g(81tTQ{OXb$44-16TC6A^xx=HiZ(rpNZgU=6KLJm`% zeC)VV6>K`{#H-sJK*_~*a4u}G%o}Ek$XoPaY!+O)ixkDn2;h|>X#M1#?Gpe;Qs;z$Z843+RV3A+Y8xV$TKv8Kd z)lhFUs2X;Dprh|l9@t_2*f0R+(#H@ncWv=C?P| zK1>PoYtfu9b#ZHpAGJL@NtF5>B6L2+hTzwjcdLA0Cg2zK>W2PV+}G2(G-AiE)-4*Pk;MH&(Tim9_Dxii*;oqQ(H2 zO-X0dr*l2UC?BEIO5x^yv1dVPKsmMFKJgJr7}JsDJgiB;y8Y}Z0Dxp@JW~F6>L+)9cV(fMLi?dL_n#II@T%$TyQ5s zu?bNv1VOjOwZ7G-usY6 z3;t34Z$vMp;6P-u?|p>UouKazr8Rhwjj`M5ED%GzTEx1;;Vi5y6Md>oi2RC()!eN0 zyF+|{UaZL5df38TQ$t?|4Aaml(}~nMOBdPvX;=_%gtWE|^p-MFrK-_2(xY_}(Pfy2}06`SpL<+u^0@!e|z9`?rxun_uD;< zG}j&)>RSVZot*fOLX@1xronzMIKH;0Kc4EAOR8i{4h}jxBdWKFYtfC0{Xv)yOv*hK zxFWmrZ2v#}2-!|mg3O=I53VRGvpOh!@+c~3Tr|&>C@N4>sGO9lPyfTfD~LGVm+3FtYswPWA5>io%!0K*^$47^ILTkll}MsQAKs&hWwB zn`Xh_jM_UoQLMaKoXBq&^ix4zePU#I>hrztGOr1?K$OxdS6ok8ofm`QGsoh8Aq!x6i%?w4L$rnU z!wCkNY)iFCPKCJnXG(^T&dqHlk0+7yX*Pc4M+YNTcb z(irC*v=oJ3kS!kc6d5me5aTs+WTe_}Fn~=y3^lrbrZkf7$U6)-5alaH23zS?<74ftr@%758Q-p0N4ApQ`_&pHS_P-)rF0Jmii6CmW%% zRu^}^^isOyhJCNaz03^?W4lZyTP%xW{W}nq!Nl{<&V?=8!Vdn|(Ai^#DSTj4pg|3V z=IGDAj!Hil!xf5Ud4XehY+ z|0NN?J2=<@1ZDGwS{!q9A_~N-tTm?_`oz7ho6wf!lvvuDkqFfJanU&$zDqePSVh@! zwKId6pTVVhomX!liRM5r=BT&ukXU^m0!d;}&H&6!1g$F-KH+|UqaJy~%Cl42f#c?; ziIi#$WUb%FySY|nItWlI+LvEzh*5KF#pwgBQ1w5o+1FiZnJYRcgh?0mIt}Q;-H`%( zyM4}now8$w-Fu*S4>4X&5CbywzIA0d5>#V5qb_2wUOVWqfBydwE!w;Ty6KmjC#HV+ z&Dg1m5eNBhOrKNC%`mng#U~@7hI}M6r}On~@>&6FxTsr|XQ9#34(`y*qzruLHNji? zW_ph_p|=CLvK0AO*oCblTRMcYrm0pe9HpA6ti0g(1YV}7n7NqJAV2`M5R64}`0ZwL z-RJ4k^1>Aw?T07eeq+((J>Kj<-e_t~b-Y*ow>d>a`EoBN}! zltQUC?JWf=+)xzHYnE7NiATIu+85>zZ-kbE)-n#z)?*-$1m_=5SVa79gw=i*W%;*F zuMC#k7|}NF8Rq`ty3~UOh*8`4J(JwSD%9sXWj<8Ky$H%dS9{z~n9<(FQwLN_4XAjb zTv7-chAdC6=_>HoQX$$~a}h1UJna8S2AZ*TU~8UA?P{u(4oARbDyzyrJ|ZRCv1GPN zH}FUGA9%Zq>hj~JWsn83(|N;eKKDflnmRK>rG3V4=qD1b=VUykX%PPMhpTZ){u0%k zA@+id6|BN4$v~JJ*jf(aVq1Tw%w7-0u!6G3o{K*^Wp`T36*^e*m$rna@y05oFM-l^YHf*=2EQCZG>3b4l;axL&2>n3K`M;70E>xE{UCha=sembBW%1C^@LSq13yK z{1>z^7P03d{wu(Q5EHJQyr*f&feiVLqPiusc&YfeE+B9ZpLSn2AUb%le|FZ*@#y#_7!Yow?44*Y1M z^{Oiin+yWL-<*wO@-s4~4e`@ttm5>^wM5ZA?^}3d?UZ&QYP!!Bo|8;%Uw(PLg7(Su zWItXnrMV9R?8~_2egKomi|xtAJw#{KUrJkOacjMzr^D99FUQ-n8K+()g;O{G#ucp z8Tk9XcwIUmCB3aET+%x*OiVQvWOn9{{1h;Ln?n7SVila$YJ|!* zTUn~1FDZH-M!-_&@^;Bp$baH5^)EXen7!^+ECvbqIe}kGyz3MVbx0ORV`ch^{cKXO zOzelK7eVa|V%eFmnVN#S-p&ZnuhgbWF{)WKa|rExSfPSN$IQDoe}Bd8cig8O$A z*i0&4OXKdG?iSEBm_KxWS}`!bU$Z+BwD*bE$P{sE$amLnqO^;UY{#ZFpKt-{2Y?d1 za?ivsY-l)KNITzerK^Va^2I8Y+)nU0?F;-rUJ(^8v3lJt7eWULa9@8d>xg&uNKGZz z!9VMud`1H?980ufG93I_$xU$x-SvElD@nsj_7D1Sd5O@U z)_SDCiJiZq$dLZ@v`n!lJI|Ia6kD}-Twb+-g~v(nHY(rdEhbrHtRFc zRbVPYOs)$MoQiE;6ctxJZqVclHFe>~I&)XH%P@lHh9$>w~W)`d&Uboq016Ai0f)L%GD|leMiB z4Wv)y>)%n>>NI#YYj!pngl+Rz5}5FdMY)@N&6kkhWjMPf0*itt25zG+A9L|GdXbgl zF=rbdp|hdtDh_*Mg~+NylT$gDr;LS2288{V6#Ts}f8HJ!E6slGP_ztdJ@f>s`n;6W zqPn9QdbIxK|9AVOV;w6B>&^no>=}L0Uoqbvp~5OzHY^UOjkG!Xy!SF)^!?tn=l8dy z9w2Df;YorH64TbWI!|PhY3Y6h0K=(di+V@O~i%L6M3dm)4$_`jgHk!^3w{$bx z$zE}SrsHZHR~qob)ow&}THNhiVT+fwaYy!W2GZ{r)qmf#=Ts z17O0W><6?a#T^!92XvGjFDaJ5d=Jc@x-8y5FB+sm)e=8rT=v zSKr#_ayyouTcF~6M)a~&sEUh?qmAija>d%6482XR8%SVSay52B+(x3aOUs_a4^1`Pvyx0|83VbXdtRr|Y5<3O;zCkKYx+_XBy%%!!Xpv3@52Rzmqm$z&hWQ>w1@6?IxB zO3e=@=}x0$nBB<0HcI!#+5AKQsDbd$`R?Ed3!TVXQ*FmRyq!oxtA_dg1T}rbhWS&E z{<5#br=h(l@4sEAd06{#8prh%jEkB$o)qr&vIv^eq8OtId6i9?TwV;O3+%(tromt~EG{aF@9FetInvk9R{h!IormAD6~*Xebz96t%^X_0s(=Pk!q&c&(7 z*Bqc=p(W6P{Thv@`k)n>!JadgngmR|cqZwE5S5+4Wi><>h&Yffev~&X%*-8u`oA>K zU6rhcAOh}b8`Pnz2a=lyWyw%M1&7$!ms?A3atS?vxK^JrEcp9b{VpRV37J!j2n);v zuv9*kbr-9FF{(o`4Nf@t*5)0Disw0NS{X?;=F{I2MZb)EC2LGM!<_!=5ip{E^-UIj zw40XuWiDX&Daiz2k+m&jp*+5s9i(Pj&n3CN7$U zyR(P%XOyPW_B^Hn*l$JhFElTV<^atg-35P) zzdVh3m%%rOAW8|B=aG`GH_o53jG0AOWCdY8L!cAm3OB#7g6p%nZ)n|730Bkw zIecgeCHb~=l(qZ$oYhs=0~FJBYJRcMnoamUYz=+la88ni;OUv)vv!5m8qG8(|<*|1}0wevD zyXNCNb&F*$-Q?y*^6@q%vZUf7ah>U+Yo0GY-pYRhlkf83O9J#X)}?(m4s~qqc4zsT z(qDtVc_^ zY;<@o!S?6>+pDQ;CG=*3VzzprcBYC6H67f@a8%{Qsv%^2nSoY*Oyu=AGt@>bFp#?B z8M#4|S`8NdV~%G8TVx-fQRuAPU|0*)xjH=N`9?sA;EXfkI$)u;1RqM#Y@%x7C{#N! zBHpM$!8$YPt-Yt%2(`5b@)RJ(Dm;dpM2qDTzvS?(;gA&eNBMw5Cw%s}%hC3{cwCRn z+!?=GinciIfS~!Jf=?50tl6_K$Jq~g(yDV-2I{|G%_y*J5p9`vh#v3*u7aNb(0sJIICOY9nU!%7zb#O| z>`X6tXe_!4uz2e-#OlLG>mrlNGbuYEmqh)o;=YC;z(o$V>G6 zVr@HSre;XA#2KCqKdcgf!plc$S@QV>_m;cVrxqxiU?822#5kI<_ULhI9R*cUNrTT3 ztEBf~D1*1C!rRyeZA$Gj-k18uN#C4z^16-Ow!Coi z7W8|==x$qWlxGL0`lppt3M$2*_*MRJqa)1t9=ZtOMMY61T#CSFU(j;_C+K~ffg{0& zCk;A!8a|1`^2yW0t&yU5LIL1?Zpm(>V{HkUzHjZMNv;^0C3*w*rbM*c>d8oH zADUu;L^sjvL=N|(NNrp-ax=yjvol^lWZxbm`@Ts1)Z&f9WGW5cyPlezDmd+OqenxA z%avi{&1N#e4u+GFwl6JHyON2M!Si5my1H7Pi}+qbxndHVfgN;>4%r^A1=|xb0lv}F zOXAN}x+(z9;<>FOkIyPcTNP+M6-h?sC;5gN2@~M^j%~*RyVPglBa$59?Jv--7R6mV z5*aq&N0;dt%3cjWDg_7dSev#p;8xI2re$5>A12!BRG&;d_Z+A*N6R@yFw{*QxkhAA z;$;l3B{G$mrPF*_#1BrF=W^5LoGEEB<<4EEjajrb{F7h zA?sz+^Kp1K0T0x1Ove2VV-vKq^~P8O$91+uchs8e(Xp&rCb*5mR9F(T&P%9`LiD*{ zsC@+vgJcel%?gis$MC@R(ALpuP}+`NN)c&P`#$H(_J%}G`I*T`9M$TlRf1yR299E6 zJnaRh!kR>UM#dtJ1AXG-sV9!H3G_}bs*#hssC|$I_a#oc8Cqw)iGr@>5ZfVl00qKl zisyBjJQ8yIkUr%XdW4NL2%AS3rSFopTxmS#4Hy72co?H|u z*XtT1Vu~iOcKE(50*u1sGMPck<|~&v#7OoZD6V7{2P_)wJce! zo!t=h0C%=kgQdCIB7+L1DrR2kIg%7Qf|ROkm5z01AwwXn+j0E!^mz+!XJ;>v`_l0S~@$iz9Qm5D2;?qh27T&ox?qPB6aX~qNYcZrKKIvE&^MrU4Lk~7imn~ zhpUinveuw&$Cu^P?Y%07MLQ@k8l zt$AZ6=d%F(lPH#|)R$r5pZEpJOn?xcurRKG9lo7jS5%(Lmx$1!xMhgd7z z)tw&qcOtazr68bdo?(P-kS&ZNobc~ve{TTtKI^gZcqQ!7D#H*TucjEXT4PVZFn%;= zUXm4r!PJ|RUdU9CJ1H!gR2f-7GsgGqje0(l{>Mh9UiKaF<3vZB$y`nkguO_rXVR|6 z2&$LEgm6|D0ru^#TvEY}j{f#RARLF>S-RRAj09L}$ovkE%CJG+rFj|rMkk}Grcsrs z>Rl7pXr35F(W3Hq^ud~*tf6j_ZmQQYvPG=-^R=|Kn-jjf%dpo5a!(ecqF;&p*f=ULz386D z7(XO$L>#WKRhem7GmI!hld`oc_v_2;0w8PO2%foF+(2Fs+FX3U&zqqRIA0|^Xvzt6 zzm#6TY;>&eetYna4}Pc$8fJe8EBtP-LAXuZ>Vtz$>)g+o&uB5OH;Z%wH%=0hW}Qkm z=v)NS2YwvX;2gitnCF~YFj9%wL@~GMrT}`CH&x+NQCukSYsM=u7>RVH^2M)b=k$YN zM~*;6y4wB{DyOGNZdyYc@h@6)-#e8vp4A7b#?RHPAEA^?6>$c$C2FCC9cal>*v(yeh8N^qzdEjSU7(iavP%QG!dZVD+8PIr&F6eKdu%uzUDHJ zHzW_ds&*!rWn*~&?pu)4Z6&gD&I>qUC4dt6?~CppPaX-bydJB4MiLku&yV?*9Q5gO ziS%T$LT|OWn&)CShr<(?uB@HUlo?@mcwNk6rWkvT;i)VGLSP*PSY-#ds*EiS@`hJf z;CKSJ7Ki|K0W?rTgOTaaL`T{5J=Cikgp;sn|g zKQO%C6NPaf@SG0QjPphL`Z^s2Vxc>rAfLl#l`)i#g36hWA(WN^F=o2^i48IRsB+V~ zD!!TIr1C|>$>-xYYn8rqbNBVBHYuQ|Pc`|jmwKB%RhUS6pMg-0kYN%5PAz#G9sx@$ zTY)rKTwnMVQdf2s6&+-9{2N7&7|O*3jwB`j@>n#vxzkK>>*7X&{w+Z5dk>K^O^fGP z7b^t!HK2QNwsz;SbpQVmwaPfT!>p)|4po?cVOFw^*nXKzt|u~=DBj9ig5M(f={Lk@ z&J|#k3*7=VvvF%=n)x}r4H-8xqFiipEg3l1h`3Pj^Qp+&d&Fs>uyZX3LYc>X|v{uTBsU@`Bn4xr$gFN8;~ep<0u)9iMVs24=v zU1E9Gw3I7&cfgvjoqc=2+QzRYiZ(j%B#3bE1?@4_?j>h<%#0`Omo5eLASDSXikl^s}^RVp}F&j`ll=VSUD zzSC`e6dQP6aJootnZC&Yuo+cCnj(G%egZs5H6{DKYn(zvLp)u(k5#(M+EEZNRS23F z4Fa>@`cL3lzBVv-Fxx(%uxk+QfH&-Ct*Um}ROOwX1A(=va&D4mcBH2kjL}CVaNn6s zdaOalr?_N3i-?x%iYChx_i`Yg4*A+wxMxGYfc$X*OpgR_I)a3GIvgz!c%MuRO4d~l1cywYvJ!cZCnV8hi zxICGUR_~73*?0&{dMki9a_JI#!!D9^{!|W%dhtW$$(yQ@4??U}uTp}fnW5o~iDwb% zXK?QQA-ey}+G82@c4DVoGX{)~=Gx>BkSA7|~MHNyoFkKhA)<&x~fv3TBlZmdkuz532?7=Xe2 zuKG)=_L z+14olXu!|jxH02iV1rIqA#G@fs>w}TeIsh7D+BYxVxd%X_{)c-v z*LC**CTq&|Hv@e&dB1yR`3E~Eyb?fnIS_kK%F5-}DE><*c(uEoYP)y`%VenT5bl>RT+Cq`WzbwB3M-VCjvpyBh=wY8`u>F$?y zji@9QgQv5en{UGgsMCwGRv1D(JzeK)7vWgurLeOT(OftPONe=#DRT=`H##TV!E&9R zp5|W^ZP=>c`q~;oFK?}(2twRr;1*qYCERYR*Kv{oWB!LD*JMO4&H^kMSzeU?Q8aEl zF9Pq}v`FB?p5Xr$kH1{i);J+OLT0`j8Qt&}f4-_cRVMk02m9w$?YPyn4!#h~aAZB3 zK5hPomjQol2LJVBt`#JLO=eg2^s;tDqIdinaTl%;_vKZLRM<-;g2%T;_xOZz)C|Mp z7^-yGWbynrgr*BX-5rSmRsO43#xK9iTVt)i zI629#pvmx{Ad5UhpbB%dt5eZoK!aJ2h2TDfxj!{^!I@~rRi_(|(f)>Uabof;a4Z_k6n zLI0PV>xGMHpu2;9tjJK5t6x$Je^CWl?9pmvf{jnAu#d?7u*{{PZCxlLMf7OGlDQq| z{vvm|j}YL8DUS&MV(%6N8P5A#T=Ujt(Q9jI1wqErRx&)M_^?#uW9y7cT`|#gc6;yS zr`?+U(&~kRBzD`%Ayr2wC*>^H~GYx9dcHk>;lxYF)li)bPu z;@(Zuc-8;sGzHn-eG_Qh)Yclm8Rl3o>|mqcPSQzh*f*i!Rdzhah$~)zW_f4HXku}U(6fNS#Y*U8 zkSSeGQwU7lM9$TDZSlkI#ayzq%bDpcVTo3|x~a3b;tMAo7{i{R84ayl$*O?3A35C{4|C6^hC zEaJoGWYQX%Wfut|`>>6Dn?|1Lnm{jt8l-Ew!Q-l%&YKR80{i@YTQUgI*#`qTE2Cq9 zJ-hx(*W-<&+EczM8vCK?F5q#>z93y9rN_FPZ{bX~hc9@x!xpiaatZIbJJv4RsfFuD z8FH$R#pvmBBf@+02I!g|7Yf-!?hl=tA0}q*;JRe24%)C!#%dv@by{gmo$Hg+tDTy) zZ#fLq>`n6Acag$&h6rud~Fs zvkbGqi>9>ocViO=kiH~42a#QamQ7p@$f$;ZQ=OUW5jXpun!)#XCfWl~N(VAtRADCr zYZ>30z=90WJY1XqqZ?!8O2+Wcz6Al*G7X_h{XI^knN$!tA*TQ531P7St`HmZn8^>^ zNqq`0UCp0%my2S3!=nn83|J0x^<_>U#t750cv{NCw!#t z?7iWx^eq{$D!ag0xig+Bv3BqI7nT*lbR7*pmqjqX$Pk1@OiCnAztH z^SS`EdwntHa&0A%=R2&XY3#SaU%4vX?UQ9wn}}y-6-m(r8{Qcp)RvLdxK9VQyrmgE zjzz4QnpK?^*m>IxuJ14dSW1Z+8SI@Lert6g9YDah(51jdg$NhXH0vhq#W}IB$qFwa;mhq zGt1v@k;~%oHS$1ro&>KwKM(Z%1uHl@NB3ZB4Y`MlkVm7hcr{WtXZ=#{fOK{)S3$hyX9sN30AW&~SMd$dhS zJ*VC8p5#$m_!X3N-N5I9lHTmqa!uA#EcDrDGGY)n@PV1`9YA3R>kz1r*p|5?o9Y5p z`!1l@S7*cAw`U?>FicwRbg!jTq4{(zy4m;q6538FT2a$_hs#nd;_w_&&ePQpEkVk< z;LnfUtkooPHD)h5u7EcVg5HzLs2{}iv^c>2+T497%bc0rRUyFDzp5C(BYtPn?XJkd z9O{$NIXR~rHCuG3Ft!ITIDJcl4Iq%|bW_UMNi4@yy%9>{+AmgRGyMT8n_S89T;3>| zHFmuD0ikK zN!UG)RMerLnlJZoF=4V}x^0SvwlYf6ar6$PK-5PttyORV0S>DO3Z z$^j3)3q+Z+yY3!IIf`ea>9*r2p>k#UEM(WVsgVcP__PRnaLv96i|23MBL6Y2B{34t znR9T_lp{v&hcve+%E0lV;`6Xp56r@}SQ2#5yIW7@!4*)aRC>mp$Q;^O*GioKoLMf~ zVcPa?m3whlhaGdPHFq(Ov7XfNk!~3EtiEc1Ca&53bWDVdAP4GH0>WF~K}r6VPZC|3D~66e8aw-E z5gqXe{w->)Rws~gwNV4NBnD?O+IsqkGiPzUMmdXD@AT*0K14Abeh(%|_GRu3?n-Fa z_Vzz3U|y!A&fup_%xtzM$!sPK!_P=u@?f9S5GSa1M`w!Gk9y830GjOm${ilMAHWme zqTf7Z7tbD7>(0~l6)nWOA-6*Kp^=J&x~4f-SqxSTQ+aH)Iw2=dTG)U0*g%KE|g3ZycU^RlNLk$|@+!+mT5CcJ|WA38k3CN?H{?UzKQfA2l|K-v<&gs{TkoY~V# zwJ3t9_n{`iwJ6bB>>;+qTy54O;nW8i%3NZE`9kP864}xBL=&x=0i1We;|Me`#5D z&sbXoYicCM62;q~kezp>YWXvd}ZFwR&^wXRd~#+?eId88{}UOk@3ke^$Gku^h}Y>h?= zWShIA9a?6MCG;7ZY!JG99^3F*7Shq~;F4Zaux795NPoO+hxulPX_@`%!QSKjxHl&U zLF{yCNW535j^?#-j=*L+*yC$g!8<53y@V$d3UvW?jvBe#&tP|8#&tCg1_mO_pcSwY z(sZIk-FJ4Ib8ggxHJmw#lEKcHX{mO^&~!3O>=w?Pl08@UL9|M;=fU`k;pJvzEe}mq z_=fG_*I3itBsR@Bc|KIOiub*$rvObrvcFPPx1Pwf zrvlZt>qrCLsh#%R8ki57JLb4ZM8ZgUGe|&K@-4=2Xd-|DItawv3USzJl zlR}1GCm7PIZbhNb0crOh9VKaGYX~27tS`$ZiPY}rU}eTKNTKs&EU@_o$S4ONFS6Eh zsk$0#3C}V$h?^d{qXGBSZodp~2Lz2qxmqX9n3c;h4grpF8?uwg-m{dGrrz5pm$w^w zB)=!xJM1l&TAs$v*ZaO}<1&m)sKI^H1m{}i@YUC|^_<|(kB8Z;8ejFi)Mg-kOv*Z6 z<`-D)doJFkuHu)vFElzMekbx3#)Uww?IA~X()lrVb0nPvn|}03^|F^MmeogS9IV`u z*H;>80VQvAs=5V7vOc@6yDAqPyOTvq9`L%y{6%4fSuBKz4SlM7n=*O{M&kh=9Q2}W zO?~_Lx;(t8VkzY)>!3HWoXFRK{Q4j+>b-$>=L)f`N0+aq(n^v~v@&dUk?`Vy0=`ZmYs{=3E8)+M}c~YMe9=PR7b5DtTziIZAt*dVXXn|Z2vyUGI zM+RDNf7^^|Xg(m0UIDq*XN!RnAh@Z-~2p{a#%fHdZ9Xuta@k z9H(s-S54=s<5?fXfpG~I5UIE17WDaD3F&Je&5=wzEe0;nFCnF`CBr`^6b2-TuInH8 zwbTo|=xe-qCTjGNSkh&l{d`er5}{Z z8hc6rda>|@h@tCqQsCWMK8U(vgKxxVAP*921Kss#Ah#7 zpIyy#?CdirTH0K;6Uk5CCT{c!@>o5bbapOk2z3Uxl)^$j0vEeBH?e9ULIdp9QL8>)WLLhj~I5GaUx@RiCv8hZa&g)5B= z#%Y8%MtwOkLoOq*-5trbOTQt$Lp|_hJesx{KOk%^`EW@A(ECJYF^@k3mR4T28`;%0QcW$+zS z3dhmJuR;&0=a}(fY#U-%^@__bL&4t7ipySESg_~2T?%jD-cD|tQZPY&RB7G%@u;)j zGUB%2!A;doJU)DK2@A8CcpJMn%zMg5Ff_FN`v z-Yfq4q!+U9rBUv&;uT}SIW~J2Z?^vY<50zV$z&WFBVoTpOg|S{2IaVcnTLuJ4@j*} z_&YHx6rH@!SKWd1QJA8P04vF;BS;aw+(NZ?mpIhO8cwt7eosf!3m2r=c6}mnWTpCU zl$ZVj<)(fFEWdC@`MrK*aIe?4_1VMO!yhV??_|8Xq+G$yp6dwyHe4+@i0))-i*6gn zCnI`>?f9rB3RzFfvg|q-Er_lsDW%k-&`IxjO9QydCh=L1Md``rS7plO!OqW@Y*UC_ z1pAafmLqPzF>Ao}&Wdss~QbYmqjieJi9*%UkhoNqvCKaSZ(s&gwq6E!jhhr@TK z>j_59g<*O%8u?(J_X1Z#nM>tbQz=*D61o(|Cbw-MG1=!eRb^kT1~)GRq+nsDrE% zHX@PZkV6#*oHHnFYkC*s&CCys@JvQMd9Z%&B-ZzEmtfnJO?($UQeYQf@kk|X4F2B> z=5enHcJY7oB=y>OVp*8t$IF4{Gnt<(C_ML1z|fC-65LCInw*2>e=?HtPG;>*Ysx#q z6C_MhVwnOiVSm@Q1ZrS}AF`8}H|6yMAj#tSsm5ME_FQN4J4n!}$Q8jfG5nFzm*e|j zA*u_e(tgC&h66RH#JAO!#(uu0H~KMnamfM(tPxFlW1ob@otiA>Z~8;D}_>oinU0J`n>1;u41mZ z)M((ZZ>;?Euz_tLd(Afo#+IsR6vA~Evl`8zxgApij0}#;wb3vf-VYj*N2KS`Qz+g6 z*0>nuILQjGrmgIYlyd7QSgVI|1laWtZ1*#>Z1jf&r&c=GrO<-x|B zuP@;RHcOY*2-m5VZ@$;I`ALXj<0Qb@4)|Txm`Uu_`NdDMh>rxzl2xD zeWE>(Ued-6sY*)1TLy6UgDOWk4LNZ)IX=JUb=f}FC0POLP=b{La9)>PY+=(SlQBw7=ymgPG7 z0_t8P*br_|K3;u7UU6~ZqPBx#vD(VpsRI1GG3i_ z1XXcfU+XJa`}Pv|l(>w0ozAm+c22tKOO*Z6B*edYw4-u`dZVqhmeU>AKd)e8+%?2b zZS0(;37a!sZaJtUHzWnNAhhrU-3uCA}N6(dS!xz7!7Uj5m75;dZa|bQ`{V zeMR~Ymj6n9;M5d)5tT#{7JKgySZCpEfg9A5AwVsff8Z(5O5N#vLILU0|G6zBK7@R?kwm8P0rWme91Syn4$G zh}$W;-Sf8EOUQ|Gb=MP=T&;V>u=-kLQqI_+r6JyF@4saFnr^)yx*hrv&H?uR0odWF z1)qs}x4s@{GH$Db?~s>G@EphcP5pk_g|3Evbj%S>_LtEFvP9iPOG*Cpk(Q7WL}z*U z%vf9Ve>n7`DG0~9_X)QrJYnSc4yOlDj{)i%eoRrz9z`ZpXDw~4cwq=NPMXm?a6RTv zfH;x*Y}IoZy`dP=t}Z`Xi#JkjNYi-&g{A9VN)|)TKQ*N`$@|5&x#~@Z-;EOp5gGnm z?H8zQ$N2p!P{o4-EF-&3)}elBy2%>r_mZ>^rNK~^wDE&G%D=+8ubjKMrJa0?%M?%X z2V4hnAw7D)b9ZS26FYspyb%i9L^#8VMIaB+TzBVA-uKXXun8C>U)Gilo<(R-}a z2rasI<`;5MVaav8zq(ER??pp!@Nb%@qpJBjn8cuPQ`2rQ#7>=i>jASmb74fGqQeyi z*MQG_Ode~=X_A0E@i}Mb1ceyMei#Ej%4E~sVpjgfPOvqyh8F8!8U>g9QaUfqXtNXj{T%_ghUgd(4{*HK+%P7F{l1j`I6x!^-=!mVGcNA3~ie35hJ2IqtGnj|5 zk_`KsWKIS;(Zpd;|#{EN6sz`HCn9)Wx>JIS8TASEls% z>OE>ZeZxT`MsQ5D-6J;TC(}qU=4~^e^Z1(RuaEl_B=(D{@ef7H1cO_D z2&`qU`H8BB86Lf{$%(EcTxY5?a%GB&-iLl+8%0wxhK{*DgnSn`1W+QxKf<94h{i4!y&yrBHMCHA8c`KQ~F@~IJ3m+WW~*S zt2;$98=K}xD8K9p|CLx(0Y^E2gL>}2CqqkCd~K(;a6`kOsiv7?Y&!a23x#=^N3^AD zbv3r6xG1UtrQ1t+&Yb6L%+>HEr5+vc8vN;&VgJh5r2xx^n`O-09MW>iwCbW`nAYKEv#UwWhUZMW;-O#Kgn`0>UOxTNZ)g&La1z4<13uUo9%nsyRA2v^{L zVt58wcR85As*Tv89q|g=3n`2#;)}NHb5C2{M~L?5i>SlEt25l*vT>?R@MZBCs9%g0 z8dOMiVg_9i^kk%yHTV_w2-~vPJ!r-q_qLs4jcIPLtggT5sPX7Mway21{UF<~9Ao6r6G@-6 z$#tE%KpbQA$jb8UqUP4S!(*3yQF$PRZ4z-u+PPpGr|N_&7DTX%rJ!{264hB>gZKF@ zG~5VQa!=-D@izVdjrA4J4q@-y;%|X`)}3e{9nQk?i~h*u%7yI~pP+@YLFxBsHB+wj z9Q%F7-UjDXKN=E~R3$nob#8#wUl?r42q!_6_sa$nuu=+AiCf?dHq%&$hw|C~Mc(t* z;#fEwWN$~Qq+R$ypTnEZF(%4QIQ)jzN)el)797gNB&f9*RND45?0AfFJGXo=j=%9J z!WfWcn5IRkJvS=+>LHD#iA<8UpLpEg>%=NED>VSSyckC(_b^g{j+I`@<9SV%+w1fPf_)w4!-?S7l2%Iz7 zC@v!EyeupX)o0%itWq1?#H~`}7V(=%uY?g3#-DClEII5 zQIF3k6m@98#uif6P68c(lcT|r$ju^Xo@ku<#M`FXD)?y_r3pwptwB;QEDl-#xu$a`+J3e^e>J$h#oF#nb_<9@75Ax+!^k zv2jO?_(YpEM8lS?ia+wMUXgdUd#U~)skT)4;|JxD1fePKs0Fuu__hawC*nh0Gqx1G z>;HW6`8W8?Y^O^c&?3&GSibbu*?guE9XQrletG>%TeXjJGQmT~Zt*$*f^rp|x+6`n z)mW4t-EM>prt$h>7^mZD&NhpXq2XoH7OjjKwP;y^HYu?zBwEC zR^-Y3St<#O58}Ggd5pQpJMicrPca^|gKA z*{_H^yVPw?!-K%~d&tMN>22-#Lt9){xP zo*-kM3nAQM2?M*14}NlUU@CMZ1Z-~s7_Khz<+zv$gZ!sYfuE4w*XV1PqlO1K*%v*+ zcMXV_j%z_n4P2~AKJ1hit%APkLUaEIEa7WIh&%zKWaESG$($Aw*$Rd>Vl_|jSfr@h1Z1;$N`@b z%-q`_j{kD?2vgroT<2F(@qZk-DeG=i8%mv>)%c%o!F^{Te>lC-8_D-FVpNH_ zbUiO7-5DabdK@@#?rReTe7QaebRF{TStNLewU z4opc5KWZS5AzR>u;Mdn8?m)k{)RYw_jHhdF{}n1tW8d6uL?CZq3G4o=Ev|d-sI+HW z5c_a&Idf%DQ6Km|)5|4=EIa5;y6QeulAuGXvZ6?^q!%~er>91Ej*Z|fZ~Fd!&1`2SDB?$?n(gCI3>$_q@8bX)+6=a=)KSk%CA!XpkbUz9Q)ak79=^ zsh{Jql=hZz zhifgrt_A-{yb#pAwdjWUZyzgXpoO!Ah=reLj=ip=+5;Ekqai&OZ?+P0vt?cNEoXLT5=XVi#Ucez-ua8x{GyBf=VJR5T-k~RH*dnmqrVOtxrOy+nyxD(}aAU$d#IGF1AX_(g zz1>)a?W-NX-xSTB$xh+5&CFc(jL|I>^YYo{Bg|B@_J$w*e+d~d1*hAn?IRrhZTu&y zO}X2RC1BFU(_PVs7}|;Z@A!-5;!-Z#`W#Zur}ue(?e_6+gi)O}yW6`pWt@}pUlU#{ z;x_?W9b$ik(qLw*GWjZ@Y_F;F!o~IiPCO6_Y?H8=i%9Eb>mJfrR7XD0^i&6QOz{eyKKDQwmQ;+2zjinM*GYT zIXmWil4}ST`OtoVoywuy$^*h^@l#>_}t`* z(ibUNnxgRHj@#|=P8q>;ZjQHf2@l1sVo~eAj>vx_u5hiM+#)tM+mr76gaX=tdRGZw z#3vN6hV#uLkqzSo)#V^n$e7$*UIbXJglJe*nVjfei_9idMP0+L_64I=CLDQjv(1$m5 zh~#zh*T)m}_VTj-zEJbeO?#%!9>BNRm(L88B_-6W*K7;YO1T+U_h z|9wLN?f=p{DeRtcG?!^55c&FH@7u0^M=+F9n}eNaj8#u)y~+&be$MroVm{y zuu>tz!chSsC>I=-%cFz?S8oQNg>eQ+YFA`me}~t`API8t_5U&u;}hNkV_|UPRPyc^ zmB7BQ3+!~dhEAWceIYRC;21S*=ESc`!{#c|fH6%Mj#$00QP|j9(hNO#{GWH(|MA0X zJEGg%^3i&E${$t5$--M&>_bA$7_QxI;@RT6bXSY4&xaQI!-SM=>}ii!Z2pei+Mo87`sliqI= zR$^22w2Jq(oJj4UF3ON|9?z{H$F}>3bRV}zARL`p4nVu^5vZ|XP~`NF^Cw=yUMYY$ z{Uf@mWiT9@l2qEk-B4rfH(xmUTd2wMgy%F0a1Q(b#up~k-exfrv#54te>t3rnKNtZ zhoLu+r$uH5TD|*hWzCdR zvvxijJDeT&m5f~h=5rGbvZNp^+b73RyoN__>)PftDvmObHXtMuImM(%2GC-Io7MDm zIFFNtsby7-=4(Q}H9u=W`Yq$S^ZAuHg#dh;9}eFC4?mq+?FGTj>ELd!w_N@1=W_nC zmOnPrwmoe{H(36XmJtca{bouDg8DtABqS zzxdFmL4YWAOW~3wHPX-@&5_JD=KKiLE7>LnEFflCfUDL^{zTC4U|fhElNE0Uw>fQM z(9T$clJh&hgK>4~+=S6b@ul++IeK4TK-yD|xHBK&bI)U!dV|Qzt(=LME!HAOTXyLa zMAG)YOL_3()&pi1#FGoVe%7aRE8rE#jlz6574XW&8+f8QvqZNG zu;eF~UFa_iCP`q4Z#|dXC|}m4O?Wlz0X?mzN-6FSMr|zU+qy5e)?c=+XbHVo&F%N+ zsiEdFRt*YRB}k!BKMz^@Od(-9htr}<<+&ue%N_o>$Ibym(J^VzNUJc|?G79*Fmfo; zO2}Pv;cG~PzQ?RfCdI58WCgDFqb9 zom9UP!Bp{R9_;EgWP;Sdzc0Jelo=WEU3C`n^uQs$O)zxy!|naNi;{u30tLE z7wpG89~)#Qda^NY-|EntBw|~3vEQciRFAAEp{Kz;D5Mx z=>2Jbpue9lOU=i@!5ngz-NAEJK^)J=hi@OVES*q`XjgN&B;7x}K)`xqCHa*G#*;3w zohGn0eA9eKdM`^sfcd+<7mx1nV2CYnJ(HC5LjJ@}?MsiaJ3)uNm?77w6v?KR7!Kei zC=^qj8nYDr(sT!Ryz%a0cI^sA?NaE{Qp{JW>B7 zTSk8rf{Aa+1SPO4;~7*;uq z67l6vtX)+=lcpB}?`>$`+YuFgy!{J;wdGa*1pZ~{jGZTSL`j7*6} zOK}yu$2H`f6_#O}T1Q;Wo4sPU#k zRk$kDsLfU+xD6j%VNE>M8Mam?(t|Bsy9D4(x2z7^zCKe&AFU=e`pBhpkOl6WI9Ly? ziIJIqrZkldIoQ&mVHbGaX}m^2Ox}Ok7(VEu?*Y+ zKntl$N()q7;EFj|uy_%e>SoP5Rw4?L+W_O8UA*H|#;BBIognbN7}8B-g{<)U|98h8N6 zUz8e9XVZwxR{;<>(T}S~R7zCu1(xgv*31Mb)xPQmVF8NW>i3cq!xie65s&M!Tk5S) z9jiHK$)@MT>)N)L%-0)RHuX6cPrM5|8$`_W$;UTh%mwM2fP`{ow{m6J{Dnk=4c!Q@ zw7=Tp&$N~HxN^VYO9M)V+bYQ5Y=xoX>J!B35Zn^A>UpVL*Qp+ih)a9ZiP~zH=r|D{ zl}!w+e`)3kGsKW2al3w}+Q_7}J4|q3@HR;|2fw7jU^!$u$v1EUYll(+bOGUUEgbGQ zBTlNp7wa5<95T{olA9Ie65?rUB&7QzW{QUgHHV%LwnTXQ<%xEK!;e-I*eKk5r;Xhb z+esxTWQUElz{ZYhB_bh7T4$|$ATFd}zKJ`_e+kO{!)9lAI%t1tbvi{ z+2(9+(LGa=r_w#d^8wv9r;1@l$EyHc7vfx*(#HL)`h~D%*=*pZGfL`UHXH_yvEHmA z=OP^+ZIctNmzESdE>&&6Sg4~YP~fO{%hh2FlF*KAo4{fW+O{?0_(4SP6x{bvUAj7r zXAcamWG{-@y<|k^dbV%De+k?_8vrLh?S2ST}a}jAFpWU!8u#5sy}|T zt0f^SsIXKCP)$_DLYwKcpUF;e;6-V(GcUh3IKh2)9}B$N@{)*gpz*@ zeQRwoETW({G*KKNB1-~2tiyTxnrRQe_zEs}sA0C&*=u1b+1CFkr`yjZC+32B@^CY2 zl=~xTw?5+;>Dh}w!S6DFN{k~f+8;)^M{-Dbkk*X2fJDaClcM3h5gw&Q_tp_E?wdde zkFE9y!Zmkxn_`X-N25kH3iO-oA)(I%He$XJRc62Ue3OIlWUk;`*TJS$P4p5K^K2J) z`hs^`jkW_w8#hclRL2mcFspZT*DJ4Jw318R92;8&vYNFeed=!_+a|jeG(yl=yBZq z;{0oBrbB`heCA6us@Vn0Z3V0itgVTnMCr`f)8>`qT zKzOK0#*vt?Q$L;^M_FK?Gh^dqj8sl7=G{9041u< zn(~|*IoKmT+Crc&Oj^{i6JrQYg3O=qRDV-Kq59VTCP8zCB}uzbLotVRMnG%tjAKY3 z#dM0cYm1j*=2UwWSTIU?>BRB5yH!A3nL=uc-uglMpU z)*3xS+@6vkHcf#H-w-?0l*KCNk2R$ykd$gZeVNrnE7Dwby_*zFws}Qq!RmrE0}U%) zp@PZk0D1A`4ML-m3v|i0KnZ$j*nhiG6M5?_MZ6Xoc!oZl(QM$xb-CkZP;%SiC|6)X zD!u8rr<|`flUrGzpsX0pqkWroFs2Vpu}5&giJ2ScT4?4FHsp$J1J7_y?h4)kvl#{} zBF(=rx^VOa61}N9i-I{sv*@5a?r%S~r8xbGeV^-D!lyr9I;oKtQPC+?Xq#*+nX01m zPd-9&F5?p-rObAld*u5Zo&ianb&Dz7AG*0o_PvoHRDKEz%e|1UX2e2GU@P@y^hTHR zmIkE!_1R^iZncNocyg{{OPOVF2L0S#VqA@>BmZr=rGtHk!|Xoz+qU0S1VK!^Z@N69 z$A`=Xp+`Heq5@2TNZY z?s#d)mQUL~@gNkhj za>PCmrl0V43v5x74s*<8d_3IZ!CK(hniSk?>$KOmp7ah1evO7eVNO`$nK8+aCo2XG2(eXmZ{eR$5O z{#N|NP44B}rzZ~rSjq4xB`i%x>E0#`=!`BN@pyo?>9MFoUorZX@v2MjEmt@)NYm=8r!HRMPgm&>YD`bro;v?kuo>XZe%v8 zB&@;<`^-;X1$FFRAb@DiOZGmz#u6ukC!l?i0lwOpwji20w(`rOa^a135bL4Ut+*-Z zMBQ1ga7?$?nUUSumz+_lV++WyQMnW-a;8XYHOeX|hB{rvGIBab0fVKSd3V1shEBUp zyLyf2PETxq1+}iTXVvLI79-lP~tzC5Yij6HdW zimvq$P8Ab(k7K#`xvJGoNtkD4K2C6> zzYRI}m=~F$pHc<@)bUDRKiyeMmtS!>BE*5-++w-xkd1tcx!(|u(8AHLoAKwGq*|XS2U#lf}e62i2%oz`z;xwMhc5pf+dR5TEx){Lb z8(@wezJNNqbz}~a%ZtqvXhbB|_VmjCIJ)HQI`E?Byy|t&%3GSDmM!kcH#G-_QJM2@ z2?jGp4SYsgj}GClxAeH$pwCupeIlnqnX_M@$vR*ew_W^5PZcMdp`Kgr<~^oXLg6|# zmu#@$Z4V-a=*jT3kEy1VVY*Ad4i^xQb;*#4vP>ER`)WPP(4k|O;kbZMccZ?VNnbCH zl-VvCCDRun+ih2g<2y~zSziW*nHc*l1h6z1J;PH7wNx`sTqAOuXX&6lF7n>H6xG-+ zc`{gwmJs3Mq2Aj}ZIJOJSbnSM^9J1LJ5SN;+*SHRB=+I#hg-L;&Lr#hD$^k<6DGI< zb&Blr!rwdOMOFP3AeW&TTWVA9&@#~_BdII}@J^bOvW}q6{K zafgDRIGp|bS;s<@A^r#&q4564#C*73P4~K!;NF|kHOyS2LyEU?nVCq2EV&oXO3UJv z%;q3H1t~~+YivPgL%|l9C6IQmA+P`*gcS}qBsmm~kP7PAs9(svdLJ`EIjWkI&aKVN ztB_zhg`IZ6EbhC-7qU^zuf(Qc-mxIX2`VO$snZ>u90)Z(QolP(FVZ{Nu+O}BG0Ltd!L7==Q0PHH;j(Bs4hyorNNB{_BXlKm!-t|tJGVvX&+E^~3>%OGuAd(641_uXkxs-AvBiph_KEeMCFB-IeTdSog4An*{cJc_P}>`6a%8bMrd~sybgd*KGg>f&-ht45Lvc z+ep&%x{jG^VdH{@zrk>DK#H=8wr;0YZfaM-9QTkyKmJ zDDcY{5n5>;{g!-DwMCD*;?IzKiQ)MJ1mN{&fe9l(btKWctX=db--)i}GaxiWi1`up zO4S5M=C@k0SCrL&Ow>0QaXDR%4@Ryl!pSc*fk{Zq0HpO`Y52p+vl^iYx6(p$_-k~` zr}d0O9Nty@#}w}xyJBc9DK;oczb$<1#;HdtnU^-hc{2f|xK@%$Df{#_I5Pf(^L?xV z)j8hXym;1P)IRlJE{IWLXMDXj)`vd`dVj#+(UlpI4u?1JC-`mjg=G}#?eM_f_dMLu zhd2T1f!w8eT%1CDrev2oawsS$CTS1h!Y4mW%DfRqAXw#&{UF#xk44e8?c8A!VR>+c zh~8N=i*iZ=Kw)__1A5`ojBBBQfHBFd?d3=4%#_=%k6H<1*F!+N`sVBi`1(V~;!_Td zp1<;<5k9ev^Q*E7RXH!pn`F2pTsQwqHDZwNNT^K05Pn#(0j>hb8Qlx;%QwW_Q^r^ z*QV(_8|DL__I=a-u#3L@#3Ga@hDHKJ9#40gcEfkau%Gh7g^kF^5V=!K=E>?R3w{(#Zz=~9;3n=}0q7+Y)l|vb>UKBZgiN56Nix21VB|~uMPY&lm z6GYMIk6XBYdH($|8vpHM`5|RrXqDJ`x7Qre_$}rw$UA(53TN>89KHp5;o}$E?vzD9V%XUl^>r0^&0lYHzPn zYHF4mQeRf_-_+^za~?OgQI+R)k}T1?iOTrTlF+?mabYD~pacqE0nTexS1pSwKQU*V z_!|>1CTp+PlYbL?-|JV{wWaa$T*aDMY50HQ(B5B$VEfV<46 z{2zaa+rJ{a-2iuix}DZ**#3&Q;07r!fzA>~{Br zl9S|@%1ZX~Kq6OZcz~tncio3q4}X|w``bxB`49UU+S-|X?e^^K%xyklv*pVz4dr%k ztIz71DjM1c@)WX&=uZ%WXdSY*WiPG?F&x}?fmUwPmSEJfs>;>X&Jo}Op2IN<${bc4 zx7ag7^X=*Bkrk~^)W8AlDTm13H6>hpvFqR$?rQx9zRGn=2Qf`S}Jvf7qz_vG}g1qrXSA^cybNO?IAJeENm$8!vBs~yt zuzv?`t^I#BZo(5Gs}mKAVy zlW_NaoIA8F$UpUe1^&KcLs}Zv8zM{LbdJ_x+cX1J>#S~sv7**!R^ea=ByO?o_VsLiq(ym}k7vVeRCL)0E@)!rKI=Z%36*2#_i0br11u zUyvAV5yCGXzJDl!myquC#YM#Sz2xVX5t=8kmXW6yJIr4Add;EaA@ zUS6r$S`(G^-?Di78MscB(6idxyPV_;?~C&>&YeVB>^~T*RGIk{(LWb{%E0;JFpz`J zOBTQfblwzMnyLSBM*${IB;jYyBuZw zE*s=`#>-yu7vrtDH{LUoYf6cQI4+B#HqgoDPJz=gNOs-Nmfbk}=r-Dk&+)rrYC=`! zQJfPzWNHbfPmR7H^qt$x z)R-I-qi0v=bNaENseULmr^;kq^LRt{ z*;SnREpGR$Y}gd&gY(t%o8(%B33VC(JwU?0((hL<3!B_duVGH%rZ)(f_NTVHZs)%J zhxguL+u%31KL;Z*f6)hzUOj;8q50x>4Su6*W74@W16#mD#sbs;H#lB}{?hUPH^Qym zedE|$vv9!Izux)(2LGo1m#47Kn^ACP6P>ze>*k^sU5Z^s$ZW7B|*6$!#IV z^y}N}PNT^$3B(Oj?|%FGaKmks;tTB!(I2Na_4^0M^A5mKkeQnMViRr+I*Rzr{ zvYOyj`=KN3`Z44+0m&9XsYNn6n1ReSr=QC{4Y@^?;@V^^uJGZ54 z6b!5d#%;Ou!y?=*PBv^by}>iVr@nd_^ncpZbL%Q_?_mX-#5R+D>IQefzMJMxb_=a{ zwnR1Ki&BfCArI71VB+%*Bz40ei^GYwWX|{EHzBk(YW(eX54{$7L0jmzDxHr*R?m)j zAPfI?&;8OlIz=i`SRo!)4ok-~G%Zz*Vi*?%mlE1Gp(Nk(Lq_nlicIzJt}L*A7l%G; zqK*uB9msIlT)mPVcUZs75tcWoY2%L^^qhBP9yNtsYW;3gey-qY7=5y!f6Ia$2DsZ9d*sS^OF>8Zz zUAqnO1wE5>5M`Hi^%%^Pnx9(!>x>-8%Xs^?3|gghJ#w)ez;IxLh1mB0%#B>&dFYcdU~KpTF{Y zN*o2d7iYRT{Pqgx(=NZS+n&<{S~5+Qj3zYB-(LYXJzuGrDpyqpN#Rf_DBQj;QrFLK zouXyv{nZnJ8V+-_FHCAZbQq~jS=M>pz|VL4#~c%c5$VEZqLSq2`D@0BMoZEO7#s|`$f0p1&fN4PUX)9cjTo!p(+ z7=iG}!{0(oOwMrx;(~_ClNcz~Kj!-;@JpP!@T*GlOvK_uB|KT&0H$>RD<{G&AWsL* z(%)#qRh!idMIXqo$-z@u{-oGZ(+0O^6PjY~KFXFt;9%n1K!$^w6~`xFIJQEgNGme-& z1{wrE<-StTFCU9p;I#=A;|q1Kne)%2CnkixSo72)>s4O4Rz{di;PCvkz^Cvl8v98^ zpZJ{;=&i;MUh1DM4>o=%em8z-vnvV19_qKt*plLjA8EV;izsXgben=E4s29ySaS2|ys#K9(jb^H3UmJ1g?b8op!sxZsVUZcCwBXV0Np?A~iOSq~GTbaGRqr7R=1JO4+ zE@Lx0?Oxh7VgPxsIEEv8$d-wF@vb4tZx8gxubz4QW4;Dl2=AQ^Ib+cK-2be@FRbHI zcdO=h=fe-$C4^A7kW3>eAI6}>prB&21*G9LHi21Bx^=~09DVeq+dGk4#=C5*uuZ|n zd=Iy{$&S9s2Qm3&kNb-vjM`?{`7EQb4HxBok!T=5)G!3BqSKXQps@(YR+q7?g1bUt zyoHO>uM7_1DaCW!V^Px!!V;qmfza0)AEuOs@A8cDBRajQjNx6M{;}A zO&DmkzYuFIzbVI=_m{rXd%RQBM5=yu!1rZUz4CD3R%p)TMN6(+Ok7M=J8eV1{d9iI zD7xq2J;PY^vpVq)e*tbCG*95(Jb>5!;)a~td_A$!De)OU1hZYmWdA|Q5_ z8dA(h207o08}DnFVD?xFq5ljf`=##Je<|FAY2Cd@-pyXk_P?MJ3mCT$Y<bUta;)5F$tv?mX&#CP^^3N;^t;7t(E2B}IpSbrmOOA2ER7gQQ2$5A zpwJx&I=i-EWD`tCHksDMl}9tiI6hfqrZNE=u6Rj#rk6`wH*BBd%zqjfyUB4Ycy!*? z8`3(;yG#PytMI9f+f+GB9(Uj9cWT24dc#`u!3W{;z33%wv|)GS;aPHDOg>#*$c1vo zv7s|Lbkw=}v{E+mNz5dA*3tg+J#JI&>tuBBD@Xs^cBi$Yjw(cm$n6y_a&m7XaETe? zmrm(F@+0fNM=-^w;J&QCLL$O)n55c2jH_y`qR;(%uyN4N;j+9PKD?E!RZMN|uwQeE z7Ev1trp$DpA(N5@_(ezTe`6=dr}$V<`T85sXyo4_xt~GZDWTBo%GWij$?2^xjdHB} za)a!Hk*!n|^CdMFiN#E+##>!_*);v5z)1o_to%!7Bzw#W-^FoUxwzYrmDQj6=KIU*uEgo<(t=C}eZc95h_ z5@R^EqNX?lG7S7vOZOUuRM|i4*Sv~JrL}1nuiXOM*`R+=J_j%WzF#Tl`#|$OZ%ghl zNMrNuzx3BJ3yGfhk?prKgmU%2-iuaF+DkN_94CbO07 z3YI#%lm1w%%O{R`RgQdfhTr6a|Ru_iUHo<)8i%i6!Pu0GG6Xv?vJzx z^nS56{YDih*v1pjd;tapEKcM@nXd+fV|06OAKd4L1&TYuKe?E<_qkzkbZ%24Db4dA zoso^&rH01P_=J_$XVw3g3E*xhm(@Km_kedn`iZva8~fdxbA}6l#ak&}6x4(H0a*pL zBHiHwpO-A&GKb4-q1*eC&8H+0@@5N3;hdhvTE^rHsly+wZ66pX*}%f;cio?~UkuA( zc!}ManFbe0CCi+2$J$-|c(m?t_WQ$+>VJi^jouGHp;6o620_OCbH%yU6MLJ6ZXl=7 z6~1F-4WK_|S6KC#FYQ>DTbls^gv%|oq&iCRQ=Y*soj6%+uv3T9DoN`3B8mDEns)Ml z=NX9jk2u@He$9%OX-ZQ@IMwP5hO=+)aCRy;BBbr$3K#1tk>j%Y_CLlXeI*17#Ubu>4+PKP*_os1yk6x zO#m}3mc#o(gqZyg7MFpyiFN+=>b3IiBRpI8CHT+gnY41w(PdyAebZzhHA9+0r zOYbxcizYGOFnSE#^oZ(KZ~;zBHaEPUYoosd5;Jo;PwC}EnZ56+BfC7kb4#=Dl$mac zvUM6ZJUvC=c}tD7&-;FbB2JL=o(WDWG79a-UyQLj|K1qSQ3RTHW@(yGne-Ed4&;k) z%aY{Plu;UjVN?n&&y&L99!5^XLK{1j7sv_+k&=LGPJKXJ7y3VEiNA{$Ac|GsOom`E zkiDw;5#yd}d2x!K-(w}lZA6?|9p5l_&3yB)V>Wi;eZM=v*GRS!I~H&PkN19@xbe#1 zgjI`vUZ3~LHHmTZore3J`eL@eHQs3$=plV?!y^VabmD-xj4J(b6<~)}mHvQ=-Y42q zaO(BT+8cU>x5CuxMA=6x;u_ZAJwITLGdhrdhsd;Ntx*rJ7q8_K2K+2x!0!f}_QyxQ z@;F4l&l9=Do$7vuEe{_3_5f}{%7gGMwWAx$0=|iO0!Ay)V6a}*@4k2b|KLKiZP-eJ z+z*M%x1z8Eeg-In_h$i78+I0=7crP56SqDJ>d={RiNKeupNRjS?>|rXAum5kc4M#p z!ZZ6@L(=d^of~`|u=}41CQfyqA_fY=t)AiK*!WQs&K8-;&*_D!-<3q-s(w6;G-nyZ z*|Q@t+v~Usp5Qb06i|FZWW0-5^5W;b-Nik_*UEKS`doI(#Kpoa?+_i#tosF`hg{kW z5{^2qhz)?$c_{uFH)AjAwN8g|T-!-VJ5kQu^yvAPkwH#NRt+r!Q!r{EN&>oK{P$~M zaShwy!b={Ke%(FvnfCKe*!#eN0r5-a=YM)1ziwmyLM%aB7rd{%3I>Z)Tl`eS`;H8! z`_!Xe7~>TTx5&~nQHvs#;pV2>uVBH~Zt%nW^hLbE%2VFppq%|a|Mh`hAmY_cz{93w z;>A5z!XqA_`7Z=cM}Zox*{|(v6(&VSu)rCHa345(4}y@@`pb(+ftfRD>n=02uo8)r z;Nk^Qf^OTN%TJesnk=nUu)w)C&&+3=Rkm(3&Yupb{aEO1`b@wEahWE{?0AMZm_ zq0Di=+dAiCO=vAnC2o9#@b=JO;NcEi#Gl&ulwzb z3#*6s2d(Rguz^{4SA5GCA@2`=RGTYtoK5rBhwS5mY?A$Mf+Uk+1rVG)_nzo2gL|h< z-yk}r(UsdQQgZLKRqOPLjzW~{4#F&p+KIpr*o|<@NaZ@G+rzvU810o0uTg?~*0 z=2V(tP6c_Q6qp2WZlkJ)@{oD5?CacTCbx&ouxlHKvAggv`jENYw%^U}$k>(@?)nDa zm-&z7zmL&<>!(n26vV0IrN!t3k!Z9ix8{MN&Wj~b9DaM*IK*5yfsO9Azob0 z;YVCT1{IFGz=?O~t!3gD(HSSERl=RJU>*coA@e>V1-AN^4X1GmdCyU!K4bwm+(yH1 zFF;)bX5spK*PSF{T`qUPPuK(T-omBsEIhnNu}&X!-pVU*(C&Q0b!oc=NTVdAE1uoz zZv0ZU{3Yq^t`1dApM0m?+m)xk*GY=l%+WvHI_K#9y6XNYI{!|N@Q%*%YU!`90${{2 z*Qjx&z!}aQo51oHfsfu`M}`I>KjgGJmV|Lx&cC1I4v5AVif{$PUpUpfOS!=4Bwjs6 zvOXR{g(mZ`|FY-!llW;HRzJ0JEOWK-gY6y^@_7j>L!HGhM&5A%W5Q{q4QL6DYo?ge zj`9h%22``u;*9G%FhQY-QxCy>t=m=}RjvdJ^rS1V(RZ=H8(-g*@JrXNe6tz`#WU#N zc!NgnjhG=pn|gE3*4wzZ_y-EJ(;7r=2~E-gqI~nk{r4QF6i{pHPFuL&FuQsyQDY00 z+VO!dZ{GnD^KlE*+keI!YB;klcz>K(kw4kO{bkklO$~C3HD-f=C>J3AIUTuZA|mp4 zMkLCIsu6U>4!NUe8!HZ5T?wy*Na+su`&0F9^|W`EO0h9}r5^BINyEV29@;M`?$^bN zR2Zm+49&GY!__Jl4n@m*JxzgpjgMMYs&8=ifzCR zP-LXd=Du}Ic}jgpY|W+TOM4s*a}o82$KtHotg5Y7@dM;Z^eQpbi3uZ2`=~p+;e-RUt-$Kkmep4;napo6?p$xsk!>R7&$Mu_kPzfB z`5ccVzoJ}#{E-a0SiD4qii#*D4bqYV3L@PK$VkT!0}P-bT>=tHN;lHoB`qKw zgER~<^f2W64fj3oeSPnH_a8Xl4?dW0&zXJpUVELjUV<(YiDfV*@f`d9Qv#_4x8Xmb&tM@LOZdR+SpTD6b`1`6U_O zkD|ryWekRjViw)FW)hd&Z06PaKA!vj&KH1Q;&oUkEKY5%jLuzW=dcYUssIKB%UZLc z=s^LQreMoEaAcO8$dL1E7mq-TCDVBQFNrdlVJCC~cD<Px#2|Y^HTCPp6H>b&Nq@i=LX7N%Or1?rBs&)j@6v(rf>(TzLK~kM6r|6`Z zML=_IX^qwKEO#OG1FW5-M>7dwNDfexQ0yoFrGh?r=5m2O3C7&V(EC+1mwQD1Cc3g? zpqLz=(Z6IY-*+2eaJ5RC`THagVm@e|*LgUe`W|x{3zxgZaPy#lbD?2wvPMthQ1wl2 z|0AHVOaHSDUAnl7Q9)uGrg`ueX>UrPEl=X?V9oV)48div4PzYjE!qTU0@#zM*L^Tg zL7#TNQKp=Try_kuFftHKH~KljE{F)IpkMTJCCw<0TnupMhkMcUMOS$M_ehGStu+R~ ztgR-YByp_eUwj#Y5>%@^uOpQW3wAx3=&MeYE2XRWXDZpK!-Rg3(v_>iDf9iUI6e(}oG#}7MW7HsojR_ovVYewCz?>)zUjL2 z40`>>sA?wd1M6>?;opQxZcLw?@{CK=KQ)u!yn>zwUpQg>L)NIE)Xd^)p&{G^=H~TM zLD=ZB1HZ>E;J(|CR+vkME>L!0T7T3no-8&f2DeoOz?@GhM)Q{IYGUjPAi?v34s!AH zWHJ#6w&}Dp?(usU!Jh?vxJVmJa5V0xv=vO4xaBXyiaD*9^vah1+-6_JAIhzVYY zA`Ys0c%ZQDp*h_=9-(RQC#s~>Hl|cxyAa%V!AAcom0;}nRpIaPNwXguRZVrf5f(+r?Yh`UbV3Uadc~yU}5~f*fn%4_t^La#_M{aDTtRsu5k}k(88Rso$B^ zY(3bZkfYg6VLk8zYZNk9KEGdWe9{OX-iC?HeUwAybvYl2!OzIh8-Ewj*K%RvD6H38 zZcq@i-%lzcS_*1A1*(x(`9LyR`d#gK3Sho`(QMzBUM&7KuE8$XeSx^1Fx7{YS&_{> zHV?RigC%qi-;UFcljDrkvmnw>6Wblf<~_+)JTiT6>0r<4(0~@h3x#ESz=em3N7?+I zeDR;U@%@XArMj+CIs{kawQYY+z&-{$gBH3Q=WOF^Uk@=BU5K)l?1l48aS4DbUWtN0 z?yy^Zl`oyE7gt}MN?A`Tz|+qVFYD!3i3eBqCjRF-z0@0B1mE)K3HDoQFYfk3+?o~M2h zyQF$0)?Jppkggu5X|@9@ZsE{zJb_B9e1fm@7ENF}MqU5}^vm17UqMiL7KoTZEZ}P_ z6`jR*$QN^f)MiVE8dlU0F~)gc8hyWO&0SNjHMH;u1J!Psx1k)ulI&N08QYwhX>M+| zPEW_IooKFxs-0@md7;+lQQfx=%l|~&30Ri)HeBRt79!}J(m$EaKqEJ@NAG-(W?*`H z^BHLoU}WOX45aCfkeGs4%xgsn<6(Ei&xvaMY=Bu~FhQdw%oo~sBJiJj8e>Xej|;b# zRLX=nLsOfWfu82Z*lZBGr+LF*voZ!Zs+;YplL;3U%XxqhL?2R`i=lt=~cOBafI#`7I}9xj5w6N9BO| zEo2V_%x|3`vfgq|PuB%jwpt5b8XEfmR6YBVc8@;RQ(z)cxYaoIX(;scQzVmxb8X># z?W<{mM1yu@AYXy}3TuH~z^zV>!*_0*JjzSJ^tK1K*BIUWQy+tQ6&B3T{&yM>*cwr5)-2reyZSJZDcn zQcpoC$WO@30NZYq+o8Y*Wf_#(pYz3oA-xB7oVaROn>}dYJX{UQ=|H7D(o`;6R!GpX z8io{7FNY{+JWvxuIBeC;)Oat?2~hCcaCScTp4T#{Y0tT=sN*uT+wSeYF(VLY&bbczwf@c>F(hjr zr9x4W=c|zL4N%s4Wh;g;TzA4rSF_x3e7HFXg{ zz>NY!zw&l2M+z&pjXE%fh;O&C9hR3jTtot)RSi)(5%||+WlOsFpyf@u8Vb#?D#jrg zg&O4b)>~fb>OR8{mttRfbuFhhWweO>Iw#Tp-F@7MzfNrApNho6I7mpe({k$%C6vV*2 zDAY5-wspsF0CTtV_&5e)%fsq{2N-(&Ubg9PmgmRu7blv?Q9Ysl&(Fj3j`mY3f1tg& z>&7}0@lAa1p4rt$x?d=C9;EvVJlax$>M0Y&NjfU(zc(u5IWFo9o9@Kgv694SzH!Nc z|MY)LDPQuXzAh^Pa;BMCT&==1wZ-N}r@^>0=;8y26)}~qB?+7XGy&L7g>4r{(iMlf zxYMilzO9Mb*4n1i6(|Kw{h*PF*Z`+rL(C|)UsTedhE8-FV;#8<&?I#VI9smcACMZbx@lqS$~TkPGoWuWq~<+SklPf0qao#LXmHlxzA z`W0dN8%oh>nfBN67)J{;BzgKV08&i&a2(OO>uHK6;0%Tf-Fu$1+#|;=@G+A1tALfn zA^98civOK6_U}(TYDuvQ;iEdiMmzr zF91{?1UO60ml6umw1m39@9J&WfjwOy=SDG_we3aBt5s}abRPOpW1Z%JZ-%oChqUjh zk@&1aja2VGHHF`TKP!0TJ)bZb7R~LUQQN*vGQpa-?T@A;oU)5haPhI9K1t z0F6u+DpJxyjXG$G%TE%|dkw4hD=x?gN%37t%-fJ7d*L%@fVy|y&K~=K2tC#s&#NN) zzbZHTu%(8}7wMv+*e2#zy-)5jd34ma?z+uS@UsBuzWig7kQXU>A}(7gvJXW3!r%dR zlkdJ@@iY1+^BkwI!=_jJe@tG-@an|at8WKjx%1zTstSq$F%1P`8k5D(V| zF}n}HAax6liRhMF4~^8h>m5Ow@oXT=Cyx@h11SrZl0@QFe}SUA^Hov1cdV5R3+4@( zfrgtysR=qz_j8iCq}1UzBVv;VZ5GkQru9pZ13Dl=9zD6rf?blRzDOuIdCK%Gc0OP z-R!{8B?GRx9Rj1-5wxN_a6wDV_rP)mp4j^VZE@F9te|vaxoy;;``okFaxec!*EM?H z@T=o*^M%T%-I{jMrGs;RMM~B89DvjcS!aJ{KNkJa*=))gbo#(W%*3>Kg*v-j@MB8PgLH) z8AubyUl03*FFK?5#FBYpoJ8s&sQ!{b%gehzY8bCx<$CzWuaJKMY-Ijl_wJY=F#4Mg ztEVK++J1MN2C6d*nSSY4ryerQXRz(XSI%FtUtKJGidO~_;6HxroaDI+(kT?qwLush zR+Z+4X|EJQTIskt%gYB#HVl|{)0y!53)i(wz&`3s(Va)HBI+M-#Ze^|dHSR@L}BbumDKA?x340u=3UrbVMxUhD&r*;Pbx&YT72&1pSIpIaDULHf={e~;>^(oqj2=Ns9 zhGQ-(eeHUBfWMkVii9rzRKUDb+iS0TT5kmI`J5p#@7!MQFsPOP@aE>`U+q;7|35RL zkf%5(Jx_uC5j{Hd(iv6NOFc8IY`uB!xSFYgJ zO- zKD{a}q3LZe@RGc+4M+*bk(gm7arpdAAB=4Qyfiv12tdYlVN3cVMqW%xSzkcv>8?Ta zM0qSDqJru@M62_`3<40jMrl52f_|&FdyDO@y?y@=o4hE;&|XNzyW2n4 z{B_6ZUFdy7T_at*sM7J-+wiYyKV$EDiugWXzGf3Fk^L^~UO!;32-_AcIRp-Ncaj&j zEPBpLdw);{;OEjpZn+u^OPvWKf6itr5t^Xxl6B!bYwZ|F9{rWGqR1tSv_`f6*@UB$ zBKx}5WQp111!awT5+AUo`)espWUSFuSQiDqu30W~{`Ode%GdsND(9tJxkgWPb_EKl z4)+V+6D!?P3(%U2+u$PxeA3HFW?g zl^k}hm#+~bKb3MErg=(rAIE0gau!Y$PRx7&gLV(v^jQckeQq%FW}@&O{{(xD+Bf== z1m;%U)lJMDs0z-dgEt+EBQg*dldx9PIPH#Kc|}CeN#3P!;+=0Sus20N(Mz&O}(B_}-9#Q^Y-}wLZXt=if7kVJ=BkZQi-;_dt z{}>?FP#wwfnaN}B{g(XW6B+t@q{sz(dK8<|9Xwnv*}4kmZ=?42y;X6DlnAa;=_`yT z{cBsnk-onDWih!DN(&RM*>@P&xq(`MlK((X^BRFg-uu+zDwdIKeKQTM3Bj=J$!S{4 zd>Hl9g5y=jL{hl%Zow*73srp-yVZ1h{-^RKQbpg`q)D#TUd-I0akmD!n*Bw?ZNjC~(~#Y34uH|l|9X>`^JBwBBT4-jwc+p+LHTJ|6iLT; z|7^DSwU5`ZOwC{Yioyd2lPRRrgd)TEAFRG-t1ku2I{lbhhJaA+Df(;;O zVx0w+!(9hoBLNVKacSADS4*D_}Ppn8I1>8o7(ZuqxSd5A!qaNb)DN zOJ^$oBo24aBgPROj}Oe#T3fngBxf|7l}n%9mCizb2LSjx9(I*0;%tDYvp3sFm$c@B z39xlv)z7>POU>uj?JsJg!6$Rd+uHBxQ_~zv*)vX060LVB)Er1soji{AH4nq}eQaJ* z+KuW% z<#2D(>y0ZKm0R&Aw7&+ocz#U}vgx)~r^VQUN4X$4&Vqyk&SH}+6^_2_{8}lcNQDNa zjmRTBVY*W_q`N`TDcA_)8LaQ#PDd)8Ki<4qR9=&rk0gx?K0Rq>7@F0y%)MGNvL9DS zMR2NlZ|A8IaNMA3NgvcX%|0-@@fqdp`%KIgI)95ep=9U&AGJySyN7G4XGG|bT$AoJ zFZgwvR%`!)o2SrzRHRD3p%Z9^^XffE&Qs*~MRZJ5B>V2B33d3{$BQ{^%P!0=fG$Vs zuFipXY<}0j7cS^)TW%k6r|kb))P{)}TF%m3{U|6hA5V9AEVZ2`YD4{H!Z`CZJx$ze ztECrieEd#)C#@iPi1G$qXg0i0%Loe=$G*`g?B+T$scglKyUXgu`^{R{YS*8nr?(McMu3tsgYc#jk zhgt5iJ5KxaJ&&Vbigr4fNlXk`B5i2sg^iUFEVWTEX@&INnBn3CkoARx)+{-7R6%h& z3-|6YrH}6rK8K-j45w{Nj3iIbRLyH}DZF&INqb3H4H-K!0+(k|`E5JlDXw`*cCJ z$(Gj`X8_FTp+QHROCXW;!le@3Ro|b@bx1C_rRscO-^iPeR`1y?K*xk%2^G`@{L53@ zi7eFkHBmw(tkZZ_1?@AL6T(TmFp^_;6FKqcqx40sQ>Mq`gBq}jp^_J3+sF!3l-24B zj&hc!TUrgC?Tup%lHtzRQ*oVk28yZ zS{l!yKfxFuNkz9W{k(Tf&ogF4gVVfa`{TRc7^z=k&Y+mYTplTY2hlb~gaO-CIu=GR zg@;=-BJ6Xm;`7N7txoDpA>Tjl7v7s6A5VZL?pxP{P7TQH%_*-jga!>}Xu0GDMpfke z_irqE4e@S*n~-M5Ii*N@p?4#r3UzZ;e+b1lP z8Qu{q%>B~ip75dV9=^6VfqiSj<{or&^m1ZcP=Ee$l~3q0KeD8C1$?|Q#mDqP^=Tr- zm)bFMOr7SPFQhEl$=6xHa(9I9rKU&W%<&4z)Kuc2@S(*j zPo!8j$&*Ksx2r{k!G$ZV?kTj@Eq+$maAx<^etLJJ)Xe$BTc!h%AJZd+rSv?VLZ&cH z4?p;Rsex&ROz|)-4d6j0OW@0WCTSb%{RzUla%%oWm7XC757h?U4y#Klz_3B$qgzt~ zdn!EU{P?Lwp5( z{#7Sh@?&ssi3bM4bc5aQ+|bQxic%Jdcxo+tjP!YLZ+UrbbDgG2bPly=^7w@EiKLBA zF?_zfD$$Tef0Vy!BhMmcFS_8JD9JhHj5^qTihpF+-o3gx59+GdT{WRq$=c(%DPYz) z(^nTU6s>!735Ex&IXxIvwZ|rLn*(PQtRGdzFq&vQE=N5p7n`a9F#GuX| z0C2^mf;n?9}jgh>4XUrzg zflbnk8+|95aH|oMlr68MGH*WWkO<2F`NH2-Y{XaVps2mg*xxbf#fL$CUun2*WZUp6Vi#>!C0XL;bSo^Z|#4D^xEwK!S5e*CzL>=<*hBP9lU4+k_$Y`i>$AFvfnb z;oC5i25}4-`&LbQwi;r%b}My!H_dpyVy#nv2VVTRDx3bBS&<$* zU)E-Y_p)hNtwE2-*;kb8G-rO{_T;4=h006NlT}94TJc&Z81$%9hdbJvfK9S0cCF;ewnq9YEN8q_`nRGtj0SiOi9$pdH<0`= zLjr+PvTvA#Ds|`TI|4z+4Y9ZbJf}FP_g%|#LFewtNSn53NBBA0ZQYnt*8@-Y1JzSQ zi)o(Y>}1dP?gmI9&tpP;q?XVvG07W_^rfRQdqj3l4nNpEJRAFKBA0E7Z9+JsTttR@nAKXslcTsxj!Wa>5h0L^nJulD4 zd(&f$OnEUePCGHk#ANa`n{EQ~oRBa!scdHct8qBv27-wkLdtG~s`YtTyRq%oQqg-- zm)3KZLoxhN^_Z>3;~?RzLH4A-+pSXL@WBN1dk7%bAI%FAvp-0cFr;5=)<%J9of4z^ z=PMre7bBI1${`2`6G5#Rfu$5PUqo!1+w!J7gH3jPOH4-3NqTXw9qTswy@2dWiql}) zk8?z$pe5`e69Tz9_aDlaZH!=$WAuyzGf2zKf$nFfaL?_wi^plkBnEtvu)gas%1YCG zMQnO~h!QCWeX;de5X|kV*HVml`}m{$2NNtO;znE&%1ewyOd@a0BQjrY1CzNSVeS28eak+{bS-0Ao|rU}tzTGOEuuO5BY zQd86Ka80%dDVW+csEu}1+~~})cI>gxFI&)19e9#I{K0|EaI4HVixG25D>M$j0zca- zE5ayiL!-mciaJoHXSq^lR=sd^vAl5YEw=P3Oz~uu(NW@U*jtwsizmnoeJ?!1ZxTCc zF`sdmvgS_lYt1dXqc}BuL5C))ZR%^7%8WDXG<+VJBiROoh1YG2%gU~gq~&_8^4=0Z z_gKqkx3hfrL+<&T>Fd7tjoqnQXk%|Dw2<9>Y}|8f`E>f}<2}tcna>)TGYyy4kXW9e z#HrDn-b55@U}9sIFz3d17Qxw6F`qG?e&;6~;$?{8?AWvsH8dMoJ8Tz>5DR@PTlS_x zu${3T3)1lR+SHG-MhmYZ7wI^aJ4dPIIQecf2N|!2AMS@=^?S4fV^1`DElqOt^7QGo z0h=%V*ACds@rXEKprU~4Ioyz#NbNC)Mvl$XHeI>lC%QWr z^+IEwRwmTO-NRN{Fw5i$>0>rcILy$B%~A#!slL3LU=(}m;%SFFdNUClCp?NX9ptKC+ywk5x?0h*@+!M7w)Mg`odK%68g3at+jDg3!_+s9# z3Q^KDOxB7lyRgcU++jV>hm$j88hu6PxGAMGxH_LANPHU}Uw-Gqao?%G%Aqd1+_GHe z(zYf>S%na(w0{}#3%P0z<~HDU_{^L7&N?+8zY&kvxS|GyJvq$weo0^49Ew8ScMD|P zRg_YVQ<&X+U}$`Ow%vY;Zi-BQzVd#c%e016D9v_#Q}OM#r^@B+ye|5<-5uYieZNQd z%%<9lEtAeV2>H%Ei4SD`q*| zrOHs7s;T}k>a-{Jn3hR*GucepN`f-!36!6En;ZXj)9{h~B$FR2Cg?-JXpBVtWw40j z`{nRMCy@mT0->-{y8|wW-+l2HnFr{YfQhn?*XX9}tRd zL?<}0dn9d_Z;C*KpBwZqUqLJnxuT9S zkh@7$xArz!lTaEl9y*XqkK1}Ce3dm@@`m%RoCkW zNj;berqTm)2PvG^j`Pmb%$ko6=?&6wZ`Wgk^rYT_=Aqfl!SFWv&F3Y@gDWw!@fLF* zEI7<|V+#vz0frT82>tz%@KxigTlAUa=h3O<`UNY7mxAb1_8|r3Z=+kHwlJKMev}wq zZpJA$#b!Is%_K?Lc%zwPc3(%z%89d$J8day&EjRr`^n3g2@&*L;^I% z$h_LJ_uVEsBIZ2JL^0a3uW`Y?N*va=?jfwG{r-*Q8JXm_4VDEPMkO-|%02w2Sz)zT zxH~gBs7=DX9fCvvu9|Zv6QMK5c3Scx{PmkaRSG^kQS55mgwN;B5<*^hHxE4yGUQbC zhJ|GhNESOD8{X>8zPy>UX`l0~i0DqD7-2xZ09M53^=y1z(J9Ypcm8|y^O~CX`{E=r zU&Eoexh!gT$G5(li>hicp5N15wLe&i6|Rq0ZgS`9#&MN~%{{QH^VX9T?4%$mD?@l?hH0f~=0*Tp_9%Ua z=&bC_n$xJr$kQ4)%Eq!Jw?fxv~_~ja5K7yGzU? zdt<=u%Zy;APu0<$uaLbn%KzFK|0MNygKJiZ?)Yf3j4xQR8L#Ixr`#Z7-sElp6ED?c zA&5^#%Rf#{sqr(7tM%1m2T$6reUn=#T1-8QO>WJe@}}KOfHI_>&9X2&%U@Rr(*I^$ z%J<iQzUO>(MinXP7VRh&N?)P6UU35;a5Y98$KmQhlQKKa`IwTHJwX zk!R!`3VG(6q-v^wQChLG` zZdHgJutW4`UX zcZKFf6y@sHjn*l}lWR+pCq2)`L()&6x$6|sJG)kAK83}!iYSzm;kxNqbZMONk>9qE zLfZ5Mrjw#Z&6NmK0X;&!OiA&y+tOQwCcK6*DhELyv}E;U5Ok;-{{T2Z$G;yaN`?f> z)>DSMsBDgjhq7HC%)$=Or4BV?IQno-6iFT&V4vezjZc_mb(wQ^y*3!>l(`fxdwd9= z&9i%Qa-JEKNT0GC4(W%F9%i$j=}k$N%Z_(j(w8F*+cRdPzQdI!XHjz1`7Ya0W2Ngg zRaY6Qb`nW~3S&>|n!O*g*SM1)*hxBF#M#U@YQ7l0_$tm}y)jqC@H&5|JEHiS$M#e( zF_f`E3)#&>WuJ6vly9k704>S0jIuF+DZ^@kwOz4#{ln^{`iD8__0#&*O5}h*0=b81 zHv0D>ZE9(kOV2M~WaVePxA=Yz(O~A$LxNtm%V@u^#Kb0p*Ot0iOF2##LH=ima_)ni&gLLTDpf}VB66W;nvW{Y#EM3xh>yX#833&X>o zjZ10`QmC<4pwd|m(Wx8G<1miQ*2>d9fTg85s+6(j3#iu^>ua#r44F5S=l5w(m$%ft zyZ0{WfNjIUT8Z^RoJRUcsR6&v%hzGqTCJ|lxGE((9kovN3s2Xafxs+=O?+hp$M(9a?Z59pvK|K?-jV!c) z`>RlSYH=9rp1`gSVY^;(VvQBUy? zECK&E850awPC1hb$mm-O>6x~vOOpge!*`2}j%@f?uy;+$D*V?1x2KIxuLKvBdLxH$ zN-+@f-E^MBMGpS#SNmJoqxXM+*cuGSk0~wTAveEd_=y`^j!Heb{oPjDf7G?dsYJu3 z+`U`nW>H6}y!@cL%ei~{6Rh>SL{5q~Fz=M=n#7m)%a2;)re?}kB0Mss_URMRbXHfXDocW^d zI3I%GxK?=&8a8`iTwsS<+aiiM$P=A$uWwAV{=_Jv?s4 zH5lFK^)@E0K+T8hnAc!rA7B0pYv&miRhGnYQ3T17L6U$Zkt9kEiU=xEk(_gAf=!d7 z5+n*Dl7xl1zl4M)o!#`}IyZtY6jrQ&dzkhob$7&m?}4{lVsAb$X%sd|EF>k;MQG z#VvI*zc1pT*cYJ`+xxYFA8FbL$TFzqsd)1ARG6(tFYcY$_vKWUx((-uVAlysi@hWEm7C59j z>Tr}VtjJoE-0&x@s6h=>(EP6-4QiOPet`R-pnrT9a($tH{@MAlXzvsWGL?_j@~5Kjn_COIWfH2j zc6}1I=GZ#sZ&4<&Vxh9)B3<86C1j+-#r73>bidwYC~U}=(f4<_()kJGNycYZlPfi= z$wIIC_V|s#{`oV8daoFZHqrNXV7eSjTVO&IiO1&U$L+D*Fr1v${K9upC@Vv88BA;8 zzJAW;McnI~ET+$yC4CsWgV=;^r!}nl1|w8VYJ+N{o$^rQ18U^V>6oJoZ5tV+ZnDNl zRJtE4U$<>h_gxYNI7jBeh}l?X+0@T`g3d(cooysMF!>%o?Gws|VbvPlT ztJI2$l6<^*L-Yf}ix1){RQqMe#FE9Pqn# zf#%*m^y<OA~YWV)!aaCZm9XWxgI4aW5nRK zT6~k+4<&u~-@T7{k;^)7dNt>v8+C`(8$GO|ckg}g5|K>u5nPQ@Z@x~o#X&YHe(J0d zW<}+Yxl&x>5enMu=Zp)(9pL>c#T@q)Wv+RlaKmKu{!>VF^eSR;6XO&iM9kShIiQ%H z+T_>xBx7nBe&ot)$C~ug?r3?8!`@k#puDxzzuH1c!zqJqR7yUiijH@lShAU8r~DU7 zJWsE%54Csfv~}`w_ycHL*+^gC_bSxW{U9xGz2p_FsR@H2%_clsJha~zG>J%0yvr2= zJ*h3|w^1e^^z0GTAb-~pAI!Ruo)T1(Wx-^3{XhOV_ZdB6NC5Uw4fwUlCwdyk36DP;CkGTlZS`4lZoCti}g~4ua)Ha z=IOKc)xDCBj*mm^n1DWwjIT-9IZyX#&~wIkV1bbDjT*l;o@4&A@jMS`JfDXdrp2LZ zQT4`uhr->c*9p2!gVLy7*Y`KIUg1kkcgT+2-q2&bY6D8}kED%1`B$wg(ho%$;}Bmq z1uF2Tb?@m$(ch)gv6S#u8 z6klt-y}feT5CC2erq!6w!qwBu5ae=8#72fnd}U=?pTayChQA^|&N7?D4qI=F2MyR- z2Ye8a+}T!{#Eu8y7O(A&EilO*lYLtYQG1^%#< z``^tNS9BK|HdFBk)vptNgg}2~3Ohc-qzS!Y=rt`Fc1$$`V0zPe0j%vxCO-*&%nMe}*) zu_6XO6d?DrZL}sEuS^vu*%s`NQ6yvbnV-pQ%=yz5p4d2JjRER>?PAfQ z3p?f^si3Nq@Y@0|?KFCtc9TyeE6;cm>X`y>jR%CHsw2z9q2aU&%Mjrbx$CEF@W!Lv z;~YCC#W_G>_*V%X=T=H|_m${&z|-H%oZUj}Rx+>^05fN?ukQ?BLN}Bja{R5jBzA~N z^ovW1KG6Fv#`ArEn*|nTgS5bxJD&rPurS1DK2`jt6M z9<08LgOxYJ)yd;zUhE6vzRzGc{P_Z?rnq3@iDcEBPX00HC#pw-#R4U%zgb$^x}!__*rHD9y5a;pK5%CyvE*|R{D@b zL;I7zW2C$R(~(dWmGDHs#YZGSL%HtZ!8 zh|&#r!nJQ$+~NGE5|Jt$M@TMHK54k5u^Qf3*Y^o{T!vU9W6KY<8iZJP0PrA zN%Y2R>84WpgU2{#n{9E_=51qcG?Kqe@JyLol&awMp2|^WqQ{7l0qHzO(bZKXn`M2O zezl2G^^L2s@N@aV)E?BF`{$?j{@wJS<@a;YbN*xw4kBh{Cth!2S6ipWtGO8*+U{a- zYoxl_!o03U+>B~E>^P9anO*p_rI6#0zsMrDC#T9lJ4!E8d(7Z@ZUpsSXrSy0uw5x( zFtF|bwXJrsc9H%PoWgy`0obk@GZ#2(iYIE)yzF}l|LG}4grbma5wZ4;>u-U^y5ott zxY=tKsVYed9!aBLkx@A^W1p{pXGHx~X%Dmx7qb99Ex5nE!e+@fNV2dxo?Z-cok^ar zozu*vxv%a1aZJkR&Q+B-A`~>FOWCJ$B5!P>q-WXV!+Z7gC6ZVU}z#yNl ztH|TgwuR?!p8%?!uPfs!As6<|fC=}P7&{URui^Zje>$UW=uX54Ef*iH6>2-jd@FOU zAv1WLZe_hA(@1B=r`N*9zp>B57c!R8@_Ls%Un4mP+_?^#h=Fy21C0|}OI>RymW+`^ zHsPeSjEiC!X06>CAjcX5GkEYO=w&~A$!7_>ySR1qHgftLDQwM;V`8oAWOk8D9Ku?A z;JtL9o_YJNaZM2?rKnAvsGZQe?0$wSuBcO*YJ-!*qf$0v@40shf5~ zD9Pu4RDvQDJR{l#SK!~~0El+LDoWjbEtR!;rakW9lm05NSozVs@aEk)vpG1ymv|hU zOAi5gTaovhu)_aE1q~PJerdkuxOb(M<0VzJI7$nI8O3u8@1}|b zkrBrRo@K*TX8QPRKEh@$tu)a~l4to4o$`EZ;X6DAj{g^NF>!)CuQwmu;gvc^DGAW+;vj#oSip=Z09%{4 za0drVytGg@YyvhfRe_7~Q@;H528)VvDeuLa#&bOEU<3+?6F#<7d^rh3ut4&`z7q$w z^e7(?ZA`K*xH~s@Gw~fcgK^&Yu}_>ZD1Q#$8QM=U!ce9ZQtPbPN-n|Mj-RyG^k$LC zE6sT&W0k(!`xLMArMVm;DACHc8TAhJe~do})B$;5KZ^M$4o@&sjjBJ`>dY%%oR8V7)ZI3f`Y40scp_cn zOen8sHc@j2E+6R2jP0@q(-l)1qxnO(v(2iG*s9x8cW@Z}ON|C&vk0Pf&WSbKh;pI! zhLouh+}hOri+a5GDLt!qsWkoVZG-uOmCI?@o%9P7?j?=fE{V>`|N5Eu;f!!)-i=(_ za=t`Ov*3)6Y%aDi`Ui?ai9PWAN(!6Y56u)HcR4xhHN#`L%nTpg{sR`ukl|(+L65FGDxr7fmSWqx*D6-OdC1p~<;tmyU!-Ond zpQG7dA_P6F4S1c8q+h-P=WD|!xIT6>+sNY;%@|)c)llrscX`XaD_>~jpZSxp9qCOa z&|OKG_Ayt1Rq`l38YCBzYO8i#QhpW=k}MG|#^#$$Gi&GH;c!P?JLgS2B?e_TnD{C}-vivPDmP1OH4D`}KR82D)v zGUp5HfkCS~&M-YE7!8ARbbYRWjWhG#%rF$dSjtIVZpA_SXimUK^E?Xz$&k-nVV0Rm zBY#S#on4qv7c%t6k`EXe_)__z4z0<@^5i2z@GpM~` zt$|tCxJ!@5{*0~cPSA;M;T9~L>NCZzO9Ne^5MnKmMt(-+$~DBvTgOvez?bYO)N@uV z#yg{^)m0n?0$L-wPJR`4+SkC<3zjLjS{Cj^Xt|$7C$$ii)B5GWr?oI`QjSg=B0%871iqsSGX`O~%^>3mM0yAEvkN(`AXR9u2%ZFsfi zF|1+;BzQ}durU1nrZ|geVxiJRr+KbCSXq*k)=`o2n!ZJnncQk_h`87^H4oLyt3y&f za5xTqZ1|*Zl)@>w6@FSm{LWKuRvQUu46NjO(pwx zX4hnF5;{&6>5X{f@V$TXU-&l0x{jscGHD|nl7uTHx3DzX8dUEi`eWN6-eqw=rDU(#rvaj8uN+be$UZ12o9P%y_tY+sJM+(QC9moiq-U zRf}-+$H|$Gp=)DU8LDW*XVzI4nU1Ej%2(95pAVN1*G_kBfLt+822yksyU0kexa~0L zlO_YNX8I9JxFM^cJS5U)(k6pQjzO-*z~5ZVuqWq;^boT2jSgY4+%>M~J_&W!>Dd;h zs{%xW!;E?LtpV|~7Yt`|BuN23wQ}CPr&wnz$HmhhWcgc3L(H>djfCN*C{is@1DA_L z`a?r{VR6YCi^NbDf7C~;VoPba)dYuw(Mr#Few&5Q(zEAYffkyC9}E6eSpMf`AsEb^ za7eeWH)b42ee>F|R@9!`D*`7q7PX96t=sNM!@Z(J!%%W8su4#Yf5(mwC5r^Cc1f>} z$I6Ns6k?Kk?_odYh}UYb+@^cGQqDzv=rI{)dv$0VlE{@$(O;kDPf92>W1%XfOK^HZ z9$b@5b=Z{eu~KrlqBA_(hXLer|P$BvLFD{s$V4-h>uQ0zA z`#qe%;2ahOo2sw3xcr0X5zOB8X5H|OCKwocIJPeM6M5bbjiaG4v}7o;G{*Da3}tC5 zoNe%Vh_Bx$hIQJg=?C&1&!#m9*XhS;&T zG!C3!D}n0@DT!SR`TO=j+aFHtr&l)&fsa;5A_Gimcq= zWc5T?KAT{!S_P$ztpf?zPc~v4M|^5lP$z~Fc6GuQ~MxU@NQ$sYH#~; zCs?Hfr_9}gcpl~zd+f|#jZv>ka+&a4UieMgcA1Mmj1&IMJY%;ytav;%2clpsjb9r0 zbC>`G=2}y>fo=-I>Y07OM9d*xXzy$lwYmcD^j_i&4*js?bP)eGkU^J?v^$Y!)0bD= z9qfo6gLI%AXf|zFHvwJijK~hh>C&#j)xmz$>=iqgRxCL$C6IODw7lEEYQ>g!@{KE9 zd^%o{RCZh%>lK7svocIKtXwE4@y_tlQ>9SE->{F+ggcP6JX;rL0 z&g=@yP(52V@W1iIuN3Y%oIPS1PI0Bf&P;9s;={N~l2iaGy0mHI^)9H=OoOL*eZb|Q z*lO4?X;iJqU^%g@zIgLB;6%atgRft4AV#>t6?pLvyAygk(9N?h{DD#|O`%oYy@~5jFj}_()l!pBFGw~ynYN}-C7WrfQO=X zuJFP&lulQkw||iZdpjV;=j}YYyOOYGWd&q+<4^V>V}PzN>KM@VU^64`u2+~gOphZpNUUf3d@o)VulgL>!%72P{wv$u!@UOmZQdo-*3|u8 zbyoZ*K}YO>0wCy+1g$^#pb$9lx(TE5GN}-iaAW)$fRZYgu}QUUdT|T3L^)cI+%LzO zEW=2aJx6J0`Tzy1{9mrx{?u#&Ut)xc()H-+7=_|;l4*RnZY17JtCWj7$ikYNt*=gX zT2bFb#=O%rqB;{XvM#PEaYx4;oF7(WR8z8hXK-h~l)FFc47&&cNd2H_0U_!rH zendc8X(%QzvNP^(nxUpzO;c$Z9k0d*6ruFyhPP_z3w%p3xoNJj@DY z3?r1k{N?XgzYI7)s_6$bb&Q@9tFiN%tG2iWQ&XI+{>xmM`W4A=RG~mBTT@p6IUA`!q1~_Emj~#*s79=>MZJ zm8LsKgeEp*Jov@qdwlyZfSSt=%g)?w4vKXRqw{^&)3AE=f`{oJiIaZ=M?JoESNAdw zAVk}{G&eayu!W4q#Ox<+XoQgW2^asoCVtZnnUu&7Lyu-cY6B+T+lr~o&>7B86|34BYB+JC3<*xTLTxZ^50Fp*)^|8G7MeR$cp3CaGm4`AHp~sCcM`_gV_%3>8y(8 zi$mce+Zd6qu%r!s`7bZmM@^8$%MSIlhC!m%g;TpFMyG+dS2SHe%e!r_4sU-8JnW!d z;gLITA{n{qJ0s|O`!HSJq}t;@2|WI2ZY1^8pF?jyfqkZt-@v2PNYB6*wY!YKGUBAS z8oz!|W=*`UT>C(2!hI361$JL>ptL5{q9B(}7$GXI?>wT}(v~{!BYfraTrt3osucLS zxA>zwq3|=?-i}!9oOZc!fRMC)(SpO|4}MVcTw+VMCrz|K@ncHh<_W^3Y0V!dyJX{e&^XUrHfPv za+L6(y6@>pX(W({ELsc#YyNaNrJ*akX-Mvq1|adEJKdbUFiCy3=7o1`XRK(p{gp%$ zHItBHI8RKx+gQDlv{sQHZ;Q84F|L@%#Y1d&J4I0{a;y@Pgdx<^CJxF4&vv+s7f|74hVV|Gy6i zFps~SM_2WrLq%lYFMPfW(VmxRo~S63mJ%be9(d36nB)bX>{UKDzIAaxxjIan6e%#eZFPi^F(%YBu{kCR%-Su;P#ytoMDCeE?Ooj`6f z9jv;&Oc>dAbcH{((iW~-9=qY$8i%J-1PP-VD<0B`Z(n@AE2Jpp*?uXbLnKMX9sybr zSlPmspX2jx8{&`vcV0SX;kgsCn*^@5g!_X`^f zmLk^AY9vZ$Y=+GUf_Yq7M7(y`Yk-?Vww;Qkk^~2arH50!op;}@T@RfstTU)Gk}-> zN(HT2ak*sJ9t3CPc|lq$`_U2*MXRZ(wG5# z6-yPhg5i+xT_Ns!koMaLXUkiN@*59UtZVNQ8zgciAaV2+5-eRFaM}h}Hqq#xc0UKG45XZya2fjAX_b; z<)W3?ArzEfQ`<<$=`~dg6Ai=I)W{bx+Hx1Xoxh&O=^Odb5A{@91!LD02=liDLK#Jk z$5=q!E;j4*?T!{J758cGzrjBW#oZlCF7LGisFfZu1wapb&=6}pJbk|3-q*Qi>SBS$ zy8D5_F-*^EoH5~_B<*V%8@um4fxx-C(vv%&C!*VKh89LCc_v>C&lUbV!6N{|*aN+S z%Gaqlp8mT1J=917Q+Q9dFV!}VS3)DMX%XIxY^jCLCa4 zkJzs}ytkSJSs^}x5?_#NKNmKr3e;rt|68n0n*&rv4pZk_FTTtylnw&rcU9Ci(F*EB z>8MjdRJ}C~E6DYYUi$3L)i?&>?A~TZQLUT!aUj|>o+Uoh=Z$X1^#nxO1I*eu6knH0 zWEl0}P4H-;Jk93#PD2asGTB|8j2|2SYP;h#52)r>G>hx)i;K_rR|~?G#wKqL%Bk&% z2YlP;ho;q>lA<>KQ2xa91&4s02eaPojQ`3}AU*nj89R66y@poOlJR;f{{0d@6&=F` zrhMI|Jn|W-RCp9paf2nxpFM54$*Dgo^K$E?5pf!ZA^$=saO_d z*2g}TnIi`RX3rx4>Ky%g*KSF(`064I&%AHkJ9YIG4bkZzjY<;Dn}9;hR2CBm$0M>& zgMch>ryf{geGmZlfmb+>sxHC5Fjw2{_Si=7U`%13du4tl8#4E^fcL**N`zm|hHOWi zhG2(AOa)?!sy)md8a6;&H-s9sT|abb-pliDAz@BLu6@GA%jb7ujkP!L*4wvc3)6+K zTfX#YJ11TuH}cjQ?uyJTnKUgT-Mm+K9IPW5=2|w)mA;tf&&e$`6)IZa|7vk{1YQ2G zX)iA&{IvrLxLIpHN9FHr_lEfsf1tkt9SmhVxQ{$C+{!idUD5NJVzYM<5fY1k>a%!{Jf6{GR@vZ(!r|rFY zK>kxVZ9kID)S6{GdzB9b6X&1&9z%CVB*B(6a2jWAeWDZnI`egO%3T0BFJ1Ea(GiK{ zP*geTUD8h&KzVPK_MNNi<^-l&ItxbQ5l2I#9B?sW_Mcv<|BSGo!}yK`V*32Wvr{t| zI5qKZRhT`!ng6UU^TZ)wy7_mZ)mN~K%rWlzTn;&>cOdv zO11;&iy4+Q-F+X!P;@hVyZtDX#4**y22`ChzOa0=;ld!`R1){Z$EPDUuLx@JNj`8o z4b?rR>`FXlo-E8FOaw^G&2RgchkRe8{0)l}&tzU#i}vb;$z%k#-uX9ibuQJ7q`XE@8E zXEzRJ?A3v|8bQ+ngnsz~{TZ_)t1hj06CccOH)1CiPFcI5PK9^9zukKzbR9oLLgB*Z zDxOvM+~051g9+z~S10u;&Y0yl{u_U;@BXIt*&1HM{>Z}nn?&RKrDkQa+5?sm9b`&i zss)};$}hf7U@$Qz_Gt^kaU%|QG{ubLzMCDP0)3|qd%~Gk>D4=^=*nk`CI72H@qaLL zb)k5ucd0@l!mP2z;bhu5PxK248{yfX7V!CV<`|q~Yw{#lv_^%Rw~WgkEgiPVOjhMn z0atgAS>i_`Z&;(irV@oFOPkEqSTDvJcJG(fXekQH5m6?9n~1S;$vy1N-p%6>vAsBQ$7IQHQFJtSJ_Kd)JJbOB>L?)rX!T5% zI=>wWwdprCkNi7tj+A!M`3xcGu0h1F0=snR0u_}+ZD+1l_#5f&OKj)wWm3$3n{A-h zesAF;t%2H$P;|wcD(`4~bso0TNPy_9fBd@{24qj=ROM>cYAY@cSp`%3h?=Vo1GuSG ztupU|Q`vP9Nk#+ED#x;Q&^?rN{k0Vp(Kefv1?FgthH^7s-Oh=8<8e3f(#~t}f~5!o zm?>BvQI}{VVa&U&&&UveEmO&$3q1-tKihv^%i5F4;y4JDhv9iBSU!wo8^I`tipx!RL(*32-&_b7X%FtVA^K zUIrpnkA;VG#4-<4O#L1i(C}vppcU7_jn&Uer=E0{#lVw!-8tXUc!x^ z8hrUL5A!l0>y@XL^&!r*%2O|B)seG?-ZH-N%l1f0q0#&+wf8JZ6$JHXj8^RcZSjG^ z`MPVgDxv|UPRrEV)}OJ9{m0i$l8hxQ5=Tu)=A3srm>`-$WyMJaJ4t-8hk&xUf`>_P z=d;$i`nY?plTq6kUhuA`--lxQW4te*KTxIFM&IvgKhO+#{_=ASDh+}8TT7BexZ!v2 zolLZun(se9>(;6Lo4R!}&=q8I5Uyj-Z$8k{%lQ6=wB8<(Ds>I4Z{!Ls{r&KqidVk? zt*=gs9eipJmRxsogl%}TPUD1xaPOdEtLKC*zX|6q2?-5}?TQ=nM8_J0;Zi%5bsf3+ za_y9LSwmAl4Akt9nrRq^W+my3IE=%Xvm|$y1{icH^#G^$@K!w1oM*{BG<8utUY>6a zg_-(wMb#d)V>|9Xx-{hNFO^JYTEdyr9mcsd+P9;--8XS4x!!y0w1elZq@?%M!nwR7zkjFy8pukTFcDameVCHw=VNejAZ6@K;yH)gIE1X{ zKI5pcS7xN{^*t{8XZ#m$&{xtVMtZ0I;18FLLunFelstLVhErMysJY9!nhyN<^S`Z^ z>c~E>EUop;(%KILb&zx=vamvEbD6_7H7NJ9_L*oiv{rVsiXLe~HYZrdb^-EGXs~z{ zA;7>FdvLbt06F{WjreMtl~LqJk0g$_y9IU$L~CF*uluKB8b7xzlIiGRuk`pe!S|YK z2K1~22{&b}0z7+fEDBF;k8&tYK6%~fVHVDZdA!)zJ$8va@a()Qrg6Mgri@#<{_}^T z{m)j0^w?G=ui9_Dso0T7wTpFCgNbpPC6e}jg$+wyNvyXjdIxBbT>Myhh z(X@`lc~Ak{JK@|jD=`(b_Wy&3wa!=b9g9QyFhX8C+rTf zkVR~=*o$-4P<-=%fM|KNM$OxlBI&eby$6h(PlH7w$f627`(Es z`%+5R!_La^g+8f$aKd(;X;-&GL}n7Rlldt}x-FmnP<=?5(-FlXD$Mjs&G^!mYUCzw z+_Xf`B6zrx-z2LF5*xmLc#P8BeK!%nZEsiLeOvpbiLg~`dAoL@sQYl8_nX5_QN$Zj zwrwcse*VHGRL(J{6e3QiW8m+E&$nV6S&I9bxGqI=aZ2B9wnd%=A3L9v!u^Ze7 zRcWW>bR^|?LN2>6ymj$F$1^uO!>f7^yP4!c0~jC1)_k77+pD;^`^HORyvARMOFNlp zsCsc+-$w=+E7EO%=icfh6k7z=3Z>p#4ZLO99b@Gtcjx4$fb`-&Si8!wD7!5xqS7cJ zUDDmsB_-X`-I7ChDM)uW3W9V>m$c-7bi>dw;7~(z2kyP!{cd~X7w0)Yc;-FlyzA_D z@4eQNDCR{|0#(h65wa+O$n=W{^gEk4YnV6ygzM;0&bpzqj+%=jivA){+=Wp!ISWor z!2{+fpX0{<+QDX^@}W}I$3n>+TEz^vHCh;dRp6RfyoTknKEOmZYL{bA?;?m}pmu$e zxa(G;tCpadiHK<~DZ6fmPXFk!*> z4*-K^a%x>luL5iOW&dCva73Sbu(tQ<M=KNvXqTQ2a8k-G~=%7ir>V$>-Y20Aa|3H|=(`M_;@fa@UY@`*vh2Nqp5O!=*IV=I z&8>2&hUBNt*Gf={b&^2dwZrPgZ58JQwliem8#$Vobl(6ar|CZc=+G0sMRFDYr5$(G z%hD+TzTG(UGx;O;se*!~o3)`MMd`It3$hk11y=G(^XS_Ff$EcrS=lk^4lc`AH>aBe zOP+K!G$xBTat_wD$(Kwq^u4yL23}&T>M{Y3z2?(Rz<^ItW-Y|xyAPOJzR{B4hgx0fw!A*Ma{#q&zsF~h6TY&iI>J`8c~NylzQwCddv!^R zC-rv5#LK53bJf`0N88+qZBd)X&L;VU%8BEWV6YuUeW=6s zT8FN7=Gpuw>Fk2g-0n=xErqEumaz_v>T>u1{?B!5Cz=~CT5}0=GjrCXkIMUf4ZR|3 zmY962%k4?B3Z3xVi34kXw#Sz+H9d{O#)B70uN8HZvX&$f_qw>(f?K9OB0T!-1AfWM zk+AO5&vbc>mRD|~N-u5wA63O0=7&GGr{v{)ar-I>#e(ZSmxul#Cgtou;?IGy})lQf6vqy(#}OCbm%2aNh;lEveo`vI$+AsAB{wFq&uVg(AIth z(+OvzSgA83GDCwk&>F8DaF)8ViS9HDZ?t1Q3%Az}r!Q}a?t@1$WvJ}ruOV398*Si5 zP{1Tc^v;nIzJ}X^X<*kr=@q=qI&I(!=XyzA3pv+|)`u?gTzQ>(LFh0M5mTxJ0f9<7 z;@23&LDLr#qS`yfZyJ+T{jm9L!a98GC5WGt2vZHzq#^J)1bX|hYD#%NfA!M^FZVM% zBe99T`v=cmi)(bMW>xlIc zu5xS9D=M4=FVSX?Y8}2nvcQ6IJV(?>*&3N?6RcPoe%(a5hTNqU=@sdgQz;8_V=XpX zbUJ84y?aFqHZ{EY?K|o*1~~_l45eY|&1%d&&F>dnYYt?lhbrPFeMXm_@2MZxnKmiM zSW*#|Z2^#787_22>^2jVOw{Cbt6z?(zcj7$TxgK0)>)o!DBI0*KOs`7ZHq9^1@jSi z+VX+SnM1RuM`u5W7h__zMwV#4)E)Y20yS0Ks5t$2hEBtNVTo>6G-GW8YK~M>=LnG zLM-xff+8|<&YF_T?-tYU)WD2J1*y0RW(arqUS`xJICF~u`7s@+P@($i0D*l zakC?2R!f^D($Km%+p*abozCmT$*6(E;KrFqc7B))yO>m=duP)DaoS66WdexS1mb9J zyGgCq^2)@=69vei;VS!=i=$(0cnZzMiwEP$=B(4PF~O6yx*}7E4@`+5zE&Q_dX1Pw zGsj9uM)YMBam5k;k+RdU676eMxqTzMM_0CW2eAji*xp&C0ZX3lXuAU#OnUhN+Ivmk zJVqb0Jiq2ksYW!Cb=c$47Yt4y?j7dmoI7UD2-B)2C_MO98qbB%D=w}j7?lXGD?v0z z*{&LD691NHAZ_jq6q5+pMo=L*{lFJ(y?bvHX!VsPEr0my%i@;q0}`1xw)5JHpY1ui2Ym4u4iqju!`6L zmQ^^%P%TVIR0_3LrtB3u^G}knX-33WLOT5Lf~1ySO36PnZh(gL5bMaqv44s~8(j4i z&-}x)AFfl()khck7M`Asl9-g={KgOnMzB=`cSd5E-#*$O@k&!kzBt?X!RyGgAaR4Y zq&Lp{QH<{kZdLNjC-Q+I8y7yn?KJAGTZ_*K>~0Tmj-LRt_WS@6x5|^<>94}@*HTxF zJi^v;wXKcPKwwpWs4*I^Jj9obv^+&w$jOJ!_<1nlIPS!)CqcE>MHTo&r*-w{#H;bL z1!0Zu2Yj>S_fe6FM4%#Fp?ak0`vcw{V$$~g?Sa}!z(ijek3pM!IjIxT0THd!&lKi9 zRO!l_i^$mi_n Eb_Be`@tyHbc^{XPJz&8OIn<-aRJB;izX6P0* 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%0DGg~Yzd%|ifaO(bl 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Ν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

TtrI;ig6ox9X9 zzaklYbmtv{RkH%IFM@jCF5i;Q>;+w%TriOsO0SV&pZ+wBlhl3xu5G-|B}d9;+WJPq zO_iHK$6w$v&MWq1Q2VMZ;KF*{kAcvplydXjPmwA0xi-WGw(fePh3{zmw1r~62sh17@oX4jD%h*msj#=+kT|TL*Q>E;#AvNWO3twi+fj}zg_<-5sR!i zRTbrbk9ukTY@@)Rw?XGy^C3RV<5Eh20|{`&6vIXc4$PR#w&@5NxNo@ZVW_CIuh1r9 zUttKh5!Nu>x-xvNZtQkuXl6`-*A)2ym>b&N4@gI(tEGkS0a6&cA50WEjY+FTh@p=S zt6n0pZ)Xd~7?x|7RoibK|5Tclt=`SqZLF8Nc;pY6eQn0_*pEoz?y zj(!84s?(X9yrWj0F}X#U%h0%b+ zBW@9>oOfG~S8I%#^pfqeQFg+$baa}HErKe^eN57$2^TZicmjF*;w4whLi3YnED`pq z1=NerbNQh-hmTj3W2ixDaMo$Znb}Z!zPD=i^>#k!+pf$tTLI%9CE}1 zN;R-qk;m^y$WzsQm=p6zV!+*_@Hr@Z47`Pfn-}5A7g6QCQk6r zY12hCMS?Um`+^~upyB5tP50J>jYJ;_`oWCDfA%-h7Q|>l0Acu(>{Y z$FB`3@%gQX?R1h<8iM@dsJqw70)^jNSpN{je%D%MU>*#d%sG;}q}RvrFG~ZqqY8}6 z`7lzM3j&R!&LB@!){vCq>1?GJ11H#da{wqN2h`cCK>#%)>o$Dr93OxxetbpNF?#;9TLqlBM(Wi<2mERsF&AU17*b#sNaMRR=s+*rP&Oa*p4|Qpt;V%ElINn02K>t0 z0iZ{*9?q$+R4Q>h=~BY_?v%-P4pMb-okQm1g{cjn4^mzrM(4KKZJeq+)3L}m-JEb7 zIQQNvd8n8l5(XgwHh=P}lhZx1_Xp1FnWkdnz~SC3kPsTvdcy?4tQsADsT7u!pA-As z3#8?st#!=y>d5E}9w+YCP%h16Y}2Lby{SIe+E*#>g&YUEX@EKKszoLW2~9kK5A0OH zZ5iYq0^d%#I!MXU0gW|pCIdfW`<|!W@QIq&gHGm+7%QpTgn_;>(9Gv#Q zCI$$=<@-OH7?kB)C^IU8)J0y-*`0$n(#-HMj&0DSMg8P#c z9(@KAnN#`tbfk&D?VG)(u9xnIGVCAiW+HF4uD10AMNCsOVs2Nt=n>@^y@4Gni5%?JhCF zZj?Wq>fey9$&&3jyT1dCiKEO_s}&oIhy0SLWHt;@(ChQ@<;-bHK{i-pZtxi+0VS+{!Fq>!C@ zU}lJioTB9SvXT2&IeS%QtM|%EY79Zr!FQiy`0TWP#(ctJVeoAHU91uZ#nN0T%?(>Bc~WNKt8WX%?|tj{-#MgLa+6D5)i^P8{T>BItQ z?ovl){3j--UO=*KSEqdzOV&_PfgW9}3kD`blm^J;#eL(JOg8*mR(B=sCO+nFb+KY= z-^Lvynb3ih`N5}~jp6q#-{>kF+JNedeMLeI7aF0M9S9&wA5iwR?A_zM;mR zWtzKXe#V5K)%=n1VM}|@?2JK7oEsSw>jx}{w`1W}^F1p1%whtot;=3ja(8xL?wjezYK`T1UX;`N98gopwj)9G zt9azVU{7u@l{~raF8M&|O`Bc&L;Zws-#CKuPnxBMA*_j0e1=y_rft(W$p*ff=pjrA zlQg-|vH??BGK?f--ssLeHAgtrI;cRxqI%TcGg1G?_V7 z1)@Arb2cc2?X5oVOkYa-R;vr#u3o+=umyYK7QWSs-%-2%72d3PyU>KW*=Tx@Ta%x) zj!~)C!4|iP7x7C|o*g_~WTz31oDz)(M5Z}`bo_CBzq*rVBB0XW`(l?;BjXZz$hriC z_>CWc>R3%bmE20S0g`zqO)^fT@fN(oYS?`X5GeWp&~Ee{4qV!pGnq|+OjU4cryS|x zXse&%+F8f^ls!2g>RTDt!aGZAVN}j6$UdWVys2okzpb`lpsV9;d;=b!`ytAlwc4j` z4b$B-bwa;0WCsmXRPt4P*sMJ#l>On!$S;y^qX|0o{nwz1XVdHwTxuq4fG^mP%`<4L z!5FH)?>A4a)iyft`q@05wNeQ2Gyh@%&Qh-6yzNjQe z5`HQ6XuZhOQ}1G0)He^7F}92?oBTt=9yCDkKB~>7B|Lk3a$_%)p}P-5f=AP>PQ;J%iK^k5PzEWF)q>RKy6{Q`V$sHw^{lY=%^ z>#yW(5f`;LUzVsWY#blkn()Fl1XN7fHqoxi>OEIj_%WQrq`(bavFE>h{qb8C1rmc4 zku5;QEfo;UP=hnDnM@Hroq^&kGTi55F+e$Ww_4A zRflU4aw1!wo|*re(jria*oI<;XwooM-awbk)u%Y0>T@{<0=n_(jEi<4Ef80wb15en z9l~?wp9|t~Jv)ps}@S7|e+mq7z@cg-1V^uji!}3C$0U18nxd-DYC7T$E=LhhO>cn+ zi8ud1yPA>;F#Z4JIH!H4N&nFWlhc&@O3?AUah?vF5YgXmg%pCaa=s*U7r)j~`fxBb zxORHdhmCe~vWv&E$hLI7YhZFi*bSKYJQpvt6gaz_uva!VVbl#{ZjkYg1}j(BxDLxs z=QEicg6LL_5A0thiMPv=xo{jcwO(-?9l+$qc^FE<=E*8*V`XK}j@1wtqdat0W?x4q{cmzwz?@l2@Kj1 zWBb2mYW+&AqLohZFd}U~@5z@JaUP$8r{6zuQR@znc@KwLXm&}2Q(W>412dFqjnq?b<5?eOw zdrEzxvNd(NS!v!@RFMlS-LPHSyclrm@|d(uzjfu~8IQTg%HYyuKQ<$qhQL^0w|VgWYd< zk{UB6tZ2KM=FiD*wxJKCJCA-d+6jnJn5p`jalBu*$CrG==`Vh?nG~B(vbO;f&l4cr5V7JOEf<%2={`fZhpFcn)6@NQC$o`q*T|#TMx!M-g8c zPBts#&y(o1X@#!u9WNrU>VBg3gcSlvt<3c$7wt_2&dQq8xEz2o`E-?k1|C4d)ZdDm zNRAnWJ>UD#qLVWE40RyDhUNfn|LE)Jg{>k8Q z69p&d7i6pWK`z1MFusP3Gvs$_l-D53eghIR6EDygR0!>lovv(t1SCF}+to&pyrC5x zW$>Xnxu;~?Hs!1rNl@#V7lSs*hB~-mLff3t`~k{nJp$hb)SO{ zUmG*q^qoIe10fw90h4C$#`zPsH3Y}!ZjX4|23pqFVr6GE_%shMa0XR8_yOBGR)VMw zsOq0pAmZ{6Gv18<-Op9lyL|gY0X1^2rnw;_tQPTTSkXwLhU1MLCmV%hs`B4l@&R3$ zzN^!D9Z;D`&SwoAPd-?Nc?~v7=5sJg|8;%E61_2#K`Voyaj{oqt74l28|p?~u^?Rc zHb2R0y)gbT*ymxZ`UXA}@UF!Dn6Z;`diY_ZaP4Ne+2{;&njB_OJYUmW#hlM5>n@z| zM!?wKBeLKev3F4*|E zC;FYRk$#Bbl}}A0Tvy6zCk^rAeC8>+>^c-U1rh3S`@4uTT93xA@pNeWYa9>_^7359 zIL{vPJx)Rv?9prnMpms195kt8Y2Jj<#6mAvJTsR|D~W<}6G9`tW03A5<>9J&*x$pxvN$ zU;1m}3wHhsyj_AzViD@Gc7pwi&RNzRdVFTsI-1=p@!|b`5Tmo^HR%K`EYzm(kEJfdiam=Q ztiGy*+^{$_E!e@d-(adG=5mm@y@#93|HPjMHx++5?_VQbxM|dZHeL$KIJ}XF$!Gq- z|AvK{Kdq;%1+v8{AK&-hi*?^*JK>jp33x+8GHfpTax*1SR>e+YHlRTKE%g{jhMf(u z!j1wZHUCUciyGJivY51jiowpz>5;Z47^mED6%9B}BH3u~<{x9MY=V9Gh*1D@meS{) zyLk`Ab}`tJgdoD7l?Y5fe1R`p_ejivDZekZ5hnfi#!EzZDtDo~ZqC%E(8_4_VFtmS zUnw^9H8#?4szpEaANED}MtFb5Yg&0ENkBXVjQYmHS1nR-%YXjqRZ8*upHeSk z@hGB~|M%+e$-fG>I@`UhkCe8Saz!*6LMv`DLI>5;6f1SmRV}PH;AY>|X^NA6jKd-~ zEE$#iIz1V@u(U~4E$G;P>-xIV2fW-_P-(kIJnc6YG=FvwN6tYldqTUi)@S~;#~{xV6SEBBn* zbXz&v4rqD$<4&D4aKpLDR3`~TIxf+f(1J^?4w*C%P1{oD*7BlZZ|OmbCF?zY{S?bj zGS`LSwP|xn@eJ(wk(=5P1yWUP?9ty&g{VJJrTo&Q@a2YG}>$AESGtRvTZi zP+R&)gH=45D2pNWqa}z-?Csa=DjhIQfyD#;`uaYLWFg$0ZpT2eV3utwEV{)m)b>wy z-S;RrDtZH5b}FB;f*Un8gfcPn%fHYl*Y9X`I3`Gcg#ub z$gCDGLShVb*AWH%;6%lTKFc2yI`5nctfcGY#$0I^f#C&}k1aA{-1WwZI|w@i$2KB@ zIh23qHZ^acL>btXqltDeQa_%Li)rZIqIRdWhwNXpyh3_wkF>6B@|)U&Lg@2O2u~5+ zMks@(HriUu8+eEC1f*o;D|BTu3eOLO^tb#~&;@gn@@G z&&C7e#9|I5Z5anBZ|!fjGSr_()!)Nz&{xrX$@J2Y+_757Ci}@O6K+&!d-LU}+Q~P3 zLM$9zlt)0oTkL)UEgLZzR=j7szX!_Z!<+19*yd^Z5LW`Pn1yN*Qq-21yAo5 zVP{j9Cr#mH*nOq=)v3y-oEW}cf1%Y6*0(qPd?So37TJs!_4N0Blk_XXT=w^$8W#7| z_tr(VdeQt8PE%yU%3vgpcM zTyPXEl)%)e^X}yKgd+0s2#f!C;CrX&6^Ww1GD6~AJohu!*g~jRe5+&|h6|-t^bYGSMAHTsVQEyQeW`;&ZR8PQNMnyq z=hnO_HH0pfeZ#ErpS2hg1XR(C_CJtO55sI~FNNkj7lv)b(1SqLrbRSUKBM9~I@{++z(D3R|VUejKkHQJqdMD}7+Xq)N6^|f?8=j62nL~v$nX=|Z! z5=C{9Xf{N#bG`!*m-wg(y=(>?Mqn?Rk&m)bvwv(w#)B zBF=lNM={)$MQ>OtnqxM-0$w}krK~ZH=-K{ly>VtL#m_$AuhaQlT8VX{POr6m;hh0| zIRd?x>{1~vznIrqc;pdrW${$C^kXT#F*Ir{hs$RhTux6YrEuI5$Ohm5Ue^?j#3$|O`; ztOLX5+ntY;Nf6xNuAdo@`clwzY9u?W^5GM=xv(biMo@D{g4Uu)ODN4()9|+flGwl6wWprZ z7G(4Jl5}O3c*oh^y_C=_wF@mB*cfqD*RfVV+3cU%y}+b<{0S18yz5xUcRIsn+@{Pm zVN7!>h@sp5gxfL}tbR?6{>~Vb$gEW?^oSrb#UaB-=A16=MyFq}h{;XuU}x!*INrU? z_%T4ov47y>#@_Qu6unky`m@W+I+OA}C*UM1cvmw{s;{9uH`@IAY-cvW&x(ljLDeTY_Dt`_9))-DddLJoJ9VkxcB<3j5m}_qYy)tX8 zS8%!$>{w^$Z`r)r*D2~OUoGVt z4@@#rqPoEOP8|phm{ji`&*}w$$EUyM-7wyF+IzHQp3xNLpm(j`n?SlXPkS>Vnw6y$ z!a7PRb^ZBDe5p~_BVjl6Ksj);$nRU%qV&79z*#{1e)ovDt2Xm{6CtsM$>*&nl(H{s z*-;U!YUy2feBMyC@{B2nNh6!-=gr#KBH4Fu{?Qd57aqb(_%9lpI&He7hkpyZX$>Z! z451maF=YD;)FRMoU{QrwLyg$Ea&75NM7=YI-`B2~Tr_i?T6e1Li^Qk9@&l5~qq z$)QX}g|*7W3P?d9n$N~YI?GcKY8SObv3zLxOmmJwl@?wW6f(VB=6>uT(4lYvd=I-qL|pG z4n2=_^W{@E5RyXWDgJ$)Je#%bw}dX3$dYm zzhXnn@6i}`xOc}m2f{hmbhK;bbZn9kJ&oYBLhh$9IMH+gMIOr2e{ABbatfOk!iOZ` zqkxoRL$EhcGA6S#FW^M8F#o>hDFO%-is2TQvOCwM&N^&{sqyh;slg}^FKoA);%Z@P z578gvhDd$~gUPn)t@XiG0T+UJ`CqO}f=V`Jg3ZnJgusxjIp z;tBILSiLEAnvF73ZAc}*HLAxw#0z2MA5knkwHPxdhqrLLc?0^qp7cwiE*1HGp%9Sq zxCib4FD6-CU`YNQR_5e&r75*sK+_913cB|HOGanYiENL>OvFH;RaV|*EK_`Yi!a(4 zSY-;ZtdB!_({|58Nbrq46^2OKgaRS zMn^cP@Xp5u%UL5hw!~}}{RzG@FK?`$wVU}t`CX5|rF{h8M7i5LRgu8;2#5hst#ql{ zsP&hymy3XKs?1d06oTYsFHU>ySni^1Jwm?wf%`5@O8Ooy2&y$&wjiB{uLcCtC(bu! zxZ5|=w@0Hm9O;R_pH03KN>B`v<11s56$+7l5p%pg6WqsS^|!HRI+X{g{H54NZW9;O zN?Ix=DPLPcNrn{?<_z>nfHFqJNjolE6@9D%zf6*NC3ryu3y=HS^J2j1S$E686IR*& zS;aWiH?>yH;_*r*ju}JQT)!zXtrvuYp4PQHG z)W<#g!_!+II&R;NQ6RZP5^T_+40w5hw6CQK;yC8t=}q$FiOJuuO@+yKnC$ajya`RW zfdN|mW1-LvuOi$)@~U+rOmch4!&AcNPUkD2#|Uz{%x@^OvbL~Ju?ccXvlhHe(CFz^ zfqXU!M99dsF7eZ(n53sgJQM+{nKbiQd*(-Z;7&+8e)+?Fr}YeOSn3@0eW38=6;tER z_5~Eh^ijYL8+J+jeE(@h8bsf7bDMH{ zo0T}+O;6X*A>S2B<;(xi^u=ik+OJ*Z~_0js}<~bp?+Bd z``MO46(*=;`RXBxo|y>r@ljcNp*lR8(<-bt(JWDAJWf51N|p@q`*x53PhDU|N~e6K zEWaRdEbk8^eLMJk4gi=FJE8FVp-8FsioC(N70_pS``x{tt8SeUnApU5i$T^|&-Z_4 z>nelV?3VEDSENNtaWAC>N|53XEp7!0BsdgzcL}tmxJ#f&aVR9g2^23BcME|~+$FdK zzu)zHXYQZ($IiSvJ9ExHbI$HQ&(S>E?f47d?+)U^%ub?k{f*}}j~5!TCLdxNu!3QH zh2Jb;l}k^Y3TjluIZ2iF_yg!rj0?O5`xd9A44I;L zbe0kyiVy{4y1= zwYy;~o8$Hu6o&}uL0FxlDE(A}^vE-mAN(os8(8+C2KVSOSE^a4LZbZ3HA!=N(<<)~ zib@S@*UMqYx_w8ufZ?w0OnKFcw4*(3XM|w(Lfc=?r725!+%`nU0FM%w!V_PsFA=EO z%-l2U3xAM&7<5iUDmD42gr)qxtNN6NZ+4NfjZ(SaC%79B7X?r2X{g#rIMJHPPO0%- zvbCO`NrO~6nt(d`ilb}yaYC3swL!T*Zn$giTI%P?4@z%Feh$_T*mNFHQ=+8QoQ+dU zenkW%#=r*qx_G+@2v48N#Z!Miu4C>} zKA~-+tL)!WXcu3sOE)p{`p4x0W@6Y(gu5ph0wi}{l-Wi#Ii+kTL?`&MGt76Vw2IjX z9M8AG2U@dOSV_U`p?yr8Sym3OgU*nJoI)dKXY~g1S@Po0E${f6V^<0*wIBksv(kz& zdWfyjLtk?Yv&ZstPxA~-j0dv6vg5gOUck?bI@?5^gKxFngtyTdReywNYGNNHd2<_h zQfMYAUDT>iK!^A$Xa0zanTn5&E@fzhL_rx0V*mD07loSG^07fZ5+f&p%~y%tSgU~& zzpDc)zPBN|;aoi%47Jp?d$OQ@1NG{f=uwL`I%&hgZ=s3b-|3!nly-FEDGR+bo(wY#2y;tVIrF;v8v651p`cyPmC%hDx$` z{{i%9#U%5>juWE?I)n-b+Xg;aV#(|V9#Q0%`&%=M!Q!>nJ|v^u&ew-dh7d?OzsAV=_2MR4Jn@V6L8<;=0|_QV(#a~MzhXTAfXzx=bE+jCo7huQfBEwG=G85Ou;0V z34q8sq?e^~a>rR*nIvzKj^{2U!#%>^=CAI#k2^e}rv2%n;zy255bcR(tpOP-?7z*% zqdKt9>&g*nT<}rJdphnw+?B&;oo0c1agjeHwN;=ppt?7vwP(EU)cUKsHiL5TmLEBB zQ~NsCk=oS!=3O&RK-a}nf05;ev%61gWB#Mde`%Z6QW%#GuAF{vX)KkM8q28)lAf?u z&hn~BX87{u#kvyZw2go+8=EZRLPc2j_N(x=)|uR)GP>8}iV#(Fd-a^7S(lB^c|yfH z`5EMKAS-DIei9-&e^0wH&OSwhv*EFJBd$#P(br$~Hy%u7*i|s&XW>@cb1|It+Db^} znD3;^Joj;q+$HGmShuOa>jzWd4L$HYd$Vp98~o?Zkk?(52>>t+f(zG!Duf%DF2piFXxJ z#&XVaZVzNEk+b&D@}`L>^&6-F&>e8C@D@)fv3IdJ)!!2St$bD4XTLi5Z!$OrT_jn}Db1aK>5bYOGp3zF4k({JQ! zLM%jqL*V&jZGq?fFS*q8Scu#s|7`<|n`_EpQnkewsP?;62iwGSN@jm!gD>?f4$+%* z%Z=06`9~oqU@N#RPVb%|U_cKr!wM4%UKyXS-$oo~>>N|F5)pjyIR<_UzJzj^`!zUCLKP{Db-<;jvhcPr}@jdJ~wa35X*AuWus2X zV0Dfxw*JmQ=ll)0F^-rE`cchqwAFf09UN{N0GhO$t5$Iw%%AXadS}oL_RvSnNz9mI z7^ugeD5lkoT99@2i4RBDV2##}A5D2m=~1DS0yE15(TuYCM|Fs>5&1y;8}*0r{2*(b zcB!Tco~!z+&nU6;sY7rPD~_z2!`dmY4m>TgRXv|rq&hHF@6O}S_ijilI8B*KTPfI2zflUY)Z9EfOb3*?_iTV z=Q|Hd&C{N?Y&TdprM^J9rMK1Kouf)GFG&=o{RF5*({mm`{xFL`#@^^s`PUz1gH)5S zmC=6grv}O;(J~?zMoD27cAElVoY7&aub?mLCD95V(SqiPzhqw8g;KI!!t2P^Dp`bL zo-uDvux@=2)My~jP^XmTgyp-!$ZVj*!58H}jCvJ!8^^)+@hLSP$_G+KpCY{Wryb=W zr==WvkQwEw7(W*|%B)||wniusK~crQo{#P_gW=h*URcr{DYPh8r4P7HOX<^YBT4_hFdm1L|F5G*6u@PY5$RK7(6(K1394!9a zM8lfPY!I&!+pmi#f&OMn;(1S*UN|8z(l}coKDaR4TBNt$v9^nQqceq_*(*|q&}cVg zC{#u-Hk8aR+7~hPDJ4^FJAd*jgGxRCdPC_`?6MR4bsr~Py|$Tx9#b}?lG#nUeZ&&M z)hS~Hxe|E{C}DUB-xZ%^IYP=TlBDsJ=gSK9tYZw4D^FbWHo5EtpDMUhRX4(eJ(wH2=AN3|}wmJ~9%zewsFCOS;pgPn!en_eWFm z!%kRJ7WAg>=>3RA?2IItD_<>B^pN&IP=G&dG+Xj$DufAnS@UIR-@^Wl>qH(dd z>t}3b4b!_d>BiP<003_)7)0KX`%=)(C$W-Oqi6D$;s5&5G)*><&_2vrx=}HE! zg`O)rA!~SeGK~M5M~iqf*Nkw*kPiR_k=LrG?qu}q1Cun4;FdxHd>@iH+E5!gKD{ai zkR%Pq^j`xNtv@m+*g^Y0f~!`%Q`_t*E6C42LE1Hb1)RlEGNbT8$cF8!p6G<#hp?Sy zt@+w$f8P#=7;fPTYZNocS5&;J*Ixf0st^3#DV5^?VU{2;!rD0FE9`zb4Y=~4s>6?o ze-LEhJoiaSgn#)9%b-uT)z9=kpERq#ze?8hV_s?!DS%Oz5J*bahBtbpYwCTgsA%(h zoGS-n#a@`DL2~2G@uX-vD8l``ABdTn_o-RL;>4nx;F~hXTP{GS@wl;R{|}4+mH2d!}Gt zX!M?6GvxM_xO)h(uVSpK!)wI@(8yN-Fy6A>)lW*7TT^UIKNw= z1XC-}J8VA}Hx1LWN6T)>mZkx21uMt+!?AwW2(8qwg}r!jPS$7kLW@7iZiY&?cD`0> z_~ooNlm&xyC>Vir7Vjx-$q%X#2N`4yTlnQAXU{Gj+upWUrYGV*M&kDTY=-c<02H$& z$*2Ip(!C)yxoIZO416y_pu6yU#c3+&3e6m)u2>&*`I}x$5x1_e8Ebsp(cQo+%lE`0 z@yXr=g$_nINZT<+_xILr@zP>%a;*+u_FkZ#?XIfDV?vf%<$3#C1NE<%JpVHAmpggV z0Xm-^<05YqkxXSH+pwF>Z#kR3hu1g03{sk?>2W6oJ)8NNtwr2gDyJMwr!Th4;uc3O zC^K8<#b`@3IW=SurZ)uhOr$&~Jl#t~5e#J~-mn{V{w0?;!wBiTsQVY`tC@93`*nSD zuq_s$vyyHWLnHEY;m>Bl8QTP?L6iNa*tKPuqw&wHBS{L-fD?r;Vx-AEw|eÐJcA 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�b^$-mN=hb2)k6A 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

uM%PTGrga26XDC`l+!wdd6qc4(7xpcXzg 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 z zQU=&7;{WN4ZX@gl-ncmt&-HUyI1zGJ!uNnhnSG?-I{gp zd}a}3?X>EPn|OR|63J+RKH}815vJ-lDXi9o04Sx2PV%XtaR7r0{pZC%aLHCe;(rXf z-aan|Xgz?%8KX{XW8brdU%(q>e||+-u~&Y6cTWir%KsQ6!ND@+#K@6=nMvl_=pLDr zpo)bDM|$H%e@=MPiCpe>(^!@(RJO1GWy2^SE)v@viW`ugB4mSpWCAIz>>^N@DYj~Z zm-a`Hb=0P`Kv1=iT#^qkYnUdc+SDwxShl}P#^)bra?Ikylm(aJAuy0IEHn7B>H-YT zjMBfqdX=JiXzaSL$i&6m%9NMkx_L`1xwBjCwR_d9r^IPNv7Fa@c8-%j25L^RH5`q3 zdN~X(a^QSo;jc8m$*MT5{2CD_T!NJCPfFC^CpVv#0E$XCN*b+vm!a8Rm1#sq@u?ew z;muT~lPc`+rBIF$nNTGtFHN)NUP<#tGs`Fh`}K|{+SfL{bfldUk-RNUc0Qa{%sowF z*!jyhBb6PA#8~O~iKrg|SUSn|d(4rM`|oyv zvC8{E#piM8c%S`^4Rg zlH09dvL+;-E3i$@^O~JwaDa)-@y?M47kQoK1vnD8v80v#^R?=LPXtX7X@+ZFo5MwS z_-_vDil4Qq3G6Nz_7vdVC9y8Yta-T7^ib3Y;2T}PiO3k&?9`|fmB znDJck>g^_90xGezm+?DK$!})G+KheHZqzB|dA1zkLp&Hc1p12IBN2_YvA+t&GYjHi z5OA!?&3iCXcra4FI@kOPkL1Cq0siipC$mx6tPbF<(}gvBEHkVm?hhtL33;*QRYt1Z zsnSDyN4OuuY#vA3`nX)@Ve`*ETwiJiRw3%X&bdMbls6h+_iIM}(oFVC8pbvi0{pO7 z?2RL^45#3pYl2uU*2HAnP%^^8oVuL}l7|7R;7`Rhbr)^>&rxVSis z_?PZTr<9sOevV}$O2|$o5+zkuS`sSm&ils0#;qMBk9gbs;bm5&?;TiCKi=KZ&ER3` zrMEskAtAjVwIh37OCo0GE14~cfWV{TJ6t@4UgnB-Z(!F7@xrkHf z$UdGp?yq~M3!kRcCBhQm<|X!^8vN#j>pLVi_bc9K(He>Eq%54mtyraw@*~+R4_b4L zO@|AS>f}%8B-*b_BO2#8^XckdgWvQ8a9PxdG}VkDGtE?y*HtuH%VgPTM;zmelHtx1 zg87(AbhV{RKa)83Bu_%oQc5TD?Od~z{9Jd#W!%g79vVerYE{6^HmF%ik`PKaBINVs z%GM*{wAm(W@1W@lZ*3E!tg!f6hE5s%cBQ$A6ap-=NqVRT)yn(8L~attTU0sm1D$@& zJgW-nQp14~l@g0mCr$xshJa?*L<1b}W7J=&;%TqJbhpBe;mPf0jMsPw@ORt>cPEw_ z+A*7@9nRq7SA+Ccs&?)g60;-=Qa3gHVMf+RB>c4j4m=Y;YiZW)Ut^j zdSCjG-j{u5DVC639pT@U86Fqmzej6kvi1e1vo!fVBBZjoPd52S75f8b=21`d0+6ep zU4zUFnfR(-Zb%9GH92nZgUes0wKtK{Jr0`;u_&ws(YMyh`t?N9$IH^i>XohZt@PEJ zRl@5sc?JA$_7_E-!+2mcBq4T{O_!%A$Z*yhTdDu#vK zozyEO=p%yOlKLIReXDncU6`3^>!wTthwzkyjF`ttNl0&l+m$foRU@alUby-t87~U@ z$J5+%NAI9-jhOqG!eNlcu1cTI974F`W^LQ)`}1^v4@6HqP0t?O1ILo;AmZ5qX6#~* zAsgRJF93r5TP(1K>$U{P&h6s^XQ*RcBRy!XpLBoIl4~#i{B(J|b2omR$$^)zr$Kn( zUO`(E@@Z#tkUwWZ_!%XU!ZwKT`!}E72m-YbQ6~JUxV%64PgOpd(NK=*6i7kqu}2|ag*m!MTL8ZmXXAr zlrXmxR#P_~lnE~}xMU1Zl%#fwNP9L%XH*Ti)hPh*UAOh@H5d8d@a_eH90RIJ>5^~2 z$w8F+w!s7b&&~=T0#d%sk44Ohpge^A6}nniloB+4W5|}W6uOs^an=b=^nFjH53g7H zYJ=M6N@SqC#pL1QE-u+A)u7F_|EH95IefoT)6%eidJ!EF* zpb=(yyS^ z@vlTZyOc93<{h8)YDk)cR+W5#g%{?aDwFDx8G)9dRSq9u0SQ<@1iTo4MN_~)fW-ql z;s9e`Xt!bojMtN>2kZ;jFJRMsSS(-zCE)lKa6$zfwt;BTKZ90rTL1$d$_|k;T7CcR z=PT4d30o~4mdO7~@|mp#+9)EWKH|I2yyIl%7{)iFEq|h%@!`EXxt!a7@l*0rPfBPg zD_G`kjd2gA`XNV~4ue~+b{^>Jov5{+_fB6{5tZo_I(gLyGj7+$bB)#=^?D->lL&uR zAkXioCh_LjYfx=3DQ12fdU?29kc(P-U!xcRP(+`53VKgJ@2ThTU-DV^Pkp?5UAX(4 zw}(#WM;n#V3Gp=~yY=d-n-&oVN89HH3hZ^)K1WLdGLupMmLA}T+nBKtaxt;o68-P&XW6x8fr6cn=g-xRdq-2(;1`ad1N zA^)v^SH%Jt=3gB=^{{&_yuUhl9QS!=Qh)OW&473XvJW|3nSb*E$1j+x(C^=|&mFia z>i#WKV%7t0d1rI=3yW+K4=Dn!-I!L+P^Y~liMjxbXc{$x>BlRADPuyG2Fr^_0-mzV zC1k&_#7d`ItEh2}Kl|B<`4{v+ZS5*bu|;T!F@{_-(x-z&XFHDg+g_=uLZIutCC5!9SqT{YZG`MO!RI*VA;IWnjyFRGsP z1QS`oJ1P&Ej8a6{eTw+dZ@@=O%a=R*DrUS(Z13e{xyY6NJ5l%nv+KRE;2A+89HIPc zh4RhmtRPT(bA74-L;#vpF1+m;2?-@u^Af;y>|8c8H)1-(C3C#3Z!b7OF-E=SI}lJ6 zB1vqau{rm#wk4B)aVlDSXaFP7SjRc!hLTL(LP z3p>fQR4#6KZff$TM30SF*Ynpmg>)z_`Mmp9qKofhHOXu3BI-f2?TEsp8uAbzC&kIR>DSB#Qv6J0q5m!I_WC%6nuz5}~NVUHIT zPH2_~O*+q1#dkIgw(z{$Z@RfQQ|20ZQ)^Yrt zG`>Ag(GTHkV$1QJ()yJ`BTj+6**^21dKb2N7k!NQoC9ijahiB)Ns3IStAA?ip4^!Y z1%LY2C-r}e@xdQcJ{3{Sg6fG|jf}t7^hn(hE-*vHOlY5c;a|Wdsy`Wu-O)$4?dH++ zoh$;7;?o|249qM_WuCtf8MXmw{bpxPtg+sUV4BK8BY2f9%T$saCZc$Wbp_Y(LyvHX zd@DIjl=qmoiuXJD6oNY0$E5Fe((1=j-_emx$THwB(Oh3qf?|O8cA}5zFSBsDisd*< z)Zss+M1J2`7SUe)y@a6mqx1hu(5qG0{{x&y%mM-5>t|o-&3>K+3jhZFt)e3}TZKvdH zrbN@EuWGy?VyXcZj8ceg@{?5OR7xaDY{jn0$6~G<2iTV`{ihs1U=!$an6T~A70V2v zFHcuKmEu(9yldHs*{pJP627+bBqU3TIYJjvjQ71JFVSJsUJyzjxBjh<#wFb|(JjUP z!+EMbIMt$;1+dDh3g}2|cMwe)=tuoguZRWyz zixF;mpO1Rjj1rfns^(*JDrdMwbzEOiz*@u=Eaq&kHZPN}BKfDbomBHj#}<0iZ^>E) zx;VDJ2?oq>SFBe?@9XniCyNHn39EXYcHL=E&@z^l^}IEIVr$xH`^+fmYjjzojT^au z`Kphj%8VMy(IkE`m*%sz1Is)Idfa1w11CW``^dzcGk7fwB=QOyn-66mmF11FIcE8X%$tyPhg zsnU6hRo6S_uKi3=Vk{X=`k+#~b+C(u?2y*G2E3rgDsf5DHA}vW1_;@1CZDY8Rq`m2 zYZExctSBP5=TLV}MOTY!?Gowe7qdm-8zy4wWey#!{?5iFI`XKvJR}I0@0q(9edisO zql>I+xNlT_Ld_-Q3U{a9{nmq+Y}vIUE{gLvRy32ah{gV1r8KcSHA*V4c0g8q4*So7 zH+6kVFl=(EiYa!UnXZ7$lIhC8_1cm$dDQZwXvyLYQO4NACc*lJJ6yXQRBnP};#%q^ z*ZGAi6ywg%4JNZU+JZWPa9!>cD`Z53Rx&|6uRb>V1rgCA`fP~`ZQGz0AWl|+DIWzj zfC`CJnWo##rI2yg8+E$f5iL_{;e^W~_V~AcB(=$2O3!2=?-|>bpQs>moSpGBJi6;I ztwy-d_>yyg$NPS4e>$#NHh+FPLz%TU*Va+wC!qC$pM3Ml=vy}2)2#uN3%>R`E&jXN zr`jR%r)ipW#v}H`;L;+p;)3N%R8!89*~FHklkiL2m9V~j>i%u6tK<;!w7W_l#G2T5 zxp4K+k{j1r;S~4kE4W$;X09gdmrY|q+BDg5iRpwV zM&C8Bq$bh$`LB|Vx5=ci^uJ--juO_>FRxuND;~7zt{&e;2{!v9o%Abr9i45I_*_;?nf?2=96?@Ad^&@i9Gcn8wOa_R$UCdsTrPMN!e5lo3)=9Q-A2@ST<#@&Y=l1wS z_4yIKDM+o62@tuHE;&+We{Z8RTw;1%c~dw(k+G^`_&+Lfy*$x|CO`COAJ#|zscCnw zSr-w!3R0f9;wNwDreo+}`Kv#-8W-$?^5|Z+E?>{M5|=0XqfCe3M@(X=1^}xz79ZsR z$dm5PmdYuYPS&4C#Qht&ey}7I?)$xFogL_8T(Cm{M7{Y>fjTt%`p|zBFcnVjyh0I{ zKNrWgSs#vy^I>Gx!Ja)Fp+giGBDd@qh7C5D!1zK!Rx*?0!aTm(L=H-3#W0P;p;cwf z@Uk}WKk}J}+i~^oHltZ-LkIz(TKO<8FPF|^e{)f#{kTGwg!_f4aW2YgdRM>>B}MOR zXCw!#*SXS0HsLDF7&b{1dot?UPT@7O-p#sA-D7M^Mmx@oi7#nCQPclUlzz0M=a z5)hJCDWuZFVEOJ47UN>T`?D<2fL+~^Y?&#$DK_v44U)tO3iWV~SUSc?irx(O?(MT0 zi`~b01XB8k>Io%$%mQVB#bGHK8c_>0EbBc;d}At)QEH&4%$GIHa;AGu;>38G{2nJDx@a zQoXjNJy9$xY6LnSq-Wc)r53G5KYtv78a+O{p=g$QcfmFBOFOf^(!=1$2!N4wcb=+z z0=aj%&WgN$8&P9=Ewl!N5hFlGi;~0~w~!R6ZwjtfdpgJ+DCk=d%C9%>e}auAZ0H>3 zG;XF_)NK~SbejA1SS+LwAAkN+MNY`GXvAapFFY=sWMmAlql@x=4Gr~0482#`GucFr zAe{xbLGpJ}_T5U!lzA$RNLlmn{PQNN;?J8l!}|Iwi*tnW z^hI)}ut~biO3bS|iiP~_SNiXU^EtEgc+5sBrRABSe`%*z(*>zgmkq)ig_!yNMZ z1uAA9P=f4lK7<&rJ<<6`rF~g-rW{oiVpFY16Ls=}Zk|mDv@%b_KHrsp#Aqu&U@m0K z@2dWoZ^N|;MX?^GMD$d0)fX9Ze>zSQXhUYgkw~c+&I@~`)JzP*q{qAI9;G9s?>-u0 zRAm+}^YYSS3oQ!bo6KF-HS^ouKPO~wPh31Q%5K+qi@KenT#OlyZA8sz0>OT+v>5Bu z)xff3GEbX-v~_p^vYBNncs-91JAs>}RNYZ|LRYG^d2{HaL#4b94sDez?C%jbthgHE z?xnlhNeXmOQZ?*iL&(P;Z@^N!F1SS5hR6wahUe%|*|Q|PD-N%5#d=i&j09cz`sV1A z$q;5MXSO2byNijr_1n>*vdAjKK9+A$eK3Ngs*yqehz6@KQ5u#Uo;nqm4YO+mu3x%U zHx!X*_)_PNY7<&w&fevn_l91}?9Z3XuSwtQ(Csq(9BLAf*k?KzeaY{h{VtCmq3 z1Jn*!$&SwCsoCbl`SQUq2z+viKyX`0=w(0n42VF+Nc?Gpx z8}!J|vwAZ3q&!TBz2*E3aZQ+tW^5|{XeqjNW#;x;RO+&~#4JUvBcV3Q#>7TJFk;}g zA@l6C~1<@_B!-?LSU7_Y@m}6cq&MIc6@*7xWw>}uV}itAm>JS_fKM( z>}9)zv9;~INf$R)TcJjmJMM(}&`FwM&K!g4(bQU_DIu1tbDRM(Cb3)?tp6&ns*aN& z$CA}0m3wU~_UGf-DSwttGrD8}yB=r81sNObiXlZi*tveN8x1IbWFVOWryZ)T}R~xaOo2uN*w2tP6Zno3-fCOV}(a{{q@cL zqFxNEtlbxy#SJ{^JHVO6y&%I6zB9e*AR%dA5G0^`>E$${@bo0jEbINvn>&!*(^dGR zfl3?agb4GyKWb(j7!fZ$|M@zQrFqZf{8Ase%vK+gQ!`_di)KaM{w$27`(zS!NR#k1 zN*L>pm|3OI^DxxJ>UZ4s;UjVVKuTkcme{tJlh<-jD4tP`onC6O&XYMc z$lR@G><`!Cca;E^0GL!tVx>4G_VH(*i(ROf&bRO?j{2-W0mUqC7%;1wtFIu&i1YY%dCd`M_3N? zaq0|hVI%BE-Uv!-bxWh53;rr%&U=zXX8ALuS#yUV0gc?x41<-KcP zG9vJ&Rl{b(JV>Xf%6XpPG%~ZEdHeYO7-v<}o}B#i7^fO%|9mER)MyHz)v^+dkLBfl zsd>X_a>fk9{uAJ|(m|tReiu^Tk8E%^rbFwkZ~+aX&#{)W{0lfo_!>4jw*D)K+C={C zgWwzQ4*)=B0vqlNO-25F510)9y$@C&1n9sIB6JB4LUhr<14-RygFb*>qWkNOzbUT) zn}5?~zXHbi0EC}Dh{`!V)XaK3^gxmN(*q@BW;9`X&fT7s`;BAfwWqXjj~vg(m?1X% z?S5INWF7<30Q$HtN^7d&7_d=ALZR zSUPo4{{`Q0#vF8Y9zE+in!%czdMfG`MsFItdMDF#f4EP?cHpW7|IJ!$dyD}+qvK3v z*XLj+!L1x#ovgS@)=d=gQlY1yr@9?|sBIo3nciF;NnGfIVjJ+M%uZwbJCa(665_w` zaa)q#KfWP$y>c}gNXDTlO6n$}{DBi-+fj;GFk}-vuWC1IJiVT&$qN!;a#KLnbTh|C zg@y}t90!9+bAtEHb_TjyD@A=je1tZ#o=RtF6;=MeQHM8mJ?eGPG>@X+>3HHf7H`eB ztzG$XsMN&b=&%ltzuXd4^OhC4sa>$LYQ&&9(}&S~1SRb-VYn^dJceb%YT%7@?ywBe z?3Adnb#2mA;$Hbsp;;t{(R5DVqzuvS6t(flC-XFp{2ssuxL7tfkg?{Z$l5Je{lO7s zm1Z1MkU9H#<~bnn8NfBbWt=c4Zv`)PM?%oM==iuQ!+Y7%?wyFn-QyJa2`L^-I^~>1 zE6szs(Gj&d3-y-~_Sc|Fs{O$0Q>j+h8G+GZ@R*r?rczZEzmqp2&dk5S{?_U zR+Kb6qJt;MlZ73JwX@;)En6!m%a>+9k>Aw2q|Xl7#qNbRe%ahmHo=5o={0(y47P&W z#F`Y)RhQsPg^8}1M%(OOZ^fmoIjKi)_D1<~8BNN!IR=TvdvEd2>Yi@4bc8--`;t{% zH+lHo-w7;yVu26A%LeXb6|!bobbEJ?6pTyGpKtPXYvrup< zQt-Oe>t9nR8__)0?PdO7a^zh6a~opydi%>>E9WXhpNdyA-Ik0CTP!i(L+ zWt)4|EZ91V1|G(tx(fhBw!eztMp08Q2?bxC1?b2}KN}O-kkPEJ9SqMizn^SDe~o3t z7A+ZFv{fqztoO;uf8fFY7B?r%B-@E|af6_)tPdnhPa+U3j&HC2+}?lQ;UJ2}((V!{ z0V^m=KC*ZJ_YQtp*`)olAzQWY)l8!a-k4w@N#X!A&5)wXF{~=p?w~V5u zXfq_pq2%we8`ZXPftz4r8W?S}K&zue@RfUKn*|S@+ik1!?S~b){_g8^I2NVfv8~!K z_E{YFNFMLwi(Ox}@`)N*g z;lRG@Nv?L5%jjdS7yQr90dy*5c%aQOKB(HJI?Lk(sQJ#m)wc`9!Lt=rhIaU-|7f zSy^-g=MD#XDQvRDVz;p&A?rKYUo5AZZ52HSiliZ}q61yGHXD!0YGg>AE#uhQ$2%Yf z9T3C9Ueq;78pUh}1EtL5&LYJ9)!S$HFQfF#h%Hb5^)HWRUXR)I^Isz|kKvsBL@-(l zJ)ef7u8?~m%VCc^FE)KYE)vB4a!o&?BN!d38h?l!7VoEb)2Bd;4W+_5fCX} zGXrM~jnQyBsw)$U_`dsM3Xl98D#*DqOwwO<%-Of$FZvxFpZio)j4cbUAL}yd_PYS; zdq(h(b=BddE8hhXe~6mPL%{j>6I79I~ZTDOKhSVEz(Kd@3jZZ?xHqt2>{n)vb zJQ^)dY&ZVPWc5J|p6iJVK~=}*%8C{WPvx|c_+n+2ARlY6L?G1BE4*J9a;q%2kms)6u)$V3uXaI2PqIN9@eXhh6CJpX`q#11qm z7pS5c`^hCFk1?qcp_JXN9wkF_#^MxQL!Gq3z5OAhXO9~K=J^KXt;UysOC8r5OJDZO zjX#bjR$|}GrPkbou!F{Osgs^S=1Oy+!vGgNyGKdEFQUNL@-j$3aYKQ&Q)X8;)^alN zi~Mpk&cW;?|LLH=R@LOzsjzh3Sgnkh%wgqb`GCfH&~75}SQ@9(?#ro)2vpD=eXBZ@ z!u}Jb^=AV#-DQ_AJ4NP^j(pr&={(-!j_YhRw_9(*YnG&z_zV0$ySbFXmni-Wag?# z$Vsl%ZK147Cs-$2yu9&KfcG$A(BxYhfgsg}V`^c7dy-v$T0Y}ci>+qS7&NS(#58mm zcD?*A2^!wtK+k`ue|tkabjIDqkK}H-!dY`}(lSSU>-75%=7lxjB`W;8E=og*5GZuJ zrYTrbj5O6iVm}d_Iq^>&9md^Zv{>XBSf{Kx>`f;}g`x=)j>Nqs^Nw5WePNZ^)uk+4 z-9Cu9h$sd6?f;CRZa#!C+{=#Nuz;7lgT?*Tx^Vxu{27Li&KXr#+u(FEsr~j-j|FQC zvyv8ET55+dc~=qTW)WONm1*bSq~3hPxxi`BOoR*nk*O`*HIVnw)Ld9S%!KpYuP~L}uw#KqYkB+e=fFD_wmG zcA$D6kJ)AMgxgDm$Nf-#Sx-pAT49PGKu!QqK2w5qf{j#5J{^E{*IZYzS(_9o{m>F^ zKv?Q#cv@3pbio;79fDKoHXvpaWbVf{pvK2WBvSGfgC!_VHlTE{WJkC%NX{BkWsdDHq5@3PE zx=()}SB#{GSgLoFdr!dqxSuGmfEGN(7zs(K`il=tbi5 zNR#i4=Eiwxe$;oyp5bt9l?1*?Q?>p=%jZfTd8VSaRPwxXh*Ac|8j`_88lVGrpyKib z%?T8zwy0hsxmB_=%n;=&#fRI>;n)`L2y#78K|uZ!XQRZ%GK4!Uo4ZWt%9Y*T?!bez zeBCPh_q;sGF=nD)GY|wZnR^kcbsQhgA8Oi+?J>hgil6FaQ130nTnEqLBQV!BmUDFK6)z$d+(?h32JbaapRM4nTdG#Pc|e zBQmAONY6;FvR#`S4VVDx`&968y86q(bJ8c~f#ftDuroqTK?(KuopUMV4EtFJ6OXP$ zj2)ZS;7=omr`31d6}BQg99k(7y&qA*I|!8{OepSjyrO8FX`};Mt9)09I?KcJk3#0h zFaMm*L4t{u5cu1F;XjaUxOBd;XKW;q~i$zv^@%E0L$ z)}L@zD63u9ji~5ev%^9XalreD7nj#x&p4=G;9W(m4*$t83|VlMFa1+Ww~M=<68ep1 zdBDbW{nyS5?7b_Dw11HIqy!cHgylrcJzChKagba7tb zk2oJSeAK{t8M%ubs)!&X-$!YkKVk5)^0pKXl;urP?9jkOjGq0$z8W_IC3o#MN#o(f zxaw?(;&+t{y{#Hz9PRN&>r&_kyb$FdCUxaYRw6oS46+3_A>jKA*Y2w^pwXW4x~*I* zFp6N8O}W|1l;sLI<58wSqEt&!5a~T3XWqf}d5s?PRH8@_7D)cFq#?;`C7!AxFA88} zN{x-`-!)z-gNm9nIR_I{9JVpx)PKE}Z|#n-Z4ck&gIMM&%ajb`7y+9m*LRb9H?Ur> z>qv8RM`E1FT*27G{$vLt%T0KeQVI9?fSW9&X#36eWm)+RrNY#1H~*W$9cuAo9S!yIAWz3SCg+9 z+4L>X!Qj|Iu_@iU5*|894F`W)cE}5?GfD?5&abXkfy+sW$`|Y9&wMlZx1R3!KKC$t zX;B#uKZ0J}HE|V2W+-H9{^qX;ao- zm!T17{(j>UBSkcC9h#aDTqQEAvVUSc1Qp({biy$T0@FCld{p4fwNvvAf=r@crOY2pFFcZ1+58TZc?5)N_8fs%8ZVZELW5!0iEts|wd-i2j z!vTXQF9SuN04)z2`4N9{b+wd`iDs5e)jxL+ExakmQErr{i?JF@rp6S1UGl1pHnQYg zB)An@2)o>cK%6dq)JN!MviHZW-Sw87`>rd{iD2k<^6ENr`hm<=-K)|$1LV%`p-_DH zpRG*50Mhjb5F-`fL<=C?5CH4lBfTGgTOu2d02C4Mj|27+0)_&_;dy9Df&72knA}s! z$a|XnK&?pu^9JVk>#_GF`9C@-GXjPN*nJGKhvIy=KNOj)njij;v_KgZ#O+_&9OnO{ zN-1@JkhUV~<&ffvL9#k>NW$OTSefrZi)VIeo5@@||Kx@m4a?l?(4Fujl^rJG3 zU1v~IWe5Wa-+v+un2ydJ3Xz&x2iieThS^7sZwSltcI{O`UY0@>7~URiUmSVPo6z(y zHH|eU}isN7;v-a{;85TL!nFT!T32qeVZ_Tov9ip!>?1e>m6QM~CE6D)*-{nSWqs(AlM)4bz>?+4#Q<9iN# zpO_19-AdU9z|Zg?Ob7#-$$wGXV^o@_j>)`-V05&18T$n-3a?g}^-M ze(r1y-D!S-i8^^ zSXYKTC_QdS-d^@B+h=mO@=EwP>f?(BhaBQO*NPwCQAV}uidv(f5KbPFW6BQ8W9!+C z_+ZOSf+SeQ=Vg%+$hHBMOYMgzA=ecOL%lei;OQQQm>ELnn$_@x+8A}}8d}yG*RpM^ z7Nw3;$)RB5cTaC5-zq}Be~rh4bF5%gJKkVFDXI9)nj^BFt{2F-g?4I`t~>ocfyew{ zNm~RwFR;~r@iL{yy^wZqikf}&l6al)Ty^2|Q$~);W{w`+tKcv8bA0KUZa<6AuCaM! zNXbcW9gPx+6N0MX($piN6((Dzmii~X(e`s=EkRA$U&P!pUK_7`!xm(+lSLkk$5CcdbFN|&BHqVAJ+LTBNR3k1 zT(jY{wXTJM7bSCSSSP@iu;|ZN-1I%WuIbARPpA&^{+`*+s-sc!7VnZ#b^2T8wa=%**O5YmX=9Y4 zBqLZ*zFVrTG&$#(u@9YHkE+NEgEv1lyBxhPt$4<8gT?l`pcf-PYFJNdJ`jN_Z^bS_ zWQeUZ+aZ4zIa!Zx(&Omn+x>Y^XJ$-Im2!qOpyK;5y^LiiO>)TjF#S+EtvD_8E4|W3QcVa zlg$Dfi~ChUWNKj?`E(J&rYv;I-nKOc{|BwgC^BjxWHQq)Ph~Ee_==`T;xV&Crv{iQGBw)?9LqSa*S6ifu`pdiT$2)F%<_ZyNSdwJi`ev$jivT19NfJL zmU*Fd)x?y&!zGurQx;e;JxT2VbhGtg*p#WJxaF#yld?tq}`Uh(jmX&T&j3 zDv~tqkVL$xQ_gB|i*pS7-BOu+l#EW2_j_bZ z01RA6_gO|5^=6ng}-Rx(2V$-UWp9k+QdotYYTbtA^)~%@VTl@rg9cHAcT3xCqax9XuJV=i!VSeE^ine-14_&V6 z6P|6I{X10tc+jH3JVtJJ2omhOpuH|Erv)>f>lyYf>rRZKGHzh=AoC3zP6Ut0aS3>S z+&NaX5JNedFdIPPnOX1d=Y+Dr_~Fo*99`|*{7u0#g%MfhF$6m;o4c5-9qfVeAZ}gv zFbBsT5>v^petkuk>kK2Rd5r{xGSehLZyx24BY7P+1!IK>Cn69&-S7 z*Pp1NMZoIHp^xQx8ew^W%1@L7PybDJ0iNEe)HF75CuNrM5LX^Sn#NO@3iz4YOr^yi zYH$pChnwypwi;*T@M^`VrEBV(xl-A3Uk9)&4sEUAAc9qsGL@9Qg*I2S;H8xHI%R+h z>t@}m{(xQs$B@D?3VPvKxQb=?BxagSo#aH*W5dm24Xvk^vipxhlWEAu@i4}D%nLrH zI3*`>mTeAerMf)vWAiGLQ1SZ<-Nfw;YeQxV>6!?ivgHK*J6~yn%qvM;oos5aBEXE9 zR{}64G`9lUC|?$hmvB%PLYNcC`I>QO3VW96Z;8>~)>v*Y$I@mZEaK zI9{)7q z1TQ5%+FISGE=w%;9-N%DrZz7=m|$)}?p?DLC#Aw9 zXvB>7Ty9oPxsaE2TFucD2q2;_hpKB0=K(fWjC-jZR-eh%&C0~cH#ua-r%EKnCCV6! zI>IIGe{=2#TB@s#VMZIp9gf~}K1*A2r>iTsB2wk{655;$0~)J&!Z|{;s_1s?8h<|c z5ewWZ(vAO9t~2)yrh3^;4vQPVUwbb#T|pkHFG$P7R0tTR7L0F(#xfEP;#x7QY!Z?o zi@uGM7bKR?Lzdr|>KGNqFT~8F{jk4ehBNw=W7 zdCmDt<93qrRy527yB~+Po`DV4n5Lyq10kL$ilzo%l@FN6ZzwooUtWf zk(9cCf*_Za`R zEraAsQ%DSQ4LxzotY1Q|6rsqMMK+&OUSpCmMQz2S_}1%BoFyGjGHC(SGU0=mk2Y*S zwdQZ;X8itNFJ#(x-?fFm@@B8Rcswrul%0cdMLrAk9Fu*`i@7*#s@pm-N9ySnW=;yQ zJa3N`4OroT3+1u!-2SzfN4#MSb^{NE(3BHJ)*>%FD%NNAK%@B6CzN4F`Bi1VdKryc zJT}JU!cTQU6s8yui{x-L_mWi49Xq;zaRtMwSkjyd5+pmt|5ez~e=XmSGwRpba|5>4 zb`T7nDFv8WZ%Gmy1rFtQ6wJY}n-6_YiNQ-^M21Zs|Nbe-rVUIO3|{7T>@w&hJ_k$t zJ&vwTepp=KD9rV1Epj8o+}1;4ZIn39c##9)eMJH{U7QbZ98xzf?Ru19RmilF=suH- zcV=w%m+l}R!RxBaeXm@si%b*}z4{RW{9gt9JGRzfC7 zNYZY!tDKX&0TQ=t;RcRLp19{=r_IfvB|!w^8w)$5gTaQuOqLS5e-lT<_fvsu;3@g;Syc&% zMYK!Sp|B5i5gV(9$uX3?b@Z|t7+F@GmywOC>3ykJ zcpqjd@9yGd`CEHXYyR^FV+sInZCBsjmnm6m3Afi>2PX!Z7Aor_9^}yf;V0(M2TfH8 zBJ^^jouCu(L`>%PJI~U`#+5oy_3*^}UI=mpD_!8Cz2mHn^heUj7d3X$b_>O~e30hO z>G!uj687fUUl9^x)|(i361~EO;o~1_9CJd-AUN)aeODQvUBYjkKeRDJ#Xt+ib%JtqIt**VqZ;G43ByqFn9EZibIB~3I2}n!Q6%6 z-o`e8rcm)Tz9rcQTa)v&K8_B1p#n7=LF|{}&e3-Hwz9?v@z7Yiy#{NX?l^}qwN%y%lO);Y$%Cn5r)%bJp3BB) z-)dT6*y%xMbJe!&pz{Suu*vn9^Ba;<9otzlV1FjKcK3@pd5EL+&p|vEs#_1xtQXG@ zw$aS;OIkvq+>+_fP3sy>#ymV@(!n{xTP~E$U=IHj8DZrtMFZeSnI-he1;pLfLMc{@ zpNN>1EkfhBri<-Mu{FZ`G8Yp9J$*blU0s9fV%6SW81M36;V;ry0L%KC*)Q&>@D+KT zyXi+EjG|wtF~|g`Xe>2|UsG)RzgWrn*yA%Bz3umJvOnOa*7L-G+wOqVN=Y$u#~gxv zA<7zHQzGLgGyF{?Eh8c%C4#^z8W%f5WJZ#SS&qouC@LrbDyRR%I2o25&t^Qs%jm08 z)wdntOBebp`fVyF+51m3uVDYmL<|$X3Y1oPUpXBb)LR}#^t_Juewct!6@D(+~Vq>O);FH6f@c64wB4PqAA-N?p7rj)*Je{G-&-#OC9Z% z;fn^U*{R>vI0X=kO4S7A!!+?&^O3$)iXqt8AM(8K$kufq*Mq4L`<1LLC76~#;JyVg z9dV=KeK(TR+Ko8leEOEa8q8H;Mpoc8p`<#Gs|JpfNFNF0ATsCUQV+gnz7s^m=Qejc ztGwiwiJ#2uw%5Y%$N6pu4IzPdt8bR`DppOc*Wo z@6CiaZjTPGj*g9(jEZqP%x-xQaH({H-t;Zo!g1a0!JlcJTT?L6nYiSv;b;ER`~}$D@R${s6r1LZ{#) zo>!^E7d_LI?sMIaUnWOZIinVpPc>{O=~x;xh~#t?ohUUJ~U;VAavLc$CzFNB-NTCKrL?nhvOeDxq+n<{D}nc`vXMbC-$ zdEVuomDU!D3vU+_C-&4h`lJ5CYfvP9l=TMgVP{*h8WH4z2fBU6Oao*4Me{SzENSL6 zYRyyK>Egk$(U&E%19Sm`O0bYt!;dZogX^kA6mi=7Oh;Xlx`f2`pm=on<9L6(ML-@o zcWhJ_9sL*?IX*3&UVQ2GI3BI2_`+ik+*4cdXTe ztrTHM{U}i=Fo*#RW6X}h3o{qsPc{Qup+Kd-ZunO-UA9V(-Z@jdh}X&tGRqf9W}%46 z+`r!W)J0zvLdr`)@B}eSfxtxxN%M8UDz`bdTql-LABj?6l0hYlr{6F`UT~0@sGn`U zpMs!dizSb~{aE0K3?R0fA``YuH^$F0N6+$V?o--_;nRcI*xQ(VQHEb#6k3p_x3Ex; zM{X-(WUMvS1LhgK5V=WBHsN|qWT|wwlbv#`6NNnC)4A+mP$y&$A3l+KnA=sUgkM{q z9s(5os99#jca6^nE_shO!0>)HOE#C?QnysCBkF7TmA?0wWhshYE9IVoNHM-xCGN#Z zsl?6l+t~LF&mN#mW}GFoHSiB5@br1fn2FjDZS~U3&i!so7;lbYzm%;i4*f2pPj?{y zEP3)OqKw9Ssc>M;!c1Az9I%-*cu3mzDwiB)=CxBK^xfGMlz8fB5SkX&2ztCP8Tv`a zb(tu>*=YS%+!m!L<2F>yv8WWU)%_2?y3)oigNL9DZM8v1G=`b$W*hMYf_{qvEAhs# z2y6d2f9Hr*Gr^E0H=*PCPSmy3A*FQKj+yWE>Z3PlgXk4UUlgJO|<%V8a)NWu9__s z(R|^VQKYkjo0x_za^s)3Vu+2kgGblg5odCA35h29>u(XpXAG#$f1X;{cU_butV*4! z>NCI5$h_nx05Yb>qEZTB$WSsn1MVKn+kD9?#V)|x0$Y*JLlMQ(Ji zL7NM8#2-c)wYiwIw!s7t3mu9B6|GEHhxXN^BKscW$+8bF%y(^IEJ36(KCL~)>eUxw zJhV2$ogzPf4PRvpp|r=TFwPW7+x@{X3x-X9lvG*L>P;}(N!M<_7@%(x;ng=zvv}F& zznzDgT~;lsUKbO?7zb@Lo7sbktrx0MJ7+hN2<9F$Z`@PVnOlKlKGe~6J5U1FdtQF4 zcJEIrJa#4@`smn~k+f(wl5wxmGx7Hp7kmNcj3O|Rg`c&h-&VHYyS(3Qf1- z4J9YwE9b0p9lSU_w}$tb<(pVBVrt;GkKZ|Xk=RAR@D0H-HzB;!gVd){@9zwXGP~0E z?_ck%Z(P}BY_^hbopsPLd6F0>WW_DH^I|@NG zr5?-J@9P@@S6_I(XDGQ4RCqR8LLMwjx*2)GY*N0Do%CcfhAxqAgWD0d)Iej3R9Sf> zpDw89r_gN(r^eciM@IqnhfgaATfXI+YY#C13ta1mn8=#^ru24%C|LCu9)!yW&!=97#YN@AkY1SaVmnXjuyAsQ{3zghG+*U!A z#LgJ4TnH=HmB%lhYQhh`jc6xKyA4Vs`M_MQxZT)WaD1IFq`lO`ECyhfGDOl(p1Jr;BYTNi52sgnGKl&VeiUg%Owpv0~p-=42|RYP?RqjRwH{ zKInoNJR5``ErRnrta zo4Hm2(rvbM(ZMqM#B#~{?GD49gC9erd@(z;SdFzC)&<+8vgykfd8sz?yNjqb04@4|dA7 z1+*sWh*e+S8S~Sj*dzRk>xD?TSaGOc`S zzxF8V0reo}Cmdi`%SPMRsc1s3f+sQt;u;NMs;rqP7&jy){6BnSD42vriAj)uQb2)~ z=~RlVoPYLELq*p|y!$k%zq(T~%261OM(b{}`)W~8CYwxJHXA>< zx3sQ#JhZc4vLAA8K25TpS#fXi^jljPpCm}AwH1Xxt`~?2%wYgW-`{RRBI*oBfR$tBRaz~IcQw0qW4W6I_wGk&ucj*s z9CJiHA_&b9Qk&~pNX)xkLuJRutzv;>2Tl1y?W5i=K{<679>%`|jwWG`-@6}!jSuJit{B_fi99=4l1)`l<>eNq(D1ouBW1O$C%W#y5K?uN<`L6)bbG-VW4tYj-u~KP{6r z+cQR(PW7udvkYaFTkfftZDe0hx?H9Mw4ni!K!xzB6JDJ4Xuuwd(b= zw)j`0-Owkr>|qIRjG+tdlI14j%K<5O9(l`EwVx|1%tq}pLer_m-5VV)U0pUp4c#N= ze1r5FW^p%7g^#KyG`yjTNs;4RbF!TJu_tCdlV;TjBnl+(uhOaUdztn#SHX4yr)%uw zaFr){gi5+V|1xvPdV0-e0@Vwp9fsbxn?Jj4K-bH@Mf=F&t=k1Pfm2{IdZ{$}M~lV6 zYHFpDSYTh#2X%$z+6GSW%FsaPyOvo0ov5L*S#LQ)nNx?#4U@Kul$nlCVVfHM569!x zhYgNg^Ea*oVD5c8te=ufG(@iqCpwl+tYJ_BE6rx3@SDk_V*T^XsEdn5#IdN?N<@p1 zD?$@%QB#S+VzO6EHjn|lt1=t9yHj2D;!ao3Ui|UkBuK7Or%};kZQ4!E{Zz+& zfWd`B=H&-3p&@w3-c;Q&y3{e}0$gxYHbi8?snGHZ(4Y(uR+rt1&|SLYe}@2dXaTl)|S$<3zIMm*_oX3mJWyLCi?2TPu zHICEC%9~3l#Jf04aXV?6Xff&ZVr&Jh>mVClFYXWz@~EAfvnyCqdEGfTRT^1MRJmuR zCwQSY1e~0F315u>U`SQ(E3#&A<(Ioi12*qZyVn&z4h|STNS>IiOJrQhjFmF7oiAfw zmX@C3#Oc>hp5>;((iIuB+sHRp6TG<@3=YpGqc4Z4=@wiU$4l?kwYHXP&&KVASRJgp zZUR5@Dpc%>qd_&qo(7ca-){$NBL@=0r<~T9G*_{9lx+?J^U2G(FIH_Q?wDL0>tv*MAw%{cuQ5>e1?aN{o`n5x}v8Ii%SPMp#7 z@?oeRItEaaV9bS+H%1Fx$7gt zA%U7eNyCR!(e^D63K>tQ8xbM2nz>T5YH8 z|7BjY4+oCh03vLnU}I2_;3Lz(u$4z}i@t)28=CV1?2hf1UAu+_4z2< z_WFMRngI)MykJOiC6-_S3ZovU7Rk@W*cT?E9%n0gG|A7Q(MzEa!;VV7M9n~;ELqu8WT1_bdF_LfK2(mYQl{~AR#g74+m{_NbUi(E4RxCh8&_F8-% z;ulgOW6zzx$LDG)4+X)=q~_?}9H_K~BV{lJx~edV)`m)|lPuL-?ferNA(S#CG`Zni zS*QNmfZsXdH!8$rjgBq_1(a{rof+MzHA-7+(SVN3XqkDph)rr}F%GBr7LESrANj$l zI8JIM>hm}<4ua6et#^fb<=({$OZj$o5Lp!$`{L)i|0?sG18>#U9pFJznq3*=tXMd8C}J_@&Cv35}H z54(X+(k=rjClJ|dxDO?B#rPn+hGL-c$zM8J?_6jt0%1mbH4}T`{7xc2j%RLk=CH3Nq+UFu6H9L{o_BLh-G)~C< z%o}COuv-B7fPIE(t_0D1?yKK7@$6rELn#+;G@&+Va1TdO>A4A%0i5&bUFUdDP9FK= z$6c{b;Izi;6aIm@h+)9ES-VW{!c}w&)Sp-A9mPUVcy0HT{qdN{mmmv#-8CNt^#K=V zm7v>iTNZ8Kz7mBZv}__tJ44ohzWR~4ihS*dphnWFmm%CgG@{$TqKo?Y^7#R0$1e5i z__s8E@hoW;B9G0h<5-D6&zPf6ab<;&kf1XRk%kFc7CGiRh)=N4zn{K9g8i{)0Qd5!>XRG_gcO)x)Lm~5|khvlif>^97T5HetIhTxjwH_1gaxd_2k z3fy8!x@w-^DzC|mFGvSXtDk7v6zVsw@L^!#kEX>ftc%(ru!<+7RR0M2{Xp2(a68ba@vajkQzJYlsCAmEp`UsL!+n;1I@0E2G(z>zqDNCGOo?9EX zY5bZdGI@7_lN3%id1h*ig|ebh=VJ538A>9x=SF13LN56=B|^h--(bXYxkHuDO&3}t znTqf);0hvL`x;xgE(r z?MX!2K+Ya}2OCYkAC+_hFGr~D5+I?YaRrTq%E<2?*F(9MtN!ENIB7d&dE5RdEBY-U z!>b1;Q0ImJ8!xdt@FOlK$Je`yLGh@bo<{;jhHE!&vG!vNik@8&>1?d%cJ?iNNkWl&rBzB37K}-+ zD@~C8((c1;&JXuG!)NBo6lQK4^A5DeXk%nX+V2CK2*%tCR3(RjPh(Q@N2O!xE`Un( z!?Bi;{Uqgt=Ta4y)-wQ1RTT{Mkj?q}^9=UDavXiJg%9%U4({RqLh!dkqDf%NwlO#=v zwW1_F%XO$NPnl(`DRJnsQY$8`+{bt z5w5|q*M#1jP1M}jf)}_3+_~reYu*Rl{PB0F?N|9g&40fFuDdOpB8K#S@mTviK!ar^ zQoz&~h*p^YX(ykgbrv))@gF;R7qJy>6#BO*QeLoe(kol^l^o zBr3>Hnns*OS82qsuvp_;zxBaGuvc|_$NH_jdb1>^(F>{6+`8D9psm@UZ|*9LRr5df ztpBp|Vk!J5z;@;zc3$lN)X|oGhQ+6b740+7|BIE8@qbtu{QqIVo=5x_Dd4yQmb|RSY15ihqcvKn z<5F4tQ|i<~9FDR`Tld~(=d_+)X^WxE;R>uE{xj{g-&|~bc#ImY(Gk-WF2LN~ZdV_9 zFwxX$QGfS$SuxJ1taxZ+PEcKsG>(mvi7|0tzX8SnlS`xgnL*3|bw@D}4Ru8Dibk9c zOAp=bAq6utpRzk`%<>QRRLW$^K99bM6lK*U0>N051Vh)KfBe}f{YxlDBG#lH zIL;?<&^Y$+KHrSl;9&t9EWX3QEUdP`)$Ggc7B$tM9}N*{t3;o-?=OM*%V(Ohj{g^b za-Q{HjFjSkGAgA1Vr2Z4-+$(H=%0>fO#ifhEBdGPo786jK2`42pX2^Nece?)NBPeY z`k#CghR-qNKkGn4^gk@%bH9J&a^jy$>U8d}Wpz)>`sbkOWplmZzR`z23%qRKvP-!Yi43>G zNDqR4TE>n#c;YtlFhql_w`%8!8F%9aoOR@gtI5>TPh0z-px8k zm$vp)d0n3?$gaw`M3!shoLl&V>viu3GZUltCXURe_gJgz*T1BP(~w$?9skzkSD~FX zS%S|T7Z!W{3fDrXL@ee9h&rJ(e3k!IWRf0e2%T`o)(TZs!NG62T(j0c0eOq!c9MLz zR((`zZ6sz(8AnVe&WPm>Sx^GFI9p9!US0;s`&*dFhr2y;6Tv=!tw59pmhg*amxe8v zv1HO^@hY**kjpH1b!u$NiDnv=Z#!s83>29)>JoJ5eNUQm(r~xNcB)^fm!Wylap!z~ zCRNH)Ba=9~NtH)upZ|{Wyp+$XsJf2JE%_NIMK-01ZR}ntpD{1BEuZQz=R}ZarAi;& zMyXB}Z^eNyTkI&lJ%{gDFT8#>zgh*bZuxA04dwqM-xy{$D5lnUQ%fp(+zl9Dc-ceXBd1!d8tH>+5o(JU-gq*bfJ4lQ_0Kjinb{ysut$ma${Jq zVkEnJ-z6*HUH)>B9P{oMonPFbhFOMLg31N-sX7j`I#Na?f2wN8Iv__;vMu>ECxhoU z`$7GLEh*BiHCv(?@x;RA6Rs9!&pVCP(NESPh|ujkKlH}GlWJ{jr-6>9rVMa{Q(K;< zl&JWsy_`!R=O*60)ut6607_L?fgO_2)}qRTp#V%6>`7*tQe`2gpEN~UH6mz~lHMHO zLM|$)_*wSANboMK?*7GDsrDzcAz}cqtoyXx25fV3Y=_lyK@%B7N*U z-=3#!8j_*ba=?c+#B4>H*t3#&n?v4-8BY5(ZtDi`@tc=bsH7Fyvv<^{p?ehLu(*3r zmNDe(Eqs#=h&g5qWix^T3$7<;J4Q%8n>j%^V8iFZ^k|(_@%gO;4^s1B!6ug3q{j<^ z;h`2C!FI9!vu435=uK}!Faq_1Y;bp5SbXyO64MdkNK~BV3b(46A-Q9eyxcw(hwHQ86?Bluc-b^$Dw>5Z=6bw0j+Rx6WiAi(=NB)uPB}0gV-*ciksO`$@E#aoFbYA~Xv2@fyFIfSzZ=)&C6dnn{qWGi(;0hpoK&<+G(g zRRj$=`E^FKVDU!3A>oC32*2tkp0>)yEkkX)R?Iv@ZDG`Mv%%}+?j^|C{EY{9RZau3 zRge6IA;&S(B*odg;8WWLd>f~((0t?#?dI-{_&26WilaE@S?@iS3$=9;bP&MaJD!SJ z{YsP0KM^$WVh~eR2^n=8i`HVmUgmumQj5k8&Dtoc= zo#wE_`Jb_US%yq^9H|%jD-P-_qDFlW)JyT_r=qX@YVw2TZ$?1R>kIOYNc+0;TkJZ_ zt9sA*CJQ2N54)sbXtJTF(#I%+KRF6K`I(Vp$Zr;K#47P!1xcABx|;J#a!H;A74{6{ zrydi@@cJbPkmM8z^s+xruH=fZqHixt8BlQo?k7DFIag{t1s(L_fRM0!A^gcu)-y}| zgf;AqsLNiv?ewvR_oCmptAz_d51$|sA9Sm(R`%yPOhax?cH97^G^1Ah%t;mt^4lf z361fgSujiX?5kYAj&F3aW3lgNbBi%r;TywYEQnW@oGwRsTNKAN@GRy!*p*TNYa2~( zU8cIo(urOjE`CtlYITrCrAD}6@rxVG`#ki0P}IIME#^D5zE-0GnDoSMS#4bTa->Pz=&jK{JlQ!EX6#l8wRvlmsu7nj%5zB)8gz&= zD1~m?P&;+dgGd*gG@uh{vA_HM5QVH(XZndPq>-ekJg^|qScd}s#{c?Qpm=LR@H7RZ zufFKxs+E6)Jbfodssm>Kx;1fhS@JJ%9+I76x z2?|8}e604_PGoAARXJOFvAYv56l6!ZZ*MU#k&^(sbvsinV@qonKb@r1^Zx8kGPX1pUDHG{hfL|JZIGfLwAk z;k5m1GZAImV=(HuP7KF#`H-fsp3C-)!+twgC#_&miaz!d|Mx19(kIW{+Bcli)!fq6 zK0kY@yDADxMpDaG8#4FbGkCQx_*K6-JW%_FfMK|uoc2X6RGPosHV%Neiasw=i^>ra zsHgH|_=?GU+%y&A{+MAp)eh*@w)s-4jM_E%pUh( z(B@AUuRPVlz`teh@|)uaGxTomVZX=31%~h8xPw6nFClFv2IZ6q&iI}61wYu@a0Ypa z2c(FHGN%DC(wNRy+KUt{ZnU-%M*ni%OHL1GMryW5OzD>Q}XVE zXXn|1_ha#6+V8;+|8*BwFxSaGQgo<&$8;W~H;BT3&x4)?Nil%rf$2CsGt)?=m7n{3 z_RVLxi15VI{ZU;)Z(=O5eV!1~S{hv=UTV{Bu(sTj;tsccLZkf|Y2;)QgjIG1Pd~ZA zt3of){W^ALA^4%6-s4m2t&bAqyp;w?kNUw&;veM$iw5$g5D5wXQjhnpqu_UC`FrC` z)CH8suhaagDkkYzOFN&yu%O5*GXZZB(=;_C{q?ccp+P0t`XLz>8tM~B3KDQe-*H1j zM`^|Y9#j22l->Y6K*GO7XrR>?L(;V4OT5Jt%v6(N+9O`^q{>AdP!-ZZ&vVt!A+8dG zAnc3VCq*omn1g*8HYX%b@&yjeBMW)o7Yots=tqb+>N#Hur^g_wpe>pFJj32#<&V?y zqqj=7z%MYws0s#q+pd^bhQ|~JBpJ3v_G5s=1|RDZ^1F^cT?ikz)fvfs!b3#>0A=iM zc=5b+JEhErp!cKkn$OjN(fBMPeEE?^X{9&$q44oEi|Pt}ePA@cNCp^<2XBoU7j0f~ zpms`u*Nha}fUT%<`P3(1G+x8&v{;O%z|pvqm%5NUWcMkVt*QrN6CKpAr$jD0Dn_G| z=~1WD$|SKIKGQr_(Z_t8gj#6!jK^7rE)(UpZj|_J{1^_ zf3=>rfD!2QvWvKSkWPPz#7sxCk1H*6V>Np{*^d`h^3tRwuMjz9XUi|$$E zJVCy64XRq3fWE@T6u`%HjplLoI4F5FmYqX%f~~L5>1%i0*YWhUbp8Et{$29!uiPr} zVegyehb2$H_NsV%a|aE}9xZjC+LiLM%d#gd?XFrDjWf^mr_#x80QOHKqK+RTc{-rc z@dLdJwZwzg^r|^Y6le`!WPdK!B(7&KS}Ags-k>a-C@?i%(>%B+jUSSxYa zy~7MVHSM|nwV3IAxas8Pe0FgP^}M+?aC4T=(akkthoi-}gbg@}J6vv%Ml|V!jSLLI zinigsvZCgbXcSwGDFSq*BGv4&q?obz{XxEd5vbp>XAx$noo25+*Wp_AKb4Z#3E&49 zqSI0i8B*0^i&m({8^D&%VJRwMGI}-paN2AAbj0O-El1@1A13Bln)1rOENU{e-2k-d zzbiA8_jW@A1ge!qzEuQifL;49nn4lmbGOE1E6TS&5U&%T90*1y_sGa6^>K;k6`=us zLy3gqij1ABR}5H_jCt8f-`6gV8mG-Jx?lAQjo&=)X`(bsjJSRtGW=m3G0m)atS^15 zN_uMZ)Vi(Onj_1DKU{YnZX=IAo429Pw3@Fs5xcwmzQLNXMomp6GR1Ypa2`6Mh8lCi zKOW}F$v6$AyR#u&E9=#7;#TGGs-3dzEIVcjF(#Es+W9zZedIQqvRAd;(Jz%11vy-k z`1BO0dT1iD;l1iki=R{&*w3WXrVpmI+;n75x`ZF($Tm#gd>+1{zbU`EVE$b@KnEh{ zZ|#8Wz9s+!Upi1^xG&~J0uTR>fI@)#-?4WLph%Pi%u$Q}0d*FM0ReDWdozLhQW`K< z4a`&zZ~U2~p1tR54goRnr$Dgvm$m7*0mS`r;F!hmAMWP=HDS7sq5n2vx;J1t;{15^ zJF8t^pYY=St5E;H9{g{_P_ru9!1UmOu@_%MElHGdWJmmAYu%Fs2qIkj7K{FOGKXhu z?4cKK1fvco)zTuTUw7e(BXVU|+W0}+rui#0I#j6?F0)RDw!`UY8N{FUs_v1sVM+JM z+73*i;p=)AMbD<3L92z;K`SaQ4rjgzH!kT7*l_1?_p+-7msWR&IY+@tnE|P_r^QI} zi%{fgmLcup^}Rg-o3Nqrws z%tF4Ok>9ZTJtNQUj$%md8T&h}>%nwngCc~SC$*i~w{|zC?+v_=reZx(_w4w7m-_x$ zi~C!H!}(i>gZy>FpB?-|Lf`~)whCNh`}IHW_~t+`{blFU{?j2JNV(tNIuJUrj|~JR z5D$R>{UIG_LjKePr#b%84dVZDa{tzicA|iNL|~uuFPXs}czqM#y?hV&?#nBh{fcnK ze`RvM%Zao)Z9OFpbVBtRK{mUcx}^Nu#slW((o&0gWW=#cl1J&aeQfQ9$C4&c~6+gvG4rls9#rA13N$g^RZ z;a?wq9QLMFc4V@JPUj{ow|pFOd8q&5YQ@XxW#iOy4&|$7{hQyX))$CN)PnpRquLH< z5u1`5wx4M4hJHs$LE0PE3?girC8mQL-)MgrkQJ_+Vsj+79odZ+*QuLERlU_kbhxNY z@6o5~^z23O3D0)Lv(!ae7@zC!-pjvwgRy=HE8kB7K{GOyHjSDUo;0YDF+b>jTC7vi z?q(L?(y02T$1BS^gg`}#D`zV&X;_KNAC)mHY0hmkTNS7k>BTq$aRC8CaDl5;^u?Dvdd}YuuEZl*w_>H=LzFGDi-Ar z<&(yQviEDiHYLI_vK?#taD|^AH7eRm8SXw`tZ*lEMkbP-M{Xp2bp$irC+5i8xhtUQ1Zu%rt_821MoPUSNSXo;fOC#5B40WcJXU*B=9v( z35zDP?w#!M$iTei>YXBf8|&rx!TFDpY+4>UdK%uF@&J{K!AslwHC zr>AFAC2`^PLEijHk@CE1ow*BY_N0$|U3hz1`x5aPX)8#!c}mfrf)D>JNgp~dRv&m> zk4Bev`Je%PgJc7sQn}DP9R-b%PJcfo6pPV$r5Ty)a2)08w#7&~KxLfh{+bg(lhdwx zAip}Gd-TiPxm0X4burRgTU>Rv$ZLhk5%EufgQJ+E9~C_gT(G7kjUuL9KF1MXXh`h} z5@{QSL15zEGwTL_eI`L@}cPy-=glRUTY9STg6==8zL3sMbeqhc$a> zU`8pd&~0eRZm%I|TvC4;C#uoR)G2oH6vUI4(O*UKWq;+>?+b&tB&~%>FFb6}jjy<) zMI1G(5MPKaV`8{K^tv+3J&dMS?qBc5@*qhk9FM6D51(K$zASP84hC(TNZ95ILOO>*x-~$ zDdx;cN35h(+}NCj4Zv2HyV?6dVrZJp(Iwv;Y>t%{(}zCm8o+v&W;1yk?7yS9?^{{| zU42!HGh@&<7Ta}#nvTFHcqg|^(`PDAX3dlTJ~wv6^SQXCkfn;hmj7nNM9 zzba|ysn{LDy_#+CsJFcE-w!mEvSyFoxp+x6>gk%aHug^t<4>DwS`}F3q!NkbhvB`< zRJx(OosmnOrJ_c5t@%PI^n;ADMr#*3YvNq)?88*Hfr*|gO#n6vWjJpXha7C+U(c$? z&Q-bCD()zt>krc2%5M;*$_|>pWi~Z_PbMxv(z_nx|7$N*XtX)mv1h7fTlGz*^f$AI zy;N@D<*~oa7waBPzP;l-p_5>q%6`tA43$lG99W7gf!{DzFrwvejgNfUV(uTsm`Z%R z)NgO6UU=$`J$3X%yT>}CGCU*D6qYv6(bs4D>B|7i7B?%Q|0XCxu9cK&e<)jXp+H=) zGg1Hi;ce3+T~d#PI@DyYbu^FS6==501lCV0^ke?i1a=KA&CyoSs~~2_w-ja++(#v$ zsd%$6H8B#dZM|oX)xWYHHJK02+g22G+#oKf&4_WDc43!u6PX~!o#l(zQp|8tOQUTd z5r1Cej$<{+;6MXAhIQE_Th@#!CK&RZo|%0$Gtfe6Qkwf_$=!B8ZeU-kp2+!A$9G}0v-7w%~tgND|K-WfF{M1|fU=`?~JG7@R zwheY%+e~s4Cl_wUP+JrQ%NYs|H$+2%%{m$GaKJKs%-!0!HTl|4KG`EB9m=drA$@c$ z#D#%vK91nX-Ruz3dRECAGYSrRFl$`bN7C{kn*|HCCEM+8MjSzzWeTPW(4`L@M+I{| z?RoY|Wx)>R1`Gr>$kj*ZdUFQ5^hQA^EsljI1Y5OM(UV>BW2I2*LPAjoGLG45t%*={I9Hsv|I;qw?ex@C9U{i>r*+DN6YgL^`J(>tOi|Z z6JF}#tT(hGS1XmN|0EkC0+Dr2&n#)pd43KJ zWti7?G%;zJ*ICW2=lSmAS@p~QG}e{Yb9e?zu+&F=CH~^{9id4<3r!U`QY3B2Idob- z0c6=6TSAAnN>^NT`UN+_dk1gO_H#e3n`rDZ6y!oI`!Qt*^YSylzT_&&m-6u&^fQld zFuN>Y@=d6e5R#vwZNOf0^(dKfZe!S9C&noLs^h$Ce45){4IPLLSJ{Nf>t+8JP(u3D z$xJkQ{yfe~QK?Bn+9iLD2{}eDk%O@@tC2z_-ATcV;Lt7yRXT{SvO-7`o<%*>k_%I@7Sz+%Pd0~#T$gXBsDvwY z-}d4RQ>DiAQDux_UCQZUm$x1b*_P>y78jpN*OXmg{^lEb&&xmf_kV9wcK1erJMumV z+O6N-lEB|Rnw0aaFhyB^H;#}lp>VvgEdIq%9lKD?H?P$!b^y@JUNoWBGM9N^x_sb4HZm;vj!Rc`kPP^aQmIrEgR-aLow%ex>ZoUh7( zYVOQCEV(QV3y*}=93M#QW=4E?hk zgI8a?l1W=CTXoI1a+S#&KF{-;K!;283N)9y@x;T}%SRbS1jOSsEkv`FK21YDB1~Jb z-&%D)qZ>V~nXUS&m>2R>U2>3okH;u4BUzwBLFr`WS;JdS^p`w@7ZYbcp4kg+%!rgJ(~93J*-^(lGb1flTSU6S zbs1%rCV1!W%#_e0w#%a=(1NzOsI*D{1=q5UW+SJ;m6AuP(aF*OTcE)vL4-rVBE}v0KWN?&^1k4`}QR2_{D7#QWC<_`g3LyA6V_EaI-> zL$ivT#V_f%`H1bAGNR%klU7xn;=}eTGw~set`^U5mx?RK`)O*j6%yG`hdu3k9D0c_ zmY2Sc$YhPH#UUm{)`XtAp%vM`u6jTEGrYn!^K6@(7 z$uQYL-k2ON7s-XbEP`%9Lu%9_CO@u4tu&b%)Q_x{{?**MRT?ZVJJ_;EocH7oFZiRL zz>rLy^4B^K##4}s!esFLLuVrz|F`++60P4c$(c}q->%jVV!v!ikq$u+&n0(CuWHCw z8U)Q=6?Pjn0;o~TG;*fJ;%j%KyEd|^v&E7*>&irdLN7-CbQ@1RlTn>YBr{Riw5gN( zi!?BUHjE0{b$VZ8r_ovGOb5!(fvHt3T)w5lnR^YxvN2leaE`n@caKn8Vl2cR5u9eG zK*qG?Z7us|;NlVB7S{C2?8nvhN;@nQI%3Ooq}{V`&zE{Gr@D{6n9*v#9nm_G3+B^? zO?mH43-ninn>$0o3#aqO%~g7>x6m2xXj&ijoF@_V_SMbn*&r*9N1pU0JZmVmt)kNu zm~c7DKblhhFuJ?joFSEUKemU&coUsCd-ogscPF}uG4U@>oX63mEY_37eas5kE1Upf zcgyq%ujA}otKn=8eI=WEQNZzl-6IpqTPG1&!A2h*RM$dit8VgCPlX6X#ebbbUYodH z7vo`9tCjMwfaasTra=hN5;1E-V7#JxSX}r4Ik}m;uj-8Ad~dBPwq-@P;#F;SrTo%W z1%@fvwO!9u+qk$}C1}pO>Z-yqRNC!f-&$*ufe%kg9%TxQyiU-*S#pu~jp_)Gi?i0K zFe;ZhDJA*q0rxG={le^owWZIs3iFLQj(pef`lT;D(;uXEIkWYC)WTM(gkOi<1jWM@RY!!!pg zhWMxyHJHndqi>Xk6I7YBK7px^s_cRibW5-iFvA>}gte_qbf&~mBC=>AM02BOO3xS7 zK9fCzNj)y<|`oYNvQg7e`B|?=#~7g zWq1!nK2ZyZA1dT&e+(@~SrLd0aAESbIu05>=`q*{fxl1#WG7u8KR^vsIaeu;a$`zz zkT;sff{2#L>XaIiOREBWW(2lXk9%;l)$wa891fGJ_3w3z0{lYmELSLZ#4GQb5Wo!M zqqD^CQSU{kz-R>sF(ZV=&>)mD;S9(q><4RG)Br#6pbYV_7EkNrN4yvZQfoTvg1^2t zgfKpzn|VI_KDhc`bUM)oM5hp(g?rJ7-%}vAWufV;^Wx#X>@+^|WTWZdPicrXRtSm? zWqGyhl-Z#oR+-A&a*MQlXu^KJ=!o0jC!ceeXQ||CiK?GI6Ht~PD0hf%ObA9tdL(CI z@cJm#d+)$Ib^iLo>ox7yYt%R23j23`zBC9D07&K%3-6osihA9fhwgG4Esr7u=}&^> zwe+#X5WJ&6{HV;J2s}9U(_p$&8x&YAi-gL`O}@V&hc`KG#mCQ_SJW>!iS^o}Z|#)QbAA&h-p z&*Ox`_1Y}__**s9KeWB}r2Rw@N#1PV$q_%)RYOo3vi2cG4UtH-SY=kN)BL-v%CpJs zUj}%x`;N`gswr4=SUYGQ{1s`a1UiB=E1=}(K&yI*i;YKSTPA$biZ7W zyy5+)?qo_g(ov0HvXoYrDwxa!ba$1bH@_a1pfC5TG{AoAPAvndY=3p9D*LL~ErMN>{^)Fn z?sbCAbl#H4N%>UVq~E$zh7-MNHlRDz1G>|SJ;#`A+jP3M@mZ#71&LxUvu+zP)vVKMKXuiagnAQGrC$r5b9w zme*LTNd+TQIFSP26F%D+xub((6j7%)qlZd+6)tmUwL2d!vRpUZu*BN9sJqJ)vD#CZ zo?Yr0#ur$u#kh=XI6Au3nHMEx<=aFb9BrK&4UK3^_gk>`YV?*mRugTa=ky%5S9LoG zs>-dUY>>F?8D&Tms2Dd$EcLG)-=)~;Mkw~hU9pAc6!gZjNcR_5Ry7w+o^tJQHpN+b zRIg}yDl{fcrW? zXui1q`kRDI`yUi!3_z0r-|J5UK!a=ge>Av~0VlBn0z@33ISB(g6Ttc%`v&Mtg8;i1 zSVIh~-TbRtIQ*qDR|DS%{Fiszzx!HQ{sRxp`?p8B4fy)vFW;BtKRLelI#>q4@dfk| zRAB!?bNTeQQR2WpY9-~rbth{loB-dK4_(l~}9=)7K$| zT2hIWjw_)!*wZ!BQTV4_B8e8_p%cIsfcIA`qMF1MRp!(!= zWuVn-(yA74V9{3PT}z1oeT;+?9!P8mOIIj(h)*{_NuC|+J(J?VAin%mdN9kgO>ngE z&C=AS!oBts;gKr)`;rw5{kd#TQa}ptwILrMjrYC8CV%xO@_X$MIFa=J*cR)Dv}m$n`7M|WcW_D|UN-~RLH zd+7IHiudi_e5mLLaIBqOJ6~to$jW^1B!+#t1b& zoG1e!9g*TtR2bK}P}$YPtEZnxC|YoHG|P$#_DYQkH-;og%*4cV-21}XgOwPiMUI7b z%#4eSM{KVXhJu}(M$PhccvrW=qpU_UVgm9MUT%#tY({R?u5_2_uxsB44Hv*Lm$)#a z-*X~Ry~e)R@Y9IyP}xta zwC98gy=)5-y81(#;e9?H zXtd?4v+iViTu)m|W`u5eswUHRC)WU%dR3D4rWr1EY0{OXqn+bk*WIL^tnfow13r)8 z4v*-X3dzROZL8z(ldvtC8k<$wq-9bQMvmUeC$ilhdUvRZn`~1lKnWWA!%td^@U4t<_ z%&YTdU&)ZbR><8d=@8w$(cjSg0QXeZP0xhRgBV}^*}+E*IT$C8ZOfdR4d1 z+*;p`ceg$ocE#&DU-JFE1{3GX_L{fV#uR0Zoxq&?zYLEHI512TrlODLjvmYU z@qrBdi`OyxDut>n=bL_&2LcBML1Z?9(lVtquCGHFidAht6^P@H6ufC1gX9bI2UH3_ zQH3zfP?Y}!D~OhFHj^tjuFEg)Db8hm-0t^f@u(sbk3l?AXgldzqT@G_titA#|0yg! zvb2MCwD3L4b)SUkNahsDQ@}^`Hfy}|jK!7IlMXFt9`9g=5~cbSqmI5TR*NJz9CN0T>LL=)wT7;c z3KrN_9`W3*cuSfrOIW5*IwN4WFU218jk6H!E~Tc2uSp%+ZzY$4F$gN7i%uBuEmGaHrqL%B- z@}m_g4hOtJy&K7vI9Pf)1bqX!kTc-Af9h@A80#hT*cBriO3k5kzOYTucm@*>mxwS2 zeJLwRDMl-mhh4)-do6|JZypA+8Im)F`-i&o(mm5RFaTFo^qfi z3LG%|Ks%5i*Yvs_2_9UMXC%Cixv{rXUKhJ}yg8gyRA!(Kk}Oz*PFM3iJXE#|l|c5*r&X|YQ+sE5US5gPbeQ&fL;w1rueoq+FsXMj+u#@5kuD9;HcNSbTjO|kp+L}w zIL|vjA$N zTf=abwoqvC;uLp^JG2y+qQRxbEl^y7mf{dRNPyrD!QG0xyB2qMzv2ITb?!{QJ$sUz z?9QHKc5>eDeZGuatwEOCicUKIe$3!KMmJ4^(aetXd(I!kbN;x+=S9r22iGWP*Ng<8 z2q>?4#XaF6!I__;9oLCkw>H8B-7kkrya(Qjb8Ov}c0O%Kf*0iWH-MKtboVxbRHts~ zgSrbzvO07*$NFum0WQ*k~fV)=mTx{7}T>#mbF9kv- z7>fgMpX@iS^S5niuLZTb$5w z8s#Zyw=_}@xAXS22CyeqtQOkx=M`gytVrhI%w%!fFwZy8qQKj~u%}UE1Q3>f$!YIT z3_kXEGUSs5;W=0&LMuq1iB3AQL64mAIB7R|xDrp7rYfCTs>$LO>_tOCtrnB&H|iFi z*SAr*<+&?{MKrkpMPnvM(F~o8#$7kTYp>Znjr#73sJpe&s#JZH=?vHX0dWqB+T27@ zJ%j4*@r~bjpL7eCs=gQf>J8Th%M!Gq&kr~rp(dBSLcbB7$PRQ!bq6%@$= z*LkWWh;Z=>ZLV9%bWXpab73CDBc&S)%7{GIS|`a%|{ zqe>7#ZHyYAO5k)mJQ+!CC1EXl74*GEPUxdfB=vsMWi!bFln3qVaeK+QWM#5kS$0u?(SQlF^-p7_g(lVRsairIS^e~aVnd+W?)5f&tQ&%?rK+|P* z6!k)L`r%iwYo{|nfd~ahpuhUm)Y`yf>WU^#<=$8depxig|K7^WYk|&;ObIKTYI4({ z=-6c{-e5iUgpt0GV^YUBm0VldPkTAHptkN5Fq*n;yiVbr$kj7W!RNtn6y{8v)E7n1 zcR8@9?WB=qd|PE9TXLKv1J*PYD%@#ZPiosWPE4{dvXDJzD0N8K1R4l<`r`4HLKgC@I<@>>keBN9VfOE1Emyj@i7baEE7 z&HG5TC~2Bi!>40-*zJ)f3{uWZ*F7M$KV3HnDxO}tdu|YDUSK!~Qoh3BYLbWNPAH(PM`t)*CdHx0}O=d`7z#r;;TO8GpW%> zX%rugR7URn3u`w*@lG92RPESq`>P#x>UN%4y!>@%aNS@51L>U4Mh>Enb!O^r{@9|S zz4B7|PV|ENPB~C|;kV4lE5OEUD_-G(5c~yAn))=~D61DDwkYwrNQwGJs#TnuT=LCW zL|(++Iw|dxP&8|+M-`#Nl>C}mmBSz~1ckS)4hy)XmCl%8>4ABx`emThGS8zQD%@cx zmnYltZYr!~%}t4huQrpA>Jz+I#x|!Ec8rXZUg**8jM}-sEZX$1%fpHbyB& z24r}k9-Ad+cylIAy|;_pTw>w3eOi7OM{q*SNYp#KYo6REWShok+rnl0*~pTcjVmFJ zfc2r5X0^6VYROk>)Y_l1NoO3y~gk^THworJBSm2}x|rX1|kWQSw9Q){W~sAgHClO6x+k z#pE=1VvYK#(&;EIh?ox9Bo{2oHlMUa;h9%rf6_iZnV0Ul?p1Pdoi1&oZ^=ycCe^n-TJ=0h8~ICx z;S#tplLC`x)(=KyT&W2-b5qB)^woKF1a9<%WBHKXnGKd6ev^mi9;kJARut+u)hZ6q zEq!DL@JN{QI@_b^Sfi~9tGrr!Ax>K-cYK_S+-L0Zoo0D}W?Dd*8DO}vjl(|wL+phB zHka>a^!f`6b-BDb!M?l-IruF4P+@$0t|4t{2i<2y-WUfdak5I=053ZN5L^8l_(w2y zO0em$3!Kd<^B~UIQdk`OM#$JsCbCH>CxZ z*HXA_4-mF(my7=j>MKXu)}rjmK=6wg;PD%D=Esy{lE!iBd2>S?!*SohX>{4eu6_ln z(*sV5R*QE@br+28q5OEMbJah8ts;Y#Mu=q(K%OYWd=~xZ+haS0-)kM#Z2XRqtzJ}> zZixI0D(+^Gol%oki_s1#48WorZ8SqFfI4p0Tf62!Mrtoz3xki=yPq^RsLmKo%|4k> zu8!@(?lEf(m%=XiQMW>>zv>7yX9m{mc<^!;ff(L!&hL=0+T8?SHGHvj%TzVr z_e2gk2+1So*gbBN^tOl0JhtD`NxfX9NfRCvUQ=v{69|d(+Hvd|C$&0ZskRhxGbnKF zC$s?HHbvdbZ<*)Y-4fPU+ckbnm-no|_GkMrGYr|h?v~14VZG+_8Gbak$5OqbqLefG zaan-BDWfs1atqL9kU`2*xpLNfe{{$))PdGD{pF|x8!8wVB-*wuVA2O?ZjK5EV;)&@VOF;Tl*h^uIVv5*j z&xdfB^@{a>K zDC0*{&qQH8<+6_@6!PQJqkzN;QzFbQ>(HWO9V4qE>dDfb;aec?lV>jx&Wh!ICBlhf z@8jbInCvu$6!G5Aom=z46_;+VMXF25W{zsY%M}-ExxMqkDkQnw;|s06%Y5FQHyK^0 z6${_wXzQzgUE*di9r}Blbosx@N(XB_r6lghT1R{3Pd}`RvR^|NQ!iB*Q`nDN8kZ5ICdEBxXAz$J2 zgTF$~_-7F}$>O<3DUXDlJC8e~jkMMq`tqHa3JZ8+<5n0`^oSLs&PD2kL~^{Z7^7@Y z3z8Q1it%+(P*8d76@89Wui!fZz}gtQ0pSL=g$2Q8a8&0GWe0jyVO1@kWqN5(ph$G)}Iids#w z#d9U9KVf9u^hLiHZv7vOg@$w;a`itp)$rX=Xt*!*UJ>Wj4cic#obL` z48K=&p>jawZ$G}3mCKjqqz$)ua_THN>vnJ&v|wrj!_tmf2*0cy#P2?tQQT|6?{StS z>@WdPV6U7Sp2*9)_(OxMw?|qUCZSvJPC41%OQYzmv#PD?xvv_LT1T#2Wq{20 zQXa0-NJbmUS^maVql?j74oWGbTyAS7#@2zk(Vq-Jm1y0`|JfC<&6^+jxJkoyB5h6ot zKmU3kU&ppa)&RXSFw=g!r`S1QMO({$I>vKL@UYT*1_FgeI(Zql{1ML z8yQF;+E+ zp_7&{AGj+DNhKh@#LPHaNJDdnU&ZicUMz1Cc41O(87fh3y_gXbb*ntY+k0(;M*ss@ zgVL(zf;45VYjGhYJ)Nd7|DFtv0)`Bw_c{~&BIq_qYWEo)M-9*T&%6cZ?x z2T*M_PaLm4n>I-^RrHXpI}t(#bg`oC9N_be_ zkAJX~{BOO^f7j~d*!*|B&aFQ+J2C&LI_-!M`==`Ohjv2y;9mKo1PJ_5hiw0YdV+^& zl@NVxL=Yi@8Zi#M`L{!98WB$r&oLrGa87VF6UP!nux~_rYsy*gks#QMhC09+sL^j! zzsKvViiSEE#VihSwK4zrg6RLuSp2_c@(-uzk2a@{XsP~aNFkg5uGjgXCrKk(%0Dx_ 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 Y`WoJFCNMjzj_CCkszj$vg54 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­5>Uw|+VzY5u?z&O@B?z$s2fTsQG= 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 literal 0 HcmV?d00001 From a4dd04b508dd77a247e4ea1bd246eba1e8c173ba Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 12 Jan 2015 15:34:26 -0600 Subject: [PATCH 4/5] Remove old Daily Build files --- build/ABAP2XLSX_V_7_0_2.nugg | 39261 ---------------- build/ABAP2XLSX_V_7_0_2.nugg.zip | Bin 319157 -> 0 bytes .../{ => old_releases}/ABAP2XLSX_V_7_0_2.zip | Bin 3 files changed, 39261 deletions(-) delete mode 100644 build/ABAP2XLSX_V_7_0_2.nugg delete mode 100644 build/ABAP2XLSX_V_7_0_2.nugg.zip rename build/{ => old_releases}/ABAP2XLSX_V_7_0_2.zip (100%) diff --git a/build/ABAP2XLSX_V_7_0_2.nugg b/build/ABAP2XLSX_V_7_0_2.nugg deleted file mode 100644 index 0c657c7..0000000 --- a/build/ABAP2XLSX_V_7_0_2.nugg +++ /dev/null @@ -1,39261 +0,0 @@ - - - - - - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - -TYPES: BEGIN OF ts_alv_types, - seoclass TYPE seoclsname, - clsname TYPE seoclsname, - END OF ts_alv_types, - tt_alv_types TYPE HASHED TABLE OF ts_alv_types WITH UNIQUE KEY seoclass. - -TYPES: BEGIN OF ts_sort_values, - fieldname TYPE fieldname, - row_int TYPE zexcel_cell_row, - value TYPE REF TO data, - new TYPE flag, - sort_level TYPE int4, - is_collapsed type flag, - END OF ts_sort_values, - - tt_sort_values TYPE HASHED TABLE OF ts_sort_values WITH UNIQUE KEY fieldname. -TYPES: BEGIN OF ts_subtotal_rows, - row_int TYPE zexcel_cell_row, - row_int_start TYPE zexcel_cell_row, - columnname TYPE fieldname, - END OF ts_subtotal_rows, - - tt_subtotal_rows TYPE HASHED TABLE OF ts_subtotal_rows WITH UNIQUE KEY row_int. - -TYPES: BEGIN OF ts_styles, - type TYPE char1, - alignment TYPE zexcel_alignment, - inttype TYPE inttype, - decimals TYPE int1, - style TYPE REF TO zcl_excel_style, - guid TYPE zexcel_cell_style, - END OF ts_styles, - - tt_styles TYPE HASHED TABLE OF ts_styles WITH UNIQUE KEY type alignment inttype decimals. - -TYPES: BEGIN OF ts_color_styles, - guid_old TYPE zexcel_cell_style, - fontcolor TYPE zexcel_style_color_argb, - fillcolor TYPE zexcel_style_color_argb, - style_new TYPE REF TO zcl_excel_style, - END OF ts_color_styles, - - tt_color_styles TYPE HASHED TABLE OF ts_color_styles WITH UNIQUE KEY guid_old fontcolor fillcolor. - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - ABAP - SLIS - SOI - - - - - - - - - - - - - - - - - - - - - - - - - - - - method ASK_OPTION. - DATA: ls_sval TYPE sval, - lt_sval TYPE STANDARD TABLE OF sval, - l_returncode TYPE string, - lt_fields TYPE ddfields, - ls_fields TYPE dfies. - - FIELD-SYMBOLS: <fs> TYPE ANY. - - rs_option = ws_option. - - CALL FUNCTION 'DDIF_FIELDINFO_GET' - EXPORTING - tabname = 'ZEXCEL_S_CONVERTER_OPTION' -* FIELDNAME = ' ' -* LANGU = sy-langu -* LFIELDNAME = ' ' -* ALL_TYPES = ' ' -* GROUP_NAMES = ' ' -* UCLEN = -* IMPORTING -* X030L_WA = -* DDOBJTYPE = -* DFIES_WA = -* LINES_DESCR = - TABLES - dfies_tab = lt_fields -* FIXED_VALUES = - EXCEPTIONS - not_found = 1 - internal_error = 2 - OTHERS = 3 - . - IF sy-subrc <> 0. -* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO -* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. - ENDIF. - - LOOP AT lt_fields INTO ls_fields. - ASSIGN COMPONENT ls_fields-fieldname OF STRUCTURE ws_option TO <fs>. - IF sy-subrc = 0. - CLEAR ls_sval. - ls_sval-tabname = ls_fields-tabname. - ls_sval-fieldname = ls_fields-fieldname. - ls_sval-value = <fs>. - ls_sval-field_attr = space. - ls_sval-field_obl = space. - ls_sval-comp_code = space. - ls_sval-fieldtext = ls_fields-scrtext_m. - ls_sval-comp_tab = space. - ls_sval-comp_field = space. - ls_sval-novaluehlp = space. - INSERT ls_sval INTO TABLE lt_sval. - ENDIF. - ENDLOOP. - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING -* NO_VALUE_CHECK = space - popup_title = 'Excel creation options'(008) -* START_COLUMN = '5' -* START_ROW = '5' - IMPORTING - returncode = l_returncode - TABLES - fields = lt_sval - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2 - . - IF sy-subrc <> 0. -* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO -* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. - ELSE. - IF l_returncode = 'A'. - RAISE EXCEPTION TYPE zcx_excel. - ELSE. - LOOP AT lt_sval INTO ls_sval. - ASSIGN COMPONENT ls_sval-fieldname OF STRUCTURE ws_option TO <fs>. - IF sy-subrc = 0. - <fs> = ls_sval-value. - ENDIF. - ENDLOOP. - set_option( is_option = ws_option ) . - rs_option = ws_option. - ENDIF. - ENDIF. - endmethod. - - - - - method BIND_CELLS. - -* Do we need subtotals with grouping - READ TABLE wt_fieldcatalog TRANSPORTING NO FIELDS WITH KEY is_subtotalled = abap_true. - IF sy-subrc = 0 . - r_freeze_col = loop_subtotal( i_row_int = w_row_int - i_col_int = w_col_int ) . - ELSE. - r_freeze_col = loop_normal( i_row_int = w_row_int - i_col_int = w_col_int ) . - ENDIF. - - endmethod. - - - - - - method BIND_TABLE. - data: lt_field_catalog type zexcel_t_fieldcatalog, - ls_field_catalog type zexcel_s_fieldcatalog, - ls_fcat type zexcel_s_converter_fcat, - lo_col_dim type ref to zcl_excel_worksheet_columndime, - lo_row_dim type ref to zcl_excel_worksheet_rowdimensi, - l_col_int type zexcel_cell_column, - l_col_alpha type zexcel_cell_column_alpha, - ls_settings type zexcel_s_table_settings, - l_line type i. - - field-symbols: <fs_tab> type any table. - - assign wo_data->* to <fs_tab> . - - ls_settings-table_style = i_style_table. - ls_settings-top_left_column = zcl_excel_common=>convert_column2alpha( ip_column = w_col_int ). - ls_settings-top_left_row = w_row_int. - ls_settings-show_row_stripes = ws_layout-is_stripped. - - describe table wt_fieldcatalog lines l_line. - l_line = l_line + 1 + w_col_int. - ls_settings-bottom_right_column = zcl_excel_common=>convert_column2alpha( ip_column = l_line ). - - describe table <fs_tab> lines l_line. - ls_settings-bottom_right_row = l_line + 1 + w_row_int. - sort wt_fieldcatalog by position. - loop at wt_fieldcatalog into ls_fcat. - move-corresponding ls_fcat to ls_field_catalog. - ls_field_catalog-dynpfld = abap_true. - insert ls_field_catalog into table lt_field_catalog. - endloop. - - wo_worksheet->bind_table( - exporting - ip_table = <fs_tab> - it_field_catalog = lt_field_catalog - is_table_settings = ls_settings - importing - es_table_settings = ls_settings - ). - loop at wt_fieldcatalog into ls_fcat. - l_col_int = w_col_int + ls_fcat-position - 1. - l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). -* Freeze panes - if ls_fcat-fix_column = abap_true. - add 1 to r_freeze_col. - endif. -* Now let's check for optimized - if ls_fcat-is_optimized = abap_true. - lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). - lo_col_dim->set_auto_size( ip_auto_size = abap_true ) . - endif. -* Now let's check for visible - if ls_fcat-is_hidden = abap_true. - lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). - lo_col_dim->set_visible( ip_visible = abap_false ) . - endif. - endloop. - - endmethod. - - - method CLASS_CONSTRUCTOR. - DATA: ls_objects TYPE ts_alv_types. - DATA: ls_option TYPE zexcel_s_converter_option, - l_uname TYPE sy-uname. - - GET PARAMETER ID 'ZUS' FIELD l_uname. - IF l_uname IS INITIAL OR l_uname = space. - l_uname = sy-uname. - ENDIF. - -* Object CL_GUI_ALV_GRID - ls_objects-seoclass = 'CL_GUI_ALV_GRID'. - ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_ALV_GRID'. - INSERT ls_objects INTO TABLE wt_objects. - -* Object CL_SALV_TABLE - ls_objects-seoclass = 'CL_SALV_TABLE'. - ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_SALV_TABLE'. - INSERT ls_objects INTO TABLE wt_objects. - -* Object CL_SALV_RESULT - ls_objects-seoclass = 'CL_SALV_EX_RESULT_DATA_TABLE '. - ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_RESULT_EX'. - INSERT ls_objects INTO TABLE wt_objects. -* Object CL_SALV_WD_RESULT - ls_objects-seoclass = 'CL_SALV_WD_RESULT_DATA_TABLE '. - ls_objects-clsname = 'ZCL_EXCEL_CONVERTER_RESULT_WD'. - INSERT ls_objects INTO TABLE wt_objects. - - CONCATENATE 'EXCEL_' sy-uname INTO ws_indx-srtfd. - - IMPORT p1 = ls_option FROM DATABASE indx(xl) TO ws_indx ID ws_indx-srtfd. - - IF sy-subrc = 0. - ws_option = ls_option. - ELSE. - init_option( ) . - ENDIF. - - endmethod. - - - method CLEAN_FIELDCATALOG. - DATA: l_position TYPE int1. - - FIELD-SYMBOLS: <fs_sfcat> TYPE zexcel_s_converter_fcat. - - SORT wt_fieldcatalog BY position col_id. - - CLEAR l_position. - LOOP AT wt_fieldcatalog ASSIGNING <fs_sfcat>. - ADD 1 TO l_position. - <fs_sfcat>-position = l_position. -* Default stype with alignment and format - <fs_sfcat>-style_hdr = get_style( i_type = c_type_hdr - i_alignment = <fs_sfcat>-alignment ). - IF ws_layout-is_stripped = abap_true. - <fs_sfcat>-style_stripped = get_style( i_type = c_type_str - i_alignment = <fs_sfcat>-alignment - i_inttype = <fs_sfcat>-inttype - i_decimals = <fs_sfcat>-decimals ). - ENDIF. - <fs_sfcat>-style_normal = get_style( i_type = c_type_nor - i_alignment = <fs_sfcat>-alignment - i_inttype = <fs_sfcat>-inttype - i_decimals = <fs_sfcat>-decimals ). - <fs_sfcat>-style_subtotal = get_style( i_type = c_type_sub - i_alignment = <fs_sfcat>-alignment - i_inttype = <fs_sfcat>-inttype - i_decimals = <fs_sfcat>-decimals ). - <fs_sfcat>-style_total = get_style( i_type = c_type_tot - i_alignment = <fs_sfcat>-alignment - i_inttype = <fs_sfcat>-inttype - i_decimals = <fs_sfcat>-decimals ). - ENDLOOP. - - endmethod. - - - - - - - - - - - - - method CONVERT. - - IF is_option IS SUPPLIED. - ws_option = is_option. - ENDIF. - - TRY. - execute_converter( EXPORTING io_object = io_alv - it_table = it_table ) . - ENDTRY. - - IF io_worksheet IS SUPPLIED AND io_worksheet IS BOUND. - wo_worksheet = io_worksheet. - ENDIF. - IF co_excel IS SUPPLIED. - IF co_excel IS NOT BOUND. - CREATE OBJECT co_excel. - co_excel->zif_excel_book_properties~creator = sy-uname. - ENDIF. - wo_excel = co_excel. - ENDIF. - -* Move table to data object and clean it up - IF wt_fieldcatalog IS NOT INITIAL. - create_table( ). - ELSE. - wo_data = wo_table . - ENDIF. - - IF wo_excel IS NOT BOUND. - CREATE OBJECT wo_excel. - wo_excel->zif_excel_book_properties~creator = sy-uname. - ENDIF. - IF wo_worksheet IS NOT BOUND. - " Get active sheet - wo_worksheet = wo_excel->get_active_worksheet( ). - wo_worksheet->set_title( ip_title = 'Sheet1'(001) ). - ENDIF. - - IF i_row_int <= 0. - w_row_int = 1. - ELSE. - w_row_int = i_row_int. - ENDIF. - IF i_column_int <= 0. - w_col_int = 1. - ELSE. - w_col_int = i_column_int. - ENDIF. - - create_worksheet( i_table = i_table - i_style_table = i_style_table ) . - - endmethod. - - - - - - method CREATE_COLOR_STYLE. - DATA: ls_styles TYPE ts_styles. - DATA: lo_style TYPE REF TO zcl_excel_style. - - READ TABLE wt_styles INTO ls_styles WITH KEY guid = i_style. - IF sy-subrc = 0. - lo_style = wo_excel->add_new_style( ). -* lo_style->borders = ls_styles-style->borders. -* lo_style->protection = ls_styles-style->protection. - lo_style->font->bold = ls_styles-style->font->bold. - lo_style->alignment->horizontal = ls_styles-style->alignment->horizontal. - lo_style->number_format->format_code = ls_styles-style->number_format->format_code. - - lo_style->font->color-rgb = is_colors-fontcolor. - lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style->fill->fgcolor-rgb = is_colors-fillcolor. - - ro_style = lo_style. - ENDIF. - endmethod. - - - - - - - - method CREATE_FORMULAR_SUBTOTAL. - data: l_row_alpha_start type string, - l_row_alpha_end type string, - l_func_num type string. - - l_row_alpha_start = i_row_int_start. - l_row_alpha_end = i_row_int_end. - - l_func_num = get_function_number( i_totals_function = i_totals_function ). - concatenate 'SUBTOTAL(' l_func_num ',' i_column l_row_alpha_start ':' i_column l_row_alpha_end ')' into r_formula. - endmethod. - - - - - - - method CREATE_FORMULAR_TOTAL. - data: l_row_alpha type string, - l_row_e_alpha type string. - - l_row_alpha = w_row_int + 1. - l_row_e_alpha = i_row_int. - - concatenate i_totals_function '(' i_column l_row_alpha ':' i_column l_row_e_alpha ')' into r_formula. - endmethod. - - - - method CREATE_PATH. - DATA: l_sep TYPE c , - l_path TYPE string, - l_return TYPE i . - - CLEAR r_path. - - " Save the file - cl_gui_frontend_services=>get_sapgui_workdir( - CHANGING - sapworkdir = l_path - EXCEPTIONS - get_sapworkdir_failed = 1 - cntl_error = 2 - error_no_gui = 3 - not_supported_by_gui = 4 - ). - IF sy-subrc <> 0. -* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO -* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. - CONCATENATE 'Excel_' w_fcount '.xlsx' INTO r_path. - ELSE. - DO. - ADD 1 TO w_fcount. -*-obtain file separator character--------------------------------------- - CALL METHOD cl_gui_frontend_services=>get_file_separator - CHANGING - file_separator = l_sep - EXCEPTIONS - cntl_error = 1 - error_no_gui = 2 - not_supported_by_gui = 3 - OTHERS = 4. - - IF sy-subrc <> 0. - l_sep = ''. - ENDIF. - - CONCATENATE l_path l_sep 'Excel_' w_fcount '.xlsx' INTO r_path. - - IF cl_gui_frontend_services=>file_exist( file = r_path ) = abap_true. - cl_gui_frontend_services=>file_delete( EXPORTING filename = r_path - CHANGING rc = l_return - EXCEPTIONS OTHERS = 1 ). - IF sy-subrc = 0 . - RETURN. - ENDIF. - ELSE. - RETURN. - ENDIF. - ENDDO. - ENDIF. - - endmethod. - - - - - method CREATE_STYLE_HDR. - data: lo_style type ref to zcl_excel_style. - - lo_style = wo_excel->add_new_style( ). - lo_style->font->bold = abap_true. - lo_style->font->color-rgb = zcl_excel_style_color=>c_white. - lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style->fill->fgcolor-rgb = 'FF4F81BD'. - if i_alignment is supplied and i_alignment is not initial. - lo_style->alignment->horizontal = i_alignment. - endif. - ro_style = lo_style . - endmethod. - - - - - - - method CREATE_STYLE_NORMAL. - DATA: lo_style TYPE REF TO zcl_excel_style, - l_format TYPE zexcel_number_format. - - IF i_inttype IS SUPPLIED AND i_inttype IS NOT INITIAL. - l_format = set_cell_format( i_inttype = i_inttype - i_decimals = i_decimals ) . - ENDIF. - IF l_format IS NOT INITIAL OR - ( i_alignment IS SUPPLIED AND i_alignment IS NOT INITIAL ) . - - lo_style = wo_excel->add_new_style( ). - - IF i_alignment IS SUPPLIED AND i_alignment IS NOT INITIAL. - lo_style->alignment->horizontal = i_alignment. - ENDIF. - - IF l_format IS NOT INITIAL. - lo_style->number_format->format_code = l_format. - ENDIF. - - ro_style = lo_style . - - ENDIF. - endmethod. - - - - - - - method CREATE_STYLE_STRIPPED. - data: lo_style type ref to zcl_excel_style. - data: l_format type zexcel_number_format. - - lo_style = wo_excel->add_new_style( ). - lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style->fill->fgcolor-rgb = 'FFDBE5F1'. - if i_alignment is supplied and i_alignment is not initial. - lo_style->alignment->horizontal = i_alignment. - endif. - if i_inttype is supplied and i_inttype is not initial. - l_format = set_cell_format( i_inttype = i_inttype - i_decimals = i_decimals ) . - if l_format is not initial. - lo_style->number_format->format_code = l_format. - endif. - endif. - ro_style = lo_style. - - endmethod. - - - - - - - method CREATE_STYLE_SUBTOTAL. - data: lo_style type ref to zcl_excel_style. - data: l_format type zexcel_number_format. - - lo_style = wo_excel->add_new_style( ). - lo_style->font->bold = abap_true. - - if i_alignment is supplied and i_alignment is not initial. - lo_style->alignment->horizontal = i_alignment. - endif. - if i_inttype is supplied and i_inttype is not initial. - l_format = set_cell_format( i_inttype = i_inttype - i_decimals = i_decimals ) . - if l_format is not initial. - lo_style->number_format->format_code = l_format. - endif. - endif. - - ro_style = lo_style . - - endmethod. - - - - - - - method CREATE_STYLE_TOTAL. - DATA: lo_style TYPE REF TO zcl_excel_style. - DATA: l_format TYPE zexcel_number_format. - - lo_style = wo_excel->add_new_style( ). - lo_style->font->bold = abap_true. - - CREATE OBJECT lo_style->borders->top. - lo_style->borders->top->border_style = zcl_excel_style_border=>c_border_thin. - lo_style->borders->top->border_color-rgb = zcl_excel_style_color=>c_black. - - CREATE OBJECT lo_style->borders->right. - lo_style->borders->right->border_style = zcl_excel_style_border=>c_border_none. - lo_style->borders->right->border_color-rgb = zcl_excel_style_color=>c_black. - - CREATE OBJECT lo_style->borders->down. - lo_style->borders->down->border_style = zcl_excel_style_border=>c_border_double. - lo_style->borders->down->border_color-rgb = zcl_excel_style_color=>c_black. - - CREATE OBJECT lo_style->borders->left. - lo_style->borders->left->border_style = zcl_excel_style_border=>c_border_none. - lo_style->borders->left->border_color-rgb = zcl_excel_style_color=>c_black. - - IF i_alignment IS SUPPLIED AND i_alignment IS NOT INITIAL. - lo_style->alignment->horizontal = i_alignment. - ENDIF. - IF i_inttype IS SUPPLIED AND i_inttype IS NOT INITIAL. - l_format = set_cell_format( i_inttype = i_inttype - i_decimals = i_decimals ) . - IF l_format IS NOT INITIAL. - lo_style->number_format->format_code = l_format. - ENDIF. - ENDIF. - - ro_style = lo_style . - - endmethod. - - - method CREATE_TABLE. - TYPES: BEGIN OF ts_output, - fieldname TYPE fieldname, - function TYPE funcname, - END OF ts_output. - - DATA: lo_data TYPE REF TO data. - DATA: lo_addit TYPE REF TO cl_abap_elemdescr, - lt_components_tab TYPE cl_abap_structdescr=>component_table, - ls_components TYPE abap_componentdescr, - lo_table TYPE REF TO cl_abap_tabledescr, - lo_struc TYPE REF TO cl_abap_structdescr, - lt_fieldcatalog TYPE zexcel_t_converter_fcat. - - FIELD-SYMBOLS: <fs_scat> TYPE zexcel_s_converter_fcat, - <fs_stab> TYPE ANY, - <fs_ttab> TYPE STANDARD TABLE, - <fs> TYPE ANY, - <fs_table> TYPE STANDARD TABLE. - - SORT wt_fieldcatalog BY position. - ASSIGN wo_table->* TO <fs_table>. - - READ TABLE <fs_table> ASSIGNING <fs_stab> INDEX 1. - IF sy-subrc EQ 0 . - LOOP AT wt_fieldcatalog ASSIGNING <fs_scat>. - ASSIGN COMPONENT <fs_scat>-columnname OF STRUCTURE <fs_stab> TO <fs>. - IF sy-subrc = 0. - ls_components-name = <fs_scat>-columnname. - TRY. - lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ). - CATCH cx_sy_move_cast_error. - CLEAR lo_addit. - DELETE TABLE wt_fieldcatalog FROM <fs_scat>. - ENDTRY. - IF lo_addit IS BOUND. - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - ENDIF. - ENDIF. - ENDLOOP. - IF lt_components_tab IS NOT INITIAL. - "create new line type - TRY. - lo_struc = cl_abap_structdescr=>create( P_COMPONENTS = lt_components_tab - P_STRICT = abap_false ). - CATCH cx_sy_struct_creation. - RETURN. " We can not do anything in this case. - ENDTRY. - - lo_table = cl_abap_tabledescr=>create( lo_struc ). - - CREATE DATA wo_data TYPE HANDLE lo_table. - CREATE DATA lo_data TYPE HANDLE lo_struc. - - ASSIGN wo_data->* TO <fs_ttab>. - ASSIGN lo_data->* TO <fs_stab>. - LOOP AT <fs_table> ASSIGNING <fs>. - CLEAR <fs_stab>. - MOVE-CORRESPONDING <fs> TO <fs_stab>. - APPEND <fs_stab> TO <fs_ttab>. - ENDLOOP. - ENDIF. - ENDIF. - - endmethod. - - - - - - METHOD create_text_subtotal. - DATA: l_string(256) TYPE c, - l_func TYPE string. - - CASE i_totals_function. - WHEN zcl_excel_table=>totals_function_sum. " Total - l_func = 'Total'(003). - WHEN zcl_excel_table=>totals_function_min. " Minimum - l_func = 'Minimum'(004). - WHEN zcl_excel_table=>totals_function_max. " Maximum - l_func = 'Maximum'(005). - WHEN zcl_excel_table=>totals_function_average. " Mean Value - l_func = 'Average'(006). - WHEN zcl_excel_table=>totals_function_count. " Count - l_func = 'Count'(007). - WHEN OTHERS. - CLEAR l_func. - ENDCASE. - - MOVE i_value TO l_string. - - CONCATENATE l_string l_func INTO r_text SEPARATED BY space. - -ENDMETHOD. - - - - - - method CREATE_WORKSHEET. - DATA: l_freeze_col TYPE i. - DATA: l_guid TYPE oltpguid16. - - IF wo_data IS BOUND AND wo_worksheet IS BOUND. - - wo_worksheet->zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_on. " By default is on - - IF wt_fieldcatalog IS INITIAL. - set_fieldcatalog( ) . - ELSE. - clean_fieldcatalog( ) . - ENDIF. - - IF i_table = abap_true. - l_freeze_col = bind_table( i_style_table = i_style_table ) . - ELSE. -* Let's check for filter. - IF wt_filter IS NOT INITIAL. - wo_autofilter = wo_excel->add_new_autofilter( io_sheet = wo_worksheet ). - l_freeze_col = bind_cells( ) . - set_autofilter_area( ) . - ELSE. - l_freeze_col = bind_cells( ) . - ENDIF. - - ENDIF. - -* Check for freeze panes - IF ws_layout-is_fixed = abap_true. - IF l_freeze_col = 0. - l_freeze_col = w_col_int. - ENDIF. - wo_worksheet->freeze_panes( EXPORTING ip_num_columns = l_freeze_col - ip_num_rows = w_row_int ) . - ENDIF. - ENDIF. - - endmethod. - - - - - - method EXECUTE_CONVERTER. - DATA: lt_fieldcatalog TYPE zexcel_t_fieldcatalog, - ls_fieldcatalog TYPE zexcel_s_converter_fcat, - lo_if TYPE REF TO zif_excel_converter, - ls_types TYPE ts_alv_types, - lo_addit TYPE REF TO cl_abap_classdescr. - - IF io_object IS BOUND. - TRY. - lo_addit ?= cl_abap_typedescr=>describe_by_object_ref( io_object ). - CATCH cx_sy_move_cast_error. - RAISE EXCEPTION TYPE zcx_excel. - ENDTRY. - ls_types-seoclass = lo_addit->get_relative_name( ). - READ TABLE wt_objects INTO ls_types WITH TABLE KEY seoclass = ls_types-seoclass. - IF sy-subrc = 0. - CREATE OBJECT lo_if TYPE (ls_types-clsname). - - TRY. - lo_if->create_fieldcatalog( - EXPORTING - is_option = ws_option - io_object = io_object - it_table = it_table - IMPORTING - es_layout = ws_layout - et_fieldcatalog = wt_fieldcatalog - eo_table = wo_table - et_colors = wt_colors - et_filter = wt_filter - ). - ENDTRY. -* data lines of highest level. - IF ws_layout-max_subtotal_level > 0. - ADD 1 TO ws_layout-max_subtotal_level. - ENDIF. - ELSE. - RAISE EXCEPTION TYPE zcx_excel. - ENDIF. - ELSE. - REFRESH wt_fieldcatalog. - GET REFERENCE OF it_table INTO wo_table. - ENDIF. - - endmethod. - - - - - - - method GET_COLOR_STYLE. - DATA: ls_colors TYPE zexcel_s_converter_col, - ls_color_styles TYPE ts_color_styles, - lo_style TYPE REF TO zcl_excel_style. - - r_style = i_style. " Default we change nothing - - IF wt_colors IS NOT INITIAL. -* Full line has color - READ TABLE wt_colors INTO ls_colors WITH KEY rownumber = i_row - columnname = space. - IF sy-subrc = 0. - READ TABLE wt_color_styles INTO ls_color_styles WITH KEY guid_old = i_style - fontcolor = ls_colors-fontcolor - fillcolor = ls_colors-fillcolor. - IF sy-subrc = 0. - r_style = ls_color_styles-style_new->get_guid( ). - ELSE. - lo_style = create_color_style( i_style = i_style - is_colors = ls_colors ) . - r_style = lo_style->get_guid( ) . - ls_color_styles-guid_old = i_style. - ls_color_styles-fontcolor = ls_colors-fontcolor. - ls_color_styles-fillcolor = ls_colors-fillcolor. - ls_color_styles-style_new = lo_style. - INSERT ls_color_styles INTO TABLE wt_color_styles. - ENDIF. - ELSE. -* Only field has color - READ TABLE wt_colors INTO ls_colors WITH KEY rownumber = i_row - columnname = i_fieldname. - IF sy-subrc = 0. - READ TABLE wt_color_styles INTO ls_color_styles WITH KEY guid_old = i_style - fontcolor = ls_colors-fontcolor - fillcolor = ls_colors-fillcolor. - IF sy-subrc = 0. - r_style = ls_color_styles-style_new->get_guid( ). - ELSE. - lo_style = create_color_style( i_style = i_style - is_colors = ls_colors ) . - ls_color_styles-guid_old = i_style. - ls_color_styles-fontcolor = ls_colors-fontcolor. - ls_color_styles-fillcolor = ls_colors-fillcolor. - ls_color_styles-style_new = lo_style. - INSERT ls_color_styles INTO TABLE wt_color_styles. - r_style = ls_color_styles-style_new->get_guid( ). - ENDIF. - ELSE. - r_style = i_style. - ENDIF. - ENDIF. - ELSE. - r_style = i_style. - ENDIF. - - endmethod. - - - - - - method GET_FILE. - data: lo_excel_writer type ref to zif_excel_writer, - lo_excel type ref to zcl_excel. - - data: ls_seoclass type seoclass. - - - if wo_excel is bound. - create object lo_excel_writer type zcl_excel_writer_2007. - e_file = lo_excel_writer->write_file( wo_excel ). - - select single * into ls_seoclass - from seoclass - where clsname = 'CL_BCS_CONVERT'. - - if sy-subrc = 0. - call method (ls_seoclass-clsname)=>xstring_to_solix - exporting - iv_xstring = e_file - receiving - et_solix = et_file. - e_bytecount = xstrlen( e_file ). - else. - " Convert to binary - call function 'SCMS_XSTRING_TO_BINARY' - exporting - buffer = e_file - importing - output_length = e_bytecount - tables - binary_tab = et_file. - endif. - endif. - - endmethod. - - - - - method GET_FUNCTION_NUMBER. -*Number Function -*1 AVERAGE -*2 COUNT -*3 COUNTA -*4 MAX -*5 MIN -*6 PRODUCT -*7 STDEV -*8 STDEVP -*9 SUM -*10 VAR -*11 VARP - - case i_totals_function. - when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_SUM. " Total - r_function_number = 9. - when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_MIN. " Minimum - r_function_number = 5. - when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_MAX. " Maximum - r_function_number = 4. - when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_AVERAGE. " Mean Value - r_function_number = 1. - when ZCL_EXCEL_TABLE=>TOTALS_FUNCTION_count. " Count - r_function_number = 2. - when others. - clear r_function_number. - endcase. - endmethod. - - - - method GET_OPTION. - - rs_option = ws_option. - - endmethod. - - - - - - - - method GET_STYLE. - DATA: ls_styles TYPE ts_styles, - lo_style TYPE REF TO zcl_excel_style. - - CLEAR r_style. - - READ TABLE wt_styles INTO ls_styles WITH TABLE KEY type = i_type - alignment = i_alignment - inttype = i_inttype - decimals = i_decimals. - IF sy-subrc = 0. - r_style = ls_styles-guid. - ELSE. - CASE i_type. - WHEN c_type_hdr. " Header - lo_style = create_style_hdr( i_alignment = i_alignment ). - WHEN c_type_str. "Stripped - lo_style = create_style_stripped( i_alignment = i_alignment - i_inttype = i_inttype - i_decimals = i_decimals ). - WHEN c_type_nor. "Normal - lo_style = create_style_normal( i_alignment = i_alignment - i_inttype = i_inttype - i_decimals = i_decimals ). - WHEN c_type_sub. "Subtotals - lo_style = create_style_subtotal( i_alignment = i_alignment - i_inttype = i_inttype - i_decimals = i_decimals ). - WHEN c_type_tot. "Totals - lo_style = create_style_total( i_alignment = i_alignment - i_inttype = i_inttype - i_decimals = i_decimals ). - ENDCASE. - IF lo_style IS NOT INITIAL. - r_style = lo_style->get_guid( ). - ls_styles-type = i_type. - ls_styles-alignment = i_alignment. - ls_styles-inttype = i_inttype. - ls_styles-decimals = i_decimals. - ls_styles-guid = r_style. - ls_styles-style = lo_style. - INSERT ls_styles INTO TABLE wt_styles. - ENDIF. - ENDIF. - endmethod. - - - method INIT_OPTION. - - ws_option-filter = abap_true. - ws_option-hidenc = abap_true. - ws_option-subtot = abap_true. - - endmethod. - - - - - - - method LOOP_NORMAL. - DATA: lo_data TYPE REF TO data, - l_row_header TYPE zexcel_cell_row VALUE 2, - l_col_header TYPE zexcel_cell_column_alpha VALUE 'B', - l_row_int_start TYPE zexcel_cell_row, - l_row_int_end TYPE zexcel_cell_row, - l_row_int TYPE zexcel_cell_row, - l_col_int TYPE zexcel_cell_column, - l_col_alpha TYPE zexcel_cell_column_alpha, - l_col_alpha_start TYPE zexcel_cell_column_alpha, - l_cell_value TYPE zexcel_cell_value, - l_s_color TYPE abap_bool, - lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, - lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi, - l_formula TYPE zexcel_cell_formula, - l_style TYPE zexcel_cell_style, - l_cells TYPE i, - l_count TYPE i, - l_table_row TYPE i. - - FIELD-SYMBOLS: <fs_stab> TYPE ANY, - <fs_tab> TYPE STANDARD TABLE, - <fs_sfcat> TYPE zexcel_s_converter_fcat, - <fs_fldval> TYPE ANY, - <fs_cell_value> TYPE zexcel_cell_value. - - ASSIGN wo_data->* TO <fs_tab> . - - DESCRIBE TABLE wt_fieldcatalog LINES l_cells. - DESCRIBE TABLE <fs_tab> LINES l_count. - l_cells = l_cells * l_count. - -* It is better to loop column by column - LOOP AT wt_fieldcatalog ASSIGNING <fs_sfcat>. - l_row_int = i_row_int. - l_col_int = i_col_int + <fs_sfcat>-position - 1. - -* Freeze panes - IF <fs_sfcat>-fix_column = abap_true. - ADD 1 TO r_freeze_col. - ENDIF. - l_s_color = abap_true. - - l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). - -* Only if the Header is required create it. - IF ws_option-hidehd IS INITIAL. - " First of all write column header - l_cell_value = <fs_sfcat>-scrtext_m. - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = l_cell_value - ip_style = <fs_sfcat>-style_hdr ). - ADD 1 TO l_row_int. - ENDIF. - LOOP AT <fs_tab> ASSIGNING <fs_stab>. - l_table_row = sy-tabix. -* Now the cell values - ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. -* Now let's write the cell values - IF ws_layout-is_stripped = abap_true AND l_s_color = abap_true. - l_style = get_color_style( i_row = l_table_row - i_fieldname = <fs_sfcat>-columnname - i_style = <fs_sfcat>-style_stripped ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = <fs_fldval> - ip_style = l_style ). - CLEAR l_s_color. - ELSE. - l_style = get_color_style( i_row = l_table_row - i_fieldname = <fs_sfcat>-columnname - i_style = <fs_sfcat>-style_normal ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = <fs_fldval> - ip_style = l_style ). - l_s_color = abap_true. - ENDIF. - READ TABLE wt_filter TRANSPORTING NO FIELDS WITH TABLE KEY rownumber = l_table_row - columnname = <fs_sfcat>-columnname. - IF sy-subrc = 0. - wo_worksheet->get_cell( EXPORTING - ip_column = l_col_alpha - ip_row = l_row_int - IMPORTING - ep_value = l_cell_value ). - wo_autofilter->set_value( i_column = l_col_int - i_value = l_cell_value ). - ENDIF. - ADD 1 TO l_row_int. - ENDLOOP. -* Now let's check for optimized - IF <fs_sfcat>-is_optimized = abap_true . - lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). - lo_col_dim->set_auto_size( ip_auto_size = abap_true ) . - ENDIF. -* Now let's check for visible - IF <fs_sfcat>-is_hidden = abap_true. - lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). - lo_col_dim->set_visible( ip_visible = abap_false ) . - ENDIF. -* Now let's check for total versus subtotal. - IF <fs_sfcat>-totals_function IS NOT INITIAL. - l_row_int_end = l_row_int - 1. - - l_formula = create_formular_total( i_row_int = l_row_int_end - i_column = l_col_alpha - i_totals_function = <fs_sfcat>-totals_function ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_formula = l_formula - ip_style = <fs_sfcat>-style_total ). - ENDIF. - ENDLOOP. - endmethod. - - - - - - - method LOOP_SUBTOTAL. - - DATA: lo_data TYPE REF TO data, - l_row_header TYPE zexcel_cell_row VALUE 2, - l_col_header TYPE zexcel_cell_column_alpha VALUE 'B', - l_row_int_start TYPE zexcel_cell_row, - l_row_int_end TYPE zexcel_cell_row, - l_row_int TYPE zexcel_cell_row, - l_col_int TYPE zexcel_cell_column, - l_col_alpha TYPE zexcel_cell_column_alpha, - l_col_alpha_start TYPE zexcel_cell_column_alpha, - l_cell_value TYPE zexcel_cell_value, - l_s_color TYPE abap_bool, - lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, - lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi, - l_formula TYPE zexcel_cell_formula, - l_style TYPE zexcel_cell_style, - l_subtotalled TYPE flag, - l_text TYPE string, - ls_sort_values TYPE ts_sort_values, - ls_subtotal_rows TYPE ts_subtotal_rows, - l_sort_level TYPE int4, - l_hidden TYPE int4, - l_line TYPE i, - l_guid TYPE guid_22, - l_tabix TYPE sy-tabix, - l_cells TYPE i, - l_count TYPE i, - l_table_row TYPE i, - lt_fcat TYPE zexcel_t_converter_fcat. - - FIELD-SYMBOLS: <fs_stab> TYPE ANY, - <fs_tab> TYPE STANDARD TABLE, - <fs_sfcat> TYPE zexcel_s_converter_fcat, - <fs_fldval> TYPE ANY, - <fs_sortval> TYPE ANY, - <fs_sortv> TYPE ts_sort_values, - <fs_cell_value> TYPE zexcel_cell_value. - - ASSIGN wo_data->* TO <fs_tab> . - - REFRESH: wt_sort_values, - wt_subtotal_rows. - - DESCRIBE TABLE wt_fieldcatalog LINES l_cells. - DESCRIBE TABLE <fs_tab> LINES l_count. - l_cells = l_cells * l_count. - - READ TABLE <fs_tab> ASSIGNING <fs_stab> INDEX 1. - IF sy-subrc = 0. - l_row_int = i_row_int + 1. - lt_fcat = wt_fieldcatalog. - SORT lt_fcat BY sort_level DESCENDING. - LOOP AT lt_fcat ASSIGNING <fs_sfcat> WHERE is_subtotalled = abap_true. - ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. - ls_sort_values-fieldname = <fs_sfcat>-columnname. - ls_sort_values-row_int = l_row_int. - ls_sort_values-sort_level = <fs_sfcat>-sort_level. - ls_sort_values-is_collapsed = <fs_sfcat>-is_collapsed. - CREATE DATA ls_sort_values-value LIKE <fs_fldval>. - ASSIGN ls_sort_values-value->* TO <fs_sortval>. - <fs_sortval> = <fs_fldval>. - INSERT ls_sort_values INTO TABLE wt_sort_values. - ENDLOOP. - ENDIF. - l_row_int = i_row_int. -* Let's check if we need to hide a sort level. - DESCRIBE TABLE wt_sort_values LINES l_line. - IF l_line <= 1. - CLEAR l_hidden. - ELSE. - LOOP AT wt_sort_values INTO ls_sort_values WHERE is_collapsed = abap_false. - IF l_hidden < ls_sort_values-sort_level. - l_hidden = ls_sort_values-sort_level. - ENDIF. - ENDLOOP. - ENDIF. - ADD 1 TO l_hidden. " As this is the first level we show. -* First loop without formular only addtional rows with subtotal text. - LOOP AT <fs_tab> ASSIGNING <fs_stab>. - ADD 1 TO l_row_int. " 1 is for header row. - l_row_int_start = l_row_int. - SORT lt_fcat BY sort_level DESCENDING. - LOOP AT lt_fcat ASSIGNING <fs_sfcat> WHERE is_subtotalled = abap_true. - l_col_int = i_col_int + <fs_sfcat>-position - 1. - l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). -* Now the cell values - ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. - IF sy-subrc = 0. - READ TABLE wt_sort_values ASSIGNING <fs_sortv> WITH TABLE KEY fieldname = <fs_sfcat>-columnname. - IF sy-subrc = 0. - ASSIGN <fs_sortv>-value->* TO <fs_sortval>. - IF <fs_sortval> <> <fs_fldval> OR <fs_sortv>-new = abap_true. -* First let's remmember the subtotal values as it has to appear later. - ls_subtotal_rows-row_int = l_row_int. - ls_subtotal_rows-row_int_start = <fs_sortv>-row_int. - ls_subtotal_rows-columnname = <fs_sfcat>-columnname. - INSERT ls_subtotal_rows INTO TABLE wt_subtotal_rows. -* Now let's write the subtotal line - l_cell_value = create_text_subtotal( i_value = <fs_sortval> - i_totals_function = <fs_sfcat>-totals_function ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = l_cell_value - ip_abap_type = cl_abap_typedescr=>typekind_string - ip_style = <fs_sfcat>-style_subtotal ). - lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). - lo_row_dim->set_outline_level( ip_outline_level = <fs_sfcat>-sort_level ) . - IF <fs_sfcat>-is_collapsed = abap_true. - IF <fs_sfcat>-sort_level > l_hidden. - lo_row_dim->set_visible( ip_visible = abap_false ) . - ENDIF. - lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . - ENDIF. -* Now let's change the key - ADD 1 TO l_row_int. - <fs_sortval> = <fs_fldval>. - <fs_sortv>-new = abap_false. - l_line = <fs_sortv>-sort_level. - LOOP AT wt_sort_values ASSIGNING <fs_sortv> WHERE sort_level >= l_line. - <fs_sortv>-row_int = l_row_int. - ENDLOOP. - ENDIF. - ENDIF. - ENDIF. - ENDLOOP. - ENDLOOP. - ADD 1 TO l_row_int. - l_row_int_start = l_row_int. - SORT lt_fcat BY sort_level DESCENDING. - LOOP AT lt_fcat ASSIGNING <fs_sfcat> WHERE is_subtotalled = abap_true. - l_col_int = i_col_int + <fs_sfcat>-position - 1. - l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). - READ TABLE wt_sort_values ASSIGNING <fs_sortv> WITH TABLE KEY fieldname = <fs_sfcat>-columnname. - IF sy-subrc = 0. - ASSIGN <fs_sortv>-value->* TO <fs_sortval>. - ls_subtotal_rows-row_int = l_row_int. - ls_subtotal_rows-row_int_start = <fs_sortv>-row_int. - ls_subtotal_rows-columnname = <fs_sfcat>-columnname. - INSERT ls_subtotal_rows INTO TABLE wt_subtotal_rows. -* First let's write the value as it has to appear. - l_cell_value = create_text_subtotal( i_value = <fs_sortval> - i_totals_function = <fs_sfcat>-totals_function ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = l_cell_value - ip_abap_type = cl_abap_typedescr=>typekind_string - ip_style = <fs_sfcat>-style_subtotal ). - - l_sort_level = <fs_sfcat>-sort_level. - lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). - lo_row_dim->set_outline_level( ip_outline_level = l_sort_level ) . - IF <fs_sfcat>-is_collapsed = abap_true. - IF <fs_sfcat>-sort_level > l_hidden. - lo_row_dim->set_visible( ip_visible = abap_false ) . - ENDIF. - lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . - ENDIF. - ADD 1 TO l_row_int. - ENDIF. - ENDLOOP. -* Let's write the Grand total - l_sort_level = 0. - lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). - lo_row_dim->set_outline_level( ip_outline_level = l_sort_level ) . -* lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . Not on grand total - - l_text = create_text_subtotal( i_value = 'Grand'(002) - i_totals_function = <fs_sfcat>-totals_function ). - - l_col_alpha_start = zcl_excel_common=>convert_column2alpha( i_col_int ). - wo_worksheet->set_cell( ip_column = l_col_alpha_start - ip_row = l_row_int - ip_value = l_text - ip_abap_type = cl_abap_typedescr=>typekind_string - ip_style = <fs_sfcat>-style_subtotal ). - -* It is better to loop column by column second time around -* Second loop with formular and data. - LOOP AT wt_fieldcatalog ASSIGNING <fs_sfcat>. - l_row_int = i_row_int. - l_col_int = i_col_int + <fs_sfcat>-position - 1. -* Freeze panes - IF <fs_sfcat>-fix_column = abap_true. - ADD 1 TO r_freeze_col. - ENDIF. - l_s_color = abap_true. - l_col_alpha = zcl_excel_common=>convert_column2alpha( l_col_int ). - " First of all write column header - l_cell_value = <fs_sfcat>-scrtext_m. - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = l_cell_value - ip_abap_type = cl_abap_typedescr=>typekind_string - ip_style = <fs_sfcat>-style_hdr ). - ADD 1 TO l_row_int. - LOOP AT <fs_tab> ASSIGNING <fs_stab>. - l_table_row = sy-tabix. -* Now the cell values - ASSIGN COMPONENT <fs_sfcat>-columnname OF STRUCTURE <fs_stab> TO <fs_fldval>. -* Let's check for subtotal lines - DO. - READ TABLE wt_subtotal_rows TRANSPORTING NO FIELDS WITH TABLE KEY row_int = l_row_int. - IF sy-subrc = 0. - IF <fs_sfcat>-is_subtotalled = abap_false AND - <fs_sfcat>-totals_function IS NOT INITIAL. - DO. - READ TABLE wt_subtotal_rows INTO ls_subtotal_rows WITH TABLE KEY row_int = l_row_int. - IF sy-subrc = 0. - l_row_int_start = ls_subtotal_rows-row_int_start. - l_row_int_end = l_row_int - 1. - - l_formula = create_formular_subtotal( i_row_int_start = l_row_int_start - i_row_int_end = l_row_int_end - i_column = l_col_alpha - i_totals_function = <fs_sfcat>-totals_function ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_formula = l_formula - ip_style = <fs_sfcat>-style_subtotal ). - IF <fs_sfcat>-is_collapsed = abap_true. - lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). - lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ). - IF <fs_sfcat>-sort_level > l_hidden. - lo_row_dim->set_visible( ip_visible = abap_false ) . - ENDIF. - ENDIF. - ADD 1 TO l_row_int. - ELSE. - EXIT. - ENDIF. - ENDDO. - ELSE. - ADD 1 TO l_row_int. - ENDIF. - ELSE. - EXIT. - ENDIF. - ENDDO. -* Let's set the row dimension values - lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). - lo_row_dim->set_outline_level( ip_outline_level = ws_layout-max_subtotal_level ) . - IF <fs_sfcat>-is_collapsed = abap_true. - lo_row_dim->set_visible( ip_visible = abap_false ) . - lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ) . - ENDIF. -* Now let's write the cell values - IF ws_layout-is_stripped = abap_true AND l_s_color = abap_true. - l_style = get_color_style( i_row = l_table_row - i_fieldname = <fs_sfcat>-columnname - i_style = <fs_sfcat>-style_stripped ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = <fs_fldval> - ip_style = l_style ). - CLEAR l_s_color. - ELSE. - l_style = get_color_style( i_row = l_table_row - i_fieldname = <fs_sfcat>-columnname - i_style = <fs_sfcat>-style_normal ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_value = <fs_fldval> - ip_style = l_style ). - l_s_color = abap_true. - ENDIF. - READ TABLE wt_filter TRANSPORTING NO FIELDS WITH TABLE KEY rownumber = l_table_row - columnname = <fs_sfcat>-columnname. - IF sy-subrc = 0. - wo_worksheet->get_cell( EXPORTING - ip_column = l_col_alpha - ip_row = l_row_int - IMPORTING - ep_value = l_cell_value ). - wo_autofilter->set_value( i_column = l_col_int - i_value = l_cell_value ). - ENDIF. - ADD 1 TO l_row_int. - ENDLOOP. -* Let's check for subtotal lines - DO. - READ TABLE wt_subtotal_rows TRANSPORTING NO FIELDS WITH TABLE KEY row_int = l_row_int. - IF sy-subrc = 0. - IF <fs_sfcat>-is_subtotalled = abap_false AND - <fs_sfcat>-totals_function IS NOT INITIAL. - DO. - READ TABLE wt_subtotal_rows INTO ls_subtotal_rows WITH TABLE KEY row_int = l_row_int. - IF sy-subrc = 0. - l_row_int_start = ls_subtotal_rows-row_int_start. - l_row_int_end = l_row_int - 1. - - l_formula = create_formular_subtotal( i_row_int_start = l_row_int_start - i_row_int_end = l_row_int_end - i_column = l_col_alpha - i_totals_function = <fs_sfcat>-totals_function ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_formula = l_formula - ip_style = <fs_sfcat>-style_subtotal ). - IF <fs_sfcat>-is_collapsed = abap_true. - lo_row_dim = wo_worksheet->get_row_dimension( ip_row = l_row_int ). - lo_row_dim->set_collapsed( ip_collapsed = <fs_sfcat>-is_collapsed ). - ENDIF. - ADD 1 TO l_row_int. - ELSE. - EXIT. - ENDIF. - ENDDO. - ELSE. - ADD 1 TO l_row_int. - ENDIF. - ELSE. - EXIT. - ENDIF. - ENDDO. -* Now let's check for Grand total - IF <fs_sfcat>-is_subtotalled = abap_false AND - <fs_sfcat>-totals_function IS NOT INITIAL. - l_row_int_start = i_row_int + 1. - l_row_int_end = l_row_int - 1. - - l_formula = create_formular_subtotal( i_row_int_start = l_row_int_start - i_row_int_end = l_row_int_end - i_column = l_col_alpha - i_totals_function = <fs_sfcat>-totals_function ). - wo_worksheet->set_cell( ip_column = l_col_alpha - ip_row = l_row_int - ip_formula = l_formula - ip_style = <fs_sfcat>-style_subtotal ). - ENDIF. -* Now let's check for optimized - IF <fs_sfcat>-is_optimized = abap_true. - lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). - lo_col_dim->set_auto_size( ip_auto_size = abap_true ) . - ENDIF. -* Now let's check for visible - IF <fs_sfcat>-is_hidden = abap_true. - lo_col_dim = wo_worksheet->get_column_dimension( ip_column = l_col_alpha ). - lo_col_dim->set_visible( ip_visible = abap_false ) . - ENDIF. - ENDLOOP. - - endmethod. - - - method OPEN_FILE. - data: l_bytecount type i, - lt_file type solix_tab, - l_dir type string, - l_sep type c. - - field-symbols: <fs_data> type any table. - - assign wo_data->* to <fs_data>. - -* catch zcx_excel . -*endtry. - if wo_excel is bound. - get_file( importing e_bytecount = l_bytecount - et_file = lt_file ) . - - l_dir = create_path( ) . - - cl_gui_frontend_services=>gui_download( exporting bin_filesize = l_bytecount - filename = l_dir - filetype = 'BIN' - changing data_tab = lt_file ). - cl_gui_frontend_services=>execute( - exporting - document = l_dir -* application = -* parameter = -* default_directory = -* maximized = -* minimized = -* synchronous = -* operation = 'OPEN' - exceptions - cntl_error = 1 - error_no_gui = 2 - bad_parameter = 3 - file_not_found = 4 - path_not_found = 5 - file_extension_unknown = 6 - error_execute_failed = 7 - synchronous_failed = 8 - not_supported_by_gui = 9 - ). - if sy-subrc <> 0. - message id sy-msgid type sy-msgty number sy-msgno - with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - endif. - - endif. - - - endmethod. - - - method SET_AUTOFILTER_AREA. - DATA: ls_area TYPE zexcel_s_autofilter_area, - l_lines TYPE i, - lt_values TYPE zexcel_t_autofilter_values, - ls_values TYPE zexcel_s_autofilter_values. - -* Let's check for filter. - IF wo_autofilter IS BOUND. - ls_area-row_start = 1. - lt_values = wo_autofilter->get_values( ) . - SORT lt_values BY column ASCENDING. - DESCRIBE TABLE lt_values LINES l_lines. - READ TABLE lt_values INTO ls_values INDEX 1. - IF sy-subrc = 0. - ls_area-col_start = ls_values-column. - ENDIF. - READ TABLE lt_values INTO ls_values INDEX l_lines. - IF sy-subrc = 0. - ls_area-col_end = ls_values-column. - ENDIF. - wo_autofilter->set_filter_area( is_area = ls_area ) . - ENDIF. - - endmethod. - - - - - - method SET_CELL_FORMAT. - DATA: l_format TYPE zexcel_number_format. - - CLEAR r_format. - CASE i_inttype. - WHEN cl_abap_typedescr=>typekind_date. - r_format = wo_worksheet->get_default_excel_date_format( ). - WHEN cl_abap_typedescr=>typekind_time. - r_format = wo_worksheet->get_default_excel_time_format( ). - WHEN cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_packed. - IF i_decimals > 0 . - l_format = '#,##0.'. - DO i_decimals TIMES. - CONCATENATE l_format '0' INTO l_format. - ENDDO. - r_format = l_format. - ENDIF. - WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2. - r_format = '#,##0'. - ENDCASE. - - endmethod. - - - method SET_FIELDCATALOG. - - DATA: lr_data TYPE REF TO data, - lo_structdescr TYPE REF TO cl_abap_structdescr, - lt_dfies TYPE ddfields, - ls_dfies TYPE dfies, - ls_fieldcatalog TYPE zexcel_s_fieldcatalog. - DATA: ls_fcat TYPE zexcel_s_converter_fcat. - - FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE. - - ASSIGN wo_data->* TO <fs_tab> . - - CREATE DATA lr_data LIKE LINE OF <fs_tab>. - - lo_structdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). - - lt_dfies = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). - - LOOP AT lt_dfies INTO ls_dfies. - MOVE-CORRESPONDING ls_dfies TO ls_fcat. - ls_fcat-columnname = ls_dfies-fieldname. - INSERT ls_fcat INTO TABLE wt_fieldcatalog. - ENDLOOP. - - clean_fieldcatalog( ). - - endmethod. - - - - method SET_OPTION. - - IF ws_indx-begdt IS INITIAL. - ws_indx-begdt = sy-datum. - ENDIF. - - ws_indx-aedat = sy-datum. - ws_indx-usera = sy-uname. - ws_indx-pgmid = sy-cprog. - - EXPORT p1 = is_option TO DATABASE indx(xl) FROM ws_indx ID ws_indx-srtfd. - - IF sy-subrc = 0. - ws_option = is_option. - ENDIF. - - endmethod. - - - - method WRITE_FILE. - data: l_bytecount type i, - lt_file type solix_tab, - l_dir type string. - - field-symbols: <fs_data> type any table. - - assign wo_data->* to <fs_data>. - -* catch zcx_excel . -*endtry. - if wo_excel is bound. - get_file( importing e_bytecount = l_bytecount - et_file = lt_file ) . - if i_path is initial. - l_dir = create_path( ) . - else. - l_dir = i_path. - endif. - cl_gui_frontend_services=>gui_download( exporting bin_filesize = l_bytecount - filename = l_dir - filetype = 'BIN' - changing data_tab = lt_file ). - endif. - endmethod. - - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature -TYPES: BEGIN OF ts_col_converter, - col TYPE lvc_col, - int TYPE lvc_int, - inv TYPE lvc_inv, - fontcolor TYPE zexcel_style_color_argb, - fillcolor TYPE zexcel_style_color_argb, - END OF ts_col_converter, - - tt_col_converter TYPE HASHED TABLE OF ts_col_converter WITH UNIQUE KEY col int inv. - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - ABAP - KKBLO - - - - - - - - - - method APPLY_SORT. - DATA: lt_otab TYPE abap_sortorder_tab, - ls_otab TYPE abap_sortorder. - - FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE, - <fs_sort> TYPE lvc_s_sort. - - CREATE DATA eo_table LIKE it_table. - ASSIGN eo_table->* TO <fs_table>. - - <fs_table> = it_table. - - SORT wt_sort BY spos. - LOOP AT wt_sort ASSIGNING <fs_sort>. - IF <fs_sort>-up = abap_true. - ls_otab-name = <fs_sort>-fieldname. - ls_otab-descending = abap_false. -* ls_otab-astext = abap_true. " not only text fields - INSERT ls_otab INTO TABLE lt_otab. - ENDIF. - IF <fs_sort>-down = abap_true. - ls_otab-name = <fs_sort>-fieldname. - ls_otab-descending = abap_true. -* ls_otab-astext = abap_true. " not only text fields - INSERT ls_otab INTO TABLE lt_otab. - ENDIF. - ENDLOOP. - IF lt_otab IS NOT INITIAL. - SORT <fs_table> BY (lt_otab). - ENDIF. - - endmethod. - - - method CLASS_CONSTRUCTOR. -* let's fill the color conversion routines. - DATA: ls_color TYPE ts_col_converter. -* 0 all combination the same - ls_color-col = 0. - ls_color-int = 0. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 0. - ls_color-int = 0. - ls_color-inv = 1. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 0. - ls_color-int = 1. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 0. - ls_color-int = 1. - ls_color-inv = 1. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - -* Blue - ls_color-col = 1. - ls_color-int = 0. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFB0E4FC'. " 176 228 252 blue - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 1. - ls_color-int = 0. - ls_color-inv = 1. - ls_color-fontcolor = 'FFB0E4FC'. " 176 228 252 blue - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 1. - ls_color-int = 1. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FF5FCBFE'. " 095 203 254 Int blue - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 1. - ls_color-int = 1. - ls_color-inv = 1. - ls_color-fontcolor = 'FF5FCBFE'. " 095 203 254 - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 - INSERT ls_color INTO TABLE wt_colors. - -* Gray - ls_color-col = 2. - ls_color-int = 0. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. - ls_color-fillcolor = 'FFE5EAF0'. " 229 234 240 gray - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 2. - ls_color-int = 0. - ls_color-inv = 1. - ls_color-fontcolor = 'FFE5EAF0'. " 229 234 240 gray - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 2. - ls_color-int = 1. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFD8E8F4'. " 216 234 244 int gray - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 2. - ls_color-int = 1. - ls_color-inv = 1. - ls_color-fontcolor = 'FFD8E8F4'. " 216 234 244 int gray - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - -*Yellow - ls_color-col = 3. - ls_color-int = 0. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFFEFEB8'. " 254 254 184 yellow - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 3. - ls_color-int = 0. - ls_color-inv = 1. - ls_color-fontcolor = 'FFFEFEB8'. " 254 254 184 yellow - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 3. - ls_color-int = 1. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFF9ED5D'. " 249 237 093 int yellow - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 3. - ls_color-int = 1. - ls_color-inv = 1. - ls_color-fontcolor = 'FFF9ED5D'. " 249 237 093 int yellow - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - -* light blue - ls_color-col = 4. - ls_color-int = 0. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFCEE7FB'. " 206 231 251 light blue - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 4. - ls_color-int = 0. - ls_color-inv = 1. - ls_color-fontcolor = 'FFCEE7FB'. " 206 231 251 light blue - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 4. - ls_color-int = 1. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FF9ACCEF'. " 154 204 239 int light blue - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 4. - ls_color-int = 1. - ls_color-inv = 1. - ls_color-fontcolor = 'FF9ACCEF'. " 154 204 239 int light blue - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - -* Green - ls_color-col = 5. - ls_color-int = 0. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFCEF8AE'. " 206 248 174 Green - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 5. - ls_color-int = 0. - ls_color-inv = 1. - ls_color-fontcolor = 'FFCEF8AE'. " 206 248 174 Green - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 5. - ls_color-int = 1. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FF7AC769'. " 122 199 105 int Green - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 5. - ls_color-int = 1. - ls_color-inv = 1. - ls_color-fontcolor = 'FF7AC769'. " 122 199 105 int Green - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - -* Red - ls_color-col = 6. - ls_color-int = 0. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFFDBBBC'. " 253 187 188 Red - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 6. - ls_color-int = 0. - ls_color-inv = 1. - ls_color-fontcolor = 'FFFDBBBC'. " 253 187 188 Red - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 6. - ls_color-int = 1. - ls_color-inv = 0. - ls_color-fontcolor = 'FF000000'. " 000 000 000 Black - ls_color-fillcolor = 'FFFB6B6B'. " 251 107 107 int Red - INSERT ls_color INTO TABLE wt_colors. - - ls_color-col = 6. - ls_color-int = 1. - ls_color-inv = 1. - ls_color-fontcolor = 'FFFB6B6B'. " 251 107 107 int Red - ls_color-fillcolor = 'FFFFFFFF'. " 255 255 255 White - INSERT ls_color INTO TABLE wt_colors. - - endmethod. - - - - - method GET_COLOR. - DATA: ls_con_col TYPE zexcel_s_converter_col, - ls_color TYPE ts_col_converter, - l_line TYPE i, - l_color(4) TYPE c. - FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE, - <fs_stab> TYPE ANY, - <fs> TYPE ANY, - <fs_tcol> TYPE lvc_t_scol, - <fs_scol> TYPE lvc_s_scol. - -* Loop trough the table to set the color properties of each line. The color properties field is -* Char 4 and the characters is set as follows: -* Char 1 = C = This is a color property -* Char 2 = 6 = Color code (1 - 7) -* Char 3 = Intensified on/of = 1 = on -* Char 4 = Inverse display = 0 = of - - ASSIGN io_table->* TO <fs_tab>. - - IF ws_layo-info_fname IS NOT INITIAL OR - ws_layo-ctab_fname IS NOT INITIAL. - LOOP AT <fs_tab> ASSIGNING <fs_stab>. - l_line = sy-tabix. - IF ws_layo-info_fname IS NOT INITIAL. - ASSIGN COMPONENT ws_layo-info_fname OF STRUCTURE <fs_stab> TO <fs>. - IF sy-subrc = 0. - IF <fs> IS NOT INITIAL. - l_color = <fs>. - IF l_color(1) = 'C'. - READ TABLE wt_colors INTO ls_color WITH TABLE KEY col = l_color+1(1) - int = l_color+2(1) - inv = l_color+3(1). - IF sy-subrc = 0. - ls_con_col-rownumber = l_line. - ls_con_col-columnname = space. - ls_con_col-fontcolor = ls_color-fontcolor. - ls_con_col-fillcolor = ls_color-fillcolor. - INSERT ls_con_col INTO TABLE et_colors. - ENDIF. - ENDIF. - ENDIF. - ENDIF. - ENDIF. - IF ws_layo-ctab_fname IS NOT INITIAL. - ASSIGN COMPONENT ws_layo-ctab_fname OF STRUCTURE <fs_stab> TO <fs_tcol>. - IF sy-subrc = 0. - LOOP AT <fs_tcol> ASSIGNING <fs_scol>. - READ TABLE wt_colors INTO ls_color WITH TABLE KEY col = <fs_scol>-color-col - int = <fs_scol>-color-int - inv = <fs_scol>-color-inv. - IF sy-subrc = 0. - ls_con_col-rownumber = l_line. - ls_con_col-columnname = <fs_scol>-fname. - ls_con_col-fontcolor = ls_color-fontcolor. - ls_con_col-fillcolor = ls_color-fillcolor. - ls_con_col-nokeycol = <fs_scol>-nokeycol. - INSERT ls_con_col INTO TABLE et_colors. - ENDIF. - ENDLOOP. - ENDIF. - ENDIF. - ENDLOOP. - ENDIF. - endmethod. - - - - - METHOD get_filter. - DATA: ls_filt TYPE lvc_s_filt, - l_line TYPE i, - ls_filter TYPE zexcel_s_converter_fil. - DATA: lo_addit TYPE REF TO cl_abap_elemdescr, - lt_components_tab TYPE cl_abap_structdescr=>component_table, - ls_components TYPE abap_componentdescr, - lo_table TYPE REF TO cl_abap_tabledescr, - lo_struc TYPE REF TO cl_abap_structdescr, - lo_trange TYPE REF TO data, - lo_srange TYPE REF TO data, - lo_ltabdata TYPE REF TO data. - - FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE, - <fs_ltab> TYPE STANDARD TABLE, - <fs_stab> TYPE any, - <fs> TYPE any, - <fs1> TYPE any, - <fs_srange> TYPE any, - <fs_trange> TYPE STANDARD TABLE. - - IF ws_option-filter = abap_false. - REFRESH et_filter. - RETURN. - ENDIF. - - ASSIGN xo_table->* TO <fs_tab>. - - CREATE DATA lo_ltabdata LIKE <fs_tab>. - ASSIGN lo_ltabdata->* TO <fs_ltab>. - - LOOP AT wt_filt INTO ls_filt. - LOOP AT <fs_tab> ASSIGNING <fs_stab>. - l_line = sy-tabix. - ASSIGN COMPONENT ls_filt-fieldname OF STRUCTURE <fs_stab> TO <fs>. - IF sy-subrc = 0. - IF l_line = 1. - REFRESH lt_components_tab. - ls_components-name = 'SIGN'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-sign ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - ls_components-name = 'OPTION'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-option ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - ls_components-name = 'LOW'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - ls_components-name = 'HIGH'. - lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ). - ls_components-type = lo_addit . - INSERT ls_components INTO TABLE lt_components_tab. - "create new line type - TRY. - lo_struc = cl_abap_structdescr=>create( p_components = lt_components_tab - p_strict = abap_false ). - CATCH cx_sy_struct_creation. - CONTINUE. - ENDTRY. - lo_table = cl_abap_tabledescr=>create( lo_struc ). - - CREATE DATA lo_trange TYPE HANDLE lo_table. - CREATE DATA lo_srange TYPE HANDLE lo_struc. - - ASSIGN lo_trange->* TO <fs_trange>. - ASSIGN lo_srange->* TO <fs_srange>. - ENDIF. - REFRESH <fs_trange>. - ASSIGN COMPONENT 'SIGN' OF STRUCTURE <fs_srange> TO <fs1>. - <fs1> = ls_filt-sign. - ASSIGN COMPONENT 'OPTION' OF STRUCTURE <fs_srange> TO <fs1>. - <fs1> = ls_filt-option. - ASSIGN COMPONENT 'LOW' OF STRUCTURE <fs_srange> TO <fs1>. - <fs1> = ls_filt-low. - ASSIGN COMPONENT 'HIGH' OF STRUCTURE <fs_srange> TO <fs1>. - <fs1> = ls_filt-high. - INSERT <fs_srange> INTO TABLE <fs_trange>. - IF <fs> IN <fs_trange>. - IF ws_option-filter = abap_true. - ls_filter-rownumber = l_line. - ls_filter-columnname = ls_filt-fieldname. - INSERT ls_filter INTO TABLE et_filter. - ELSE. - INSERT <fs_stab> INTO TABLE <fs_ltab>. - ENDIF. - ENDIF. - ENDIF. - ENDLOOP. - IF ws_option-filter = abap_undefined. - <fs_tab> = <fs_ltab>. - REFRESH <fs_ltab>. - ENDIF. - ENDLOOP. - -ENDMETHOD. - - - - - method UPDATE_CATALOG. - DATA: ls_fieldcatalog TYPE zexcel_s_converter_fcat, - ls_ref TYPE salv_s_ddic_reference, - ls_fcat TYPE lvc_s_fcat, - ls_sort TYPE lvc_s_sort, - l_decimals TYPE lvc_decmls. - - FIELD-SYMBOLS: <fs_scat> TYPE zexcel_s_converter_fcat. - - IF ws_layo-zebra IS NOT INITIAL. - cs_layout-is_stripped = abap_true. - ENDIF. - IF ws_layo-no_keyfix IS INITIAL OR - ws_layo-no_keyfix = '0'. - cs_layout-is_fixed = abap_true. - ENDIF. - - LOOP AT wt_fcat INTO ls_fcat. - CLEAR: ls_fieldcatalog, - l_decimals. - CASE ws_option-hidenc. - WHEN abap_false. " We make hiden columns visible - CLEAR ls_fcat-no_out. - WHEN abap_true. -* We convert column and hide it. - WHEN abap_undefined. "We don't convert hiden columns - IF ls_fcat-no_out = abap_true. - ls_fcat-tech = abap_true. - ENDIF. - ENDCASE. - IF ls_fcat-tech = abap_false. - ls_fieldcatalog-tabname = ls_fcat-tabname. - ls_fieldcatalog-fieldname = ls_fcat-fieldname . - ls_fieldcatalog-columnname = ls_fcat-fieldname . - ls_fieldcatalog-position = ls_fcat-col_pos. - ls_fieldcatalog-col_id = ls_fcat-col_id. - ls_fieldcatalog-convexit = ls_fcat-convexit. - ls_fieldcatalog-inttype = ls_fcat-inttype. - ls_fieldcatalog-scrtext_s = ls_fcat-scrtext_s . - ls_fieldcatalog-scrtext_m = ls_fcat-scrtext_m . - ls_fieldcatalog-scrtext_l = ls_fcat-scrtext_l. - l_decimals = ls_fcat-decimals_o. - IF l_decimals IS NOT INITIAL. - ls_fieldcatalog-decimals = l_decimals. - ELSE. - ls_fieldcatalog-decimals = ls_fcat-decimals . - ENDIF. - CASE ws_option-subtot. - WHEN abap_false. " We ignore subtotals - CLEAR ls_fcat-do_sum. - WHEN abap_true. " We convert subtotals and detail - - WHEN abap_undefined. " We should only take subtotals and displayed detail -* for now abap_true - ENDCASE. - CASE ls_fcat-do_sum. - WHEN abap_true. - ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_sum. - WHEN 'A'. - ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_min. - WHEN 'B' . - ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_max. - WHEN 'C' . - ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_average. - WHEN OTHERS. - CLEAR ls_fieldcatalog-totals_function . - ENDCASE. - ls_fieldcatalog-fix_column = ls_fcat-fix_column. - IF ws_layo-cwidth_opt IS INITIAL. - IF ls_fcat-col_opt IS NOT INITIAL. - ls_fieldcatalog-is_optimized = abap_true. - ENDIF. - ELSE. - ls_fieldcatalog-is_optimized = abap_true. - ENDIF. - IF ls_fcat-no_out IS NOT INITIAL. - ls_fieldcatalog-is_hidden = abap_true. - ls_fieldcatalog-position = ls_fieldcatalog-col_id. " We hide based on orginal data structure - ENDIF. -* Alignment in each cell - CASE ls_fcat-just. - WHEN 'R'. - ls_fieldcatalog-alignment = zcl_excel_style_alignment=>c_horizontal_right. - WHEN 'L'. - ls_fieldcatalog-alignment = zcl_excel_style_alignment=>c_horizontal_left. - WHEN 'C'. - ls_fieldcatalog-alignment = zcl_excel_style_alignment=>c_horizontal_center. - WHEN OTHERS. - CLEAR ls_fieldcatalog-alignment. - ENDCASE. -* Check for subtotals. - READ TABLE wt_sort INTO ls_sort WITH KEY fieldname = ls_fcat-fieldname. - IF sy-subrc = 0 AND ws_option-subtot <> abap_false. - ls_fieldcatalog-sort_level = 0 . -* IF ls_fieldcatalog-totals_function IS INITIAL. " Not clear why not -* CLEAR ls_fieldcatalog-is_subtotalled. -* ELSE. - ls_fieldcatalog-is_subtotalled = ls_sort-subtot. -* ENDIF. - ls_fieldcatalog-is_collapsed = ls_sort-expa. - IF ls_fieldcatalog-is_subtotalled = abap_true. - ls_fieldcatalog-sort_level = ls_sort-spos. - ls_fieldcatalog-totals_function = zcl_excel_table=>totals_function_sum. " we need function for text - ENDIF. - ENDIF. - APPEND ls_fieldcatalog TO ct_fieldcatalog. - ENDIF. - ENDLOOP. - - SORT ct_fieldcatalog BY sort_level ASCENDING. - cs_layout-max_subtotal_level = 0. - LOOP AT ct_fieldcatalog ASSIGNING <fs_scat> WHERE sort_level > 0. - cs_layout-max_subtotal_level = cs_layout-max_subtotal_level + 1. - <fs_scat>-sort_level = cs_layout-max_subtotal_level. - ENDLOOP. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - method ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. - data: lo_alv type REF TO cl_gui_alv_grid. - - try. - lo_alv ?= io_object. - catch cx_sy_move_cast_error . - raise exception type zcx_excel. - endtry. - -endmethod. - - - METHOD zif_excel_converter~create_fieldcatalog. - DATA: lo_alv TYPE REF TO cl_gui_alv_grid. - - TRY. - zif_excel_converter~can_convert_object( io_object = io_object ). - ENDTRY. - - ws_option = is_option. - - lo_alv ?= io_object. - - CLEAR: es_layout, - et_fieldcatalog. - - IF lo_alv IS BOUND. - lo_alv->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = wt_fcat ). - lo_alv->get_frontend_layout( IMPORTING es_layout = ws_layo ). - lo_alv->get_sort_criteria( IMPORTING et_sort = wt_sort ) . - lo_alv->get_filter_criteria( IMPORTING et_filter = wt_filt ) . - - apply_sort( EXPORTING it_table = it_table - IMPORTING eo_table = eo_table ) . - - get_color( EXPORTING io_table = eo_table - IMPORTING et_colors = et_colors ) . - - get_filter( IMPORTING et_filter = et_filter - CHANGING xo_table = eo_table ) . - - update_catalog( CHANGING cs_layout = es_layout - ct_fieldcatalog = et_fieldcatalog ). - ENDIF. -ENDMETHOD. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - method GET_TABLE. - DATA: lo_object TYPE REF TO object, - ls_seoclass TYPE seoclass, - l_method TYPE string. - - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'IF_SALV_BS_DATA_SOURCE'. - - IF sy-subrc = 0. - l_method = 'GET_TABLE_REF'. - lo_object ?= io_object. - CALL METHOD lo_object->(l_method) - RECEIVING - value = ro_data. - ELSE. - l_method = 'GET_REF_TO_TABLE'. - lo_object ?= io_object. - CALL METHOD lo_object->(l_method) - RECEIVING - value = ro_data. - ENDIF. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - METHOD ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. - - DATA: lo_result TYPE REF TO cl_salv_ex_result_data_table. - - TRY. - lo_result ?= io_object. - CATCH cx_sy_move_cast_error . - RAISE EXCEPTION TYPE zcx_excel. - ENDTRY. - -ENDMETHOD. - - - METHOD zif_excel_converter~create_fieldcatalog. - DATA: lo_result TYPE REF TO cl_salv_ex_result_data_table, - lo_ex_cm TYPE REF TO cl_salv_ex_cm, - lo_data TYPE REF TO data. - - FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. - - TRY. - zif_excel_converter~can_convert_object( io_object = io_object ). - ENDTRY. - - ws_option = is_option. - - lo_result ?= io_object. - - CLEAR: es_layout, - et_fieldcatalog. - - IF lo_result IS BOUND. - lo_data = get_table( io_object = lo_result->r_model->r_data ). - IF lo_data IS BOUND. - ASSIGN lo_data->* TO <fs_table> . - - lo_ex_cm ?= lo_result->r_model->r_model. - ws_layo = lo_ex_cm->s_layo. -* T_DRDN Instance Attribute Public Type LVC_T_DROP - wt_fcat = lo_ex_cm->t_fcat. - wt_filt = lo_ex_cm->t_filt. -* T_HYPE Instance Attribute Public Type LVC_T_HYPE -* T_SELECTED_CELLS Instance Attribute Public Type LVC_T_CELL -* T_SELECTED_COLUMNS Instance Attribute Public Type LVC_T_COL - wt_sort = lo_ex_cm->t_sort. - - apply_sort( EXPORTING it_table = <fs_table> - IMPORTING eo_table = eo_table ) . - - get_color( EXPORTING io_table = eo_table - IMPORTING et_colors = et_colors ) . - - get_filter( IMPORTING et_filter = et_filter - CHANGING xo_table = eo_table ) . - - update_catalog( CHANGING cs_layout = es_layout - ct_fieldcatalog = et_fieldcatalog ). - else. -* We have a problem and should stop here. - ENDIF. - ENDIF. -ENDMETHOD. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - METHOD ZIF_EXCEL_CONVERTER~CAN_CONVERT_OBJECT. - - DATA: lo_result TYPE REF TO cl_salv_wd_result_data_table. - - TRY. - lo_result ?= io_object. - CATCH cx_sy_move_cast_error . - RAISE EXCEPTION TYPE zcx_excel. - ENDTRY. - -ENDMETHOD. - - - METHOD zif_excel_converter~create_fieldcatalog. - DATA: lo_result TYPE REF TO cl_salv_wd_result_data_table, - lo_data TYPE REF TO data. - - FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. - - TRY. - zif_excel_converter~can_convert_object( io_object = io_object ). - ENDTRY. - - ws_option = is_option. - - lo_result ?= io_object. - - CLEAR: es_layout, - et_fieldcatalog. - - IF lo_result IS BOUND. - lo_data = get_table( io_object = lo_result->r_model->r_data ). - IF lo_data IS BOUND. - ASSIGN lo_data->* TO <fs_table> . - - wo_config ?= lo_result->r_model->r_model. - - IF wo_config IS BOUND. - wt_fields = wo_config->if_salv_wd_field_settings~get_fields( ) . - wt_columns = wo_config->if_salv_wd_column_settings~get_columns( ) . - ENDIF. - - create_wt_fcat( io_table = lo_data ). - create_wt_sort( ). - create_wt_filt( ). - - apply_sort( EXPORTING it_table = <fs_table> - IMPORTING eo_table = eo_table ) . - -* get_color( EXPORTING io_table = eo_table -* IMPORTING et_colors = et_colors ) . - - get_filter( IMPORTING et_filter = et_filter - CHANGING xo_table = eo_table ) . - - update_catalog( CHANGING cs_layout = es_layout - ct_fieldcatalog = et_fieldcatalog ). - ELSE. -* We have a problem and should stop here - ENDIF. - ENDIF. -ENDMETHOD. - - - - method CREATE_WT_FCAT. - DATA: lr_data TYPE REF TO data, - lo_structdescr TYPE REF TO cl_abap_structdescr, - lt_dfies TYPE ddfields, - ls_dfies TYPE dfies, - lv_sytabix TYPE sytabix. - - DATA: ls_fcat TYPE lvc_s_fcat. - - FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE. - - ASSIGN io_table->* TO <fs_tab> . - CREATE DATA lr_data LIKE LINE OF <fs_tab>. - - lo_structdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). - - lt_dfies = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). - - loop at lt_dfies into ls_dfies. - MOVE-CORRESPONDING ls_dfies TO ls_fcat. -* ls_fcat-columnname = ls_dfies-fieldname. - ls_fcat-col_pos = ls_dfies-position. - ls_fcat-key = ls_dfies-keyflag. - get_fields_info( CHANGING xs_fcat = ls_fcat ) . - - ls_fcat-col_opt = abap_true. - - get_columns_info( CHANGING xs_fcat = ls_fcat ) . - - INSERT ls_fcat INTO TABLE wt_fcat. - endloop. - - endmethod. - - - method CREATE_WT_FILT. -* No neeed for superclass. -* Only for WD - DATA: lt_otab TYPE abap_sortorder_tab, - ls_otab TYPE abap_sortorder. - DATA: lt_filters TYPE salv_wd_t_filter_rule_ref, - ls_filt TYPE lvc_s_filt. - - FIELD-SYMBOLS: <fs_fields> TYPE salv_wd_s_field_ref, - <fs_filter> TYPE salv_wd_s_filter_rule_ref. - - LOOP AT wt_fields ASSIGNING <fs_fields>. - REFRESH lt_filters. - lt_filters = <fs_fields>-r_field->if_salv_wd_filter~get_filter_rules( ) . - LOOP AT lt_filters ASSIGNING <fs_filter>. - ls_filt-fieldname = <fs_fields>-fieldname. - IF <fs_filter>-r_filter_rule->get_included( ) = abap_true. - ls_filt-sign = 'I'. - ELSE. - ls_filt-sign = 'E'. - ENDIF. - ls_filt-option = <fs_filter>-r_filter_rule->get_operator( ). - ls_filt-high = <fs_filter>-r_filter_rule->get_high_value( ) . - ls_filt-low = <fs_filter>-r_filter_rule->get_low_value( ) . - INSERT ls_filt INTO TABLE wt_filt. - ENDLOOP. - ENDLOOP. - - endmethod. - - - method CREATE_WT_SORT. - DATA: lo_sort TYPE REF TO cl_salv_wd_sort_rule, - l_sort_order TYPE salv_wd_constant, - ls_sort TYPE lvc_s_sort. - - FIELD-SYMBOLS: <fs_fields> TYPE salv_wd_s_field_ref. - - LOOP AT wt_fields ASSIGNING <fs_fields>. - lo_sort = <fs_fields>-r_field->if_salv_wd_sort~get_sort_rule( ) . - IF lo_sort IS BOUND. - l_sort_order = lo_sort->get_sort_order( ). - IF l_sort_order <> if_salv_wd_c_sort=>sort_order. - CLEAR ls_sort. - ls_sort-spos = lo_sort->get_sort_position( ). - ls_sort-fieldname = <fs_fields>-fieldname. -* ls_sort-GROUP - ls_sort-subtot = lo_sort->get_group_aggregation( ). -* ls_sort-COMP -* ls_sort-EXPA -* ls_sort-SELTEXT -* ls_sort-OBLIGATORY -* ls_sort-LEVEL -* ls_sort-NO_OUT - IF l_sort_order = if_salv_wd_c_sort=>sort_order_ascending. - ls_sort-up = abap_true. - ELSE. - ls_sort-down = abap_true. - ENDIF. - INSERT ls_sort INTO TABLE wt_sort. - ENDIF. - ENDIF. - ENDLOOP. - - endmethod. - - - - method GET_COLUMNS_INFO. - DATA: l_numc2 TYPE salv_wd_constant. - - - FIELD-SYMBOLS: <fs_column> TYPE salv_wd_s_column_ref. - - READ TABLE wt_columns ASSIGNING <fs_column> WITH KEY id = xs_fcat-fieldname . - IF sy-subrc = 0. - xs_fcat-col_pos = <fs_column>-r_column->get_position( ) . - l_numc2 = <fs_column>-r_column->get_fixed_position( ). - IF l_numc2 = '02'. - xs_fcat-fix_column = abap_true . - ENDIF. - l_numc2 = <fs_column>-r_column->get_visible( ). - IF l_numc2 = '01'. - xs_fcat-no_out = abap_true . - ENDIF. - ENDIF. - - endmethod. - - - - method GET_FIELDS_INFO. - DATA: lo_aggr TYPE REF TO cl_salv_wd_aggr_rule, - l_aggrtype TYPE salv_wd_constant. - - FIELD-SYMBOLS: <fs_fields> TYPE salv_wd_s_field_ref. - - READ TABLE wt_fields ASSIGNING <fs_fields> WITH KEY fieldname = xs_fcat-fieldname. - IF sy-subrc = 0. - lo_aggr = <fs_fields>-r_field->if_salv_wd_aggr~get_aggr_rule( ) . - IF lo_aggr IS BOUND. - l_aggrtype = lo_aggr->get_aggregation_type( ) . - CASE l_aggrtype. - WHEN if_salv_wd_c_aggregation=>aggrtype_total. - xs_fcat-do_sum = abap_true. - WHEN if_salv_wd_c_aggregation=>aggrtype_minimum. - xs_fcat-do_sum = 'A'. - WHEN if_salv_wd_c_aggregation=>aggrtype_maximum . - xs_fcat-do_sum = 'B'. - WHEN if_salv_wd_c_aggregation=>aggrtype_average . - xs_fcat-do_sum = 'C'. - WHEN OTHERS. - CLEAR xs_fcat-do_sum . - ENDCASE. - ENDIF. - ENDIF. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - METHOD zif_excel_converter~can_convert_object. - - DATA: lo_salv TYPE REF TO cl_salv_table. - - TRY. - lo_salv ?= io_object. - CATCH cx_sy_move_cast_error . - RAISE EXCEPTION TYPE zcx_excel. - ENDTRY. - -ENDMETHOD. - - - METHOD zif_excel_converter~create_fieldcatalog. - DATA: lo_salv TYPE REF TO cl_salv_table. - - TRY. - zif_excel_converter~can_convert_object( io_object = io_object ). - ENDTRY. - - ws_option = is_option. - - lo_salv ?= io_object. - - CLEAR: es_layout, - et_fieldcatalog, - et_colors . - - IF lo_salv IS BOUND. - load_data( EXPORTING io_salv = lo_salv - it_table = it_table ). - apply_sort( EXPORTING it_table = it_table - IMPORTING eo_table = eo_table ) . - - get_color( EXPORTING io_table = eo_table - IMPORTING et_colors = et_colors ) . - - get_filter( IMPORTING et_filter = et_filter - CHANGING xo_table = eo_table ) . - - update_catalog( CHANGING cs_layout = es_layout - ct_fieldcatalog = et_fieldcatalog ). - ENDIF. -ENDMETHOD. - - - - - method LOAD_DATA. - DATA: lo_columns TYPE REF TO cl_salv_columns_table, - lo_aggregations TYPE REF TO cl_salv_aggregations, - lo_sorts TYPE REF TO cl_salv_sorts, - lo_filters TYPE REF TO cl_salv_filters, - lo_functional TYPE REF TO cl_salv_functional_settings, - lo_display TYPE REF TO cl_salv_display_settings, - lo_selections TYPE REF TO cl_salv_selections. - - DATA: ls_vari TYPE disvariant, - lo_layout TYPE REF TO cl_salv_layout. - - DATA: lr_form_tol TYPE REF TO cl_salv_form, - lr_form_eol TYPE REF TO cl_salv_form. - - DATA lt_kkblo_fieldcat TYPE kkblo_t_fieldcat. - DATA ls_kkblo_layout TYPE kkblo_layout. - DATA lt_kkblo_filter TYPE kkblo_t_filter. - DATA lt_kkblo_sort TYPE kkblo_t_sortinfo. - - lo_layout = io_salv->get_layout( ) . - lo_columns = io_salv->get_columns( ). - lo_aggregations = io_salv->get_aggregations( ) . - lo_sorts = io_salv->get_sorts( ) . - lo_filters = io_salv->get_filters( ) . - lo_display = io_salv->get_display_settings( ) . - lo_functional = io_salv->get_functional_settings( ) . - - REFRESH: wt_fcat, - wt_sort, - wt_filt. - -* First update metadata if we can. - IF io_salv->is_offline( ) = abap_false. - io_salv->get_metadata( ) . - ELSE. -* If we are offline we need to build this. - cl_salv_controller_metadata=>get_variant( - EXPORTING - r_layout = lo_layout - CHANGING - s_variant = ls_vari ). - ENDIF. - -*... get the column information - wt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog( - r_columns = lo_columns - r_aggregations = lo_aggregations ). - -*... get the layout information - cl_salv_controller_metadata=>get_lvc_layout( - EXPORTING - r_functional_settings = lo_functional - r_display_settings = lo_display - r_columns = lo_columns - r_aggregations = lo_aggregations - CHANGING - s_layout = ws_layo ). - -* the fieldcatalog is not complete yet! - CALL FUNCTION 'LVC_FIELDCAT_COMPLETE' - EXPORTING - i_complete = 'X' - i_refresh_buffer = space - i_buffer_active = space - is_layout = ws_layo - i_test = '1' - i_fcat_complete = 'X' - IMPORTING -* E_EDIT = - es_layout = ws_layo - CHANGING - ct_fieldcat = wt_fcat. - - IF ls_vari IS NOT INITIAL AND io_salv->is_offline( ) = abap_true. - CALL FUNCTION 'LVC_TRANSFER_TO_KKBLO' - EXPORTING - it_fieldcat_lvc = wt_fcat - is_layout_lvc = ws_layo - IMPORTING - et_fieldcat_kkblo = lt_kkblo_fieldcat - es_layout_kkblo = ls_kkblo_layout - TABLES - it_data = it_table - EXCEPTIONS - it_data_missing = 1 - it_fieldcat_lvc_missing = 2 - OTHERS = 3. - IF sy-subrc <> 0. -* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO -* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. - ENDIF. - - CALL FUNCTION 'LT_VARIANT_LOAD' - EXPORTING -* I_TOOL = 'LT' - i_tabname = '1' -* I_TABNAME_SLAVE = - i_dialog = ' ' -* I_USER_SPECIFIC = ' ' -* I_DEFAULT = 'X' -* I_NO_REPTEXT_OPTIMIZE = -* I_VIA_GRID = - i_fcat_complete = 'X' - IMPORTING -* E_EXIT = - et_fieldcat = lt_kkblo_fieldcat - et_sort = lt_kkblo_sort - et_filter = lt_kkblo_filter - CHANGING - cs_layout = ls_kkblo_layout - ct_default_fieldcat = lt_kkblo_fieldcat - cs_variant = ls_vari - EXCEPTIONS - wrong_input = 1 - fc_not_complete = 2 - not_found = 3 - OTHERS = 4 - . - IF sy-subrc <> 0. -* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO -* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. - ENDIF. - - CALL FUNCTION 'LVC_TRANSFER_FROM_KKBLO' - EXPORTING -* I_TECH_COMPLETE = -* I_STRUCTURE_NAME = - it_fieldcat_kkblo = lt_kkblo_fieldcat - it_sort_kkblo = lt_kkblo_sort - it_filter_kkblo = lt_kkblo_filter -* IT_SPECIAL_GROUPS_KKBLO = -* IT_FILTERED_ENTRIES_KKBLO = -* IT_GROUPLEVELS_KKBLO = -* IS_SUBTOT_OPTIONS_KKBLO = - is_layout_kkblo = ls_kkblo_layout -* IS_REPREP_ID_KKBLO = -* I_CALLBACK_PROGRAM_KKBLO = -* IT_ADD_FIELDCAT = -* IT_EXCLUDING_KKBLO = -* IT_EXCEPT_QINFO_KKBLO = - IMPORTING - et_fieldcat_lvc = wt_fcat - et_sort_lvc = wt_sort - et_filter_lvc = wt_filt -* ET_SPECIAL_GROUPS_LVC = -* ET_FILTER_INDEX_LVC = -* ET_GROUPLEVELS_LVC = -* ES_TOTAL_OPTIONS_LVC = - es_layout_lvc = ws_layo -* ES_VARIANT_LVC = -* E_VARIANT_SAVE_LVC = -* ES_PRINT_INFO_LVC = -* ES_REPREP_LVC = -* E_REPREP_ACTIVE_LVC = -* ET_EXCLUDING_LVC = -* ET_EXCEPT_QINFO_LVC = - TABLES - it_data = it_table - EXCEPTIONS - it_data_missing = 1 - OTHERS = 2 - . - IF sy-subrc <> 0. -* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO -* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. - ENDIF. - - ELSE. -* ... get the sort information - wt_sort = cl_salv_controller_metadata=>get_lvc_sort( lo_sorts ). - -* ... get the filter information - wt_filt = cl_salv_controller_metadata=>get_lvc_filter( lo_filters ). - ENDIF. - - endmethod. - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - " Initialise instance variables - formula1 = ''. - formula2 = ''. - type = me->c_type_none. - errorstyle = me->c_style_stop. - operator = ''. - allowblank = abap_false. - showdropdown = abap_false. - showinputmessage = abap_true. - showerrormessage = abap_true. - errortitle = ''. - error = ''. - prompttitle = ''. - prompt = ''. -* inizialize dimension range - cell_row = 1. - cell_column = 'A'. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - method ADD. - data_validations->add( ip_data_validation ). - endmethod. - - - method CLEAR. - data_validations->clear( ). - endmethod. - - - method CONSTRUCTOR. - - CREATE OBJECT data_validations. - - endmethod. - - - - method GET_ITERATOR. - eo_iterator ?= data_validations->if_object_collection~get_iterator( ). - endmethod. - - - - method IS_EMPTY. - is_empty = data_validations->if_object_collection~is_empty( ). - endmethod. - - - - method REMOVE. - data_validations->remove( ip_data_validation ). - endmethod. - - - - method SIZE. - ep_size = data_validations->if_object_collection~size( ). - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - - CALL FUNCTION 'GUID_CREATE' - IMPORTING - ev_guid_16 = me->guid. - - IF ip_title IS NOT INITIAL. - title = ip_title. - ELSE. - title = me->guid. - ENDIF. - - me->type = ip_type. - -* inizialize dimension range - anchor = anchor_one_cell. - from_loc-col = 1. - from_loc-row = 1. - endmethod. - - - - method CREATE_MEDIA_NAME. - -* if media name is initial, create unique name - CHECK media_name IS INITIAL. - - index = ip_index. - CONCATENATE me->type index INTO media_name. - CONDENSE media_name NO-GAPS. - endmethod. - - - - method GET_FROM_COL. - r_from_col = me->from_loc-col. - endmethod. - - - - method GET_FROM_ROW. - r_from_row = me->from_loc-row. - endmethod. - - - - method GET_GUID. - - ep_guid = me->guid. - - endmethod. - - - - method GET_HEIGHT_EMU_STR. - r_height = pixel2emu( size-height ). - CONDENSE r_height NO-GAPS. - endmethod. - - - - method GET_INDEX. - rp_index = me->index. - endmethod. - - - - METHOD get_media. - - DATA: lv_language TYPE sylangu. - DATA: lt_bin_mime TYPE sdokcntbins. - DATA: lt_mime TYPE tsfmime, - lv_filesize TYPE i, - lv_filesizec(10). - - CASE media_source. - WHEN c_media_source_xstring. - r_media = media. - WHEN c_media_source_www. - CALL FUNCTION 'WWWDATA_IMPORT' - EXPORTING - key = media_key_www - TABLES - mime = lt_mime - EXCEPTIONS - OTHERS = 1. - - CALL FUNCTION 'WWWPARAMS_READ' - EXPORTING - relid = media_key_www-relid - objid = media_key_www-objid - name = 'filesize' - IMPORTING - value = lv_filesizec. - - lv_filesize = lv_filesizec. - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_filesize - IMPORTING - buffer = r_media - TABLES - binary_tab = lt_mime - EXCEPTIONS - failed = 1 - OTHERS = 2. - WHEN c_media_source_mime. - lv_language = sy-langu. - cl_wb_mime_repository=>load_mime( EXPORTING - io = me->io - IMPORTING - filesize = lv_filesize - bin_data = lt_bin_mime - CHANGING - language = lv_language ). - - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_filesize - IMPORTING - buffer = r_media - TABLES - binary_tab = lt_bin_mime - EXCEPTIONS - failed = 1 - OTHERS = 2. - ENDCASE. -ENDMETHOD. - - - - method GET_MEDIA_NAME. - CONCATENATE media_name `.` media_type INTO r_name. - endmethod. - - - - method GET_MEDIA_TYPE. - r_type = media_type. - endmethod. - - - - method GET_NAME. - r_name = title. - endmethod. - - - - method GET_POSITION. - rp_position-anchor = anchor. - rp_position-from = from_loc. - rp_position-to = to_loc. - rp_position-size = size. - endmethod. - - - - method GET_TO_COL. - r_to_col = me->to_loc-col. - endmethod. - - - - method GET_TO_ROW. - r_to_row = me->to_loc-row. - endmethod. - - - - method GET_TYPE. - rp_type = me->type. - endmethod. - - - - method GET_WIDTH_EMU_STR. - r_width = pixel2emu( size-width ). - CONDENSE r_width NO-GAPS. - endmethod. - - - - method LOAD_CHART_ATTRIBUTES. - DATA: node TYPE REF TO if_ixml_element. - DATA: node2 TYPE REF TO if_ixml_element. - DATA: node3 TYPE REF TO if_ixml_element. - DATA: node4 TYPE REF TO if_ixml_element. - DATA: iterator TYPE REF TO if_ixml_node_iterator. - - DATA: chartspace TYPE REF TO if_ixml_node_collection. - DATA: coll_length TYPE i. - DATA: chartelem TYPE REF TO if_ixml_element. - - DATA lo_barchart TYPE REF TO zcl_excel_graph_bars. - DATA lo_piechart TYPE REF TO zcl_excel_graph_pie. - DATA lo_linechart TYPE REF TO zcl_excel_graph_line. - - TYPES: BEGIN OF t_prop, - val TYPE string, - rtl TYPE string, - lang TYPE string, - formatcode TYPE string, - sourcelinked TYPE string, - END OF t_prop. - - TYPES: BEGIN OF t_pagemargins, - b TYPE string, - l TYPE string, - r TYPE string, - t TYPE string, - header TYPE string, - footer TYPE string, - END OF t_pagemargins. - - DATA ls_prop TYPE t_prop. - DATA ls_pagemargins TYPE t_pagemargins. - - DATA lo_collection TYPE REF TO if_ixml_node_collection. - DATA lo_node TYPE REF TO if_ixml_node. - DATA lo_iterator TYPE REF TO if_ixml_node_iterator. - DATA lv_idx TYPE i. - DATA lv_order TYPE i. - DATA lv_invertifnegative TYPE string. - DATA lv_symbol TYPE string. - DATA lv_smooth TYPE c. - DATA lv_sername TYPE string. - DATA lv_label TYPE string. - DATA lv_value TYPE string. - DATA lv_axid TYPE string. - DATA lv_orientation TYPE string. - DATA lv_delete TYPE string. - DATA lv_axpos TYPE string. - DATA lv_formatcode TYPE string. - DATA lv_sourcelinked TYPE string. - DATA lv_majortickmark TYPE string. - DATA lv_minortickmark TYPE string. - DATA lv_ticklblpos TYPE string. - DATA lv_crossax TYPE string. - DATA lv_crosses TYPE string. - DATA lv_auto TYPE string. - DATA lv_lblalgn TYPE string. - DATA lv_lbloffset TYPE string. - DATA lv_nomultilvllbl TYPE string. - DATA lv_crossbetween TYPE string. - - node ?= ip_chart->if_ixml_node~get_first_child( ). - CHECK node IS NOT INITIAL. - - CASE me->graph_type. - WHEN c_graph_bars. - CREATE OBJECT lo_barchart. - me->graph = lo_barchart. - WHEN c_graph_pie. - CREATE OBJECT lo_piechart. - me->graph = lo_piechart. - WHEN c_graph_line. - CREATE OBJECT lo_linechart. - me->graph = lo_linechart. - WHEN OTHERS. - ENDCASE. - - "Fill properties - node2 ?= node->find_from_name( name = 'date1904' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_1904val = ls_prop-val. - node2 ?= node->find_from_name( name = 'lang' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_langval = ls_prop-val. - node2 ?= node->find_from_name( name = 'roundedCorners' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_roundedcornersval = ls_prop-val. - - "style - node2 ?= node->find_from_name( name = 'style' namespace = 'c14' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_c14styleval = ls_prop-val. - node2 ?= node->find_from_name( name = 'style' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_styleval = ls_prop-val. - "---------------------------Read graph properties - node2 ?= node->find_from_name( name = 'autoTitleDeleted' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_autotitledeletedval = ls_prop-val. - - "plotArea - CASE me->graph_type. - WHEN c_graph_bars. - node2 ?= node->find_from_name( name = 'barDir' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_bardirval = ls_prop-val. - node2 ?= node->find_from_name( name = 'grouping' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_groupingval = ls_prop-val. - node2 ?= node->find_from_name( name = 'varyColors' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_varycolorsval = ls_prop-val. - - "Load series - CALL METHOD node->get_elements_by_tag_name - EXPORTING -* depth = 0 - name = 'ser' -* namespace = '' - RECEIVING - rval = lo_collection. - CALL METHOD lo_collection->create_iterator - RECEIVING - rval = lo_iterator. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - WHILE lo_node IS BOUND. - node3 ?= node2->find_from_name( name = 'idx' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_idx = ls_prop-val. - node3 ?= node2->find_from_name( name = 'order' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_order = ls_prop-val. - node3 ?= node2->find_from_name( name = 'invertIfNegative' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_invertifnegative = ls_prop-val. - node3 ?= node2->find_from_name( name = 'v' namespace = 'c' ). - IF node3 IS BOUND. - lv_sername = node3->get_value( ). - ENDIF. - node3 ?= node2->find_from_name( name = 'strRef' namespace = 'c' ). - IF node3 IS BOUND. - node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). - lv_label = node4->get_value( ). - ENDIF. - node3 ?= node2->find_from_name( name = 'numRef' namespace = 'c' ). - IF node3 IS BOUND. - node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). - lv_value = node4->get_value( ). - ENDIF. - CALL METHOD lo_barchart->create_serie - EXPORTING - ip_idx = lv_idx - ip_order = lv_order - ip_invertifnegative = lv_invertifnegative - ip_lbl = lv_label - ip_ref = lv_value - ip_sername = lv_sername. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - ENDWHILE. - "note: numCache avoided - node2 ?= node->find_from_name( name = 'showLegendKey' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_showlegendkeyval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showVal' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_showvalval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showCatName' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_showcatnameval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showSerName' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_showsernameval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showPercent' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_showpercentval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showBubbleSize' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_showbubblesizeval = ls_prop-val. - node2 ?= node->find_from_name( name = 'gapWidth' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_gapwidthval = ls_prop-val. - - "Load axes - node2 ?= node->find_from_name( name = 'barChart' namespace = 'c' ). - CALL METHOD node2->get_elements_by_tag_name - EXPORTING -* depth = 0 - name = 'axId' -* namespace = '' - RECEIVING - rval = lo_collection. - CALL METHOD lo_collection->create_iterator - RECEIVING - rval = lo_iterator. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - WHILE lo_node IS BOUND. - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lv_axid = ls_prop-val. - IF sy-index EQ 1. "catAx - node2 ?= node->find_from_name( name = 'catAx' namespace = 'c' ). - node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_orientation = ls_prop-val. - node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_delete = ls_prop-val. - node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_axpos = ls_prop-val. - node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_formatcode = ls_prop-formatcode. - lv_sourcelinked = ls_prop-sourcelinked. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_majortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_minortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_ticklblpos = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crossax = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crosses = ls_prop-val. - node3 ?= node2->find_from_name( name = 'auto' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_auto = ls_prop-val. - node3 ?= node2->find_from_name( name = 'lblAlgn' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_lblalgn = ls_prop-val. - node3 ?= node2->find_from_name( name = 'lblOffset' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_lbloffset = ls_prop-val. - node3 ?= node2->find_from_name( name = 'noMultiLvlLbl' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_nomultilvllbl = ls_prop-val. - CALL METHOD lo_barchart->create_ax - EXPORTING - ip_axid = lv_axid - ip_type = zcl_excel_graph_bars=>c_catax - ip_orientation = lv_orientation - ip_delete = lv_delete - ip_axpos = lv_axpos - ip_formatcode = lv_formatcode - ip_sourcelinked = lv_sourcelinked - ip_majortickmark = lv_majortickmark - ip_minortickmark = lv_minortickmark - ip_ticklblpos = lv_ticklblpos - ip_crossax = lv_crossax - ip_crosses = lv_crosses - ip_auto = lv_auto - ip_lblalgn = lv_lblalgn - ip_lbloffset = lv_lbloffset - ip_nomultilvllbl = lv_nomultilvllbl. - ELSEIF sy-index EQ 2. "valAx - node2 ?= node->find_from_name( name = 'valAx' namespace = 'c' ). - node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_orientation = ls_prop-val. - node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_delete = ls_prop-val. - node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_axpos = ls_prop-val. - node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_formatcode = ls_prop-formatcode. - lv_sourcelinked = ls_prop-sourcelinked. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_majortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_minortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_ticklblpos = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crossax = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crosses = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crossBetween' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crossbetween = ls_prop-val. - CALL METHOD lo_barchart->create_ax - EXPORTING - ip_axid = lv_axid - ip_type = zcl_excel_graph_bars=>c_valax - ip_orientation = lv_orientation - ip_delete = lv_delete - ip_axpos = lv_axpos - ip_formatcode = lv_formatcode - ip_sourcelinked = lv_sourcelinked - ip_majortickmark = lv_majortickmark - ip_minortickmark = lv_minortickmark - ip_ticklblpos = lv_ticklblpos - ip_crossax = lv_crossax - ip_crosses = lv_crosses - ip_crossbetween = lv_crossbetween. - ENDIF. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - ENDWHILE. - - WHEN c_graph_pie. - node2 ?= node->find_from_name( name = 'varyColors' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_varycolorsval = ls_prop-val. - - "Load series - CALL METHOD node->get_elements_by_tag_name - EXPORTING -* depth = 0 - name = 'ser' -* namespace = '' - RECEIVING - rval = lo_collection. - CALL METHOD lo_collection->create_iterator - RECEIVING - rval = lo_iterator. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - WHILE lo_node IS BOUND. - node3 ?= node2->find_from_name( name = 'idx' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_idx = ls_prop-val. - node3 ?= node2->find_from_name( name = 'order' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_order = ls_prop-val. - node3 ?= node2->find_from_name( name = 'v' namespace = 'c' ). - IF node3 IS BOUND. - lv_sername = node3->get_value( ). - ENDIF. - node3 ?= node2->find_from_name( name = 'strRef' namespace = 'c' ). - IF node3 IS BOUND. - node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). - lv_label = node4->get_value( ). - ENDIF. - node3 ?= node2->find_from_name( name = 'numRef' namespace = 'c' ). - IF node3 IS BOUND. - node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). - lv_value = node4->get_value( ). - ENDIF. - CALL METHOD lo_piechart->create_serie - EXPORTING - ip_idx = lv_idx - ip_order = lv_order - ip_lbl = lv_label - ip_ref = lv_value - ip_sername = lv_sername. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - ENDWHILE. - - "note: numCache avoided - node2 ?= node->find_from_name( name = 'showLegendKey' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_showlegendkeyval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showVal' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_showvalval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showCatName' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_showcatnameval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showSerName' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_showsernameval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showPercent' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_showpercentval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showBubbleSize' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_showbubblesizeval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showLeaderLines' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_showleaderlinesval = ls_prop-val. - node2 ?= node->find_from_name( name = 'firstSliceAng' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_firstsliceangval = ls_prop-val. - WHEN c_graph_line. - node2 ?= node->find_from_name( name = 'grouping' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_groupingval = ls_prop-val. - node2 ?= node->find_from_name( name = 'varyColors' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_varycolorsval = ls_prop-val. - - "Load series - CALL METHOD node->get_elements_by_tag_name - EXPORTING -* depth = 0 - name = 'ser' -* namespace = '' - RECEIVING - rval = lo_collection. - CALL METHOD lo_collection->create_iterator - RECEIVING - rval = lo_iterator. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - WHILE lo_node IS BOUND. - node3 ?= node2->find_from_name( name = 'idx' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_idx = ls_prop-val. - node3 ?= node2->find_from_name( name = 'order' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_order = ls_prop-val. - node3 ?= node2->find_from_name( name = 'symbol' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_symbol = ls_prop-val. - node3 ?= node2->find_from_name( name = 'smooth' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_smooth = ls_prop-val. - node3 ?= node2->find_from_name( name = 'v' namespace = 'c' ). - IF node3 IS BOUND. - lv_sername = node3->get_value( ). - ENDIF. - node3 ?= node2->find_from_name( name = 'strRef' namespace = 'c' ). - IF node3 IS BOUND. - node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). - lv_label = node4->get_value( ). - ENDIF. - node3 ?= node2->find_from_name( name = 'numRef' namespace = 'c' ). - IF node3 IS BOUND. - node4 ?= node3->find_from_name( name = 'f' namespace = 'c' ). - lv_value = node4->get_value( ). - ENDIF. - CALL METHOD lo_linechart->create_serie - EXPORTING - ip_idx = lv_idx - ip_order = lv_order - ip_symbol = lv_symbol - ip_smooth = lv_smooth - ip_lbl = lv_label - ip_ref = lv_value - ip_sername = lv_sername. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - ENDWHILE. - "note: numCache avoided - node2 ?= node->find_from_name( name = 'showLegendKey' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_showlegendkeyval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showVal' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_showvalval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showCatName' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_showcatnameval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showSerName' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_showsernameval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showPercent' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_showpercentval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showBubbleSize' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_showbubblesizeval = ls_prop-val. - - node ?= node->find_from_name( name = 'lineChart' namespace = 'c' ). - node2 ?= node->find_from_name( name = 'marker' namespace = 'c' DEPTH = '1' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->NS_MARKERVAL = ls_prop-val. - node2 ?= node->find_from_name( name = 'smooth' namespace = 'c' DEPTH = '1' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->NS_SMOOTHVAL = ls_prop-val. - node ?= ip_chart->if_ixml_node~get_first_child( ). - CHECK node IS NOT INITIAL. - - "Load axes - node2 ?= node->find_from_name( name = 'lineChart' namespace = 'c' ). - CALL METHOD node2->get_elements_by_tag_name - EXPORTING -* depth = 0 - name = 'axId' -* namespace = '' - RECEIVING - rval = lo_collection. - CALL METHOD lo_collection->create_iterator - RECEIVING - rval = lo_iterator. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - WHILE lo_node IS BOUND. - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lv_axid = ls_prop-val. - IF sy-index EQ 1. "catAx - node2 ?= node->find_from_name( name = 'catAx' namespace = 'c' ). - node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_orientation = ls_prop-val. - node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_delete = ls_prop-val. - node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_axpos = ls_prop-val. -* node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). -* zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). -* lv_formatcode = ls_prop-formatcode. -* lv_sourcelinked = ls_prop-sourcelinked. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_majortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_minortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_ticklblpos = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crossax = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crosses = ls_prop-val. - node3 ?= node2->find_from_name( name = 'auto' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_auto = ls_prop-val. - node3 ?= node2->find_from_name( name = 'lblAlgn' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_lblalgn = ls_prop-val. - node3 ?= node2->find_from_name( name = 'lblOffset' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_lbloffset = ls_prop-val. - node3 ?= node2->find_from_name( name = 'noMultiLvlLbl' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_nomultilvllbl = ls_prop-val. - CALL METHOD lo_linechart->create_ax - EXPORTING - ip_axid = lv_axid - ip_type = zcl_excel_graph_line=>c_catax - ip_orientation = lv_orientation - ip_delete = lv_delete - ip_axpos = lv_axpos - ip_formatcode = lv_formatcode - ip_sourcelinked = lv_sourcelinked - ip_majortickmark = lv_majortickmark - ip_minortickmark = lv_minortickmark - ip_ticklblpos = lv_ticklblpos - ip_crossax = lv_crossax - ip_crosses = lv_crosses - ip_auto = lv_auto - ip_lblalgn = lv_lblalgn - ip_lbloffset = lv_lbloffset - ip_nomultilvllbl = lv_nomultilvllbl. - ELSEIF sy-index EQ 2. "valAx - node2 ?= node->find_from_name( name = 'valAx' namespace = 'c' ). - node3 ?= node2->find_from_name( name = 'orientation' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_orientation = ls_prop-val. - node3 ?= node2->find_from_name( name = 'delete' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_delete = ls_prop-val. - node3 ?= node2->find_from_name( name = 'axPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_axpos = ls_prop-val. - node3 ?= node2->find_from_name( name = 'numFmt' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_formatcode = ls_prop-formatcode. - lv_sourcelinked = ls_prop-sourcelinked. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_majortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'majorTickMark' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_minortickmark = ls_prop-val. - node3 ?= node2->find_from_name( name = 'tickLblPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_ticklblpos = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crossAx' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crossax = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crosses' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crosses = ls_prop-val. - node3 ?= node2->find_from_name( name = 'crossBetween' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = ls_prop ). - lv_crossbetween = ls_prop-val. - CALL METHOD lo_linechart->create_ax - EXPORTING - ip_axid = lv_axid - ip_type = zcl_excel_graph_line=>c_valax - ip_orientation = lv_orientation - ip_delete = lv_delete - ip_axpos = lv_axpos - ip_formatcode = lv_formatcode - ip_sourcelinked = lv_sourcelinked - ip_majortickmark = lv_majortickmark - ip_minortickmark = lv_minortickmark - ip_ticklblpos = lv_ticklblpos - ip_crossax = lv_crossax - ip_crosses = lv_crosses - ip_crossbetween = lv_crossbetween. - ENDIF. - lo_node = lo_iterator->get_next( ). - IF lo_node IS BOUND. - node2 ?= lo_node->query_interface( ixml_iid_element ). - ENDIF. - ENDWHILE. - WHEN OTHERS. - ENDCASE. - - "legend - CASE me->graph_type. - WHEN c_graph_bars. - node2 ?= node->find_from_name( name = 'legendPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_legendposval = ls_prop-val. - node2 ?= node->find_from_name( name = 'overlay' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_barchart->ns_overlayval = ls_prop-val. - WHEN c_graph_line. - node2 ?= node->find_from_name( name = 'legendPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_legendposval = ls_prop-val. - node2 ?= node->find_from_name( name = 'overlay' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_linechart->ns_overlayval = ls_prop-val. - WHEN c_graph_pie. - node2 ?= node->find_from_name( name = 'legendPos' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_legendposval = ls_prop-val. - node2 ?= node->find_from_name( name = 'overlay' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_overlayval = ls_prop-val. - node2 ?= node->find_from_name( name = 'pPr' namespace = 'a' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_pprrtl = ls_prop-rtl. - node2 ?= node->find_from_name( name = 'endParaRPr' namespace = 'a' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - lo_piechart->ns_endpararprlang = ls_prop-lang. - - WHEN OTHERS. - ENDCASE. - - node2 ?= node->find_from_name( name = 'plotVisOnly' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_plotvisonlyval = ls_prop-val. - node2 ?= node->find_from_name( name = 'dispBlanksAs' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_dispblanksasval = ls_prop-val. - node2 ?= node->find_from_name( name = 'showDLblsOverMax' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_prop ). - me->graph->ns_showdlblsovermaxval = ls_prop-val. - "--------------------- - - node2 ?= node->find_from_name( name = 'pageMargins' namespace = 'c' ). - zcl_excel_reader_2007=>fill_struct_from_attributes( EXPORTING ip_element = node2 CHANGING cp_structure = ls_pagemargins ). - me->graph->pagemargins = ls_pagemargins. - - - endmethod. - - - - - - method PIXEL2EMU. -* suppose 96 DPI - IF ip_dpi IS SUPPLIED. - r_emu = ip_pixel * 914400 / ip_dpi. - ELSE. -* suppose 96 DPI - r_emu = ip_pixel * 914400 / 96. - ENDIF. - endmethod. - - - - - - - method SET_MEDIA. - IF ip_media IS SUPPLIED. - media = ip_media. - ENDIF. - media_type = ip_media_type. - media_source = c_media_source_xstring. - IF ip_width IS SUPPLIED. - size-width = ip_width. - ENDIF. - IF ip_height IS SUPPLIED. - size-height = ip_height. - ENDIF. - endmethod. - - - - - - METHOD set_media_mime. - - DATA: lv_language TYPE sylangu. - - io = ip_io. - media_source = c_media_source_mime. - size-width = ip_width. - size-height = ip_height. - - lv_language = sy-langu. - cl_wb_mime_repository=>load_mime( EXPORTING - io = ip_io - IMPORTING - filename = media_name - "mimetype = media_type - CHANGING - language = lv_language ). - - SPLIT media_name AT '.' INTO media_name media_type. - -ENDMETHOD. - - - - - - method SET_MEDIA_WWW. - DATA: lv_value(20). - - media_key_www = ip_key. - media_source = c_media_source_www. - - CALL FUNCTION 'WWWPARAMS_READ' - EXPORTING - relid = media_key_www-relid - objid = media_key_www-objid - name = 'fileextension' - IMPORTING - value = lv_value. - media_type = lv_value. - SHIFT media_type LEFT DELETING LEADING '.'. - - size-width = ip_width. - size-height = ip_height. - endmethod. - - - - - - - method SET_POSITION. - from_loc-col = zcl_excel_common=>convert_column2int( ip_from_col ) - 1. - IF ip_coloff IS SUPPLIED. - from_loc-col_offset = ip_coloff. - ENDIF. - from_loc-row = ip_from_row - 1. - IF ip_rowoff IS SUPPLIED. - from_loc-row_offset = ip_rowoff. - ENDIF. - anchor = anchor_one_cell. - endmethod. - - - - - - method SET_POSITION2. - - data: lv_anchor type zexcel_drawing_anchor. - lv_anchor = ip_anchor. - - IF lv_anchor IS INITIAL. - IF ip_to IS NOT INITIAL. - lv_anchor = anchor_two_cell. - ELSE. - lv_anchor = anchor_one_cell. - ENDIF. - ENDIF. - - CASE lv_anchor. - WHEN anchor_absolute OR anchor_one_cell. - CLEAR: me->to_loc. - WHEN anchor_two_cell. - CLEAR: me->size. - ENDCASE. - - me->from_loc = ip_from. - me->to_loc = ip_to. - me->anchor = lv_anchor. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - method ADD. - DATA: lv_index TYPE i. - - drawings->add( ip_drawing ). - lv_index = drawings->if_object_collection~size( ). - ip_drawing->create_media_name( - ip_index = lv_index ). - endmethod. - - - method CLEAR. - - drawings->clear( ). - endmethod. - - - - method CONSTRUCTOR. - - CREATE OBJECT drawings. - type = ip_type. - - endmethod. - - - - - method GET. - - DATA lv_index TYPE i. - lv_index = ip_index. - eo_drawing ?= drawings->if_object_collection~get( lv_index ). - endmethod. - - - - method GET_ITERATOR. - - eo_iterator ?= drawings->if_object_collection~get_iterator( ). - endmethod. - - - - method GET_TYPE. - rp_type = me->type. - endmethod. - - - - method INCLUDE. - drawings->add( ip_drawing ). - endmethod. - - - - method IS_EMPTY. - - is_empty = drawings->if_object_collection~is_empty( ). - endmethod. - - - - method REMOVE. - - drawings->remove( ip_drawing ). - endmethod. - - - - method SIZE. - - ep_size = drawings->if_object_collection~size( ). - endmethod. - - - - - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - "Load default values - me->pagemargins-b = '0.75'. - me->pagemargins-l = '0.7'. - me->pagemargins-r = '0.7'. - me->pagemargins-t = '0.75'. - me->pagemargins-header = '0.3'. - me->pagemargins-footer = '0.3'. - endmethod. - - - - - - - - - - - - - - - - - - - - method CREATE_SERIE. - DATA ls_serie TYPE s_series. - - DATA: lv_start_row_c TYPE char7, - lv_stop_row_c TYPE char7. - - - IF ip_lbl IS NOT SUPPLIED. - lv_stop_row_c = ip_lbl_to_row. - SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. - SHIFT lv_stop_row_c LEFT DELETING LEADING space. - lv_start_row_c = ip_lbl_from_row. - SHIFT lv_start_row_c RIGHT DELETING TRAILING space. - SHIFT lv_start_row_c LEFT DELETING LEADING space. - ls_serie-lbl = ip_sheet. - ls_serie-lbl = zcl_excel_common=>escape_string( ip_value = ls_serie-lbl ). - CONCATENATE ls_serie-lbl '!$' ip_lbl_from_col '$' lv_start_row_c ':$' ip_lbl_to_col '$' lv_stop_row_c INTO ls_serie-lbl. - CLEAR: lv_start_row_c, lv_stop_row_c. - ELSE. - ls_serie-lbl = ip_lbl. - ENDIF. - IF ip_ref IS NOT SUPPLIED. - lv_stop_row_c = ip_ref_to_row. - SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. - SHIFT lv_stop_row_c LEFT DELETING LEADING space. - lv_start_row_c = ip_ref_from_row. - SHIFT lv_start_row_c RIGHT DELETING TRAILING space. - SHIFT lv_start_row_c LEFT DELETING LEADING space. - ls_serie-ref = ip_sheet. - ls_serie-ref = zcl_excel_common=>escape_string( ip_value = ls_serie-ref ). - CONCATENATE ls_serie-ref '!$' ip_ref_from_col '$' lv_start_row_c ':$' ip_ref_to_col '$' lv_stop_row_c INTO ls_serie-ref. - CLEAR: lv_start_row_c, lv_stop_row_c. - ELSE. - ls_serie-ref = ip_ref. - ENDIF. - ls_serie-idx = ip_idx. - ls_serie-order = ip_order. - ls_serie-invertifnegative = ip_invertifnegative. - ls_serie-symbol = ip_symbol. - ls_serie-smooth = ip_smooth. - ls_serie-sername = ip_sername. - APPEND ls_serie TO me->series. - SORT me->series BY order ASCENDING. - endmethod. - - - - method SET_PRINT_LBL. - me->print_label = ip_value. - endmethod. - - - - method SET_STYLE. - me->ns_c14styleval = ip_style-c14style. - CONDENSE me->ns_c14styleval NO-GAPS. - me->ns_styleval = ip_style-cstyle. - CONDENSE me->ns_styleval NO-GAPS. - endmethod. - - - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CREATE_AX. - DATA ls_ax TYPE s_ax. - ls_ax-type = ip_type. - - if ip_type = c_catax. - if ip_axid is SUPPLIED. - ls_ax-axid = ip_axid. - else. - ls_ax-axid = '1'. - endif. - if ip_orientation is SUPPLIED. - ls_ax-orientation = ip_orientation. - else. - ls_ax-orientation = 'minMax'. - endif. - if ip_delete is SUPPLIED. - ls_ax-delete = ip_delete. - else. - ls_ax-delete = '0'. - endif. - if ip_axpos is SUPPLIED. - ls_ax-axpos = ip_axpos. - else. - ls_ax-axpos = 'b'. - endif. - if ip_formatcode is SUPPLIED. - ls_ax-formatcode = ip_formatcode. - else. - ls_ax-formatcode = 'General'. - endif. - if ip_sourcelinked is SUPPLIED. - ls_ax-sourcelinked = ip_sourcelinked. - else. - ls_ax-sourcelinked = '1'. - endif. - if ip_majorTickMark is SUPPLIED. - ls_ax-majorTickMark = ip_majorTickMark. - else. - ls_ax-majorTickMark = 'out'. - endif. - if ip_minorTickMark is SUPPLIED. - ls_ax-minorTickMark = ip_minorTickMark. - else. - ls_ax-minorTickMark = 'none'. - endif. - if ip_ticklblpos is SUPPLIED. - ls_ax-ticklblpos = ip_ticklblpos. - else. - ls_ax-ticklblpos = 'nextTo'. - endif. - if ip_crossax is SUPPLIED. - ls_ax-crossax = ip_crossax. - else. - ls_ax-crossax = '2'. - endif. - if ip_crosses is SUPPLIED. - ls_ax-crosses = ip_crosses. - else. - ls_ax-crosses = 'autoZero'. - endif. - if ip_auto is SUPPLIED. - ls_ax-auto = ip_auto. - else. - ls_ax-auto = '1'. - endif. - if ip_lblAlgn is SUPPLIED. - ls_ax-lblAlgn = ip_lblAlgn. - else. - ls_ax-lblAlgn = 'ctr'. - endif. - if ip_lblOffset is SUPPLIED. - ls_ax-lblOffset = ip_lblOffset. - else. - ls_ax-lblOffset = '100'. - endif. - if ip_noMultiLvlLbl is SUPPLIED. - ls_ax-noMultiLvlLbl = ip_noMultiLvlLbl. - else. - ls_ax-noMultiLvlLbl = '0'. - endif. - elseif ip_type = c_valax. - if ip_axid is SUPPLIED. - ls_ax-axid = ip_axid. - else. - ls_ax-axid = '2'. - endif. - if ip_orientation is SUPPLIED. - ls_ax-orientation = ip_orientation. - else. - ls_ax-orientation = 'minMax'. - endif. - if ip_delete is SUPPLIED. - ls_ax-delete = ip_delete. - else. - ls_ax-delete = '0'. - endif. - if ip_axpos is SUPPLIED. - ls_ax-axpos = ip_axpos. - else. - ls_ax-axpos = 'l'. - endif. - if ip_formatcode is SUPPLIED. - ls_ax-formatcode = ip_formatcode. - else. - ls_ax-formatcode = 'General'. - endif. - if ip_sourcelinked is SUPPLIED. - ls_ax-sourcelinked = ip_sourcelinked. - else. - ls_ax-sourcelinked = '1'. - endif. - if ip_majorTickMark is SUPPLIED. - ls_ax-majorTickMark = ip_majorTickMark. - else. - ls_ax-majorTickMark = 'out'. - endif. - if ip_minorTickMark is SUPPLIED. - ls_ax-minorTickMark = ip_minorTickMark. - else. - ls_ax-minorTickMark = 'none'. - endif. - if ip_ticklblpos is SUPPLIED. - ls_ax-ticklblpos = ip_ticklblpos. - else. - ls_ax-ticklblpos = 'nextTo'. - endif. - if ip_crossax is SUPPLIED. - ls_ax-crossax = ip_crossax. - else. - ls_ax-crossax = '1'. - endif. - if ip_crosses is SUPPLIED. - ls_ax-crosses = ip_crosses. - else. - ls_ax-crosses = 'autoZero'. - endif. - if ip_crossBetween is SUPPLIED. - ls_ax-crossBetween = ip_crossBetween. - else. - ls_ax-crossBetween = 'between'. - endif. - endif. - - APPEND ls_ax TO me->axes. - sort me->axes by axid ascending. - endmethod. - - - - method SET_SHOW_CAT_NAME. - ns_showcatnameval = ip_value. - endmethod. - - - - method SET_SHOW_LEGEND_KEY. - ns_showlegendkeyval = ip_value. - endmethod. - - - - method SET_SHOW_PERCENT. - ns_showpercentval = ip_value. - endmethod. - - - - method SET_SHOW_SER_NAME. - ns_showsernameval = ip_value. - endmethod. - - - - method SET_SHOW_VALUES. - ns_showvalval = ip_value. - endmethod. - - - - method SET_VARYCOLOR. - ns_varycolorsval = ip_value. - endmethod. - - - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CREATE_AX. - DATA ls_ax TYPE s_ax. - ls_ax-type = ip_type. - - IF ip_type = c_catax. - IF ip_axid IS SUPPLIED. - ls_ax-axid = ip_axid. - ELSE. - ls_ax-axid = '1'. - ENDIF. - IF ip_orientation IS SUPPLIED. - ls_ax-orientation = ip_orientation. - ELSE. - ls_ax-orientation = 'minMax'. - ENDIF. - IF ip_delete IS SUPPLIED. - ls_ax-delete = ip_delete. - ELSE. - ls_ax-delete = '0'. - ENDIF. - IF ip_axpos IS SUPPLIED. - ls_ax-axpos = ip_axpos. - ELSE. - ls_ax-axpos = 'b'. - ENDIF. - IF ip_formatcode IS SUPPLIED. - ls_ax-formatcode = ip_formatcode. - ELSE. - ls_ax-formatcode = 'General'. - ENDIF. - IF ip_sourcelinked IS SUPPLIED. - ls_ax-sourcelinked = ip_sourcelinked. - ELSE. - ls_ax-sourcelinked = '1'. - ENDIF. - IF ip_majortickmark IS SUPPLIED. - ls_ax-majortickmark = ip_majortickmark. - ELSE. - ls_ax-majortickmark = 'out'. - ENDIF. - IF ip_minortickmark IS SUPPLIED. - ls_ax-minortickmark = ip_minortickmark. - ELSE. - ls_ax-minortickmark = 'none'. - ENDIF. - IF ip_ticklblpos IS SUPPLIED. - ls_ax-ticklblpos = ip_ticklblpos. - ELSE. - ls_ax-ticklblpos = 'nextTo'. - ENDIF. - IF ip_crossax IS SUPPLIED. - ls_ax-crossax = ip_crossax. - ELSE. - ls_ax-crossax = '2'. - ENDIF. - IF ip_crosses IS SUPPLIED. - ls_ax-crosses = ip_crosses. - ELSE. - ls_ax-crosses = 'autoZero'. - ENDIF. - IF ip_auto IS SUPPLIED. - ls_ax-auto = ip_auto. - ELSE. - ls_ax-auto = '1'. - ENDIF. - IF ip_lblalgn IS SUPPLIED. - ls_ax-lblalgn = ip_lblalgn. - ELSE. - ls_ax-lblalgn = 'ctr'. - ENDIF. - IF ip_lbloffset IS SUPPLIED. - ls_ax-lbloffset = ip_lbloffset. - ELSE. - ls_ax-lbloffset = '100'. - ENDIF. - IF ip_nomultilvllbl IS SUPPLIED. - ls_ax-nomultilvllbl = ip_nomultilvllbl. - ELSE. - ls_ax-nomultilvllbl = '0'. - ENDIF. - ELSEIF ip_type = c_valax. - IF ip_axid IS SUPPLIED. - ls_ax-axid = ip_axid. - ELSE. - ls_ax-axid = '2'. - ENDIF. - IF ip_orientation IS SUPPLIED. - ls_ax-orientation = ip_orientation. - ELSE. - ls_ax-orientation = 'minMax'. - ENDIF. - IF ip_delete IS SUPPLIED. - ls_ax-delete = ip_delete. - ELSE. - ls_ax-delete = '0'. - ENDIF. - IF ip_axpos IS SUPPLIED. - ls_ax-axpos = ip_axpos. - ELSE. - ls_ax-axpos = 'l'. - ENDIF. - IF ip_formatcode IS SUPPLIED. - ls_ax-formatcode = ip_formatcode. - ELSE. - ls_ax-formatcode = 'General'. - ENDIF. - IF ip_sourcelinked IS SUPPLIED. - ls_ax-sourcelinked = ip_sourcelinked. - ELSE. - ls_ax-sourcelinked = '1'. - ENDIF. - IF ip_majortickmark IS SUPPLIED. - ls_ax-majortickmark = ip_majortickmark. - ELSE. - ls_ax-majortickmark = 'out'. - ENDIF. - IF ip_minortickmark IS SUPPLIED. - ls_ax-minortickmark = ip_minortickmark. - ELSE. - ls_ax-minortickmark = 'none'. - ENDIF. - IF ip_ticklblpos IS SUPPLIED. - ls_ax-ticklblpos = ip_ticklblpos. - ELSE. - ls_ax-ticklblpos = 'nextTo'. - ENDIF. - IF ip_crossax IS SUPPLIED. - ls_ax-crossax = ip_crossax. - ELSE. - ls_ax-crossax = '1'. - ENDIF. - IF ip_crosses IS SUPPLIED. - ls_ax-crosses = ip_crosses. - ELSE. - ls_ax-crosses = 'autoZero'. - ENDIF. - IF ip_crossbetween IS SUPPLIED. - ls_ax-crossbetween = ip_crossbetween. - ELSE. - ls_ax-crossbetween = 'between'. - ENDIF. - ENDIF. - - APPEND ls_ax TO me->axes. - SORT me->axes BY axid ASCENDING. - endmethod. - - - - method SET_SHOW_CAT_NAME. - ns_showcatnameval = ip_value. - endmethod. - - - - method SET_SHOW_LEGEND_KEY. - ns_showlegendkeyval = ip_value. - endmethod. - - - - method SET_SHOW_PERCENT. - ns_showpercentval = ip_value. - endmethod. - - - - method SET_SHOW_SER_NAME. - ns_showsernameval = ip_value. - endmethod. - - - - method SET_SHOW_VALUES. - ns_showvalval = ip_value. - endmethod. - - - - method SET_VARYCOLOR. - ns_varycolorsval = ip_value. - endmethod. - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - method SET_SHOW_CAT_NAME. - ns_showcatnameval = ip_value. - endmethod. - - - - method SET_SHOW_LEADER_LINES. - ns_showleaderlinesval = ip_value. - endmethod. - - - - method SET_SHOW_LEGEND_KEY. - ns_showlegendkeyval = ip_value. - endmethod. - - - - method SET_SHOW_PERCENT. - ns_showpercentval = ip_value. - endmethod. - - - - method SET_SHOW_SER_NAME. - ns_showsernameval = ip_value. - endmethod. - - - - method SET_SHOW_VALUES. - ns_showvalval = ip_value. - endmethod. - - - - method SET_VARYCOLOR. - ns_varycolorsval = ip_value. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - method CREATE. - data: lo_hyperlink type REF TO zcl_excel_hyperlink. - - create OBJECT lo_hyperlink. - - lo_hyperlink->location = iv_url. - lo_hyperlink->internal = iv_internal. - - ov_link = lo_hyperlink. - endmethod. - - - - - method CREATE_EXTERNAL_LINK. - - ov_link = zcl_excel_hyperlink=>create( iv_url = iv_url - iv_internal = abap_false ). - endmethod. - - - - - method CREATE_INTERNAL_LINK. - ov_link = zcl_excel_hyperlink=>create( iv_url = iv_location - iv_internal = abap_true ). - endmethod. - - - - method GET_REF. - ev_ref = row. - CONDENSE ev_ref. - CONCATENATE column ev_ref INTO ev_ref. - endmethod. - - - - method GET_URL. - ev_url = me->location. - endmethod. - - - - method IS_INTERNAL. - ev_ret = me->internal. - endmethod. - - - - - - method SET_CELL_REFERENCE. - me->column = zcl_excel_common=>convert_column2alpha( ip_column ). " issue #155 - less restrictive typing for ip_column - me->row = ip_row. - endmethod. - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - method CONSTRUCTOR. - " default Excel palette based on - " http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.indexedcolors.aspx - - APPEND '00000000' TO colors. - APPEND '00FFFFFF' TO colors. - APPEND '00FF0000' TO colors. - APPEND '0000FF00' TO colors. - APPEND '000000FF' TO colors. - APPEND '00FFFF00' TO colors. - APPEND '00FF00FF' TO colors. - APPEND '0000FFFF' TO colors. - APPEND '00000000' TO colors. - APPEND '00FFFFFF' TO colors. - - APPEND '00FF0000' TO colors. - APPEND '0000FF00' TO colors. - APPEND '000000FF' TO colors. - APPEND '00FFFF00' TO colors. - APPEND '00FF00FF' TO colors. - APPEND '0000FFFF' TO colors. - APPEND '00800000' TO colors. - APPEND '00008000' TO colors. - APPEND '00000080' TO colors. - APPEND '00808000' TO colors. - - APPEND '00800080' TO colors. - APPEND '00008080' TO colors. - APPEND '00C0C0C0' TO colors. - APPEND '00808080' TO colors. - APPEND '009999FF' TO colors. - APPEND '00993366' TO colors. - APPEND '00FFFFCC' TO colors. - APPEND '00CCFFFF' TO colors. - APPEND '00660066' TO colors. - APPEND '00FF8080' TO colors. - - APPEND '000066CC' TO colors. - APPEND '00CCCCFF' TO colors. - APPEND '00000080' TO colors. - APPEND '00FF00FF' TO colors. - APPEND '00FFFF00' TO colors. - APPEND '0000FFFF' TO colors. - APPEND '00800080' TO colors. - APPEND '00800000' TO colors. - APPEND '00008080' TO colors. - APPEND '000000FF' TO colors. - - APPEND '0000CCFF' TO colors. - APPEND '00CCFFFF' TO colors. - APPEND '00CCFFCC' TO colors. - APPEND '00FFFF99' TO colors. - APPEND '0099CCFF' TO colors. - APPEND '00FF99CC' TO colors. - APPEND '00CC99FF' TO colors. - APPEND '00FFCC99' TO colors. - APPEND '003366FF' TO colors. - APPEND '0033CCCC' TO colors. - - APPEND '0099CC00' TO colors. - APPEND '00FFCC00' TO colors. - APPEND '00FF9900' TO colors. - APPEND '00FF6600' TO colors. - APPEND '00666699' TO colors. - APPEND '00969696' TO colors. - APPEND '00003366' TO colors. - APPEND '00339966' TO colors. - APPEND '00003300' TO colors. - APPEND '00333300' TO colors. - - APPEND '00993300' TO colors. - APPEND '00993366' TO colors. - APPEND '00333399' TO colors. - APPEND '00333333' TO colors. - - endmethod. - - - - - - method GET_COLOR. - DATA: lv_index type i. - - lv_index = ip_index + 1. - READ TABLE colors INTO ep_color INDEX lv_index. - IF sy-subrc <> 0. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Invalid color index'. - ENDIF. - endmethod. - - - - method GET_COLORS. - ep_colors = colors. - endmethod. - - - - method IS_MODIFIED. - ep_modified = modified. - endmethod. - - - - - method SET_COLOR. - DATA: lv_index TYPE i. - - FIELD-SYMBOLS: <lv_color> LIKE LINE OF colors. - - lv_index = ip_index + 1. - READ TABLE colors ASSIGNING <lv_color> INDEX lv_index. - IF sy-subrc <> 0. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Invalid color index'. - ENDIF. - - IF <lv_color> <> ip_color. - modified = abap_true. - <lv_color> = ip_color. - ENDIF. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - method GET_GUID. - - ep_guid = me->guid. - - endmethod. - - - - method GET_VALUE. - - ep_value = me->value. - - endmethod. - - - - method SET_RANGE_VALUE. - me->value = ip_value. - endmethod. - - - - - - - - method SET_VALUE. - DATA: lv_start_row_c TYPE char7, - lv_stop_row_c TYPE char7, - lv_value TYPE string. - lv_stop_row_c = ip_stop_row. - SHIFT lv_stop_row_c RIGHT DELETING TRAILING space. - SHIFT lv_stop_row_c LEFT DELETING LEADING space. - lv_start_row_c = ip_start_row. - SHIFT lv_start_row_c RIGHT DELETING TRAILING space. - SHIFT lv_start_row_c LEFT DELETING LEADING space. - lv_value = ip_sheet_name. - me->value = zcl_excel_common=>escape_string( ip_value = lv_value ). - - CONCATENATE me->value '!$' ip_start_column '$' lv_start_row_c ':$' ip_stop_column '$' lv_stop_row_c INTO me->value. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - - DATA: ls_iconset TYPE zexcel_conditional_iconset. - ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. - ls_iconset-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo1_value = '0'. - ls_iconset-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo2_value = '20'. - ls_iconset-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo3_value = '40'. - ls_iconset-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo4_value = '60'. - ls_iconset-cfvo5_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo5_value = '80'. - - - me->rule = zcl_excel_style_conditional=>c_rule_none. -* me->iconset->operator = zcl_excel_style_conditional=>c_operator_none. - me->mode_iconset = ls_iconset. - me->priority = 1. - -* inizialize dimension range - me->stop_cell-cell_row = 1. - me->stop_cell-cell_column = 1. - me->start_cell-cell_row = 1. - me->start_cell-cell_column = 1. - endmethod. - - - - method GET_DIMENSION_RANGE. - IF stop_cell EQ start_cell. "only one cell - ep_dimension_range = start_cell-cell_coords. - ELSE. - CONCATENATE start_cell-cell_coords ':' stop_cell-cell_coords INTO ep_dimension_range. - ENDIF. - endmethod. - - - - - - - method SET_RANGE. - DATA: lv_column TYPE zexcel_cell_column, - lv_row_alpha TYPE string. - - lv_column = zcl_excel_common=>convert_column2int( ip_stop_column ). - stop_cell-cell_row = 1. - stop_cell-cell_column = lv_column. - lv_row_alpha = ip_stop_row. - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE ip_stop_column lv_row_alpha INTO stop_cell-cell_coords. - - lv_column = zcl_excel_common=>convert_column2int( ip_start_column ). - start_cell-cell_row = 1. - start_cell-cell_column = lv_column. - lv_row_alpha = ip_start_row. - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE ip_start_column lv_row_alpha INTO start_cell-cell_coords. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - filltype = zcl_excel_style_fill=>c_fill_none. - fgcolor-theme = zcl_excel_style_color=>c_theme_not_set. - fgcolor-indexed = zcl_excel_style_color=>c_indexed_not_set. - bgcolor-theme = zcl_excel_style_color=>c_theme_not_set. - bgcolor-indexed = zcl_excel_style_color=>c_indexed_sys_foreground. - rotation = 0. - endmethod. - - - - method GET_STRUCTURE. - es_fill-rotation = me->rotation. - es_fill-filltype = me->filltype. - es_fill-fgColor = me->fgColor. - es_fill-bgColor = me->bgColor. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CALCULATE_TEXT_WIDTH. - " Addition to solve issue #120, contribution by Stefan Schmöcker - r_width = strlen( i_text ). - " use scale factor based on default 11 - " ( don't know where defaultsetting is stored currently ) - r_width = r_width * me->size / 11. - endmethod. - - - method CONSTRUCTOR. - me->color-rgb = zcl_excel_style_color=>c_black. - me->color-theme = zcl_excel_style_color=>c_theme_not_set. - me->color-indexed = zcl_excel_style_color=>c_indexed_not_set. - me->scheme = zcl_excel_style_font=>c_scheme_minor. - me->underline_mode = zcl_excel_style_font=>c_underline_single. - endmethod. - - - - method GET_STRUCTURE. - - es_font-bold = me->bold. - es_font-italic = me->italic. - es_font-underline = me->underline. - es_font-underline_mode = me->underline_mode. - es_font-strikethrough = me->strikethrough. - es_font-size = me->size. - es_font-color = me->color. - es_font-name = me->name. - es_font-family = me->family. - es_font-scheme = me->scheme. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - format_code = me->c_format_general. - endmethod. - - - - method GET_STRUCTURE. - ep_number_format-numfmt = me->format_code. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - method CONSTRUCTOR. - locked = me->c_protection_locked. - hidden = me->c_protection_unhidden. - endmethod. - - - - method GET_STRUCTURE. - ep_protection-locked = me->locked. - ep_protection-hidden = me->hidden. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - CLASS lcl_excel_common_test DEFINITION DEFERRED. -CLASS zcl_excel_common DEFINITION LOCAL FRIENDS lcl_excel_common_test. - -*----------------------------------------------------------------------* -* CLASS lcl_Excel_Common_Test DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_excel_common_test DEFINITION FOR TESTING "#AU Risk_Level Harmless - . "#AU Duration Short -*?<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> -*?<asx:values> -*?<TESTCLASS_OPTIONS> -*?<TEST_CLASS>lcl_Excel_Common_Test -*?</TEST_CLASS> -*?<TEST_MEMBER>f_Cut -*?</TEST_MEMBER> -*?<OBJECT_UNDER_TEST>ZCL_EXCEL_COMMON -*?</OBJECT_UNDER_TEST> -*?<OBJECT_IS_LOCAL/> -*?<GENERATE_FIXTURE>X -*?</GENERATE_FIXTURE> -*?<GENERATE_CLASS_FIXTURE>X -*?</GENERATE_CLASS_FIXTURE> -*?<GENERATE_INVOCATION>X -*?</GENERATE_INVOCATION> -*?<GENERATE_ASSERT_EQUAL>X -*?</GENERATE_ASSERT_EQUAL> -*?</TESTCLASS_OPTIONS> -*?</asx:values> -*?</asx:abap> - PRIVATE SECTION. -* ================ - DATA: - lx_excel TYPE REF TO zcx_excel, - ls_symsg_act TYPE symsg, " actual messageinformation of exception - ls_symsg_exp TYPE symsg, " expected messageinformation of exception - f_cut TYPE REF TO zcl_excel_common. "class under test - - CLASS-METHODS: class_setup. - CLASS-METHODS: class_teardown. - METHODS: setup. - METHODS: teardown. -* METHODS: char2hex FOR TESTING. - METHODS: convert_column2alpha FOR TESTING. - METHODS: convert_column2int FOR TESTING. - METHODS: date_to_excel_string FOR TESTING. - METHODS: encrypt_password FOR TESTING. - METHODS: excel_string_to_date FOR TESTING. - METHODS: excel_string_to_time FOR TESTING. -* METHODS: number_to_excel_string FOR TESTING. - METHODS: time_to_excel_string FOR TESTING. - METHODS: split_file FOR TESTING. - METHODS: convert_range2column_a_row FOR TESTING. - METHODS: describe_structure FOR TESTING. - METHODS: calculate_cell_distance FOR TESTING. - METHODS: shift_formula FOR TESTING. - METHODS: is_cell_in_range FOR TESTING. -ENDCLASS. "lcl_Excel_Common_Test - - -*----------------------------------------------------------------------* -* CLASS lcl_Excel_Common_Test IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_excel_common_test IMPLEMENTATION. -* =========================================== - - METHOD class_setup. -* =================== - - - ENDMETHOD. "class_Setup - - - METHOD class_teardown. -* ====================== - - - ENDMETHOD. "class_Teardown - - - METHOD setup. -* ============= - - CREATE OBJECT f_cut. - ENDMETHOD. "setup - - - METHOD teardown. -* ================ - - - ENDMETHOD. "teardown - - - METHOD convert_column2alpha. -* ============================ - DATA ep_column TYPE zexcel_cell_column_alpha. - -* Test 1. Simple test - TRY. - ep_column = zcl_excel_common=>convert_column2alpha( 1 ). - - zcl_excel_common=>assert_equals( - act = ep_column - exp = 'A' - msg = 'Wrong column conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 2. Max column for OXML #16,384 = XFD - TRY. - ep_column = zcl_excel_common=>convert_column2alpha( 16384 ). - - zcl_excel_common=>assert_equals( - act = ep_column - exp = 'XFD' - msg = 'Wrong column conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 3. Index 0 is out of bounds - TRY. - ep_column = zcl_excel_common=>convert_column2alpha( 0 ). - - zcl_excel_common=>assert_equals( - act = ep_column - exp = 'A' - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>assert_equals( - act = lx_excel->error - exp = 'Index out of bounds' - msg = 'Colum index 0 is out of bounds, min column index is 1' - level = if_aunit_constants=>fatal - ). - ENDTRY. - -* Test 4. Exception should be thrown index out of bounds - TRY. - ep_column = zcl_excel_common=>convert_column2alpha( 16385 ). - - zcl_excel_common=>assert_differs( - act = ep_column - exp = 'XFE' - msg = 'Colum index 16385 is out of bounds, max column index is 16384' - level = if_aunit_constants=>fatal - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>assert_equals( - act = lx_excel->error - exp = 'Index out of bounds' - msg = 'Wrong exception is thrown' - level = if_aunit_constants=>tolerable - ). - ENDTRY. - ENDMETHOD. "convert_Column2alpha - - - METHOD convert_column2int. -* ========================== - DATA ep_column TYPE zexcel_cell_column. - -* Test 1. Basic test - TRY. - ep_column = zcl_excel_common=>convert_column2int( 'A' ). - - zcl_excel_common=>assert_equals( - act = ep_column - exp = 1 - msg = 'Wrong column conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 2. Max column - TRY. - ep_column = zcl_excel_common=>convert_column2int( 'XFD' ). - - zcl_excel_common=>assert_equals( - act = ep_column - exp = 16384 - msg = 'Wrong column conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 3. Out of bounds - TRY. - ep_column = zcl_excel_common=>convert_column2int( '' ). - - zcl_excel_common=>assert_differs( act = ep_column - exp = '0' - msg = 'Wrong column conversion' - level = if_aunit_constants=>critical ). - CATCH zcx_excel INTO lx_excel. - CLEAR: ls_symsg_act, - ls_symsg_exp. - ls_symsg_exp-msgid = 'ZABAP2XLSX'. - ls_symsg_exp-msgno = '800'. - ls_symsg_act-msgid = lx_excel->syst_at_raise-msgid. - ls_symsg_act-msgno = lx_excel->syst_at_raise-msgno. - zcl_excel_common=>assert_equals( act = ls_symsg_act - exp = ls_symsg_exp - msg = 'Colum name should be a valid string' - level = if_aunit_constants=>fatal ). - ENDTRY. - -* Test 4. Out of bounds - TRY. - ep_column = zcl_excel_common=>convert_column2int( 'XFE' ). - - zcl_excel_common=>assert_differs( act = ep_column - exp = 16385 - msg = 'Wrong column conversion' - level = if_aunit_constants=>critical ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>assert_equals( act = lx_excel->error - exp = 'Index out of bounds' - msg = 'Colum XFE is out of range' - level = if_aunit_constants=>fatal ). - ENDTRY. - ENDMETHOD. "convert_Column2int - - - METHOD date_to_excel_string. -* ============================ - DATA ep_value TYPE zexcel_cell_value. - -* Test 1. Basic conversion - TRY. - ep_value = zcl_excel_common=>date_to_excel_string( '19000101' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = 1 - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. -* Check around the "Excel Leap Year" 1900 - TRY. - ep_value = zcl_excel_common=>date_to_excel_string( '19000228' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = 59 - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - TRY. - ep_value = zcl_excel_common=>date_to_excel_string( '19000301' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = 61 - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - - -* Test 2. Basic conversion - TRY. - ep_value = zcl_excel_common=>date_to_excel_string( '99991212' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = 2958446 - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 3. Initial date - TRY. - DATA: lv_date TYPE d. - ep_value = zcl_excel_common=>date_to_excel_string( lv_date ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 2. Basic conversion - TRY. - DATA exp_value TYPE zexcel_cell_value VALUE 0. - ep_value = zcl_excel_common=>date_to_excel_string( '18991231' ). - - zcl_excel_common=>assert_differs( - act = ep_value - exp = exp_value - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>assert_equals( - act = lx_excel->error - exp = 'Index out of bounds' - msg = 'Dates prior of 1900 are not available in excel' - level = if_aunit_constants=>critical - ). - ENDTRY. - - ENDMETHOD. "date_To_Excel_String - - - METHOD encrypt_password. -* ======================== - DATA lv_encrypted_pwd TYPE zexcel_aes_password. - - TRY. - lv_encrypted_pwd = zcl_excel_common=>encrypt_password( 'test' ). - - zcl_excel_common=>assert_equals( - act = lv_encrypted_pwd - exp = 'CBEB' - msg = 'Wrong password encryption' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - ENDMETHOD. "encrypt_Password - - - METHOD excel_string_to_date. -* ============================ - DATA ep_value TYPE d. - - -* Test 1. Simple test -> ABAP Manage also date prior of 1900 - TRY. - ep_value = zcl_excel_common=>excel_string_to_date( '0' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '18991231' - msg = 'Wrong date conversion' - level = if_aunit_constants=>tolerable - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. -* Check around the "Excel Leap Year" 1900 - TRY. - ep_value = zcl_excel_common=>excel_string_to_date( '59' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '19000228' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - TRY. - ep_value = zcl_excel_common=>excel_string_to_date( '61' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '19000301' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 2. Simple test - TRY. - ep_value = zcl_excel_common=>excel_string_to_date( '1' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '19000101' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 3. Index 0 is out of bounds - TRY. - ep_value = zcl_excel_common=>excel_string_to_date( '2958446' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '99991212' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 4. Exception should be thrown index out of bounds - TRY. - ep_value = zcl_excel_common=>excel_string_to_date( '2958447' ). - - zcl_excel_common=>assert_differs( - act = ep_value - exp = '99991212' - msg = 'Wrong date conversion' - level = if_aunit_constants=>fatal - ). - - zcl_excel_common=>assert_differs( - act = ep_value - exp = '00000000' - msg = 'Wrong date conversion' - level = if_aunit_constants=>fatal - ). - - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>assert_equals( - act = lx_excel->error - exp = 'Index out of bounds' - msg = 'Wrong exception is thrown' - level = if_aunit_constants=>tolerable - ). - ENDTRY. - ENDMETHOD. "excel_String_To_Date - - - METHOD excel_string_to_time. -* ============================ - DATA ep_value TYPE t. - -* Test 1. Simple test - TRY. - ep_value = zcl_excel_common=>excel_string_to_time( '0' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '000000' - msg = 'Wrong date conversion' - level = if_aunit_constants=>tolerable - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 2. Simple test - TRY. - ep_value = zcl_excel_common=>excel_string_to_time( '1' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '000000' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 3. Simple test - TRY. - ep_value = zcl_excel_common=>excel_string_to_time( '0.99999' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '235959' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 4. Also string greater than 1 should be managed - TRY. - ep_value = zcl_excel_common=>excel_string_to_time( '4.1' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '022400' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 4. string is not a number - TRY. - ep_value = zcl_excel_common=>excel_string_to_time( 'NaN' ). - - zcl_excel_common=>assert_differs( - act = ep_value - exp = '000000' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>assert_equals( - act = lx_excel->error - exp = 'Unable to interpret time' - msg = 'Time should be a valid string' - level = if_aunit_constants=>fatal - ). - ENDTRY. - ENDMETHOD. "excel_String_To_Time - - - METHOD time_to_excel_string. -* ============================ - DATA ep_value TYPE zexcel_cell_value. - -* Test 1. Basic conversion - TRY. - ep_value = zcl_excel_common=>time_to_excel_string( '000001' ). - " A test directly in Excel returns the value 0.0000115740740740741000 - zcl_excel_common=>assert_equals( - act = ep_value - exp = '0.0000115740740741' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 2. Basic conversion - TRY. - ep_value = zcl_excel_common=>time_to_excel_string( '235959' ). - " A test directly in Excel returns the value 0.9999884259259260000000 - zcl_excel_common=>assert_equals( - act = ep_value - exp = '0.9999884259259260' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 3. Initial date - TRY. - ep_value = zcl_excel_common=>time_to_excel_string( '000000' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '0' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - -* Test 2. Basic conversion - TRY. - ep_value = zcl_excel_common=>time_to_excel_string( '022400' ). - - zcl_excel_common=>assert_equals( - act = ep_value - exp = '0.1000000000000000' - msg = 'Wrong date conversion' - level = if_aunit_constants=>critical - ). - CATCH zcx_excel INTO lx_excel. - zcl_excel_common=>fail( - msg = 'unexpected exception' - level = if_aunit_constants=>critical " Error Severity - ). - ENDTRY. - - ENDMETHOD. "time_To_Excel_String - - METHOD split_file. -* ============================ - - DATA: ep_file TYPE text255, - ep_extension TYPE char10, - ep_dotextension TYPE char10. - - -* Test 1. Basic conversion - zcl_excel_common=>split_file( EXPORTING ip_file = 'filename.xml' - IMPORTING ep_file = ep_file - ep_extension = ep_extension - ep_dotextension = ep_dotextension ). - - zcl_excel_common=>assert_equals( - act = ep_file - exp = 'filename' - msg = 'Split filename failed' - level = if_aunit_constants=>critical ). - - zcl_excel_common=>assert_equals( - act = ep_extension - exp = 'xml' - msg = 'Split extension failed' - level = if_aunit_constants=>critical ). - - zcl_excel_common=>assert_equals( - act = ep_dotextension - exp = '.xml' - msg = 'Split extension failed' - level = if_aunit_constants=>critical ). - -* Test 2. no extension - zcl_excel_common=>split_file( EXPORTING ip_file = 'filename' - IMPORTING ep_file = ep_file - ep_extension = ep_extension - ep_dotextension = ep_dotextension ). - - zcl_excel_common=>assert_equals( - act = ep_file - exp = 'filename' - msg = 'Split filename failed' - level = if_aunit_constants=>critical ). - - zcl_excel_common=>assert_equals( - act = ep_extension - exp = '' - msg = 'Split extension failed' - level = if_aunit_constants=>critical ). - - zcl_excel_common=>assert_equals( - act = ep_dotextension - exp = '' - msg = 'Split extension failed' - level = if_aunit_constants=>critical ). - - ENDMETHOD. "split_file - - METHOD convert_range2column_a_row. - DATA: lv_range TYPE string. - DATA: lv_column_start TYPE zexcel_cell_column_alpha, - lv_column_end TYPE zexcel_cell_column_alpha, - lv_row_start TYPE zexcel_cell_row, - lv_row_end TYPE zexcel_cell_row, - lv_sheet TYPE string. - -* a) input empty --> nothing to do - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). - - zcl_excel_common=>assert_equals( - act = lv_column_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_column_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_sheet - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). -* b) sheetname existing - starts with ' example 'Sheet 1'!$B$6:$D$13 - lv_range = `'Sheet 1'!$B$6:$D$13`. - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). - - zcl_excel_common=>assert_equals( - act = lv_column_start - exp = 'B' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_column_end - exp = 'D' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_start - exp = '6' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_end - exp = '13' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_sheet - exp = 'Sheet 1' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). -* c) sheetname existing - does not start with ' example Sheet1!$B$6:$D$13 - lv_range = `Sheet1!B6:$D$13`. - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). - - zcl_excel_common=>assert_equals( - act = lv_column_start - exp = 'B' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_column_end - exp = 'D' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_start - exp = '6' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_end - exp = '13' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_sheet - exp = 'Sheet1' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). -* d) no sheetname - just area example $B$6:$D$13 - lv_range = `$B$6:D13`. - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). - - zcl_excel_common=>assert_equals( - act = lv_column_start - exp = 'B' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_column_end - exp = 'D' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_start - exp = '6' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_row_end - exp = '13' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - zcl_excel_common=>assert_equals( - act = lv_sheet - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - ENDMETHOD. "convert_range2column_a_row - - - METHOD describe_structure. - DATA: ls_test TYPE scarr. - DATA: lo_structdescr TYPE REF TO cl_abap_structdescr. - DATA: lt_structure TYPE ddfields. - FIELD-SYMBOLS: <line> LIKE LINE OF lt_structure. - - " Test with DDIC Type - lo_structdescr ?= cl_abap_structdescr=>describe_by_data( p_data = ls_test ). - lt_structure = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). - READ TABLE lt_structure ASSIGNING <line> INDEX 1. - zcl_excel_common=>assert_equals( - act = <line>-fieldname - exp = 'MANDT' - msg = 'Describe structure failed' - level = if_aunit_constants=>critical ). - - " Test with local defined structure having DDIC and non DDIC elements - TYPES: - BEGIN OF t_test, - carrid TYPE s_carr_id, - carrname TYPE s_carrname, - carrdesc TYPE string, - END OF t_test. - DATA: ls_ttest TYPE t_test. - - lo_structdescr ?= cl_abap_structdescr=>describe_by_data( p_data = ls_ttest ). - lt_structure = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). - READ TABLE lt_structure ASSIGNING <line> INDEX 1. - zcl_excel_common=>assert_equals( - act = <line>-fieldname - exp = 'CARRID' - msg = 'Describe structure failed' - level = if_aunit_constants=>critical ). - - ENDMETHOD. "describe_structure - - - METHOD calculate_cell_distance. - DATA: lv_offset_rows TYPE i, - lv_offset_cols TYPE i, - lv_message TYPE string. - - DEFINE macro_calculate_cell_distance. - zcl_excel_common=>calculate_cell_distance( exporting iv_reference_cell = &1 - iv_current_cell = &2 - importing ev_row_difference = lv_offset_rows - ev_col_difference = lv_offset_cols ). -* Check delta columns - concatenate 'Error calculating column difference in test:' - &1 - '->' - &2 - into lv_message separated by space. - zcl_excel_common=>assert_equals( act = lv_offset_cols - exp = &3 - msg = lv_message - quit = 0 " continue tests - level = if_aunit_constants=>critical ). -* Check delta rows - concatenate 'Error calculating row difference in test:' - &1 - '->' - &2 - into lv_message separated by space. - zcl_excel_common=>assert_equals( act = lv_offset_rows - exp = &4 - msg = lv_message - quit = 0 " continue tests - level = if_aunit_constants=>critical ). - END-OF-DEFINITION. - - - macro_calculate_cell_distance: - 'C12' 'C12' 0 0 , " Same cell - 'C12' 'C13' 0 1 , " Shift down 1 place - 'C12' 'C25' 0 13 , " Shift down some places - 'C12' 'C11' 0 -1 , " Shift up 1 place - 'C12' 'C1' 0 -11 , " Shift up some place - 'C12' 'D12' 1 0 , " Shift right 1 place - 'C12' 'AA12' 24 0 , " Shift right some places - 'C12' 'B12' -1 0 , " Shift left 1 place - 'AA12' 'C12' -24 0 , " Shift left some place - 'AA121' 'C12' -24 -109 . " The full package. - - ENDMETHOD. "CALCULATE_CELL_DISTANCE - - METHOD shift_formula. - DATA: lv_resulting_formula TYPE string, - lv_message TYPE string, - lv_counter TYPE num8. - - DEFINE macro_shift_formula. - add 1 to lv_counter. - clear lv_resulting_formula. - try. - lv_resulting_formula = zcl_excel_common=>shift_formula( iv_reference_formula = &1 - iv_shift_cols = &2 - iv_shift_rows = &3 ). - concatenate 'Wrong result in test' - lv_counter - 'shifting formula ' - &1 - into lv_message separated by space. - zcl_excel_common=>assert_equals( act = lv_resulting_formula - exp = &4 - msg = lv_message - quit = 0 " continue tests - level = if_aunit_constants=>critical ). - catch zcx_excel. - concatenate 'Unexpected exception occurred in test' - lv_counter - 'shifting formula ' - &1 - into lv_message separated by space. - zcl_excel_common=>assert_equals( act = lv_resulting_formula - exp = &4 - msg = lv_message - quit = 0 " continue tests - level = if_aunit_constants=>critical ). - endtry. - END-OF-DEFINITION. - -* Test shifts that should result in a valid output - macro_shift_formula: - 'C17' 0 0 'C17', " Very basic check - 'C17' 2 3 'E20', " Check shift right and down - 'C17' -2 -3 'A14', " Check shift left and up - '$C$17' 1 1 '$C$17', " Fixed columns/rows - 'SUM($C17:C$23)+C30' 1 11 'SUM($C28:D$23)+D41', " Operators and Ranges, mixed fixed rows or columns - 'RNGNAME1+C7' -1 -4 'RNGNAME1+B3', " Operators and Rangename - '"Date:"&TEXT(B2)' 1 1 '"Date:"&TEXT(C3)', " String literals and string concatenation - '[TEST6.XLSX]SHEET1!A1' 1 11 '[TEST6.XLSX]SHEET1!B12', " External sheet reference - `X(B13, "KK" ) ` 1 1 `X(C14,"KK")`, " superflous blanks, multi-argument functions, literals in function, unknown functions -* 'SIN((((((B2))))))' 1 1 'SIN((((((C3))))))', " Deep nesting -* 'SIN(SIN(SIN(SIN(E22))))' 0 1 'SIN(SIN(SIN(SIN(E23))))', " Different type of deep nesting - `SIN(SIN(SIN(SIN(E22))))` 0 1 'SIN(SIN(SIN(SIN(E23))))', " same as above - but with string input instead of Char-input - 'HEUTE()' 2 5 'HEUTE()', " Functions w/o arguments, No cellreferences - '"B2"' 2 5 '"B2"', " No cellreferences - '' 2 5 '', " Empty - 'A1+$A1+A$1+$A$1+B2' -1 0 '#REF!+$A1+#REF!+$A$1+A2', " Referencing error , column only , underflow - 'A1+$A1+A$1+$A$1+B2' 0 -1 '#REF!+#REF!+A$1+$A$1+B1', " Referencing error , row only , underflow - 'A1+$A1+A$1+$A$1+B2' -1 -1 '#REF!+#REF!+#REF!+$A$1+A1'. " Referencing error , row and column , underflow - ENDMETHOD. "SHIFT_FORMULA - - METHOD is_cell_in_range. - DATA ep_cell_in_range TYPE abap_bool. - -* Test 1: upper left corner (in range) - TRY. - ep_cell_in_range = zcl_excel_common=>is_cell_in_range( - ip_column = 'B' - ip_row = 2 - ip_range = 'B2:D4' ). - - zcl_excel_common=>assert_equals( - act = ep_cell_in_range - exp = abap_true - msg = 'Check cell in range failed' - level = if_aunit_constants=>critical ). - CATCH zcx_excel. - zcl_excel_common=>fail( - msg = 'Unexpected exception' - level = if_aunit_constants=>critical ). - ENDTRY. - -* Test 2: lower right corner (in range) - TRY. - ep_cell_in_range = zcl_excel_common=>is_cell_in_range( - ip_column = 'D' - ip_row = 4 - ip_range = 'B2:D4' ). - - zcl_excel_common=>assert_equals( - act = ep_cell_in_range - exp = abap_true - msg = 'Check cell in range failed' - level = if_aunit_constants=>critical ). - CATCH zcx_excel. - zcl_excel_common=>fail( - msg = 'Unexpected exception' - level = if_aunit_constants=>critical ). - ENDTRY. - -* Test 3: left side (out of range) - TRY. - ep_cell_in_range = zcl_excel_common=>is_cell_in_range( - ip_column = 'A' - ip_row = 3 - ip_range = 'B2:D4' ). - - zcl_excel_common=>assert_equals( - act = ep_cell_in_range - exp = abap_false - msg = 'Check cell in range failed' - level = if_aunit_constants=>critical ). - CATCH zcx_excel. - zcl_excel_common=>fail( - msg = 'Unexpected exception' - level = if_aunit_constants=>critical ). - ENDTRY. - -* Test 4: upper side (out of range) - TRY. - ep_cell_in_range = zcl_excel_common=>is_cell_in_range( - ip_column = 'C' - ip_row = 1 - ip_range = 'B2:D4' ). - - zcl_excel_common=>assert_equals( - act = ep_cell_in_range - exp = abap_false - msg = 'Check cell in range failed' - level = if_aunit_constants=>critical ). - CATCH zcx_excel. - zcl_excel_common=>fail( - msg = 'Unexpected exception' - level = if_aunit_constants=>critical ). - ENDTRY. - -* Test 5: right side (out of range) - TRY. - ep_cell_in_range = zcl_excel_common=>is_cell_in_range( - ip_column = 'E' - ip_row = 3 - ip_range = 'B2:D4' ). - - zcl_excel_common=>assert_equals( - act = ep_cell_in_range - exp = abap_false - msg = 'Check cell in range failed' - level = if_aunit_constants=>critical ). - CATCH zcx_excel. - zcl_excel_common=>fail( - msg = 'Unexpected exception' - level = if_aunit_constants=>critical ). - ENDTRY. - -* Test 6: lower side (out of range) - TRY. - ep_cell_in_range = zcl_excel_common=>is_cell_in_range( - ip_column = 'C' - ip_row = 5 - ip_range = 'B2:D4' ). - - zcl_excel_common=>assert_equals( - act = ep_cell_in_range - exp = abap_false - msg = 'Check cell in range failed' - level = if_aunit_constants=>critical ). - CATCH zcx_excel. - zcl_excel_common=>fail( - msg = 'Unexpected exception' - level = if_aunit_constants=>critical ). - ENDTRY. - ENDMETHOD. - -ENDCLASS. "lcl_Excel_Common_Test - - - - - - - - - - - - - - - - ABAP - - - - - - - - - - - - - - - - - - method ASSERT_DIFFERS. - DATA: ls_seoclass TYPE seoclass. - -" Let see >=7.02 - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'CL_ABAP_UNIT_ASSERT'. - - IF sy-subrc = 0. - CALL METHOD (ls_seoclass-clsname)=>assert_differs - EXPORTING - exp = exp - act = act - msg = msg - level = level - tol = tol - quit = quit - RECEIVING - assertion_failed = assertion_failed. - ELSE. -" Let see >=7.00 or even lower - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'CL_AUNIT_ASSERT'. - - IF sy-subrc = 0. - CALL METHOD (ls_seoclass-clsname)=>assert_differs - EXPORTING - exp = exp - act = act - msg = msg - level = level - tol = tol - quit = quit - RECEIVING - assertion_failed = assertion_failed. - ELSE. -* We do nothing for now not supported - ENDIF. - ENDIF. -endmethod. - - - - - - - - - - - METHOD assert_equals. - DATA: ls_seoclass TYPE seoclass. - - " Let see >=7.02 - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'CL_ABAP_UNIT_ASSERT'. - - IF sy-subrc = 0. - CALL METHOD (ls_seoclass-clsname)=>assert_equals - EXPORTING - exp = exp - act = act - msg = msg - level = level - tol = tol - quit = quit - ignore_hash_sequence = ignore_hash_sequence - RECEIVING - assertion_failed = assertion_failed. - ELSE. - " Let see >=7.00 or even lower - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'CL_AUNIT_ASSERT'. - - IF sy-subrc = 0. - CALL METHOD (ls_seoclass-clsname)=>assert_equals - EXPORTING - exp = exp - act = act - msg = msg - level = level - tol = tol - quit = quit - ignore_hash_sequence = ignore_hash_sequence - RECEIVING - assertion_failed = assertion_failed. - ELSE. -* We do nothing for now not supported - ENDIF. - ENDIF. -ENDMETHOD. - - - - - - - - METHOD calculate_cell_distance. - - DATA: lv_reference_row TYPE i, - lv_reference_col_alpha TYPE zexcel_cell_column_alpha, - lv_reference_col TYPE i, - lv_current_row TYPE i, - lv_current_col_alpha TYPE zexcel_cell_column_alpha, - lv_current_col TYPE i. - -*--------------------------------------------------------------------* -* Split reference cell into numerical row/column representation -*--------------------------------------------------------------------* - convert_columnrow2column_a_row( EXPORTING - i_columnrow = iv_reference_cell - IMPORTING - e_column = lv_reference_col_alpha - e_row = lv_reference_row ). - lv_reference_col = convert_column2int( lv_reference_col_alpha ). - -*--------------------------------------------------------------------* -* Split current cell into numerical row/column representation -*--------------------------------------------------------------------* - convert_columnrow2column_a_row( EXPORTING - i_columnrow = iv_current_cell - IMPORTING - e_column = lv_current_col_alpha - e_row = lv_current_row ). - lv_current_col = convert_column2int( lv_current_col_alpha ). - -*--------------------------------------------------------------------* -* Calculate row and column difference -* Positive: Current cell below reference cell -* or Current cell right of reference cell -* Negative: Current cell above reference cell -* or Current cell left of reference cell -*--------------------------------------------------------------------* - ev_row_difference = lv_current_row - lv_reference_row. - ev_col_difference = lv_current_col - lv_reference_col. - -ENDMETHOD. - - - - - method CHAR2HEX. - - IF o_conv IS NOT BOUND. - o_conv = cl_abap_conv_out_ce=>create( endian = 'L' - ignore_cerr = abap_true - replacement = '#' ). - ENDIF. - - CALL METHOD o_conv->reset( ). - CALL METHOD o_conv->write( data = i_char ). - r_hex+1 = o_conv->get_buffer( ). " x'65' must be x'0065' - -endmethod. - - - - - - METHOD convert_column2alpha. - - DATA: lv_uccpi TYPE i, - lv_text TYPE sychar02, - lv_module TYPE int4, - lv_column TYPE zexcel_cell_column. - -* Propagate zcx_excel if error occurs " issue #155 - less restrictive typing for ip_column - lv_column = convert_column2int( ip_column ). " issue #155 - less restrictive typing for ip_column - -*--------------------------------------------------------------------* -* Check whether column is in allowed range for EXCEL to handle ( 1-16384 ) -*--------------------------------------------------------------------* - IF lv_column > 16384 - OR lv_column < 1. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Index out of bounds'. - ENDIF. - -*--------------------------------------------------------------------* -* Build alpha representation of column -*--------------------------------------------------------------------* - WHILE lv_column GT 0. - - lv_module = ( lv_column - 1 ) MOD 26. - lv_uccpi = 65 + lv_module. - - lv_column = ( lv_column - lv_module ) / 26. - - lv_text = cl_abap_conv_in_ce=>uccpi( lv_uccpi ). - CONCATENATE lv_text ep_column INTO ep_column. - - ENDWHILE. - -ENDMETHOD. - - - - - - METHOD convert_column2int. - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-12-29 -* - ... -* changes: renaming variables to naming conventions -* removing unused variables -* removing commented out code that is inactive for more then half a year -* message made to support multilinguality -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* -* issue#246 - error converting lower case column names -* - Stefan Schmöcker, 2012-12-29 -* changes: translating the correct variable to upper dase -* adding missing exception if input is a number -* that is out of bounds -* adding missing exception if input contains -* illegal characters like german umlauts -*--------------------------------------------------------------------* - - DATA: lv_column TYPE zexcel_cell_column_alpha, - lv_column_c TYPE char10, - lv_column_s TYPE string, - lv_errormessage TYPE string, " Can't pass '...'(abc) to exception-class - lv_modulo TYPE i. - -*--------------------------------------------------------------------* -* This module tries to identify which column a user wants to access -* Numbers as input are just passed back, anything else will be converted -* using EXCEL nomenclatura A = 1, AA = 27, ..., XFD = 16384 -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* Normalize input ( upper case , no gaps ) -*--------------------------------------------------------------------* - lv_column_c = ip_column. -* TRANSLATE lv_column TO UPPER CASE. " Fix #246 - TRANSLATE lv_column_c TO UPPER CASE. " Fix #246 - CONDENSE lv_column_c NO-GAPS. - IF lv_column_c EQ ''. -* lv_errormessage = 'Unable to interpret input as column'(003). -* RAISE EXCEPTION TYPE zcx_excel -* EXPORTING -* error = lv_errormessage. - MESSAGE e800(zabap2xlsx) INTO lv_errormessage. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - syst_at_raise = syst. - ENDIF. - -*--------------------------------------------------------------------* -* If a number gets passed, just convert it to an integer and return -* the converted value -*--------------------------------------------------------------------* - TRY. - IF lv_column_c CO '1234567890 '. " Fix #164 - ep_column = lv_column_c. " Fix #164 -*--------------------------------------------------------------------* -* Maximum column for EXCEL: XFD = 16384 " if anyone has a reference for this information - please add here instead of this comment -*--------------------------------------------------------------------* - IF ep_column > 16384 OR ep_column < 1. - lv_errormessage = 'Index out of bounds'(004). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - EXIT. - ENDIF. - CATCH cx_sy_conversion_no_number. "#EC NO_HANDLER - " Try the character-approach if approach via number has failed - ENDTRY. - -*--------------------------------------------------------------------* -* Raise error if unexpected characters turns up -*--------------------------------------------------------------------* - lv_column_s = lv_column_c. - IF lv_column_s CN sy-abcde. -* lv_errormessage = 'Unable to interpret input as column'(003). -* RAISE EXCEPTION TYPE zcx_excel -* EXPORTING -* error = lv_errormessage. - MESSAGE e800(zabap2xlsx) INTO lv_errormessage. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - syst_at_raise = syst. - ENDIF. - -*--------------------------------------------------------------------* -* Interpret input as number to base 26 with A=1, ... Z=26 -* Raise error if unexpected character turns up -*--------------------------------------------------------------------* -* 1st character -*--------------------------------------------------------------------* - lv_column = lv_column_c. - lv_modulo = cl_abap_conv_out_ce=>uccpi( lv_column+0(1) ) MOD zcl_excel_common=>c_excel_col_module. - IF lv_modulo < 1 OR lv_modulo > 26. -* lv_errormessage = 'Unable to interpret input as column'(003). -* RAISE EXCEPTION TYPE zcx_excel -* EXPORTING -* error = lv_errormessage. - MESSAGE e800(zabap2xlsx) INTO lv_errormessage. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - syst_at_raise = syst. - ENDIF. - ep_column = lv_modulo. " Leftmost digit - -*--------------------------------------------------------------------* -* 2nd character if present -*--------------------------------------------------------------------* - CHECK lv_column+1(1) IS NOT INITIAL. " No need to continue if string ended - lv_modulo = cl_abap_conv_out_ce=>uccpi( lv_column+1(1) ) MOD zcl_excel_common=>c_excel_col_module. - IF lv_modulo < 1 OR lv_modulo > 26. -* lv_errormessage = 'Unable to interpret input as column'(003). -* RAISE EXCEPTION TYPE zcx_excel -* EXPORTING -* error = lv_errormessage. - MESSAGE e800(zabap2xlsx) INTO lv_errormessage. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - syst_at_raise = syst. - ENDIF. - ep_column = 26 * ep_column + lv_modulo. " if second digit is present first digit is for 26^1 - -*--------------------------------------------------------------------* -* 3rd character if present -*--------------------------------------------------------------------* - CHECK lv_column+2(1) IS NOT INITIAL. " No need to continue if string ended - lv_modulo = cl_abap_conv_out_ce=>uccpi( lv_column+2(1) ) MOD zcl_excel_common=>c_excel_col_module. - IF lv_modulo < 1 OR lv_modulo > 26. -* lv_errormessage = 'Unable to interpret input as column'(003). -* RAISE EXCEPTION TYPE zcx_excel -* EXPORTING -* error = lv_errormessage. - MESSAGE e800(zabap2xlsx) INTO lv_errormessage. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - syst_at_raise = syst. - ENDIF. - ep_column = 26 * ep_column + lv_modulo. " if third digit is present first digit is for 26^2 and second digit for 26^1 - -*--------------------------------------------------------------------* -* Maximum column for EXCEL: XFD = 16384 " if anyone has a reference for this information - please add here instead of this comment -*--------------------------------------------------------------------* - IF ep_column > 16384 OR ep_column < 1. - lv_errormessage = 'Index out of bounds'(004). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - -ENDMETHOD. - - - - - - method CONVERT_COLUMNROW2COLUMN_A_ROW. -*--------------------------------------------------------------------* - "issue #256 - replacing char processing with regex -*--------------------------------------------------------------------* -* Stefan Schmöcker, 2013-08-11 -* Allow input to be CLIKE instead of STRING -*--------------------------------------------------------------------* - - DATA: pane_cell_row_a TYPE string, - lv_columnrow type string. - - lv_columnrow = i_columnrow. " Get rid of trailing blanks - - FIND REGEX '^(\D+)(\d+)$' IN lv_columnrow SUBMATCHES e_column - pane_cell_row_a. - e_row = pane_cell_row_a. - -endmethod. - - - - - - - - - - method CONVERT_RANGE2COLUMN_A_ROW. -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-12-07 -* - ... -* changes: renaming variables to naming conventions -* aligning code -* added exceptionclass -* added errorhandling for invalid range -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* -* issue#241 - error when sheetname contains "!" -* - sheetname should be returned unescaped -* - Stefan Schmöcker, 2012-12-07 -* changes: changed coding to support sheetnames with "!" -* unescaping sheetname -*--------------------------------------------------------------------* -* issue#155 - lessening restrictions of input parameters -* - Stefan Schmöcker, 2012-12-07 -* changes: i_range changed to clike -* e_sheet changed to clike -*--------------------------------------------------------------------* - - DATA: lv_sheet TYPE string, - lv_range TYPE string, - lv_columnrow_start TYPE string, - lv_columnrow_end TYPE string, - lv_errormessage TYPE string. " Can't pass '...'(abc) to exception-class - - -*--------------------------------------------------------------------* -* Split input range into sheetname and Area -* 4 cases - a) input empty --> nothing to do -* - b) sheetname existing - starts with ' example 'Sheet 1'!$B$6:$D$13 -* - c) sheetname existing - does not start with ' example Sheet1!$B$6:$D$13 -* - d) no sheetname - just area example $B$6:$D$13 -*--------------------------------------------------------------------* -* Initialize output parameters - CLEAR: e_column_start, - e_column_end, - e_row_start, - e_row_end, - e_sheet. - - IF i_range IS INITIAL. " a) input empty --> nothing to do - EXIT. - - ELSEIF i_range(1) = `'`. " b) sheetname existing - starts with ' - FIND REGEX '\![^\!]*$' IN i_range MATCH OFFSET sy-fdpos. " Find last ! - IF sy-subrc = 0. - lv_sheet = i_range(sy-fdpos). - ADD 1 TO sy-fdpos. - lv_range = i_range. - SHIFT lv_range LEFT BY sy-fdpos PLACES. - ELSE. - lv_errormessage = 'Invalid range'(001). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - ELSEIF i_range CS '!'. " c) sheetname existing - does not start with ' - SPLIT i_range AT '!' INTO lv_sheet lv_range. - - ELSE. " d) no sheetname - just area - lv_range = i_range. - ENDIF. - - REPLACE ALL OCCURRENCES OF '$' IN lv_range WITH ''. - SPLIT lv_range AT ':' INTO lv_columnrow_start lv_columnrow_end. - - convert_columnrow2column_a_row( EXPORTING - i_columnrow = lv_columnrow_start - IMPORTING - e_column = e_column_start - e_row = e_row_start ). - convert_columnrow2column_a_row( EXPORTING - i_columnrow = lv_columnrow_end - IMPORTING - e_column = e_column_end - e_row = e_row_end ). - - e_sheet = unescape_string( lv_sheet ). " Return in unescaped form -endmethod. - - - - - method DATE_TO_EXCEL_STRING. - DATA: lv_date_diff TYPE i. - - CHECK ip_value IS NOT INITIAL. - " Needed hack caused by the problem that: - " Excel 2000 incorrectly assumes that the year 1900 is a leap year - " http://support.microsoft.com/kb/214326/en-us - IF ip_value > c_excel_1900_leap_year. - lv_date_diff = ip_value - c_excel_baseline_date + 2. - ELSE. - lv_date_diff = ip_value - c_excel_baseline_date + 1. - ENDIF. - ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_date_diff ). -endmethod. - - - - - method DESCRIBE_STRUCTURE. - DATA: lt_components TYPE abap_component_tab, - lt_comps TYPE abap_component_tab, - lo_struct TYPE REF TO cl_abap_structdescr, - ls_component TYPE abap_componentdescr, - lo_elemdescr TYPE REF TO cl_abap_elemdescr, - ls_dfies TYPE dfies, - l_position TYPE tabfdpos. - - "for DDIC structure get the info directly - IF io_struct->is_ddic_type( ) = abap_true. - rt_dfies = io_struct->get_ddic_field_list( ). - ELSE. - lt_components = io_struct->get_components( ). - - LOOP AT lt_components INTO ls_component. - structure_case( EXPORTING is_component = ls_component - CHANGING xt_components = lt_comps ) . - ENDLOOP. - LOOP AT lt_comps INTO ls_component. - CLEAR ls_dfies. - IF ls_component-type->kind = cl_abap_typedescr=>kind_elem. "E Elementary Type - ADD 1 TO l_position. - lo_elemdescr ?= ls_component-type. - IF lo_elemdescr->is_ddic_type( ) = abap_true. - ls_dfies = lo_elemdescr->get_ddic_field( ). - ls_dfies-fieldname = ls_component-name. - ls_dfies-position = l_position. - ELSE. - ls_dfies-fieldname = ls_component-name. - ls_dfies-position = l_position. - ls_dfies-inttype = lo_elemdescr->type_kind. - ls_dfies-leng = lo_elemdescr->length. - ls_dfies-outputlen = lo_elemdescr->length. - ls_dfies-decimals = lo_elemdescr->decimals. - ls_dfies-fieldtext = ls_component-name. - ls_dfies-reptext = ls_component-name. - ls_dfies-scrtext_s = ls_component-name. - ls_dfies-scrtext_m = ls_component-name. - ls_dfies-scrtext_l = ls_component-name. - ls_dfies-dynpfld = abap_true. - ENDIF. - INSERT ls_dfies INTO TABLE rt_dfies. - ENDIF. - ENDLOOP. - ENDIF. -endmethod. - - - - - - - - METHOD determine_resulting_formula. - - DATA: lv_row_difference TYPE i, - lv_col_difference TYPE i. - -*--------------------------------------------------------------------* -* Calculate distance of reference and current cell -*--------------------------------------------------------------------* - calculate_cell_distance( EXPORTING - iv_reference_cell = iv_reference_cell - iv_current_cell = iv_current_cell - IMPORTING - ev_row_difference = lv_row_difference - ev_col_difference = lv_col_difference ). - -*--------------------------------------------------------------------* -* and shift formula by using the row- and columndistance -*--------------------------------------------------------------------* - ev_resulting_formula = shift_formula( iv_reference_formula = iv_reference_formula - iv_shift_rows = lv_row_difference - iv_shift_cols = lv_col_difference ). - -ENDMETHOD. "determine_resulting_formula - - - - - method ENCRYPT_PASSWORD. - - DATA lv_curr_offset TYPE i. - DATA lv_curr_char TYPE c LENGTH 1. - DATA lv_curr_hex TYPE zexcel_pwd_hash. - DATA lv_pwd_len TYPE zexcel_pwd_hash. - DATA lv_pwd_hash TYPE zexcel_pwd_hash. - - CONSTANTS: - lv_0x7fff TYPE zexcel_pwd_hash VALUE '7FFF', - lv_0x0001 TYPE zexcel_pwd_hash VALUE '0001', - lv_0xce4b TYPE zexcel_pwd_hash VALUE 'CE4B'. - - DATA lv_pwd TYPE zexcel_aes_password. - - lv_pwd = i_pwd(15). - - lv_pwd_len = STRLEN( lv_pwd ). - lv_curr_offset = lv_pwd_len - 1. - - WHILE lv_curr_offset GE 0. - - lv_curr_char = lv_pwd+lv_curr_offset(1). - lv_curr_hex = char2hex( lv_curr_char ). - - lv_pwd_hash = ( shr14( lv_pwd_hash ) BIT-AND lv_0x0001 ) BIT-OR ( shl01( lv_pwd_hash ) BIT-AND lv_0x7fff ). - - lv_pwd_hash = lv_pwd_hash BIT-XOR lv_curr_hex. - SUBTRACT 1 FROM lv_curr_offset. - ENDWHILE. - - lv_pwd_hash = ( shr14( lv_pwd_hash ) BIT-AND lv_0x0001 ) BIT-OR ( shl01( lv_pwd_hash ) BIT-AND lv_0x7fff ). - lv_pwd_hash = lv_pwd_hash BIT-XOR lv_0xce4b. - lv_pwd_hash = lv_pwd_hash BIT-XOR lv_pwd_len. - - WRITE lv_pwd_hash TO r_encrypted_pwd. - -endmethod. - - - - - method ESCAPE_STRING. -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-12-08 -* - ... -* changes: aligning code -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* -* issue#242 - Support escaping for white-spaces -* - Escaping also necessary when ' encountered in input -* - Stefan Schmöcker, 2012-12-08 -* changes: switched check if escaping is necessary to regular expression -* and moved the "REPLACE" -*--------------------------------------------------------------------* -* issue#155 - lessening restrictions of input parameters -* - Stefan Schmöcker, 2012-12-08 -* changes: ip_value changed to clike -*--------------------------------------------------------------------* - DATA: lv_value TYPE string. - -*--------------------------------------------------------------------* -* There exist various situations when a space will be used to separate -* different parts of a string. When we have a string consisting spaces -* that will cause errors unless we "escape" the string by putting ' at -* the beginning and at the end of the string. -*--------------------------------------------------------------------* - - -*--------------------------------------------------------------------* -* When allowing clike-input parameters we might encounter trailing -* "real" blanks . These are automatically eliminated when moving -* the input parameter to a string. -* Now any remaining spaces ( white-spaces or normal spaces ) should -* trigger the escaping as well as any ' -*--------------------------------------------------------------------* - lv_value = ip_value. - - - FIND REGEX `\s|'` IN lv_value. " \s finds regular and white spaces - IF sy-subrc = 0. - REPLACE ALL OCCURRENCES OF `'` IN lv_value WITH `''`. - CONCATENATE `'` lv_value `'` INTO lv_value . - ENDIF. - - ep_escaped_value = lv_value. - -endmethod. - - - - - - method EXCEL_STRING_TO_DATE. - DATA: lv_date_int TYPE i. - - TRY. - lv_date_int = ip_value. - ep_value = lv_date_int + c_excel_baseline_date - 2. - " Needed hack caused by the problem that: - " Excel 2000 incorrectly assumes that the year 1900 is a leap year - " http://support.microsoft.com/kb/214326/en-us - IF ep_value < c_excel_1900_leap_year. - ep_value = ep_value + 1. - ENDIF. - CATCH cx_sy_conversion_error. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Index out of bounds'. - ENDTRY. -endmethod. - - - - - - method EXCEL_STRING_TO_TIME. - DATA: lv_seconds_in_day TYPE i, - lv_day_fraction TYPE f, - lc_seconds_in_day TYPE i VALUE 86400. - - TRY. - - lv_day_fraction = ip_value. - lv_seconds_in_day = lv_day_fraction * lc_seconds_in_day. - - ep_value = lv_seconds_in_day. - - CATCH cx_sy_conversion_error. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Unable to interpret time'. - ENDTRY. -endmethod. - - - - - - - method FAIL. - DATA: ls_seoclass TYPE seoclass. - - " Let see >=7.02 - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'CL_ABAP_UNIT_ASSERT'. - - IF sy-subrc = 0. - CALL METHOD (ls_seoclass-clsname)=>fail - EXPORTING - msg = msg - level = level - quit = quit - detail = detail. - ELSE. - " Let see >=7.00 or even lower - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'CL_AUNIT_ASSERT'. - - IF sy-subrc = 0. - CALL METHOD (ls_seoclass-clsname)=>fail - EXPORTING - msg = msg - level = level - quit = quit - detail = detail. - ELSE. -* We do nothing for now not supported - ENDIF. - ENDIF. - -endmethod. - - - - - method GET_FIELDCATALOG. - DATA: lr_dref_tab TYPE REF TO data, - lo_salv_table TYPE REF TO cl_salv_table, - lo_salv_columns_table TYPE REF TO cl_salv_columns_table, - lt_salv_t_column_ref TYPE salv_t_column_ref, - ls_salv_t_column_ref LIKE LINE OF lt_salv_t_column_ref, - lo_salv_column_table TYPE REF TO cl_salv_column_table. - - FIELD-SYMBOLS: <tab> TYPE STANDARD TABLE. - FIELD-SYMBOLS: <fcat> LIKE LINE OF ep_fieldcatalog. - -* Get copy of IP_TABLE-structure <-- must be changeable to create salv - CREATE DATA lr_dref_tab LIKE ip_table. - ASSIGN lr_dref_tab->* TO <tab>. -* Create salv --> implicitly create fieldcat - TRY. - cl_salv_table=>factory( IMPORTING - r_salv_table = lo_salv_table - CHANGING - t_table = <tab> ). - lo_salv_columns_table = lo_salv_table->get_columns( ). - lt_salv_t_column_ref = lo_salv_columns_table->get( ). - CATCH cx_root. -* maybe some errorhandling here - just haven't made up my mind yet - ENDTRY. - -* Loop through columns and set relevant fields ( fieldname, texts ) - LOOP AT lt_salv_t_column_ref INTO ls_salv_t_column_ref. - - lo_salv_column_table ?= ls_salv_t_column_ref-r_column. - APPEND INITIAL LINE TO ep_fieldcatalog ASSIGNING <fcat>. - <fcat>-position = sy-tabix. - <fcat>-fieldname = ls_salv_t_column_ref-columnname. - <fcat>-scrtext_s = ls_salv_t_column_ref-r_column->get_short_text( ). - <fcat>-scrtext_m = ls_salv_t_column_ref-r_column->get_medium_text( ). - <fcat>-scrtext_l = ls_salv_t_column_ref-r_column->get_long_text( ). - - <fcat>-dynpfld = 'X'. " What in the world would we exclude here? - IF <fcat>-position = 1. " except for the MANDT-field of most tables ( 1st column that is ) - IF lo_salv_column_table->get_ddic_datatype( ) = 'CLNT'. - CLEAR <fcat>-dynpfld. - ENDIF. - ENDIF. - -* For fields that don't a description ( i.e. defined by "field type i," ) -* just use the fieldname as description - that is better than nothing - IF <fcat>-scrtext_s IS INITIAL - AND <fcat>-scrtext_m IS INITIAL - AND <fcat>-scrtext_l IS INITIAL. - CONCATENATE 'Col:' <fcat>-fieldname INTO <fcat>-scrtext_l SEPARATED BY space. - <fcat>-scrtext_m = <fcat>-scrtext_l. - <fcat>-scrtext_s = <fcat>-scrtext_l. - ENDIF. - - ENDLOOP. - -endmethod. - - - - - - - - method IS_CELL_IN_RANGE. - DATA lv_column_start TYPE zexcel_cell_column_alpha. - DATA lv_column_end TYPE zexcel_cell_column_alpha. - DATA lv_row_start TYPE zexcel_cell_row. - DATA lv_row_end TYPE zexcel_cell_row. - DATA lv_column_start_i TYPE zexcel_cell_column. - DATA lv_column_end_i TYPE zexcel_cell_column. - DATA lv_column_i TYPE zexcel_cell_column. - - -* Split range and convert columns - convert_range2column_a_row( - exporting - i_range = ip_range - IMPORTING - e_column_start = lv_column_start - e_column_end = lv_column_end - e_row_start = lv_row_start - e_row_end = lv_row_end ). - - lv_column_start_i = convert_column2int( ip_column = lv_column_start ). - lv_column_end_i = convert_column2int( ip_column = lv_column_end ). - - lv_column_i = convert_column2int( ip_column = ip_column ). - -* Check if cell is in range - IF lv_column_i >= lv_column_start_i AND - lv_column_i <= lv_column_end_i AND - ip_row >= lv_row_start AND - ip_row <= lv_row_end. - rp_in_range = abap_true. - ENDIF. -endmethod. - - - - - method NUMBER_TO_EXCEL_STRING. - DATA: lv_value_c TYPE c LENGTH 100. - - WRITE ip_value TO lv_value_c EXPONENT 0 NO-GROUPING NO-SIGN. - REPLACE ALL OCCURRENCES OF ',' IN lv_value_c WITH '.'. - - ep_value = lv_value_c. - CONDENSE ep_value. - - IF ip_value < 0. - CONCATENATE '-' ep_value INTO ep_value. - ELSEIF ip_value EQ 0. - ep_value = '0'. - ENDIF. -endmethod. - - - - - - method RECURSIVE_CLASS_TO_STRUCT. - " # issue 139 -* is working for me - but after looking through this coding I guess -* I'll rewrite this to a version w/o recursion -* This is private an no one using it so far except me, so no need to hurry - DATA: descr TYPE REF TO cl_abap_structdescr, - wa_component LIKE LINE OF descr->components, - attribute_name TYPE fieldname, - flag_class TYPE flag, - o_border TYPE REF TO zcl_excel_style_border. - - FIELD-SYMBOLS: <field> TYPE any, - <fieldx> TYPE any, - <class> TYPE REF TO object, - <attribute> TYPE any. - - - descr ?= cl_abap_structdescr=>describe_by_data( e_target ). - - LOOP AT descr->components INTO wa_component. - -* Assign structure and X-structure - ASSIGN COMPONENT wa_component-name OF STRUCTURE e_target TO <field>. - ASSIGN COMPONENT wa_component-name OF STRUCTURE e_targetx TO <fieldx>. -* At least one field in the structure should be marked - otherwise continue with next field - CLEAR flag_class. -* maybe source is just a structure - try assign component... - ASSIGN COMPONENT wa_component-name OF STRUCTURE i_source TO <attribute>. - IF sy-subrc <> 0. -* not - then it is an attribute of the class - use different assign then - CONCATENATE 'i_source->' wa_component-name INTO attribute_name. - ASSIGN (attribute_name) TO <attribute>. - IF sy-subrc <> 0. - EXIT. - ENDIF. " Should not happen if structure is built properly - otherwise just exit to create no dumps - flag_class = abap_true. - ENDIF. - - CASE wa_component-type_kind. - WHEN cl_abap_structdescr=>typekind_struct1 OR cl_abap_structdescr=>typekind_struct2. " Structure --> use recursio -* IF flag_class = abap_true. -** Only borders will be passed as unbound references. But since we want to set a value we have to create an instance -* ENDIF. - zcl_excel_common=>recursive_class_to_struct( EXPORTING i_source = <attribute> - CHANGING e_target = <field> - e_targetx = <fieldx> ). - WHEN OTHERS. - <field> = <attribute>. - <fieldx> = abap_true. - - ENDCASE. - ENDLOOP. - -endmethod. - - - - - - method RECURSIVE_STRUCT_TO_CLASS. - " # issue 139 -* is working for me - but after looking through this coding I guess -* I'll rewrite this to a version w/o recursion -* This is private an no one using it so far except me, so no need to hurry - DATA: descr TYPE REF TO cl_abap_structdescr, - wa_component LIKE LINE OF descr->components, - attribute_name TYPE fieldname, - flag_class TYPE flag, - o_border TYPE REF TO zcl_excel_style_border. - - FIELD-SYMBOLS: <field> TYPE any, - <fieldx> TYPE any, - <class> TYPE REF TO object, - <attribute> TYPE any, - <attribute_s> TYPE ANY TABLE. - - - descr ?= cl_abap_structdescr=>describe_by_data( i_source ). - - LOOP AT descr->components INTO wa_component. - -* Assign structure and X-structure - ASSIGN COMPONENT wa_component-name OF STRUCTURE i_source TO <field>. - ASSIGN COMPONENT wa_component-name OF STRUCTURE i_sourcex TO <fieldx>. -* At least one field in the structure should be marked - otherwise continue with next field - CHECK <fieldx> CA abap_true. - CLEAR flag_class. -* maybe target is just a structure - try assign component... - ASSIGN COMPONENT wa_component-name OF STRUCTURE e_target TO <attribute>. - IF sy-subrc <> 0. -* not - then it is an attribute of the class - use different assign then - CONCATENATE 'E_TARGET->' wa_component-name INTO attribute_name. - ASSIGN (attribute_name) TO <attribute>. - IF sy-subrc <> 0.EXIT.ENDIF. " Should not happen if structure is built properly - otherwise just exit to create no dumps - flag_class = abap_true. - ENDIF. - - CASE wa_component-type_kind. - WHEN cl_abap_structdescr=>typekind_struct1 OR cl_abap_structdescr=>typekind_struct2. " Structure --> use recursion - IF flag_class = abap_true AND <attribute> IS INITIAL. -* Only borders will be passed as unbound references. But since we want to set a value we have to create an instance - CREATE OBJECT o_border. - <attribute> = o_border. - ENDIF. - zcl_excel_common=>recursive_struct_to_class( EXPORTING i_source = <field> - i_sourcex = <fieldx> - CHANGING e_target = <attribute> ). -* WHEN cl_abap_structdescr=>typekind_struct2. " String -* CHECK <fieldx> = abap_true. " Marked for change -* <attribute_s> = <field>. - WHEN OTHERS. - CHECK <fieldx> = abap_true. " Marked for change - <attribute> = <field>. - - ENDCASE. - ENDLOOP. - -endmethod. - - - - - - - - METHOD shift_formula. - - CONSTANTS: lcv_operators TYPE string VALUE '+-/*^%=<>&, !', - lcv_letters TYPE string VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ$', - lcv_digits TYPE string VALUE '0123456789', - lcv_cell_reference_error TYPE string VALUE '#REF!'. - - DATA: lv_tcnt TYPE i, " Counter variable - lv_tlen TYPE i, " Temp variable length - lv_cnt TYPE i, " Counter variable - lv_cnt2 TYPE i, " Counter variable - lv_offset1 TYPE i, " Character offset - lv_numchars TYPE i, " Number of characters counter - lv_tchar(1) TYPE c, " Temp character - lv_tchar2(1) TYPE c, " Temp character - lv_cur_form(132) TYPE c, " Formula for current cell - lv_ref_cell_addr TYPE string, " Reference cell address - lv_tcol1 TYPE string, " Temp column letter - lv_tcol2 TYPE string, " Temp column letter - lv_tcoln TYPE i, " Temp column number - lv_trow1 TYPE string, " Temp row number - lv_trow2 TYPE string, " Temp row number - lv_flen TYPE i, " Length of reference formula - lv_tlen2 TYPE i, " Temp variable length - lv_substr1 TYPE string, " Substring variable - lv_abscol TYPE string, " Absolute column symbol - lv_absrow TYPE string, " Absolute row symbol - - lv_errormessage TYPE string. - - FIELD-SYMBOLS: <find_my_include> TYPE ANY. - -*--------------------------------------------------------------------* -* When copying a cell in EXCEL to another cell any inherent formulas -* are copied as well. Cell-references in the formula are being adjusted -* by the distance of the new cell to the original one -*--------------------------------------------------------------------* -* §1 Parse reference formula character by character -* §2 Identify Cell-references -* §3 Shift cell-reference -* §4 Build resulting formula -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* No distance --> Reference = resulting cell/formula -*--------------------------------------------------------------------* - IF iv_shift_cols = 0 - AND iv_shift_rows = 0. - ev_resulting_formula = iv_reference_formula. - EXIT. " done - ENDIF. - - - lv_flen = STRLEN( iv_reference_formula ). - lv_numchars = 1. - -*--------------------------------------------------------------------* -* §1 Parse reference formula character by character -*--------------------------------------------------------------------* - DO lv_flen TIMES. - - CLEAR: lv_tchar, - lv_substr1, - lv_ref_cell_addr. - lv_cnt2 = lv_cnt + 1. - IF lv_cnt2 > lv_flen. - EXIT. " Done - ENDIF. - -*--------------------------------------------------------------------* -* Here we have the current character in the formula -*--------------------------------------------------------------------* - lv_tchar = iv_reference_formula+lv_cnt(1). - -*--------------------------------------------------------------------* -* Operators or opening parenthesis will separate possible cellreferences -*--------------------------------------------------------------------* - IF ( lv_tchar CA lcv_operators - OR lv_tchar CA '(' ) - AND lv_cnt2 = 1. - lv_substr1 = iv_reference_formula+lv_offset1(1). - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_numchars = 1. - CONTINUE. " --> next character in formula can be analyzed - ENDIF. - -*--------------------------------------------------------------------* -* Quoted literal text holds no cell reference --> advance to end of text -*--------------------------------------------------------------------* - IF lv_tchar EQ '"'. - lv_cnt = lv_cnt + 1. - lv_numchars = lv_numchars + 1. - lv_tchar = iv_reference_formula+lv_cnt(1). - WHILE lv_tchar NE '"'. - - lv_cnt = lv_cnt + 1. - lv_numchars = lv_numchars + 1. - lv_tchar = iv_reference_formula+lv_cnt(1). - - ENDWHILE. - lv_cnt2 = lv_cnt + 1. - lv_substr1 = iv_reference_formula+lv_offset1(lv_numchars). - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - IF lv_cnt = lv_flen. - EXIT. - ENDIF. - lv_offset1 = lv_cnt. - lv_numchars = 1. - lv_tchar = iv_reference_formula+lv_cnt(1). - lv_cnt2 = lv_cnt + 1. - CONTINUE. " --> next character in formula can be analyzed - ENDIF. - - -*--------------------------------------------------------------------* -* Operators or parenthesis or last character in formula will separate possible cellreferences -*--------------------------------------------------------------------* - IF lv_tchar CA lcv_operators - OR lv_tchar CA '():' - OR lv_cnt2 = lv_flen. - IF lv_cnt > 0. - lv_substr1 = iv_reference_formula+lv_offset1(lv_numchars). -*--------------------------------------------------------------------* -* Check for text concatenation and functions -*--------------------------------------------------------------------* - IF ( lv_tchar CA lcv_operators AND lv_tchar EQ lv_substr1 ) OR lv_tchar EQ '('. - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_cnt2 = lv_cnt + 1. - lv_numchars = 1. - CONTINUE. " --> next character in formula can be analyzed - ENDIF. - - lv_tlen = lv_cnt2 - lv_offset1. -*--------------------------------------------------------------------* -* Exclude mathematical operators and closing parentheses -*--------------------------------------------------------------------* - IF lv_tchar CA lcv_operators - OR lv_tchar CA ':)'. - IF lv_cnt2 = lv_flen - AND lv_numchars = 1. - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_cnt2 = lv_cnt + 1. - lv_numchars = 1. - CONTINUE. " --> next character in formula can be analyzed - ELSE. - lv_tlen = lv_tlen - 1. - ENDIF. - ENDIF. -*--------------------------------------------------------------------* -* Capture reference cell address -*--------------------------------------------------------------------* - TRY. - MOVE: iv_reference_formula+lv_offset1(lv_tlen) TO lv_ref_cell_addr. "Ref cell address - CATCH cx_root. - lv_errormessage = 'Internal error in Class ZCL_EXCEL_COMMON Method SHIFT_FORMULA Spot 1 '. " Change to messageclass if possible - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDTRY. - -*--------------------------------------------------------------------* -* Split cell address into characters and numbers -*--------------------------------------------------------------------* - CLEAR: lv_tlen, - lv_tcnt, - lv_tcol1, - lv_trow1. - lv_tlen = STRLEN( lv_ref_cell_addr ). - IF lv_tlen <> 0. - CLEAR: lv_tcnt. - DO lv_tlen TIMES. - CLEAR: lv_tchar2. - lv_tchar2 = lv_ref_cell_addr+lv_tcnt(1). - IF lv_tchar2 CA lcv_letters. - CONCATENATE lv_tcol1 lv_tchar2 INTO lv_tcol1. - ELSEIF lv_tchar2 CA lcv_digits. - CONCATENATE lv_trow1 lv_tchar2 INTO lv_trow1. - ENDIF. - lv_tcnt = lv_tcnt + 1. - ENDDO. - ENDIF. -*--------------------------------------------------------------------* -* Check for invalid cell address -*--------------------------------------------------------------------* - IF lv_tcol1 IS INITIAL OR lv_trow1 IS INITIAL. - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_cnt2 = lv_cnt + 1. - lv_numchars = 1. - CONTINUE. - ENDIF. -*--------------------------------------------------------------------* -* Check for range names -*--------------------------------------------------------------------* - CLEAR: lv_tlen. - lv_tlen = STRLEN( lv_tcol1 ). - IF lv_tlen GT 3. - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_cnt2 = lv_cnt + 1. - lv_numchars = 1. - CONTINUE. - ENDIF. -*--------------------------------------------------------------------* -* Check for valid row -*--------------------------------------------------------------------* - IF lv_trow1 GT 1048576. - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_cnt2 = lv_cnt + 1. - lv_numchars = 1. - CONTINUE. - ENDIF. -*--------------------------------------------------------------------* -* Check for absolute column or row reference -*--------------------------------------------------------------------* - CLEAR: lv_tcol2, - lv_trow2, - lv_abscol, - lv_absrow. - lv_tlen2 = STRLEN( lv_tcol1 ) - 1. - IF lv_tcol1 IS NOT INITIAL. - lv_abscol = lv_tcol1(1). - ENDIF. - IF lv_tlen2 GE 0. - lv_absrow = lv_tcol1+lv_tlen2(1). - ENDIF. - IF lv_abscol EQ '$' AND lv_absrow EQ '$'. - lv_tlen2 = lv_tlen2 - 1. - IF lv_tlen2 > 0. - lv_tcol1 = lv_tcol1+1(lv_tlen2). - ENDIF. - lv_tlen2 = lv_tlen2 + 1. - ELSEIF lv_abscol EQ '$'. - lv_tcol1 = lv_tcol1+1(lv_tlen2). - ELSEIF lv_absrow EQ '$'. - lv_tcol1 = lv_tcol1(lv_tlen2). - ENDIF. -*--------------------------------------------------------------------* -* Check for valid column -*--------------------------------------------------------------------* - TRY. - lv_tcoln = zcl_excel_common=>convert_column2int( lv_tcol1 ) + iv_shift_cols. - CATCH zcx_excel. - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_cnt2 = lv_cnt + 1. - lv_numchars = 1. - CONTINUE. - ENDTRY. -*--------------------------------------------------------------------* -* Check whether there is a referencing problem -*--------------------------------------------------------------------* - lv_trow2 = lv_trow1 + iv_shift_rows. - IF ( lv_tcoln < 1 AND lv_abscol <> '$' ) " Maybe we should add here max-column and max row-tests as well. - OR ( lv_trow2 < 1 AND lv_absrow <> '$' ). " Check how EXCEL behaves in this case -*--------------------------------------------------------------------* -* Referencing problem encountered --> set error -*--------------------------------------------------------------------* - CONCATENATE lv_cur_form lcv_cell_reference_error INTO lv_cur_form. - ELSE. -*--------------------------------------------------------------------* -* No referencing problems --> adjust row and column -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* Adjust column -*--------------------------------------------------------------------* - IF lv_abscol EQ '$'. - CONCATENATE lv_cur_form lv_abscol lv_tcol1 INTO lv_cur_form. - ELSEIF iv_shift_cols EQ 0. - CONCATENATE lv_cur_form lv_tcol1 INTO lv_cur_form. - ELSE. - TRY. - lv_tcol2 = zcl_excel_common=>convert_column2alpha( lv_tcoln ). - CONCATENATE lv_cur_form lv_tcol2 INTO lv_cur_form. - CATCH zcx_excel. - CONCATENATE lv_cur_form lv_substr1 INTO lv_cur_form. - lv_cnt = lv_cnt + 1. - lv_offset1 = lv_cnt. - lv_cnt2 = lv_cnt + 1. - lv_numchars = 1. - CONTINUE. - ENDTRY. - ENDIF. -*--------------------------------------------------------------------* -* Adjust row -*--------------------------------------------------------------------* - IF lv_absrow EQ '$'. - CONCATENATE lv_cur_form lv_absrow lv_trow1 INTO lv_cur_form. - ELSEIF iv_shift_rows = 0. - CONCATENATE lv_cur_form lv_trow1 INTO lv_cur_form. -* elseif lv_trow2 < 1. -* CONCATENATE lv_cur_form lc_cell_reference_error INTO lv_cur_form. - ELSE. - CONCATENATE lv_cur_form lv_trow2 INTO lv_cur_form. - ENDIF. - ENDIF. - - lv_numchars = 0. - IF lv_tchar CA lcv_operators - OR lv_tchar CA ':)'. - CONCATENATE lv_cur_form lv_tchar INTO lv_cur_form. - ENDIF. - lv_offset1 = lv_cnt2. - ENDIF. - ENDIF. - lv_numchars = lv_numchars + 1. - lv_cnt = lv_cnt + 1. - lv_cnt2 = lv_cnt + 1. - - ENDDO. - - - -*--------------------------------------------------------------------* -* Return resulting formula -*--------------------------------------------------------------------* - IF lv_cur_form IS NOT INITIAL. - MOVE lv_cur_form TO ev_resulting_formula. - ENDIF. - -ENDMETHOD. - - - - - method SHL01. - - DATA: - lv_bit TYPE i, - lv_curr_pos TYPE i VALUE 2, - lv_prev_pos TYPE i VALUE 1. - - DO 15 TIMES. - GET BIT lv_curr_pos OF i_pwd_hash INTO lv_bit. - SET BIT lv_prev_pos OF r_pwd_hash TO lv_bit. - ADD 1 TO lv_curr_pos. - ADD 1 TO lv_prev_pos. - ENDDO. - SET BIT 16 OF r_pwd_hash TO 0. - -endmethod. - - - - - method SHR14. - - DATA: - lv_bit TYPE i, - lv_curr_pos TYPE i, - lv_next_pos TYPE i. - - r_pwd_hash = i_pwd_hash. - - DO 14 TIMES. - lv_curr_pos = 15. - lv_next_pos = 16. - - DO 15 TIMES. - GET BIT lv_curr_pos OF r_pwd_hash INTO lv_bit. - SET BIT lv_next_pos OF r_pwd_hash TO lv_bit. - SUBTRACT 1 FROM lv_curr_pos. - SUBTRACT 1 FROM lv_next_pos. - ENDDO. - SET BIT 1 OF r_pwd_hash TO 0. - ENDDO. - -endmethod. - - - - - - - method SPLIT_FILE. - - DATA: lt_hlp TYPE TABLE OF text255, - ls_hlp TYPE text255. - - DATA: lf_ext(10) TYPE c, - lf_dot_ext(10) TYPE c. - DATA: lf_str TYPE text255, - lf_anz TYPE i, - lf_len TYPE i. -** --------------------------------------------------------------------- - - CLEAR: lt_hlp, - ep_file, - ep_extension, - ep_dotextension. - -** Split the whole file at '.' - SPLIT ip_file AT '.' INTO TABLE lt_hlp. - -** get the extenstion from the last line of table - DESCRIBE TABLE lt_hlp LINES lf_anz. - IF lf_anz <= 1. - ep_file = ip_file. - EXIT. - ENDIF. - - READ TABLE lt_hlp INTO ls_hlp INDEX lf_anz. - ep_extension = ls_hlp. - lf_ext = ls_hlp. - IF NOT lf_ext IS INITIAL. - CONCATENATE '.' lf_ext INTO lf_dot_ext. - ENDIF. - ep_dotextension = lf_dot_ext. - -** get only the filename - lf_len = strlen( ip_file ) - strlen( lf_dot_ext ). - IF lf_len > 0. - ep_file = ip_file(lf_len). - ENDIF. - -endmethod. - - - - - method STRUCTURE_CASE. - DATA: lt_comp_str TYPE abap_component_tab. - - CASE is_component-type->kind. - WHEN cl_abap_typedescr=>kind_elem. "E Elementary Type - INSERT is_component INTO TABLE xt_components. - WHEN cl_abap_typedescr=>kind_table. "T Table - INSERT is_component INTO TABLE xt_components. - WHEN cl_abap_typedescr=>kind_struct. "S Structure - lt_comp_str = structure_recursive( is_component = is_component ). - INSERT LINES OF lt_comp_str INTO TABLE xt_components. - WHEN OTHERS. "cl_abap_typedescr=>kind_ref or cl_abap_typedescr=>kind_class or cl_abap_typedescr=>kind_intf. -* We skip it. for now. - ENDCASE. -endmethod. - - - - - method STRUCTURE_RECURSIVE. - DATA: lo_struct TYPE REF TO cl_abap_structdescr, - lt_components TYPE abap_component_tab, - ls_components TYPE abap_componentdescr. - - REFRESH rt_components. - - lo_struct ?= is_component-type. - lt_components = lo_struct->get_components( ). - - LOOP AT lt_components INTO ls_components. - structure_case( EXPORTING is_component = ls_components - CHANGING xt_components = rt_components ) . - ENDLOOP. - -endmethod. - - - - - method TIME_TO_EXCEL_STRING. - DATA: lv_seconds_in_day TYPE i, - lv_day_fraction TYPE f, - lc_time_baseline TYPE t VALUE '000000', - lc_seconds_in_day TYPE i VALUE 86400. - - lv_seconds_in_day = ip_value - lc_time_baseline. - lv_day_fraction = lv_seconds_in_day / lc_seconds_in_day. - ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_day_fraction ). -endmethod. - - - - - - method UNESCAPE_STRING. - - CONSTANTS lcv_regex TYPE string VALUE `^'[^']` & `|` & " Beginning single ' OR - `[^']'$` & `|` & " Trailing single ' OR - `[^']'[^']`. " Single ' somewhere in between - - - DATA: lv_errormessage TYPE string. " Can't pass '...'(abc) to exception-class - -*--------------------------------------------------------------------* -* This method is used to extract the "real" string from an escaped string. -* An escaped string can be identified by a beginning ' which must be -* accompanied by a trailing ' -* All '' in between beginning and trailing ' are treated as single ' -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* When allowing clike-input parameters we might encounter trailing -* "real" blanks . These are automatically eliminated when moving -* the input parameter to a string. -*--------------------------------------------------------------------* - ev_unescaped_string = iv_escaped. " Pass through if not escaped - - CHECK ev_unescaped_string IS NOT INITIAL. " Nothing to do if empty - CHECK ev_unescaped_string(1) = `'`. " Nothing to do if not escaped - -*--------------------------------------------------------------------* -* Remove leading and trailing ' -*--------------------------------------------------------------------* - REPLACE REGEX `^'(.*)'$` IN ev_unescaped_string WITH '$1'. - IF sy-subrc <> 0. - lv_errormessage = 'Input not properly escaped - &'(002). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - -*--------------------------------------------------------------------* -* Any remaining single ' should not be here -*--------------------------------------------------------------------* - FIND REGEX lcv_regex IN ev_unescaped_string. - IF sy-subrc = 0. - lv_errormessage = 'Input not properly escaped - &'(002). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - -*--------------------------------------------------------------------* -* Replace '' with ' -*--------------------------------------------------------------------* - REPLACE ALL OCCURRENCES OF `''` IN ev_unescaped_string WITH `'`. - - -endmethod. - - - - - - - - - - - - - - - - - - - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - TYPES: BEGIN OF t_relationship, - id TYPE string, - type TYPE string, - target TYPE string, - END OF t_relationship. - -* - CLASS lcl_abap_zip_archive DEFINITION - INHERITING FROM lcl_zip_archive - CREATE PRIVATE. - PUBLIC SECTION. - CLASS-METHODS create - IMPORTING i_data TYPE xstring - RETURNING value(r_zip) TYPE REF TO lcl_zip_archive - RAISING zcx_excel. - METHODS read REDEFINITION. - PRIVATE SECTION. - DATA: abap_zip TYPE REF TO cl_abap_zip. - METHODS constructor IMPORTING i_data TYPE xstring - RAISING zcx_excel. - ENDCLASS. "lcl_abap_zip_archive DEFINITION - -* - CLASS lcl_alternate_zip_archive DEFINITION - INHERITING FROM lcl_zip_archive - CREATE PRIVATE. - PUBLIC SECTION. - CLASS-METHODS create - IMPORTING i_data TYPE xstring - i_alternate_zip_class TYPE seoclsname - RETURNING value(r_zip) TYPE REF TO lcl_zip_archive - RAISING zcx_excel. - METHODS read REDEFINITION. - PRIVATE SECTION. - DATA: alternate_zip TYPE REF TO object. - METHODS constructor - IMPORTING i_data TYPE xstring - i_alternate_zip_class TYPE seoclsname - RAISING zcx_excel. - ENDCLASS. "lcl_alternate_zip_archive DEFINITION - -* - CLASS lcl_abap_zip_archive IMPLEMENTATION. - METHOD create. - CREATE OBJECT r_zip TYPE lcl_abap_zip_archive - EXPORTING - i_data = i_data. - ENDMETHOD. "create - METHOD constructor. - DATA: lv_errormessage TYPE string. - super->constructor( ). - CREATE OBJECT abap_zip. - abap_zip->load( - EXPORTING - zip = i_data - EXCEPTIONS - zip_parse_error = 1 - OTHERS = 2 ). - IF sy-subrc <> 0. - lv_errormessage = 'ZIP parse error'(002). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - ENDMETHOD. "constructor - METHOD read. - DATA: lv_errormessage TYPE string. - CALL METHOD abap_zip->get - EXPORTING - name = i_filename - IMPORTING - content = r_content - EXCEPTIONS - zip_index_error = 1 - zip_decompression_error = 2 - OTHERS = 3. - IF sy-subrc <> 0. - lv_errormessage = 'File not found in zip-archive'(003). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - ENDMETHOD. "read - ENDCLASS. "lcl_abap_zip_archive IMPLEMENTATION - -* - CLASS lcl_alternate_zip_archive IMPLEMENTATION. - METHOD create. - CREATE OBJECT r_zip TYPE lcl_alternate_zip_archive - EXPORTING - i_alternate_zip_class = i_alternate_zip_class - i_data = i_data. - ENDMETHOD. "create - METHOD constructor. - DATA: lv_errormessage TYPE string. - super->constructor( ). - CREATE OBJECT alternate_zip TYPE (i_alternate_zip_class). - TRY. - CALL METHOD alternate_zip->('LOAD') - EXPORTING - zip = i_data - EXCEPTIONS - zip_parse_error = 1 - OTHERS = 2. - CATCH cx_sy_dyn_call_illegal_method. - lv_errormessage = 'Method LOAD missing in alternative zipclass'. "#EC NOTEXT This is a workaround until class CL_ABAP_ZIP is fixed - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDTRY. - - IF sy-subrc <> 0. - lv_errormessage = 'ZIP parse error'(002). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - ENDMETHOD. "constructor - METHOD read. - DATA: lv_errormessage TYPE string. - TRY. - CALL METHOD alternate_zip->('GET') - EXPORTING - name = i_filename - IMPORTING - content = r_content " Contents - EXCEPTIONS - zip_index_error = 1 - zip_decompression_error = 2 - OTHERS = 3. - CATCH cx_sy_dyn_call_illegal_method. - lv_errormessage = 'Method GET missing in alternative zipclass'. "#EC NOTEXT This is a workaround until class CL_ABAP_ZIP is fixed - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDTRY. - IF sy-subrc <> 0. - lv_errormessage = 'File not found in zip-archive'(003). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - ENDMETHOD. "read - ENDCLASS. "lcl_alternate_zip_archive IMPLEMENTATION - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - -* -class lcl_zip_archive definition abstract. - public section. - methods read abstract - importing i_filename type csequence - returning value(r_content) type xstring " Remember copy-on-write! - raising zcx_excel. -endclass. - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - IXML - - - - - - METHOD zif_excel_reader~load. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 Map Document Properties to ZCL_EXCEL -*--------------------------------------------------------------------* - - CONSTANTS: lcv_core_properties TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', - lcv_office_document TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument'. - - DATA: lo_rels TYPE REF TO if_ixml_document, - lo_node TYPE REF TO if_ixml_element, - ls_relationship TYPE t_relationship. - -*--------------------------------------------------------------------* -* §1 Create EXCEL-Object we want to return to caller - -* §2 We need to read the the file "\\_rels\.rels" because it tells -* us where in this folder structure the data for the workbook -* is located in the xlsx zip-archive -* -* The xlsx Zip-archive has generally the following folder structure: -* <root> | -* |--> _rels -* |--> doc_Props -* |--> xl | -* |--> _rels -* |--> theme -* |--> worksheets - -* §3 Extracting from this the path&file where the workbook is located -* Following is an example how this file could be set up -* <?xml version="1.0" encoding="UTF-8" standalone="true"?> -* <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> -* <Relationship Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Id="rId3"/> -* <Relationship Target="docProps/core.xml" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Id="rId2"/> -* <Relationship Target="xl/workbook.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Id="rId1"/> -* </Relationships> -*--------------------------------------------------------------------* - - -*--------------------------------------------------------------------* -* §1 Create EXCEL-Object we want to return to caller -*--------------------------------------------------------------------* - CREATE OBJECT r_excel. - - zip = create_zip_archive( i_xlsx_binary = i_excel2007 - i_use_alternate_zip = i_use_alternate_zip ). - -*--------------------------------------------------------------------* -* §2 Get file in folderstructure -*--------------------------------------------------------------------* - lo_rels = get_ixml_from_zip_archive( '_rels/.rels' ). - -*--------------------------------------------------------------------* -* §3 Cycle through the Relationship Tags and use the ones we need -*--------------------------------------------------------------------* - lo_node ?= lo_rels->find_from_name( 'Relationship' ). "#EC NOTEXT - WHILE lo_node IS BOUND. - - fill_struct_from_attributes( EXPORTING - ip_element = lo_node - CHANGING - cp_structure = ls_relationship ). - CASE ls_relationship-type. - - WHEN lcv_office_document. -*--------------------------------------------------------------------* -* Parse workbook - main part here -*--------------------------------------------------------------------* - load_workbook( iv_workbook_full_filename = ls_relationship-target - io_excel = r_excel ). - - WHEN lcv_core_properties. - " 2do§1 Map Document Properties to ZCL_EXCEL - - WHEN OTHERS. - - ENDCASE. - lo_node ?= lo_node->get_next( ). - - ENDWHILE. - - -ENDMETHOD. - - - METHOD zif_excel_reader~load_file. - - DATA: lv_excel_data TYPE xstring. - -*--------------------------------------------------------------------* -* Read file into binary string -*--------------------------------------------------------------------* - IF i_from_applserver = abap_true. - lv_excel_data = read_from_applserver( i_filename ). - ELSE. - lv_excel_data = read_from_local_file( i_filename ). - ENDIF. - -*--------------------------------------------------------------------* -* Parse Excel data into ZCL_EXCEL object from binary string -*--------------------------------------------------------------------* - r_excel = zif_excel_reader~load( i_excel2007 = lv_excel_data - i_use_alternate_zip = i_use_alternate_zip ). - -ENDMETHOD. - - - - - - - METHOD create_zip_archive. - CASE i_use_alternate_zip. - WHEN space. - e_zip = lcl_abap_zip_archive=>create( i_xlsx_binary ). - WHEN OTHERS. - e_zip = lcl_alternate_zip_archive=>create( i_data = i_xlsx_binary - i_alternate_zip_class = i_use_alternate_zip ). - ENDCASE. -ENDMETHOD. - - - - - method fill_struct_from_attributes. -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-07 -* - ... -* changes: renaming variables to naming conventions -* aligning code -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* - - data: lv_name type string, - lo_attributes type ref to if_ixml_named_node_map, - lo_attribute type ref to if_ixml_attribute, - lo_iterator type ref to if_ixml_node_iterator. - - field-symbols: <component> type any. - -*--------------------------------------------------------------------* -* The values of named attributes of a tag are being read and moved into corresponding -* fields of given structure -* Behaves like move-corresonding tag to structure - -* Example: -* <Relationship Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Id="rId3"/> -* Here the attributes are Target, Type and Id. Thus if the passed -* structure has fieldnames Id and Target these would be filled with -* "rId3" and "docProps/app.xml" respectively -*--------------------------------------------------------------------* - clear cp_structure. - - lo_attributes = ip_element->get_attributes( ). - lo_iterator = lo_attributes->create_iterator( ). - lo_attribute ?= lo_iterator->get_next( ). - while lo_attribute is bound. - - lv_name = lo_attribute->get_name( ). - translate lv_name to upper case. - assign component lv_name of structure cp_structure to <component>. - if sy-subrc = 0. - <component> = lo_attribute->get_value( ). - endif. - lo_attribute ?= lo_iterator->get_next( ). - - endwhile. - - -endmethod. - - - - - - METHOD get_from_zip_archive. - - ASSERT zip IS BOUND. " zip object has to exist at this point - - r_content = zip->read( i_filename ). - -ENDMETHOD. - - - - - - - METHOD get_ixml_from_zip_archive. - - DATA: lv_content TYPE xstring, - lo_ixml TYPE REF TO if_ixml, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_istream TYPE REF TO if_ixml_istream, - lo_parser TYPE REF TO if_ixml_parser. - -*--------------------------------------------------------------------* -* Load XML file from archive into an input stream, -* and parse that stream into an ixml object -*--------------------------------------------------------------------* - lv_content = me->get_from_zip_archive( i_filename ). - lo_ixml = cl_ixml=>create( ). - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_istream = lo_streamfactory->create_istream_xstring( lv_content ). - r_ixml = lo_ixml->create_document( ). - lo_parser = lo_ixml->create_parser( stream_factory = lo_streamfactory - istream = lo_istream - document = r_ixml ). - lo_parser->set_normalizing( is_normalizing ). - lo_parser->set_validating( mode = if_ixml_parser=>co_no_validation ). - lo_parser->parse( ). - -ENDMETHOD. - - - - - - 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 'true', - lc_xml_attr_true_int TYPE string VALUE '1'. - CONSTANTS: lc_rel_chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', - lc_rel_image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'. - - 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->find_from_name( name = 'from' namespace = 'xdr' ). - CHECK node IS NOT INITIAL. - node2 ?= node->find_from_name( name = 'col' namespace = 'xdr' ). - ls_upper-col = node2->get_value( ). - node2 ?= node->find_from_name( name = 'row' namespace = 'xdr' ). - ls_upper-row = node2->get_value( ). - node2 ?= node->find_from_name( name = 'colOff' namespace = 'xdr' ). - ls_upper-col_offset = node2->get_value( ). - node2 ?= node->find_from_name( name = 'rowOff' namespace = 'xdr' ). - ls_upper-row_offset = node2->get_value( ). - - node ?= io_anchor_element->find_from_name( name = 'ext' namespace = 'xdr' ). - IF node IS INITIAL. - CLEAR ls_size. - ELSE. - me->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->find_from_name( name = 'to' namespace = 'xdr' ). - IF node IS INITIAL. - CLEAR ls_lower. - ELSE. - node2 ?= node->find_from_name( name = 'col' namespace = 'xdr' ). - ls_lower-col = node2->get_value( ). - node2 ?= node->find_from_name( name = 'row' namespace = 'xdr' ). - ls_lower-row = node2->get_value( ). - node2 ?= node->find_from_name( name = 'colOff' namespace = 'xdr' ). - ls_lower-col_offset = node2->get_value( ). - node2 ?= node->find_from_name( name = 'rowOff' namespace = 'xdr' ). - ls_lower-row_offset = node2->get_value( ). - ENDIF. - - node ?= io_anchor_element->find_from_name( name = 'pic' namespace = 'xdr' ). - IF node IS NOT INITIAL. - node2 ?= node->find_from_name( name = 'nvPicPr' namespace = 'xdr' ). - CHECK node2 IS NOT INITIAL. - node3 ?= node2->find_from_name( name = 'cNvPr' namespace = 'xdr' ). - CHECK node3 IS NOT INITIAL. - me->fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = cnvpr ). - lv_title = cnvpr-name. - - node2 ?= node->find_from_name( name = 'blipFill' namespace = 'xdr' ). - CHECK node2 IS NOT INITIAL. - node3 ?= node2->find_from_name( name = 'blip' namespace = 'a' ). - CHECK node3 IS NOT INITIAL. - me->fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = blip ). - lv_relation_id = blip-embed. - - drawing_type = zcl_excel_drawing=>type_image. - ENDIF. - - node ?= io_anchor_element->find_from_name( name = 'graphicFrame' namespace = 'xdr' ). - IF node IS NOT INITIAL. - node2 ?= node->find_from_name( name = 'nvGraphicFramePr' namespace = 'xdr' ). - CHECK node2 IS NOT INITIAL. - node3 ?= node2->find_from_name( name = 'cNvPr' namespace = 'xdr' ). - CHECK node3 IS NOT INITIAL. - me->fill_struct_from_attributes( EXPORTING ip_element = node3 CHANGING cp_structure = cnvpr ). - lv_title = cnvpr-name. - - node2 ?= node->find_from_name( name = 'graphic' namespace = 'a' ). - CHECK node2 IS NOT INITIAL. - node3 ?= node2->find_from_name( name = 'graphicData' namespace = 'a' ). - CHECK node3 IS NOT INITIAL. - node4 ?= node2->find_from_name( name = 'chart' namespace = 'c' ). - CHECK node4 IS NOT INITIAL. - me->fill_struct_from_attributes( EXPORTING ip_element = node4 CHANGING cp_structure = chart ). - lv_relation_id = chart-id. - - drawing_type = zcl_excel_drawing=>type_chart. - ENDIF. - - lo_drawing = io_worksheet->excel->add_new_drawing( - ip_type = drawing_type - ip_title = lv_title ). - io_worksheet->add_drawing( lo_drawing ). - - lo_drawing->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->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 ). - - if drawing_type = zcl_excel_drawing=>type_chart. - "-------------Added by Alessandro Iannacci - Should load chart attributes - lo_drawing->load_chart_attributes( rel_drawing-content_xml ). - endif. - - endmethod. - - - - - method LOAD_SHARED_STRINGS. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 Support partial formatting of strings in cells -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-11 -* - ... -* changes: renaming variables to naming conventions -* renaming variables to indicate what they are used for -* aligning code -* adding comments to explain what we are trying to achieve -* rewriting code for better readibility -*--------------------------------------------------------------------* - - - - DATA: - lo_shared_strings_xml TYPE REF TO if_ixml_document, - lo_node_si TYPE REF TO if_ixml_element, - lo_node_si_child TYPE REF TO if_ixml_element, - lo_node_r_child_t TYPE REF TO if_ixml_element, - lv_tag_name TYPE string, - lv_node_value TYPE string. - - FIELD-SYMBOLS: <lv_shared_string> LIKE LINE OF me->shared_strings. - -*--------------------------------------------------------------------* - -* §1 Parse shared strings file and get into internal table -* So far I have encountered 2 ways how a string can be represented in the shared strings file -* §1.1 - "simple" strings -* §1.2 - rich text formatted strings - -* Following is an example how this file could be set up; 2 strings in simple formatting, 3rd string rich textformatted - - -* <?xml version="1.0" encoding="UTF-8" standalone="true"?> -* <sst uniqueCount="6" count="6" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> -* <si> -* <t>This is a teststring 1</t> -* </si> -* <si> -* <t>This is a teststring 2</t> -* </si> -* <si> -* <r> -* <t>T</t> -* </r> -* <r> -* <rPr> -* <sz val="11"/> -* <color rgb="FFFF0000"/> -* <rFont val="Calibri"/> -* <family val="2"/> -* <scheme val="minor"/> -* </rPr> -* <t xml:space="preserve">his is a </t> -* </r> -* <r> -* <rPr> -* <sz val="11"/> -* <color theme="1"/> -* <rFont val="Calibri"/> -* <family val="2"/> -* <scheme val="minor"/> -* </rPr> -* <t>teststring 3</t> -* </r> -* </si> -* </sst> -*--------------------------------------------------------------------* - - lo_shared_strings_xml = me->get_ixml_from_zip_archive( i_filename = ip_path - is_normalizing = space ). " NO!!! normalizing - otherwise leading blanks will be omitted and that is not really desired for the stringtable - lo_node_si ?= lo_shared_strings_xml->find_from_name( 'si' ). - WHILE lo_node_si IS BOUND. - - APPEND INITIAL LINE TO me->shared_strings ASSIGNING <lv_shared_string>. " Each <si>-entry in the xml-file must lead to an entry in our stringtable - lo_node_si_child ?= lo_node_si->get_first_child( ). - IF lo_node_si_child IS BOUND. - lv_tag_name = lo_node_si_child->get_name( ). - IF lv_tag_name = 't'. -*--------------------------------------------------------------------* -* §1.1 - "simple" strings -* Example: see above -*--------------------------------------------------------------------* - <lv_shared_string> = lo_node_si_child->get_value( ). - ELSE. -*--------------------------------------------------------------------* -* §1.2 - rich text formatted strings -* it is sufficient to strip the <t>...</t> tag from each <r>-tag and concatenate these -* as long as rich text formatting is not supported (2do§1) ignore all info about formatting -* Example: see above -*--------------------------------------------------------------------* - WHILE lo_node_si_child IS BOUND. " actually these children of <si> are <r>-tags - - lo_node_r_child_t ?= lo_node_si_child->find_from_name( 't' ). " extract the <t>...</t> part of each <r>-tag - IF lo_node_r_child_t IS BOUND. - lv_node_value = lo_node_r_child_t->get_value( ). - CONCATENATE <lv_shared_string> lv_node_value INTO <lv_shared_string> RESPECTING BLANKS. - ENDIF. - - lo_node_si_child ?= lo_node_si_child->get_next( ). - - ENDWHILE. - ENDIF. - ENDIF. - - lo_node_si ?= lo_node_si->get_next( ). - ENDWHILE. - - endmethod. - - - - - - method LOAD_STYLES. - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (wip ) 2012-11-25 -* - ... -* changes: renaming variables and types to naming conventions -* aligning code -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* - TYPES: BEGIN OF lty_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 lty_xf. - - TYPES: BEGIN OF lty_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 lty_alignment. - - TYPES: BEGIN OF lty_protection, - hidden TYPE string, - locked TYPE string, - END OF lty_protection. - - DATA: lo_styles_xml TYPE REF TO if_ixml_document, - lo_style TYPE REF TO zcl_excel_style, - - lt_num_formats TYPE t_num_formats, - lt_fills TYPE t_fills, - lt_borders TYPE t_borders, - lt_fonts TYPE t_fonts, - - ls_num_format TYPE t_num_format, - ls_fill TYPE REF TO zcl_excel_style_fill, - ls_cell_border TYPE REF TO zcl_excel_style_borders, - ls_font TYPE REF TO zcl_excel_style_font, - - lo_node_cellxfs TYPE REF TO if_ixml_element, - lo_node_cellxfs_xf TYPE REF TO if_ixml_element, - lo_node_cellxfs_xf_alignment TYPE REF TO if_ixml_element, - lo_node_cellxfs_xf_protection TYPE REF TO if_ixml_element, - - lo_nodes_xf TYPE REF TO if_ixml_node_collection, - lo_iterator_cellxfs TYPE REF TO if_ixml_node_iterator, - - ls_xf TYPE lty_xf, - ls_alignment TYPE lty_alignment, - ls_protection TYPE lty_protection, - lv_index TYPE i. - -*--------------------------------------------------------------------* -* To build a complete style that fully describes how a cell looks like -* we need the various parts -* §1 - Numberformat -* §2 - Fillstyle -* §3 - Borders -* §4 - Font -* §5 - Alignment -* §6 - Protection - -* Following is an example how this part of a file could be set up -* ... -* parts with various formatinformation - see §1,§2,§3,§4 -* ... -* <cellXfs count="26"> -* <xf numFmtId="0" borderId="0" fillId="0" fontId="0" xfId="0"/> -* <xf numFmtId="0" borderId="0" fillId="2" fontId="0" xfId="0" applyFill="1"/> -* <xf numFmtId="0" borderId="1" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> -* <xf numFmtId="0" borderId="2" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> -* <xf numFmtId="0" borderId="3" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> -* <xf numFmtId="0" borderId="4" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> -* <xf numFmtId="0" borderId="0" fillId="3" fontId="0" xfId="0" applyFill="1" applyBorder="1"/> -* ... -* </cellXfs> -*--------------------------------------------------------------------* - - lo_styles_xml = me->get_ixml_from_zip_archive( ip_path ). - -*--------------------------------------------------------------------* -* The styles are build up from -* §1 number formats -* §2 fill styles -* §3 border styles -* §4 fonts -* These need to be read before we can try to build up a complete -* style that describes the look of a cell -*--------------------------------------------------------------------* - lt_num_formats = load_style_num_formats( lo_styles_xml ). " §1 - lt_fills = load_style_fills( lo_styles_xml ). " §2 - lt_borders = load_style_borders( lo_styles_xml ). " §3 - lt_fonts = load_style_fonts( lo_styles_xml ). " §4 - -*--------------------------------------------------------------------* -* Now everything is prepared to build a "full" style -*--------------------------------------------------------------------* - lo_node_cellxfs = lo_styles_xml->find_from_name( name = 'cellXfs' ). - IF lo_node_cellxfs IS BOUND. - lo_nodes_xf = lo_node_cellxfs->get_elements_by_tag_name( name = 'xf' ). - lo_iterator_cellxfs = lo_nodes_xf->create_iterator( ). - lo_node_cellxfs_xf ?= lo_iterator_cellxfs->get_next( ). - WHILE lo_node_cellxfs_xf IS BOUND. - - lo_style = ip_excel->add_new_style( ). - fill_struct_from_attributes( EXPORTING - ip_element = lo_node_cellxfs_xf - CHANGING - cp_structure = ls_xf ). -*--------------------------------------------------------------------* -* §2 fill style -*--------------------------------------------------------------------* - IF ls_xf-applyfill = '1' AND ls_xf-fillid IS NOT INITIAL. - lv_index = ls_xf-fillid + 1. - READ TABLE lt_fills INTO ls_fill INDEX lv_index. - IF sy-subrc = 0. - lo_style->fill = ls_fill. - ENDIF. - ENDIF. - -*--------------------------------------------------------------------* -* §1 number format -*--------------------------------------------------------------------* - IF ls_xf-numfmtid IS NOT INITIAL. - READ TABLE lt_num_formats INTO ls_num_format WITH TABLE KEY id = ls_xf-numfmtid. - IF sy-subrc = 0. - lo_style->number_format = ls_num_format-format. - ENDIF. - ENDIF. - -*--------------------------------------------------------------------* -* §3 border style -*--------------------------------------------------------------------* - IF ls_xf-applyborder = '1' AND ls_xf-borderid IS NOT INITIAL. - lv_index = ls_xf-borderid + 1. - READ TABLE lt_borders INTO ls_cell_border INDEX lv_index. - IF sy-subrc = 0. - lo_style->borders = ls_cell_border. - ENDIF. - ENDIF. - -*--------------------------------------------------------------------* -* §4 font -*--------------------------------------------------------------------* - IF ls_xf-applyfont = '1' AND ls_xf-fontid IS NOT INITIAL. - lv_index = ls_xf-fontid + 1. - READ TABLE lt_fonts INTO ls_font INDEX lv_index. - IF sy-subrc = 0. - lo_style->font = ls_font. - ENDIF. - ENDIF. - -*--------------------------------------------------------------------* -* §5 - Alignment -*--------------------------------------------------------------------* - lo_node_cellxfs_xf_alignment ?= lo_node_cellxfs_xf->find_from_name( 'alignment' ). - IF lo_node_cellxfs_xf_alignment IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_node_cellxfs_xf_alignment - CHANGING - cp_structure = ls_alignment ). - IF ls_alignment-horizontal IS NOT INITIAL. - lo_style->alignment->horizontal = ls_alignment-horizontal. - ENDIF. - - IF ls_alignment-vertical IS NOT INITIAL. - lo_style->alignment->vertical = ls_alignment-vertical. - ENDIF. - - IF ls_alignment-textrotation IS NOT INITIAL. - lo_style->alignment->textrotation = ls_alignment-textrotation. - ENDIF. - - IF ls_alignment-wraptext = '1' OR ls_alignment-wraptext = 'true'. - lo_style->alignment->wraptext = abap_true. - ENDIF. - - IF ls_alignment-shrinktofit = '1' OR ls_alignment-shrinktofit = 'true'. - lo_style->alignment->shrinktofit = abap_true. - ENDIF. - - IF ls_alignment-indent IS NOT INITIAL. - lo_style->alignment->indent = ls_alignment-indent. - ENDIF. - ENDIF. - -*--------------------------------------------------------------------* -* §6 - Protection -*--------------------------------------------------------------------* - lo_node_cellxfs_xf_protection ?= lo_node_cellxfs_xf->find_from_name( 'protection' ). - IF lo_node_cellxfs_xf_protection IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_node_cellxfs_xf_protection - CHANGING - cp_structure = ls_protection ). - IF ls_protection-locked = '1' OR ls_protection-locked = 'true'. - lo_style->protection->locked = zcl_excel_style_protection=>c_protection_locked. - ELSE. - lo_style->protection->locked = zcl_excel_style_protection=>c_protection_unlocked. - ENDIF. - - IF ls_protection-hidden = '1' OR ls_protection-hidden = 'true'. - lo_style->protection->hidden = zcl_excel_style_protection=>c_protection_hidden. - ELSE. - lo_style->protection->hidden = zcl_excel_style_protection=>c_protection_unhidden. - ENDIF. - - ENDIF. - - INSERT lo_style INTO TABLE me->styles. - - lo_node_cellxfs_xf ?= lo_iterator_cellxfs->get_next( ). - - ENDWHILE. - ENDIF. - - endmethod. - - - - - method LOAD_STYLE_BORDERS. - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-25 -* - ... -* changes: renaming variables and types to naming conventions -* aligning code -* renaming variables to indicate what they are used for -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* - DATA: lo_node_border TYPE REF TO if_ixml_element, - lo_node_bordertype TYPE REF TO if_ixml_element, - lo_node_bordercolor TYPE REF TO if_ixml_element, - lo_cell_border TYPE REF TO zcl_excel_style_borders, - lo_border TYPE REF TO zcl_excel_style_border, - ls_color TYPE t_color. - -*--------------------------------------------------------------------* -* We need a table of used borderformats to build up our styles -* §1 A cell has 4 outer borders and 2 diagonal "borders" -* These borders can be formatted separately but the diagonal borders -* are always being formatted the same -* We'll parse through the <border>-tag for each of the bordertypes -* §2 and read the corresponding formatting information - -* Following is an example how this part of a file could be set up -* <border diagonalDown="1"> -* <left style="mediumDashDotDot"> -* <color rgb="FFFF0000"/> -* </left> -* <right/> -* <top style="thick"> -* <color rgb="FFFF0000"/> -* </top> -* <bottom style="thick"> -* <color rgb="FFFF0000"/> -* </bottom> -* <diagonal style="thick"> -* <color rgb="FFFF0000"/> -* </diagonal> -* </border> -*--------------------------------------------------------------------* - lo_node_border ?= ip_xml->find_from_name( 'border' ). - WHILE lo_node_border IS BOUND. - - CREATE OBJECT lo_cell_border. - -*--------------------------------------------------------------------* -* Diagonal borderlines are formatted the equally. Determine what kind of diagonal borders are present if any -*--------------------------------------------------------------------* -* DiagonalNone = 0 -* DiagonalUp = 1 -* DiagonalDown = 2 -* DiagonalBoth = 3 -*--------------------------------------------------------------------* - IF lo_node_border->get_attribute( 'diagonalDown' ) IS NOT INITIAL. - add zcl_excel_style_borders=>c_diagonal_down to lo_cell_border->diagonal_mode. - ENDIF. - - IF lo_node_border->get_attribute( 'diagonalUp' ) IS NOT INITIAL. - add zcl_excel_style_borders=>c_diagonal_up to lo_cell_border->diagonal_mode. - ENDIF. - - lo_node_bordertype ?= lo_node_border->get_first_child( ). - WHILE lo_node_bordertype IS BOUND. -*--------------------------------------------------------------------* -* §1 Determine what kind of border we are talking about -*--------------------------------------------------------------------* -* Up, down, left, right, diagonal -*--------------------------------------------------------------------* - CREATE OBJECT lo_border. - - CASE lo_node_bordertype->get_name( ). - - WHEN 'left'. - lo_cell_border->left = lo_border. - - WHEN 'right'. - lo_cell_border->right = lo_border. - - WHEN 'top'. - lo_cell_border->top = lo_border. - - WHEN 'bottom'. - lo_cell_border->down = lo_border. - - WHEN 'diagonal'. - lo_cell_border->diagonal = lo_border. - - ENDCASE. - -*--------------------------------------------------------------------* -* §2 Read the border-formatting -*--------------------------------------------------------------------* - lo_border->border_style = lo_node_bordertype->get_attribute( 'style' ). - lo_node_bordercolor ?= lo_node_bordertype->find_from_name( 'color' ). - IF lo_node_bordercolor IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_node_bordercolor - CHANGING - cp_structure = ls_color ). - - lo_border->border_color-rgb = ls_color-rgb. - IF ls_color-indexed IS NOT INITIAL. - lo_border->border_color-indexed = ls_color-indexed. - ENDIF. - - IF ls_color-theme IS NOT INITIAL. - lo_border->border_color-theme = ls_color-theme. - ENDIF. - lo_border->border_color-tint = ls_color-tint. - ENDIF. - - lo_node_bordertype ?= lo_node_bordertype->get_next( ). - - ENDWHILE. - - INSERT lo_cell_border INTO TABLE ep_borders. - - lo_node_border ?= lo_node_border->get_next( ). - - ENDWHILE. - - - endmethod. - - - - - method LOAD_STYLE_FILLS. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 Support gradientFill -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-25 -* - ... -* changes: renaming variables and types to naming conventions -* aligning code -* commenting on problems/future enhancements/todos we already know of or should decide upon -* adding comments to explain what we are trying to achieve -* renaming variables to indicate what they are used for -*--------------------------------------------------------------------* - DATA: lv_value TYPE string, - lo_node_fill TYPE REF TO if_ixml_element, - lo_node_fill_child TYPE REF TO if_ixml_element, - lo_node_bgcolor TYPE REF TO if_ixml_element, - lo_node_fgcolor TYPE REF TO if_ixml_element, - lo_fill TYPE REF TO zcl_excel_style_fill, - ls_color TYPE t_color. - -*--------------------------------------------------------------------* -* We need a table of used fillformats to build up our styles - -* Following is an example how this part of a file could be set up -* <fill> -* <patternFill patternType="gray125"/> -* </fill> -* <fill> -* <patternFill patternType="solid"> -* <fgColor rgb="FFFFFF00"/> -* <bgColor indexed="64"/> -* </patternFill> -* </fill> -*--------------------------------------------------------------------* - - lo_node_fill ?= ip_xml->find_from_name( 'fill' ). - WHILE lo_node_fill IS BOUND. - - CREATE OBJECT lo_fill. - lo_node_fill_child ?= lo_node_fill->get_first_child( ). - lv_value = lo_node_fill_child->get_name( ). - CASE lv_value. - -*--------------------------------------------------------------------* -* Patternfill -*--------------------------------------------------------------------* - WHEN 'patternFill'. - lo_fill->filltype = lo_node_fill_child->get_attribute( 'patternType' ). -*--------------------------------------------------------------------* -* Patternfill - background color -*--------------------------------------------------------------------* - lo_node_bgcolor = lo_node_fill_child->find_from_name( 'bgColor' ). - IF lo_node_bgcolor IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_node_bgcolor - CHANGING - cp_structure = ls_color ). - - lo_fill->bgcolor-rgb = ls_color-rgb. - IF ls_color-indexed IS NOT INITIAL. - lo_fill->bgcolor-indexed = ls_color-indexed. - ENDIF. - - IF ls_color-theme IS NOT INITIAL. - lo_fill->bgcolor-theme = ls_color-theme. - ENDIF. - lo_fill->bgcolor-tint = ls_color-tint. - ENDIF. - -*--------------------------------------------------------------------* -* Patternfill - foreground color -*--------------------------------------------------------------------* - lo_node_fgcolor = lo_node_fill->find_from_name( 'fgColor' ). - IF lo_node_fgcolor IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_node_fgcolor - CHANGING - cp_structure = ls_color ). - - lo_fill->fgcolor-rgb = ls_color-rgb. - IF ls_color-indexed IS NOT INITIAL. - lo_fill->fgcolor-indexed = ls_color-indexed. - ENDIF. - - IF ls_color-theme IS NOT INITIAL. - lo_fill->fgcolor-theme = ls_color-theme. - ENDIF. - lo_fill->fgcolor-tint = ls_color-tint. - ENDIF. - - -*--------------------------------------------------------------------* -* gradientFill -*--------------------------------------------------------------------* - WHEN 'gradientFill'. - " 2do§1 Support gradientFill - - WHEN OTHERS. - - ENDCASE. - - - INSERT lo_fill INTO TABLE ep_fills. - - lo_node_fill ?= lo_node_fill->get_next( ). - - ENDWHILE. - - - endmethod. - - - - - method LOAD_STYLE_FONTS. - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-25 -* - ... -* changes: renaming variables and types to naming conventions -* aligning code -* removing unused variables -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* - DATA: lo_node_font TYPE REF TO if_ixml_element, - lo_node2 TYPE REF TO if_ixml_element, - lo_font TYPE REF TO zcl_excel_style_font, - ls_color TYPE t_color. - -*--------------------------------------------------------------------* -* We need a table of used fonts to build up our styles - -* Following is an example how this part of a file could be set up -* <font> -* <sz val="11"/> -* <color theme="1"/> -* <name val="Calibri"/> -* <family val="2"/> -* <scheme val="minor"/> -* </font> -*--------------------------------------------------------------------* - lo_node_font ?= ip_xml->find_from_name( 'font' ). - WHILE lo_node_font IS BOUND. - - CREATE OBJECT lo_font. -*--------------------------------------------------------------------* -* Bold -*--------------------------------------------------------------------* - IF lo_node_font->find_from_name( 'b' ) IS BOUND. - lo_font->bold = abap_true. - ENDIF. - -*--------------------------------------------------------------------* -* Italic -*--------------------------------------------------------------------* - IF lo_node_font->find_from_name( 'i' ) IS BOUND. - lo_font->italic = abap_true. - ENDIF. - -*--------------------------------------------------------------------* -* Underline -*--------------------------------------------------------------------* - lo_node2 = lo_node_font->find_from_name( 'u' ). - IF lo_node2 IS BOUND. - lo_font->underline = abap_true. - lo_font->underline_mode = lo_node2->get_attribute( 'val' ). - ENDIF. - -*--------------------------------------------------------------------* -* StrikeThrough -*--------------------------------------------------------------------* - IF lo_node_font->find_from_name( 'strike' ) IS BOUND. - lo_font->strikethrough = abap_true. - ENDIF. - -*--------------------------------------------------------------------* -* Fontsize -*--------------------------------------------------------------------* - lo_node2 = lo_node_font->find_from_name( 'sz' ). - IF lo_node2 IS BOUND. - lo_font->size = lo_node2->get_attribute( 'val' ). - ENDIF. - -*--------------------------------------------------------------------* -* Fontname -*--------------------------------------------------------------------* - lo_node2 = lo_node_font->find_from_name( 'name' ). - IF lo_node2 IS BOUND. - lo_font->name = lo_node2->get_attribute( 'val' ). - ENDIF. - -*--------------------------------------------------------------------* -* Fontfamily -*--------------------------------------------------------------------* - lo_node2 = lo_node_font->find_from_name( 'family' ). - IF lo_node2 IS BOUND. - lo_font->family = lo_node2->get_attribute( 'val' ). - ENDIF. - -*--------------------------------------------------------------------* -* Fontscheme -*--------------------------------------------------------------------* - lo_node2 = lo_node_font->find_from_name( 'scheme' ). - IF lo_node2 IS BOUND. - lo_font->scheme = lo_node2->get_attribute( 'val' ). - ENDIF. - -*--------------------------------------------------------------------* -* Fontcolor -*--------------------------------------------------------------------* - lo_node2 = lo_node_font->find_from_name( 'color' ). - IF lo_node2 IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_node2 - CHANGING - cp_structure = ls_color ). - lo_font->color-rgb = ls_color-rgb. - IF ls_color-indexed IS NOT INITIAL. - lo_font->color-indexed = ls_color-indexed. - ENDIF. - - IF ls_color-theme IS NOT INITIAL. - lo_font->color-theme = ls_color-theme. - ENDIF. - lo_font->color-tint = ls_color-tint. - ENDIF. - - INSERT lo_font INTO TABLE ep_fonts. - - lo_node_font ?= lo_node_font->get_next( ). - - ENDWHILE. - - - endmethod. - - - - - method LOAD_STYLE_NUM_FORMATS. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 Explain gaps in predefined formats -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-25 -* - ... -* changes: renaming variables and types to naming conventions -* adding comments to explain what we are trying to achieve -* aligning code -*--------------------------------------------------------------------* - DATA: lo_node_numfmt TYPE REF TO if_ixml_element, - ls_num_format TYPE t_num_format. - -*--------------------------------------------------------------------* -* We need a table of used numberformats to build up our styles -* there are two kinds of numberformats -* §1 those that have been explicitly added by the createor of the excel-file -* §2 and built-in numberformats -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* §1 Get non-internal numberformats that are found in the file explicitly - -* Following is an example how this part of a file could be set up -* <numFmts count="1"> -* <numFmt formatCode="#,###,###,###,##0.00" numFmtId="164"/> -* </numFmts> -*--------------------------------------------------------------------* - lo_node_numfmt ?= ip_xml->find_from_name( 'numFmt' ). - WHILE lo_node_numfmt IS BOUND. - - CLEAR ls_num_format. - - CREATE OBJECT ls_num_format-format. - ls_num_format-format->format_code = lo_node_numfmt->get_attribute( 'formatCode' ). - ls_num_format-id = lo_node_numfmt->get_attribute( 'numFmtId' ). - INSERT ls_num_format INTO TABLE ep_num_formats. - - lo_node_numfmt ?= lo_node_numfmt->get_next( ). - - ENDWHILE. - - DEFINE predefined_format. - ls_num_format-id = &1. - create object ls_num_format-format. - ls_num_format-format->format_code = &2. - insert ls_num_format into table ep_num_formats. - END-OF-DEFINITION. - -*--------------------------------------------------------------------* -* §1 Get internal predefined numberformats -*--------------------------------------------------------------------* - predefined_format '1' '0'. - predefined_format '2' '0.00'. - predefined_format '3' '#,##0'. - predefined_format '4' '#,##0.00'. - predefined_format '5' '$#,##0_);($#,##0)'. - predefined_format '6' '$#,##0_);[Red]($#,##0)'. - predefined_format '7' '$#,##0.00_);($#,##0.00)'. - predefined_format '8' '$#,##0.00_);[Red]($#,##0.00)'. - predefined_format '9' '0%'. - predefined_format '10' '0.00%'. - predefined_format '11' '0.00E+00'. - predefined_format '12' '# ?/?'. - predefined_format '13' '# ??/??'. - predefined_format '14' 'm/d/yyyy'. - predefined_format '15' 'd-mmm-yy'. - predefined_format '16' 'd-mmm'. - predefined_format '17' 'mmm-yy'. - predefined_format '18' 'h:mm AM/PM'. - predefined_format '19' 'h:mm:ss AM/PM'. - predefined_format '20' 'h:mm'. - predefined_format '21' 'h:mm:ss'. - predefined_format '22' 'm/d/yyyy h:mm'. -* 2do§1 Why is there a gap in here? - - - - - - - - - - - - - - predefined_format '37' '#,##0_);(#,##0)'. - predefined_format '38' '#,##0_);[Red](#,##0)'. - predefined_format '39' '#,##0.00_);(#,##0.00)'. - predefined_format '40' '#,##0.00_);[Red](#,##0.00)'. -* 2do§1 Why is there a gap in here? - - - - predefined_format '45' 'mm:ss'. - predefined_format '46' '[h]:mm:ss'. - predefined_format '47' 'mm:ss.0'. - predefined_format '48' '##0.0E+0'. - predefined_format '49' '@'. -* 2do§1 Is 49 really the last predefined format? - - - endmethod. - - - - - - method LOAD_WORKBOOK. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 Move macro-reading from zcl_excel_reader_xlsm to this class -* autodetect existance of macro/vba content -* Allow inputparameter to explicitly tell reader to ignore vba-content -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-10 -* - ... -* changes: renaming variables to naming conventions -* aligning code -* removing unused variables -* adding me-> where possible -* renaming variables to indicate what they are used for -* adding comments to explain what we are trying to achieve -* renaming i/o parameters: previous input-parameter ip_path holds a (full) filename and not a path --> rename to iv_workbook_full_filename -* ip_excel renamed while being at it --> rename to io_excel -*--------------------------------------------------------------------* -* issue #232 - Read worksheetstate hidden/veryHidden -* - Stefan Schmöcker, 2012-11-11 -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 -* changes: correction in named ranges to correctly attach -* sheetlocal names/ranges to the correct sheet -*--------------------------------------------------------------------* -* issue#284 - Copied formulae ignored when reading excelfile -* - Stefan Schmöcker, 2013-08-02 -* changes: initialize area to hold referenced formulaedata -* after all worksheets have been read resolve formuae -*--------------------------------------------------------------------* - - CONSTANTS: lcv_shared_strings TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', - lcv_worksheet TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', - lcv_styles TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', - lcv_vba_project TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', "#EC NEEDED for future incorporation of XLSM-reader -*--------------------------------------------------------------------* -* #232: Read worksheetstate hidden/veryHidden - begin data declarations -*--------------------------------------------------------------------* - lcv_worksheet_state_hidden TYPE string VALUE 'hidden', - lcv_worksheet_state_veryhidden TYPE string VALUE 'veryHidden'. -*--------------------------------------------------------------------* -* #232: Read worksheetstate hidden/veryHidden - end data declarations -*--------------------------------------------------------------------* - - DATA: - lv_path TYPE string, - lv_filename TYPE chkfile, - lv_full_filename TYPE string, - - lo_rels_workbook TYPE REF TO if_ixml_document, - lt_worksheets TYPE STANDARD TABLE OF t_relationship WITH NON-UNIQUE DEFAULT KEY, - lo_workbook TYPE REF TO if_ixml_document, - lv_workbook_index TYPE i, - lv_worksheet_path TYPE string, - ls_sheet TYPE t_sheet, - - lo_node TYPE REF TO if_ixml_element, - ls_relationship TYPE t_relationship, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_range TYPE REF TO zcl_excel_range, - lv_worksheet_title TYPE zexcel_sheet_title, - lv_tabix TYPE sytabix, " #235 - repeat rows/cols. Needed to link defined name to correct worksheet - - ls_range TYPE t_range, - lv_range_value TYPE zexcel_range_value, -*--------------------------------------------------------------------* -* #229: Set active worksheet - begin data declarations -*--------------------------------------------------------------------* - lv_active_sheet_string TYPE string, - lv_zexcel_active_worksheet TYPE zexcel_active_worksheet, -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns - added autofilter support while changing this section - lo_autofilter TYPE REF TO zcl_excel_autofilter, - ls_area TYPE zexcel_s_autofilter_area, - lv_col_start_alpha TYPE zexcel_cell_column_alpha, - lv_col_end_alpha TYPE zexcel_cell_column_alpha, - lv_row_start TYPE zexcel_cell_row, - lv_row_end TYPE zexcel_cell_row , - lv_regex TYPE string, - lv_range_value_1 TYPE zexcel_range_value, - lv_range_value_2 TYPE zexcel_range_value. -*--------------------------------------------------------------------* -* #229: Set active worksheet - end data declarations -*--------------------------------------------------------------------* - FIELD-SYMBOLS: <worksheet> TYPE t_relationship. - - -*--------------------------------------------------------------------* - -* §1 Get the position of files related to this workbook -* Usually this will be <root>/xl/workbook.xml -* Thus the workbookroot will be <root>/xl/ -* The position of all related files will be given in file -* <workbookroot>/_rels/<workbookfilename>.rels and their positions -* be be given relative to the workbookroot - -* Following is an example how this file could be set up - -* <?xml version="1.0" encoding="UTF-8" standalone="true"?> -* <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> -* <Relationship Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Id="rId6"/> -* <Relationship Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Id="rId5"/> -* <Relationship Target="worksheets/sheet1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId1"/> -* <Relationship Target="worksheets/sheet2.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId2"/> -* <Relationship Target="worksheets/sheet3.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId3"/> -* <Relationship Target="worksheets/sheet4.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId4"/> -* <Relationship Target="sharedStrings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Id="rId7"/> -* </Relationships> -* -* §2 Load data that is relevant to the complete workbook -* Currently supported is: -* §2.1 Shared strings - This holds all strings that are used in all worksheets -* §2.2 Styles - This holds all styles that are used in all worksheets -* §2.3 Worksheets - For each worksheet in the workbook one entry appears here to point to the file that holds the content of this worksheet -* §2.4 [Themes] - not supported -* §2.5 [VBA (Macro)] - supported in class zcl_excel_reader_xlsm but should be moved here and autodetect -* ... -* -* §3 Some information is held in the workbookfile as well -* §3.1 Names and order of of worksheets -* §3.2 Active worksheet -* §3.3 Defined names -* ... -* Following is an example how this file could be set up - -* <?xml version="1.0" encoding="UTF-8" standalone="true"?> -* <workbook xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> -* <fileVersion rupBuild="4506" lowestEdited="4" lastEdited="4" appName="xl"/> -* <workbookPr defaultThemeVersion="124226"/> -* <bookViews> -* <workbookView activeTab="1" windowHeight="8445" windowWidth="19035" yWindow="120" xWindow="120"/> -* </bookViews> -* <sheets> -* <sheet r:id="rId1" sheetId="1" name="Sheet1"/> -* <sheet r:id="rId2" sheetId="2" name="Sheet2"/> -* <sheet r:id="rId3" sheetId="3" name="Sheet3" state="hidden"/> -* <sheet r:id="rId4" sheetId="4" name="Sheet4"/> -* </sheets> -* <definedNames/> -* <calcPr calcId="125725"/> -* </workbook> -*--------------------------------------------------------------------* - - CLEAR me->mt_ref_formulae. " ins issue#284 - -*--------------------------------------------------------------------* -* §1 Get the position of files related to this workbook -* Entry into this method is with the filename of the workbook -*--------------------------------------------------------------------* - CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' - EXPORTING - full_name = iv_workbook_full_filename - IMPORTING - stripped_name = lv_filename - file_path = lv_path. - - CONCATENATE lv_path '_rels/' lv_filename '.rels' - INTO lv_full_filename. - lo_rels_workbook = me->get_ixml_from_zip_archive( lv_full_filename ). - - lo_node ?= lo_rels_workbook->find_from_name( 'Relationship' ). "#EC NOTEXT - WHILE lo_node IS BOUND. - - me->fill_struct_from_attributes( EXPORTING ip_element = lo_node CHANGING cp_structure = ls_relationship ). - - CASE ls_relationship-type. - -*--------------------------------------------------------------------* -* §2.1 Shared strings - This holds all strings that are used in all worksheets -*--------------------------------------------------------------------* - WHEN lcv_shared_strings. - CONCATENATE lv_path ls_relationship-target - INTO lv_full_filename. - me->load_shared_strings( lv_full_filename ). - -*--------------------------------------------------------------------* -* §2.3 Worksheets -* For each worksheet in the workbook one entry appears here to point to the file that holds the content of this worksheet -* Shared strings and styles have to be present before we can start with creating the worksheets -* thus we only store this information for use when parsing the workbookfile for sheetinformations -*--------------------------------------------------------------------* - WHEN lcv_worksheet. - APPEND ls_relationship TO lt_worksheets. - -*--------------------------------------------------------------------* -* §2.2 Styles - This holds the styles that are used in all worksheets -*--------------------------------------------------------------------* - WHEN lcv_styles. - CONCATENATE lv_path ls_relationship-target - INTO lv_full_filename. - me->load_styles( ip_path = lv_full_filename - ip_excel = io_excel ). - - WHEN OTHERS. - - ENDCASE. - - lo_node ?= lo_node->get_next( ). - - ENDWHILE. - -*--------------------------------------------------------------------* -* §3 Some information held in the workbookfile -*--------------------------------------------------------------------* - lo_workbook = me->get_ixml_from_zip_archive( iv_workbook_full_filename ). - -*--------------------------------------------------------------------* -* §3.1 Names and order of of worksheets -*--------------------------------------------------------------------* - lo_node ?= lo_workbook->find_from_name( 'sheet' ). - lv_workbook_index = 1. - WHILE lo_node IS BOUND. - - me->fill_struct_from_attributes( EXPORTING - ip_element = lo_node - CHANGING - cp_structure = ls_sheet ). -*--------------------------------------------------------------------* -* Create new worksheet in workbook with correct name -*--------------------------------------------------------------------* - lv_worksheet_title = ls_sheet-name. - IF lv_workbook_index = 1. " First sheet has been added automatically by creating io_excel - lo_worksheet = io_excel->get_active_worksheet( ). - lo_worksheet->set_title( lv_worksheet_title ). - ELSE. - lo_worksheet = io_excel->add_new_worksheet( lv_worksheet_title ). - ENDIF. -*--------------------------------------------------------------------* -* #232 - Read worksheetstate hidden/veryHidden - begin of coding -* Set status hidden if necessary -*--------------------------------------------------------------------* - CASE ls_sheet-state. - - WHEN lcv_worksheet_state_hidden. - lo_worksheet->zif_excel_sheet_properties~hidden = zif_excel_sheet_properties=>c_hidden. - - WHEN lcv_worksheet_state_veryhidden. - lo_worksheet->zif_excel_sheet_properties~hidden = zif_excel_sheet_properties=>c_veryhidden. - - ENDCASE. -*--------------------------------------------------------------------* -* #232 - Read worksheetstate hidden/veryHidden - end of coding -*--------------------------------------------------------------------* -*--------------------------------------------------------------------* -* Load worksheetdata -*--------------------------------------------------------------------* - READ TABLE lt_worksheets ASSIGNING <worksheet> WITH KEY id = ls_sheet-id. - IF sy-subrc = 0. - <worksheet>-sheetid = ls_sheet-sheetid. "ins #235 - repeat rows/cols - needed to identify correct sheet - CONCATENATE lv_path <worksheet>-target - INTO lv_worksheet_path. - me->load_worksheet( ip_path = lv_worksheet_path - io_worksheet = lo_worksheet ). - <worksheet>-worksheet = lo_worksheet. - ENDIF. - - lo_node ?= lo_node->get_next( ). - ADD 1 TO lv_workbook_index. - - ENDWHILE. - SORT lt_worksheets BY sheetid. " needed for localSheetid -referencing - -*--------------------------------------------------------------------* -* #284: Set active worksheet - Resolve referenced formulae to -* explicit formulae those cells -*--------------------------------------------------------------------* - me->resolve_referenced_formulae( ). - " ins issue#284 -*--------------------------------------------------------------------* -* #229: Set active worksheet - begin coding -* §3.2 Active worksheet -*--------------------------------------------------------------------* - lv_zexcel_active_worksheet = 1. " First sheet = active sheet if nothing else specified. - lo_node ?= lo_workbook->find_from_name( 'workbookView' ). - IF lo_node IS BOUND. - lv_active_sheet_string = lo_node->get_attribute( 'activeTab' ). - TRY. - lv_zexcel_active_worksheet = lv_active_sheet_string + 1. " EXCEL numbers the sheets from 0 onwards --> index into worksheettable is increased by one - CATCH cx_sy_conversion_error. "#EC NO_HANDLER - error here --> just use the default 1st sheet - ENDTRY. - ENDIF. - io_excel->set_active_sheet_index( lv_zexcel_active_worksheet ). -*--------------------------------------------------------------------* -* #229: Set active worksheet - end coding -*--------------------------------------------------------------------* - - -*--------------------------------------------------------------------* -* §3.3 Defined names -* So far I have encountered these -* - named ranges - sheetlocal -* - named ranges - workbookglobal -* - autofilters - sheetlocal ( special range ) -* - repeat rows/cols - sheetlocal ( special range ) -* -*--------------------------------------------------------------------* - lo_node ?= lo_workbook->find_from_name( 'definedName' ). - WHILE lo_node IS BOUND. - - CLEAR lo_range. "ins issue #235 - repeat rows/cols - me->fill_struct_from_attributes( EXPORTING - ip_element = lo_node - CHANGING - cp_structure = ls_range ). - lv_range_value = lo_node->get_value( ). - - IF ls_range-localsheetid IS NOT INITIAL. " issue #163+ -* READ TABLE lt_worksheets ASSIGNING <worksheet> WITH KEY id = ls_range-localsheetid. "del issue #235 - repeat rows/cols " issue #163+ -* lo_range = <worksheet>-worksheet->add_new_range( ). "del issue #235 - repeat rows/cols " issue #163+ -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns - begin -*--------------------------------------------------------------------* - lv_tabix = ls_range-localsheetid + 1. - READ TABLE lt_worksheets ASSIGNING <worksheet> INDEX lv_tabix. - IF sy-subrc = 0. - CASE ls_range-name. - -*--------------------------------------------------------------------* -* insert autofilters -*--------------------------------------------------------------------* - WHEN zcl_excel_autofilters=>c_autofilter. - lo_autofilter = io_excel->add_new_autofilter( io_sheet = <worksheet>-worksheet ) . - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value - IMPORTING e_column_start = lv_col_start_alpha - e_column_end = lv_col_end_alpha - e_row_start = ls_area-row_start ). - ls_area-col_start = zcl_excel_common=>convert_column2int( lv_col_start_alpha ). - ls_area-col_end = zcl_excel_common=>convert_column2int( lv_col_end_alpha ). - lo_autofilter->set_filter_area( is_area = ls_area ). - -*--------------------------------------------------------------------* -* repeat print rows/columns -*--------------------------------------------------------------------* - WHEN zif_excel_sheet_printsettings=>gcv_print_title_name. - lo_range = <worksheet>-worksheet->add_new_range( ). -*--------------------------------------------------------------------* -* This might be a temporary solution. Maybe ranges get be reworked -* to support areas consisting of multiple rectangles -* But for now just split the range into row and columnpart -*--------------------------------------------------------------------* - CLEAR:lv_range_value_1, - lv_range_value_2. - IF lv_range_value IS INITIAL. -* Empty --> nothing to do - ELSE. - IF lv_range_value(1) = `'`. " Escaped - lv_regex = `^('[^']*')+![^,]*,`. - ELSE. - lv_regex = `^[^!]*![^,]*,`. - ENDIF. -* Split into two ranges if necessary - FIND REGEX lv_regex IN lv_range_value MATCH LENGTH sy-fdpos. - IF sy-subrc = 0 AND sy-fdpos > 0. - lv_range_value_2 = lv_range_value+sy-fdpos. - SUBTRACT 1 FROM sy-fdpos. - lv_range_value_1 = lv_range_value(sy-fdpos). - ELSE. - lv_range_value_1 = lv_range_value. - ENDIF. - ENDIF. -* 1st range - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_1 - IMPORTING e_column_start = lv_col_start_alpha - e_column_end = lv_col_end_alpha - e_row_start = lv_row_start - e_row_end = lv_row_end ). - IF lv_col_start_alpha IS NOT INITIAL. - <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha - iv_columns_to = lv_col_end_alpha ). - ENDIF. - IF lv_row_start IS NOT INITIAL. - <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start - iv_rows_to = lv_row_end ). - ENDIF. - -* 2nd range - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_2 - IMPORTING e_column_start = lv_col_start_alpha - e_column_end = lv_col_end_alpha - e_row_start = lv_row_start - e_row_end = lv_row_end ). - IF lv_col_start_alpha IS NOT INITIAL. - <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha - iv_columns_to = lv_col_end_alpha ). - ENDIF. - IF lv_row_start IS NOT INITIAL. - <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start - iv_rows_to = lv_row_end ). - ENDIF. - - WHEN OTHERS. - - ENDCASE. - ENDIF. -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns - end -*--------------------------------------------------------------------* - ELSE. " issue #163+ - lo_range = io_excel->add_new_range( ). " issue #163+ - ENDIF. " issue #163+ -* lo_range = ip_excel->add_new_range( ). " issue #163- - IF lo_range IS BOUND. "ins issue #235 - repeat rows/cols - lo_range->name = ls_range-name. - lo_range->set_range_value( lv_range_value ). - ENDIF. "ins issue #235 - repeat rows/cols - lo_node ?= lo_node->get_next( ). - - ENDWHILE. - - endmethod. - - - - - - method LOAD_WORKSHEET. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 Header/footer -* -* Please don't just delete these ToDos if they are not -* needed but leave a comment that states this -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, -* - ... -* changes: renaming variables to naming conventions -* aligning code (started) -* add a list of open ToDos here -* adding comments to explain what we are trying to achieve (started) -*--------------------------------------------------------------------* - TYPES: BEGIN OF lty_cell, - r TYPE string, - t TYPE string, - s TYPE string, - END OF lty_cell. - - TYPES: BEGIN OF lty_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 lty_column. - - TYPES: BEGIN OF lty_sheetview, - showgridlines TYPE zexcel_show_gridlines, - tabselected TYPE string, - zoomscalenormal TYPE string, - workbookviewid TYPE string, - showrowcolheaders TYPE string, - END OF lty_sheetview. - - TYPES: BEGIN OF lty_mergecell, - ref TYPE string, - END OF lty_mergecell. - - TYPES: BEGIN OF lty_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 lty_row. - - TYPES: BEGIN OF lty_page_setup, - id TYPE string, - orientation TYPE string, - scale TYPE string, - END OF lty_page_setup. - - TYPES: BEGIN OF lty_page_margins, - footer TYPE string, - header TYPE string, - bottom TYPE string, - top TYPE string, - right TYPE string, - left TYPE string, - END OF lty_page_margins. - - TYPES: BEGIN OF lty_sheetformatpr, - customheight TYPE string, - defaultrowheight TYPE string, - customwidth TYPE string, - defaultcolwidth TYPE string, - END OF lty_sheetformatpr. - - TYPES: BEGIN OF lty_headerfooter, - alignwithmargins TYPE string, - differentoddeven TYPE string, - END OF lty_headerfooter. - - TYPES: BEGIN OF lty_tabcolor, - rgb TYPE string, - theme TYPE string, - END OF lty_tabcolor. - - TYPES: BEGIN OF lty_datavalidation, - type TYPE zexcel_data_val_type, - allowblank TYPE flag, - showinputmessage TYPE flag, - showerrormessage TYPE flag, - showdropdown TYPE flag, - operator TYPE zexcel_data_val_operator, - formula1 TYPE zexcel_validation_formula1, - formula2 TYPE zexcel_validation_formula1, - sqref TYPE string, - cell_column TYPE zexcel_cell_column_alpha, - cell_column_to TYPE zexcel_cell_column_alpha, - cell_row TYPE zexcel_cell_row, - cell_row_to TYPE zexcel_cell_row, - error TYPE string, - errortitle TYPE string, - prompt TYPE string, - prompttitle TYPE string, - errorstyle TYPE zexcel_data_val_error_style, - END OF lty_datavalidation. - - - - CONSTANTS: lc_xml_attr_true TYPE string VALUE 'true', - lc_xml_attr_true_int TYPE string VALUE '1', - lc_rel_drawing TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', - lc_rel_printer TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'. - - DATA: lo_ixml_worksheet TYPE REF TO if_ixml_document, - lo_ixml_cells TYPE REF TO if_ixml_node_collection, - lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, - lo_ixml_iterator2 TYPE REF TO if_ixml_node_iterator, - lo_ixml_row_elem TYPE REF TO if_ixml_element, - lo_ixml_cell_elem TYPE REF TO if_ixml_element, - ls_cell TYPE lty_cell, - lv_index TYPE i, - lo_ixml_value_elem TYPE REF TO if_ixml_element, - lo_ixml_formula_elem TYPE REF TO if_ixml_element, - lv_cell_value TYPE zexcel_cell_value, - lv_cell_formula TYPE zexcel_cell_formula, - lv_cell_column TYPE zexcel_cell_column_alpha, - lv_cell_row TYPE zexcel_cell_row, - lo_excel_style TYPE REF TO zcl_excel_style, - lv_style_guid TYPE zexcel_cell_style, - - lo_ixml_imension_elem TYPE REF TO if_ixml_element, "#+234 - lv_dimension_range TYPE string, "#+234 - - lo_ixml_sheetview_elem TYPE REF TO if_ixml_element, - ls_sheetview TYPE lty_sheetview, - lo_ixml_pane_elem TYPE REF TO if_ixml_element, - ls_excel_pane TYPE zexcel_pane, - lv_pane_cell_row TYPE zexcel_cell_row, - lv_pane_cell_col_a TYPE zexcel_cell_column_alpha, - lv_pane_cell_col TYPE zexcel_cell_column, - - lo_ixml_mergecells TYPE REF TO if_ixml_node_collection, - lo_ixml_mergecell_elem TYPE REF TO if_ixml_element, - ls_mergecell TYPE lty_mergecell, - lv_merge_column_start TYPE zexcel_cell_column_alpha, - lv_merge_column_end TYPE zexcel_cell_column_alpha, - lv_merge_row_start TYPE zexcel_cell_row, - lv_merge_row_end TYPE zexcel_cell_row, - - lo_ixml_sheetformatpr_elem TYPE REF TO if_ixml_element, - ls_sheetformatpr TYPE lty_sheetformatpr, - lv_height TYPE float, - - lo_ixml_headerfooter_elem TYPE REF TO if_ixml_element, - ls_headerfooter TYPE lty_headerfooter, - ls_odd_header TYPE zexcel_s_worksheet_head_foot, - ls_odd_footer TYPE zexcel_s_worksheet_head_foot, - ls_even_header TYPE zexcel_s_worksheet_head_foot, - ls_even_footer TYPE zexcel_s_worksheet_head_foot, - lo_ixml_hf_value_elem TYPE REF TO if_ixml_element, - - lo_ixml_pagemargins_elem TYPE REF TO if_ixml_element, - ls_pagemargins TYPE lty_page_margins, - lo_ixml_pagesetup_elem TYPE REF TO if_ixml_element, - ls_pagesetup TYPE lty_page_setup, - - lo_ixml_columns TYPE REF TO if_ixml_node_collection, - lo_ixml_column_elem TYPE REF TO if_ixml_element, - ls_column TYPE lty_column, - lv_column_alpha TYPE zexcel_cell_column_alpha, - lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lv_outline_level TYPE int4, - - lo_ixml_tabcolor TYPE REF TO if_ixml_element, - ls_tabcolor TYPE lty_tabcolor, - ls_excel_s_tabcolor TYPE zexcel_s_tabcolor, - - lo_ixml_rows TYPE REF TO if_ixml_node_collection, - ls_row TYPE lty_row, - lv_max_col TYPE i, "for use with SPANS element -* lv_min_col TYPE i, "for use with SPANS element " not in use currently - lv_max_col_s TYPE char10, "for use with SPANS element - lv_min_col_s TYPE char10, "for use with SPANS element - lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, -*--- End of current code aligning --------------------------------------------------------------- - - lv_path TYPE string, - lo_ixml_node TYPE REF TO if_ixml_element, - ls_relationship TYPE t_relationship, - lo_ixml_rels_worksheet TYPE REF TO if_ixml_document, - lv_rels_worksheet_path TYPE string, - lv_stripped_name TYPE chkfile, - lv_dirname TYPE string, - - lo_ixml_datavalidations TYPE REF TO if_ixml_node_collection, - lo_ixml_datavalidation_elem TYPE REF TO if_ixml_element, - ls_datavalidation TYPE lty_datavalidation, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lv_datavalidation_range TYPE string, - lt_datavalidation_range TYPE TABLE OF string. - -*--------------------------------------------------------------------* -* §2 We need to read the the file "\\_rels\.rels" because it tells -* us where in this folder structure the data for the workbook -* is located in the xlsx zip-archive -* -* The xlsx Zip-archive has generally the following folder structure: -* <root> | -* |--> _rels -* |--> doc_Props -* |--> xl | -* |--> _rels -* |--> theme -* |--> worksheets -*--------------------------------------------------------------------* - - " Read Workbook Relationships - CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' - EXPORTING - full_name = ip_path - IMPORTING - stripped_name = lv_stripped_name - file_path = lv_dirname. - CONCATENATE lv_dirname '_rels/' lv_stripped_name '.rels' - INTO lv_rels_worksheet_path. - TRY. " +#222 _rels/xxx.rels might not be present. If not found there can be no drawings --> just ignore this section - lo_ixml_rels_worksheet = me->get_ixml_from_zip_archive( lv_rels_worksheet_path ). - lo_ixml_node ?= lo_ixml_rels_worksheet->find_from_name( 'Relationship' ). - CATCH zcx_excel. "#EC NO_HANDLER +#222 - " +#222 No errorhandling necessary - node will be unbound if error occurs - ENDTRY. " +#222 - WHILE lo_ixml_node IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_node - CHANGING - cp_structure = ls_relationship ). - CONCATENATE lv_dirname ls_relationship-target INTO lv_path. - lv_path = resolve_path( lv_path ). - - CASE ls_relationship-type. - WHEN lc_rel_drawing. - " Read Drawings - me->load_worksheet_drawing( ip_path = lv_path - io_worksheet = io_worksheet ). - - WHEN lc_rel_printer. - " Read Printer settings - - WHEN OTHERS. - ENDCASE. - - lo_ixml_node ?= lo_ixml_node->get_next( ). - ENDWHILE. - - - lo_ixml_worksheet = me->get_ixml_from_zip_archive( ip_path ). - - - lo_ixml_tabcolor ?= lo_ixml_worksheet->find_from_name( 'tabColor' ). - IF lo_ixml_tabcolor IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_tabcolor - CHANGING - cp_structure = ls_tabcolor ). -* Theme not supported yet - IF ls_tabcolor-rgb IS NOT INITIAL. - ls_excel_s_tabcolor-rgb = ls_tabcolor-rgb. - io_worksheet->set_tabcolor( ls_excel_s_tabcolor ). - ENDIF. - ENDIF. - - lo_ixml_rows = lo_ixml_worksheet->get_elements_by_tag_name( name = 'row' ). - lo_ixml_iterator = lo_ixml_rows->create_iterator( ). - lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ). - WHILE lo_ixml_row_elem IS BOUND. - - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_row_elem - CHANGING - cp_structure = ls_row ). - SPLIT ls_row-spans AT ':' INTO lv_min_col_s lv_max_col_s. - lv_index = lv_max_col_s. - IF lv_index > lv_max_col. - lv_max_col = lv_index. - ENDIF. - lv_cell_row = ls_row-r. - IF ls_row-customheight = '1' - OR ls_row-collapsed = lc_xml_attr_true - OR ls_row-collapsed = lc_xml_attr_true_int - OR ls_row-hidden = lc_xml_attr_true - OR ls_row-hidden = lc_xml_attr_true_int - OR ls_row-outlinelevel > '0'. - lo_row_dimension = io_worksheet->get_row_dimension( lv_cell_row ). - IF ls_row-customheight = '1'. - lo_row_dimension->set_row_height( ls_row-ht ). - ENDIF. - - IF ls_row-collapsed = lc_xml_attr_true - OR ls_row-collapsed = lc_xml_attr_true_int. - lo_row_dimension->set_collapsed( abap_true ). - ENDIF. - - IF ls_row-hidden = lc_xml_attr_true - OR ls_row-hidden = lc_xml_attr_true_int. - lo_row_dimension->set_visible( abap_false ). - ENDIF. - - IF ls_row-outlinelevel > ''. -* outline_level = condense( row-outlineLevel ). "For basis 7.02 and higher - CONDENSE ls_row-outlinelevel. - lv_outline_level = ls_row-outlinelevel. - IF lv_outline_level > 0. - lo_row_dimension->set_outline_level( lv_outline_level ). - ENDIF. - ENDIF. - ENDIF. - - lo_ixml_cells = lo_ixml_row_elem->get_elements_by_tag_name( name = 'c' ). - lo_ixml_iterator2 = lo_ixml_cells->create_iterator( ). - lo_ixml_cell_elem ?= lo_ixml_iterator2->get_next( ). - WHILE lo_ixml_cell_elem IS BOUND. - CLEAR: lv_cell_value, - lv_cell_formula, - lv_style_guid. - - fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_cell_elem CHANGING cp_structure = ls_cell ). - - lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name( name = 'v' ). - - CASE ls_cell-t. - WHEN 's'. " String values are stored as index in shared string table - lv_index = lo_ixml_value_elem->get_value( ) + 1. - READ TABLE shared_strings INTO lv_cell_value INDEX lv_index. - WHEN 'inlineStr'. " inlineStr values are kept in special node - lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name( name = 'is' ). - IF lo_ixml_value_elem IS BOUND. - lv_cell_value = lo_ixml_value_elem->get_value( ). - ENDIF. - WHEN OTHERS. "other types are stored directly - IF lo_ixml_value_elem IS BOUND. - lv_cell_value = lo_ixml_value_elem->get_value( ). - ENDIF. - ENDCASE. - - CLEAR lv_style_guid. - "read style based on index - IF ls_cell-s IS NOT INITIAL. - lv_index = ls_cell-s + 1. - READ TABLE styles INTO lo_excel_style INDEX lv_index. - IF sy-subrc = 0. - lv_style_guid = lo_excel_style->get_guid( ). - ENDIF. - ENDIF. - - lo_ixml_formula_elem = lo_ixml_cell_elem->find_from_name( name = 'f' ). - IF lo_ixml_formula_elem IS BOUND. - lv_cell_formula = lo_ixml_formula_elem->get_value( ). -*--------------------------------------------------------------------* -* Begin of insertion issue#284 - Copied formulae not -*--------------------------------------------------------------------* - DATA: BEGIN OF ls_formula_attributes, - ref TYPE string, - si TYPE i, - t TYPE string, - END OF ls_formula_attributes, - ls_ref_formula TYPE ty_ref_formulae. - - fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_formula_elem CHANGING cp_structure = ls_formula_attributes ). - IF ls_formula_attributes-t = 'shared'. - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_cell-r - IMPORTING - e_column = lv_cell_column - e_row = lv_cell_row ). - - TRY. - CLEAR ls_ref_formula. - ls_ref_formula-sheet = io_worksheet. - ls_ref_formula-row = lv_cell_row. - ls_ref_formula-column = zcl_excel_common=>convert_column2int( lv_cell_column ). - ls_ref_formula-si = ls_formula_attributes-si. - ls_ref_formula-ref = ls_formula_attributes-ref. - ls_ref_formula-formula = lv_cell_formula. - INSERT ls_ref_formula INTO TABLE me->mt_ref_formulae. - CATCH cx_root. - BREAK-POINT. - ENDTRY. - ENDIF. -*--------------------------------------------------------------------* -* End of insertion issue#284 - Copied formulae not -*--------------------------------------------------------------------* - ENDIF. - - IF lv_cell_value IS NOT INITIAL - OR lv_cell_formula IS NOT INITIAL - OR lv_style_guid IS NOT INITIAL. - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_cell-r - IMPORTING - e_column = lv_cell_column - e_row = lv_cell_row ). - io_worksheet->set_cell( ip_column = lv_cell_column " cell_elem Column - ip_row = lv_cell_row " cell_elem row_elem - ip_value = lv_cell_value " cell_elem Value - ip_formula = lv_cell_formula - ip_data_type = ls_cell-t - ip_style = lv_style_guid ). - ENDIF. - lo_ixml_cell_elem ?= lo_ixml_iterator2->get_next( ). - ENDWHILE. - lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ). - ENDWHILE. - -*--------------------------------------------------------------------* -*#234 - column width not read correctly - begin of coding -* reason - libre office doesn't use SPAN in row - definitions -*--------------------------------------------------------------------* - IF lv_max_col = 0. - lo_ixml_imension_elem = lo_ixml_worksheet->find_from_name( name = 'dimension' ). - IF lo_ixml_imension_elem IS BOUND. - lv_dimension_range = lo_ixml_imension_elem->get_attribute( 'ref' ). - IF lv_dimension_range CS ':'. - REPLACE REGEX '\D+\d+:(\D+)\d+' IN lv_dimension_range WITH '$1'. " Get max column - ELSE. - REPLACE REGEX '(\D+)\d+' IN lv_dimension_range WITH '$1'. " Get max column - ENDIF. - lv_max_col = zcl_excel_common=>convert_column2int( lv_dimension_range ). - ENDIF. - ENDIF. -*--------------------------------------------------------------------* -*#234 - column width not read correctly - end of coding -*--------------------------------------------------------------------* - - "Get the customized column width - lo_ixml_columns = lo_ixml_worksheet->get_elements_by_tag_name( name = 'col' ). - lo_ixml_iterator = lo_ixml_columns->create_iterator( ). - lo_ixml_column_elem ?= lo_ixml_iterator->get_next( ). - WHILE lo_ixml_column_elem IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_column_elem - CHANGING - cp_structure = ls_column ). - lo_ixml_column_elem ?= lo_ixml_iterator->get_next( ). - IF ls_column-customwidth = lc_xml_attr_true - OR ls_column-customwidth = lc_xml_attr_true_int - OR ls_column-bestfit = lc_xml_attr_true - OR ls_column-bestfit = lc_xml_attr_true_int - OR ls_column-collapsed = lc_xml_attr_true - OR ls_column-collapsed = lc_xml_attr_true_int - OR ls_column-hidden = lc_xml_attr_true - OR ls_column-hidden = lc_xml_attr_true_int - OR ls_column-outlinelevel > '' - OR ls_column-style > ''. - lv_index = ls_column-min. - WHILE lv_index <= ls_column-max AND lv_index <= lv_max_col. - - lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_index ). - lo_column_dimension = io_worksheet->get_column_dimension( lv_column_alpha ). - - IF ls_column-customwidth = lc_xml_attr_true - OR ls_column-customwidth = lc_xml_attr_true_int - OR ls_column-width IS NOT INITIAL. "+#234 - lo_column_dimension->set_width( ls_column-width ). - ENDIF. - - IF ls_column-bestfit = lc_xml_attr_true - OR ls_column-bestfit = lc_xml_attr_true_int. - lo_column_dimension->set_auto_size( abap_true ). - ENDIF. - - IF ls_column-collapsed = lc_xml_attr_true - OR ls_column-collapsed = lc_xml_attr_true_int. - lo_column_dimension->set_collapsed( abap_true ). - ENDIF. - - IF ls_column-hidden = lc_xml_attr_true - OR ls_column-hidden = lc_xml_attr_true_int. - lo_column_dimension->set_visible( abap_false ). - ENDIF. - - IF ls_column-outlinelevel > ''. -* outline_level = condense( column-outlineLevel ). - CONDENSE ls_column-outlinelevel. - lv_outline_level = ls_column-outlinelevel. - IF lv_outline_level > 0. - lo_column_dimension->set_outline_level( lv_outline_level ). - ENDIF. - ENDIF. - - IF ls_column-style > ''. - sy-index = ls_column-style + 1. - READ TABLE styles INTO lo_excel_style INDEX sy-index. - DATA: dummy_zexcel_cell_style TYPE zexcel_cell_style. - dummy_zexcel_cell_style = lo_excel_style->get_guid( ). - lo_column_dimension->set_column_style_by_guid( dummy_zexcel_cell_style ). - ENDIF. - - ADD 1 TO lv_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 <= column-max. -* column_alpha = zcl_excel_common=>convert_column2alpha( index ). -* column_dimension = io_worksheet->get_column_dimension( column_alpha ). -* column_dimension->set_visible( abap_false ). -* ADD 1 TO index. -* ENDWHILE. -* ENDIF. - ENDWHILE. - - "Now we need to get information from the sheetView node - lo_ixml_sheetview_elem = lo_ixml_worksheet->find_from_name( name = 'sheetView' ). - fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_sheetview_elem CHANGING cp_structure = ls_sheetview ). - IF ls_sheetview-showgridlines IS INITIAL OR - ls_sheetview-showgridlines = lc_xml_attr_true OR - ls_sheetview-showgridlines = lc_xml_attr_true_int. - "If the attribute is not specified or set to true, we will show grid lines - ls_sheetview-showgridlines = abap_true. - ELSE. - ls_sheetview-showgridlines = abap_false. - ENDIF. - io_worksheet->set_show_gridlines( ls_sheetview-showgridlines ). - - - "Add merge cell information - lo_ixml_mergecells = lo_ixml_worksheet->get_elements_by_tag_name( name = 'mergeCell' ). - lo_ixml_iterator = lo_ixml_mergecells->create_iterator( ). - lo_ixml_mergecell_elem ?= lo_ixml_iterator->get_next( ). - WHILE lo_ixml_mergecell_elem IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_mergecell_elem - CHANGING - cp_structure = ls_mergecell ). - zcl_excel_common=>convert_range2column_a_row( EXPORTING - i_range = ls_mergecell-ref - IMPORTING - e_column_start = lv_merge_column_start - e_column_end = lv_merge_column_end - e_row_start = lv_merge_row_start - e_row_end = lv_merge_row_end ). - lo_ixml_mergecell_elem ?= lo_ixml_iterator->get_next( ). - io_worksheet->set_merge( EXPORTING - ip_column_start = lv_merge_column_start - ip_column_end = lv_merge_column_end - ip_row = lv_merge_row_start - ip_row_to = lv_merge_row_end ). - ENDWHILE. - - " read sheet format properties - lo_ixml_sheetformatpr_elem = lo_ixml_worksheet->find_from_name( 'sheetFormatPr' ). - IF lo_ixml_sheetformatpr_elem IS NOT INITIAL. - fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_sheetformatpr_elem CHANGING cp_structure = ls_sheetformatpr ). - IF ls_sheetformatpr-customheight = '1'. - lv_height = ls_sheetformatpr-defaultrowheight. - lo_row_dimension = io_worksheet->get_default_row_dimension( ). - lo_row_dimension->set_row_height( lv_height ). - ENDIF. - - " TODO... column - ENDIF. - - " Read in page margins - lo_ixml_pagemargins_elem = lo_ixml_worksheet->find_from_name( 'pageMargins' ). - IF lo_ixml_pagemargins_elem IS NOT INITIAL. - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_pagemargins_elem - CHANGING - cp_structure = ls_pagemargins ). - io_worksheet->sheet_setup->margin_bottom = ls_pagemargins-bottom. - io_worksheet->sheet_setup->margin_footer = ls_pagemargins-footer. - io_worksheet->sheet_setup->margin_header = ls_pagemargins-header. - io_worksheet->sheet_setup->margin_left = ls_pagemargins-left. - io_worksheet->sheet_setup->margin_right = ls_pagemargins-right. - io_worksheet->sheet_setup->margin_top = ls_pagemargins-top. - ENDIF. - - " Read in page setup - lo_ixml_pagesetup_elem = lo_ixml_worksheet->find_from_name( 'pageSetup' ). - IF lo_ixml_pagesetup_elem IS NOT INITIAL. - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_pagesetup_elem - CHANGING - cp_structure = ls_pagesetup ). - io_worksheet->sheet_setup->orientation = ls_pagesetup-orientation. - io_worksheet->sheet_setup->scale = ls_pagesetup-scale. - ENDIF. - - " Read header footer - lo_ixml_headerfooter_elem = lo_ixml_worksheet->find_from_name( 'headerFooter' ). - IF lo_ixml_headerfooter_elem IS NOT INITIAL. - fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_headerfooter_elem CHANGING cp_structure = ls_headerfooter ). - io_worksheet->sheet_setup->diff_oddeven_headerfooter = ls_headerfooter-differentoddeven. - - lo_ixml_hf_value_elem = lo_ixml_headerfooter_elem->find_from_name( 'oddFooter' ). - IF lo_ixml_hf_value_elem IS NOT INITIAL. - ls_odd_footer-left_value = lo_ixml_hf_value_elem->get_value( ). - ENDIF. - -* 2do§1 Header/footer - " TODO.. get the rest. - - io_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_odd_header - ip_odd_footer = ls_odd_footer - ip_even_header = ls_even_header - ip_even_footer = ls_even_footer ). - - ENDIF. - - " Start fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 - " Read pane - lo_ixml_pane_elem = lo_ixml_sheetview_elem->find_from_name( name = 'pane' ). - IF lo_ixml_pane_elem IS BOUND. - fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_pane_elem CHANGING cp_structure = ls_excel_pane ). - " Issue #194 - " Replace REGEX with method from the common class - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_excel_pane-topleftcell - IMPORTING - e_column = lv_pane_cell_col_a " Cell Column - e_row = lv_pane_cell_row ). " Natural number - lv_pane_cell_col = zcl_excel_common=>convert_column2int( lv_pane_cell_col_a ). - SUBTRACT 1 FROM: lv_pane_cell_col, - lv_pane_cell_row. - IF lv_pane_cell_col > 0 - AND lv_pane_cell_row > 0. - io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row - ip_num_columns = lv_pane_cell_col ). - ELSEIF lv_pane_cell_row > 0. - io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row ). - ELSE. - io_worksheet->freeze_panes( ip_num_columns = lv_pane_cell_col ). - ENDIF. - ENDIF. - " End fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 - - " Start fix 276 Read data validations - lo_ixml_datavalidations = lo_ixml_worksheet->get_elements_by_tag_name( name = 'dataValidation' ). - lo_ixml_iterator = lo_ixml_datavalidations->create_iterator( ). - lo_ixml_datavalidation_elem ?= lo_ixml_iterator->get_next( ). - WHILE lo_ixml_datavalidation_elem IS BOUND. - fill_struct_from_attributes( EXPORTING - ip_element = lo_ixml_datavalidation_elem - CHANGING - cp_structure = ls_datavalidation ). - clear lo_ixml_formula_elem. - lo_ixml_formula_elem = lo_ixml_datavalidation_elem->find_from_name( name = 'formula1' ). - if lo_ixml_formula_elem is bound. - ls_datavalidation-formula1 = lo_ixml_formula_elem->get_value( ). - endif. - clear lo_ixml_formula_elem. - lo_ixml_formula_elem = lo_ixml_datavalidation_elem->find_from_name( name = 'formula2' ). - if lo_ixml_formula_elem is bound. - ls_datavalidation-formula2 = lo_ixml_formula_elem->get_value( ). - endif. - SPLIT ls_datavalidation-sqref AT space INTO TABLE lt_datavalidation_range. - LOOP AT lt_datavalidation_range INTO lv_datavalidation_range. - zcl_excel_common=>convert_range2column_a_row( EXPORTING - i_range = lv_datavalidation_range - IMPORTING - e_column_start = ls_datavalidation-cell_column - e_column_end = ls_datavalidation-cell_column_to - e_row_start = ls_datavalidation-cell_row - e_row_end = ls_datavalidation-cell_row_to ). - lo_data_validation = io_worksheet->add_new_data_validation( ). - lo_data_validation->type = ls_datavalidation-type. - lo_data_validation->allowblank = ls_datavalidation-allowblank. - lo_data_validation->showinputmessage = ls_datavalidation-showinputmessage. - lo_data_validation->showerrormessage = ls_datavalidation-showerrormessage. - lo_data_validation->showdropdown = ls_datavalidation-showdropdown. - lo_data_validation->operator = ls_datavalidation-operator. - lo_data_validation->formula1 = ls_datavalidation-formula1. - lo_data_validation->formula2 = ls_datavalidation-formula2. - lo_data_validation->prompttitle = ls_datavalidation-prompttitle. - lo_data_validation->prompt = ls_datavalidation-prompt. - lo_data_validation->errortitle = ls_datavalidation-errortitle. - lo_data_validation->error = ls_datavalidation-error. - lo_data_validation->errorstyle = ls_datavalidation-errorstyle. - lo_data_validation->cell_row = ls_datavalidation-cell_row. - lo_data_validation->cell_row_to = ls_datavalidation-cell_row_to. - lo_data_validation->cell_column = ls_datavalidation-cell_column. - lo_data_validation->cell_column_to = ls_datavalidation-cell_column_to. - endloop. - lo_ixml_datavalidation_elem ?= lo_ixml_iterator->get_next( ). - ENDWHILE. - " End fix 276 Read data validations - - endmethod. - - - - - - 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 'true', - lc_xml_attr_true_int TYPE string VALUE '1'. - CONSTANTS: lc_rel_chart TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', - lc_rel_image TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'. - - 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. - - " Read Workbook Relationships - CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' - EXPORTING - full_name = ip_path - IMPORTING - stripped_name = stripped_name - file_path = dirname. - CONCATENATE dirname '_rels/' stripped_name '.rels' - INTO rels_drawing_path. - rels_drawing_path = resolve_path( rels_drawing_path ). - rels_drawing = me->get_ixml_from_zip_archive( rels_drawing_path ). - node ?= rels_drawing->find_from_name( 'Relationship' ). - 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->get_from_zip_archive( path ). "------------> This is for template usage - - path2 = path. - zcl_excel_common=>split_file( EXPORTING ip_file = path2 - IMPORTING ep_extension = file_ext2 ). - rel_drawing-file_ext = file_ext2. - - "-------------Added by Alessandro Iannacci - Should load graph xml - CASE relationship-type. - WHEN lc_rel_chart. - "Read chart xml - rel_drawing-content_xml = me->get_ixml_from_zip_archive( path ). - WHEN OTHERS. - ENDCASE. - "---------------------------- - - - APPEND rel_drawing TO rel_drawings. - - node ?= node->get_next( ). - ENDWHILE. - - drawing = me->get_ixml_from_zip_archive( ip_path ). - -* one-cell anchor ************** - anchors = drawing->get_elements_by_tag_name( name = 'oneCellAnchor' namespace = 'xdr' ). - coll_length = anchors->get_length( ). - iterator = anchors->create_iterator( ). - DO coll_length TIMES. - anchor_elem ?= iterator->get_next( ). - - CALL METHOD me->load_drawing_anchor - EXPORTING - io_anchor_element = anchor_elem - io_worksheet = io_worksheet - it_related_drawings = rel_drawings. - - ENDDO. - -* two-cell anchor ****************** - anchors = drawing->get_elements_by_tag_name( name = 'twoCellAnchor' namespace = 'xdr' ). - coll_length = anchors->get_length( ). - iterator = anchors->create_iterator( ). - DO coll_length TIMES. - anchor_elem ?= iterator->get_next( ). - - CALL METHOD me->load_drawing_anchor - EXPORTING - io_anchor_element = anchor_elem - io_worksheet = io_worksheet - it_related_drawings = rel_drawings. - - ENDDO. - - endmethod. - - - - - METHOD read_from_applserver. - - DATA: lv_filelength TYPE i, - lt_binary_data TYPE STANDARD TABLE OF x255 WITH NON-UNIQUE DEFAULT KEY, - ls_binary_data LIKE LINE OF lt_binary_data, - lv_filename TYPE string, - lv_max_length_line TYPE i, - lv_actual_length_line TYPE i, - lv_errormessage TYPE string. - - MOVE i_filename TO lv_filename. - - DESCRIBE FIELD ls_binary_data LENGTH lv_max_length_line IN BYTE MODE. - OPEN DATASET lv_filename FOR INPUT IN BINARY MODE. - IF sy-subrc <> 0. - lv_errormessage = 'A problem occured when reading the file'(001). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - WHILE sy-subrc = 0. - - READ DATASET lv_filename INTO ls_binary_data MAXIMUM LENGTH lv_max_length_line ACTUAL LENGTH lv_actual_length_line. - APPEND ls_binary_data TO lt_binary_data. - lv_filelength = lv_filelength + lv_actual_length_line. - - ENDWHILE. - CLOSE DATASET lv_filename. - -*--------------------------------------------------------------------* -* Binary data needs to be provided as XSTRING for further processing -*--------------------------------------------------------------------* - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_filelength - IMPORTING - buffer = r_excel_data - TABLES - binary_tab = lt_binary_data. - ENDMETHOD. - - - - - METHOD read_from_local_file. - DATA: lv_filelength TYPE i, - lt_binary_data TYPE STANDARD TABLE OF x255 WITH NON-UNIQUE DEFAULT KEY, - ls_binary_data LIKE LINE OF lt_binary_data, - lv_filename TYPE string, - lv_errormessage TYPE string. - - MOVE i_filename TO lv_filename. - - cl_gui_frontend_services=>gui_upload( EXPORTING - filename = lv_filename - filetype = 'BIN' " We are basically working with zipped directories --> force binary read - IMPORTING - filelength = lv_filelength - CHANGING - data_tab = lt_binary_data - 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 <> 0. - lv_errormessage = 'A problem occured when reading the file'(001). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - -*--------------------------------------------------------------------* -* Binary data needs to be provided as XSTRING for further processing -*--------------------------------------------------------------------* - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_filelength - IMPORTING - buffer = r_excel_data - TABLES - binary_tab = lt_binary_data. - - ENDMETHOD. - - - - - method RESOLVE_PATH. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 Determine whether the replacement should be done -* iterative to allow /../../.. or something alike -* 2do§2 Determine whether /./ has to be supported as well -* 2do§3 Create unit-test for this method -* -* Please don't just delete these ToDos if they are not -* needed but leave a comment that states this -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-11 -* - ... -* changes: replaced previous coding by regular expression -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* §1 This routine will receive a path, that may have a relative pathname (/../) included somewhere -* The output should be a resolved path without relative references -* Example: Input xl/worksheets/../drawings/drawing1.xml -* Output xl/drawings/drawing1.xml -*--------------------------------------------------------------------* - - rp_result = ip_path. -*--------------------------------------------------------------------* -* §1 Remove relative pathnames -*--------------------------------------------------------------------* -* Regular expression [^/]*/\.\./ -* [^/]* --> any number of characters other than / -* followed by /\.\./ --> the sequence /../ -* ==> worksheets/../ will be found in the example -*--------------------------------------------------------------------* - REPLACE REGEX '[^/]*/\.\./' IN rp_result WITH ``. - - - endmethod. - - - method RESOLVE_REFERENCED_FORMULAE. - TYPES: BEGIN OF ty_referenced_cells, - sheet TYPE REF TO zcl_excel_worksheet, - si TYPE i, - row_from TYPE i, - row_to TYPE i, - col_from TYPE i, - col_to TYPE i, - formula TYPE string, - ref_cell TYPE char10, - END OF ty_referenced_cells. - - DATA: ls_ref_formula LIKE LINE OF me->mt_ref_formulae, - lts_referenced_cells TYPE SORTED TABLE OF ty_referenced_cells WITH NON-UNIQUE KEY sheet si row_from row_to col_from col_to, - ls_referenced_cell LIKE LINE OF lts_referenced_cells, - lv_col_from TYPE zexcel_cell_column_alpha, - lv_col_to TYPE zexcel_cell_column_alpha, - lv_resulting_formula TYPE string, - lv_current_cell TYPE char10. - - - me->mt_ref_formulae = me->mt_ref_formulae. - -*--------------------------------------------------------------------* -* Get referenced Cells, Build ranges for easy lookup -*--------------------------------------------------------------------* - LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref <> space. - - CLEAR ls_referenced_cell. - ls_referenced_cell-sheet = ls_ref_formula-sheet. - ls_referenced_cell-si = ls_ref_formula-si. - ls_referenced_cell-formula = ls_ref_formula-formula. - - TRY. - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = ls_ref_formula-ref - IMPORTING e_column_start = lv_col_from - e_column_end = lv_col_to - e_row_start = ls_referenced_cell-row_from - e_row_end = ls_referenced_cell-row_to ). - ls_referenced_cell-col_from = zcl_excel_common=>convert_column2int( lv_col_from ). - ls_referenced_cell-col_to = zcl_excel_common=>convert_column2int( lv_col_to ). - - - CLEAR ls_referenced_cell-ref_cell. - TRY. - ls_referenced_cell-ref_cell(3) = zcl_excel_common=>convert_column2alpha( ls_ref_formula-column ). - ls_referenced_cell-ref_cell+3 = ls_ref_formula-row. - CONDENSE ls_referenced_cell-ref_cell NO-GAPS. - CATCH zcx_excel. - ENDTRY. - - INSERT ls_referenced_cell INTO TABLE lts_referenced_cells. - CATCH zcx_excel. - ENDTRY. - - ENDLOOP. - -* break x0009004. -*--------------------------------------------------------------------* -* For each referencing cell determine the referenced cell -* and resolve the formula -*--------------------------------------------------------------------* - LOOP AT me->mt_ref_formulae INTO ls_ref_formula WHERE ref = space. - - - CLEAR lv_current_cell. - TRY. - lv_current_cell(3) = zcl_excel_common=>convert_column2alpha( ls_ref_formula-column ). - lv_current_cell+3 = ls_ref_formula-row. - CONDENSE lv_current_cell NO-GAPS. - CATCH zcx_excel. - ENDTRY. - - LOOP AT lts_referenced_cells INTO ls_referenced_cell WHERE sheet = ls_ref_formula-sheet - AND si = ls_ref_formula-si - AND row_from <= ls_ref_formula-row - AND row_to >= ls_ref_formula-row - AND col_from <= ls_ref_formula-column - AND col_to >= ls_ref_formula-column. - - TRY. - - lv_resulting_formula = zcl_excel_common=>determine_resulting_formula( iv_reference_cell = ls_referenced_cell-ref_cell - iv_reference_formula = ls_referenced_cell-formula - iv_current_cell = lv_current_cell ). - - ls_referenced_cell-sheet->set_cell_formula( ip_column = ls_ref_formula-column - ip_row = ls_ref_formula-row - ip_formula = lv_resulting_formula ). - CATCH zcx_excel. - ENDTRY. - EXIT. - - ENDLOOP. - - ENDLOOP. - endmethod. - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - METHOD load_vbaproject. - - DATA lv_content TYPE xstring. - - lv_content = me->get_from_zip_archive( ip_path ). - - ip_excel->zif_excel_book_vba_project~set_vbaproject( lv_content ). - - ENDMETHOD. - - - method LOAD_WORKBOOK. - super->load_workbook( EXPORTING iv_workbook_full_filename = iv_workbook_full_filename - io_excel = io_excel ). - - CONSTANTS: lc_vba_project TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject'. - - DATA: rels_workbook_path TYPE string, - rels_workbook TYPE REF TO if_ixml_document, - path TYPE string, - node TYPE REF TO if_ixml_element, - workbook TYPE REF TO if_ixml_document, - stripped_name TYPE chkfile, - dirname TYPE string, - relationship TYPE t_relationship, - fileversion TYPE t_fileversion, - workbookpr TYPE t_workbookpr. - - FIELD-SYMBOLS: <worksheet> TYPE t_relationship. - - CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH' - EXPORTING - full_name = iv_workbook_full_filename - IMPORTING - stripped_name = stripped_name - file_path = dirname. - - " Read Workbook Relationships - CONCATENATE dirname '_rels/' stripped_name '.rels' - INTO rels_workbook_path. - - rels_workbook = me->get_ixml_from_zip_archive( rels_workbook_path ). - - node ?= rels_workbook->find_from_name( 'Relationship' ). - WHILE node IS BOUND. - me->fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = relationship ). - - CASE relationship-type. - WHEN lc_vba_project. - " Read VBA binary - CONCATENATE dirname relationship-target INTO path. - me->load_vbaproject( ip_path = path - ip_excel = io_excel ). - WHEN OTHERS. - ENDCASE. - - node ?= node->get_next( ). - ENDWHILE. - - " Read Workbook codeName - workbook = me->get_ixml_from_zip_archive( iv_workbook_full_filename ). - node ?= workbook->find_from_name( 'fileVersion' ). - IF node IS BOUND. - - fill_struct_from_attributes( EXPORTING ip_element = node - CHANGING cp_structure = fileversion ). - - io_excel->zif_excel_book_vba_project~set_codename( fileversion-codename ). - ENDIF. - - " Read Workbook codeName - workbook = me->get_ixml_from_zip_archive( iv_workbook_full_filename ). - node ?= workbook->find_from_name( 'workbookPr' ). - IF node IS BOUND. - - fill_struct_from_attributes( EXPORTING ip_element = node - CHANGING cp_structure = workbookpr ). - - io_excel->zif_excel_book_vba_project~set_codename_pr( workbookpr-codename ). - ENDIF. - - endmethod. - - - method LOAD_WORKSHEET. - - super->load_worksheet( EXPORTING ip_path = ip_path - io_worksheet = io_worksheet ). - - DATA: path TYPE string, - node TYPE REF TO if_ixml_element, - worksheet TYPE REF TO if_ixml_document, - sheetpr TYPE t_sheetpr. - - -* " Read Workbook codeName -* workbook = me->get_ixml_from_zip_archive( ip_path ). -* node ?= workbook->find_from_name( 'fileVersion' ). -* IF node IS BOUND. -* -* fill_struct_from_attributes( EXPORTING ip_element = node -* CHANGING cp_structure = fileversion ). -* -* IO_WORKSHEET->zif_excel_book_vba_project~set_codename( fileversion-codename ). -* ENDIF. - - " Read Workbook codeName - worksheet = me->get_ixml_from_zip_archive( ip_path ). - node ?= worksheet->find_from_name( 'sheetPr' ). - IF node IS BOUND. - - fill_struct_from_attributes( EXPORTING ip_element = node - CHANGING cp_structure = sheetpr ). - - io_worksheet->zif_excel_sheet_vba_project~set_codename_pr( sheetpr-codename ). - ENDIF. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - METHOD is_security_enabled. - IF lockrevision EQ abap_true OR lockstructure EQ abap_true OR lockwindows EQ abap_true. - ep_security_enabled = abap_true. - ENDIF. -ENDMETHOD. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - orientation = me->c_orientation_default. - -* default margins - margin_bottom = '0.75'. - margin_footer = '0.3'. - margin_header = '0.3'. - margin_left = '0.7'. - margin_right = '0.7'. - margin_top = '0.75'. - -* clear page settings - CLEAR: black_and_white, - cell_comments, - copies, - draft, - errors, - first_page_number, - fit_to_page, - fit_to_height, - fit_to_width, - horizontal_dpi, - orientation, - page_order, - paper_height, - paper_size, - paper_width, - scale, - use_first_page_num, - use_printer_defaults, - vertical_dpi. - endmethod. - - - - - - - method GET_HEADER_FOOTER_STRING. -* ---------------------------------------------------------------------- - DATA: lc_marker_left(2) TYPE c VALUE '&L' - , lc_marker_right(2) TYPE c VALUE '&R' - , lc_marker_center(2) TYPE c VALUE '&C' - , lv_value TYPE string - . -* ---------------------------------------------------------------------- - IF ep_odd_header IS SUPPLIED. - - IF me->odd_header-left_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'LEFT' ). - CONCATENATE lc_marker_left lv_value INTO ep_odd_header. - ENDIF. - - IF me->odd_header-center_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'CENTER' ). - CONCATENATE ep_odd_header lc_marker_center lv_value INTO ep_odd_header. - ENDIF. - - IF me->odd_header-right_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->odd_header ip_side = 'RIGHT' ). - CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_odd_header. - ENDIF. - - ENDIF. -* ---------------------------------------------------------------------- - IF ep_odd_footer IS SUPPLIED. - - IF me->odd_footer-left_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'LEFT' ). - CONCATENATE lc_marker_left lv_value INTO ep_odd_footer. - ENDIF. - - IF me->odd_footer-center_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'CENTER' ). - CONCATENATE ep_odd_footer lc_marker_center lv_value INTO ep_odd_footer. - ENDIF. - - IF me->odd_footer-right_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->odd_footer ip_side = 'RIGHT' ). - CONCATENATE ep_odd_footer lc_marker_right lv_value INTO ep_odd_footer. - ENDIF. - - ENDIF. -* ---------------------------------------------------------------------- - IF ep_even_header IS SUPPLIED. - - IF me->even_header-left_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'LEFT' ). - CONCATENATE lc_marker_left lv_value INTO ep_even_header. - ENDIF. - - IF me->even_header-center_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'CENTER' ). - CONCATENATE ep_even_header lc_marker_center lv_value INTO ep_even_header. - ENDIF. - - IF me->even_header-right_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->even_header ip_side = 'RIGHT' ). - CONCATENATE ep_even_header lc_marker_right lv_value INTO ep_even_header. - ENDIF. - - ENDIF. -* ---------------------------------------------------------------------- - IF ep_even_footer IS SUPPLIED. - - IF me->even_footer-left_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'LEFT' ). - CONCATENATE lc_marker_left lv_value INTO ep_even_footer. - ENDIF. - - IF me->even_footer-center_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'CENTER' ). - CONCATENATE ep_even_footer lc_marker_center lv_value INTO ep_even_footer. - ENDIF. - - IF me->even_footer-right_value IS NOT INITIAL. - lv_value = me->process_header_footer( ip_header = me->even_footer ip_side = 'RIGHT' ). - CONCATENATE ep_even_footer lc_marker_right lv_value INTO ep_even_footer. - ENDIF. - - ENDIF. -* ---------------------------------------------------------------------- - endmethod. - - - - - - method PROCESS_HEADER_FOOTER. - -* ---------------------------------------------------------------------- -* Only Basic font/text formatting possible: -* Bold (yes / no), Font Type, Font Size - - DATA: lv_fname(12) TYPE c - , lv_string TYPE string - . - - FIELD-SYMBOLS: <lv_value> TYPE string - , <ls_font> TYPE zexcel_s_style_font - . - -* ---------------------------------------------------------------------- - CONCATENATE ip_side '_VALUE' INTO lv_fname. - ASSIGN COMPONENT lv_fname OF STRUCTURE ip_header TO <lv_value>. - - CONCATENATE ip_side '_FONT' INTO lv_fname. - ASSIGN COMPONENT lv_fname OF STRUCTURE ip_header TO <ls_font>. - - IF <ls_font> IS ASSIGNED AND <lv_value> IS ASSIGNED. - - IF <ls_font>-name IS NOT INITIAL. - CONCATENATE '&"' <ls_font>-name ',' INTO rv_processed_string. - ELSE. - rv_processed_string = '&"-,'. - ENDIF. - - IF <ls_font>-bold = abap_true. - CONCATENATE rv_processed_string 'Bold"' INTO rv_processed_string. - ELSE. - CONCATENATE rv_processed_string 'Standard"' INTO rv_processed_string. - ENDIF. - - IF <ls_font>-size IS NOT INITIAL. - lv_string = <ls_font>-size. - CONCATENATE rv_processed_string '&' lv_string INTO rv_processed_string. - ENDIF. - - CONCATENATE rv_processed_string <lv_value> INTO rv_processed_string. - - ENDIF. -* ---------------------------------------------------------------------- - - endmethod. - - - - - - - method SET_HEADER_FOOTER. - -* Only Basic font/text formatting possible: -* Bold (yes / no), Font Type, Font Size -* -* usefull placeholders, which can be used in header/footer value strings -* '&P' - page number -* '&N' - total number of pages -* '&D' - Date -* '&T' - Time -* '&F' - File Name -* '&Z' - Path -* '&A' - Sheet name -* new line via class constant CL_ABAP_CHAR_UTILITIES=>newline -* -* Example Value String 'page &P of &N' -* -* DO NOT USE &L , &C or &R which automatically created as position markers - - me->odd_header = ip_odd_header. - me->odd_footer = ip_odd_footer. - me->even_header = ip_even_header. - me->even_footer = ip_even_footer. - - IF me->even_header IS NOT INITIAL OR me->even_footer IS NOT INITIAL. - me->diff_oddeven_headerfooter = abap_true. - ENDIF. - - - endmethod. - - - - - - - - - - method SET_PAGE_MARGINS. - DATA: lv_coef TYPE f, - lv_unit TYPE string. - - lv_unit = ip_unit. - TRANSLATE lv_unit TO UPPER CASE. - - CASE lv_unit. - WHEN 'IN'. lv_coef = 1. - WHEN 'CM'. lv_coef = '0.393700787'. - WHEN 'MM'. lv_coef = '0.0393700787'. - ENDCASE. - - IF ip_bottom IS SUPPLIED. margin_bottom = lv_coef * ip_bottom. ENDIF. - IF ip_footer IS SUPPLIED. margin_footer = lv_coef * ip_footer. ENDIF. - IF ip_header IS SUPPLIED. margin_header = lv_coef * ip_header. ENDIF. - IF ip_left IS SUPPLIED. margin_left = lv_coef * ip_left. ENDIF. - IF ip_right IS SUPPLIED. margin_right = lv_coef * ip_right. ENDIF. - IF ip_top IS SUPPLIED. margin_top = lv_coef * ip_top. ENDIF. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - method CONSTRUCTOR. - - - CREATE OBJECT font. - CREATE OBJECT fill. - CREATE OBJECT borders. - CREATE OBJECT alignment. - CREATE OBJECT number_format. - CREATE OBJECT protection. - -* Start of insertion # issue 139 - Dateretention of cellstyles - IF ip_guid IS NOT INITIAL. - me->guid = ip_guid. - ELSE. -* End of insertion # issue 139 - Dateretention of cellstyles - CALL FUNCTION 'GUID_CREATE' - IMPORTING - ev_guid_16 = me->guid. -* Start of insertion # issue 139 - Dateretention of cellstyles - ENDIF. -* End of insertion # issue 139 - Dateretention of cellstyles - - endmethod. - - - - method GET_GUID. - - - ep_guid = me->guid. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - method ADD. - - - styles->add( ip_style ). - endmethod. - - - method CLEAR. - - - styles->clear( ). - endmethod. - - - method CONSTRUCTOR. - - - CREATE OBJECT styles. - endmethod. - - - - - method GET. - - - eo_style ?= styles->if_object_collection~get( ip_index ). - endmethod. - - - - method GET_ITERATOR. - - - eo_iterator ?= styles->if_object_collection~get_iterator( ). - endmethod. - - - - method IS_EMPTY. - - - is_empty = styles->if_object_collection~is_empty( ). - endmethod. - - - - - method REGISTER_NEW_STYLE. - - - me->add( io_style ). - ep_style_code = me->size( ) - 1. "style count starts from 0 - endmethod. - - - - method REMOVE. - - - styles->remove( ip_style ). - endmethod. - - - - method SIZE. - - - ep_size = styles->if_object_collection~size( ). - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - method ADD. - styles_conditional->add( ip_style_conditional ). - endmethod. - - - method CLEAR. - styles_conditional->clear( ). - endmethod. - - - method CONSTRUCTOR. - - CREATE OBJECT styles_conditional. - - endmethod. - - - - - method GET. - DATA lv_index TYPE i. - lv_index = ip_index. - eo_style_conditional ?= styles_conditional->if_object_collection~get( lv_index ). - endmethod. - - - - method GET_ITERATOR. - eo_iterator ?= styles_conditional->if_object_collection~get_iterator( ). - endmethod. - - - - method IS_EMPTY. - is_empty = styles_conditional->if_object_collection~is_empty( ). - endmethod. - - - - method REMOVE. - styles_conditional->remove( ip_style_conditional ). - endmethod. - - - - method SIZE. - ep_size = styles_conditional->if_object_collection~size( ). - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - horizontal = me->c_horizontal_general. - vertical = me->c_vertical_bottom. - wrapText = abap_false. - shrinkToFit = abap_false. - endmethod. - - - - method GET_STRUCTURE. - - es_alignment-horizontal = me->horizontal. - es_alignment-vertical = me->vertical. - es_alignment-textrotation = me->textrotation. - es_alignment-wraptext = me->wraptext. - es_alignment-shrinktofit = me->shrinktofit. - es_alignment-indent = me->indent. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - method CONSTRUCTOR. - border_style = zcl_excel_style_border=>c_border_none. - border_color-theme = zcl_excel_style_color=>c_theme_not_set. - border_color-indexed = zcl_excel_style_color=>c_indexed_not_set. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - method GET_STRUCTURE. -*initialize colors to 'not set' - es_fill-left_color-indexed = zcl_excel_style_color=>c_indexed_not_set. - es_fill-left_color-theme = zcl_excel_style_color=>c_theme_not_set. - es_fill-right_color-indexed = zcl_excel_style_color=>c_indexed_not_set. - es_fill-right_color-theme = zcl_excel_style_color=>c_theme_not_set. - es_fill-top_color-indexed = zcl_excel_style_color=>c_indexed_not_set. - es_fill-top_color-theme = zcl_excel_style_color=>c_theme_not_set. - es_fill-bottom_color-indexed = zcl_excel_style_color=>c_indexed_not_set. - es_fill-bottom_color-theme = zcl_excel_style_color=>c_theme_not_set. - es_fill-diagonal_color-indexed = zcl_excel_style_color=>c_indexed_not_set. - es_fill-diagonal_color-theme = zcl_excel_style_color=>c_theme_not_set. - -* Check if all borders is set otherwise check single border - IF me->allborders IS BOUND. - es_fill-left_color = me->allborders->border_color. - es_fill-left_style = me->allborders->border_style. - es_fill-right_color = me->allborders->border_color. - es_fill-right_style = me->allborders->border_style. - es_fill-top_color = me->allborders->border_color. - es_fill-top_style = me->allborders->border_style. - es_fill-bottom_color = me->allborders->border_color. - es_fill-bottom_style = me->allborders->border_style. - ELSE. - IF me->left IS BOUND. - es_fill-left_color = me->left->border_color. - es_fill-left_style = me->left->border_style. - ENDIF. - IF me->right IS BOUND. - es_fill-right_color = me->right->border_color. - es_fill-right_style = me->right->border_style. - ENDIF. - IF me->top IS BOUND. - es_fill-top_color = me->top->border_color. - es_fill-top_style = me->top->border_style. - ENDIF. - IF me->down IS BOUND. - es_fill-bottom_color = me->down->border_color. - es_fill-bottom_style = me->down->border_style. - ENDIF. - ENDIF. - -* Check if diagonal is set - IF me->diagonal IS BOUND. - es_fill-diagonal_color = me->diagonal->border_color. - es_fill-diagonal_style = me->diagonal->border_style. - CASE me->diagonal_mode. - WHEN 1. - es_fill-diagonalup = 1. - es_fill-diagonaldown = 0. - WHEN 2. - es_fill-diagonalup = 0. - es_fill-diagonaldown = 1. - WHEN 3. - es_fill-diagonalup = 1. - es_fill-diagonaldown = 1. - WHEN OTHERS. - es_fill-diagonalup = 0. - es_fill-diagonaldown = 0. - ENDCASE. - ENDIF. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method CREATE_NEW_ARGB. - - - CONCATENATE zcl_excel_style_color=>c_alpha ip_red ip_green ip_blu INTO ep_color_argb. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method GET_BOTTOM_ROW_INTEGER. - DATA: lv_table_lines TYPE i. - FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. - - IF settings-bottom_right_row IS NOT INITIAL. -* ev_row = zcl_excel_common=>convert_column2int( settings-bottom_right_row ). " del issue #246 - ev_row = settings-bottom_right_row . " ins issue #246 - EXIT. - ENDIF. - - ASSIGN table_data->* TO <fs_table>. - DESCRIBE TABLE <fs_table> LINES lv_table_lines. - IF lv_table_lines = 0. - lv_table_lines = 1. "table needs at least 1 data row - ENDIF. - - ev_row = settings-top_left_row + lv_table_lines. - - IF me->has_totals( ) = abap_true." ???? AND ip_include_totals_row = abap_true. - ADD 1 TO ev_row. - ENDIF. - endmethod. - - - - method GET_ID. - ov_id = id. - endmethod. - - - - method GET_NAME. - - IF me->name IS INITIAL. - me->name = zcl_excel_common=>number_to_excel_string( ip_value = me->id ). - CONCATENATE 'table' me->name INTO me->name. - ENDIF. - - ov_name = me->name. - endmethod. - - - - - method GET_REFERENCE. - DATA: lv_column TYPE zexcel_cell_column, - lv_table_lines TYPE i, - lv_right_column TYPE zexcel_cell_column_alpha, - ls_field_catalog TYPE zexcel_s_fieldcatalog, - lv_bottom_row TYPE zexcel_cell_row, - lv_top_row_string(10) TYPE c, - lv_bottom_row_string(10) TYPE c. - - FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE. - -*column - lv_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). - lv_table_lines = 0. - LOOP AT fieldcat INTO ls_field_catalog WHERE dynpfld EQ abap_true. - ADD 1 TO lv_table_lines. - ENDLOOP. - lv_column = lv_column + lv_table_lines - 1. - lv_right_column = zcl_excel_common=>convert_column2alpha( lv_column ). - -*row - ASSIGN table_data->* TO <fs_table>. - DESCRIBE TABLE <fs_table> LINES lv_table_lines. - IF lv_table_lines = 0. - lv_table_lines = 1. "table needs at least 1 data row - ENDIF. - lv_bottom_row = settings-top_left_row + lv_table_lines . - - IF me->has_totals( ) = abap_true AND ip_include_totals_row = abap_true. - ADD 1 TO lv_bottom_row. - ENDIF. - - lv_top_row_string = zcl_excel_common=>number_to_excel_string( settings-top_left_row ). - lv_bottom_row_string = zcl_excel_common=>number_to_excel_string( lv_bottom_row ). - - CONCATENATE settings-top_left_column lv_top_row_string - ':' - lv_right_column lv_bottom_row_string INTO ov_reference. - - endmethod. - - - - - method GET_RIGHT_COLUMN_INTEGER. - DATA: lv_column TYPE zexcel_cell_column, - lv_table_lines TYPE i, - ls_field_catalog TYPE zexcel_s_fieldcatalog. - - IF settings-bottom_right_column IS NOT INITIAL. - ev_column = zcl_excel_common=>convert_column2int( settings-bottom_right_column ). - EXIT. - ENDIF. - - ev_column = zcl_excel_common=>convert_column2int( settings-top_left_column ). - LOOP AT fieldcat INTO ls_field_catalog WHERE dynpfld EQ abap_true. - ADD 1 TO ev_column. - ENDLOOP. - - endmethod. - - - - - - method GET_TOTALS_FORMULA. - CONSTANTS: lc_function_id_sum TYPE string VALUE '109', - lc_function_id_min TYPE string VALUE '105', - lc_function_id_max TYPE string VALUE '104', - lc_function_id_count TYPE string VALUE '103', - lc_function_id_average TYPE string VALUE '101'. - - DATA: lv_function_id TYPE string. - - CASE ip_function. - WHEN zcl_excel_table=>totals_function_sum. - lv_function_id = lc_function_id_sum. - - WHEN zcl_excel_table=>totals_function_min. - lv_function_id = lc_function_id_min. - - WHEN zcl_excel_table=>totals_function_max. - lv_function_id = lc_function_id_max. - - WHEN zcl_excel_table=>totals_function_count. - lv_function_id = lc_function_id_count. - - WHEN zcl_excel_table=>totals_function_average. - lv_function_id = lc_function_id_average. - - WHEN zcl_excel_table=>totals_function_custom. " issue #292 - RETURN. - - WHEN OTHERS. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Invalid totals formula. See ZCL_ for possible values'. - ENDCASE. - - CONCATENATE 'SUBTOTAL(' lv_function_id ',[' ip_column '])' INTO ep_formula. - endmethod. - - - - method HAS_TOTALS. - DATA: ls_field_catalog TYPE zexcel_s_fieldcatalog. - - ep_result = abap_false. - - LOOP AT fieldcat INTO ls_field_catalog. - IF ls_field_catalog-totals_function IS NOT INITIAL. - ep_result = abap_true. - EXIT. - ENDIF. - ENDLOOP. - - endmethod. - - - - METHOD set_data. - - DATA lr_temp TYPE REF TO data. - - FIELD-SYMBOLS: <lt_table_temp> TYPE ANY TABLE, - <lt_table> TYPE ANY TABLE. - - GET REFERENCE OF ir_data INTO lr_temp. - ASSIGN lr_temp->* TO <lt_table_temp>. - CREATE DATA table_data LIKE <lt_table_temp>. - ASSIGN me->table_data->* TO <lt_table>. - <lt_table> = <lt_table_temp>. - -ENDMETHOD. - - - - method SET_ID. - id = iv_id. - endmethod. - - - - - - - - - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - -*&---------------------------------------------------------------------* -*& Class (Implementation) C_OI_PROXY_ERROR -*&---------------------------------------------------------------------* -CLASS c_oi_proxy_error IMPLEMENTATION. - METHOD constructor. -* IMPORTING object_name TYPE c -* method_name TYPE c. - error_nr = ret_call_not_flushed. - me->i_oi_error~error_code = c_oi_errors=>ret_call_not_flushed. - me->i_oi_error~is_flushed = ' '. - me->i_oi_error~has_failed = 'X'. - me->i_oi_error~has_succeeded = ' '. - me->message_id = 'SOFFICEINTEGRATION'. - me->message_nr = '899'. - me->param1 = object_name. - me->param2 = method_name. - ENDMETHOD. "constructor - - METHOD i_oi_error~flush_error. - IF error_nr EQ 0. - me->i_oi_error~error_code = c_oi_errors=>ret_ok. - me->i_oi_error~is_flushed = 'X'. - me->i_oi_error~has_failed = ' '. - me->i_oi_error~has_succeeded = 'X'. - me->message_id = ''. - me->message_nr = '000'. - CALL METHOD c_oi_errors=>translate_proxy_error_code - EXPORTING - errorcode = error_nr - IMPORTING - retcode = me->i_oi_error~error_code. - ELSEIF error_nr EQ ret_call_not_flushed. - "call still not flushed - CALL METHOD c_oi_errors=>translate_proxy_error_code - EXPORTING - errorcode = error_nr - errorstring = me->param2 "method name - objectname = me->param1 - IMPORTING - retcode = me->i_oi_error~error_code. - ELSE. - me->i_oi_error~is_flushed = 'X'. - me->i_oi_error~has_succeeded = ' '. - me->i_oi_error~has_failed = 'X'. - CALL METHOD c_oi_errors=>translate_proxy_error_code - EXPORTING - errorcode = error_nr - errorstring = error_string - IMPORTING - retcode = me->i_oi_error~error_code. - CALL METHOD c_oi_errors=>get_message - IMPORTING - message_id = me->message_id - message_number = me->message_nr - param1 = me->param1 - param2 = me->param2 - param3 = me->param3 - param4 = me->param4. - ENDIF. - ENDMETHOD. "i_oi_error~flush_error - - METHOD i_oi_error~raise_message. -* IMPORTING type TYPE c. -* EXCEPTIONS message_raised flush_failed. - IF me->i_oi_error~has_succeeded IS INITIAL. - IF NOT me->i_oi_error~is_flushed IS INITIAL. - MESSAGE ID message_id TYPE type - NUMBER message_nr WITH param1 param2 param3 param4 - RAISING message_raised. - ELSE. - RAISE flush_failed. - ENDIF. - ENDIF. - ENDMETHOD. "i_oi_error~raise_message - - METHOD i_oi_error~get_message. -* EXPORTING message_id TYPE c -* message_number TYPE c -* param1 TYPE c -* param2 TYPE c -* param3 TYPE c -* param4 TYPE c. - param1 = me->param1. param2 = me->param2. - param3 = me->param3. param4 = me->param4. - - message_id = me->message_id. - message_number = me->message_nr. - ENDMETHOD. "i_oi_error~get_message -ENDCLASS. "C_OI_PROXY_ERROR - -*&---------------------------------------------------------------------* -*& Class (Implementation) CL_GRID_ACCESSION -*&---------------------------------------------------------------------* -CLASS lcl_gui_alv_grid IMPLEMENTATION. - - METHOD get_alv_attributes. - CREATE DATA et_table LIKE io_grid->mt_outtab. - et_table = io_grid->mt_outtab. - ENDMETHOD. "get_data - -ENDCLASS. "CL_GRID_ACCESSION - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature -TYPE-POOLS: sydes. -TYPE-POOLS: slis. -*--------------------------------------------------------------------* -* CLASS c_oi_proxy_error -*--------------------------------------------------------------------* -* use for method bind_ALV -*--------------------------------------------------------------------* -CLASS c_oi_proxy_error DEFINITION. - PUBLIC SECTION. - INTERFACES: i_oi_error. - DATA: error_nr TYPE i. - DATA: error_string TYPE sy-msgv1. - - METHODS: constructor IMPORTING object_name TYPE c - method_name TYPE c. - PRIVATE SECTION. - CONSTANTS: - ret_call_not_flushed TYPE i VALUE -999999. - - DATA: message_id TYPE sy-msgid, - message_nr TYPE sy-msgno, - param1 TYPE sy-msgv1, - param2 TYPE sy-msgv2, - param3 TYPE sy-msgv3, - param4 TYPE sy-msgv4. -ENDCLASS. "c_oi_proxy_error DEFINITION - -*--------------------------------------------------------------------* -* CLASS lcl_gui_alv_grid -*--------------------------------------------------------------------* -* to get protected attribute and method of cl_gui_alv_grid -* use for method bind_ALV -*--------------------------------------------------------------------* -CLASS lcl_gui_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid. - - PUBLIC SECTION. -* get ALV grid data - METHODS: get_alv_attributes - IMPORTING - io_grid TYPE REF TO cl_gui_alv_grid " ALV grid - EXPORTING - et_table TYPE REF TO data. " dta table - -ENDCLASS. "lcl_gui_alv_grid DEFINITION - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - ABAP - SLIS - SOI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_COLUMNS. - -*--------------------------------------------------------------------* -* adjust internal representation -*--------------------------------------------------------------------* - CLEAR: me->print_title_col_from, - me->print_title_col_to . - - -*--------------------------------------------------------------------* -* adjust corresponding range -*--------------------------------------------------------------------* - me->print_title_set_range( ). - - - endmethod. - - - method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_ROWS. - -*--------------------------------------------------------------------* -* adjust internal representation -*--------------------------------------------------------------------* - CLEAR: me->print_title_row_from, - me->print_title_row_to . - - -*--------------------------------------------------------------------* -* adjust corresponding range -*--------------------------------------------------------------------* - me->print_title_set_range( ). - - - endmethod. - - - method ZIF_EXCEL_SHEET_PRINTSETTINGS~GET_PRINT_REPEAT_COLUMNS. - ev_columns_from = me->print_title_col_from. - ev_columns_to = me->print_title_col_to. - endmethod. - - - method ZIF_EXCEL_SHEET_PRINTSETTINGS~GET_PRINT_REPEAT_ROWS. - ev_rows_from = me->print_title_row_from. - ev_rows_to = me->print_title_row_to. - endmethod. - - - method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_COLUMNS. -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 -*--------------------------------------------------------------------* - - DATA: lv_col_from_int TYPE i, - lv_col_to_int TYPE i, - lv_errormessage TYPE string. - - DATA: lo_range_iterator TYPE REF TO cl_object_collection_iterator, - lo_range TYPE REF TO zcl_excel_range. - - - lv_col_from_int = zcl_excel_common=>convert_column2int( iv_columns_from ). - lv_col_to_int = zcl_excel_common=>convert_column2int( iv_columns_to ). - -*--------------------------------------------------------------------* -* Check if valid range is supplied -*--------------------------------------------------------------------* - IF lv_col_from_int < 1. - lv_errormessage = 'Invalid range supplied for print-title repeatable columns'(401). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - IF lv_col_from_int > lv_col_to_int. - lv_errormessage = 'Invalid range supplied for print-title repeatable columns'(401). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - -*--------------------------------------------------------------------* -* adjust internal representation -*--------------------------------------------------------------------* - me->print_title_col_from = iv_columns_from. - me->print_title_col_to = iv_columns_to. - - -*--------------------------------------------------------------------* -* adjust corresponding range -*--------------------------------------------------------------------* - me->print_title_set_range( ). - - endmethod. - - - method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_ROWS. -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 -*--------------------------------------------------------------------* - - DATA: lv_errormessage TYPE string. - - DATA: lo_range_iterator TYPE REF TO cl_object_collection_iterator, - lo_range TYPE REF TO zcl_excel_range. - - - -*--------------------------------------------------------------------* -* Check if valid range is supplied -*--------------------------------------------------------------------* - IF iv_rows_from < 1. - lv_errormessage = 'Invalid range supplied for print-title repeatable rowumns'(401). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - IF iv_rows_from > iv_rows_to. - lv_errormessage = 'Invalid range supplied for print-title repeatable rowumns'(401). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - -*--------------------------------------------------------------------* -* adjust internal representation -*--------------------------------------------------------------------* - me->print_title_row_from = iv_rows_from. - me->print_title_row_to = iv_rows_to. - - -*--------------------------------------------------------------------* -* adjust corresponding range -*--------------------------------------------------------------------* - me->print_title_set_range( ). - - - endmethod. - - - method ZIF_EXCEL_SHEET_PROPERTIES~GET_STYLE. - IF zif_excel_sheet_properties~style IS NOT INITIAL. - ep_style = zif_excel_sheet_properties~style. - ELSE. - ep_style = me->excel->get_default_style( ). - ENDIF. - endmethod. - - - method ZIF_EXCEL_SHEET_PROPERTIES~INITIALIZE. - - zif_excel_sheet_properties~show_zeros = zif_excel_sheet_properties=>c_showzero. - zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_on. - zif_excel_sheet_properties~summaryright = zif_excel_sheet_properties=>c_right_on. - -* inizialize zoomscale values - ZIF_EXCEL_SHEET_PROPERTIES~zoomscale = 100. - ZIF_EXCEL_SHEET_PROPERTIES~zoomscale_normal = 100. - ZIF_EXCEL_SHEET_PROPERTIES~zoomscale_pagelayoutview = 100 . - ZIF_EXCEL_SHEET_PROPERTIES~zoomscale_sheetlayoutview = 100 . - endmethod. - - - method ZIF_EXCEL_SHEET_PROPERTIES~SET_STYLE. - zif_excel_sheet_properties~style = ip_style. - endmethod. - - - method ZIF_EXCEL_SHEET_PROTECTION~INITIALIZE. - - me->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_unprotected. - CLEAR me->zif_excel_sheet_protection~password. - me->zif_excel_sheet_protection~auto_filter = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~delete_columns = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~delete_rows = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~format_cells = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~format_columns = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~format_rows = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~insert_columns = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~insert_hyperlinks = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~insert_rows = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_noactive. -* me->zif_excel_sheet_protection~password = zif_excel_sheet_protection=>c_noactive. "issue #68 - me->zif_excel_sheet_protection~pivot_tables = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~select_locked_cells = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~select_unlocked_cells = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_noactive. - me->zif_excel_sheet_protection~sort = zif_excel_sheet_protection=>c_noactive. - - endmethod. - - - method ZIF_EXCEL_SHEET_VBA_PROJECT~SET_CODENAME. - me->zif_excel_sheet_vba_project~codename = ip_codename. - endmethod. - - - method ZIF_EXCEL_SHEET_VBA_PROJECT~SET_CODENAME_PR. - me->zif_excel_sheet_vba_project~codename_pr = ip_codename_pr. - endmethod. - - - - method ADD_DRAWING. - CASE ip_drawing->get_type( ). - WHEN zcl_excel_drawing=>type_image. - drawings->include( ip_drawing ). - WHEN zcl_excel_drawing=>type_chart. - charts->include( ip_drawing ). - ENDCASE. - endmethod. - - - - method ADD_NEW_CONDITIONAL_STYLE. - - CREATE OBJECT eo_conditional_style. - conditional_styles->add( eo_conditional_style ). - endmethod. - - - - method ADD_NEW_DATA_VALIDATION. - - CREATE OBJECT eo_data_validation. - data_validations->add( eo_data_validation ). - endmethod. - - - - method ADD_NEW_RANGE. -* Create default blank range - CREATE OBJECT eo_range. - ranges->add( eo_range ). - endmethod. - - - - - - - - - method BIND_ALV. - data: lo_converter type ref to zcl_excel_converter. - - create object lo_converter. - - try. - lo_converter->convert( - exporting - io_alv = io_alv - it_table = it_table - i_row_int = i_top - i_column_int = i_left - i_table = abap_true - i_style_table = table_style - io_worksheet = me - changing - co_excel = excel ). - catch zcx_excel . - endtry. - - endmethod. - - - - - - - - - - - - - - - - - - - - - - method BIND_ALV_OLE2. -*--------------------------------------------------------------------* -* Method description: -* Method use to export a CL_GUI_ALV_GRID object to xlsx/xls file -* with list header and characteristics of ALV field catalog such as: -* + Total, group's subtotal -* + Quantity fields, amount fields (dependent fields) -* + No_out, no_zero, ... -* Technique use in method: -* SAP Desktop Office Integration (DOI) -*--------------------------------------------------------------------* - -* Data for session 0: DOI constructor -* ------------------------------------------ - - data: lo_control type ref to I_OI_CONTAINER_CONTROL. - data: lo_proxy type ref to I_OI_DOCUMENT_PROXY. - data: lo_spreadsheet type ref to I_OI_SPREADSHEET. - data: lo_error type ref to I_OI_ERROR. - data: lc_retcode type SOI_RET_STRING. - data: li_has type i. "Proxy has spreadsheet interface? - data: l_is_closed type i. - -* Data for session 1: Get LVC data from ALV object -* ------------------------------------------ - - data: l_has_activex, - l_doctype_excel_sheet(11) type c. - data: wa_DOC_HANDLE Type CNTL_HANDLE. - -* LVC - data: lt_fieldcat_lvc type LVC_T_FCAT. - data: wa_fieldcat_lvc type lvc_s_fcat. - data: lt_sort_lvc type LVC_T_SORT. - data: lt_filter_idx_lvc type LVC_T_FIDX. - data: lt_GROUPLEVELS_LVC type LVC_T_GRPL. - -* KKBLO - DATA: LT_FIELDCAT_KKBLO Type KKBLO_T_FIELDCAT. - DATA: LT_SORT_KKBLO Type KKBLO_T_SORTINFO. - DATA: LT_GROUPLEVELS_KKBLO Type KKBLO_T_GROUPLEVELS. - DATA: LT_FILTER_IDX_KKBLO Type KKBLO_T_SFINFO. - data: wa_listheader like line of it_listheader. - -* Subtotal - data: lt_collect00 type ref to data. - data: lt_collect01 type ref to data. - data: lt_collect02 type ref to data. - data: lt_collect03 type ref to data. - data: lt_collect04 type ref to data. - data: lt_collect05 type ref to data. - data: lt_collect06 type ref to data. - data: lt_collect07 type ref to data. - data: lt_collect08 type ref to data. - data: lt_collect09 type ref to data. - -* data table name - data: l_tabname type kkblo_tabname. - -* local object - data: lo_grid type ref to lcl_gui_alv_grid. - -* data table get from ALV - data: lt_alv type ref to data. - -* total / subtotal data - field-symbols: <f_collect00> type standard table. - field-symbols: <f_collect01> type standard table. - field-symbols: <f_collect02> type standard table. - field-symbols: <f_collect03> type standard table. - field-symbols: <f_collect04> type standard table. - field-symbols: <f_collect05> type standard table. - field-symbols: <f_collect06> type standard table. - field-symbols: <f_collect07> type standard table. - field-symbols: <f_collect08> type standard table. - field-symbols: <f_collect09> type standard table. - -* table before append subtotal lines - field-symbols: <f_alv_tab> type standard table. - -* data for session 2: sort, filter and calculate total/subtotal -* ------------------------------------------ - -* table to save index of subotal / total line in excel tanle -* this ideal to control index of subtotal / total line later -* for ex, when get subtotal / total line to format - types: begin of st_subtot_indexs, - index type i, - end of st_subtot_indexs. - data: lt_subtot_indexs type table of st_subtot_indexs. - data: wa_subtot_indexs like line of lt_subtot_indexs. - -* data table after append subtotal - data: lt_excel type ref to data. - - data: l_tabix type i. - data: l_save_index type i. - -* dyn subtotal table name - data: l_collect type string. - -* subtotal range, to format subtotal (and total) - data: subranges type soi_range_list. - data: subrangeitem type soi_range_item. - data: l_sub_index type i. - - -* table after append subtotal lines - field-symbols: <f_excel_tab> type standard table. - field-symbols: <f_excel_line> type any. - -* dyn subtotal tables - field-symbols: <f_collect_tab> type standard table. - field-symbols: <f_collect_line> type any. - - field-symbols: <f_filter_idx_line> like line of LT_FILTER_IDX_KKBLO. - field-symbols: <f_fieldcat_line> like line of LT_FIELDCAT_KKBLO. - field-symbols: <f_grouplevels_line> like line of LT_GROUPLEVELS_KKBLO. - field-symbols: <f_line> type any. - -* Data for session 3: map data to semantic table -* ------------------------------------------ - - types: begin of st_column_index, - fieldname type kkblo_fieldname, - tabname type kkblo_tabname, - col like sy-index, - end of st_column_index. - -* columns index - data: lt_column_index type table of st_column_index. - data: wa_column_index like line of lt_column_index. - -* table of dependent field ( currency and quantity unit field) - data: lt_fieldcat_depf type kkblo_t_fieldcat. - data: wa_fieldcat_depf type kkblo_fieldcat. - -* XXL interface: -* -XXL: contain exporting columns characteristic - data: lt_sema type table of gxxlt_s initial size 0. - data: wa_sema like line of lt_sema. - -* -XXL interface: header - data: lt_hkey type table of gxxlt_h initial size 0. - data: wa_hkey like line of lt_hkey. - -* -XXL interface: header keys - data: lt_vkey type table of gxxlt_v initial size 0. - data: wa_vkey like line of lt_vkey. - -* Number of H Keys: number of key columns - data: l_n_hrz_keys type i. -* Number of data columns in the list object: non-key columns no - data: l_n_att_cols type i. -* Number of V Keys: number of header row - data: l_n_vrt_keys type i. - -* curency to format amount - data: lt_tcurx type table of tcurx. - data: wa_tcurx like line of lt_tcurx. - data: l_def type flag. " currency / quantity flag - data: wa_t006 type t006. " decimal place of unit - - data: l_num type i. " table columns number - data: l_typ type c. " table type - data: wa type ref to data. - data: l_int type i. - data: l_counter type i. - - field-symbols: <f_excel_column> type any. - field-symbols: <f_fcat_column> type any. - -* Data for session 4: write to excel -* ------------------------------------------ - - data: data_starting_at type i value 1. - data: data_ending_at type i value -1. - data: sema_type type c. - - data l_error type ref to c_oi_proxy_error. - data count type i. - data datac type i. - data datareal type i. " exporting column number - data vkeycount type i. - data all type i. - data mit type i value 1. " index of recent row? - data li_col_pos type i value 1. " column position - data li_col_num type i. " table columns number - field-symbols: <line> type any. - field-symbols: <item> type any. - - data td type sydes_desc. - - data: typ. - data: ranges type soi_range_list. - data: rangeitem type soi_range_item. - data: contents type soi_generic_table. - data: contentsitem type soi_generic_item. - data: semaitem type gxxlt_s. - data: hkeyitem type gxxlt_h. - data: vkeyitem type gxxlt_v. - data: li_commentary_rows type i. "row number of title lines + 1 - data: lo_error_w type ref to i_oi_error. - data: l_retcode type soi_ret_string. - data: no_flush type c value 'X'. - data: li_head_top type i. "header rows position - -* Data for session 5: Save and clode document -* ------------------------------------------ - - data: li_document_size type i. - data: ls_path type RLGRAP-FILENAME. - -* MACRO: Close_document -*------------------------------------------- - - DEFINE close_document. - clear: l_is_closed. - IF lo_proxy is not initial. - -* check proxy detroyed adi - - call method lo_proxy->is_destroyed - IMPORTING - ret_value = l_is_closed. - -* if dun detroyed yet: close -> release proxy - - IF l_is_closed is initial. - call method lo_proxy->close_document -* EXPORTING -* do_save = do_save - IMPORTING - error = lo_error - retcode = lc_retcode. - ENDIF. - - call method lo_proxy->release_document - IMPORTING - error = lo_error - retcode = lC_retcode. - - else. - lc_retcode = c_oi_errors=>ret_document_not_open. - ENDIF. - -* Detroy control container - - IF lo_control is not initial. - CALL METHOD lo_control->destroy_control. - ENDIF. - - clear: - lo_spreadsheet, - lo_proxy, - lo_control. - -* free local - - clear: l_is_closed. - - END-OF-DEFINITION. - -* Macro to catch DOI error -*------------------------------------------- - - DEFINE error_doi. - if lc_retcode ne c_oi_errors=>ret_ok. - close_document. - call method lo_error->raise_message - EXPORTING - type = 'E'. - clear: lo_error. - endif. - END-OF-DEFINITION. - -*--------------------------------------------------------------------* -* SESSION 0: DOI CONSTRUCTOR -*--------------------------------------------------------------------* - -* check active windown - - call function 'GUI_HAS_ACTIVEX' - IMPORTING - return = l_has_activex. - - if l_has_activex is initial. - raise MISS_GUIDE. - endif. - -* Get Container Object of Screen - - call method c_oi_container_control_creator=>get_container_control - IMPORTING - control = lo_control - retcode = lC_retcode. - - error_doi. - -* Initialize Container control - - CALL METHOD lo_control->init_control - EXPORTING - parent = CL_GUI_CONTAINER=>DEFAULT_SCREEN - r3_application_name = '' - inplace_enabled = 'X' - no_flush = 'X' - register_on_close_event = 'X' - register_on_custom_event = 'X' - IMPORTING - error = lO_ERROR - retcode = lc_retcode. - - error_doi. - -* Get Proxy Document: -* check exist of document proxy, if exist -> close first - - if not lo_proxy is initial. - close_document. - endif. - - IF i_xls is not initial. -* xls format, doctype = soi_doctype_excel97_sheet - l_doctype_excel_sheet = 'Excel.Sheet.8'. - else. -* xlsx format, doctype = soi_doctype_excel_sheet - l_doctype_excel_sheet = 'Excel.Sheet'. - ENDIF. - - CALL METHOD lo_control->get_document_proxy - EXPORTING - document_type = l_doctype_excel_sheet - register_container = 'X' - IMPORTING - document_proxy = lo_proxy - error = lO_ERROR - retcode = lc_retcode. - - error_doi. - - IF I_DOCUMENT_URL is initial. - -* create new excel document - - call method lo_proxy->create_document - EXPORTING - create_view_data = 'X' - open_inplace = 'X' - no_flush = 'X' - IMPORTING - ERROR = lO_ERROR - retcode = lc_retcode. - - error_doi. - - else. - -* Read excel template for i_DOCUMENT_URL -* this excel template can be store in local or server - - CALL METHOD lo_proxy->open_document - EXPORTING - document_url = i_document_url - open_inplace = 'X' - no_flush = 'X' - IMPORTING - error = lo_error - retcode = lc_retcode. - - error_doi. - - endif. - -* Check Spreadsheet Interface of Document Proxy - - CALL METHOD lo_proxy->has_spreadsheet_interface - IMPORTING - is_available = li_has - error = lO_ERROR - retcode = lc_retcode. - - error_doi. - -* create Spreadsheet object - - CHECK li_has IS NOT INITIAL. - - CALL METHOD lo_proxy->get_spreadsheet_interface - IMPORTING - sheet_interface = lo_spreadsheet - error = lO_ERROR - retcode = lc_retcode. - - error_doi. - -*--------------------------------------------------------------------* -* SESSION 1: GET LVC DATA FROM ALV OBJECT -*--------------------------------------------------------------------* - -* data table - - create object lo_grid - EXPORTING - i_parent = CL_GUI_CONTAINER=>SCREEN0. - - call method lo_grid->get_alv_attributes - EXPORTING - io_grid = io_alv - IMPORTING - Et_table = lt_alv. - - assign lt_alv->* to <f_alv_tab>. - -* fieldcat - - CALL METHOD iO_alv->GET_FRONTEND_FIELDCATALOG - IMPORTING - ET_FIELDCATALOG = lt_fieldcat_LVC. - -* table name - - loop at lt_fieldcat_LVC into wa_fieldcat_lvc - where not tabname is initial. - l_tabname = wa_fieldcat_lvc-tabname. - exit. - endloop. - - if sy-subrc ne 0. - l_tabname = '1'. - endif. - clear: wa_fieldcat_lvc. - -* sort table - - CALL METHOD IO_ALV->GET_SORT_CRITERIA - IMPORTING - ET_SORT = lt_sort_lvc. - - -* filter index - - CALL METHOD IO_ALV->GET_FILTERED_ENTRIES - IMPORTING - ET_FILTERED_ENTRIES = lt_filter_idx_lvc. - -* group level + subtotal - - CALL METHOD IO_ALV->GET_SUBTOTALS - IMPORTING - EP_COLLECT00 = lt_collect00 - EP_COLLECT01 = lt_collect01 - EP_COLLECT02 = lt_collect02 - EP_COLLECT03 = lt_collect03 - EP_COLLECT04 = lt_collect04 - EP_COLLECT05 = lt_collect05 - EP_COLLECT06 = lt_collect06 - EP_COLLECT07 = lt_collect07 - EP_COLLECT08 = lt_collect08 - EP_COLLECT09 = lt_collect09 - ET_GROUPLEVELS = lt_GROUPLEVELS_LVC. - - assign lt_collect00->* to <f_collect00>. - assign lt_collect01->* to <f_collect01>. - assign lt_collect02->* to <f_collect02>. - assign lt_collect03->* to <f_collect03>. - assign lt_collect04->* to <f_collect04>. - assign lt_collect05->* to <f_collect05>. - assign lt_collect06->* to <f_collect06>. - assign lt_collect07->* to <f_collect07>. - assign lt_collect08->* to <f_collect08>. - assign lt_collect09->* to <f_collect09>. - -* transfer to KKBLO struct - - CALL FUNCTION 'LVC_TRANSFER_TO_KKBLO' - EXPORTING - IT_FIELDCAT_LVC = lt_fieldcat_lvc - IT_SORT_LVC = lt_sort_lvc - IT_FILTER_INDEX_LVC = lt_filter_idx_lvc - IT_GROUPLEVELS_LVC = lt_grouplevels_lvc - IMPORTING - ET_FIELDCAT_KKBLO = lt_fieldcat_kkblo - ET_SORT_KKBLO = lt_sort_kkblo - ET_FILTERED_ENTRIES_KKBLO = lt_filter_idx_kkblo - ET_GROUPLEVELS_KKBLO = lt_grouplevels_kkblo - TABLES - IT_DATA = <f_alv_tab> - EXCEPTIONS - IT_DATA_MISSING = 1 - IT_FIELDCAT_LVC_MISSING = 2 - OTHERS = 3. - IF SY-SUBRC <> 0. - raise ex_transfer_KKBLO_ERROR. - ENDIF. - - clear: - wa_fieldcat_lvc, - lt_fieldcat_lvc, - lt_sort_lvc, - lt_filter_idx_lvc, - lt_GROUPLEVELS_LVC. - - clear: - lo_grid. - - -*--------------------------------------------------------------------* -* SESSION 2: SORT, FILTER AND CALCULATE TOTAL / SUBTOTAL -*--------------------------------------------------------------------* - -* append subtotal & total line - - create data lt_excel like <f_ALV_TAB>. - assign lt_excel->* to <f_excel_tab>. - - loop at <f_alv_tab> assigning <f_line>. - l_save_index = sy-tabix. - -* filter base on filter index table - - read table LT_FILTER_IDX_KKBLO assigning <f_filter_idx_line> - with key index = l_save_index - binary search. - if sy-subrc ne 0. - append <f_line> to <f_excel_tab>. - endif. - -* append subtotal lines - - read table LT_GROUPLEVELS_KKBLO assigning <f_grouplevels_line> - with key index_to = l_save_index - binary search. - if sy-subrc = 0. - l_tabix = sy-tabix. - do. - if <f_grouplevels_line>-subtot eq 'X' and - <f_grouplevels_line>-hide_level is initial and - <f_grouplevels_line>-cindex_from ne 0. - -* dynamic append subtotal line to excel table base on grouplevel table -* ex <f_GROUPLEVELS_line>-level = 1 -* then <f_collect_tab> = '<F_COLLECT01>' - - l_collect = <f_grouplevels_line>-level. - condense l_collect. - concatenate '<F_COLLECT0' - l_collect '>' -* '->*' - into l_collect. - - assign (l_collect) to <f_collect_tab>. - -* incase there're more than 1 total line of group, at the same level -* for example: subtotal of multi currency - - LOOP AT <f_collect_tab> assigning <f_collect_line>. - IF sy-tabix between <f_grouplevels_line>-cindex_from - and <f_grouplevels_line>-cindex_to. - - - append <f_collect_line> to <f_excel_tab>. - -* save subtotal lines index - - wa_subtot_indexs-index = sy-tabix. - append wa_subtot_indexs to lt_subtot_indexs. - -* append sub total ranges table for format later - - add 1 to l_sub_index. - subrangeitem-name = l_sub_index. - condense subrangeitem-name. - concatenate 'SUBTOT' - subrangeitem-name - into subrangeitem-name. - - subrangeitem-rows = wa_subtot_indexs-index. - subrangeitem-columns = 1. " start col - append subrangeitem to subranges. - clear: subrangeitem. - - ENDIF. - ENDLOOP. - unassign: <f_collect_tab>. - unassign: <f_collect_line>. - clear: l_collect. - endif. - -* check next subtotal level of group - - unassign: <f_grouplevels_line>. - add 1 to l_tabix. - - read table LT_GROUPLEVELS_KKBLO assigning <f_grouplevels_line> - index l_tabix. - if sy-subrc ne 0 - or <f_grouplevels_line>-index_to ne l_save_index. - exit. - endif. - - unassign: - <f_collect_tab>, - <f_collect_line>. - - enddo. - endif. - - clear: - l_tabix, - l_save_index. - - unassign: - <f_filter_idx_line>, - <f_grouplevels_line>. - - endloop. - -* free local data - - unassign: - <f_line>, - <f_collect_tab>, - <f_collect_line>, - <f_fieldcat_line>. - -* append grand total line - - IF <f_collect00> is assigned. - assign <f_collect00> to <f_collect_tab>. - if <f_collect_tab> is not initial. - LOOP AT <f_collect_tab> assigning <f_collect_line>. - - append <f_collect_line> to <f_excel_tab>. - -* save total line index - - wa_subtot_indexs-index = sy-tabix. - append wa_subtot_indexs to lt_subtot_indexs. - -* append grand total range (to format) - - add 1 to l_sub_index. - subrangeitem-name = l_sub_index. - condense subrangeitem-name. - concatenate 'TOTAL' - subrangeitem-name - into subrangeitem-name. - - subrangeitem-rows = wa_subtot_indexs-index. - subrangeitem-columns = 1. " start col - append subrangeitem to subranges. - ENDLOOP. - endif. - ENDIF. - - clear: - subrangeitem, - LT_SORT_KKBLO, - <f_collect00>, - <f_collect01>, - <f_collect02>, - <f_collect03>, - <f_collect04>, - <f_collect05>, - <f_collect06>, - <f_collect07>, - <f_collect08>, - <f_collect09>. - - unassign: - <f_collect00>, - <f_collect01>, - <f_collect02>, - <f_collect03>, - <f_collect04>, - <f_collect05>, - <f_collect06>, - <f_collect07>, - <f_collect08>, - <f_collect09>, - <f_collect_tab>, - <f_collect_line>. - -*--------------------------------------------------------------------* -* SESSION 3: MAP DATA TO SEMANTIC TABLE -*--------------------------------------------------------------------* - -* get dependent field field: currency and quantity - - create data wa like line of <f_excel_tab>. - assign wa->* to <f_excel_line>. - - describe field <f_excel_line> type l_typ components l_num. - - do l_num times. - l_save_index = sy-index. - assign component l_save_index of structure <f_excel_line> - to <f_excel_column>. - if sy-subrc ne 0. - message e059(0k) with 'FATAL ERROR' raising fatal_error. - endif. - - loop at LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> - where tabname = l_tabname. - assign component <f_fieldcat_line>-fieldname - of structure <f_excel_line> to <f_fcat_column>. - - describe distance between <f_excel_column> and <f_fcat_column> - into l_int in byte mode. - -* append column index -* this columns index is of table, not fieldcat - - if l_int = 0. - wa_column_index-fieldname = <f_fieldcat_line>-fieldname. - wa_column_index-tabname = <f_fieldcat_line>-tabname. - wa_column_index-col = l_save_index. - append wa_column_index to lt_column_index. - endif. - -* append dependent fields (currency and quantity unit) - - if <f_fieldcat_line>-cfieldname is not initial. - clear wa_fieldcat_depf. - wa_fieldcat_depf-fieldname = <f_fieldcat_line>-cfieldname. - wa_fieldcat_depf-tabname = <f_fieldcat_line>-ctabname. - collect wa_fieldcat_depf into lt_fieldcat_depf. - endif. - - if <f_fieldcat_line>-qfieldname is not initial. - clear wa_fieldcat_depf. - wa_fieldcat_depf-fieldname = <f_fieldcat_line>-qfieldname. - wa_fieldcat_depf-tabname = <f_fieldcat_line>-qtabname. - collect wa_fieldcat_depf into lt_fieldcat_depf. - endif. - -* rewrite field data type - - if <f_fieldcat_line>-inttype = 'X' - and <f_fieldcat_line>-datatype(3) = 'INT'. - <f_fieldcat_line>-inttype = 'I'. - endif. - - endloop. - - clear: l_save_index. - unassign: <f_fieldcat_line>. - - enddo. - -* build semantic tables - - l_n_hrz_keys = 1. - -* Get keyfigures - - loop at LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> - where tabname = l_tabname - and tech ne 'X' - and no_out ne 'X'. - - clear wa_sema. - clear wa_hkey. - -* Units belong to keyfigures -> display as str - - read table lt_fieldcat_depf into wa_fieldcat_depf with key - fieldname = <f_fieldcat_line>-fieldname - tabname = <f_fieldcat_line>-tabname. - - if sy-subrc = 0. - wa_sema-col_typ = 'STR'. - wa_sema-col_ops = 'DFT'. - -* Keyfigures - - else. - case <f_fieldcat_line>-datatype. - when 'QUAN'. - wa_sema-col_typ = 'N03'. - - if <f_fieldcat_line>-no_sum ne 'X'. - wa_sema-col_ops = 'ADD'. - else. - wa_sema-col_ops = 'NOP'. " no dependent field - endif. - - when 'DATS'. - wa_sema-col_typ = 'DAT'. - wa_sema-col_ops = 'NOP'. - - when 'CHAR' OR 'UNIT' OR 'CUKY'. " Added fieldformats UNIT and CUKY - dd. 26-10-2012 Wouter Heuvelmans - wa_sema-col_typ = 'STR'. - wa_sema-col_ops = 'DFT'. " dependent field - -* incase numeric, ex '00120' -> display as '12' - - when 'NUMC'. - wa_sema-col_typ = 'STR'. - wa_sema-col_ops = 'DFT'. - - when others. - wa_sema-col_typ = 'NUM'. - - if <f_fieldcat_line>-no_sum ne 'X'. - wa_sema-col_ops = 'ADD'. - else. - wa_sema-col_ops = 'NOP'. - endif. - endcase. - endif. - - l_counter = l_counter + 1. - l_n_att_cols = l_n_att_cols + 1. - - wa_sema-col_no = l_counter. - - read table lt_column_index into wa_column_index with key - fieldname = <f_fieldcat_line>-fieldname - tabname = <f_fieldcat_line>-tabname. - - if sy-subrc = 0. - wa_sema-col_src = wa_column_index-col. - else. - raise fatal_error. - endif. - -* columns index of ref currency field in table - - if not <f_fieldcat_line>-cfieldname is initial. - read table lt_column_index into wa_column_index with key - fieldname = <f_fieldcat_line>-cfieldname - tabname = <f_fieldcat_line>-ctabname. - - if sy-subrc = 0. - wa_sema-col_cur = wa_column_index-col. - endif. - -* quantities fields -* treat as currency when display on excel - - elseif not <f_fieldcat_line>-qfieldname is initial. - read table lt_column_index into wa_column_index with key - fieldname = <f_fieldcat_line>-qfieldname - tabname = <f_fieldcat_line>-qtabname. - if sy-subrc = 0. - wa_sema-col_cur = wa_column_index-col. - endif. - - endif. - -* Treat of fixed currency in the fieldcatalog for column - - data: l_num_help(2) type n. - - if not <f_fieldcat_line>-currency is initial. - - select * from tcurx into table lt_tcurx. - sort lt_tcurx. - read table lt_tcurx into wa_tcurx - with key currkey = <f_fieldcat_line>-currency. - if sy-subrc = 0. - l_num_help = wa_tcurx-currdec. - concatenate 'N' l_num_help into wa_sema-col_typ. - wa_sema-col_cur = sy-tabix * ( -1 ). - endif. - - endif. - - wa_hkey-col_no = l_n_att_cols. - wa_hkey-row_no = l_n_hrz_keys. - wa_hkey-col_name = <f_fieldcat_line>-reptext. - append wa_hkey to lt_hkey. - append wa_sema to lt_sema. - - endloop. - -* free local data - - clear: - lt_column_index, - wa_column_index, - lt_fieldcat_depf, - wa_fieldcat_depf, - lt_tcurx, - wa_tcurx, - l_num, - l_typ, - wa, - l_int, - l_counter. - - unassign: - <f_fieldcat_line>, - <f_excel_line>, - <f_excel_column>, - <f_fcat_column>. - -*--------------------------------------------------------------------* -* SESSION 4: WRITE TO EXCEL -*--------------------------------------------------------------------* - - clear: wa_tcurx. - refresh: lt_tcurx. - -* if spreadsheet dun have proxy yet - - if li_has is initial. - l_retcode = c_oi_errors=>ret_interface_not_supported. - call method c_oi_errors=>create_error_for_retcode - EXPORTING - retcode = l_retcode - no_flush = no_flush - IMPORTING - error = lo_error_w. - exit. - endif. - - create object l_error - EXPORTING - object_name = 'OLE_DOCUMENT_PROXY' - method_name = 'get_ranges_names'. - - call method c_oi_errors=>add_error - EXPORTING - error = l_error. - - - describe table lt_sema lines datareal. - describe table <f_excel_tab> lines datac. - describe table lt_vkey lines vkeycount. - - if datac = 0. - raise inv_data_range. - endif. - - - if vkeycount ne l_n_vrt_keys. - raise dim_mismatch_vkey. - endif. - - all = l_n_vrt_keys + l_n_att_cols. - - if datareal ne all. - raise dim_mismatch_sema. - endif. - - data: decimal type c. - -* get decimal separator format ('.', ',', ...) in Office config - - call method lo_proxy->get_application_property - EXPORTING - property_name = 'INTERNATIONAL' - subproperty_name = 'DECIMAL_SEPARATOR' - CHANGING - retvalue = decimal. - - data: wa_usr type usr01. - select * from usr01 into wa_usr where bname = sy-uname. - endselect. - - data: comma_elim(4) type c. - data: help6 type i. - field-symbols <g> type any. - data search_item(4) value ' #'. - - concatenate ',' decimal '.' decimal into comma_elim. - - data help type i. " table (with subtotal) line number - - help = datac. - - data: rowmax type i value 1. " header row number - data: columnmax type i value 0. " header columns number - - loop at lt_hkey into hkeyitem. - if hkeyitem-col_no > columnmax. - columnmax = hkeyitem-col_no. - endif. - - if hkeyitem-row_no > rowmax. - rowmax = hkeyitem-row_no. - endif. - endloop. - - data: hkeycolumns type i. " header columns no - - hkeycolumns = columnmax. - - if hkeycolumns < l_n_att_cols. - hkeycolumns = l_n_att_cols. - endif. - - columnmax = 0. - - loop at lt_vkey into vkeyitem. - if vkeyitem-col_no > columnmax. - columnmax = vkeyitem-col_no. - endif. - endloop. - - data overflow type i value 1. - data testname(10) type c. - data temp2 type i. " 1st item row position in excel - data realmit type i value 1. - data realoverflow type i value 1. " row index in content - - call method lo_spreadsheet->screen_update - EXPORTING - updating = ''. - - call method lo_spreadsheet->load_lib. - - data: str(40) type c. " range names of columns range (w/o col header) - data: rows type i. " row postion of 1st item line in ecxel - -* calculate row position of data table - - describe table iT_LISTHEADER lines li_commentary_rows. - -* if grid had title, add 1 empy line between title and table - - if li_commentary_rows ne 0. - add 1 to li_commentary_rows. - endif. - -* add top position of block data - - li_commentary_rows = li_commentary_rows + i_top - 1. - -* write header (commentary rows) - - data: li_commentary_row_index type i value 1. - data: li_content_index type i value 1. - data: ls_index(10) type c. - data ls_commentary_range(40) type c value 'TITLE'. - data: li_font_bold type i. - data: li_font_italic type i. - data: li_font_size type i. - - loop at iT_LISTHEADER into wa_listheader. - li_commentary_row_index = i_top + li_content_index - 1. - ls_index = li_content_index. - condense ls_index. - concatenate ls_commentary_range(5) ls_index - into ls_commentary_range. - condense ls_commentary_range. - -* insert title range - - call method lo_spreadsheet->insert_range_dim - EXPORTING - name = ls_commentary_range - top = li_commentary_row_index - left = i_left - rows = 1 - columns = 1 - no_flush = no_flush. - -* format range - - case wa_listheader-typ. - when 'H'. "title - li_font_size = 16. - li_font_bold = 1. - li_font_italic = -1. - when 'S'. "subtile - li_font_size = -1. - li_font_bold = 1. - li_font_italic = -1. - when others. "'A' comment - li_font_size = -1. - li_font_bold = -1. - li_font_italic = 1. - endcase. - - call method lo_spreadsheet->set_font - EXPORTING - rangename = ls_commentary_range - family = '' - size = li_font_size - bold = li_font_bold - italic = li_font_italic - align = 0 - no_flush = no_flush. - -* title: range content - - rangeitem-name = ls_commentary_range. - rangeitem-columns = 1. - rangeitem-rows = 1. - append rangeitem to ranges. - - contentsitem-row = li_content_index. - contentsitem-column = 1. - concatenate wa_listheader-key - wa_listheader-info - into contentsitem-value - separated by space. - condense contentsitem-value. - append contentsitem to contents. - - add 1 to li_content_index. - - clear: - rangeitem, - contentsitem, - ls_index. - - endloop. - -* set range data title - - call method lo_spreadsheet->set_ranges_data - EXPORTING - ranges = ranges - contents = contents - no_flush = no_flush. - - refresh: - ranges, - contents. - - rows = rowmax + li_commentary_rows + 1. - - all = wa_usr-datfm. - all = all + 3. - - loop at lt_sema into semaitem. - if semaitem-col_typ = 'DAT' or semaitem-col_typ = 'MON' or - semaitem-col_typ = 'N00' or semaitem-col_typ = 'N01' or - semaitem-col_typ = 'N01' or semaitem-col_typ = 'N02' or - semaitem-col_typ = 'N03' or semaitem-col_typ = 'PCT' or - semaitem-col_typ = 'STR' or semaitem-col_typ = 'NUM'. - clear str. - str = semaitem-col_no. - condense str. - concatenate 'DATA' str into str. - mit = semaitem-col_no. - li_col_pos = semaitem-col_no + i_left - 1. - -* range from data1 to data(n), for each columns of table - - call method lo_spreadsheet->insert_range_dim - EXPORTING - name = str - top = rows - left = li_col_pos - rows = help - columns = 1 - no_flush = no_flush. - - data dec type i value -1. - data typeinfo type sydes_typeinfo. - loop at <f_excel_tab> assigning <line>. - assign component semaitem-col_no of structure <line> to <item>. - describe field <item> into td. - read table td-types index 1 into typeinfo. - if typeinfo-type = 'P'. - dec = typeinfo-decimals. - elseif typeinfo-type = 'I'. - dec = 0. - endif. - - describe field <line> type typ components count. - mit = 1. - do count times. - if mit = semaitem-col_src. - assign component sy-index of structure <line> to <item>. - describe field <item> into td. - read table td-types index 1 into typeinfo. - if typeinfo-type = 'P'. - dec = typeinfo-decimals. - endif. - exit. - endif. - mit = mit + 1. - enddo. - exit. - endloop. - -* format for each columns of table (w/o columns headers) - - if semaitem-col_typ = 'DAT'. - if semaitem-col_no > vkeycount. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = all - no_flush = no_flush. - else. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 0 - no_flush = no_flush. - endif. - elseif semaitem-col_typ = 'STR'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 0 - no_flush = no_flush. - elseif semaitem-col_typ = 'MON'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 10 - no_flush = no_flush. - elseif semaitem-col_typ = 'N00'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 1 - decimals = 0 - no_flush = no_flush. - elseif semaitem-col_typ = 'N01'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 1 - decimals = 1 - no_flush = no_flush. - elseif semaitem-col_typ = 'N02'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 1 - decimals = 2 - no_flush = no_flush. - elseif semaitem-col_typ = 'N03'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 1 - decimals = 3 - no_flush = no_flush. - elseif semaitem-col_typ = 'N04'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 1 - decimals = 4 - no_flush = no_flush. - elseif semaitem-col_typ = 'NUM'. - if dec eq -1. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 1 - decimals = 2 - no_flush = no_flush. - else. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 1 - decimals = dec - no_flush = no_flush. - endif. - elseif semaitem-col_typ = 'PCT'. - call method lo_spreadsheet->set_format - EXPORTING - rangename = str - currency = '' - typ = 3 - decimals = 0 - no_flush = no_flush. - endif. - - endif. - endloop. - -* get item contents for set_range_data method -* get currency cell also - - mit = 1. - - data: currcells type soi_cell_table. - data: curritem type soi_cell_item. - - curritem-rows = 1. - curritem-columns = 1. - curritem-front = -1. - curritem-back = -1. - curritem-font = ''. - curritem-size = -1. - curritem-bold = -1. - curritem-italic = -1. - curritem-align = -1. - curritem-frametyp = -1. - curritem-framecolor = -1. - curritem-currency = ''. - curritem-number = 1. - curritem-input = -1. - - data: conv_exit(10) type c. - data: const type i. - -* Change for Correction request -* Initial 10000 lines are missing in Excel Export -* if there are only 2 columns in exported List object. - - if datareal gt 2. - const = 20000 / datareal. - else. - const = 20000 / ( datareal + 2 ). - endif. - - data: lines type i. - data: innerlines type i. - data: counter type i. - data: curritem2 like curritem. - data: curritem3 like curritem. - data: length type i. - data: found. - -* append content table (for method set_range_content) - - loop at <f_excel_tab> assigning <line>. - -* save line index to compare with lt_subtot_indexs, -* to discover line is a subtotal / totale line or not -* ex use to set 'dun display zero in subtotal / total line' - - l_save_index = sy-tabix. - - do datareal times. - read table lt_sema into semaitem with key col_no = sy-index. - if semaitem-col_src ne 0. - assign component semaitem-col_src - of structure <line> to <item>. - else. - assign component sy-index - of structure <line> to <item>. - endif. - - contentsitem-row = realoverflow. - - if sy-subrc = 0. - move semaitem-col_ops to search_item(3). - search 'ADD#CNT#MIN#MAX#AVG#NOP#DFT#' - for search_item. - if sy-subrc ne 0. - raise error_in_sema. - endif. - move semaitem-col_typ to search_item(3). - search 'NUM#N00#N01#N02#N03#N04#PCT#DAT#MON#STR#' - for search_item. - if sy-subrc ne 0. - raise error_in_sema. - endif. - contentsitem-column = sy-index. - if semaitem-col_typ eq 'DAT' or semaitem-col_typ eq 'MON'. - if semaitem-col_no > vkeycount. - - " Hinweis 512418 - " EXCEL bezieht Datumsangaben - " auf den 31.12.1899, behandelt - " aber 1900 als ein Schaltjahr - " d.h. ab 1.3.1900 korrekt - " 1.3.1900 als Zahl = 61 - - data: genesis type d value '18991230'. - data: number_of_days type p. -* change for date in char format & sema_type = X - data: temp_date type d. - - if not <item> is initial and not <item> co ' ' and not - <item> co '0'. -* change for date in char format & sema_type = X starts - if sema_type = 'X'. - describe field <item> type typ. - if typ = 'C'. - temp_date = <item>. - number_of_days = temp_date - genesis. - else. - number_of_days = <item> - genesis. - endif. - else. - number_of_days = <item> - genesis. - endif. -* change for date in char format & sema_type = X ends - if number_of_days < 61. - number_of_days = number_of_days - 1. - endif. - - set country 'DE'. - write number_of_days to contentsitem-value - no-grouping - left-justified. - set country space. - translate contentsitem-value using comma_elim. - else. - clear contentsitem-value. - endif. - else. - move <item> to contentsitem-value. - endif. - elseif semaitem-col_typ eq 'NUM' or - semaitem-col_typ eq 'N00' or - semaitem-col_typ eq 'N01' or - semaitem-col_typ eq 'N02' or - semaitem-col_typ eq 'N03' or - semaitem-col_typ eq 'N04' or - semaitem-col_typ eq 'PCT'. - set country 'DE'. - describe field <item> type typ. - - if semaitem-col_cur is initial. - if typ ne 'F'. - write <item> to contentsitem-value no-grouping - no-sign decimals 14. - else. - write <item> to contentsitem-value no-grouping - no-sign. - endif. - else. -* Treat of fixed curreny for column >>Y9CK007319 - if semaitem-col_cur < 0. - semaitem-col_cur = semaitem-col_cur * ( -1 ). - select * from tcurx into table lt_tcurx. - sort lt_tcurx. - read table lt_tcurx into - wa_tcurx index semaitem-col_cur. - if sy-subrc = 0. - if typ ne 'F'. - write <item> to contentsitem-value no-grouping - currency wa_tcurx-currkey no-sign decimals 14. - else. - write <item> to contentsitem-value no-grouping - currency wa_tcurx-currkey no-sign. - endif. - endif. - else. - assign component semaitem-col_cur - of structure <line> to <g>. -* mit = index of recent row - curritem-top = rowmax + mit + li_commentary_rows. - - li_col_pos = sy-index + i_left - 1. - curritem-left = li_col_pos. - -* if filed is quantity field (qfieldname ne space) -* or amount field (cfieldname ne space), then format decimal place -* corresponding with config - - clear: l_def. - read table LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> - with key tabname = l_tabname - tech = space - no_out = space - col_pos = semaitem-col_no. - IF sy-subrc = 0. - IF <f_fieldcat_line>-cfieldname is not initial. - l_def = 'C'. - else."if <f_fieldcat_line>-qfieldname is not initial. - l_def = 'Q'. - ENDIF. - ENDIF. - -* if field is amount field -* exporting of amount field base on currency decimal table: TCURX - IF l_def = 'C'. "field is amount field - select single * from tcurx into wa_tcurx - where currkey = <g>. -* if amount ref to un-know currency -> default decimal = 2 - if sy-subrc eq 0. - curritem-decimals = wa_tcurx-currdec. - else. - curritem-decimals = 2. - endif. - - append curritem to currcells. - if typ ne 'F'. - write <item> to contentsitem-value - currency <g> - no-sign no-grouping. - else. - write <item> to contentsitem-value - decimals 14 currency <g> - no-sign no-grouping. - endif. - -* if field is quantity field -* exporting of quantity field base on quantity decimal table: T006 - - else."if l_def = 'Q'. " field is quantity field - clear: wa_t006. - select single * from t006 into wa_t006 - where MSEHI = <g>. -* if quantity ref to un-know unit-> default decimal = 2 - if sy-subrc eq 0. - curritem-decimals = wa_t006-decan. - else. - curritem-decimals = 2. - endif. - append curritem to currcells. - - write <item> to contentsitem-value - unit <g> - no-sign no-grouping. - condense contentsitem-value. - - ENDIF. - - endif. "Y9CK007319 - endif. - condense contentsitem-value. - -* add function fieldcat-no zero display - - loop at LT_FIELDCAT_KKBLO assigning <f_fieldcat_line> - where tabname = l_tabname - and tech ne 'X' - and no_out ne 'X'. - if <f_fieldcat_line>-col_pos = semaitem-col_no. - if <f_fieldcat_line>-no_zero = 'X'. - if <item> = '0'. - clear: contentsitem-value. - endif. - -* dun display zero in total/subtotal line too - - else. - clear: wa_subtot_indexs. - read table lt_subtot_indexs into wa_subtot_indexs - with key index = l_save_index. - IF sy-subrc = 0. - if <item> = '0'. - clear: contentsitem-value. - endif. - ENDIF. - endif. - endif. - endloop. - unassign: <f_fieldcat_line>. - - if <item> lt 0. - search contentsitem-value for 'E'. - if sy-fdpos eq 0. - -* bring negative sign to front of amount - - translate contentsitem-value using '- '. - condense contentsitem-value no-gaps. - concatenate '-' contentsitem-value - into contentsitem-value. - else. - concatenate '-' contentsitem-value - into contentsitem-value. - endif. - endif. - set country space. -* Hier wird nur die korrekte Kommaseparatierung gemacht, wenn die -* Zeichen einer -* Zahl enthalten sind. Das ist f#ƒÂ#r Timestamps, die auch ":" enthalten. -* F#ƒÂ#r die -* darf keine Kommaseparierung stattfinden. -* Changing for correction request - Y6BK041073 - if contentsitem-value co '0123456789.,-+E '. - translate contentsitem-value using comma_elim. - endif. - else. - clear contentsitem-value. - -* if type is not numeric -> dun display with zero - - write <item> to contentsitem-value no-zero. - - shift contentsitem-value left deleting leading space. - - endif. - append contentsitem to contents. - endif. - enddo. - - realmit = realmit + 1. - realoverflow = realoverflow + 1. - - mit = mit + 1. -* overflow = current row index in content table - overflow = overflow + 1. - endloop. - - unassign: <f_fieldcat_line>. - -* set item range for set_range_data method - - testname = mit / const. - condense testname. - - concatenate 'TEST' testname into testname. - - realoverflow = realoverflow - 1. - realmit = realmit - 1. - help = realoverflow. - - rangeitem-name = testname. - rangeitem-columns = datareal. - rangeitem-rows = help. - append rangeitem to ranges. - -* insert item range dim - - temp2 = rowmax + 1 + li_commentary_rows + realmit - realoverflow. - -* items data - - call method lo_spreadsheet->insert_range_dim - EXPORTING - name = testname - top = temp2 - left = i_left - rows = help - columns = datareal - no_flush = no_flush. - -* get columns header contents for set_range_data method -* export columns header only if no columns header option = space - - data: rowcount type i. - data: columncount type i. - - if i_columns_header = 'X'. - -* append columns header to contents: hkey - - rowcount = 1. - do rowmax times. - columncount = 1. - do hkeycolumns times. - loop at lt_hkey into hkeyitem where col_no = columncount - and row_no = rowcount. - endloop. - if sy-subrc = 0. - str = hkeyitem-col_name. - contentsitem-value = hkeyitem-col_name. - else. - contentsitem-value = str. - endif. - contentsitem-column = columncount. - contentsitem-row = rowcount. - append contentsitem to contents. - columncount = columncount + 1. - enddo. - rowcount = rowcount + 1. - enddo. - -* incase columns header in multiline - - data: rowmaxtemp type i. - if rowmax > 1. - rowmaxtemp = rowmax - 1. - rowcount = 1. - do rowmaxtemp times. - columncount = 1. - do columnmax times. - contentsitem-column = columncount. - contentsitem-row = rowcount. - contentsitem-value = ''. - append contentsitem to contents. - columncount = columncount + 1. - enddo. - rowcount = rowcount + 1. - enddo. - endif. - -* append columns header to contents: vkey - - columncount = 1. - do columnmax times. - loop at lt_vkey into vkeyitem where col_no = columncount. - endloop. - contentsitem-value = vkeyitem-col_name. - contentsitem-row = rowmax. - contentsitem-column = columncount. - append contentsitem to contents. - columncount = columncount + 1. - enddo. -*--------------------------------------------------------------------* -* set header range for method set_range_data -* insert header keys range dim - - li_head_top = li_commentary_rows + 1. - li_col_pos = i_left. - -* insert range headers - - if hkeycolumns ne 0. - rangeitem-name = 'TESTHKEY'. - rangeitem-rows = rowmax. - rangeitem-columns = hkeycolumns. - append rangeitem to ranges. - clear: rangeitem. - - call method lo_spreadsheet->insert_range_dim - EXPORTING - name = 'TESTHKEY' - top = li_head_top - left = li_col_pos - rows = rowmax - columns = hkeycolumns - no_flush = no_flush. - endif. - endif. - -* format for columns header + total + subtotal -* ------------------------------------------ - - help = rowmax + realmit. " table + header lines - - data: item type colxxl_t. - data: lt_format type soi_format_table. - data: wa_format like line of lt_format. - data: wa_format_temp like line of lt_format. - - field-symbols: <f_source> type any. - field-symbols: <f_des> type any. - -* columns header format - - wa_format-front = -1. - wa_format-back = 15. "grey - wa_format-font = space. - wa_format-size = -1. - wa_format-bold = 1. - wa_format-align = 0. - wa_format-frametyp = -1. - wa_format-framecolor = -1. - -* get column header format from input record -* -> map input format - - if i_columns_header = 'X'. - wa_format-name = 'TESTHKEY'. - if i_format_col_header is not initial. - describe field i_format_col_header type l_typ components - li_col_num. - do li_col_num times. - if sy-index ne 1. " dun map range name - assign component sy-index of structure i_format_col_header - to <f_source>. - if <f_source> is not initial. - assign component sy-index of structure wa_format to <f_des>. - <f_des> = <f_source>. - unassign: <f_des>. - endif. - unassign: <f_source>. - endif. - enddo. - - clear: li_col_num. - endif. - - append wa_format to lt_format. - endif. - -* Zusammenfassen der Spalten mit gleicher Nachkommastellenzahl -* collect vertical cells (col) with the same number of decimal places -* to increase perfomance in currency cell format - - describe table currcells lines lines. - lines = lines - 1. - do lines times. - describe table currcells lines innerlines. - innerlines = innerlines - 1. - sort currcells by left top. - clear found. - do innerlines times. - read table currcells index sy-index into curritem. - counter = sy-index + 1. - read table currcells index counter into curritem2. - if curritem-left eq curritem2-left. - length = curritem-top + curritem-rows. - if length eq curritem2-top. - if curritem-decimals eq curritem2-decimals. - move curritem to curritem3. - curritem3-rows = curritem3-rows + curritem2-rows. - curritem-left = -1. - modify currcells index sy-index from curritem. - curritem2-left = -1. - modify currcells index counter from curritem2. - append curritem3 to currcells. - found = 'X'. - endif. - endif. - endif. - enddo. - if found is initial. - exit. - endif. - delete currcells where left = -1. - enddo. - -* Zusammenfassen der Zeilen mit gleicher Nachkommastellenzahl -* collect horizontal cells (row) with the same number of decimal places -* to increase perfomance in currency cell format - - describe table currcells lines lines. - lines = lines - 1. - do lines times. - describe table currcells lines innerlines. - innerlines = innerlines - 1. - sort currcells by top left. - clear found. - do innerlines times. - read table currcells index sy-index into curritem. - counter = sy-index + 1. - read table currcells index counter into curritem2. - if curritem-top eq curritem2-top and curritem-rows eq - curritem2-rows. - length = curritem-left + curritem-columns. - if length eq curritem2-left. - if curritem-decimals eq curritem2-decimals. - move curritem to curritem3. - curritem3-columns = curritem3-columns + curritem2-columns. - curritem-left = -1. - modify currcells index sy-index from curritem. - curritem2-left = -1. - modify currcells index counter from curritem2. - append curritem3 to currcells. - found = 'X'. - endif. - endif. - endif. - enddo. - if found is initial. - exit. - endif. - delete currcells where left = -1. - enddo. -* Ende der Zusammenfassung - - -* item data: format for currency cell, corresponding with currency - - call method lo_spreadsheet->cell_format - EXPORTING - cells = currcells - no_flush = no_flush. - -* item data: write item table content - - call method lo_spreadsheet->set_ranges_data - EXPORTING - ranges = ranges - contents = contents - no_flush = no_flush. - -* whole table range to format all table - - if i_columns_header = 'X'. - li_head_top = li_commentary_rows + 1. - else. - li_head_top = li_commentary_rows + 2. - help = help - 1. - endif. - - call method lo_spreadsheet->insert_range_dim - EXPORTING - name = 'WHOLE_TABLE' - top = li_head_top - left = i_left - rows = help - columns = datareal - no_flush = no_flush. - -* columns width auto fix -* this parameter = space in case use with exist template - - IF i_columns_autofit = 'X'. - call method lo_spreadsheet->fit_widest - EXPORTING - name = 'WHOLE_TABLE' - no_flush = no_flush. - ENDIF. - -* frame -* The parameter has 8 bits -*0 Left margin -*1 Top marginT -*2 Bottom margin -*3 Right margin -*4 Horizontal line -*5 Vertical line -*6 Thinness -*7 Thickness -* here 127 = 1111111 6-5-4-3-2-1 mean Thin-ver-hor-right-bot-top-left - -* ( final DOI method call, set no_flush = space -* equal to call method CL_GUI_CFW=>FLUSH ) - - call method lo_spreadsheet->set_frame - EXPORTING - rangename = 'WHOLE_TABLE' - typ = 127 - color = 1 - no_flush = space - IMPORTING - error = lo_error - retcode = lc_retcode. - - error_doi. - -* reformat subtotal / total line after format wholw table - - loop at subranges into subrangeitem. - l_sub_index = subrangeitem-rows + li_commentary_rows + rowmax. - - call method lo_spreadsheet->insert_range_dim - EXPORTING - name = subrangeitem-name - left = i_left - top = l_sub_index - rows = 1 - columns = datareal - no_flush = no_flush. - - wa_format-name = subrangeitem-name. - -* default format: -* - clolor: subtotal = light yellow, subtotal = yellow -* - frame: box - - IF subrangeitem-name(3) = 'SUB'. - wa_format-back = 36. "subtotal line - wa_format_temp = i_format_subtotal. - else. - wa_format-back = 27. "total line - wa_format_temp = i_format_total. - endif. - wa_format-FRAMETYP = 79. - wa_format-FRAMEcolor = 1. - wa_format-number = -1. - wa_format-align = -1. - -* get subtoal + total format from intput parameter -* overwrite default format - - if wa_format_temp is not initial. - describe field wa_format_temp type l_typ components li_col_num. - do li_col_num times. - if sy-index ne 1. " dun map range name - assign component sy-index of structure wa_format_temp - to <f_source>. - if <f_source> is not initial. - assign component sy-index of structure wa_format to <f_des>. - <f_des> = <f_source>. - unassign: <f_des>. - endif. - unassign: <f_source>. - endif. - enddo. - - clear: li_col_num. - endif. - - append wa_format to lt_format. - clear: wa_format-name. - clear: l_sub_index. - clear: wa_format_temp. - - endloop. - - if lt_format[] is not initial. - call method lo_spreadsheet->set_ranges_format - EXPORTING - formattable = lt_format - no_flush = no_flush. - refresh: lt_format. - endif. -*--------------------------------------------------------------------* - call method lo_spreadsheet->screen_update - EXPORTING - updating = 'X'. - - call method c_oi_errors=>flush_errors. - - lo_error_w = l_error. - lc_retcode = lo_error_w->error_code. - -** catch no_flush -> led to dump ( optional ) -* go_error = l_error. -* gc_retcode = go_error->error_code. -* error_doi. - - clear: - lt_sema, - wa_sema, - lt_hkey, - wa_hkey, - lt_vkey, - wa_vkey, - l_n_hrz_keys, - l_n_att_cols, - l_n_vrt_keys, - count, - datac, - datareal, - vkeycount, - all, - mit, - li_col_pos, - li_col_num, - ranges, - rangeitem, - contents, - contentsitem, - semaitem, - hkeyitem, - vkeyitem, - li_commentary_rows, - l_retcode, - li_head_top, - <f_excel_tab>. - - clear: - lo_error_w. - - unassign: - <line>, - <item>, - <f_excel_tab>. - -*--------------------------------------------------------------------* -* SESSION 5: SAVE AND CLOSE FILE -*--------------------------------------------------------------------* - -* ex of save path: 'FILE://C:\temp\test.xlsx' - concatenate 'FILE://' I_save_path - into ls_path. - - call method lo_proxy->save_document_to_url - EXPORTING - no_flush = 'X' - url = ls_path - IMPORTING - error = lo_error - retcode = lc_retcode - CHANGING - document_size = li_document_size. - - error_doi. - -* if save successfully -> raise successful message -* message i499(sy) with 'Document is Exported to ' p_path. - message i499(sy) with 'Data has been exported successfully'. - - clear: - ls_path, - li_document_size. - - close_document. - endmethod. - - - - - - - - method BIND_TABLE. -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (wi p) 2012-12-01 -* - ... -* aligning code -* message made to support multilinguality -*--------------------------------------------------------------------* -* issue #237 - Check if overlapping areas exist -* - Alessandro Iannacci 2012-12-01 -* changes: - Added raise if overlaps are detected -*--------------------------------------------------------------------* - - CONSTANTS: - lc_top_left_column TYPE zexcel_cell_column_alpha VALUE 'B', - lc_top_left_row TYPE zexcel_cell_row VALUE 3. - - DATA: - lv_row_int TYPE zexcel_cell_row, - lv_first_row TYPE zexcel_cell_row, - lv_last_row TYPE zexcel_cell_row, - lv_column_int TYPE zexcel_cell_column, - lv_column_alpha TYPE zexcel_cell_column_alpha, - lt_field_catalog TYPE zexcel_t_fieldcatalog, - lv_id TYPE i, - lv_rows TYPE i, - lv_formula TYPE string, - ls_settings TYPE zexcel_s_table_settings, - lo_table TYPE REF TO zcl_excel_table, - lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line, - lv_value TYPE string, - lv_value_lowercase TYPE string, - lv_syindex TYPE char3, - lv_errormessage TYPE string, "ins issue #237 - - lv_columns TYPE i, - lt_columns TYPE zexcel_t_fieldcatalog, - lv_maxcol TYPE i, - lv_maxrow TYPE i, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_curtable TYPE REF TO zcl_excel_table. - - FIELD-SYMBOLS: - <ls_field_catalog> TYPE zexcel_s_fieldcatalog, - <ls_field_catalog_custom> TYPE zexcel_s_fieldcatalog, - <fs_table_line> TYPE ANY, - <fs_fldval> TYPE ANY. - - ls_settings = is_table_settings. - - IF ls_settings-top_left_column IS INITIAL. - ls_settings-top_left_column = lc_top_left_column. - ENDIF. - - IF ls_settings-table_style IS INITIAL. - ls_settings-table_style = zcl_excel_table=>builtinstyle_medium2. - ENDIF. - - IF ls_settings-top_left_row IS INITIAL. - ls_settings-top_left_row = lc_top_left_row. - ENDIF. - - IF it_field_catalog IS NOT SUPPLIED. - lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table ). - ELSE. - lt_field_catalog = it_field_catalog. - ENDIF. - - SORT lt_field_catalog BY position. - -*--------------------------------------------------------------------* -* issue #237 Check if overlapping areas exist Start -*--------------------------------------------------------------------* - "Get the number of columns for the current table - lt_columns = lt_field_catalog. - DELETE lt_columns WHERE dynpfld NE abap_true. - DESCRIBE TABLE lt_columns LINES lv_columns. - - "Calculate the top left row of the current table - lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). - lv_row_int = ls_settings-top_left_row. - - "Get number of row for the current table - DESCRIBE TABLE ip_table LINES lv_rows. - - "Calculate the bottom right row for the current table - lv_maxcol = lv_column_int + lv_columns - 1. - lv_maxrow = lv_row_int + lv_rows - 1. - ls_settings-bottom_right_column = zcl_excel_common=>convert_column2alpha( lv_maxcol ). - ls_settings-bottom_right_row = lv_maxrow. - - lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). - - lo_iterator = me->tables->if_object_collection~get_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - - lo_curtable ?= lo_iterator->if_object_collection_iterator~get_next( ). - IF ( ( ls_settings-top_left_row GE lo_curtable->settings-top_left_row AND ls_settings-top_left_row LE lo_curtable->settings-bottom_right_row ) - OR - ( ls_settings-bottom_right_row GE lo_curtable->settings-top_left_row AND ls_settings-bottom_right_row LE lo_curtable->settings-bottom_right_row ) - ) - AND - ( ( lv_column_int GE zcl_excel_common=>convert_column2int( lo_curtable->settings-top_left_column ) AND lv_column_int LE zcl_excel_common=>convert_column2int( lo_curtable->settings-bottom_right_column ) ) - OR - ( lv_maxcol GE zcl_excel_common=>convert_column2int( lo_curtable->settings-top_left_column ) AND lv_maxcol LE zcl_excel_common=>convert_column2int( lo_curtable->settings-bottom_right_column ) ) - ). - lv_errormessage = 'Table overlaps with previously bound table and will not be added to worksheet.'(400). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - ENDWHILE. -*--------------------------------------------------------------------* -* issue #237 Check if overlapping areas exist End -*--------------------------------------------------------------------* - - CREATE OBJECT lo_table. - lo_table->settings = ls_settings. - lo_table->set_data( ir_data = ip_table ). - lv_id = me->excel->get_next_table_id( ). - lo_table->set_id( iv_id = lv_id ). -* lo_table->fieldcat = lt_field_catalog[]. - - me->tables->add( lo_table ). - -* It is better to loop column by column (only visible column) - LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true. - - lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). - - " Due restrinction of new table object we cannot have two column with the same name - " Check if a column with the same name exists, if exists add a counter - " If no medium description is provided we try to use small or long -* lv_value = <ls_field_catalog>-scrtext_m. - IF <ls_field_catalog>-scrtext_m IS NOT INITIAL. - lv_value = <ls_field_catalog>-scrtext_m. - <ls_field_catalog>-scrtext_l = lv_value. - ELSEIF <ls_field_catalog>-scrtext_s IS NOT INITIAL. - lv_value = <ls_field_catalog>-scrtext_s. - <ls_field_catalog>-scrtext_l = lv_value. - ELSEIF <ls_field_catalog>-scrtext_l IS NOT INITIAL. - lv_value = <ls_field_catalog>-scrtext_l. - ELSE. - lv_value = 'Column'. " default value as Excel does - <ls_field_catalog>-scrtext_l = lv_value. - ENDIF. - WHILE 1 = 1. - lv_value_lowercase = lv_value. - TRANSLATE lv_value_lowercase TO LOWER CASE. - READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH. - IF sy-subrc <> 0. - <ls_field_catalog>-scrtext_l = lv_value. - INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer. - EXIT. - ELSE. - lv_syindex = sy-index. - CONCATENATE <ls_field_catalog>-scrtext_l lv_syindex INTO lv_value. - ENDIF. - - ENDWHILE. - " First of all write column header - IF <ls_field_catalog>-style_header IS NOT INITIAL. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_value = lv_value - ip_style = <ls_field_catalog>-style_header ). - ELSE. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_value = lv_value ). - ENDIF. - - ADD 1 TO lv_row_int. - LOOP AT ip_table ASSIGNING <fs_table_line>. - - ASSIGN COMPONENT <ls_field_catalog>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. - " issue #290 Add formula support in table - IF <ls_field_catalog>-formula EQ abap_true. - IF <ls_field_catalog>-style IS NOT INITIAL. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_formula = <fs_fldval> - ip_style = <ls_field_catalog>-style ). - ELSE. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_formula = <fs_fldval> ). - ENDIF. - ELSE. - IF <ls_field_catalog>-style IS NOT INITIAL. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_value = <fs_fldval> - ip_style = <ls_field_catalog>-style ). - ELSE. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_value = <fs_fldval> ). - ENDIF. - ENDIF. - ADD 1 TO lv_row_int. - - ENDLOOP. - IF sy-subrc <> 0. "create empty row if table has no data - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_value = space ). - ADD 1 TO lv_row_int. - ENDIF. - -*--------------------------------------------------------------------* - " totals -*--------------------------------------------------------------------* - IF <ls_field_catalog>-totals_function IS NOT INITIAL. - lv_formula = lo_table->get_totals_formula( ip_column = <ls_field_catalog>-scrtext_l ip_function = <ls_field_catalog>-totals_function ). - IF <ls_field_catalog>-style_total IS NOT INITIAL. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_formula = lv_formula - ip_style = <ls_field_catalog>-style_total ). - ELSE. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_formula = lv_formula ). - ENDIF. - ENDIF. - - lv_row_int = ls_settings-top_left_row. - ADD 1 TO lv_column_int. - -*--------------------------------------------------------------------* - " conditional formatting -*--------------------------------------------------------------------* - IF <ls_field_catalog>-cond_style IS NOT INITIAL. - lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header - lv_last_row = ls_settings-top_left_row + lv_rows. - <ls_field_catalog>-cond_style->set_range( ip_start_column = lv_column_alpha - ip_start_row = lv_first_row - ip_stop_column = lv_column_alpha - ip_stop_row = lv_last_row ). - ENDIF. - - ENDLOOP. - -*--------------------------------------------------------------------* - " Set field catalog -*--------------------------------------------------------------------* - lo_table->fieldcat = lt_field_catalog[]. - - es_table_settings = ls_settings. - es_table_settings-bottom_right_column = lv_column_alpha. - " >> Issue #291 - IF ip_table IS INITIAL. - es_table_settings-bottom_right_row = ls_settings-top_left_row + 2. "Last rows - ELSE. - es_table_settings-bottom_right_row = ls_settings-top_left_row + lv_rows + 1. "Last rows - ENDIF. - " << Issue #291 - - endmethod. - - - - - - - *--------------------------------------------------------------------* -* issue #293 - Roberto Bianco -* - Christian Assig 2014-03-14 -* -* changes: - Calculate widths using SAPscript font metrics -* (transaction SE73) -* - Calculate the width of dates -* - Add additional width for auto filter buttons -* - Add cell padding to simulate Excel behavior -*--------------------------------------------------------------------* -METHOD calculate_cell_width. - - CONSTANTS: - lc_default_font_name TYPE zexcel_style_font_name VALUE 'Calibri', "#EC NOTEXT - lc_default_font_height TYPE tdfontsize VALUE '110', - lc_excel_cell_padding TYPE float VALUE '0.75'. - - DATA: ld_cell_value TYPE zexcel_cell_value, - ld_current_character TYPE c LENGTH 1, - ld_style_guid TYPE zexcel_cell_style, - ls_stylemapping TYPE zexcel_s_stylemapping, - lo_table_object TYPE REF TO object, - lo_table TYPE REF TO zcl_excel_table, - ld_table_top_left_column TYPE zexcel_cell_column, - ld_table_bottom_right_column TYPE zexcel_cell_column, - ld_flag_contains_auto_filter TYPE abap_bool VALUE abap_false, - ld_flag_bold TYPE abap_bool VALUE abap_false, - ld_flag_italic TYPE abap_bool VALUE abap_false, - ld_date TYPE d, - ld_date_char TYPE c LENGTH 50, - ld_font_height TYPE tdfontsize VALUE lc_default_font_height, - lt_itcfc TYPE STANDARD TABLE OF itcfc, - ld_offset TYPE i, - ld_length TYPE i, - ld_uccp TYPE i, - ls_font_metric TYPE mty_s_font_metric, - ld_width_from_font_metrics TYPE i, - ld_font_family TYPE itcfh-tdfamily, - ld_font_name TYPE zexcel_style_font_name VALUE lc_default_font_name, - lt_font_families LIKE STANDARD TABLE OF ld_font_family, - ls_font_cache TYPE mty_s_font_cache. - - FIELD-SYMBOLS: <ls_font_cache> TYPE mty_s_font_cache, - <ls_font_metric> TYPE mty_s_font_metric, - <ls_itcfc> TYPE itcfc. - - " Determine cell content and cell style - me->get_cell( EXPORTING ip_column = ip_column - ip_row = ip_row - IMPORTING ep_value = ld_cell_value - ep_guid = ld_style_guid ). - - " ABAP2XLSX uses tables to define areas containing headers and - " auto-filters. Find out if the current cell is in the header - " of one of these tables. - LOOP AT me->tables->collection INTO lo_table_object. - " Downcast: OBJECT -> ZCL_EXCEL_TABLE - lo_table ?= lo_table_object. - - " Convert column letters to corresponding integer values - ld_table_top_left_column = - zcl_excel_common=>convert_column2int( - lo_table->settings-top_left_column ). - - ld_table_bottom_right_column = - zcl_excel_common=>convert_column2int( - lo_table->settings-bottom_right_column ). - - " Is the current cell part of the table header? - IF ip_column BETWEEN ld_table_top_left_column AND - ld_table_bottom_right_column AND - ip_row EQ lo_table->settings-top_left_row. - " Current cell is part of the table header - " -> Assume that an auto filter is present and that the font is - " bold - ld_flag_contains_auto_filter = abap_true. - ld_flag_bold = abap_true. - ENDIF. - ENDLOOP. - - " If a style GUID is present, read style attributes - IF ld_style_guid IS NOT INITIAL. - TRY. - " Read style attributes - ls_stylemapping = me->excel->get_style_to_guid( ld_style_guid ). - - " If the current cell contains the default date format, - " convert the cell value to a date and calculate its length - IF ls_stylemapping-complete_style-number_format-format_code = - zcl_excel_style_number_format=>c_format_date_std. - - " Convert excel date to ABAP date - ld_date = - zcl_excel_common=>excel_string_to_date( ld_cell_value ). - - " Format ABAP date using user's formatting settings - WRITE ld_date TO ld_date_char. - - " Remember the formatted date to calculate the cell size - ld_cell_value = ld_date_char. - - ENDIF. - - " Read the font size and convert it to the font height - " used by SAPscript (multiplication by 10) - IF ls_stylemapping-complete_stylex-font-size = abap_true. - ld_font_height = ls_stylemapping-complete_style-font-size * 10. - ENDIF. - - " If set, remember the font name - IF ls_stylemapping-complete_stylex-font-name = abap_true. - ld_font_name = ls_stylemapping-complete_style-font-name. - ENDIF. - - " If set, remember whether font is bold and italic. - IF ls_stylemapping-complete_stylex-font-bold = abap_true. - ld_flag_bold = ls_stylemapping-complete_style-font-bold. - ENDIF. - - IF ls_stylemapping-complete_stylex-font-italic = abap_true. - ld_flag_italic = ls_stylemapping-complete_style-font-italic. - ENDIF. - - CATCH zcx_excel ##NO_HANDLER. - " Style GUID is present, but style was not found - " Continue with default values - - ENDTRY. - ENDIF. - - " Check if the same font (font name and font attributes) was already - " used before - READ TABLE mth_font_cache - WITH TABLE KEY - font_name = ld_font_name - font_height = ld_font_height - flag_bold = ld_flag_bold - flag_italic = ld_flag_italic - ASSIGNING <ls_font_cache>. - - IF sy-subrc <> 0. - " Font is used for the first time - " Add the font to our local font cache - ls_font_cache-font_name = ld_font_name. - ls_font_cache-font_height = ld_font_height. - ls_font_cache-flag_bold = ld_flag_bold. - ls_font_cache-flag_italic = ld_flag_italic. - INSERT ls_font_cache INTO TABLE mth_font_cache - ASSIGNING <ls_font_cache>. - - " Determine the SAPscript font family name from the Excel - " font name - SELECT tdfamily - FROM tfo01 - INTO TABLE lt_font_families - UP TO 1 ROWS - WHERE tdtext = ld_font_name. - - " Check if a matching font family was found - " Fonts can be uploaded from TTF files using transaction SE73 - IF lines( lt_font_families ) > 0. - READ TABLE lt_font_families INDEX 1 INTO ld_font_family. - - " Load font metrics (returns a table with the size of each letter - " in the font) - CALL FUNCTION 'LOAD_FONT' - EXPORTING - family = ld_font_family - height = ld_font_height - printer = 'SWIN' - bold = ld_flag_bold - italic = ld_flag_italic - TABLES - metric = lt_itcfc - EXCEPTIONS - font_family = 1 - codepage = 2 - device_type = 3 - OTHERS = 4. - IF sy-subrc <> 0. - CLEAR lt_itcfc. - ENDIF. - - " For faster access, convert each character number to the actual - " character, and store the characters and their sizes in a hash - " table - LOOP AT lt_itcfc ASSIGNING <ls_itcfc>. - ld_uccp = <ls_itcfc>-cpcharno. - ls_font_metric-char = - cl_abap_conv_in_ce=>uccpi( ld_uccp ). - ls_font_metric-char_width = <ls_itcfc>-tdcwidths. - INSERT ls_font_metric - INTO TABLE <ls_font_cache>-th_font_metrics. - ENDLOOP. - - ENDIF. - ENDIF. - - " Calculate the cell width - " If available, use font metrics - IF lines( <ls_font_cache>-th_font_metrics ) = 0. - " Font metrics are not available - " -> Calculate the cell width using only the font size - ld_length = strlen( ld_cell_value ). - ep_width = ld_length * ld_font_height / lc_default_font_height + lc_excel_cell_padding. - - ELSE. - " Font metrics are available - - " Calculate the size of the text by adding the sizes of each - " letter - ld_length = strlen( ld_cell_value ). - DO ld_length TIMES. - " Subtract 1, because the first character is at offset 0 - ld_offset = sy-index - 1. - - " Read the current character from the cell value - ld_current_character = ld_cell_value+ld_offset(1). - - " Look up the size of the current letter - READ TABLE <ls_font_cache>-th_font_metrics - WITH TABLE KEY char = ld_current_character - ASSIGNING <ls_font_metric>. - IF sy-subrc = 0. - " The size of the letter is known - " -> Add the actual size of the letter - ADD <ls_font_metric>-char_width TO ld_width_from_font_metrics. - ELSE. - " The size of the letter is unknown - " -> Add the font height as the default letter size - ADD ld_font_height TO ld_width_from_font_metrics. - ENDIF. - ENDDO. - - " Add cell padding (Excel makes columns a bit wider than the space - " that is needed for the text itself) and convert unit - " (division by 100) - ep_width = ld_width_from_font_metrics / 100 + lc_excel_cell_padding. - ENDIF. - - " If the current cell contains an auto filter, make it a bit wider. - " The size used by the auto filter button does not depend on the font - " size. - IF ld_flag_contains_auto_filter = abap_true. - ADD 2 TO ep_width. - ENDIF. - -ENDMETHOD. - - - - method CALCULATE_COLUMN_WIDTHS. - TYPES: - BEGIN OF t_auto_size, - col_index TYPE int4, - width TYPE float, - END OF t_auto_size. - TYPES: tt_auto_size TYPE TABLE OF t_auto_size. - - DATA: column_dimensions TYPE zexcel_t_worksheet_columndime. - DATA: column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - - DATA: auto_size TYPE flag. - DATA: auto_sizes TYPE tt_auto_size. -* DATA: col_alpha TYPE zexcel_cell_column_alpha." issue #155 - less restrictive typing for ip_column - DATA: cell_value TYPE zexcel_cell_value. - DATA: cell_style TYPE REF TO zcl_excel_style. - DATA: count TYPE int4. - DATA: highest_row TYPE int4. - DATA: width TYPE float. - - FIELD-SYMBOLS: <column_dimension> LIKE LINE OF column_dimensions. - FIELD-SYMBOLS: <auto_size> LIKE LINE OF auto_sizes. - - column_dimensions[] = me->get_column_dimensions( ). - LOOP AT column_dimensions ASSIGNING <column_dimension>. - auto_size = <column_dimension>-column_dimension->get_auto_size( ). - IF auto_size = abap_true. - APPEND INITIAL LINE TO auto_sizes ASSIGNING <auto_size>. - <auto_size>-col_index = <column_dimension>-column_dimension->get_column_index( ). - <auto_size>-width = -1. - ENDIF. - ENDLOOP. - - " There is only something to do if there are some auto-size columns - IF NOT auto_sizes IS INITIAL. - highest_row = me->get_highest_row( ). - LOOP AT auto_sizes ASSIGNING <auto_size>. -* col_alpha = zcl_excel_common=>convert_column2alpha( <auto_size>-col_index )." issue #155 - less restrictive typing for ip_column - count = 1. - WHILE count <= highest_row. -* Do not check merged cells - IF is_cell_merged( - ip_column = <auto_size>-col_index - ip_row = count ) = abap_false. -* Start of change # issue 139 - Dateretention of cellstyles -* IF cell_style IS BOUND. -* CREATE OBJECT cell_style. -* ENDIF. -* me->get_cell( -* EXPORTING -* ip_column = col_alpha " Cell Column -* ip_row = count " Cell Row -* IMPORTING -* ep_value = cell_value " Cell Value -* ep_style = cell_style " Request Cell Style as well -* ). -* " For an easy start we just take the number of characters as the width -* width = strlen( cell_value ). -* " Addition to solve issue #120, contribution by Stefan Schm#ƒÂ#cker -* " Calculate width using Font Size and Font Type -* IF cell_style IS BOUND -* AND cell_style->font IS BOUND. -* width = cell_style->font->calculate_text_width( cell_value ). -* ENDIF. -* width = calculate_cell_width( ip_column = col_alpha " issue #155 - less restrictive typing for ip_column - width = calculate_cell_width( ip_column = <auto_size>-col_index " issue #155 - less restrictive typing for ip_column - ip_row = count ). -* End of change # issue 139 - Dateretention of cellstyles - IF width > <auto_size>-width. - <auto_size>-width = width. - ENDIF. - ENDIF. - count = count + 1. - ENDWHILE. -* column_dimension = me->get_column_dimension( col_alpha ). " issue #155 - less restrictive typing for ip_column - column_dimension = me->get_column_dimension( <auto_size>-col_index ). " issue #155 - less restrictive typing for ip_column - column_dimension->set_width( <auto_size>-width ). - ENDLOOP. - ENDIF. - - endmethod. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - METHOD change_cell_style. - " issue # 139 - DATA: stylemapping TYPE zexcel_s_stylemapping, - - complete_style TYPE zexcel_s_cstyle_complete, - complete_stylex TYPE zexcel_s_cstylex_complete, - - borderx TYPE zexcel_s_cstylex_border, - l_guid TYPE zexcel_cell_style. "issue # 177 - -* We have a lot of parameters. Use some macros to make the coding more structured - - DEFINE clear_initial_colorxfields. - if &1-rgb is initial. - clear &2-rgb. - endif. - if &1-indexed is initial. - clear &2-indexed. - endif. - if &1-theme is initial. - clear &2-theme. - endif. - if &1-tint is initial. - clear &2-tint. - endif. - END-OF-DEFINITION. - - DEFINE move_supplied_borders. - if ip_&1 is supplied. " only act if parameter was supplied - if ip_x&1 is supplied. " - borderx = ip_x&1. " use supplied x-parameter - else. - clear borderx with 'X'. -* clear in a way that would be expected to work easily - if ip_&1-border_style is initial. - clear borderx-border_style. - endif. - clear_initial_colorxfields ip_&1-border_color borderx-border_color. - endif. - move-corresponding ip_&1 to complete_style-&2. - move-corresponding borderx to complete_stylex-&2. - endif. - END-OF-DEFINITION. - -* First get current stylsettings - TRY. - me->get_cell( EXPORTING ip_column = ip_column " Cell Column - ip_row = ip_row " Cell Row - IMPORTING ep_guid = l_guid )." Cell Value ). "issue # 177 - - - stylemapping = me->excel->get_style_to_guid( l_guid ). "issue # 177 - complete_style = stylemapping-complete_style. - complete_stylex = stylemapping-complete_stylex. - CATCH zcx_excel. -* Error --> use submitted style - ENDTRY. - -* move_supplied_multistyles: complete. - IF ip_complete IS SUPPLIED. - IF ip_xcomplete IS NOT SUPPLIED. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Complete styleinfo has to be supplied with corresponding X-field'. - ENDIF. - MOVE-CORRESPONDING ip_complete TO complete_style. - MOVE-CORRESPONDING ip_xcomplete TO complete_stylex. - ENDIF. - - - - IF ip_font IS SUPPLIED. - DATA: fontx LIKE ip_xfont. - IF ip_xfont IS SUPPLIED. - fontx = ip_xfont. - ELSE. -* Only supplied values should be used - exception: Flags bold and italic strikethrough underline - MOVE 'X' TO: fontx-bold, - fontx-italic, - fontx-strikethrough, - fontx-underline_mode. - CLEAR fontx-color WITH 'X'. - clear_initial_colorxfields ip_font-color fontx-color. - IF ip_font-family IS NOT INITIAL. - fontx-family = 'X'. - ENDIF. - IF ip_font-name IS NOT INITIAL. - fontx-name = 'X'. - ENDIF. - IF ip_font-scheme IS NOT INITIAL. - fontx-scheme = 'X'. - ENDIF. - IF ip_font-size IS NOT INITIAL. - fontx-size = 'X'. - ENDIF. - IF ip_font-underline_mode IS NOT INITIAL. - fontx-underline_mode = 'X'. - ENDIF. - ENDIF. - MOVE-CORRESPONDING ip_font TO complete_style-font. - MOVE-CORRESPONDING fontx TO complete_stylex-font. -* Correction for undeline mode - ENDIF. - - IF ip_fill IS SUPPLIED. - DATA: fillx LIKE ip_xfill. - IF ip_xfill IS SUPPLIED. - fillx = ip_xfill. - ELSE. - CLEAR fillx WITH 'X'. - IF ip_fill-filltype IS INITIAL. - CLEAR fillx-filltype. - ENDIF. - clear_initial_colorxfields ip_fill-fgcolor fillx-fgcolor. - clear_initial_colorxfields ip_fill-bgcolor fillx-bgcolor. - - ENDIF. - MOVE-CORRESPONDING ip_fill TO complete_style-fill. - MOVE-CORRESPONDING fillx TO complete_stylex-fill. - ENDIF. - - - IF ip_borders IS SUPPLIED. - DATA: bordersx LIKE ip_xborders. - IF ip_xborders IS SUPPLIED. - bordersx = ip_xborders. - ELSE. - CLEAR bordersx WITH 'X'. - IF ip_borders-allborders-border_style IS INITIAL. - CLEAR bordersx-allborders-border_style. - ENDIF. - IF ip_borders-diagonal-border_style IS INITIAL. - CLEAR bordersx-diagonal-border_style. - ENDIF. - IF ip_borders-down-border_style IS INITIAL. - CLEAR bordersx-down-border_style. - ENDIF. - IF ip_borders-left-border_style IS INITIAL. - CLEAR bordersx-left-border_style. - ENDIF. - IF ip_borders-right-border_style IS INITIAL. - CLEAR bordersx-right-border_style. - ENDIF. - IF ip_borders-top-border_style IS INITIAL. - CLEAR bordersx-top-border_style. - ENDIF. - clear_initial_colorxfields ip_borders-allborders-border_color bordersx-allborders-border_color. - clear_initial_colorxfields ip_borders-diagonal-border_color bordersx-diagonal-border_color. - clear_initial_colorxfields ip_borders-down-border_color bordersx-down-border_color. - clear_initial_colorxfields ip_borders-left-border_color bordersx-left-border_color. - clear_initial_colorxfields ip_borders-right-border_color bordersx-right-border_color. - clear_initial_colorxfields ip_borders-top-border_color bordersx-top-border_color. - - ENDIF. - MOVE-CORRESPONDING ip_borders TO complete_style-borders. - MOVE-CORRESPONDING bordersx TO complete_stylex-borders. - ENDIF. - - IF ip_alignment IS SUPPLIED. - DATA: alignmentx LIKE ip_xalignment. - IF ip_xalignment IS SUPPLIED. - alignmentx = ip_xalignment. - ELSE. - CLEAR alignmentx WITH 'X'. - IF ip_alignment-horizontal IS INITIAL. - CLEAR alignmentx-horizontal. - ENDIF. - IF ip_alignment-vertical IS INITIAL. - CLEAR alignmentx-vertical. - ENDIF. - ENDIF. - MOVE-CORRESPONDING ip_alignment TO complete_style-alignment. - MOVE-CORRESPONDING alignmentx TO complete_stylex-alignment. - ENDIF. - - IF ip_protection IS SUPPLIED. - MOVE-CORRESPONDING ip_protection TO complete_style-protection. - IF ip_xprotection IS SUPPLIED. - MOVE-CORRESPONDING ip_xprotection TO complete_stylex-protection. - ELSE. - IF ip_protection-hidden IS NOT INITIAL. - complete_stylex-protection-hidden = 'X'. - ENDIF. - IF ip_protection-locked IS NOT INITIAL. - complete_stylex-protection-locked = 'X'. - ENDIF. - ENDIF. - ENDIF. - - - move_supplied_borders : borders_allborders borders-allborders, - borders_diagonal borders-diagonal , - borders_down borders-down , - borders_left borders-left , - borders_right borders-right , - borders_top borders-top . - - DEFINE move_supplied_singlestyles. - if ip_&1 is supplied. - complete_style-&2 = ip_&1. - complete_stylex-&2 = 'X'. - endif. - END-OF-DEFINITION. - - move_supplied_singlestyles: number_format_format_code number_format-format_code, - font_bold font-bold, - font_color font-color, - font_color_rgb font-color-rgb, - font_color_indexed font-color-indexed, - font_color_theme font-color-theme, - font_color_tint font-color-tint, - - font_family font-family, - font_italic font-italic, - font_name font-name, - font_scheme font-scheme, - font_size font-size, - font_strikethrough font-strikethrough, - font_underline font-underline, - font_underline_mode font-underline_mode, - fill_filltype fill-filltype, - fill_rotation fill-rotation, - fill_fgcolor fill-fgcolor, - fill_fgcolor_rgb fill-fgcolor-rgb, - fill_fgcolor_indexed fill-fgcolor-indexed, - fill_fgcolor_theme fill-fgcolor-theme, - fill_fgcolor_tint fill-fgcolor-tint, - - fill_bgcolor fill-bgcolor, - fill_bgcolor_rgb fill-bgcolor-rgb, - fill_bgcolor_indexed fill-bgcolor-indexed, - fill_bgcolor_theme fill-bgcolor-theme, - fill_bgcolor_tint fill-bgcolor-tint, - - borders_diagonal_mode borders-diagonal_mode, - alignment_horizontal alignment-horizontal, - alignment_vertical alignment-vertical, - alignment_textrotation alignment-textrotation, - alignment_wraptext alignment-wraptext, - alignment_shrinktofit alignment-shrinktofit, - alignment_indent alignment-indent, - protection_hidden protection-hidden, - protection_locked protection-locked, - - borders_allborders_style borders-allborders-border_style, - borders_allborders_color borders-allborders-border_color, - borders_allbo_color_rgb borders-allborders-border_color-rgb, - borders_allbo_color_indexed borders-allborders-border_color-indexed, - borders_allbo_color_theme borders-allborders-border_color-theme, - borders_allbo_color_tint borders-allborders-border_color-tint, - - borders_diagonal_style borders-diagonal-border_style, - borders_diagonal_color borders-diagonal-border_color, - borders_diagonal_color_rgb borders-diagonal-border_color-rgb, - borders_diagonal_color_inde borders-diagonal-border_color-indexed, - borders_diagonal_color_them borders-diagonal-border_color-theme, - borders_diagonal_color_tint borders-diagonal-border_color-tint, - - borders_down_style borders-down-border_style, - borders_down_color borders-down-border_color, - borders_down_color_rgb borders-down-border_color-rgb, - borders_down_color_indexed borders-down-border_color-indexed, - borders_down_color_theme borders-down-border_color-theme, - borders_down_color_tint borders-down-border_color-tint, - - borders_left_style borders-left-border_style, - borders_left_color borders-left-border_color, - borders_left_color_rgb borders-left-border_color-rgb, - borders_left_color_indexed borders-left-border_color-indexed, - borders_left_color_theme borders-left-border_color-theme, - borders_left_color_tint borders-left-border_color-tint, - - borders_right_style borders-right-border_style, - borders_right_color borders-right-border_color, - borders_right_color_rgb borders-right-border_color-rgb, - borders_right_color_indexed borders-right-border_color-indexed, - borders_right_color_theme borders-right-border_color-theme, - borders_right_color_tint borders-right-border_color-tint, - - borders_top_style borders-top-border_style, - borders_top_color borders-top-border_color, - borders_top_color_rgb borders-top-border_color-rgb, - borders_top_color_indexed borders-top-border_color-indexed, - borders_top_color_theme borders-top-border_color-theme, - borders_top_color_tint borders-top-border_color-tint. - - -* Now we have a completly filled styles. -* This can be used to get the guid -* Return guid if requested. Might be used if copy&paste of styles is requested - ep_guid = me->excel->get_static_cellstyle_guid( ip_cstyle_complete = complete_style - ip_cstylex_complete = complete_stylex ). - me->set_cell_style( ip_column = ip_column - ip_row = ip_row - ip_style = ep_guid ). - -ENDMETHOD. - - - - - - method CONSTRUCTOR. - DATA: lv_title TYPE zexcel_sheet_title. - - me->excel = ip_excel. - - CALL FUNCTION 'GUID_CREATE' - IMPORTING - ev_guid_16 = me->guid. - - IF ip_title IS NOT INITIAL. - lv_title = ip_title. - ELSE. -* lv_title = me->guid. " del issue #154 - Names of worksheets - lv_title = me->generate_title( ). " ins issue #154 - Names of worksheets - ENDIF. - - me->set_title( ip_title = lv_title ). - - CREATE OBJECT sheet_setup. - CREATE OBJECT conditional_styles. - CREATE OBJECT data_validations. - CREATE OBJECT tables. - CREATE OBJECT ranges. " issue #163 - CREATE OBJECT drawings - EXPORTING - ip_type = zcl_excel_drawing=>type_image. - CREATE OBJECT charts - EXPORTING - ip_type = zcl_excel_drawing=>type_chart. - me->zif_excel_sheet_protection~initialize( ). - me->zif_excel_sheet_properties~initialize( ). - CREATE OBJECT hyperlinks. - -* initialize active cell coordinates - active_cell-cell_row = 1. - active_cell-cell_column = 1. - -* inizialize dimension range - lower_cell-cell_row = 1. - lower_cell-cell_column = 1. - upper_cell-cell_row = 1. - upper_cell-cell_column = 1. - - endmethod. - - - method DELETE_MERGE. - - DELETE sheet_content_merge INDEX 1. - DELETE sheet_content_merge INDEX 1. - - endmethod. - - - - - - method FREEZE_PANES. - data: lv_xsplit type i, - lv_ysplit type i. - - IF ip_num_columns IS NOT SUPPLIED AND ip_num_rows IS NOT SUPPLIED. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Pleas provide number of rows and/or columns to freeze'. - ENDIF. - - IF ip_num_columns IS SUPPLIED AND ip_num_columns <= 0. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Number of columns to freeze should be positive'. - ENDIF. - - IF ip_num_rows IS SUPPLIED AND ip_num_rows <= 0. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Number of rows to freeze should be positive'. - ENDIF. - - freeze_pane_cell_column = ip_num_columns + 1. - freeze_pane_cell_row = ip_num_rows + 1. - endmethod. - - - - method GENERATE_TITLE. - DATA: lo_worksheets_iterator TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - errormessage TYPE string. - - DATA: t_titles TYPE HASHED TABLE OF zexcel_sheet_title WITH UNIQUE KEY table_line, - title TYPE zexcel_sheet_title, - sheetnumber TYPE i. - -* Get list of currently used titles - lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). - WHILE lo_worksheets_iterator->has_next( ) = abap_true. - lo_worksheet ?= lo_worksheets_iterator->get_next( ). - title = lo_worksheet->get_title( ). - INSERT title INTO TABLE t_titles. - ADD 1 TO sheetnumber. - ENDWHILE. - -* Now build sheetnumber. Increase counter until we hit a number that is not used so far - ADD 1 TO sheetnumber. " Start counting with next number - DO. - title = sheetnumber. - SHIFT title LEFT DELETING LEADING space. - CONCATENATE 'Sheet'(001) title INTO ep_title. - INSERT ep_title INTO TABLE t_titles. - IF sy-subrc = 0. " Title not used so far --> take it - EXIT. - ENDIF. - - ADD 1 TO sheetnumber. - ENDDO. - endmethod. - - - - - method GET_ACTIVE_CELL. - - DATA: lv_active_column TYPE zexcel_cell_column_alpha, - lv_active_row TYPE string. - - lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). - lv_active_row = active_cell-cell_row. - SHIFT lv_active_row RIGHT DELETING TRAILING space. - SHIFT lv_active_row LEFT DELETING LEADING space. - CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. - - endmethod. - - - - - - - - - - method GET_CELL. - - DATA: lv_column TYPE zexcel_cell_column, - ls_sheet_content TYPE zexcel_s_cell_data. - - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. - - lv_column = zcl_excel_common=>convert_column2int( ip_column ). - - READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row - cell_column = lv_column. - - ep_rc = sy-subrc. - ep_value = ls_sheet_content-cell_value. - ep_guid = ls_sheet_content-cell_style. " issue 139 - added this to be used for columnwidth calculation - - " Addition to solve issue #120, contribution by Stefan Schm#ƒÂ#cker - DATA: style_iterator TYPE REF TO cl_object_collection_iterator, - style TYPE REF TO zcl_excel_style. - IF ep_style IS REQUESTED. - style_iterator = me->excel->get_styles_iterator( ). - WHILE style_iterator->has_next( ) = 'X'. - style ?= style_iterator->get_next( ). - IF style->get_guid( ) = ls_sheet_content-cell_style. - ep_style = style. - EXIT. - ENDIF. - ENDWHILE. - ENDIF. - endmethod. - - - - - - method GET_COLUMN_DIMENSION. - FIELD-SYMBOLS: <fs_column_dimension> LIKE LINE OF column_dimensions. - DATA: lv_column_alpha TYPE zexcel_cell_column_alpha. " issue #155 - less restrictive typing for ip_column - - lv_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column )." issue #155 - less restrictive typing for ip_column - READ TABLE me->column_dimensions ASSIGNING <fs_column_dimension> - WITH KEY column = lv_column_alpha. " issue #155 - less restrictive typing for ip_column - - IF NOT <fs_column_dimension> IS ASSIGNED. - CREATE OBJECT r_column_dimension - EXPORTING - ip_index = lv_column_alpha " issue #155 - less restrictive typing for ip_column - ip_excel = me->excel " issue #157 - Allow style for columns - ip_worksheet = me. " issue #157 - Allow style for columns - APPEND INITIAL LINE TO me->column_dimensions ASSIGNING <fs_column_dimension>. - <fs_column_dimension>-column = lv_column_alpha. " issue #155 - less restrictive typing for ip_column - <fs_column_dimension>-column_dimension = r_column_dimension. - ELSE. - r_column_dimension = <fs_column_dimension>-column_dimension. - ENDIF. - - endmethod. - - - - method GET_COLUMN_DIMENSIONS. - r_column_dimension[] = me->column_dimensions[]. - endmethod. - - - - method GET_COND_STYLES_ITERATOR. - - eo_iterator = me->conditional_styles->get_iterator( ). - endmethod. - - - - method GET_DATA_VALIDATIONS_ITERATOR. - - eo_iterator = me->data_validations->get_iterator( ). - endmethod. - - - - method GET_DATA_VALIDATIONS_SIZE. - ep_size = me->data_validations->size( ). - endmethod. - - - - method GET_DEFAULT_COLUMN_DIMENSION. - IF me->default_column_dimension IS NOT BOUND. - CREATE OBJECT me->default_column_dimension - EXPORTING - ip_index = 'A' " ???? - ip_worksheet = me - ip_excel = me->excel. - ENDIF. - - r_column_dimension = me->default_column_dimension. - endmethod. - - - - method GET_DEFAULT_EXCEL_DATE_FORMAT. - CONSTANTS: c_lang_e TYPE lang VALUE 'E'. - - IF default_excel_date_format IS NOT INITIAL. - ep_default_excel_date_format = default_excel_date_format. - RETURN. - ENDIF. - - "try to get defaults - TRY. - cl_abap_datfm=>get_date_format_des( EXPORTING im_langu = c_lang_e - IMPORTING ex_dateformat = default_excel_date_format ). - CATCH cx_abap_datfm_format_unknown. - - ENDTRY. - - " and fallback to fixed format - IF default_excel_date_format IS INITIAL. - default_excel_date_format = zcl_excel_style_number_format=>c_format_date_ddmmyyyydot. - ENDIF. - - ep_default_excel_date_format = default_excel_date_format. - endmethod. - - - - method GET_DEFAULT_EXCEL_TIME_FORMAT. - DATA: l_timefm TYPE xutimefm. - - IF default_excel_time_format IS NOT INITIAL. - ep_default_excel_time_format = default_excel_time_format. - RETURN. - ENDIF. - -* Let's get default - l_timefm = cl_abap_timefm=>get_environment_timefm( ). - CASE l_timefm. - WHEN 0. -*0 24 Hour Format (Example: 12:05:10) - default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time6. - WHEN 1. -*1 12 Hour Format (Example: 12:05:10 PM) - default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. - WHEN 2. -*2 12 Hour Format (Example: 12:05:10 pm) for now all the same. no chnage upper lower - default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. - WHEN 3. -*3 Hours from 0 to 11 (Example: 00:05:10 PM) for now all the same. no chnage upper lower - default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. - WHEN 4. -*4 Hours from 0 to 11 (Example: 00:05:10 pm) for now all the same. no chnage upper lower - default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. - WHEN OTHERS. - " and fallback to fixed format - default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time6. - ENDCASE. - - ep_default_excel_time_format = default_excel_time_format. - endmethod. - - - - method GET_DEFAULT_ROW_DIMENSION. - IF me->default_row_dimension IS NOT BOUND. - CREATE OBJECT me->default_row_dimension. - ENDIF. - - r_row_dimension = me->default_row_dimension. - endmethod. - - - - - method GET_DIMENSION_RANGE. - - me->update_dimension_range( ). - IF upper_cell EQ lower_cell. "only one cell - " Worksheet not filled -* IF upper_cell-cell_coords = '0'. - IF upper_cell-cell_coords IS INITIAL. - ep_dimension_range = 'A1'. - ELSE. - ep_dimension_range = upper_cell-cell_coords. - ENDIF. - ELSE. - CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. - ENDIF. - - endmethod. - - - - - method GET_DRAWINGS. - - DATA: lo_drawing TYPE REF TO zcl_excel_drawing, - lo_iterator TYPE REF TO cl_object_collection_iterator. - - CASE ip_type. - WHEN zcl_excel_drawing=>type_image. - r_drawings = drawings. - WHEN zcl_excel_drawing=>type_chart. - r_drawings = charts. - WHEN space. - CREATE OBJECT r_drawings - EXPORTING - ip_type = ''. - - lo_iterator = drawings->get_iterator( ). - WHILE lo_iterator->has_next( ) = abap_true. - lo_drawing ?= lo_iterator->get_next( ). - r_drawings->include( lo_drawing ). - ENDWHILE. - lo_iterator = charts->get_iterator( ). - WHILE lo_iterator->has_next( ) = abap_true. - lo_drawing ?= lo_iterator->get_next( ). - r_drawings->include( lo_drawing ). - ENDWHILE. - WHEN OTHERS. - ENDCASE. - endmethod. - - - - - method GET_DRAWINGS_ITERATOR. - CASE ip_type. - WHEN zcl_excel_drawing=>type_image. - eo_iterator = drawings->get_iterator( ). - WHEN zcl_excel_drawing=>type_chart. - eo_iterator = charts->get_iterator( ). - ENDCASE. - endmethod. - - - - - method GET_FREEZE_CELL. - ep_row = me->freeze_pane_cell_row. - ep_column = me->freeze_pane_cell_column. - endmethod. - - - - method GET_GUID. - - ep_guid = me->guid. - - endmethod. - - - - - method GET_HIGHEST_COLUMN. - me->update_dimension_range( ). - r_highest_column = me->lower_cell-cell_column. - endmethod. - - - - - method GET_HIGHEST_ROW. - me->update_dimension_range( ). - r_highest_row = me->lower_cell-cell_row. - endmethod. - - - - method GET_HYPERLINKS_ITERATOR. - eo_iterator = hyperlinks->get_iterator( ). - endmethod. - - - - method GET_HYPERLINKS_SIZE. - ep_size = hyperlinks->size( ). - endmethod. - - - - - method GET_MERGE. - - DATA: lv_column_start TYPE string, - lv_column_end TYPE string, - lv_row TYPE string, - lv_index TYPE sy-tabix, - ls_sheet_content TYPE zexcel_s_cell_data, - range_from TYPE string, - range_to TYPE string, - lv_merge_range TYPE string, - lv_count TYPE string. - - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. - - DESCRIBE TABLE sheet_content_merge LINES lv_count. - - WHILE lv_count GT lv_index. -* LOOP AT sheet_content_merge ASSIGNING <fs_sheet_content>. - lv_index = lv_index + 1. - READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. - lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). - lv_row = <fs_sheet_content>-cell_row. - SHIFT lv_column_start RIGHT DELETING TRAILING space. - SHIFT lv_column_start LEFT DELETING LEADING space. - SHIFT lv_row RIGHT DELETING TRAILING space. - SHIFT lv_row LEFT DELETING LEADING space. - CONCATENATE lv_column_start lv_row - INTO range_from. - - lv_index = lv_index + 1. - READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. - lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). - lv_row = <fs_sheet_content>-cell_row. - SHIFT lv_column_end RIGHT DELETING TRAILING space. - SHIFT lv_column_end LEFT DELETING LEADING space. - SHIFT lv_row RIGHT DELETING TRAILING space. - SHIFT lv_row LEFT DELETING LEADING space. - CONCATENATE lv_column_end lv_row - INTO range_to. - - CONCATENATE range_from range_to INTO lv_merge_range - SEPARATED BY ':'. - APPEND lv_merge_range TO merge_range. - ENDWHILE. -* ENDLOOP. - -* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 1. -* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. -* lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). -* lv_row = <fs_sheet_content>-cell_row. -* SHIFT lv_column_start RIGHT DELETING TRAILING space. -* SHIFT lv_column_start LEFT DELETING LEADING space. -* SHIFT lv_row RIGHT DELETING TRAILING space. -* SHIFT lv_row LEFT DELETING LEADING space. -* CONCATENATE lv_column_start lv_row -* INTO range_from. -* ENDIF. -* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 2. -* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. -* lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). -* SHIFT lv_column_end RIGHT DELETING TRAILING space. -* SHIFT lv_column_end LEFT DELETING LEADING space. -* CONCATENATE lv_column_end lv_row -* INTO range_to. -* ENDIF. - -* IF range_from NE space AND range_to NE space. -* CONCATENATE range_from range_to INTO ep_merge_range -* SEPARATED BY ':'. -* ENDIF. - - endmethod. - - - - method GET_RANGES_ITERATOR. - - eo_iterator = me->ranges->get_iterator( ). - - endmethod. - - - - - method GET_ROW_DIMENSION. - FIELD-SYMBOLS: <fs_row_dimension> LIKE LINE OF row_dimensions. - - READ TABLE me->row_dimensions ASSIGNING <fs_row_dimension> - WITH KEY row = ip_row. - - IF NOT <fs_row_dimension> IS ASSIGNED. - CREATE OBJECT r_row_dimension - EXPORTING - ip_index = ip_row. - APPEND INITIAL LINE TO me->row_dimensions ASSIGNING <fs_row_dimension>. - <fs_row_dimension>-row = ip_row. - <fs_row_dimension>-row_dimension = r_row_dimension. - ELSE. - r_row_dimension = <fs_row_dimension>-row_dimension. - ENDIF. - - endmethod. - - - - method GET_ROW_DIMENSIONS. - r_row_dimension[] = me->row_dimensions[]. - endmethod. - - - - method GET_TABCOLOR. - ev_tabcolor = me->tabcolor. - endmethod. - - - - method GET_TABLES_ITERATOR. - eo_iterator = tables->if_object_collection~get_iterator( ). - endmethod. - - - - method GET_TABLES_SIZE. - ep_size = tables->if_object_collection~size( ). - endmethod. - - - - - method GET_TITLE. - DATA lv_value TYPE string. - IF ip_escaped EQ abap_true. - lv_value = me->title. - ep_title = zcl_excel_common=>escape_string( lv_value ). - ELSE. - ep_title = me->title. - ENDIF. - endmethod. - - - - - - method GET_VALUE_TYPE. - DATA: lo_addit TYPE REF TO cl_abap_elemdescr, - ls_dfies TYPE dfies, - l_function TYPE funcname, - l_value(50) TYPE c. - - ep_value = ip_value. - ep_value_type = cl_abap_typedescr=>typekind_string. " Thats our default if something goes wrong. - - TRY. - lo_addit ?= cl_abap_typedescr=>describe_by_data( ip_value ). - CATCH cx_sy_move_cast_error. - CLEAR lo_addit. - ENDTRY. - IF lo_addit IS BOUND. - lo_addit->get_ddic_field( RECEIVING p_flddescr = ls_dfies - EXCEPTIONS not_found = 1 - no_ddic_type = 2 - OTHERS = 3 ) . - IF sy-subrc = 0. - ep_value_type = ls_dfies-inttype. - - IF ls_dfies-convexit IS NOT INITIAL. -* We need to convert with output conversion function - CONCATENATE 'CONVERSION_EXIT_' ls_dfies-convexit '_OUTPUT' INTO l_function. - SELECT SINGLE funcname INTO l_function - FROM tfdir - WHERE funcname = l_function. - IF sy-subrc = 0. - CALL FUNCTION l_function - EXPORTING - input = ip_value - IMPORTING -* LONG_TEXT = - output = l_value -* SHORT_TEXT = - EXCEPTIONS - OTHERS = 1. - IF sy-subrc <> 0. -* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO -* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. - ELSE. - ep_value = l_value. - ENDIF. - ENDIF. - ENDIF. - ELSE. - ep_value_type = lo_addit->get_data_type_kind( ip_value ). - ENDIF. - ENDIF. - - endmethod. - - - - - - - method IS_CELL_MERGED. - DATA lt_merge_range TYPE string_table. - - FIELD-SYMBOLS <lv_merge_range> LIKE LINE OF lt_merge_range. - - - lt_merge_range = me->get_merge( ). - - LOOP AT lt_merge_range ASSIGNING <lv_merge_range>. - rp_is_merged = zcl_excel_common=>is_cell_in_range( - ip_column = ip_column - ip_row = ip_row - ip_range = <lv_merge_range> ). - IF rp_is_merged = abap_true. - EXIT. - ENDIF. - ENDLOOP. -endmethod. - - - method PRINT_TITLE_SET_RANGE. -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 -*--------------------------------------------------------------------* - - - DATA: lo_range_iterator TYPE REF TO cl_object_collection_iterator, - lo_range TYPE REF TO zcl_excel_range, - lv_repeat_range_sheetname TYPE string, - lv_repeat_range_col TYPE string, - lv_row_char_from TYPE char10, - lv_row_char_to TYPE char10, - lv_repeat_range_row TYPE string, - lv_repeat_range TYPE string. - - -*--------------------------------------------------------------------* -* Get range that represents printarea -* if non-existant, create it -*--------------------------------------------------------------------* - lo_range_iterator = me->get_ranges_iterator( ). - WHILE lo_range_iterator->has_next( ) = abap_true. - - lo_range ?= lo_range_iterator->get_next( ). - IF lo_range->name = zif_excel_sheet_printsettings=>gcv_print_title_name. - EXIT. " Found it - ENDIF. - CLEAR lo_range. - - ENDWHILE. - - - IF me->print_title_col_from IS INITIAL AND - me->print_title_row_from IS INITIAL. -*--------------------------------------------------------------------* -* No print titles are present, -*--------------------------------------------------------------------* - IF lo_range IS BOUND. - me->ranges->remove( lo_range ). - ENDIF. - ELSE. -*--------------------------------------------------------------------* -* Print titles are present, -*--------------------------------------------------------------------* - IF lo_range IS NOT BOUND. - lo_range = me->add_new_range( ). - lo_range->name = zif_excel_sheet_printsettings=>gcv_print_title_name. - ENDIF. - - lv_repeat_range_sheetname = me->get_title( ). - lv_repeat_range_sheetname = zcl_excel_common=>escape_string( lv_repeat_range_sheetname ). - -*--------------------------------------------------------------------* -* Repeat-columns -*--------------------------------------------------------------------* - IF me->print_title_col_from IS NOT INITIAL. - CONCATENATE lv_repeat_range_sheetname - '!$' me->print_title_col_from - ':$' me->print_title_col_to - INTO lv_repeat_range_col. - ENDIF. - -*--------------------------------------------------------------------* -* Repeat-rows -*--------------------------------------------------------------------* - IF me->print_title_row_from IS NOT INITIAL. - lv_row_char_from = me->print_title_row_from. - lv_row_char_to = me->print_title_row_to. - CONCATENATE '!$' lv_row_char_from - ':$' lv_row_char_to - INTO lv_repeat_range_row. - CONDENSE lv_repeat_range_row NO-GAPS. - CONCATENATE lv_repeat_range_sheetname - lv_repeat_range_row - INTO lv_repeat_range_row. - ENDIF. - -*--------------------------------------------------------------------* -* Concatenate repeat-rows and columns -*--------------------------------------------------------------------* - IF lv_repeat_range_col IS INITIAL. - lv_repeat_range = lv_repeat_range_row. - ELSEIF lv_repeat_range_row IS INITIAL. - lv_repeat_range = lv_repeat_range_col. - ELSE. - CONCATENATE lv_repeat_range_col lv_repeat_range_row - INTO lv_repeat_range SEPARATED BY ','. - ENDIF. - - - lo_range->set_range_value( lv_repeat_range ). - ENDIF. - - - - endmethod. - - - - - - - - - - - - method SET_CELL. - - DATA: lv_column TYPE zexcel_cell_column, - ls_sheet_content TYPE zexcel_s_cell_data, - lv_row_alpha TYPE string, - lv_col_alpha TYPE zexcel_cell_column_alpha, - lv_value TYPE zexcel_cell_value, - lv_data_type TYPE zexcel_cell_data_type, - lv_value_type TYPE abap_typekind, - lo_style TYPE REF TO zcl_excel_style, - lv_style_guid TYPE zexcel_cell_style, - lo_addit TYPE REF TO cl_abap_elemdescr, - lo_value TYPE REF TO data, - lo_value_new TYPE REF TO data. - - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, - <fs_numeric> TYPE numeric, - <fs_date> TYPE d, - <fs_time> TYPE t, - <fs_value> TYPE simple. - - IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Please provide the value or formula'. - ENDIF. - -* Begin of change issue #152 - don't touch exisiting style if only value is passed -* lv_style_guid = ip_style. - lv_column = zcl_excel_common=>convert_column2int( ip_column ). - READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH TABLE KEY cell_row = ip_row " Changed to access via table key , Stefan Schmöcker, 2013-08-03 - cell_column = lv_column. - IF sy-subrc = 0. - IF ip_style IS INITIAL. - " If no style is provided as method-parameter and cell is found use cell's current style - lv_style_guid = <fs_sheet_content>-cell_style. - ELSE. - " Style provided as method-parameter --> use this - lv_style_guid = ip_style. - ENDIF. - ELSE. - " No cell found --> use supplied style even if empty - lv_style_guid = ip_style. - ENDIF. -* End of change issue #152 - don't touch exisiting style if only value is passed - - IF ip_value IS SUPPLIED. - "if data type is passed just write the value. Otherwise map abap type to excel and perform conversion - "IP_DATA_TYPE is passed by excel reader so source types are preserved -*First we get reference into local var. - CREATE DATA lo_value LIKE ip_value. - ASSIGN lo_value->* TO <fs_value>. - <fs_value> = ip_value. - IF ip_data_type IS SUPPLIED. - IF ip_abap_type IS NOT SUPPLIED. - get_value_type( EXPORTING ip_value = ip_value - IMPORTING ep_value = <fs_value> ) . - ENDIF. - lv_value = <fs_value>. - lv_data_type = ip_data_type. - ELSE. - IF ip_abap_type IS SUPPLIED. - lv_value_type = ip_abap_type. - ELSE. - get_value_type( EXPORTING ip_value = ip_value - IMPORTING ep_value = <fs_value> - ep_value_type = lv_value_type ). - ENDIF. - CASE lv_value_type. - WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2. - lo_addit = cl_abap_elemdescr=>get_i( ). - CREATE DATA lo_value_new TYPE HANDLE lo_addit. - ASSIGN lo_value_new->* TO <fs_numeric>. - IF sy-subrc = 0. - <fs_numeric> = <fs_value>. - lv_value = zcl_excel_common=>number_to_excel_string( ip_value = <fs_numeric> ). - ENDIF. - - WHEN cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_packed. - lo_addit = cl_abap_elemdescr=>get_f( ). - CREATE DATA lo_value_new TYPE HANDLE lo_addit. - ASSIGN lo_value_new->* TO <fs_numeric>. - IF sy-subrc = 0. - <fs_numeric> = <fs_value>. - lv_value = zcl_excel_common=>number_to_excel_string( ip_value = <fs_numeric> ). - ENDIF. - - WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_string OR cl_abap_typedescr=>typekind_num OR - cl_abap_typedescr=>typekind_hex. - lv_value = <fs_value>. - lv_data_type = 's'. - - WHEN cl_abap_typedescr=>typekind_date. - lo_addit = cl_abap_elemdescr=>get_d( ). - CREATE DATA lo_value_new TYPE HANDLE lo_addit. - ASSIGN lo_value_new->* TO <fs_date>. - IF sy-subrc = 0. - <fs_date> = <fs_value>. - lv_value = zcl_excel_common=>date_to_excel_string( ip_value = <fs_date> ) . - ENDIF. -* Begin of change issue #152 - don't touch exisiting style if only value is passed -* Moved to end of routine - apply date-format even if other styleinformation is passed -* IF ip_style IS NOT SUPPLIED. "get default date format in case parameter is initial -* lo_style = excel->add_new_style( ). -* lo_style->number_format->format_code = get_default_excel_date_format( ). -* lv_style_guid = lo_style->get_guid( ). -* ENDIF. -* End of change issue #152 - don't touch exisiting style if only value is passed - - WHEN cl_abap_typedescr=>typekind_time. - lo_addit = cl_abap_elemdescr=>get_t( ). - CREATE DATA lo_value_new TYPE HANDLE lo_addit. - ASSIGN lo_value_new->* TO <fs_time>. - IF sy-subrc = 0. - <fs_time> = <fs_value>. - lv_value = zcl_excel_common=>time_to_excel_string( ip_value = <fs_time> ). - ENDIF. -* Begin of change issue #152 - don't touch exisiting style if only value is passed -* Moved to end of routine - apply time-format even if other styleinformation is passed -* IF ip_style IS NOT SUPPLIED. "get default time format for user in case parameter is initial -* lo_style = excel->add_new_style( ). -* lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_date_time6. -* lv_style_guid = lo_style->get_guid( ). -* ENDIF. -* End of change issue #152 - don't touch exisiting style if only value is passed - - WHEN OTHERS. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Invalid data type of input value'. - ENDCASE. - ENDIF. - - ENDIF. - - IF ip_hyperlink IS BOUND. - ip_hyperlink->set_cell_reference( ip_column = ip_column - ip_row = ip_row ). - me->hyperlinks->add( ip_hyperlink ). - ENDIF. - -* Begin of change issue #152 - don't touch exisiting style if only value is passed -* Read table moved up, so that current style may be evaluated -* lv_column = zcl_excel_common=>convert_column2int( ip_column ). - -* READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row -* cell_column = lv_column. -* -* IF sy-subrc EQ 0. - IF <fs_sheet_content> IS ASSIGNED. -* End of change issue #152 - don't touch exisiting style if only value is passed - <fs_sheet_content>-cell_value = lv_value. - <fs_sheet_content>-cell_formula = ip_formula. - <fs_sheet_content>-cell_style = lv_style_guid. - <fs_sheet_content>-data_type = lv_data_type. - ELSE. - ls_sheet_content-cell_row = ip_row. - ls_sheet_content-cell_column = lv_column. - ls_sheet_content-cell_value = lv_value. - ls_sheet_content-cell_formula = ip_formula. - ls_sheet_content-cell_style = lv_style_guid. - ls_sheet_content-data_type = lv_data_type. - lv_row_alpha = ip_row. -* SHIFT lv_row_alpha RIGHT DELETING TRAILING space."del #152 - replaced with condense - should be faster -* SHIFT lv_row_alpha LEFT DELETING LEADING space. "del #152 - replaced with condense - should be faster - CONDENSE lv_row_alpha NO-GAPS. "ins #152 - replaced 2 shifts - should be faster - lv_col_alpha = zcl_excel_common=>convert_column2alpha( ip_column ). " issue #155 - less restrictive typing for ip_column - CONCATENATE lv_col_alpha lv_row_alpha INTO ls_sheet_content-cell_coords. " issue #155 - less restrictive typing for ip_column - INSERT ls_sheet_content INTO TABLE sheet_content ASSIGNING <fs_sheet_content>. "ins #152 - Now <fs_sheet_content> always holds the data -* APPEND ls_sheet_content TO sheet_content. -* SORT sheet_content BY cell_row cell_column. - " me->update_dimension_range( ). - - ENDIF. - -* Begin of change issue #152 - don't touch exisiting style if only value is passed -* For Date- or Timefields change the formatcode if nothing is set yet -* Enhancement option: Check if existing formatcode is a date/ or timeformat -* If not, use default - DATA: lo_format_code_datetime TYPE zexcel_number_format. - DATA: stylemapping TYPE zexcel_s_stylemapping. - CASE lv_value_type. - WHEN cl_abap_typedescr=>typekind_date. - TRY. - stylemapping = me->excel->get_style_to_guid( <fs_sheet_content>-cell_style ). - CATCH zcx_excel . - ENDTRY. - IF stylemapping-complete_stylex-number_format-format_code IS INITIAL OR - stylemapping-complete_style-number_format-format_code IS INITIAL. - lo_format_code_datetime = zcl_excel_style_number_format=>c_format_date_std. - ELSE. - lo_format_code_datetime = stylemapping-complete_style-number_format-format_code. - ENDIF. - me->change_cell_style( ip_column = ip_column - ip_row = ip_row - ip_number_format_format_code = lo_format_code_datetime ). - - WHEN cl_abap_typedescr=>typekind_time. - TRY. - stylemapping = me->excel->get_style_to_guid( <fs_sheet_content>-cell_style ). - CATCH zcx_excel . - ENDTRY. - IF stylemapping-complete_stylex-number_format-format_code IS INITIAL OR - stylemapping-complete_style-number_format-format_code IS INITIAL. - lo_format_code_datetime = zcl_excel_style_number_format=>c_format_date_time6. - ELSE. - lo_format_code_datetime = stylemapping-complete_style-number_format-format_code. - ENDIF. - me->change_cell_style( ip_column = ip_column - ip_row = ip_row - ip_number_format_format_code = lo_format_code_datetime ). - - ENDCASE. -* End of change issue #152 - don't touch exisiting style if only value is passed - -* Fix issue #162 - lv_value = ip_value. - IF lv_value CS cl_abap_char_utilities=>cr_lf. - me->change_cell_style( ip_column = ip_column - ip_row = ip_row - ip_alignment_wraptext = abap_true ). - ENDIF. -* End of Fix issue #162 - - endmethod. - - - - - - - method SET_CELL_FORMULA. - DATA: - lv_column TYPE zexcel_cell_column, - ls_sheet_content LIKE LINE OF me->sheet_content. - - FIELD-SYMBOLS: - <sheet_content> LIKE LINE OF me->sheet_content. - -*--------------------------------------------------------------------* -* Get cell to set formula into -*--------------------------------------------------------------------* - lv_column = zcl_excel_common=>convert_column2int( ip_column ). - READ TABLE me->sheet_content ASSIGNING <sheet_content> WITH TABLE KEY cell_row = ip_row - cell_column = lv_column. - IF sy-subrc <> 0. " Create new entry in sheet_content if necessary - CHECK ip_formula IS INITIAL. " no need to create new entry in sheet_content when no formula is passed - ls_sheet_content-cell_row = ip_row. - ls_sheet_content-cell_column = lv_column. - INSERT ls_sheet_content INTO TABLE me->sheet_content ASSIGNING <sheet_content>. - ENDIF. - -*--------------------------------------------------------------------* -* Fieldsymbol now holds the relevant cell -*--------------------------------------------------------------------* - <sheet_content>-cell_formula = ip_formula. - - - endmethod. - - - - - - - method SET_CELL_STYLE. - - DATA: lv_column TYPE zexcel_cell_column, - ls_sheet_content TYPE zexcel_s_cell_data, - lv_row_alpha TYPE string, - lo_style TYPE REF TO zcl_excel_style, - lv_style_guid TYPE zexcel_cell_style. - - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. - - lv_style_guid = ip_style. - - lv_column = zcl_excel_common=>convert_column2int( ip_column ). - - READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row - cell_column = lv_column. - - IF sy-subrc EQ 0. - <fs_sheet_content>-cell_style = lv_style_guid. - ELSE. - set_cell( ip_column = ip_column ip_row = ip_row ip_value = '' ip_style = ip_style ). - ENDIF. - - endmethod. - - - - - - - method SET_COLUMN_WIDTH. - DATA: column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - DATA: width TYPE float. - - column_dimension = me->get_column_dimension( ip_column ). - -* if a fix size is supplied use this - IF ip_width_fix IS SUPPLIED. - TRY. - width = ip_width_fix. - IF width <= 0. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Please supply a positive number as column-width'. - ENDIF. - column_dimension->set_width( width ). - EXIT. - CATCH cx_sy_conversion_no_number. -* Strange stuff passed --> raise error - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Unable to interpret supplied input as number'. - ENDTRY. - ENDIF. - -* If we get down to here, we have to use whatever is found in autosize. - column_dimension->set_auto_size( ip_width_autosize ). - - - endmethod. - - - - - method SET_DEFAULT_EXCEL_DATE_FORMAT. - - IF ip_default_excel_date_format IS INITIAL. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Default date format cannot be blank'. - ENDIF. - - default_excel_date_format = ip_default_excel_date_format. - endmethod. - - - - - - - - method SET_MERGE. - - DATA: lv_column_start TYPE zexcel_cell_column, - lv_column_end TYPE zexcel_cell_column, - ls_sheet_content TYPE zexcel_s_cell_data, - lv_row_alpha TYPE string. - - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. - - lv_column_start = zcl_excel_common=>convert_column2int( ip_column_start ). - lv_column_end = zcl_excel_common=>convert_column2int( ip_column_end ). - - ls_sheet_content-cell_row = ip_row. - ls_sheet_content-cell_column = lv_column_start. - lv_row_alpha = ip_row. - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE ip_column_start lv_row_alpha INTO ls_sheet_content-cell_coords. - INSERT ls_sheet_content INTO TABLE sheet_content_merge. - - ls_sheet_content-cell_column = lv_column_end. - IF ip_row_to IS SUPPLIED. - ls_sheet_content-cell_row = ip_row_to. - lv_row_alpha = ip_row_to. - ELSE. - lv_row_alpha = ip_row. - ls_sheet_content-cell_row = ip_row. - ENDIF. - - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE ip_column_end lv_row_alpha INTO ls_sheet_content-cell_coords. - INSERT ls_sheet_content INTO TABLE sheet_content_merge. - - endmethod. - - - - method SET_PRINT_GRIDLINES. - me->print_gridlines = i_print_gridlines. - endmethod. - - - - - - method SET_ROW_HEIGHT. - DATA: row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. - DATA: height TYPE float. - - row_dimension = me->get_row_dimension( ip_row ). - -* if a fix size is supplied use this - TRY. - height = ip_height_fix. - IF height <= 0. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Please supply a positive number as row-height'. - ENDIF. - row_dimension->set_row_height( height ). - EXIT. - CATCH cx_sy_conversion_no_number. -* Strange stuff passed --> raise error - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Unable to interpret supplied input as number'. - ENDTRY. - - - - endmethod. - - - - method SET_SHOW_GRIDLINES. - me->show_gridlines = i_show_gridlines. - endmethod. - - - - method SET_SHOW_ROWCOLHEADERS. - me->show_rowcolheaders = i_show_rowcolheaders. - endmethod. - - - - method SET_TABCOLOR. - me->tabcolor = iv_tabcolor. - endmethod. - - - - - - - - - - - - method SET_TABLE. - - DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, - lr_data TYPE REF TO data, - ls_newline TYPE REF TO data, - ls_header TYPE x030l, - lt_dfies TYPE ddfields, - lv_row_header TYPE zexcel_cell_row VALUE 2, - lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', - lv_row_int TYPE zexcel_cell_row, - lv_column_int TYPE zexcel_cell_column, - lv_column_alpha TYPE zexcel_cell_column_alpha, - lv_cell_value TYPE zexcel_cell_value. - - - FIELD-SYMBOLS: <fs_table_line> TYPE ANY, - <fs_fldval> TYPE ANY, - <fs_dfies> TYPE dfies, - <fs_cell_value> TYPE zexcel_cell_value. - - lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). - lv_row_int = ip_top_left_row. - - CREATE DATA lr_data LIKE LINE OF ip_table. - - lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). - - ls_header = lo_tabdescr->get_ddic_header( ). - - lt_dfies = lo_tabdescr->get_ddic_field_list( ). - -* It is better to loop column by column - LOOP AT lt_dfies ASSIGNING <fs_dfies>. - lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). - - IF ip_no_header = abap_false. - " First of all write column header - lv_cell_value = <fs_dfies>-scrtext_m. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_value = lv_cell_value - ip_style = ip_hdr_style ). - IF ip_transpose = abap_true. - ADD 1 TO lv_column_int. - ELSE. - ADD 1 TO lv_row_int. - ENDIF. - ENDIF. - - LOOP AT ip_table ASSIGNING <fs_table_line>. - lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). - ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. - MOVE <fs_fldval> TO lv_cell_value. - me->set_cell( ip_column = lv_column_alpha - ip_row = lv_row_int - ip_value = <fs_fldval> "lv_cell_value - ip_style = ip_body_style ). - IF ip_transpose = abap_true. - ADD 1 TO lv_column_int. - ELSE. - ADD 1 TO lv_row_int. - ENDIF. - ENDLOOP. - IF ip_transpose = abap_true. - lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). - ADD 1 TO lv_row_int. - ELSE. - lv_row_int = ip_top_left_row. - ADD 1 TO lv_column_int. - ENDIF. - ENDLOOP. - - endmethod. - - - - - method SET_TITLE. -*--------------------------------------------------------------------* -* ToDos: -* 2do§1 The current coding for replacing a named ranges name -* after renaming a sheet should be checked if it is -* really working if sheetname should be escaped -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (wip ) 2012-12-08 -* - ... -* changes: aligning code -* message made to support multilinguality -*--------------------------------------------------------------------* -* issue#243 - ' is not allowed as first character in sheet title -* - Stefan Schmöcker, 2012-12-02 -* changes: added additional check for ' as first character -*--------------------------------------------------------------------* - DATA: lo_worksheets_iterator TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - errormessage TYPE string, - lv_rangesheetname_old TYPE string, - lv_rangesheetname_new TYPE string, - lo_ranges_iterator TYPE REF TO cl_object_collection_iterator, - lo_range TYPE REF TO zcl_excel_range, - lv_range_value TYPE zexcel_range_value, - lv_errormessage TYPE string. " Can't pass '...'(abc) to exception-class - - -*--------------------------------------------------------------------* -* Check whether title consists only of allowed characters -* Illegal characters are: / \ [ ] * ? : --> http://msdn.microsoft.com/en-us/library/ff837411.aspx -* Illegal characters not in documentation: ' as first character -*--------------------------------------------------------------------* - IF ip_title CA '/\[]*?:'. - lv_errormessage = 'Found illegal character in sheetname. List of forbidden characters: /\[]*?:'(402). - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - IF ip_title IS NOT INITIAL AND ip_title(1) = `'`. - lv_errormessage = 'Sheetname may not start with &'(403). " & used instead of ' to allow fallbacklanguage - REPLACE '&' IN lv_errormessage WITH `'`. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = lv_errormessage. - ENDIF. - - -*--------------------------------------------------------------------* -* Check whether title is unique in workbook -*--------------------------------------------------------------------* - lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). - WHILE lo_worksheets_iterator->has_next( ) = 'X'. - - lo_worksheet ?= lo_worksheets_iterator->get_next( ). - CHECK me->guid <> lo_worksheet->get_guid( ). " Don't check against itself - IF ip_title = lo_worksheet->get_title( ). " Not unique --> raise exception - errormessage = 'Duplicate sheetname &'. - REPLACE '&' IN errormessage WITH ip_title. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = errormessage. - ENDIF. - - ENDWHILE. - -*--------------------------------------------------------------------* -* Remember old sheetname and rename sheet to desired name -*--------------------------------------------------------------------* - CONCATENATE me->title '!' INTO lv_rangesheetname_old. - me->title = ip_title. - -*--------------------------------------------------------------------* -* After changing this worksheet's title we have to adjust -* all ranges that are referring to this worksheet. -*--------------------------------------------------------------------* -* 2do§1 - Check if the following quickfix is solid -* I fear it isn't - but this implementation is better then -* nothing at all since it handles a supposed majority of cases -*--------------------------------------------------------------------* - CONCATENATE me->title '!' INTO lv_rangesheetname_new. - - lo_ranges_iterator = me->excel->get_ranges_iterator( ). - WHILE lo_ranges_iterator->has_next( ) = 'X'. - - lo_range ?= lo_ranges_iterator->get_next( ). - lv_range_value = lo_range->get_value( ). - REPLACE ALL OCCURRENCES OF lv_rangesheetname_old IN lv_range_value WITH lv_rangesheetname_new. - IF sy-subrc = 0. - lo_range->set_range_value( lv_range_value ). - ENDIF. - - ENDWHILE. - - - endmethod. - - - - method UPDATE_DIMENSION_RANGE. - - DATA: ls_sheet_content TYPE zexcel_s_cell_data, - lt_sheet_content TYPE zexcel_t_cell_data_unsorted, - lv_row_alpha TYPE string, - lv_column_alpha TYPE zexcel_cell_column_alpha. - - CHECK sheet_content IS NOT INITIAL. - -* update dimension range - lt_sheet_content = sheet_content. - "upper left corner - SORT lt_sheet_content BY cell_row. - READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. - upper_cell-cell_row = ls_sheet_content-cell_row. - SORT lt_sheet_content BY cell_column. - READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. - upper_cell-cell_column = ls_sheet_content-cell_column. - - lv_row_alpha = upper_cell-cell_row. - lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. - - "bottom right corner - SORT lt_sheet_content BY cell_row DESCENDING. - READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. - lower_cell-cell_row = ls_sheet_content-cell_row. - SORT lt_sheet_content BY cell_column DESCENDING. - READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. - lower_cell-cell_column = ls_sheet_content-cell_column. - - lv_row_alpha = lower_cell-cell_row. - lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - method ADD. - - worksheets->add( ip_worksheet ). - - endmethod. - - - method CLEAR. - - worksheets->clear( ). - - endmethod. - - - method CONSTRUCTOR. - - CREATE OBJECT worksheets. - - endmethod. - - - - - method GET. - - DATA lv_index TYPE i. - lv_index = ip_index. - eo_worksheet ?= worksheets->if_object_collection~get( lv_index ). - - endmethod. - - - - method GET_ITERATOR. - - eo_iterator ?= worksheets->if_object_collection~get_iterator( ). - - endmethod. - - - - method IS_EMPTY. - - is_empty = worksheets->if_object_collection~is_empty( ). - - endmethod. - - - - method REMOVE. - - worksheets->remove( ip_worksheet ). - - endmethod. - - - - method SIZE. - - ep_size = worksheets->if_object_collection~size( ). - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - - - - - - - method CONSTRUCTOR. - me->column_index = zcl_excel_common=>convert_column2int( ip_index ). - me->width = -1. - me->auto_size = abap_false. - me->visible = abap_true. - me->outline_level = 0. - me->collapsed = abap_false. - me->excel = ip_excel. "ins issue #157 - Allow Style for columns - me->worksheet = ip_worksheet. "ins issue #157 - Allow Style for columns - - " set default index to cellXf - me->xf_index = 0. - - endmethod. - - - - method GET_AUTO_SIZE. - r_auto_size = me->auto_size. - endmethod. - - - - method GET_COLLAPSED. - r_Collapsed = me->Collapsed. - endmethod. - - - - method GET_COLUMN_INDEX. - r_column_index = me->column_index. - endmethod. - - - - - method GET_COLUMN_STYLE_GUID. - IF me->style_guid IS NOT INITIAL. - ep_style_guid = me->style_guid. - ELSE. - ep_style_guid = me->worksheet->zif_excel_sheet_properties~get_style( ). - ENDIF. - endmethod. - - - - method GET_OUTLINE_LEVEL. - r_outline_level = me->outline_level. - endmethod. - - - - method GET_VISIBLE. - r_Visible = me->Visible. - endmethod. - - - - method GET_WIDTH. - r_WIDTH = me->WIDTH. - endmethod. - - - - method GET_XF_INDEX. - r_xf_index = me->xf_index. - endmethod. - - - - - method SET_AUTO_SIZE. - me->auto_size = ip_auto_size. - r_worksheet_columndime = me. - endmethod. - - - - - method SET_COLLAPSED. - me->Collapsed = ip_Collapsed. - r_worksheet_columndime = me. - endmethod. - - - - - method SET_COLUMN_INDEX. - me->column_index = zcl_excel_common=>convert_column2int( ip_index ). - r_worksheet_columndime = me. - endmethod. - - - - - method SET_COLUMN_STYLE_BY_GUID. - DATA: stylemapping TYPE zexcel_s_stylemapping. - - IF me->excel IS NOT BOUND. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Internal error - reference to ZCL_EXCEL not bound'. - ENDIF. - TRY. - stylemapping = me->excel->get_style_to_guid( ip_style_guid ). - me->style_guid = stylemapping-guid. - - CATCH zcx_excel . - EXIT. " leave as is in case of error - ENDTRY. - - endmethod. - - - - method SET_OUTLINE_LEVEL. - me->outline_level = ip_outline_level. - endmethod. - - - - - method SET_VISIBLE. - me->Visible = ip_Visible. - r_worksheet_columndime = me. - endmethod. - - - - - - method SET_WIDTH. - TRY. - me->width = ip_width. - r_worksheet_columndime = me. - CATCH cx_sy_conversion_no_number. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Unable to interpret width as number'. - ENDTRY. - endmethod. - - - - - method SET_XF_INDEX. - me->XF_INDEX = ip_XF_INDEX. - r_worksheet_columndime = me. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - - - - method CONSTRUCTOR. - " Initialise values - me->row_index = ip_index. - me->row_height = -1. - me->visible = abap_true. - me->outline_level = 0. - me->collapsed = abap_false. - - " set row dimension as unformatted by default - me->xf_index = 0. - endmethod. - - - - method GET_COLLAPSED. - r_collapsed = me->collapsed. - endmethod. - - - - method GET_OUTLINE_LEVEL. - r_outline_level = me->outline_level. - endmethod. - - - - method GET_ROW_HEIGHT. - r_row_height = me->row_height. - endmethod. - - - - method GET_ROW_INDEX. - r_row_index = me->row_index. - endmethod. - - - - method GET_VISIBLE. - r_visible = me->visible. - endmethod. - - - - method GET_XF_INDEX. - r_xf_index = me->xf_index. - endmethod. - - - - method SET_COLLAPSED. - me->collapsed = ip_collapsed. - endmethod. - - - - - method SET_OUTLINE_LEVEL. - IF ip_outline_level < 0 - OR ip_outline_level > 7. - - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Outline level must range between 0 and 7.'. - - ENDIF. - me->outline_level = ip_outline_level. - endmethod. - - - - - method SET_ROW_HEIGHT. - TRY. - me->row_height = ip_row_height. - CATCH cx_sy_conversion_no_number. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Unable to interpret ip_row_height as number'. - ENDTRY. - endmethod. - - - - method SET_ROW_INDEX. - me->row_index = ip_index. - endmethod. - - - - method SET_VISIBLE. - me->visible = ip_visible. - endmethod. - - - - method SET_XF_INDEX. - me->XF_INDEX = ip_XF_INDEX. - endmethod. - - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - - - - - - - - - - - method ZIF_EXCEL_WRITER~WRITE_FILE. - me->excel = io_excel. - - ep_file = me->create( ). - endmethod. - - - - method CREATE. - -* Office 2007 file format is a cab of several xml files with extension .xlsx - - DATA: lo_zip TYPE REF TO cl_abap_zip, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_active_worksheet TYPE REF TO zcl_excel_worksheet, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_nested_iterator TYPE REF TO cl_object_collection_iterator, - lo_table TYPE REF TO zcl_excel_table, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_drawings TYPE REF TO zcl_excel_drawings. - - DATA: lv_content TYPE xstring, - lv_active TYPE flag, - lv_xl_sheet TYPE string, - lv_xl_sheet_rels TYPE string, - lv_xl_drawing TYPE string, - lv_xl_drawing_rels TYPE string, - lv_syindex TYPE string, - lv_value TYPE string, - lv_drawing_index TYPE i. - -********************************************************************** -* Start of insertion # issue 139 - Dateretention of cellstyles - me->excel->add_static_styles( ). -* End of insertion # issue 139 - Dateretention of cellstyles - -********************************************************************** -* STEP 1: Create archive object file (ZIP) - CREATE OBJECT lo_zip. - -********************************************************************** -* STEP 2: Add [Content_Types].xml to zip - lv_content = me->create_content_types( ). - lo_zip->add( name = me->c_content_types - content = lv_content ). - -********************************************************************** -* STEP 3: Add _rels/.rels to zip - lv_content = me->create_relationships( ). - lo_zip->add( name = me->c_relationships - content = lv_content ). - -********************************************************************** -* STEP 4: Add docProps/app.xml to zip - lv_content = me->create_docprops_app( ). - lo_zip->add( name = me->c_docprops_app - content = lv_content ). - -********************************************************************** -* STEP 5: Add docProps/core.xml to zip - lv_content = me->create_docprops_core( ). - lo_zip->add( name = me->c_docprops_core - content = lv_content ). - -********************************************************************** -* STEP 6: Add xl/_rels/workbook.xml.rels to zip - lv_content = me->create_xl_relationships( ). - lo_zip->add( name = me->c_xl_relationships - content = lv_content ). - -********************************************************************** -* STEP 6: Add xl/_rels/workbook.xml.rels to zip - lv_content = me->create_xl_theme( ). - lo_zip->add( name = me->c_xl_theme - content = lv_content ). - -********************************************************************** -* STEP 7: Add xl/workbook.xml to zip - lv_content = me->create_xl_workbook( ). - lo_zip->add( name = me->c_xl_workbook - content = lv_content ). - -********************************************************************** -* STEP 8: Add xl/workbook.xml to zip -* lv_content = me->create_xl_styles_static( ). - lv_content = me->create_xl_styles( ). - lo_zip->add( name = me->c_xl_styles - content = lv_content ). - -********************************************************************** -* STEP 9: Add sharedStrings.xml to zip - lv_content = me->create_xl_sharedstrings( ). - lo_zip->add( name = me->c_xl_sharedstrings - content = lv_content ). - -********************************************************************** -* STEP 10: Add sheet#.xml and drawing#.xml to zip - lo_iterator = me->excel->get_worksheets_iterator( ). - lo_active_worksheet = me->excel->get_active_worksheet( ). - lv_drawing_index = 1. - - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). - lv_active = abap_true. - ELSE. - lv_active = abap_false. - ENDIF. - lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet - iv_active = lv_active ). - lv_xl_sheet = me->c_xl_sheet. - MOVE sy-index TO lv_syindex. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. - lo_zip->add( name = lv_xl_sheet - content = lv_content ). - - lv_xl_sheet_rels = me->c_xl_sheet_rels. - lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet - iv_drawing_index = lv_drawing_index ). - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. - lo_zip->add( name = lv_xl_sheet_rels - content = lv_content ). - - lo_nested_iterator = lo_worksheet->get_tables_iterator( ). - - WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). - lv_content = me->create_xl_table( lo_table ). - - lv_value = lo_table->get_name( ). - CONCATENATE 'xl/tables/' lv_value '.xml' INTO lv_value. - lo_zip->add( name = lv_value - content = lv_content ). - ENDWHILE. - -* Add drawings ********************************** - lo_drawings = lo_worksheet->get_drawings( ). - IF lo_drawings->is_empty( ) = abap_false. - MOVE lv_drawing_index TO lv_syindex. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - - lv_content = me->create_xl_drawings( lo_worksheet ). - lv_xl_drawing = me->c_xl_drawings. - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_syindex. - lo_zip->add( name = lv_xl_drawing - content = lv_content ). - - lv_content = me->create_xl_drawings_rels( lo_worksheet ). - lv_xl_drawing_rels = me->c_xl_drawings_rels. - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_syindex. - lo_zip->add( name = lv_xl_drawing_rels - content = lv_content ). - ADD 1 TO lv_drawing_index. - ENDIF. - - ENDWHILE. - -********************************************************************** -* STEP 11: Add media - lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lv_content = lo_drawing->get_media( ). - lv_value = lo_drawing->get_media_name( ). - CONCATENATE 'xl/media/' lv_value INTO lv_value. - lo_zip->add( name = lv_value - content = lv_content ). - ENDWHILE. - -********************************************************************** -* STEP 12: Add charts - lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lv_content = lo_drawing->get_media( ). - - "-------------Added by Alessandro Iannacci - Only if template exist - IF lv_content IS NOT INITIAL AND me->excel->use_template EQ abap_true. - lv_value = lo_drawing->get_media_name( ). - CONCATENATE 'xl/charts/' lv_value INTO lv_value. - lo_zip->add( name = lv_value - content = lv_content ). - ELSE. "ADD CUSTOM CHART!!!! - lv_content = me->create_xl_charts( lo_drawing ). - lv_value = lo_drawing->get_media_name( ). - CONCATENATE 'xl/charts/' lv_value INTO lv_value. - lo_zip->add( name = lv_value - content = lv_content ). - ENDIF. - "------------------------------------------------- - ENDWHILE. - -********************************************************************** -* STEP 12: Create the final zip - ep_excel = lo_zip->save( ). - - endmethod. - - - - method CREATE_CONTENT_TYPES. - - -** Constant node name - DATA: lc_xml_node_types TYPE string VALUE 'Types', - lc_xml_node_override TYPE string VALUE 'Override', - lc_xml_node_default TYPE string VALUE 'Default', - " Node attributes - lc_xml_attr_partname TYPE string VALUE 'PartName', - lc_xml_attr_extension TYPE string VALUE 'Extension', - lc_xml_attr_contenttype TYPE string VALUE 'ContentType', - " Node namespace - lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types', - " Node extension - lc_xml_node_rels_ext TYPE string VALUE 'rels', - lc_xml_node_xml_ext TYPE string VALUE 'xml', - " Node partnumber - lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml', - lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml', - lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', - lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml', - lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml', - lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml', - lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml', - lc_xml_node_chart_pn TYPE string VALUE '/xl/charts/chart#.xml', - " Node contentType - lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml', - lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml', - lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml', - lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml', - lc_xml_node_xml_ct TYPE string VALUE 'application/xml', - lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml', - lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml', - lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml', - lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml', - lc_xml_node_table_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml', - lc_xml_node_drawings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawing+xml', - lc_xml_node_chart_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_nested_iterator TYPE REF TO cl_object_collection_iterator, - lo_table TYPE REF TO zcl_excel_table. - - DATA: lv_worksheets_num TYPE i, - lv_worksheets_numc TYPE numc3, - lv_xml_node_worksheet_pn TYPE string, - lv_xml_size TYPE i, - lv_value TYPE string, - lv_drawing_index TYPE i VALUE 1, - lv_index_str TYPE string. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'UTF-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node types - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_types_ns ). - -********************************************************************** -* STEP 4: Create subnodes - - " rels node - lo_element = lo_document->create_simple_element( name = lc_xml_node_default - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_extension - value = lc_xml_node_rels_ext ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_rels_ct ). - lo_element_root->append_child( new_child = lo_element ). - - " extension node - lo_element = lo_document->create_simple_element( name = lc_xml_node_default - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_extension - value = lc_xml_node_xml_ext ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_xml_ct ). - lo_element_root->append_child( new_child = lo_element ). - - " Theme node - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lc_xml_node_theme_pn ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_theme_ct ). - lo_element_root->append_child( new_child = lo_element ). - - " Styles node - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lc_xml_node_styles_pn ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_styles_ct ). - lo_element_root->append_child( new_child = lo_element ). - - " Workbook node - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lc_xml_node_workb_pn ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_workb_ct ). - lo_element_root->append_child( new_child = lo_element ). - - " Properties node - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lc_xml_node_props_pn ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_props_ct ). - lo_element_root->append_child( new_child = lo_element ). - - " Worksheet node - lv_worksheets_num = excel->get_worksheets_size( ). - DO lv_worksheets_num TIMES. - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - - MOVE sy-index TO lv_worksheets_numc. - SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'. - lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc. - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lv_xml_node_worksheet_pn ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_worksheet_ct ). - lo_element_root->append_child( new_child = lo_element ). - ENDDO. - - lo_iterator = me->excel->get_worksheets_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lo_nested_iterator = lo_worksheet->get_tables_iterator( ). - - WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). - - lv_value = lo_table->get_name( ). - CONCATENATE '/xl/tables/' lv_value '.xml' INTO lv_value. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lv_value ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_table_ct ). - lo_element_root->append_child( new_child = lo_element ). - ENDWHILE. - - " Drawings - DATA: lo_drawings TYPE REF TO zcl_excel_drawings. - - lo_drawings = lo_worksheet->get_drawings( ). - IF lo_drawings->is_empty( ) = abap_false. - lv_index_str = lv_drawing_index. - CONDENSE lv_index_str NO-GAPS. - CONCATENATE '/' me->c_xl_drawings INTO lv_value. - REPLACE '#' WITH lv_index_str INTO lv_value. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lv_value ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_drawings_ct ). - lo_element_root->append_child( new_child = lo_element ). - - ADD 1 TO lv_drawing_index. - ENDIF. - ENDWHILE. - - " media mimes - DATA: lo_drawing TYPE REF TO zcl_excel_drawing, - lt_media_type TYPE TABLE OF mimetypes-extension, - lv_media_type TYPE mimetypes-extension, - lv_mime_type TYPE mimetypes-type. - - lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) = abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lv_media_type = lo_drawing->get_media_type( ). - COLLECT lv_media_type INTO lt_media_type. - ENDWHILE. - - LOOP AT lt_media_type INTO lv_media_type. - CALL FUNCTION 'SDOK_MIMETYPE_GET' - EXPORTING - extension = lv_media_type - IMPORTING - mimetype = lv_mime_type. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_default - parent = lo_document ). - lv_value = lv_media_type. - lo_element->set_attribute_ns( name = lc_xml_attr_extension - value = lv_value ). - lv_value = lv_mime_type. - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDLOOP. - - " Charts - lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) = abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lv_index_str = lo_drawing->get_index( ). - CONDENSE lv_index_str. - lv_value = lc_xml_node_chart_pn. - REPLACE ALL OCCURRENCES OF '#' IN lv_value WITH lv_index_str. - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lv_value ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_chart_ct ). - lo_element_root->append_child( new_child = lo_element ). - ENDWHILE. - - " Strings node - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lc_xml_node_strings_pn ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_strings_ct ). - lo_element_root->append_child( new_child = lo_element ). - - " Strings node - lo_element = lo_document->create_simple_element( name = lc_xml_node_override - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_partname - value = lc_xml_node_core_pn ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_core_ct ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - method CREATE_DOCPROPS_APP. - - -** Constant node name - DATA: lc_xml_node_properties TYPE string VALUE 'Properties', - lc_xml_node_application TYPE string VALUE 'Application', - lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity', - lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop', - lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs', - lc_xml_node_vector TYPE string VALUE 'vector', - lc_xml_node_variant TYPE string VALUE 'variant', - lc_xml_node_lpstr TYPE string VALUE 'lpstr', - lc_xml_node_i4 TYPE string VALUE 'i4', - lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts', - lc_xml_node_company TYPE string VALUE 'Company', - lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate', - lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc', - lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged', - lc_xml_node_appversion TYPE string VALUE 'AppVersion', - " Namespace prefix - lc_vt_ns TYPE string VALUE 'vt', - lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties', - lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', - " Node attributes - lc_xml_attr_size TYPE string VALUE 'size', - lc_xml_attr_basetype TYPE string VALUE 'baseType'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_sub_element_vector TYPE REF TO if_ixml_element, - lo_sub_element_variant TYPE REF TO if_ixml_element, - lo_sub_element_lpstr TYPE REF TO if_ixml_element, - lo_sub_element_i4 TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - - DATA: lv_value TYPE string. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node properties - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_props_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:vt' - value = lc_xml_node_props_vt_ns ). - -********************************************************************** -* STEP 4: Create subnodes - " Application - lo_element = lo_document->create_simple_element( name = lc_xml_node_application - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~application. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " DocSecurity - lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~docsecurity. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " ScaleCrop - lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop - parent = lo_document ). - lv_value = me->flag2bool( excel->zif_excel_book_properties~scalecrop ). - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " HeadingPairs - lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs - parent = lo_document ). - - - " * vector node - lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector - prefix = lc_vt_ns - parent = lo_document ). - lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size - value = '2' ). - lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype - value = lc_xml_node_variant ). - - " ** variant node - lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant - prefix = lc_vt_ns - parent = lo_document ). - - " *** lpstr node - lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr - prefix = lc_vt_ns - parent = lo_document ). - lv_value = excel->get_worksheets_name( ). - lo_sub_element_lpstr->set_value( value = lv_value ). - lo_sub_element_variant->append_child( new_child = lo_sub_element_lpstr ). " lpstr node - - lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node - - " ** variant node - lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant - prefix = lc_vt_ns - parent = lo_document ). - - " *** i4 node - lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4 - prefix = lc_vt_ns - parent = lo_document ). - lv_value = excel->get_worksheets_size( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_sub_element_i4->set_value( value = lv_value ). - lo_sub_element_variant->append_child( new_child = lo_sub_element_i4 ). " lpstr node - - lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node - - lo_element->append_child( new_child = lo_sub_element_vector ). " vector node - - lo_element_root->append_child( new_child = lo_element ). " HeadingPairs - - - " TitlesOfParts - lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts - parent = lo_document ). - - - " * vector node - lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector - prefix = lc_vt_ns - parent = lo_document ). - lv_value = excel->get_worksheets_size( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size - value = lv_value ). - lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype - value = lc_xml_node_lpstr ). - - lo_iterator = excel->get_worksheets_iterator( ). - - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - " ** lpstr node - lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr - prefix = lc_vt_ns - parent = lo_document ). - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - lv_value = lo_worksheet->get_title( ). - lo_sub_element_lpstr->set_value( value = lv_value ). - lo_sub_element_vector->append_child( new_child = lo_sub_element_lpstr ). " lpstr node - ENDWHILE. - - lo_element->append_child( new_child = lo_sub_element_vector ). " vector node - - lo_element_root->append_child( new_child = lo_element ). " TitlesOfParts - - - - " Company - IF excel->zif_excel_book_properties~company IS NOT INITIAL. - lo_element = lo_document->create_simple_element( name = lc_xml_node_company - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~company. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - " LinksUpToDate - lo_element = lo_document->create_simple_element( name = lc_xml_node_linksuptodate - parent = lo_document ). - lv_value = me->flag2bool( excel->zif_excel_book_properties~linksuptodate ). - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " SharedDoc - lo_element = lo_document->create_simple_element( name = lc_xml_node_shareddoc - parent = lo_document ). - lv_value = me->flag2bool( excel->zif_excel_book_properties~shareddoc ). - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " HyperlinksChanged - lo_element = lo_document->create_simple_element( name = lc_xml_node_hyperlinkschanged - parent = lo_document ). - lv_value = me->flag2bool( excel->zif_excel_book_properties~hyperlinkschanged ). - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " AppVersion - lo_element = lo_document->create_simple_element( name = lc_xml_node_appversion - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~appversion. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - method CREATE_DOCPROPS_CORE. - - -** Constant node name - DATA: lc_xml_node_coreproperties TYPE string VALUE 'coreProperties', - lc_xml_node_creator TYPE string VALUE 'creator', - lc_xml_node_description TYPE string VALUE 'description', - lc_xml_node_lastmodifiedby TYPE string VALUE 'lastModifiedBy', - lc_xml_node_created TYPE string VALUE 'created', - lc_xml_node_modified TYPE string VALUE 'modified', - " Node attributes - lc_xml_attr_type TYPE string VALUE 'type', - lc_xml_attr_target TYPE string VALUE 'dcterms:W3CDTF', - " Node namespace - lc_cp_ns TYPE string VALUE 'cp', - lc_dc_ns TYPE string VALUE 'dc', - lc_dcterms_ns TYPE string VALUE 'dcterms', -* lc_dcmitype_ns TYPE string VALUE 'dcmitype', - lc_xsi_ns TYPE string VALUE 'xsi', - lc_xml_node_cp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', - lc_xml_node_dc_ns TYPE string VALUE 'http://purl.org/dc/elements/1.1/', - lc_xml_node_dcterms_ns TYPE string VALUE 'http://purl.org/dc/terms/', - lc_xml_node_dcmitype_ns TYPE string VALUE 'http://purl.org/dc/dcmitype/', - lc_xml_node_xsi_ns TYPE string VALUE 'http://www.w3.org/2001/XMLSchema-instance'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - - DATA: lv_value TYPE string, - lv_date TYPE sydatum, - lv_time TYPE syuzeit. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node coreProperties - lo_element_root = lo_document->create_simple_element_ns( name = lc_xml_node_coreproperties - prefix = lc_cp_ns - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns:cp' - value = lc_xml_node_cp_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:dc' - value = lc_xml_node_dc_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:dcterms' - value = lc_xml_node_dcterms_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:dcmitype' - value = lc_xml_node_dcmitype_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:xsi' - value = lc_xml_node_xsi_ns ). - -********************************************************************** -* STEP 4: Create subnodes - " Creator node - lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_creator - prefix = lc_dc_ns - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~creator. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " Description node - lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_description - prefix = lc_dc_ns - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~description. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " lastModifiedBy node - lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_lastmodifiedby - prefix = lc_cp_ns - parent = lo_document ). - lv_value = excel->zif_excel_book_properties~lastmodifiedby. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " Created node - lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_created - prefix = lc_dcterms_ns - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - prefix = lc_xsi_ns - value = lc_xml_attr_target ). - - CONVERT TIME STAMP excel->zif_excel_book_properties~created TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. - CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. - REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. -* lv_value = excel->zif_excel_book_properties~created. -* lv_value = '2010-07-04T14:58:53Z'. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " Modified node - lo_element = lo_document->create_simple_element_ns( name = lc_xml_node_modified - prefix = lc_dcterms_ns - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - prefix = lc_xsi_ns - value = lc_xml_attr_target ). - CONVERT TIME STAMP excel->zif_excel_book_properties~modified TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time. - CONCATENATE lv_date lv_time INTO lv_value RESPECTING BLANKS. - REPLACE ALL OCCURRENCES OF REGEX '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})' IN lv_value WITH '$1-$2-$3T$4:$5:$6Z'. -* lv_value = excel->zif_excel_book_properties~modified. -* lv_value = '2010-07-04T14:58:53Z'. - lo_element->set_value( value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - method CREATE_RELATIONSHIPS. - - -** Constant node name - DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', - lc_xml_node_relationship TYPE string VALUE 'Relationship', - " Node attributes - lc_xml_attr_id TYPE string VALUE 'Id', - lc_xml_attr_type TYPE string VALUE 'Type', - lc_xml_attr_target TYPE string VALUE 'Target', - " Node namespace - lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', - " Node id - lc_xml_node_rId1_id TYPE string VALUE 'rId1', - lc_xml_node_rId2_id TYPE string VALUE 'rId2', - lc_xml_node_rId3_id TYPE string VALUE 'rId3', - " Node type - lc_xml_node_rId1_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', - lc_xml_node_rId2_tp TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', - lc_xml_node_rId3_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', - " Node target - lc_xml_node_rId1_tg TYPE string VALUE 'xl/workbook.xml', - lc_xml_node_rId2_tg TYPE string VALUE 'docProps/core.xml', - lc_xml_node_rId3_tg TYPE string VALUE 'docProps/app.xml'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_rels_ns ). - -********************************************************************** -* STEP 4: Create subnodes - " Theme node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lc_xml_node_rId3_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rId3_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lc_xml_node_rId3_tg ). - lo_element_root->append_child( new_child = lo_element ). - - " Styles node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lc_xml_node_rId2_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rId2_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lc_xml_node_rId2_tg ). - lo_element_root->append_child( new_child = lo_element ). - - " rels node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lc_xml_node_rId1_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rId1_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lc_xml_node_rId1_tg ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - - method CREATE_XL_CHARTS. - - -** Constant node name - CONSTANTS: lc_xml_node_chartspace TYPE string VALUE 'c:chartSpace', - lc_xml_node_ns_c TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/chart', - lc_xml_node_ns_a TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/main', - lc_xml_node_ns_r TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', - lc_xml_node_date1904 TYPE string VALUE 'c:date1904', - lc_xml_node_lang TYPE string VALUE 'c:lang', - lc_xml_node_roundedcorners TYPE string VALUE 'c:roundedCorners', - lc_xml_node_altcont TYPE string VALUE 'mc:AlternateContent', - lc_xml_node_altcont_ns_mc TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006', - lc_xml_node_choice TYPE string VALUE 'mc:Choice', - lc_xml_node_choice_ns_requires TYPE string VALUE 'c14', - lc_xml_node_choice_ns_c14 TYPE string VALUE 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart', - lc_xml_node_style TYPE string VALUE 'c14:style', - lc_xml_node_fallback TYPE string VALUE 'mc:Fallback', - lc_xml_node_style2 TYPE string VALUE 'c:style', - - "---------------------------CHART - lc_xml_node_chart TYPE string VALUE 'c:chart', - lc_xml_node_autotitledeleted TYPE string VALUE 'c:autoTitleDeleted', - "plotArea - lc_xml_node_plotarea TYPE string VALUE 'c:plotArea', - lc_xml_node_layout TYPE string VALUE 'c:layout', - lc_xml_node_varycolors TYPE string VALUE 'c:varyColors', - lc_xml_node_ser TYPE string VALUE 'c:ser', - lc_xml_node_idx TYPE string VALUE 'c:idx', - lc_xml_node_order TYPE string VALUE 'c:order', - lc_xml_node_tx TYPE string VALUE 'c:tx', - lc_xml_node_v TYPE string VALUE 'c:v', - lc_xml_node_val TYPE string VALUE 'c:val', - lc_xml_node_cat TYPE string VALUE 'c:cat', - lc_xml_node_numref TYPE string VALUE 'c:numRef', - lc_xml_node_strref TYPE string VALUE 'c:strRef', - lc_xml_node_f TYPE string VALUE 'c:f', "this is the range - "note: numcache avoided - lc_xml_node_dlbls TYPE string VALUE 'c:dLbls', - lc_xml_node_showlegendkey TYPE string VALUE 'c:showLegendKey', - lc_xml_node_showval TYPE string VALUE 'c:showVal', - lc_xml_node_showcatname TYPE string VALUE 'c:showCatName', - lc_xml_node_showsername TYPE string VALUE 'c:showSerName', - lc_xml_node_showpercent TYPE string VALUE 'c:showPercent', - lc_xml_node_showbubblesize TYPE string VALUE 'c:showBubbleSize', - "plotArea->pie - lc_xml_node_piechart TYPE string VALUE 'c:pieChart', - lc_xml_node_showleaderlines TYPE string VALUE 'c:showLeaderLines', - lc_xml_node_firstsliceang TYPE string VALUE 'c:firstSliceAng', - "plotArea->line - lc_xml_node_linechart TYPE string VALUE 'c:lineChart', - lc_xml_node_symbol TYPE string VALUE 'c:symbol', - lc_xml_node_marker TYPE string VALUE 'c:marker', - lc_xml_node_smooth TYPE string VALUE 'c:smooth', - "plotArea->bar - lc_xml_node_invertifnegative TYPE string VALUE 'c:invertIfNegative', - lc_xml_node_barchart TYPE string VALUE 'c:barChart', - lc_xml_node_bardir TYPE string VALUE 'c:barDir', - lc_xml_node_gapwidth TYPE string VALUE 'c:gapWidth', - "plotArea->line + plotArea->bar - lc_xml_node_grouping TYPE string VALUE 'c:grouping', - lc_xml_node_axid TYPE string VALUE 'c:axId', - lc_xml_node_catax TYPE string VALUE 'c:catAx', - lc_xml_node_valax TYPE string VALUE 'c:valAx', - lc_xml_node_scaling TYPE string VALUE 'c:scaling', - lc_xml_node_orientation TYPE string VALUE 'c:orientation', - lc_xml_node_delete TYPE string VALUE 'c:delete', - lc_xml_node_axpos TYPE string VALUE 'c:axPos', - lc_xml_node_numfmt TYPE string VALUE 'c:numFmt', - lc_xml_node_majorgridlines TYPE string VALUE 'c:majorGridlines', - lc_xml_node_majortickmark TYPE string VALUE 'c:majorTickMark', - lc_xml_node_minortickmark TYPE string VALUE 'c:minorTickMark', - lc_xml_node_ticklblpos TYPE string VALUE 'c:tickLblPos', - lc_xml_node_crossax TYPE string VALUE 'c:crossAx', - lc_xml_node_crosses TYPE string VALUE 'c:crosses', - lc_xml_node_auto TYPE string VALUE 'c:auto', - lc_xml_node_lblalgn TYPE string VALUE 'c:lblAlgn', - lc_xml_node_lbloffset TYPE string VALUE 'c:lblOffset', - lc_xml_node_nomultilvllbl TYPE string VALUE 'c:noMultiLvlLbl', - lc_xml_node_crossbetween TYPE string VALUE 'c:crossBetween', - "legend - lc_xml_node_legend TYPE string VALUE 'c:legend', - "legend->pie - lc_xml_node_legendpos TYPE string VALUE 'c:legendPos', -* lc_xml_node_layout TYPE string VALUE 'c:layout', "already exist - lc_xml_node_overlay TYPE string VALUE 'c:overlay', - lc_xml_node_txpr TYPE string VALUE 'c:txPr', - lc_xml_node_bodypr TYPE string VALUE 'a:bodyPr', - lc_xml_node_lststyle TYPE string VALUE 'a:lstStyle', - lc_xml_node_p TYPE string VALUE 'a:p', - lc_xml_node_ppr TYPE string VALUE 'a:pPr', - lc_xml_node_defrpr TYPE string VALUE 'a:defRPr', - lc_xml_node_endpararpr TYPE string VALUE 'a:endParaRPr', - "legend->bar + legend->line - lc_xml_node_plotvisonly TYPE string VALUE 'c:plotVisOnly', - lc_xml_node_dispblanksas TYPE string VALUE 'c:dispBlanksAs', - lc_xml_node_showdlblsovermax TYPE string VALUE 'c:showDLblsOverMax', - "---------------------------END OF CHART - - lc_xml_node_printsettings TYPE string VALUE 'c:printSettings', - lc_xml_node_headerfooter TYPE string VALUE 'c:headerFooter', - lc_xml_node_pagemargins TYPE string VALUE 'c:pageMargins', - lc_xml_node_pagesetup TYPE string VALUE 'c:pageSetup'. - - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element_cellanchor TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - DATA: lv_rel_id TYPE i. - - DATA lo_element TYPE REF TO if_ixml_element. - DATA lo_element2 TYPE REF TO if_ixml_element. - DATA lo_element3 TYPE REF TO if_ixml_element. - DATA lo_el_rootchart TYPE REF TO if_ixml_element. - DATA lo_element4 TYPE REF TO if_ixml_element. - DATA lo_element5 TYPE REF TO if_ixml_element. - DATA lo_element6 TYPE REF TO if_ixml_element. - DATA lo_element7 TYPE REF TO if_ixml_element. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -*********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_chartspace - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns:c' - value = lc_xml_node_ns_c ). - lo_element_root->set_attribute_ns( name = 'xmlns:a' - value = lc_xml_node_ns_a ). - lo_element_root->set_attribute_ns( name = 'xmlns:r' - value = lc_xml_node_ns_r ). - -********************************************************************** -* STEP 4: Create chart - - DATA lo_chartb TYPE REF TO zcl_excel_graph_bars. - DATA lo_chartp TYPE REF TO zcl_excel_graph_pie. - DATA lo_chartl TYPE REF TO zcl_excel_graph_line. - DATA lo_chart TYPE REF TO zcl_excel_graph. - - DATA ls_serie TYPE zcl_excel_graph=>s_series. - DATA ls_ax TYPE zcl_excel_graph_bars=>s_ax. - DATA lv_str TYPE string. - - "Identify chart type - CASE io_drawing->graph_type. - WHEN zcl_excel_drawing=>c_graph_bars. - lo_chartb ?= io_drawing->graph. - WHEN zcl_excel_drawing=>c_graph_pie. - lo_chartp ?= io_drawing->graph. - WHEN zcl_excel_drawing=>c_graph_line. - lo_chartl ?= io_drawing->graph. - WHEN OTHERS. - ENDCASE. - - - lo_chart = io_drawing->graph. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_date1904 - parent = lo_element_root ). - lo_element->set_attribute_ns( name = 'val' - value = lo_chart->ns_1904val ). - - lo_element = lo_document->create_simple_element( name = lc_xml_node_lang - parent = lo_element_root ). - lo_element->set_attribute_ns( name = 'val' - value = lo_chart->ns_langval ). - - lo_element = lo_document->create_simple_element( name = lc_xml_node_roundedcorners - parent = lo_element_root ). - lo_element->set_attribute_ns( name = 'val' - value = lo_chart->ns_roundedcornersval ). - - lo_element = lo_document->create_simple_element( name = lc_xml_node_altcont - parent = lo_element_root ). - lo_element->set_attribute_ns( name = 'xmlns:mc' - value = lc_xml_node_altcont_ns_mc ). - - "Choice - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_choice - parent = lo_element ). - lo_element2->set_attribute_ns( name = 'Requires' - value = lc_xml_node_choice_ns_requires ). - lo_element2->set_attribute_ns( name = 'xmlns:c14' - value = lc_xml_node_choice_ns_c14 ). - - "C14:style - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_style - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chart->ns_c14styleval ). - - "Fallback - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_fallback - parent = lo_element ). - - "C:style - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_style2 - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chart->ns_styleval ). - - "---------------------------CHART - lo_element = lo_document->create_simple_element( name = lc_xml_node_chart - parent = lo_element_root ). - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_autotitledeleted - parent = lo_element ). - lo_element2->set_attribute_ns( name = 'val' - value = lo_chart->ns_autotitledeletedval ). - - "plotArea - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_plotarea - parent = lo_element ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout - parent = lo_element2 ). - CASE io_drawing->graph_type. - WHEN zcl_excel_drawing=>c_graph_bars. - "----bar - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_barchart - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_bardir - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartb->ns_bardirval ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_grouping - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartb->ns_groupingval ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_varycolors - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartb->ns_varycolorsval ). - - "series - LOOP AT lo_chartb->series INTO ls_serie. - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ser - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_idx - parent = lo_element4 ). - IF ls_serie-idx IS NOT INITIAL. - lv_str = ls_serie-idx. - ELSE. - lv_str = sy-tabix - 1. - ENDIF. - CONDENSE lv_str. - lo_element5->set_attribute_ns( name = 'val' - value = lv_str ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_order - parent = lo_element4 ). - lv_str = ls_serie-order. - CONDENSE lv_str. - lo_element5->set_attribute_ns( name = 'val' - value = lv_str ). - IF ls_serie-sername IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_tx - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_v - parent = lo_element5 ). - lo_element6->set_value( value = ls_serie-sername ). - ENDIF. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_invertifnegative - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = ls_serie-invertifnegative ). - IF ls_serie-lbl IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_cat - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_strref - parent = lo_element5 ). - lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f - parent = lo_element6 ). - lo_element7->set_value( value = ls_serie-lbl ). - ENDIF. - IF ls_serie-ref IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_val - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_numref - parent = lo_element5 ). - lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f - parent = lo_element6 ). - lo_element7->set_value( value = ls_serie-ref ). - ENDIF. - ENDLOOP. - "endseries - - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_dlbls - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showlegendkey - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartb->ns_showlegendkeyval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showval - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartb->ns_showvalval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showcatname - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartb->ns_showcatnameval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showsername - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartb->ns_showsernameval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showpercent - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartb->ns_showpercentval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showbubblesize - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartb->ns_showbubblesizeval ). - - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_gapwidth - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartb->ns_gapwidthval ). - - "axes - lo_el_rootchart = lo_element3. - LOOP AT lo_chartb->axes INTO ls_ax. - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid - parent = lo_el_rootchart ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axid ). - CASE ls_ax-type. - WHEN zcl_excel_graph_bars=>c_catax. - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_catax - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axid ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = ls_ax-orientation ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-delete ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axpos ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'formatCode' - value = ls_ax-formatcode ). - lo_element4->set_attribute_ns( name = 'sourceLinked' - value = ls_ax-sourcelinked ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-majortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-minortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-ticklblpos ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crossax ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crosses ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_auto - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-auto ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lblalgn - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-lblalgn ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lbloffset - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-lbloffset ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_nomultilvllbl - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-nomultilvllbl ). - WHEN zcl_excel_graph_bars=>c_valax. - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_valax - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axid ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = ls_ax-orientation ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-delete ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axpos ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majorgridlines - parent = lo_element3 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'formatCode' - value = ls_ax-formatcode ). - lo_element4->set_attribute_ns( name = 'sourceLinked' - value = ls_ax-sourcelinked ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-majortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-minortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-ticklblpos ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crossax ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crosses ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossbetween - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crossbetween ). - WHEN OTHERS. - ENDCASE. - ENDLOOP. - "endaxes - - WHEN zcl_excel_drawing=>c_graph_pie. - "----pie - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_piechart - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_varycolors - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartp->ns_varycolorsval ). - - "series - LOOP AT lo_chartp->series INTO ls_serie. - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ser - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_idx - parent = lo_element4 ). - IF ls_serie-idx IS NOT INITIAL. - lv_str = ls_serie-idx. - ELSE. - lv_str = sy-tabix - 1. - ENDIF. - CONDENSE lv_str. - lo_element5->set_attribute_ns( name = 'val' - value = lv_str ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_order - parent = lo_element4 ). - lv_str = ls_serie-order. - CONDENSE lv_str. - lo_element5->set_attribute_ns( name = 'val' - value = lv_str ). - IF ls_serie-sername IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_tx - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_v - parent = lo_element5 ). - lo_element6->set_value( value = ls_serie-sername ). - ENDIF. - IF ls_serie-lbl IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_cat - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_strref - parent = lo_element5 ). - lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f - parent = lo_element6 ). - lo_element7->set_value( value = ls_serie-lbl ). - ENDIF. - IF ls_serie-ref IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_val - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_numref - parent = lo_element5 ). - lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f - parent = lo_element6 ). - lo_element7->set_value( value = ls_serie-ref ). - ENDIF. - ENDLOOP. - "endseries - - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_dlbls - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showlegendkey - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartp->ns_showlegendkeyval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showval - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartp->ns_showvalval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showcatname - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartp->ns_showcatnameval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showsername - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartp->ns_showsernameval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showpercent - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartp->ns_showpercentval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showbubblesize - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartp->ns_showbubblesizeval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showleaderlines - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartp->ns_showleaderlinesval ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_firstsliceang - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartp->ns_firstsliceangval ). - WHEN zcl_excel_drawing=>c_graph_line. - "----line - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_linechart - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_grouping - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartl->ns_groupingval ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_varycolors - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartl->ns_varycolorsval ). - - "series - LOOP AT lo_chartl->series INTO ls_serie. - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ser - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_idx - parent = lo_element4 ). - IF ls_serie-idx IS NOT INITIAL. - lv_str = ls_serie-idx. - ELSE. - lv_str = sy-tabix - 1. - ENDIF. - CONDENSE lv_str. - lo_element5->set_attribute_ns( name = 'val' - value = lv_str ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_order - parent = lo_element4 ). - lv_str = ls_serie-order. - CONDENSE lv_str. - lo_element5->set_attribute_ns( name = 'val' - value = lv_str ). - IF ls_serie-sername IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_tx - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_v - parent = lo_element5 ). - lo_element6->set_value( value = ls_serie-sername ). - ENDIF. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_marker - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_symbol - parent = lo_element5 ). - lo_element6->set_attribute_ns( name = 'val' - value = ls_serie-symbol ). - IF ls_serie-lbl IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_cat - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_strref - parent = lo_element5 ). - lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f - parent = lo_element6 ). - lo_element7->set_value( value = ls_serie-lbl ). - ENDIF. - IF ls_serie-ref IS NOT INITIAL. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_val - parent = lo_element4 ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_numref - parent = lo_element5 ). - lo_element7 = lo_document->create_simple_element( name = lc_xml_node_f - parent = lo_element6 ). - lo_element7->set_value( value = ls_serie-ref ). - ENDIF. - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_smooth - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = ls_serie-smooth ). - ENDLOOP. - "endseries - - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_dlbls - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showlegendkey - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartl->ns_showlegendkeyval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showval - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartl->ns_showvalval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showcatname - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartl->ns_showcatnameval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showsername - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartl->ns_showsernameval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showpercent - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartl->ns_showpercentval ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_showbubblesize - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = lo_chartl->ns_showbubblesizeval ). - - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_marker - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartl->NS_MARKERVAL ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_smooth - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = lo_chartl->NS_SMOOTHVAL ). - - "axes - lo_el_rootchart = lo_element3. - LOOP AT lo_chartl->axes INTO ls_ax. - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid - parent = lo_el_rootchart ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axid ). - CASE ls_ax-type. - WHEN zcl_excel_graph_line=>c_catax. - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_catax - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axid ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = ls_ax-orientation ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-delete ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axpos ). -* lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt -* parent = lo_element3 ). -* lo_element4->set_attribute_ns( name = 'formatCode' -* value = ls_ax-formatcode ). -* lo_element4->set_attribute_ns( name = 'sourceLinked' -* value = ls_ax-sourcelinked ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-majortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-minortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-ticklblpos ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crossax ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crosses ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_auto - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-auto ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lblalgn - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-lblalgn ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lbloffset - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-lbloffset ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_nomultilvllbl - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-nomultilvllbl ). - WHEN zcl_excel_graph_line=>c_valax. - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_valax - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axid - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axid ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_scaling - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_orientation - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'val' - value = ls_ax-orientation ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_delete - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-delete ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_axpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-axpos ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majorgridlines - parent = lo_element3 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_numfmt - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'formatCode' - value = ls_ax-formatcode ). - lo_element4->set_attribute_ns( name = 'sourceLinked' - value = ls_ax-sourcelinked ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_majortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-majortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_minortickmark - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-minortickmark ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_ticklblpos - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-ticklblpos ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossax - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crossax ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crosses - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crosses ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_crossbetween - parent = lo_element3 ). - lo_element4->set_attribute_ns( name = 'val' - value = ls_ax-crossbetween ). - WHEN OTHERS. - ENDCASE. - ENDLOOP. - "endaxes - - WHEN OTHERS. - ENDCASE. - - "legend - IF lo_chart->print_label EQ abap_true. - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_legend - parent = lo_element ). - CASE io_drawing->graph_type. - WHEN zcl_excel_drawing=>c_graph_bars. - "----bar - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_legendpos - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chartb->ns_legendposval ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout - parent = lo_element2 ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_overlay - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chartb->ns_overlayval ). - WHEN zcl_excel_drawing=>c_graph_line. - "----line - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_legendpos - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chartl->ns_legendposval ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout - parent = lo_element2 ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_overlay - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chartl->ns_overlayval ). - WHEN zcl_excel_drawing=>c_graph_pie. - "----pie - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_legendpos - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chartp->ns_legendposval ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_layout - parent = lo_element2 ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_overlay - parent = lo_element2 ). - lo_element3->set_attribute_ns( name = 'val' - value = lo_chartp->ns_overlayval ). - lo_element3 = lo_document->create_simple_element( name = lc_xml_node_txpr - parent = lo_element2 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_bodypr - parent = lo_element3 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_lststyle - parent = lo_element3 ). - lo_element4 = lo_document->create_simple_element( name = lc_xml_node_p - parent = lo_element3 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_ppr - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'rtl' - value = lo_chartp->ns_pprrtl ). - lo_element6 = lo_document->create_simple_element( name = lc_xml_node_defrpr - parent = lo_element5 ). - lo_element5 = lo_document->create_simple_element( name = lc_xml_node_endpararpr - parent = lo_element4 ). - lo_element5->set_attribute_ns( name = 'lang' - value = lo_chartp->ns_endpararprlang ). - WHEN OTHERS. - ENDCASE. - ENDIF. - - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_plotvisonly - parent = lo_element ). - lo_element2->set_attribute_ns( name = 'val' - value = lo_chart->ns_plotvisonlyval ). - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_dispblanksas - parent = lo_element ). - lo_element2->set_attribute_ns( name = 'val' - value = lo_chart->ns_dispblanksasval ). - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_showdlblsovermax - parent = lo_element ). - lo_element2->set_attribute_ns( name = 'val' - value = lo_chart->ns_showdlblsovermaxval ). - "---------------------------END OF CHART - - "printSettings - lo_element = lo_document->create_simple_element( name = lc_xml_node_printsettings - parent = lo_element_root ). - "headerFooter - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_headerfooter - parent = lo_element ). - "pageMargins - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_pagemargins - parent = lo_element ). - lo_element2->set_attribute_ns( name = 'b' - value = lo_chart->pagemargins-b ). - lo_element2->set_attribute_ns( name = 'l' - value = lo_chart->pagemargins-l ). - lo_element2->set_attribute_ns( name = 'r' - value = lo_chart->pagemargins-r ). - lo_element2->set_attribute_ns( name = 't' - value = lo_chart->pagemargins-t ). - lo_element2->set_attribute_ns( name = 'header' - value = lo_chart->pagemargins-header ). - lo_element2->set_attribute_ns( name = 'footer' - value = lo_chart->pagemargins-footer ). - "pageSetup - lo_element2 = lo_document->create_simple_element( name = lc_xml_node_pagesetup - parent = lo_element ). - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - - method CREATE_XL_DRAWINGS. - - -** Constant node name - CONSTANTS: lc_xml_node_wsdr TYPE string VALUE 'xdr:wsDr', - lc_xml_node_ns_xdr TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing', - lc_xml_node_ns_a TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/main'. - - CONSTANTS: lc_on TYPE string VALUE '1', - lc_off TYPE string VALUE '0'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element_cellanchor TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_drawings TYPE REF TO zcl_excel_drawings, - lo_drawing TYPE REF TO zcl_excel_drawing. - DATA: lv_rel_id TYPE i. - - - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -*********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_wsdr - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns:xdr' - value = lc_xml_node_ns_xdr ). - lo_element_root->set_attribute_ns( name = 'xmlns:a' - value = lc_xml_node_ns_a ). - -********************************************************************** -* STEP 4: Create drawings - - CLEAR: lv_rel_id. - - lo_drawings = io_worksheet->get_drawings( ). - - lo_iterator = lo_drawings->get_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - - ADD 1 TO lv_rel_id. - lo_element_cellanchor = me->create_xl_drawing_anchor( - io_drawing = lo_drawing - io_document = lo_document - ip_index = lv_rel_id ). - - lo_element_root->append_child( new_child = lo_element_cellanchor ). - - ENDWHILE. - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - - method CREATE_XL_DRAWINGS_RELS. - -** Constant node name - DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', - lc_xml_node_relationship TYPE string VALUE 'Relationship', - " Node attributes - lc_xml_attr_id TYPE string VALUE 'Id', - lc_xml_attr_type TYPE string VALUE 'Type', - lc_xml_attr_target TYPE string VALUE 'Target', - " Node namespace - lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', - lc_xml_node_rid_image_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', - lc_xml_node_rid_chart_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_drawings TYPE REF TO zcl_excel_drawings, - lo_drawing TYPE REF TO zcl_excel_drawing. - - DATA: lv_value TYPE string, - lv_counter TYPE i. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_rels_ns ). - -********************************************************************** -* STEP 4: Create subnodes - - " Add sheet Relationship nodes here - lv_counter = 0. - lo_drawings = io_worksheet->get_drawings( ). - lo_iterator = lo_drawings->get_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - ADD 1 TO lv_counter. - - lv_value = lv_counter. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_value ). - - lv_value = lo_drawing->get_media_name( ). - CASE lo_drawing->get_type( ). - WHEN zcl_excel_drawing=>type_image. - CONCATENATE '../media/' lv_value INTO lv_value. - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_image_tp ). - - WHEN zcl_excel_drawing=>type_chart. - CONCATENATE '../charts/' lv_value INTO lv_value. - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_chart_tp ). - - ENDCASE. - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDWHILE. - - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - - - - method CREATE_XL_DRAWING_ANCHOR. - -** Constant node name - CONSTANTS: lc_xml_node_onecellanchor TYPE string VALUE 'xdr:oneCellAnchor', - lc_xml_node_twocellanchor TYPE string VALUE 'xdr:twoCellAnchor', - lc_xml_node_from TYPE string VALUE 'xdr:from', - lc_xml_node_to TYPE string VALUE 'xdr:to', - lc_xml_node_pic TYPE string VALUE 'xdr:pic', - lc_xml_node_ext TYPE string VALUE 'xdr:ext', - lc_xml_node_clientdata TYPE string VALUE 'xdr:clientData', - - lc_xml_node_col TYPE string VALUE 'xdr:col', - lc_xml_node_coloff TYPE string VALUE 'xdr:colOff', - lc_xml_node_row TYPE string VALUE 'xdr:row', - lc_xml_node_rowoff TYPE string VALUE 'xdr:rowOff', - - lc_xml_node_nvpicpr TYPE string VALUE 'xdr:nvPicPr', - lc_xml_node_cnvpr TYPE string VALUE 'xdr:cNvPr', - lc_xml_node_cnvpicpr TYPE string VALUE 'xdr:cNvPicPr', - lc_xml_node_piclocks TYPE string VALUE 'a:picLocks', - - lc_xml_node_sppr TYPE string VALUE 'xdr:spPr', - lc_xml_node_apgeom TYPE string VALUE 'a:prstGeom', - lc_xml_node_aavlst TYPE string VALUE 'a:avLst', - - lc_xml_node_graphicframe TYPE string VALUE 'xdr:graphicFrame', - lc_xml_node_nvgraphicframepr TYPE string VALUE 'xdr:nvGraphicFramePr', - lc_xml_node_cnvgraphicframepr TYPE string VALUE 'xdr:cNvGraphicFramePr', - lc_xml_node_graphicframelocks TYPE string VALUE 'a:graphicFrameLocks', - lc_xml_node_xfrm TYPE string VALUE 'xdr:xfrm', - lc_xml_node_aoff TYPE string VALUE 'a:off', - lc_xml_node_aext TYPE string VALUE 'a:ext', - lc_xml_node_agraphic TYPE string VALUE 'a:graphic', - lc_xml_node_agraphicdata TYPE string VALUE 'a:graphicData', - - lc_xml_node_ns_c TYPE string VALUE 'http://schemas.openxmlformats.org/drawingml/2006/chart', - lc_xml_node_cchart TYPE string VALUE 'c:chart', - - lc_xml_node_blipfill TYPE string VALUE 'xdr:blipFill', - lc_xml_node_ablip TYPE string VALUE 'a:blip', - lc_xml_node_astretch TYPE string VALUE 'a:stretch', - lc_xml_node_ns_r TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'. - - - CONSTANTS: lc_on TYPE string VALUE '1', - lc_off TYPE string VALUE '0'. - - DATA: lo_element_graphicframe TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_element2 TYPE REF TO if_ixml_element, - lo_element3 TYPE REF TO if_ixml_element, - lo_element_from TYPE REF TO if_ixml_element, - lo_element_to TYPE REF TO if_ixml_element, - lo_element_ext TYPE REF TO if_ixml_element, - lo_element_pic TYPE REF TO if_ixml_element, - lo_element_clientdata TYPE REF TO if_ixml_element, - - ls_position TYPE zexcel_drawing_position, - - lv_col TYPE string, " zexcel_cell_column, - lv_row TYPE string, " zexcel_cell_row. - lv_col_offset TYPE string, - lv_row_offset TYPE string, - lv_value TYPE string. - - ls_position = io_drawing->get_position( ). - - IF ls_position-anchor = 'ONE'. - ep_anchor = io_document->create_simple_element( name = lc_xml_node_onecellanchor - parent = io_document ). - ELSE. - ep_anchor = io_document->create_simple_element( name = lc_xml_node_twocellanchor - parent = io_document ). - ENDIF. - -* from cell ****************************** - lo_element_from = io_document->create_simple_element( name = lc_xml_node_from - parent = io_document ). - - lv_col = ls_position-from-col. - lv_row = ls_position-from-row. - lv_col_offset = ls_position-from-col_offset. - lv_row_offset = ls_position-from-row_offset. - CONDENSE lv_col NO-GAPS. - CONDENSE lv_row NO-GAPS. - CONDENSE lv_col_offset NO-GAPS. - CONDENSE lv_row_offset NO-GAPS. - - lo_element = io_document->create_simple_element( name = lc_xml_node_col - parent = io_document ). - lo_element->set_value( value = lv_col ). - lo_element_from->append_child( new_child = lo_element ). - - lo_element = io_document->create_simple_element( name = lc_xml_node_coloff - parent = io_document ). - lo_element->set_value( value = lv_col_offset ). - lo_element_from->append_child( new_child = lo_element ). - - lo_element = io_document->create_simple_element( name = lc_xml_node_row - parent = io_document ). - lo_element->set_value( value = lv_row ). - lo_element_from->append_child( new_child = lo_element ). - - lo_element = io_document->create_simple_element( name = lc_xml_node_rowoff - parent = io_document ). - lo_element->set_value( value = lv_row_offset ). - lo_element_from->append_child( new_child = lo_element ). - ep_anchor->append_child( new_child = lo_element_from ). - - IF ls_position-anchor = 'ONE'. - -* ext ****************************** - lo_element_ext = io_document->create_simple_element( name = lc_xml_node_ext - parent = io_document ). - - lv_value = io_drawing->get_width_emu_str( ). - lo_element_ext->set_attribute_ns( name = 'cx' - value = lv_value ). - lv_value = io_drawing->get_height_emu_str( ). - lo_element_ext->set_attribute_ns( name = 'cy' - value = lv_value ). - ep_anchor->append_child( new_child = lo_element_ext ). - - ELSEIF ls_position-anchor = 'TWO'. - -* to cell ****************************** - lo_element_to = io_document->create_simple_element( name = lc_xml_node_to - parent = io_document ). - - lv_col = ls_position-to-col. - lv_row = ls_position-to-row. - lv_col_offset = ls_position-to-col_offset. - lv_row_offset = ls_position-to-row_offset. - CONDENSE lv_col NO-GAPS. - CONDENSE lv_row NO-GAPS. - CONDENSE lv_col_offset NO-GAPS. - CONDENSE lv_row_offset NO-GAPS. - - lo_element = io_document->create_simple_element( name = lc_xml_node_col - parent = io_document ). - lo_element->set_value( value = lv_col ). - lo_element_to->append_child( new_child = lo_element ). - - lo_element = io_document->create_simple_element( name = lc_xml_node_coloff - parent = io_document ). - lo_element->set_value( value = lv_col_offset ). - lo_element_to->append_child( new_child = lo_element ). - - lo_element = io_document->create_simple_element( name = lc_xml_node_row - parent = io_document ). - lo_element->set_value( value = lv_row ). - lo_element_to->append_child( new_child = lo_element ). - - lo_element = io_document->create_simple_element( name = lc_xml_node_rowoff - parent = io_document ). - lo_element->set_value( value = lv_row_offset ). - lo_element_to->append_child( new_child = lo_element ). - ep_anchor->append_child( new_child = lo_element_to ). - - ENDIF. - - CASE io_drawing->get_type( ). - WHEN zcl_excel_drawing=>type_image. -* pic ********************************** - lo_element_pic = io_document->create_simple_element( name = lc_xml_node_pic - parent = io_document ). -* nvPicPr - lo_element = io_document->create_simple_element( name = lc_xml_node_nvpicpr - parent = io_document ). -* cNvPr - lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvpr - parent = io_document ). - lv_value = sy-index. - CONDENSE lv_value. - lo_element2->set_attribute_ns( name = 'id' - value = lv_value ). - lo_element2->set_attribute_ns( name = 'name' - value = io_drawing->title ). - lo_element->append_child( new_child = lo_element2 ). - -* cNvPicPr - lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvpicpr - parent = io_document ). - -* picLocks - lo_element3 = io_document->create_simple_element( name = lc_xml_node_piclocks - parent = io_document ). - lo_element3->set_attribute_ns( name = 'noChangeAspect' - value = '1' ). - - lo_element2->append_child( new_child = lo_element3 ). - lo_element->append_child( new_child = lo_element2 ). - lo_element_pic->append_child( new_child = lo_element ). - -* blipFill - lv_value = ip_index. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - - lo_element = io_document->create_simple_element( name = lc_xml_node_blipfill - parent = io_document ). - lo_element2 = io_document->create_simple_element( name = lc_xml_node_ablip - parent = io_document ). - lo_element2->set_attribute_ns( name = 'xmlns:r' - value = lc_xml_node_ns_r ). - lo_element2->set_attribute_ns( name = 'r:embed' - value = lv_value ). - lo_element->append_child( new_child = lo_element2 ). - - lo_element2 = io_document->create_simple_element( name = lc_xml_node_astretch - parent = io_document ). - lo_element->append_child( new_child = lo_element2 ). - - lo_element_pic->append_child( new_child = lo_element ). - -* spPr - lo_element = io_document->create_simple_element( name = lc_xml_node_sppr - parent = io_document ). - - lo_element2 = io_document->create_simple_element( name = lc_xml_node_apgeom - parent = io_document ). - lo_element2->set_attribute_ns( name = 'prst' - value = 'rect' ). - lo_element3 = io_document->create_simple_element( name = lc_xml_node_aavlst - parent = io_document ). - lo_element2->append_child( new_child = lo_element3 ). - lo_element->append_child( new_child = lo_element2 ). - - lo_element_pic->append_child( new_child = lo_element ). - ep_anchor->append_child( new_child = lo_element_pic ). - WHEN zcl_excel_drawing=>type_chart. -* graphicFrame ********************************** - lo_element_graphicframe = io_document->create_simple_element( name = lc_xml_node_graphicframe - parent = io_document ). -* nvGraphicFramePr - lo_element = io_document->create_simple_element( name = lc_xml_node_nvgraphicframepr - parent = io_document ). -* cNvPr - lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvpr - parent = io_document ). - lv_value = sy-index. - CONDENSE lv_value. - lo_element2->set_attribute_ns( name = 'id' - value = lv_value ). - lo_element2->set_attribute_ns( name = 'name' - value = io_drawing->title ). - lo_element->append_child( new_child = lo_element2 ). -* cNvGraphicFramePr - lo_element2 = io_document->create_simple_element( name = lc_xml_node_cnvgraphicframepr - parent = io_document ). - lo_element3 = io_document->create_simple_element( name = lc_xml_node_graphicframelocks - parent = io_document ). - lo_element2->append_child( new_child = lo_element3 ). - lo_element->append_child( new_child = lo_element2 ). - lo_element_graphicframe->append_child( new_child = lo_element ). - -* xfrm - lo_element = io_document->create_simple_element( name = lc_xml_node_xfrm - parent = io_document ). -* off - lo_element2 = io_document->create_simple_element( name = lc_xml_node_aoff - parent = io_document ). - lo_element2->set_attribute_ns( name = 'y' value = '0' ). - lo_element2->set_attribute_ns( name = 'x' value = '0' ). - lo_element->append_child( new_child = lo_element2 ). -* ext - lo_element2 = io_document->create_simple_element( name = lc_xml_node_aext - parent = io_document ). - lo_element2->set_attribute_ns( name = 'cy' value = '0' ). - lo_element2->set_attribute_ns( name = 'cx' value = '0' ). - lo_element->append_child( new_child = lo_element2 ). - lo_element_graphicframe->append_child( new_child = lo_element ). - -* graphic - lo_element = io_document->create_simple_element( name = lc_xml_node_agraphic - parent = io_document ). -* graphicData - lo_element2 = io_document->create_simple_element( name = lc_xml_node_agraphicdata - parent = io_document ). - lo_element2->set_attribute_ns( name = 'uri' value = lc_xml_node_ns_c ). - -* chart - lo_element3 = io_document->create_simple_element( name = lc_xml_node_cchart - parent = io_document ). - - lo_element3->set_attribute_ns( name = 'xmlns:r' - value = lc_xml_node_ns_r ). - lo_element3->set_attribute_ns( name = 'xmlns:c' - value = lc_xml_node_ns_c ). - - lv_value = ip_index. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - lo_element3->set_attribute_ns( name = 'r:id' - value = lv_value ). - lo_element2->append_child( new_child = lo_element3 ). - lo_element->append_child( new_child = lo_element2 ). - lo_element_graphicframe->append_child( new_child = lo_element ). - ep_anchor->append_child( new_child = lo_element_graphicframe ). - - ENDCASE. - -* client data *************************** - lo_element_clientdata = io_document->create_simple_element( name = lc_xml_node_clientdata - parent = io_document ). - ep_anchor->append_child( new_child = lo_element_clientdata ). - - endmethod. - - - - method CREATE_XL_RELATIONSHIPS. - - -** Constant node name - DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', - lc_xml_node_relationship TYPE string VALUE 'Relationship', - " Node attributes - lc_xml_attr_id TYPE string VALUE 'Id', - lc_xml_attr_type TYPE string VALUE 'Type', - lc_xml_attr_target TYPE string VALUE 'Target', - " Node namespace - lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', - " Node id - lc_xml_node_ridx_id TYPE string VALUE 'rId#', - " Node type - lc_xml_node_rid_sheet_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', - lc_xml_node_rid_theme_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', - lc_xml_node_rid_styles_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', - lc_xml_node_rid_shared_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', - " Node target - lc_xml_node_ridx_tg TYPE string VALUE 'worksheets/sheet#.xml', - lc_xml_node_rid_shared_tg TYPE string VALUE 'sharedStrings.xml', - lc_xml_node_rid_styles_tg TYPE string VALUE 'styles.xml', - lc_xml_node_rid_theme_tg TYPE string VALUE 'theme/theme1.xml'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - - DATA: lv_xml_node_ridx_tg TYPE string, - lv_xml_node_ridx_id TYPE string, - lv_size TYPE i, - lv_syindex(3) TYPE c. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_rels_ns ). - -********************************************************************** -* STEP 4: Create subnodes - - lv_size = excel->get_worksheets_size( ). - - " Relationship node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lv_size = lv_size + 2. - lv_syindex = lv_size. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - lv_xml_node_ridx_id = lc_xml_node_ridx_id. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_xml_node_ridx_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_styles_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lc_xml_node_rid_styles_tg ). - lo_element_root->append_child( new_child = lo_element ). - - - " Relationship node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lv_size = lv_size - 1. - lv_syindex = lv_size. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - lv_xml_node_ridx_id = lc_xml_node_ridx_id. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_xml_node_ridx_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_theme_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lc_xml_node_rid_theme_tg ). - lo_element_root->append_child( new_child = lo_element ). - - lv_size = excel->get_worksheets_size( ). - - DO lv_size TIMES. - " Relationship node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lv_xml_node_ridx_id = lc_xml_node_ridx_id. - lv_xml_node_ridx_tg = lc_xml_node_ridx_tg. - lv_syindex = sy-index. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_tg WITH lv_syindex. - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_xml_node_ridx_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_sheet_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lv_xml_node_ridx_tg ). - lo_element_root->append_child( new_child = lo_element ). - ENDDO. - - " Relationship node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - ADD 3 TO lv_size. - lv_syindex = lv_size. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - lv_xml_node_ridx_id = lc_xml_node_ridx_id. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_xml_node_ridx_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_shared_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lc_xml_node_rid_shared_tg ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - method CREATE_XL_SHAREDSTRINGS. - - -** Constant node name - DATA: lc_xml_node_sst TYPE string VALUE 'sst', - lc_xml_node_si TYPE string VALUE 'si', - lc_xml_node_t TYPE string VALUE 't', - " Node attributes - lc_xml_attr_count TYPE string VALUE 'count', - lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', - " Node namespace - lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_sub_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - - DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, - ls_shared_string TYPE zexcel_s_shared_string, - lv_value TYPE string, - lv_count_str TYPE string, - lv_uniquecount_str TYPE string, - lv_sytabix TYPE sytabix, - lv_count TYPE i, - lv_uniquecount TYPE i. - - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, - <fs_sheet_string> TYPE zexcel_s_shared_string. - -********************************************************************** -* STEP 1: Collect strings from each worksheet - lo_iterator = excel->get_worksheets_iterator( ). - - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. - ENDWHILE. - - DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content - - DESCRIBE TABLE lt_cell_data LINES lv_count. - MOVE lv_count TO lv_count_str. - - SHIFT lv_count_str RIGHT DELETING TRAILING space. - SHIFT lv_count_str LEFT DELETING LEADING space. - - SORT lt_cell_data BY cell_value. - DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. - - DESCRIBE TABLE lt_cell_data LINES lv_uniquecount. - MOVE lv_uniquecount TO lv_uniquecount_str. - - SHIFT lv_uniquecount_str RIGHT DELETING TRAILING space. - SHIFT lv_uniquecount_str LEFT DELETING LEADING space. - - LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. - lv_sytabix = sy-tabix - 1. - MOVE lv_sytabix TO ls_shared_string-string_no. - MOVE <fs_sheet_content>-cell_value TO ls_shared_string-string_value. - MOVE <fs_sheet_content>-data_type TO ls_shared_string-string_type. - APPEND ls_shared_string TO shared_strings. - ENDLOOP. - - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_sst - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_ns ). - lo_element_root->set_attribute_ns( name = lc_xml_attr_count - value = lv_count_str ). - lo_element_root->set_attribute_ns( name = lc_xml_attr_uniquecount - value = lv_uniquecount_str ). - -********************************************************************** -* STEP 4: Create subnode - LOOP AT shared_strings ASSIGNING <fs_sheet_string>. - lo_element = lo_document->create_simple_element( name = lc_xml_node_si - parent = lo_document ). - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t - parent = lo_document ). - if <fs_sheet_string>-string_type EQ 's_leading_blanks'. - lo_sub_element->set_attribute( name = 'space' namespace = 'xml' value = 'preserve' ). - endif. - lo_sub_element->set_value( value = <fs_sheet_string>-string_value ). - lo_element->append_child( new_child = lo_sub_element ). - lo_element_root->append_child( new_child = lo_element ). - ENDLOOP. - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - - - - METHOD create_xl_sheet. -*--------------------------------------------------------------------* -* issue #330 - Adding ColorScale conditional formatting -* - Ivan Femia, 2014-08-25 -*--------------------------------------------------------------------* - - TYPES: BEGIN OF colors, - colorrgb TYPE zexcel_color, - END OF colors. - -*--------------------------------------------------------------------* -* issue #237 - Error writing column-style -* - Stefan Schmöcker, 2012-11-01 -*--------------------------------------------------------------------* - - TYPES: BEGIN OF cfvo, - value TYPE zexcel_conditional_value, - type TYPE zexcel_conditional_type, - END OF cfvo. - -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 1 - start -*--------------------------------------------------------------------* - TYPES: BEGIN OF lty_table_area, - left TYPE i, - right TYPE i, - top TYPE i, - bottom TYPE i, - END OF lty_table_area. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 1 - end -*--------------------------------------------------------------------* - - -** Constant node name - DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', - lc_xml_node_sheetpr TYPE string VALUE 'sheetPr', - lc_xml_node_tabcolor TYPE string VALUE 'tabColor', - lc_xml_node_outlinepr TYPE string VALUE 'outlinePr', - lc_xml_node_dimension TYPE string VALUE 'dimension', - lc_xml_node_sheetviews TYPE string VALUE 'sheetViews', - lc_xml_node_sheetview TYPE string VALUE 'sheetView', - lc_xml_node_selection TYPE string VALUE 'selection', - lc_xml_node_pane TYPE string VALUE 'pane', - lc_xml_node_sheetformatpr TYPE string VALUE 'sheetFormatPr', - lc_xml_node_cols TYPE string VALUE 'cols', - lc_xml_node_col TYPE string VALUE 'col', - lc_xml_node_sheetdata TYPE string VALUE 'sheetData', - lc_xml_node_row TYPE string VALUE 'row', - lc_xml_node_c TYPE string VALUE 'c', - lc_xml_node_v TYPE string VALUE 'v', - lc_xml_node_f TYPE string VALUE 'f', - lc_xml_node_sheetprotection TYPE string VALUE 'sheetProtection', - lc_xml_node_pagemargins TYPE string VALUE 'pageMargins', - lc_xml_node_pagesetup TYPE string VALUE 'pageSetup', - lc_xml_node_pagesetuppr TYPE string VALUE 'pageSetUpPr', - lc_xml_node_condformatting TYPE string VALUE 'conditionalFormatting', - lc_xml_node_cfrule TYPE string VALUE 'cfRule', - lc_xml_node_color TYPE string VALUE 'color', " Databar by Albert Lladanosa - lc_xml_node_databar TYPE string VALUE 'dataBar', " Databar by Albert Lladanosa - lc_xml_node_colorscale TYPE string VALUE 'colorScale', - lc_xml_node_iconset TYPE string VALUE 'iconSet', - lc_xml_node_cfvo TYPE string VALUE 'cfvo', - lc_xml_node_formula TYPE string VALUE 'formula', - lc_xml_node_datavalidations TYPE string VALUE 'dataValidations', - lc_xml_node_datavalidation TYPE string VALUE 'dataValidation', - lc_xml_node_formula1 TYPE string VALUE 'formula1', - lc_xml_node_formula2 TYPE string VALUE 'formula2', - lc_xml_node_mergecell TYPE string VALUE 'mergeCell', - lc_xml_node_mergecells TYPE string VALUE 'mergeCells', - lc_xml_node_drawing TYPE string VALUE 'drawing', - lc_xml_node_headerfooter TYPE string VALUE 'headerFooter', - lc_xml_node_oddheader TYPE string VALUE 'oddHeader', - lc_xml_node_oddfooter TYPE string VALUE 'oddFooter', - lc_xml_node_evenheader TYPE string VALUE 'evenHeader', - lc_xml_node_evenfooter TYPE string VALUE 'evenFooter', - lc_xml_node_autofilter TYPE string VALUE 'autoFilter', - lc_xml_node_filtercolumn TYPE string VALUE 'filterColumn', - lc_xml_node_filters TYPE string VALUE 'filters', - lc_xml_node_filter TYPE string VALUE 'filter', - " Node attributes - lc_xml_attr_ref TYPE string VALUE 'ref', - lc_xml_attr_summarybelow TYPE string VALUE 'summaryBelow', - lc_xml_attr_summaryright TYPE string VALUE 'summaryRight', - lc_xml_attr_tabselected TYPE string VALUE 'tabSelected', - lc_xml_attr_showzeros TYPE string VALUE 'showZeros', - lc_xml_attr_zoomscale TYPE string VALUE 'zoomScale', - lc_xml_attr_zoomscalenormal TYPE string VALUE 'zoomScaleNormal', - lc_xml_attr_zoomscalepageview TYPE string VALUE 'zoomScalePageLayoutView', - lc_xml_attr_zoomscalesheetview TYPE string VALUE 'zoomScaleSheetLayoutView', - lc_xml_attr_workbookviewid TYPE string VALUE 'workbookViewId', - lc_xml_attr_showgridlines TYPE string VALUE 'showGridLines', - lc_xml_attr_gridlines TYPE string VALUE 'gridLines', - lc_xml_attr_showrowcolheaders TYPE string VALUE 'showRowColHeaders', - lc_xml_attr_activecell TYPE string VALUE 'activeCell', - lc_xml_attr_sqref TYPE string VALUE 'sqref', - lc_xml_attr_min TYPE string VALUE 'min', - lc_xml_attr_max TYPE string VALUE 'max', - lc_xml_attr_hidden TYPE string VALUE 'hidden', - lc_xml_attr_width TYPE string VALUE 'width', - lc_xml_attr_defaultwidth TYPE string VALUE '9.10', - lc_xml_attr_style TYPE string VALUE 'style', - lc_xml_attr_true TYPE string VALUE 'true', - lc_xml_attr_bestfit TYPE string VALUE 'bestFit', - lc_xml_attr_customheight TYPE string VALUE 'customHeight', - lc_xml_attr_customwidth TYPE string VALUE 'customWidth', - lc_xml_attr_collapsed TYPE string VALUE 'collapsed', - lc_xml_attr_defaultrowheight TYPE string VALUE 'defaultRowHeight', - lc_xml_attr_defaultcolwidth TYPE string VALUE 'defaultColWidth', - lc_xml_attr_outlinelevelrow TYPE string VALUE 'x14ac:outlineLevelRow', - lc_xml_attr_outlinelevelcol TYPE string VALUE 'x14ac:outlineLevelCol', - lc_xml_attr_outlinelevel TYPE string VALUE 'outlineLevel', - lc_xml_attr_r TYPE string VALUE 'r', - lc_xml_attr_s TYPE string VALUE 's', - lc_xml_attr_spans TYPE string VALUE 'spans', - lc_xml_attr_t TYPE string VALUE 't', - lc_xml_attr_password TYPE string VALUE 'password', - lc_xml_attr_sheet TYPE string VALUE 'sheet', - lc_xml_attr_objects TYPE string VALUE 'objects', - lc_xml_attr_scenarios TYPE string VALUE 'scenarios', - lc_xml_attr_autofilter TYPE string VALUE 'autoFilter', - lc_xml_attr_deletecolumns TYPE string VALUE 'deleteColumns', - lc_xml_attr_deleterows TYPE string VALUE 'deleteRows', - lc_xml_attr_formatcells TYPE string VALUE 'formatCells', - lc_xml_attr_formatcolumns TYPE string VALUE 'formatColumns', - lc_xml_attr_formatrows TYPE string VALUE 'formatRows', - lc_xml_attr_insertcolumns TYPE string VALUE 'insertColumns', - lc_xml_attr_inserthyperlinks TYPE string VALUE 'insertHyperlinks', - lc_xml_attr_insertrows TYPE string VALUE 'insertRows', - lc_xml_attr_pivottables TYPE string VALUE 'pivotTables', - lc_xml_attr_selectlockedcells TYPE string VALUE 'selectLockedCells', - lc_xml_attr_selectunlockedcell TYPE string VALUE 'selectUnlockedCells', - lc_xml_attr_sort TYPE string VALUE 'sort', - lc_xml_attr_left TYPE string VALUE 'left', - lc_xml_attr_right TYPE string VALUE 'right', - lc_xml_attr_top TYPE string VALUE 'top', - lc_xml_attr_bottom TYPE string VALUE 'bottom', - lc_xml_attr_header TYPE string VALUE 'header', - lc_xml_attr_footer TYPE string VALUE 'footer', - lc_xml_attr_type TYPE string VALUE 'type', - lc_xml_attr_iconset TYPE string VALUE 'iconSet', - lc_xml_attr_showvalue TYPE string VALUE 'showValue', - lc_xml_attr_val TYPE string VALUE 'val', - lc_xml_attr_dxfid TYPE string VALUE 'dxfId', - lc_xml_attr_priority TYPE string VALUE 'priority', - lc_xml_attr_operator TYPE string VALUE 'operator', - lc_xml_attr_allowblank TYPE string VALUE 'allowBlank', - lc_xml_attr_showinputmessage TYPE string VALUE 'showInputMessage', - lc_xml_attr_showerrormessage TYPE string VALUE 'showErrorMessage', - lc_xml_attr_errortitle TYPE string VALUE 'errorTitle', - lc_xml_attr_error TYPE string VALUE 'error', - lc_xml_attr_prompttitle TYPE string VALUE 'promptTitle', - lc_xml_attr_prompt TYPE string VALUE 'prompt', - lc_xml_attr_count TYPE string VALUE 'count', - lc_xml_attr_blackandwhite TYPE string VALUE 'blackAndWhite', - lc_xml_attr_cellcomments TYPE string VALUE 'cellComments', - lc_xml_attr_copies TYPE string VALUE 'copies', - lc_xml_attr_draft TYPE string VALUE 'draft', - lc_xml_attr_errors TYPE string VALUE 'errors', - lc_xml_attr_firstpagenumber TYPE string VALUE 'firstPageNumber', - lc_xml_attr_fittopage TYPE string VALUE 'fitToPage', - lc_xml_attr_fittoheight TYPE string VALUE 'fitToHeight', - lc_xml_attr_fittowidth TYPE string VALUE 'fitToWidth', - lc_xml_attr_horizontaldpi TYPE string VALUE 'horizontalDpi', - lc_xml_attr_orientation TYPE string VALUE 'orientation', - lc_xml_attr_pageorder TYPE string VALUE 'pageOrder', - lc_xml_attr_paperheight TYPE string VALUE 'paperHeight', - lc_xml_attr_papersize TYPE string VALUE 'paperSize', - lc_xml_attr_paperwidth TYPE string VALUE 'paperWidth', - lc_xml_attr_scale TYPE string VALUE 'scale', - lc_xml_attr_usefirstpagenumber TYPE string VALUE 'useFirstPageNumber', - lc_xml_attr_useprinterdefaults TYPE string VALUE 'usePrinterDefaults', - lc_xml_attr_verticaldpi TYPE string VALUE 'verticalDpi', - lc_xml_attr_differentoddeven TYPE string VALUE 'differentOddEven', - lc_xml_attr_colid TYPE string VALUE 'colId', - lc_xml_attr_filtermode TYPE string VALUE 'filterMode', - lc_xml_attr_tabcolor_rgb TYPE string VALUE 'rgb', - lc_xml_attr_tabcolor_theme TYPE string VALUE 'theme', - " Node namespace - lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', - lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', - lc_xml_node_comp_ns TYPE string VALUE 'http://schemas.openxmlformats.org/markup-compatibility/2006', - lc_xml_node_comp_pref TYPE string VALUE 'x14ac', - lc_xml_node_ig_ns TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_element_2 TYPE REF TO if_ixml_element, - lo_element_3 TYPE REF TO if_ixml_element, - lo_element_4 TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_style_conditional TYPE REF TO zcl_excel_style_conditional, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lo_table TYPE REF TO zcl_excel_table, - row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, - default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, - default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. - - DATA: lv_value TYPE string, - lt_range_merge TYPE string_table, - lv_merge TYPE string, - lv_column_p TYPE zexcel_cell_column_alpha, - lv_column TYPE zexcel_cell_column, - lv_cell_value TYPE zexcel_cell_value, - lv_style_guid TYPE zexcel_cell_style, - lv_flag TYPE c, - ls_databar TYPE zexcel_conditional_databar, " Databar by Albert Lladanosa - ls_colorscale TYPE zexcel_conditional_colorscale, - ls_iconset TYPE zexcel_conditional_iconset, - ls_cellis TYPE zexcel_conditional_cellis, - ls_expression TYPE zexcel_conditional_expression, - lt_cfvo TYPE TABLE OF cfvo, - ls_cfvo TYPE cfvo, - lt_colors TYPE TABLE OF colors, - ls_colors TYPE colors, - lv_cell_row_s TYPE string, - ls_last_row TYPE zexcel_s_cell_data, - ls_style_mapping TYPE zexcel_s_styles_mapping, - lv_freeze_cell_row TYPE zexcel_cell_row, - lv_freeze_cell_column TYPE zexcel_cell_column, - lv_freeze_cell_column_alpha TYPE zexcel_cell_column_alpha, - column_dimensions TYPE zexcel_t_worksheet_columndime, - row_dimensions TYPE zexcel_t_worksheet_rowdimensio, - ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping, - lv_relation_id TYPE i VALUE 0, - outline_level_row TYPE i VALUE 0, - outline_level_col TYPE i VALUE 0, - col_count TYPE int4, - merge_count TYPE int4, - write_current_row TYPE boolean, - lt_values TYPE zexcel_t_autofilter_values, - ls_values TYPE zexcel_s_autofilter_values, - lv_guid TYPE uuid, - lo_autofilters TYPE REF TO zcl_excel_autofilters, - lo_autofilter TYPE REF TO zcl_excel_autofilter, - l_autofilter_hidden TYPE flag, - ls_area TYPE zexcel_s_autofilter_area, - lv_ref TYPE string, - lv_style_index TYPE i. " issue #237 - - - FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data, - <fs_range_merge> LIKE LINE OF lt_range_merge, - <column_dimension> TYPE zexcel_s_worksheet_columndime, - <row_dimension> TYPE zexcel_s_worksheet_rowdimensio. - -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 2 - start -*--------------------------------------------------------------------* - DATA: lt_table_areas TYPE SORTED TABLE OF lty_table_area WITH NON-UNIQUE KEY left right top bottom, - ls_table_area LIKE LINE OF lt_table_areas. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Declarations 2 - end -*--------------------------------------------------------------------* - - - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -*********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_worksheet - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:r' - value = lc_xml_node_r_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:mc' - value = lc_xml_node_comp_ns ). - lo_element_root->set_attribute_ns( name = 'mc:Ignorable' - value = lc_xml_node_comp_pref ). - lo_element_root->set_attribute_ns( name = 'xmlns:x14ac' - value = lc_xml_node_ig_ns ). - - -********************************************************************** -* STEP 4: Create subnodes - " sheetPr - lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetpr - parent = lo_document ). - " TODO tabColor - IF io_worksheet->tabcolor IS NOT INITIAL. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_tabcolor - parent = lo_element ). -* Theme not supported yet - start with RGB - lv_value = io_worksheet->tabcolor-rgb. - lo_element_2->set_attribute_ns( name = lc_xml_attr_tabcolor_rgb - value = lv_value ). - ENDIF. - - " outlinePr - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_outlinepr - parent = lo_document ). - - lv_value = io_worksheet->zif_excel_sheet_properties~summarybelow. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_summarybelow - value = lv_value ). - - lv_value = io_worksheet->zif_excel_sheet_properties~summaryright. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_summaryright - value = lv_value ). - - lo_element->append_child( new_child = lo_element_2 ). - - IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_pagesetuppr - parent = lo_document ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_fittopage - value = `1` ). - lo_element->append_child( new_child = lo_element_2 ). " pageSetupPr node - ENDIF. - - lo_element_root->append_child( new_child = lo_element ). - - " dimension node - lo_element = lo_document->create_simple_element( name = lc_xml_node_dimension - parent = lo_document ). - lv_value = io_worksheet->get_dimension_range( ). - lo_element->set_attribute_ns( name = lc_xml_attr_ref - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " sheetViews node - lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetviews - parent = lo_document ). - " sheetView node - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_sheetview - parent = lo_document ). - IF io_worksheet->zif_excel_sheet_properties~show_zeros EQ abap_false. - lo_element_2->set_attribute_ns( name = lc_xml_attr_showzeros - value = '0' ). - ENDIF. - IF iv_active = abap_true - OR io_worksheet->zif_excel_sheet_properties~selected EQ abap_true. - lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected - value = '1' ). - ELSE. - lo_element_2->set_attribute_ns( name = lc_xml_attr_tabselected - value = '0' ). - ENDIF. - " Zoom scale - IF io_worksheet->zif_excel_sheet_properties~zoomscale GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale - value = lv_value ). - IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_normal LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_normal. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalenormal - value = lv_value ). - ENDIF. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview NE 0. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalepageview - value = lv_value ). - ENDIF. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview NE 0. - IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview GT 400. - io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 400. - ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview LT 10. - io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 10. - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscalesheetview - value = lv_value ). - ENDIF. - lo_element_2->set_attribute_ns( name = lc_xml_attr_workbookviewid - value = '0' ). - " showGridLines attribute - IF io_worksheet->show_gridlines = abap_true. - lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines - value = '1' ). - ELSE. - lo_element_2->set_attribute_ns( name = lc_xml_attr_showgridlines - value = '0' ). - ENDIF. - - " showRowColHeaders attribute - IF io_worksheet->show_rowcolheaders = abap_true. - lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders - value = '1' ). - ELSE. - lo_element_2->set_attribute_ns( name = lc_xml_attr_showrowcolheaders - value = '0' ). - ENDIF. - - - " freeze panes - io_worksheet->get_freeze_cell( IMPORTING ep_row = lv_freeze_cell_row - ep_column = lv_freeze_cell_column ). - - IF lv_freeze_cell_row IS NOT INITIAL AND lv_freeze_cell_column IS NOT INITIAL. - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_pane - parent = lo_element_2 ). - - IF lv_freeze_cell_row > 1. - lv_value = lv_freeze_cell_row - 1. - CONDENSE lv_value. - lo_element_3->set_attribute_ns( name = 'ySplit' - value = lv_value ). - ENDIF. - - IF lv_freeze_cell_column > 1. - lv_value = lv_freeze_cell_column - 1. - CONDENSE lv_value. - lo_element_3->set_attribute_ns( name = 'xSplit' - value = lv_value ). - ENDIF. - - lv_freeze_cell_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_freeze_cell_column ). - lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_freeze_cell_row ). - CONCATENATE lv_freeze_cell_column_alpha lv_value INTO lv_value. - lo_element_3->set_attribute_ns( name = 'topLeftCell' - value = lv_value ). - - lo_element_3->set_attribute_ns( name = 'activePane' - value = 'bottomRight' ). - - lo_element_3->set_attribute_ns( name = 'state' - value = 'frozen' ). - - lo_element_2->append_child( new_child = lo_element_3 ). - ENDIF. - " selection node - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_selection - parent = lo_document ). - lv_value = io_worksheet->get_active_cell( ). - lo_element_3->set_attribute_ns( name = lc_xml_attr_activecell - value = lv_value ). - - lo_element_3->set_attribute_ns( name = lc_xml_attr_sqref - value = lv_value ). - - lo_element_2->append_child( new_child = lo_element_3 ). " sheetView node - - lo_element->append_child( new_child = lo_element_2 ). " sheetView node - - lo_element_root->append_child( new_child = lo_element ). " sheetViews node - - - column_dimensions[] = io_worksheet->get_column_dimensions( ). - " Calculate col - IF NOT column_dimensions IS INITIAL. - io_worksheet->calculate_column_widths( ). - column_dimensions[] = io_worksheet->get_column_dimensions( ). - ENDIF. - row_dimensions[] = io_worksheet->get_row_dimensions( ). - " sheetFormatPr node - lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetformatpr - parent = lo_document ). - " defaultRowHeight - default_row_dimension = io_worksheet->get_default_row_dimension( ). - IF default_row_dimension IS BOUND. - IF default_row_dimension->get_row_height( ) >= 0. - lo_element->set_attribute_ns( name = lc_xml_attr_customheight - value = lc_xml_attr_true ). - lv_value = default_row_dimension->get_row_height( ). - ELSE. - lv_value = '12.75'. - ENDIF. - ELSE. - lv_value = '12.75'. - ENDIF. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_defaultrowheight - value = lv_value ). - " defaultColWidth - default_col_dimension = io_worksheet->get_default_column_dimension( ). - IF default_col_dimension IS BOUND. - IF default_col_dimension->get_width( ) >= 0. - lv_value = default_col_dimension->get_width( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_defaultcolwidth - value = lv_value ). - ENDIF. - ENDIF. - " outlineLevelRow - LOOP AT row_dimensions ASSIGNING <row_dimension>. - IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row. - outline_level_row = <row_dimension>-row_dimension->get_outline_level( ). - ENDIF. - ENDLOOP. - lv_value = outline_level_row. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelrow - value = lv_value ). - " outlineLevelCol - LOOP AT column_dimensions ASSIGNING <column_dimension>. - IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col. - outline_level_col = <column_dimension>-column_dimension->get_outline_level( ). - ENDIF. - ENDLOOP. - lv_value = outline_level_col. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_outlinelevelcol - value = lv_value ). -* lv_value = 0. -* SHIFT lv_value RIGHT DELETING TRAILING space. -* SHIFT lv_value LEFT DELETING LEADING space. -* lo_element->set_attribute_ns( name = lc_xml_attr_dydescent -* value = lv_value ). - - lo_element_root->append_child( new_child = lo_element ). " sheetFormatPr node - - IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL OR NOT column_dimensions IS INITIAL. - " cols node - lo_element = lo_document->create_simple_element( name = lc_xml_node_cols - parent = lo_document ). - " This code have to be enhanced in order to manage also column style properties - " Now it is an out/out - IF NOT column_dimensions IS INITIAL. - LOOP AT column_dimensions ASSIGNING <column_dimension>. - " col node - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col - parent = lo_document ). - lv_value = <column_dimension>-column_dimension->get_column_index( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = lc_xml_attr_min - value = lv_value ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_max - value = lv_value ). - " Width - IF <column_dimension>-column_dimension->get_width( ) < 0. - lo_element_2->set_attribute_ns( name = lc_xml_attr_width - value = lc_xml_attr_defaultwidth ). - ELSE. - lv_value = <column_dimension>-column_dimension->get_width( ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_width - value = lv_value ). - ENDIF. - " Column visibility - IF <column_dimension>-column_dimension->get_visible( ) = abap_false. - lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden - value = lc_xml_attr_true ). - ENDIF. - " Auto size? - IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. - lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit - value = lc_xml_attr_true ). - ENDIF. - " Custom width? - IF default_col_dimension IS BOUND. - IF <column_dimension>-column_dimension->get_width( ) - <> default_col_dimension->get_width( ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth - value = lc_xml_attr_true ). - - ENDIF. - ELSE. - lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth - value = lc_xml_attr_true ). - ENDIF. - " Collapsed - IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. - lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed - value = lc_xml_attr_true ). - ENDIF. - " outlineLevel - IF <column_dimension>-column_dimension->get_outline_level( ) > 0. - lv_value = <column_dimension>-column_dimension->get_outline_level( ). - - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel - value = lv_value ). - ENDIF. - " Style -* lv_value = <column_dimension>-column_dimension->get_xf_index( ). "del issue #157 - set column style - lv_style_guid = <column_dimension>-column_dimension->get_column_style_guid( ). "ins issue #157 - set column style -* lv_value = me->excel->get_style_index_in_styles( lv_style_guid ). "del issue #237 - CLEAR ls_style_mapping. - READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid. -* lv_style_index = ls_style_mapping-style. "del issue #295 -* IF lv_style_index > 0. "ins issue #237 - del issue #295 -* lv_value = lv_style_index - 1. "ins issue #237 - del issue #295 - IF sy-subrc = 0. "ins issue #295 - lv_value = ls_style_mapping-style. "ins issue #295 - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - ENDIF. "ins issue #237 - - lo_element->append_child( new_child = lo_element_2 ). " col node - ENDLOOP. -* ELSE. "del issue #157 - set sheet style ( add missing columns -* IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL. "del issue #157 - set sheet style ( add missing columns -* Begin of insertion issue #157 - set sheet style ( add missing columns - ENDIF. -* Always pass through this coding - IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL. - DATA: lts_sorted_columns TYPE SORTED TABLE OF zexcel_cell_column WITH UNIQUE KEY table_line. - TYPES: BEGIN OF ty_missing_columns, - first_column TYPE zexcel_cell_column, - last_column TYPE zexcel_cell_column, - END OF ty_missing_columns. - DATA: t_missing_columns TYPE STANDARD TABLE OF ty_missing_columns WITH NON-UNIQUE DEFAULT KEY, - missing_column LIKE LINE OF t_missing_columns. - -* First collect columns that were already handled before. The rest has to be inserted now - LOOP AT column_dimensions ASSIGNING <column_dimension>. - lv_column = zcl_excel_common=>convert_column2int( <column_dimension>-column ). - INSERT lv_column INTO TABLE lts_sorted_columns. - ENDLOOP. - -* Now find all columns that were missing so far - missing_column-first_column = 1. - LOOP AT lts_sorted_columns INTO lv_column. - IF lv_column > missing_column-first_column. - missing_column-last_column = lv_column - 1. - APPEND missing_column TO t_missing_columns. - ENDIF. - missing_column-first_column = lv_column + 1. - ENDLOOP. - missing_column-last_column = zcl_excel_common=>c_excel_sheet_max_col. - APPEND missing_column TO t_missing_columns. -* Now apply stylesetting ( and other defaults - I copy it from above. Whoever programmed that seems to know what to do :o) - LOOP AT t_missing_columns INTO missing_column. -* End of insertion issue #157 - set column style - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col - parent = lo_document ). -* lv_value = zcl_excel_common=>c_excel_sheet_min_col."del issue #157 - set sheet style ( add missing columns - lv_value = missing_column-first_column. "ins issue #157 - set sheet style ( add missing columns - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_min - value = lv_value ). -* lv_value = zcl_excel_common=>c_excel_sheet_max_col."del issue #157 - set sheet style ( add missing columns - lv_value = missing_column-last_column. "ins issue #157 - set sheet style ( add missing columns - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_max - value = lv_value ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_width - value = lc_xml_attr_defaultwidth ). - lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). - READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid. - lv_value = ls_style_mapping-style. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - lo_element->append_child( new_child = lo_element_2 ). " col node - ENDLOOP. "ins issue #157 - set sheet style ( add missing columns - - ENDIF. - lo_element_root->append_child( new_child = lo_element ). " cols node - ENDIF. - " sheetData node - lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata - parent = lo_document ). - " Get column count - col_count = io_worksheet->get_highest_column( ). - " Get autofilter - lv_guid = io_worksheet->get_guid( ) . - lo_autofilters = excel->get_autofilters_reference( ). - lo_autofilter = lo_autofilters->get( i_sheet_guid = lv_guid ) . - IF lo_autofilter IS BOUND. - lt_values = lo_autofilter->get_values( ) . - ls_area = lo_autofilter->get_filter_area( ) . - l_autofilter_hidden = abap_true. " First defautl is not showing - ENDIF. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - start -*--------------------------------------------------------------------* -* Build table to hold all table-areas attached to this sheet - lo_iterator = io_worksheet->get_tables_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). - ls_table_area-left = zcl_excel_common=>convert_column2int( lo_table->settings-top_left_column ). - ls_table_area-right = lo_table->get_right_column_integer( ). - ls_table_area-top = lo_table->settings-top_left_row. - ls_table_area-bottom = lo_table->get_bottom_row_integer( ). - INSERT ls_table_area INTO TABLE lt_table_areas. - ENDWHILE. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - end -*--------------------------------------------------------------------* - - LOOP AT io_worksheet->sheet_content ASSIGNING <ls_sheet_content>. - READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. - IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. - CLEAR l_autofilter_hidden. - ENDIF. - CLEAR ls_style_mapping. - IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. - IF lo_autofilter IS BOUND. - IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header - ls_area-row_end < ls_last_row-cell_row . - CLEAR l_autofilter_hidden. - ENDIF. - ELSE. - CLEAR l_autofilter_hidden. - ENDIF. - IF ls_last_row-cell_row IS NOT INITIAL. - " Row visibility of previos row. - IF row_dimension->get_visible( ) = abap_false OR - l_autofilter_hidden = abap_true. - lo_element_2->set_attribute_ns( name = 'hidden' value = 'true'). - ENDIF. - lo_element->append_child( new_child = lo_element_2 ). " row node - ENDIF. - " Add new row - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_row - parent = lo_document ). - " r - lv_value = <ls_sheet_content>-cell_row. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - - lo_element_2->set_attribute_ns( name = lc_xml_attr_r - value = lv_value ). - " Spans - lv_value = col_count. - CONCATENATE '1:' lv_value INTO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = lc_xml_attr_spans - value = lv_value ). - row_dimension = io_worksheet->get_row_dimension( <ls_sheet_content>-cell_row ). - " Do we need the row dimension attributes? - IF row_dimension->get_row_height( ) >= 0 OR - row_dimension->get_collapsed( ) = abap_true OR - row_dimension->get_outline_level( ) > 0 OR - row_dimension->get_xf_index( ) <> 0 OR - l_autofilter_hidden = abap_true. - " Row dimensions - IF row_dimension->get_row_height( ) >= 0. - lo_element_2->set_attribute_ns( name = 'customHeight' value = '1'). - lv_value = row_dimension->get_row_height( ). - lo_element_2->set_attribute_ns( name = 'ht' value = lv_value ). - ENDIF. - " Collapsed - IF row_dimension->get_collapsed( ) = abap_true. - lo_element_2->set_attribute_ns( name = 'collapsed' value = 'true'). - ENDIF. - " Outline level - IF row_dimension->get_outline_level( ) > 0. - lv_value = row_dimension->get_outline_level( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = 'outlineLevel' value = lv_value ). - ENDIF. - " Style - IF row_dimension->get_xf_index( ) <> 0. - lv_value = row_dimension->get_xf_index( ). - lo_element_2->set_attribute_ns( name = 's' value = lv_value ). - lo_element_2->set_attribute_ns( name = 'customFormat' value = '1'). - ENDIF. - ENDIF. - l_autofilter_hidden = abap_true. " First default is not showing - ENDIF. - - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_c - parent = lo_document ). - - lo_element_3->set_attribute_ns( name = lc_xml_attr_r - value = <ls_sheet_content>-cell_coords ). - -* begin of change issue #157 - allow column cellstyle -* if no cellstyle is set, look into column, then into sheet - IF <ls_sheet_content>-cell_style IS NOT INITIAL. - lv_style_guid = <ls_sheet_content>-cell_style. - ELSE. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 2 - start -*--------------------------------------------------------------------* -* Check if cell in any of the table areas - LOOP AT lt_table_areas TRANSPORTING NO FIELDS WHERE top <= <ls_sheet_content>-cell_row - AND bottom >= <ls_sheet_content>-cell_row - AND left <= <ls_sheet_content>-cell_column - AND right >= <ls_sheet_content>-cell_column. - EXIT. - ENDLOOP. - IF sy-subrc = 0. - CLEAR lv_style_guid. " No style --> EXCEL will use built-in-styles as declared in the tables-section - ELSE. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 2 - end -*--------------------------------------------------------------------* - lv_column_p = zcl_excel_common=>convert_column2alpha( <ls_sheet_content>-cell_column ). - READ TABLE column_dimensions WITH KEY column = lv_column_p ASSIGNING <column_dimension>. - IF sy-subrc = 0. - lv_style_guid = <column_dimension>-column_dimension->get_column_style_guid( ). - IF lv_style_guid IS INITIAL. - lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). - ENDIF. - ELSE. - lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). - ENDIF. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 3 - start -*--------------------------------------------------------------------* - ENDIF. -*--------------------------------------------------------------------* -* issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 3 - end -*--------------------------------------------------------------------* - ENDIF. -* IF <ls_sheet_content>-cell_style IS NOT INITIAL. -* READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = <ls_sheet_content>-cell_style. - IF lv_style_guid IS NOT INITIAL. - READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid. -* end of change issue #157 - allow column cellstyles - lv_value = ls_style_mapping-style. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_3->set_attribute_ns( name = lc_xml_attr_s - value = lv_value ). - ENDIF. - - " For cells with formula ignore the value - Excel will calculate it - IF <ls_sheet_content>-cell_formula IS NOT INITIAL. - " fomula node - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_f - parent = lo_document ). - lv_value = <ls_sheet_content>-cell_formula. - CONDENSE lv_value. - lo_element_4->set_value( value = lv_value ). - lo_element_3->append_child( new_child = lo_element_4 ). " fomula node - ELSEIF <ls_sheet_content>-cell_value IS NOT INITIAL. "cell can have just style or formula - IF <ls_sheet_content>-data_type IS NOT INITIAL. - IF <ls_sheet_content>-data_type EQ 's_leading_blanks'. - lo_element_3->set_attribute_ns( name = lc_xml_attr_t - value = 's' ). - ELSE. - lo_element_3->set_attribute_ns( name = lc_xml_attr_t - value = <ls_sheet_content>-data_type ). - ENDIF. - ENDIF. - - " value node - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_v - parent = lo_document ). - - IF <ls_sheet_content>-data_type EQ 's' or <ls_sheet_content>-data_type EQ 's_leading_blanks'. - lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). - CONDENSE lv_value. - lo_element_4->set_value( value = lv_value ). - ELSE. - lv_value = <ls_sheet_content>-cell_value. - CONDENSE lv_value. - lo_element_4->set_value( value = lv_value ). - ENDIF. - - lo_element_3->append_child( new_child = lo_element_4 ). " value node - ENDIF. - - lo_element_2->append_child( new_child = lo_element_3 ). " column node - ls_last_row = <ls_sheet_content>. - ENDLOOP. - IF sy-subrc = 0. - READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. - IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. - CLEAR l_autofilter_hidden. - ENDIF. - IF lo_autofilter IS BOUND. - IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header - ls_area-row_end < ls_last_row-cell_row . - CLEAR l_autofilter_hidden. - ENDIF. - ELSE. - CLEAR l_autofilter_hidden. - ENDIF. - " Row visibility of previos row. - IF row_dimension->get_visible( ) = abap_false OR - l_autofilter_hidden = abap_true. - lo_element_2->set_attribute_ns( name = 'hidden' value = 'true'). - ENDIF. - lo_element->append_child( new_child = lo_element_2 ). " row node - ENDIF. - - lo_element_root->append_child( new_child = lo_element ). " sheetData node - - IF lo_autofilter IS BOUND. -* Create node autofilter - lo_element = lo_document->create_simple_element( name = lc_xml_node_autofilter - parent = lo_document ). - lv_ref = lo_autofilter->get_filter_range( ) . - CONDENSE lv_ref NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_ref - value = lv_ref ). - lt_values = lo_autofilter->get_values( ) . - IF lt_values IS NOT INITIAL. -* If we filter we need to set the filter mode to 1. - lo_element_2 = lo_document->find_from_name( name = lc_xml_node_sheetpr ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_filtermode - value = '1' ). -* Create node filtercolumn - CLEAR lv_column. - LOOP AT lt_values INTO ls_values. - IF ls_values-column <> lv_column. - IF lv_column IS NOT INITIAL. - lo_element_2->append_child( new_child = lo_element_3 ). - lo_element->append_child( new_child = lo_element_2 ). - ENDIF. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_filtercolumn - parent = lo_element ). - lv_column = ls_values-column - lo_autofilter->filter_area-col_start. - lv_value = lv_column. - CONDENSE lv_value NO-GAPS. - lo_element_2->set_attribute_ns( name = lc_xml_attr_colid - value = lv_value ). - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_filters - parent = lo_element_2 ). - lv_column = ls_values-column. - ENDIF. - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_filter - parent = lo_element_3 ). - lo_element_4->set_attribute_ns( name = lc_xml_attr_val - value = ls_values-value ). - lo_element_3->append_child( new_child = lo_element_4 ). " value node - ENDLOOP. - lo_element_2->append_child( new_child = lo_element_3 ). - lo_element->append_child( new_child = lo_element_2 ). - ENDIF. - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - IF io_worksheet->zif_excel_sheet_protection~protected EQ abap_true. - " sheetProtection node - lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetprotection - parent = lo_document ). - MOVE io_worksheet->zif_excel_sheet_protection~password TO lv_value. - IF lv_value IS NOT INITIAL. - lo_element->set_attribute_ns( name = lc_xml_attr_password - value = lv_value ). - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_protection~auto_filter. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_autofilter - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~delete_columns. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_deletecolumns - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~delete_rows. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_deleterows - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~format_cells. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_formatcells - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~format_columns. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_formatcolumns - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~format_rows. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_formatrows - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~insert_columns. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_insertcolumns - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~insert_hyperlinks. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_inserthyperlinks - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~insert_rows. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_insertrows - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~objects. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_objects - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~pivot_tables. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_pivottables - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~scenarios. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_scenarios - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~select_locked_cells. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_selectlockedcells - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~select_unlocked_cells. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_selectunlockedcell - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~sheet. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_sheet - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~sort. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_sort - value = lv_value ). - - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - " Merged cells - lt_range_merge = io_worksheet->get_merge( ). - IF lt_range_merge IS NOT INITIAL. - lo_element = lo_document->create_simple_element( name = lc_xml_node_mergecells - parent = lo_document ). - DESCRIBE TABLE lt_range_merge LINES merge_count. - lv_value = merge_count. - CONDENSE lv_value. - lo_element->set_attribute_ns( name = lc_xml_attr_count - value = lv_value ). - LOOP AT lt_range_merge ASSIGNING <fs_range_merge>. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_mergecell - parent = lo_document ). - - lo_element_2->set_attribute_ns( name = lc_xml_attr_ref - value = <fs_range_merge> ). - lo_element->append_child( new_child = lo_element_2 ). - lo_element_root->append_child( new_child = lo_element ). - io_worksheet->delete_merge( ). - ENDLOOP. - ENDIF. - - " Conditional formatting node - lo_iterator = io_worksheet->get_cond_styles_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_style_conditional ?= lo_iterator->if_object_collection_iterator~get_next( ). - IF lo_style_conditional->rule IS INITIAL. - CONTINUE. - ENDIF. - lo_element = lo_document->create_simple_element( name = lc_xml_node_condformatting - parent = lo_document ). - lv_value = lo_style_conditional->get_dimension_range( ) . - lo_element->set_attribute_ns( name = lc_xml_attr_sqref - value = lv_value ). - - " cfRule node - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_cfrule - parent = lo_document ). - lv_value = lo_style_conditional->rule. - lo_element_2->set_attribute_ns( name = lc_xml_attr_type - value = lv_value ). - lv_value = lo_style_conditional->priority. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = lc_xml_attr_priority - value = lv_value ). - - CASE lo_style_conditional->rule. - " Start >> Databar by Albert Lladanosa - WHEN zcl_excel_style_conditional=>c_rule_databar. - - ls_databar = lo_style_conditional->mode_databar. - - CLEAR lt_cfvo. - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_databar - parent = lo_document ). - - MOVE ls_databar-cfvo1_value TO ls_cfvo-value. - MOVE ls_databar-cfvo1_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - - MOVE ls_databar-cfvo2_value TO ls_cfvo-value. - MOVE ls_databar-cfvo2_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - - LOOP AT lt_cfvo INTO ls_cfvo. - " cfvo node - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo - parent = lo_document ). - lv_value = ls_cfvo-type. - lo_element_4->set_attribute_ns( name = lc_xml_attr_type - value = lv_value ). - lv_value = ls_cfvo-value. - lo_element_4->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_3->append_child( new_child = lo_element_4 ). " cfvo node - ENDLOOP. - - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_color - parent = lo_document ). - lv_value = ls_databar-colorrgb. - lo_element_4->set_attribute_ns( name = lc_xml_attr_tabcolor_rgb - value = lv_value ). - - lo_element_3->append_child( new_child = lo_element_4 ). " color node - - lo_element_2->append_child( new_child = lo_element_3 ). " databar node - " End << Databar by Albert Lladanosa - WHEN zcl_excel_style_conditional=>c_rule_colorscale. - - ls_colorscale = lo_style_conditional->mode_colorscale. - - CLEAR: lt_cfvo, lt_colors. - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_colorscale - parent = lo_document ). - - MOVE ls_colorscale-cfvo1_value TO ls_cfvo-value. - MOVE ls_colorscale-cfvo1_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - - MOVE ls_colorscale-cfvo2_value TO ls_cfvo-value. - MOVE ls_colorscale-cfvo2_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - - MOVE ls_colorscale-cfvo3_value TO ls_cfvo-value. - MOVE ls_colorscale-cfvo3_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - - APPEND ls_colorscale-colorrgb1 TO lt_colors. - APPEND ls_colorscale-colorrgb2 TO lt_colors. - APPEND ls_colorscale-colorrgb3 TO lt_colors. - - LOOP AT lt_cfvo INTO ls_cfvo. - - IF ls_cfvo IS INITIAL. - CONTINUE. - ENDIF. - - " cfvo node - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo - parent = lo_document ). - lv_value = ls_cfvo-type. - lo_element_4->set_attribute_ns( name = lc_xml_attr_type - value = lv_value ). - lv_value = ls_cfvo-value. - lo_element_4->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_3->append_child( new_child = lo_element_4 ). " cfvo node - ENDLOOP. - LOOP AT lt_colors INTO ls_colors. - - IF ls_colors IS INITIAL. - CONTINUE. - ENDIF. - - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_color - parent = lo_document ). - lv_value = ls_colors-colorrgb. - lo_element_4->set_attribute_ns( name = lc_xml_attr_tabcolor_rgb - value = lv_value ). - - lo_element_3->append_child( new_child = lo_element_4 ). " color node - ENDLOOP. - - lo_element_2->append_child( new_child = lo_element_3 ). " databar node - WHEN zcl_excel_style_conditional=>c_rule_iconset. - - ls_iconset = lo_style_conditional->mode_iconset. - - CLEAR lt_cfvo. - " iconset node - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_iconset - parent = lo_document ). - IF ls_iconset-iconset NE zcl_excel_style_conditional=>c_iconset_3trafficlights. - lv_value = ls_iconset-iconset. - lo_element_3->set_attribute_ns( name = lc_xml_attr_iconset - value = lv_value ). - ENDIF. - - " Set the showValue attribute - lv_value = ls_iconset-showvalue. - lo_element_3->set_attribute_ns( name = lc_xml_attr_showvalue - value = lv_value ). - - CASE ls_iconset-iconset. - WHEN zcl_excel_style_conditional=>c_iconset_3trafficlights2 OR - zcl_excel_style_conditional=>c_iconset_3arrows OR - zcl_excel_style_conditional=>c_iconset_3arrowsgray OR - zcl_excel_style_conditional=>c_iconset_3flags OR - zcl_excel_style_conditional=>c_iconset_3signs OR - zcl_excel_style_conditional=>c_iconset_3symbols OR - zcl_excel_style_conditional=>c_iconset_3symbols2 OR - zcl_excel_style_conditional=>c_iconset_3trafficlights OR - zcl_excel_style_conditional=>c_iconset_3trafficlights2. - MOVE ls_iconset-cfvo1_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo1_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo2_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo2_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo3_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo3_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - WHEN zcl_excel_style_conditional=>c_iconset_4arrows OR - zcl_excel_style_conditional=>c_iconset_4arrowsgray OR - zcl_excel_style_conditional=>c_iconset_4rating OR - zcl_excel_style_conditional=>c_iconset_4redtoblack OR - zcl_excel_style_conditional=>c_iconset_4trafficlights. - MOVE ls_iconset-cfvo1_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo1_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo2_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo2_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo3_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo3_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo4_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo4_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - WHEN zcl_excel_style_conditional=>c_iconset_5arrows OR - zcl_excel_style_conditional=>c_iconset_5arrowsgray OR - zcl_excel_style_conditional=>c_iconset_5quarters OR - zcl_excel_style_conditional=>c_iconset_5rating. - MOVE ls_iconset-cfvo1_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo1_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo2_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo2_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo3_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo3_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo4_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo4_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - MOVE ls_iconset-cfvo5_value TO ls_cfvo-value. - MOVE ls_iconset-cfvo5_type TO ls_cfvo-type. - APPEND ls_cfvo TO lt_cfvo. - WHEN OTHERS. - CLEAR lt_cfvo. - ENDCASE. - - LOOP AT lt_cfvo INTO ls_cfvo. - " cfvo node - lo_element_4 = lo_document->create_simple_element( name = lc_xml_node_cfvo - parent = lo_document ). - lv_value = ls_cfvo-type. - lo_element_4->set_attribute_ns( name = lc_xml_attr_type - value = lv_value ). - lv_value = ls_cfvo-value. - lo_element_4->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_3->append_child( new_child = lo_element_4 ). " cfvo node - ENDLOOP. - - - lo_element_2->append_child( new_child = lo_element_3 ). " iconset node - WHEN zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis = lo_style_conditional->mode_cellis. - READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_cellis-cell_style. - lv_value = ls_style_cond_mapping-dxf. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid - value = lv_value ). - lv_value = ls_cellis-operator. - lo_element_2->set_attribute_ns( name = lc_xml_attr_operator - value = lv_value ). - " formula node - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula - parent = lo_document ). - lv_value = ls_cellis-formula. - lo_element_3->set_value( value = lv_value ). - lo_element_2->append_child( new_child = lo_element_3 ). " formula node - WHEN zcl_excel_style_conditional=>c_rule_expression. - ls_expression = lo_style_conditional->mode_expression. - READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_expression-cell_style. - lv_value = ls_style_cond_mapping-dxf. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_dxfid - value = lv_value ). - " formula node - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula - parent = lo_document ). - lv_value = ls_expression-formula. - lo_element_3->set_value( value = lv_value ). - lo_element_2->append_child( new_child = lo_element_3 ). " formula node - ENDCASE. - - lo_element->append_child( new_child = lo_element_2 ). " cfRule node - - lo_element_root->append_child( new_child = lo_element ). " Conditional formatting node - ENDWHILE. - - IF io_worksheet->get_data_validations_size( ) GT 0. - " dataValidations node - lo_element = lo_document->create_simple_element( name = lc_xml_node_datavalidations - parent = lo_document ). - " Conditional formatting node - lo_iterator = io_worksheet->get_data_validations_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_data_validation ?= lo_iterator->if_object_collection_iterator~get_next( ). - " dataValidation node - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_datavalidation - parent = lo_document ). - lv_value = lo_data_validation->type. - lo_element_2->set_attribute_ns( name = lc_xml_attr_type - value = lv_value ). - IF NOT lo_data_validation->operator IS INITIAL. - lv_value = lo_data_validation->operator. - lo_element_2->set_attribute_ns( name = lc_xml_attr_operator - value = lv_value ). - ENDIF. - IF lo_data_validation->allowblank EQ abap_true. - lv_value = '1'. - ELSE. - lv_value = '0'. - ENDIF. - lo_element_2->set_attribute_ns( name = lc_xml_attr_allowblank - value = lv_value ). - IF lo_data_validation->showinputmessage EQ abap_true. - lv_value = '1'. - ELSE. - lv_value = '0'. - ENDIF. - lo_element_2->set_attribute_ns( name = lc_xml_attr_showinputmessage - value = lv_value ). - IF lo_data_validation->showerrormessage EQ abap_true. - lv_value = '1'. - ELSE. - lv_value = '0'. - ENDIF. - lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage - value = lv_value ). - IF NOT lo_data_validation->errortitle IS INITIAL. - lv_value = lo_data_validation->errortitle. - lo_element_2->set_attribute_ns( name = lc_xml_attr_errortitle - value = lv_value ). - ENDIF. - IF NOT lo_data_validation->error IS INITIAL. - lv_value = lo_data_validation->error. - lo_element_2->set_attribute_ns( name = lc_xml_attr_error - value = lv_value ). - ENDIF. - IF NOT lo_data_validation->prompttitle IS INITIAL. - lv_value = lo_data_validation->prompttitle. - lo_element_2->set_attribute_ns( name = lc_xml_attr_prompttitle - value = lv_value ). - ENDIF. - IF NOT lo_data_validation->prompt IS INITIAL. - lv_value = lo_data_validation->prompt. - lo_element_2->set_attribute_ns( name = lc_xml_attr_prompt - value = lv_value ). - ENDIF. - lv_cell_row_s = lo_data_validation->cell_row. - CONDENSE lv_cell_row_s. - CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. - IF lo_data_validation->cell_row_to IS NOT INITIAL. - lv_cell_row_s = lo_data_validation->cell_row_to. - CONDENSE lv_cell_row_s. - CONCATENATE lv_value ':' lo_data_validation->cell_column_to lv_cell_row_s INTO lv_value. - ENDIF. - lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref - value = lv_value ). - " formula1 node - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula1 - parent = lo_document ). - lv_value = lo_data_validation->formula1. - lo_element_3->set_value( value = lv_value ). - - lo_element_2->append_child( new_child = lo_element_3 ). " formula1 node - " formula2 node - IF NOT lo_data_validation->formula2 IS INITIAL. - lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula2 - parent = lo_document ). - lv_value = lo_data_validation->formula2. - lo_element_3->set_value( value = lv_value ). - - lo_element_2->append_child( new_child = lo_element_3 ). " formula2 node - ENDIF. - - lo_element->append_child( new_child = lo_element_2 ). " dataValidation node - ENDWHILE. - lo_element_root->append_child( new_child = lo_element ). " dataValidations node - ENDIF. - - " Hyperlinks - DATA: lv_hyperlinks_count TYPE i, - lo_link TYPE REF TO zcl_excel_hyperlink. - - lv_hyperlinks_count = io_worksheet->get_hyperlinks_size( ). - IF lv_hyperlinks_count > 0. - lo_element = lo_document->create_simple_element( name = 'hyperlinks' - parent = lo_document ). - - lo_iterator = io_worksheet->get_hyperlinks_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_link ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lo_element_2 = lo_document->create_simple_element( name = 'hyperlink' - parent = lo_element ). - - lv_value = lo_link->get_ref( ). - lo_element_2->set_attribute_ns( name = 'ref' - value = lv_value ). - - IF lo_link->is_internal( ) = abap_true. - lv_value = lo_link->get_url( ). - lo_element_2->set_attribute_ns( name = 'location' - value = lv_value ). - ELSE. - ADD 1 TO lv_relation_id. - - lv_value = lv_relation_id. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - - lo_element_2->set_attribute_ns( name = 'r:id' - value = lv_value ). - - ENDIF. - - lo_element->append_child( new_child = lo_element_2 ). - ENDWHILE. - - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - - " PrintOptions - IF io_worksheet->print_gridlines = abap_true OR - io_worksheet->sheet_setup->vertical_centered = abap_true OR - io_worksheet->sheet_setup->horizontal_centered = abap_true. - lo_element = lo_document->create_simple_element( name = 'printOptions' - parent = lo_document ). - - IF io_worksheet->print_gridlines = abap_true. - lo_element->set_attribute_ns( name = lc_xml_attr_gridlines - value = 'true' ). - ENDIF. - - IF io_worksheet->sheet_setup->horizontal_centered = abap_true. - lo_element->set_attribute_ns( name = 'horizontalCentered' - value = 'true' ). - ENDIF. - - IF io_worksheet->sheet_setup->vertical_centered = abap_true. - lo_element->set_attribute_ns( name = 'verticalCentered' - value = 'true' ). - ENDIF. - - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - " pageMargins node - lo_element = lo_document->create_simple_element( name = lc_xml_node_pagemargins - parent = lo_document ). - - lv_value = io_worksheet->sheet_setup->margin_left. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_left - value = lv_value ). - lv_value = io_worksheet->sheet_setup->margin_right. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_right - value = lv_value ). - lv_value = io_worksheet->sheet_setup->margin_top. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_top - value = lv_value ). - lv_value = io_worksheet->sheet_setup->margin_bottom. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_bottom - value = lv_value ). - lv_value = io_worksheet->sheet_setup->margin_header. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_header - value = lv_value ). - lv_value = io_worksheet->sheet_setup->margin_footer. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_footer - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). " pageMargins node - -* pageSetup node - lo_element = lo_document->create_simple_element( name = lc_xml_node_pagesetup - parent = lo_document ). - - IF io_worksheet->sheet_setup->black_and_white IS NOT INITIAL. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_blackandwhite - value = `1` ). - ENDIF. - - IF io_worksheet->sheet_setup->cell_comments IS NOT INITIAL. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_cellcomments - value = io_worksheet->sheet_setup->cell_comments ). - ENDIF. - - IF io_worksheet->sheet_setup->copies IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->copies. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_copies - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->draft IS NOT INITIAL. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_draft - value = `1` ). - ENDIF. - - IF io_worksheet->sheet_setup->errors IS NOT INITIAL. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_errors - value = io_worksheet->sheet_setup->errors ). - ENDIF. - - IF io_worksheet->sheet_setup->first_page_number IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->first_page_number. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_firstpagenumber - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->fit_to_height. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_fittoheight - value = lv_value ). - lv_value = io_worksheet->sheet_setup->fit_to_width. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_fittowidth - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->horizontal_dpi IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->horizontal_dpi. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_horizontaldpi - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->orientation IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->orientation. - lo_element->set_attribute_ns( name = lc_xml_attr_orientation - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->page_order IS NOT INITIAL. - lo_element->set_attribute_ns( name = lc_xml_attr_pageorder - value = io_worksheet->sheet_setup->page_order ). - ENDIF. - - IF io_worksheet->sheet_setup->paper_height IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->paper_height. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_paperheight - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->paper_size IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->paper_size. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_papersize - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->paper_width IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->paper_width. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_paperwidth - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->scale IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->scale. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_scale - value = lv_value ). - ENDIF. - - IF io_worksheet->sheet_setup->use_first_page_num IS NOT INITIAL. - lo_element->set_attribute_ns( name = lc_xml_attr_usefirstpagenumber - value = `1` ). - ENDIF. - - IF io_worksheet->sheet_setup->use_printer_defaults IS NOT INITIAL. - lo_element->set_attribute_ns( name = lc_xml_attr_useprinterdefaults - value = `1` ). - ENDIF. - - IF io_worksheet->sheet_setup->vertical_dpi IS NOT INITIAL. - lv_value = io_worksheet->sheet_setup->vertical_dpi. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_verticaldpi - value = lv_value ). - ENDIF. - - lo_element_root->append_child( new_child = lo_element ). " pageSetup node - -* { headerFooter necessary? > - IF io_worksheet->sheet_setup->odd_header IS NOT INITIAL - OR io_worksheet->sheet_setup->odd_footer IS NOT INITIAL - OR io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_headerfooter - parent = lo_document ). - - " Different header/footer for odd/even pages? - IF io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. - lo_element->set_attribute_ns( name = lc_xml_attr_differentoddeven - value = '1' ). - ENDIF. - - " OddHeader - CLEAR: lv_value. - io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_odd_header = lv_value ) . - IF lv_value IS NOT INITIAL. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_oddheader - parent = lo_document ). - lo_element_2->set_value( value = lv_value ). - lo_element->append_child( new_child = lo_element_2 ). - ENDIF. - - " OddFooter - CLEAR: lv_value. - io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_odd_footer = lv_value ) . - IF lv_value IS NOT INITIAL. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_oddfooter - parent = lo_document ). - lo_element_2->set_value( value = lv_value ). - lo_element->append_child( new_child = lo_element_2 ). - ENDIF. - - " evenHeader - CLEAR: lv_value. - io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_even_header = lv_value ) . - IF lv_value IS NOT INITIAL. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_evenheader - parent = lo_document ). - lo_element_2->set_value( value = lv_value ). - lo_element->append_child( new_child = lo_element_2 ). - ENDIF. - - " evenFooter - CLEAR: lv_value. - io_worksheet->sheet_setup->get_header_footer_string( IMPORTING ep_even_footer = lv_value ) . - IF lv_value IS NOT INITIAL. - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_evenfooter - parent = lo_document ). - lo_element_2->set_value( value = lv_value ). - lo_element->append_child( new_child = lo_element_2 ). - ENDIF. - - - lo_element_root->append_child( new_child = lo_element ). " headerFooter - - ENDIF. - -* drawing - DATA: lo_drawings TYPE REF TO zcl_excel_drawings. - - lo_drawings = io_worksheet->get_drawings( ). - IF lo_drawings->is_empty( ) = abap_false. - lo_element = lo_document->create_simple_element( name = lc_xml_node_drawing - parent = lo_document ). - ADD 1 TO lv_relation_id. - - lv_value = lv_relation_id. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - lo_element->set_attribute( name = 'r:id' - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - -* tables - DATA lv_table_count TYPE i. - - lv_table_count = io_worksheet->get_tables_size( ). - IF lv_table_count > 0. - lo_element = lo_document->create_simple_element( name = 'tableParts' - parent = lo_document ). - lv_value = lv_table_count. - CONDENSE lv_value. - lo_element->set_attribute_ns( name = 'count' - value = lv_value ). - - lo_iterator = io_worksheet->get_tables_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). - ADD 1 TO lv_relation_id. - - lv_value = lv_relation_id. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - lo_element_2 = lo_document->create_simple_element( name = 'tablePart' - parent = lo_element ). - lo_element_2->set_attribute_ns( name = 'r:id' - value = lv_value ). - lo_element->append_child( new_child = lo_element_2 ). - - ENDWHILE. - - lo_element_root->append_child( new_child = lo_element ). - - ENDIF. - - - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - -ENDMETHOD. - - - - - - method CREATE_XL_SHEET_RELS. - - -** Constant node name - DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', - lc_xml_node_relationship TYPE string VALUE 'Relationship', - " Node attributes - lc_xml_attr_id TYPE string VALUE 'Id', - lc_xml_attr_type TYPE string VALUE 'Type', - lc_xml_attr_target TYPE string VALUE 'Target', - lc_xml_attr_target_mode TYPE string VALUE 'TargetMode', - lc_xml_val_external TYPE string VALUE 'External', - " Node namespace - lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships', - lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table', - lc_xml_node_rid_printer_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings', - lc_xml_node_rid_drawing_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', - lc_xml_node_rid_link_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_table TYPE REF TO zcl_excel_table, - lo_link TYPE REF TO zcl_excel_hyperlink. - - DATA: lv_value TYPE string, - lv_relation_id TYPE i, - lv_index_str TYPE string. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_rels_ns ). - -********************************************************************** -* STEP 4: Create subnodes - - " Add sheet Relationship nodes here - lv_relation_id = 0. - lo_iterator = io_worksheet->get_hyperlinks_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_link ?= lo_iterator->if_object_collection_iterator~get_next( ). - ADD 1 TO lv_relation_id. - - lv_value = lv_relation_id. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_value ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_link_tp ). - - lv_value = lo_link->get_url( ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lv_value ). - lo_element->set_attribute_ns( name = lc_xml_attr_target_mode - value = lc_xml_val_external ). - lo_element_root->append_child( new_child = lo_element ). - ENDWHILE. - -* drawing - DATA: lo_drawings TYPE REF TO zcl_excel_drawings. - - lo_drawings = io_worksheet->get_drawings( ). - IF lo_drawings->is_empty( ) = abap_false. - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - ADD 1 TO lv_relation_id. - - lv_value = lv_relation_id. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_value ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_drawing_tp ). - - lv_index_str = iv_drawing_index. - CONDENSE lv_index_str NO-GAPS. - MOVE me->c_xl_drawings TO lv_value. - REPLACE 'xl' WITH '..' INTO lv_value. - REPLACE '#' WITH lv_index_str INTO lv_value. - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - lo_iterator = io_worksheet->get_tables_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). - ADD 1 TO lv_relation_id. - - lv_value = lv_relation_id. - CONDENSE lv_value. - CONCATENATE 'rId' lv_value INTO lv_value. - - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_value ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_table_tp ). - - lv_value = lo_table->get_name( ). - CONCATENATE '../tables/' lv_value '.xml' INTO lv_value. - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDWHILE. - -* IF io_worksheet->get_print_settings( )->is_empty( ) = abap_false. -* ADD 1 TO lv_relation_id. -* lv_value = lv_relation_id. -* CONDENSE lv_value. -* CONCATENATE 'rId' lv_value INTO lv_value. -* -* lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship -* parent = lo_document ). -* lo_element->set_attribute_ns( name = lc_xml_attr_id -* value = lv_value ). -* lo_element->set_attribute_ns( name = lc_xml_attr_type -* value = lc_xml_node_rid_printer_tp ). -* -* lv_index_str = iv_printer_index. -* CONDENSE lv_index_str NO-GAPS. -* MOVE me->c_xl_printersettings TO lv_value. -* REPLACE 'xl' WITH '..' INTO lv_value. -* REPLACE '#' WITH lv_index_str INTO lv_value. -* lo_element->set_attribute_ns( name = lc_xml_attr_target -* value = lv_value ). -* -* lo_element_root->append_child( new_child = lo_element ). -* ENDIF. - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - METHOD create_xl_styles. - - -** Constant node name - CONSTANTS: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', - " font - lc_xml_node_fonts TYPE string VALUE 'fonts', - lc_xml_node_font TYPE string VALUE 'font', - lc_xml_node_b TYPE string VALUE 'b', "bold - lc_xml_node_i TYPE string VALUE 'i', "italic - lc_xml_node_u TYPE string VALUE 'u', "underline - lc_xml_node_strike TYPE string VALUE 'strike', "strikethrough - lc_xml_node_sz TYPE string VALUE 'sz', - lc_xml_node_color TYPE string VALUE 'color', - lc_xml_node_name TYPE string VALUE 'name', - lc_xml_node_family TYPE string VALUE 'family', - lc_xml_node_scheme TYPE string VALUE 'scheme', - " fill - lc_xml_node_fills TYPE string VALUE 'fills', - lc_xml_node_fill TYPE string VALUE 'fill', - lc_xml_node_patternfill TYPE string VALUE 'patternFill', - lc_xml_node_fgcolor TYPE string VALUE 'fgColor', - lc_xml_node_bgcolor TYPE string VALUE 'bgColor', - lc_xml_node_gradientfill TYPE string VALUE 'gradientFill', - lc_xml_node_stop TYPE string VALUE 'stop', - " borders - lc_xml_node_borders TYPE string VALUE 'borders', - lc_xml_node_border TYPE string VALUE 'border', - lc_xml_node_left TYPE string VALUE 'left', - lc_xml_node_right TYPE string VALUE 'right', - lc_xml_node_top TYPE string VALUE 'top', - lc_xml_node_bottom TYPE string VALUE 'bottom', - lc_xml_node_diagonal TYPE string VALUE 'diagonal', - " numfmt - lc_xml_node_numfmts TYPE string VALUE 'numFmts', - lc_xml_node_numfmt TYPE string VALUE 'numFmt', - " Styles - lc_xml_node_cellstylexfs TYPE string VALUE 'cellStyleXfs', - lc_xml_node_xf TYPE string VALUE 'xf', - lc_xml_node_cellxfs TYPE string VALUE 'cellXfs', - lc_xml_node_cellstyles TYPE string VALUE 'cellStyles', - lc_xml_node_cellstyle TYPE string VALUE 'cellStyle', - lc_xml_node_dxfs TYPE string VALUE 'dxfs', - lc_xml_node_dxf TYPE string VALUE 'dxf', - lc_xml_node_tablestyles TYPE string VALUE 'tableStyles', - " Colors - lc_xml_node_colors TYPE string VALUE 'colors', - lc_xml_node_indexedcolors TYPE string VALUE 'indexedColors', - lc_xml_node_rgbcolor TYPE string VALUE 'rgbColor', - lc_xml_node_mrucolors TYPE string VALUE 'mruColors', - " Alignment - lc_xml_node_alignment TYPE string VALUE 'alignment', - " Protection - lc_xml_node_protection TYPE string VALUE 'protection', - " Node attributes - lc_xml_attr_count TYPE string VALUE 'count', - lc_xml_attr_val TYPE string VALUE 'val', - lc_xml_attr_theme TYPE string VALUE 'theme', - lc_xml_attr_rgb TYPE string VALUE 'rgb', - lc_xml_attr_indexed TYPE string VALUE 'indexed', - lc_xml_attr_tint TYPE string VALUE 'tint', - lc_xml_attr_style TYPE string VALUE 'style', - lc_xml_attr_position TYPE string VALUE 'position', - lc_xml_attr_degree TYPE string VALUE 'degree', - lc_xml_attr_patterntype TYPE string VALUE 'patternType', - lc_xml_attr_numfmtid TYPE string VALUE 'numFmtId', - lc_xml_attr_fontid TYPE string VALUE 'fontId', - lc_xml_attr_fillid TYPE string VALUE 'fillId', - lc_xml_attr_borderid TYPE string VALUE 'borderId', - lc_xml_attr_xfid TYPE string VALUE 'xfId', - lc_xml_attr_applynumberformat TYPE string VALUE 'applyNumberFormat', - lc_xml_attr_applyprotection TYPE string VALUE 'applyProtection', - lc_xml_attr_applyfont TYPE string VALUE 'applyFont', - lc_xml_attr_applyfill TYPE string VALUE 'applyFill', - lc_xml_attr_applyborder TYPE string VALUE 'applyBorder', - lc_xml_attr_name TYPE string VALUE 'name', - lc_xml_attr_builtinid TYPE string VALUE 'builtinId', - lc_xml_attr_defaulttablestyle TYPE string VALUE 'defaultTableStyle', - lc_xml_attr_defaultpivotstyle TYPE string VALUE 'defaultPivotStyle', - lc_xml_attr_applyalignment TYPE string VALUE 'applyAlignment', - lc_xml_attr_horizontal TYPE string VALUE 'horizontal', - lc_xml_attr_formatcode TYPE string VALUE 'formatCode', - lc_xml_attr_vertical TYPE string VALUE 'vertical', - lc_xml_attr_wraptext TYPE string VALUE 'wrapText', - lc_xml_attr_textrotation TYPE string VALUE 'textRotation', - lc_xml_attr_shrinktofit TYPE string VALUE 'shrinkToFit', - lc_xml_attr_indent TYPE string VALUE 'indent', - lc_xml_attr_locked TYPE string VALUE 'locked', - lc_xml_attr_hidden TYPE string VALUE 'hidden', - lc_xml_attr_diagonalup TYPE string VALUE 'diagonalUp', - lc_xml_attr_diagonaldown TYPE string VALUE 'diagonalDown', - " Node namespace - lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element_fonts TYPE REF TO if_ixml_element, - lo_element_font TYPE REF TO if_ixml_element, - lo_element_fills TYPE REF TO if_ixml_element, - lo_element_fill TYPE REF TO if_ixml_element, - lo_element_borders TYPE REF TO if_ixml_element, - lo_element_border TYPE REF TO if_ixml_element, - lo_element_numfmts TYPE REF TO if_ixml_element, - lo_element_numfmt TYPE REF TO if_ixml_element, - lo_element_cellxfs TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_sub_element TYPE REF TO if_ixml_element, - lo_sub_element_2 TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_iterator2 TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_conditional TYPE REF TO zcl_excel_style_conditional, - lo_style TYPE REF TO zcl_excel_style. - - - DATA: lt_fonts TYPE zexcel_t_style_font, - ls_font TYPE zexcel_s_style_font, - lt_fills TYPE zexcel_t_style_fill, - ls_fill TYPE zexcel_s_style_fill, - lt_borders TYPE zexcel_t_style_border, - ls_border TYPE zexcel_s_style_border, - lt_numfmts TYPE zexcel_t_style_numfmt, - ls_numfmt TYPE zexcel_s_style_numfmt, - lt_protections TYPE zexcel_t_style_protection, - ls_protection TYPE zexcel_s_style_protection, - lt_alignments TYPE zexcel_t_style_alignment, - ls_alignment TYPE zexcel_s_style_alignment, - lt_cellxfs TYPE zexcel_t_cellxfs, - ls_cellxfs TYPE zexcel_s_cellxfs, - ls_styles_mapping TYPE zexcel_s_styles_mapping, - ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping, - ls_cellis TYPE zexcel_conditional_cellis, - ls_expression TYPE zexcel_conditional_expression, - lt_colors TYPE zexcel_t_style_color_argb, - ls_color LIKE LINE OF lt_colors. - - DATA: lv_value TYPE string, - lv_dfx_count TYPE i, - lv_fonts_count TYPE i, - lv_fills_count TYPE i, - lv_borders_count TYPE i, - lv_cellxfs_count TYPE i, - lv_index TYPE i, - lv_align_flag TYPE c. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -*********************************************************************** -* STEP 3: Create main node relationships - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_stylesheet - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_ns ). - -********************************************************************** -* STEP 4: Create subnodes - - lo_element_fonts = lo_document->create_simple_element( name = lc_xml_node_fonts - parent = lo_document ). - - lo_element_fills = lo_document->create_simple_element( name = lc_xml_node_fills - parent = lo_document ). - - lo_element_borders = lo_document->create_simple_element( name = lc_xml_node_borders - parent = lo_document ). - - lo_element_cellxfs = lo_document->create_simple_element( name = lc_xml_node_cellxfs - parent = lo_document ). - - lo_element_numfmts = lo_document->create_simple_element( name = lc_xml_node_numfmts - parent = lo_document ). - - -* Compress styles - lo_iterator = excel->get_styles_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_style ?= lo_iterator->if_object_collection_iterator~get_next( ). - ls_font = lo_style->font->get_structure( ). - ls_fill = lo_style->fill->get_structure( ). - ls_border = lo_style->borders->get_structure( ). - ls_alignment = lo_style->alignment->get_structure( ). - ls_protection = lo_style->protection->get_structure( ). - ls_numfmt = lo_style->number_format->get_structure( ). - - CLEAR ls_cellxfs. - - -* Compress fonts - READ TABLE lt_fonts FROM ls_font TRANSPORTING NO FIELDS. - IF sy-subrc EQ 0. - ls_cellxfs-fontid = sy-tabix. - ELSE. - APPEND ls_font TO lt_fonts. - DESCRIBE TABLE lt_fonts LINES ls_cellxfs-fontid. - ENDIF. - SUBTRACT 1 FROM ls_cellxfs-fontid. - -* Compress alignment - READ TABLE lt_alignments FROM ls_alignment TRANSPORTING NO FIELDS. - IF sy-subrc EQ 0. - ls_cellxfs-alignmentid = sy-tabix. - ELSE. - APPEND ls_alignment TO lt_alignments. - DESCRIBE TABLE lt_alignments LINES ls_cellxfs-alignmentid. - ENDIF. - SUBTRACT 1 FROM ls_cellxfs-alignmentid. - -* Compress fills - READ TABLE lt_fills FROM ls_fill TRANSPORTING NO FIELDS. - IF sy-subrc EQ 0. - ls_cellxfs-fillid = sy-tabix. - ELSE. - APPEND ls_fill TO lt_fills. - DESCRIBE TABLE lt_fills LINES ls_cellxfs-fillid. - ENDIF. - SUBTRACT 1 FROM ls_cellxfs-fillid. - -* Compress borders - READ TABLE lt_borders FROM ls_border TRANSPORTING NO FIELDS. - IF sy-subrc EQ 0. - ls_cellxfs-borderid = sy-tabix. - ELSE. - APPEND ls_border TO lt_borders. - DESCRIBE TABLE lt_borders LINES ls_cellxfs-borderid. - ENDIF. - SUBTRACT 1 FROM ls_cellxfs-borderid. - -* Compress protection - IF ls_protection-locked EQ c_on AND ls_protection-hidden EQ c_off. - ls_cellxfs-applyprotection = 0. - ELSE. - READ TABLE lt_protections FROM ls_protection TRANSPORTING NO FIELDS. - IF sy-subrc EQ 0. - ls_cellxfs-protectionid = sy-tabix. - ELSE. - APPEND ls_protection TO lt_protections. - DESCRIBE TABLE lt_protections LINES ls_cellxfs-protectionid. - ENDIF. - ls_cellxfs-applyprotection = 1. - ENDIF. - SUBTRACT 1 FROM ls_cellxfs-protectionid. - -* Compress number formats - - "----------- - IF ls_numfmt-numfmt NE zcl_excel_style_number_format=>c_format_date_std." and ls_numfmt-NUMFMT ne 'STD_NDEC'. " ALE Changes on going - "--- - IF ls_numfmt IS NOT INITIAL. - - READ TABLE lt_numfmts FROM ls_numfmt TRANSPORTING NO FIELDS. - IF sy-subrc EQ 0. - ls_cellxfs-numfmtid = sy-tabix. - ELSE. - APPEND ls_numfmt TO lt_numfmts. - DESCRIBE TABLE lt_numfmts LINES ls_cellxfs-numfmtid. - ENDIF. - ADD zcl_excel_common=>c_excel_numfmt_offset TO ls_cellxfs-numfmtid. " Add OXML offset for custom styles - ls_cellxfs-applynumberformat = 1. - ELSE. - ls_cellxfs-applynumberformat = 0. - ENDIF. - "----------- " ALE changes on going - ELSE. - ls_cellxfs-applynumberformat = 1. - IF ls_numfmt-numfmt EQ zcl_excel_style_number_format=>c_format_date_std. - ls_cellxfs-numfmtid = 14. -* elseif ls_numfmt-NUMFMT eq 'STD_NDEC'. -* ls_cellxfs-numfmtid = 2. - ENDIF. - ENDIF. - "--- - - IF ls_cellxfs-fontid NE 0. - ls_cellxfs-applyfont = 1. - ELSE. - ls_cellxfs-applyfont = 0. - ENDIF. - IF ls_cellxfs-alignmentid NE 0. - ls_cellxfs-applyalignment = 1. - ELSE. - ls_cellxfs-applyalignment = 0. - ENDIF. - IF ls_cellxfs-fillid NE 0. - ls_cellxfs-applyfill = 1. - ELSE. - ls_cellxfs-applyfill = 0. - ENDIF. - IF ls_cellxfs-borderid NE 0. - ls_cellxfs-applyborder = 1. - ELSE. - ls_cellxfs-applyborder = 0. - ENDIF. - -* Remap styles - READ TABLE lt_cellxfs FROM ls_cellxfs TRANSPORTING NO FIELDS. - IF sy-subrc EQ 0. - ls_styles_mapping-style = sy-tabix. - ELSE. - APPEND ls_cellxfs TO lt_cellxfs. - DESCRIBE TABLE lt_cellxfs LINES ls_styles_mapping-style. - ENDIF. - SUBTRACT 1 FROM ls_styles_mapping-style. - ls_styles_mapping-guid = lo_style->get_guid( ). - APPEND ls_styles_mapping TO me->styles_mapping. - ENDWHILE. - - " create numfmt elements - LOOP AT lt_numfmts INTO ls_numfmt. - lo_element_numfmt = lo_document->create_simple_element( name = lc_xml_node_numfmt - parent = lo_document ). - lv_value = sy-tabix + zcl_excel_common=>c_excel_numfmt_offset. - CONDENSE lv_value. - lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_numfmtid - value = lv_value ). - lv_value = ls_numfmt-numfmt. -* REPLACE ALL OCCURRENCES OF '.' IN lv_value WITH '\.'. - lo_element_numfmt->set_attribute_ns( name = lc_xml_attr_formatcode - value = lv_value ). - lo_element_numfmts->append_child( new_child = lo_element_numfmt ). - ENDLOOP. - - " create font elements - LOOP AT lt_fonts INTO ls_font. - lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font - parent = lo_document ). - IF ls_font-bold EQ abap_true. - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_b - parent = lo_document ). - lo_element_font->append_child( new_child = lo_sub_element ). - ENDIF. - IF ls_font-italic EQ abap_true. - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_i - parent = lo_document ). - lo_element_font->append_child( new_child = lo_sub_element ). - ENDIF. - IF ls_font-underline EQ abap_true. - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_u - parent = lo_document ). - lv_value = ls_font-underline_mode. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_font->append_child( new_child = lo_sub_element ). - ENDIF. - IF ls_font-strikethrough EQ abap_true. - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_strike - parent = lo_document ). - lo_element_font->append_child( new_child = lo_sub_element ). - ENDIF. - "size - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_sz - parent = lo_document ). - lv_value = ls_font-size. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_font->append_child( new_child = lo_sub_element ). - "color - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_element_font - is_color = ls_font-color ). - - "name - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_name - parent = lo_document ). - lv_value = ls_font-name. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_font->append_child( new_child = lo_sub_element ). - "family - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_family - parent = lo_document ). - lv_value = ls_font-family. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_font->append_child( new_child = lo_sub_element ). - "scheme - IF ls_font-scheme IS NOT INITIAL. - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_scheme - parent = lo_document ). - lv_value = ls_font-scheme. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_font->append_child( new_child = lo_sub_element ). - ENDIF. - lo_element_fonts->append_child( new_child = lo_element_font ). - ENDLOOP. - - " create fill elements - LOOP AT lt_fills INTO ls_fill. - lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill - parent = lo_document ). - "pattern - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill - parent = lo_document ). - lv_value = ls_fill-filltype. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_patterntype - value = lv_value ). - " fgcolor - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element - is_color = ls_fill-fgcolor - iv_color_elem_name = lc_xml_node_fgcolor ). - - IF ls_fill-fgcolor-rgb IS INITIAL AND - ls_fill-fgcolor-indexed EQ zcl_excel_style_color=>c_indexed_not_set AND - ls_fill-fgcolor-theme EQ zcl_excel_style_color=>c_theme_not_set AND - ls_fill-fgcolor-tint IS INITIAL AND ls_fill-bgcolor-indexed EQ zcl_excel_style_color=>c_indexed_sys_foreground. - - " bgcolor - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element - is_color = ls_fill-bgcolor - iv_color_elem_name = lc_xml_node_bgcolor ). - - ENDIF. - - lo_element_fill->append_child( new_child = lo_sub_element )."pattern - lo_element_fills->append_child( new_child = lo_element_fill ). - ENDLOOP. - - " create border elements - LOOP AT lt_borders INTO ls_border. - lo_element_border = lo_document->create_simple_element( name = lc_xml_node_border - parent = lo_document ). - - IF ls_border-diagonalup IS NOT INITIAL. - lv_value = ls_border-diagonalup. - CONDENSE lv_value. - lo_element_border->set_attribute_ns( name = lc_xml_attr_diagonalup - value = lv_value ). - ENDIF. - - IF ls_border-diagonaldown IS NOT INITIAL. - lv_value = ls_border-diagonaldown. - CONDENSE lv_value. - lo_element_border->set_attribute_ns( name = lc_xml_attr_diagonaldown - value = lv_value ). - ENDIF. - - "left - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_left - parent = lo_document ). - IF ls_border-left_style IS NOT INITIAL. - lv_value = ls_border-left_style. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - ENDIF. - - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element - is_color = ls_border-left_color ). - - lo_element_border->append_child( new_child = lo_sub_element ). - - "right - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_right - parent = lo_document ). - IF ls_border-right_style IS NOT INITIAL. - lv_value = ls_border-right_style. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - ENDIF. - - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element - is_color = ls_border-right_color ). - - lo_element_border->append_child( new_child = lo_sub_element ). - - "top - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_top - parent = lo_document ). - IF ls_border-top_style IS NOT INITIAL. - lv_value = ls_border-top_style. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - ENDIF. - - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element - is_color = ls_border-top_color ). - - lo_element_border->append_child( new_child = lo_sub_element ). - - "bottom - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_bottom - parent = lo_document ). - IF ls_border-bottom_style IS NOT INITIAL. - lv_value = ls_border-bottom_style. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - ENDIF. - - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element - is_color = ls_border-bottom_color ). - - lo_element_border->append_child( new_child = lo_sub_element ). - - "diagonal - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_diagonal - parent = lo_document ). - IF ls_border-diagonal_style IS NOT INITIAL. - lv_value = ls_border-diagonal_style. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - ENDIF. - - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element - is_color = ls_border-diagonal_color ). - - lo_element_border->append_child( new_child = lo_sub_element ). - lo_element_borders->append_child( new_child = lo_element_border ). - ENDLOOP. - - " update attribute "count" - DESCRIBE TABLE lt_fonts LINES lv_fonts_count. - MOVE lv_fonts_count TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_fonts->set_attribute_ns( name = lc_xml_attr_count - value = lv_value ). - DESCRIBE TABLE lt_fills LINES lv_fills_count. - MOVE lv_fills_count TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_fills->set_attribute_ns( name = lc_xml_attr_count - value = lv_value ). - DESCRIBE TABLE lt_borders LINES lv_borders_count. - MOVE lv_borders_count TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_borders->set_attribute_ns( name = lc_xml_attr_count - value = lv_value ). - DESCRIBE TABLE lt_cellxfs LINES lv_cellxfs_count. - MOVE lv_cellxfs_count TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_cellxfs->set_attribute_ns( name = lc_xml_attr_count - value = lv_value ). - - " Append to root node - lo_element_root->append_child( new_child = lo_element_numfmts ). - lo_element_root->append_child( new_child = lo_element_fonts ). - lo_element_root->append_child( new_child = lo_element_fills ). - lo_element_root->append_child( new_child = lo_element_borders ). - - " cellstylexfs node - lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstylexfs - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_count - value = '1' ). - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_xf - parent = lo_document ). - - lo_sub_element->set_attribute_ns( name = lc_xml_attr_numfmtid - value = c_off ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_fontid - value = c_off ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_fillid - value = c_off ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_borderid - value = c_off ). - - lo_element->append_child( new_child = lo_sub_element ). - lo_element_root->append_child( new_child = lo_element ). - - LOOP AT lt_cellxfs INTO ls_cellxfs. - lo_element = lo_document->create_simple_element( name = lc_xml_node_xf - parent = lo_document ). - MOVE ls_cellxfs-numfmtid TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_numfmtid - value = lv_value ). - MOVE ls_cellxfs-fontid TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_fontid - value = lv_value ). - MOVE ls_cellxfs-fillid TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_fillid - value = lv_value ). - MOVE ls_cellxfs-borderid TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_borderid - value = lv_value ). - MOVE ls_cellxfs-xfid TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_xfid - value = lv_value ). - IF ls_cellxfs-applynumberformat EQ 1. - MOVE ls_cellxfs-applynumberformat TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_applynumberformat - value = lv_value ). - ENDIF. - IF ls_cellxfs-applyfont EQ 1. - MOVE ls_cellxfs-applyfont TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_applyfont - value = lv_value ). - ENDIF. - IF ls_cellxfs-applyfill EQ 1. - MOVE ls_cellxfs-applyfill TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_applyfill - value = lv_value ). - ENDIF. - IF ls_cellxfs-applyborder EQ 1. - MOVE ls_cellxfs-applyborder TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_applyborder - value = lv_value ). - ENDIF. - IF ls_cellxfs-applyalignment EQ 1. " depends on each style not for all the sheet - MOVE ls_cellxfs-applyalignment TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element->set_attribute_ns( name = lc_xml_attr_applyalignment - value = lv_value ). - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_alignment - parent = lo_document ). - ADD 1 TO ls_cellxfs-alignmentid. "Table index starts from 1 - READ TABLE lt_alignments INTO ls_alignment INDEX ls_cellxfs-alignmentid. - SUBTRACT 1 FROM ls_cellxfs-alignmentid. - IF ls_alignment-horizontal IS NOT INITIAL. - MOVE ls_alignment-horizontal TO lv_value. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_horizontal - value = lv_value ). - ENDIF. - IF ls_alignment-vertical IS NOT INITIAL. - MOVE ls_alignment-vertical TO lv_value. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_vertical - value = lv_value ). - ENDIF. - IF ls_alignment-wraptext EQ abap_true. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_wraptext - value = c_on ). - ENDIF. - IF ls_alignment-textrotation IS NOT INITIAL. - MOVE ls_alignment-textrotation TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_textrotation - value = lv_value ). - ENDIF. - IF ls_alignment-shrinktofit EQ abap_true. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_shrinktofit - value = c_on ). - ENDIF. - IF ls_alignment-indent IS NOT INITIAL. - MOVE ls_alignment-indent TO lv_value. - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_indent - value = lv_value ). - ENDIF. - - lo_element->append_child( new_child = lo_sub_element_2 ). - ENDIF. - IF ls_cellxfs-applyprotection EQ 1. - MOVE ls_cellxfs-applyprotection TO lv_value. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_applyprotection - value = lv_value ). - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_protection - parent = lo_document ). - ADD 1 TO ls_cellxfs-protectionid. "Table index starts from 1 - READ TABLE lt_protections INTO ls_protection INDEX ls_cellxfs-protectionid. - SUBTRACT 1 FROM ls_cellxfs-protectionid. - IF ls_protection-locked IS NOT INITIAL. - MOVE ls_protection-locked TO lv_value. - CONDENSE lv_value. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_locked - value = lv_value ). - ENDIF. - IF ls_protection-hidden IS NOT INITIAL. - MOVE ls_protection-hidden TO lv_value. - CONDENSE lv_value. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_hidden - value = lv_value ). - ENDIF. - lo_element->append_child( new_child = lo_sub_element_2 ). - ENDIF. - lo_element_cellxfs->append_child( new_child = lo_element ). - ENDLOOP. - - lo_element_root->append_child( new_child = lo_element_cellxfs ). - - " cellStyles node - lo_element = lo_document->create_simple_element( name = lc_xml_node_cellstyles - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_count - value = '1' ). - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_cellstyle - parent = lo_document ). - - lo_sub_element->set_attribute_ns( name = lc_xml_attr_name - value = 'Normal' ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_xfid - value = c_off ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_builtinid - value = c_off ). - - lo_element->append_child( new_child = lo_sub_element ). - lo_element_root->append_child( new_child = lo_element ). - - " dxfs node - lo_element = lo_document->create_simple_element( name = lc_xml_node_dxfs - parent = lo_document ). - - lo_iterator = me->excel->get_worksheets_iterator( ). - " get sheets - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - " Conditional formatting styles into exch sheet - lo_iterator2 = lo_worksheet->get_cond_styles_iterator( ). - WHILE lo_iterator2->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_style_conditional ?= lo_iterator2->if_object_collection_iterator~get_next( ). - CASE lo_style_conditional->rule. - WHEN zcl_excel_style_conditional=>c_rule_cellis. - "if style defined - ls_cellis = lo_style_conditional->mode_cellis. - IF ls_cellis-cell_style IS INITIAL. - CONTINUE. - ENDIF. - READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = ls_cellis-cell_style. - ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0 - READ TABLE lt_cellxfs INTO ls_cellxfs INDEX ls_styles_mapping-style. - ADD 1 TO ls_cellxfs-fillid. " the numbering starts from 0 - - " Style already mapped? - READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY style = ls_styles_mapping-style. - IF sy-subrc EQ 0. - ls_style_cond_mapping-guid = ls_cellis-cell_style. - APPEND ls_style_cond_mapping TO me->styles_cond_mapping. - ELSE. - ls_style_cond_mapping-guid = ls_cellis-cell_style. - ls_style_cond_mapping-style = ls_styles_mapping-style. - ls_style_cond_mapping-dxf = lv_dfx_count. - APPEND ls_style_cond_mapping TO me->styles_cond_mapping. - ADD 1 TO lv_dfx_count. - - " dxf node - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_dxf - parent = lo_document ). - - "Conditional formatting font style correction by Alessandro Iannacci START - lv_index = ls_cellxfs-fontid + 1. - READ TABLE lt_fonts INTO ls_font INDEX lv_index. - IF ls_font IS NOT INITIAL. - lo_element_font = lo_document->create_simple_element( name = lc_xml_node_font - parent = lo_document ). - IF ls_font-bold EQ abap_true. - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_b - parent = lo_document ). - lo_element_font->append_child( new_child = lo_sub_element_2 ). - ENDIF. - IF ls_font-italic EQ abap_true. - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_i - parent = lo_document ). - lo_element_font->append_child( new_child = lo_sub_element_2 ). - ENDIF. - IF ls_font-underline EQ abap_true. - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_u - parent = lo_document ). - lv_value = ls_font-underline_mode. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_val - value = lv_value ). - lo_element_font->append_child( new_child = lo_sub_element_2 ). - ENDIF. - IF ls_font-strikethrough EQ abap_true. - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_strike - parent = lo_document ). - lo_element_font->append_child( new_child = lo_sub_element_2 ). - ENDIF. - "color - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_element_font - is_color = ls_font-color ). - lo_sub_element->append_child( new_child = lo_element_font ). - ENDIF. - "---Conditional formatting font style correction by Alessandro Iannacci END - - - READ TABLE lt_fills INTO ls_fill INDEX ls_cellxfs-fillid. - IF ls_fill IS NOT INITIAL. - " fill properties - lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill - parent = lo_document ). - "pattern - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_patternfill - parent = lo_document ). - lv_value = ls_fill-filltype. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_patterntype - value = lv_value ). - " fgcolor - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element_2 - is_color = ls_fill-fgcolor - iv_color_elem_name = lc_xml_node_fgcolor ). - - IF ls_fill-fgcolor-rgb IS INITIAL AND - ls_fill-fgcolor-indexed EQ zcl_excel_style_color=>c_indexed_not_set AND - ls_fill-fgcolor-theme EQ zcl_excel_style_color=>c_theme_not_set AND - ls_fill-fgcolor-tint IS INITIAL AND ls_fill-bgcolor-indexed EQ zcl_excel_style_color=>c_indexed_sys_foreground. - - " bgcolor - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element_2 - is_color = ls_fill-bgcolor - iv_color_elem_name = lc_xml_node_bgcolor ). - - ENDIF. - - lo_element_fill->append_child( new_child = lo_sub_element_2 ). "pattern - - lo_sub_element->append_child( new_child = lo_element_fill ). - ENDIF. - ENDIF. - - lo_element->append_child( new_child = lo_sub_element ). - WHEN zcl_excel_style_conditional=>c_rule_expression. - "if style defined - ls_expression = lo_style_conditional->mode_expression. - IF ls_expression-cell_style IS INITIAL. - CONTINUE. - ENDIF. - READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = ls_expression-cell_style. - ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0 - READ TABLE lt_cellxfs INTO ls_cellxfs INDEX ls_styles_mapping-style. - ADD 1 TO ls_cellxfs-fillid. " the numbering starts from 0 - - READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY style = ls_styles_mapping-style. - IF sy-subrc EQ 0. - ls_style_cond_mapping-guid = ls_expression-cell_style. - APPEND ls_style_cond_mapping TO me->styles_cond_mapping. - ELSE. - ls_style_cond_mapping-guid = ls_expression-cell_style. - ls_style_cond_mapping-style = ls_styles_mapping-style. - ls_style_cond_mapping-dxf = lv_dfx_count. - APPEND ls_style_cond_mapping TO me->styles_cond_mapping. - ADD 1 TO lv_dfx_count. - - " dxf node - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_dxf - parent = lo_document ). - - READ TABLE lt_fills INTO ls_fill INDEX ls_cellxfs-fillid. - IF ls_fill IS NOT INITIAL. - " fill properties - lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill - parent = lo_document ). - "pattern - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_patternfill - parent = lo_document ). - lv_value = ls_fill-filltype. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_patterntype - value = lv_value ). - " fgcolor - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element_2 - is_color = ls_fill-fgcolor - iv_color_elem_name = lc_xml_node_fgcolor ). - - IF ls_fill-fgcolor-rgb IS INITIAL AND - ls_fill-fgcolor-indexed EQ zcl_excel_style_color=>c_indexed_not_set AND - ls_fill-fgcolor-theme EQ zcl_excel_style_color=>c_theme_not_set AND - ls_fill-fgcolor-tint IS INITIAL AND ls_fill-bgcolor-indexed EQ zcl_excel_style_color=>c_indexed_sys_foreground. - - " bgcolor - create_xl_styles_color_node( - io_document = lo_document - io_parent = lo_sub_element_2 - is_color = ls_fill-bgcolor - iv_color_elem_name = lc_xml_node_bgcolor ). - - ENDIF. - - lo_element_fill->append_child( new_child = lo_sub_element_2 ). "pattern - - lo_sub_element->append_child( new_child = lo_element_fill ). - ENDIF. - ENDIF. - - lo_element->append_child( new_child = lo_sub_element ). - WHEN OTHERS. - CONTINUE. - ENDCASE. - ENDWHILE. - ENDWHILE. - - lv_value = lv_dfx_count. - CONDENSE lv_value. - lo_element->set_attribute_ns( name = lc_xml_attr_count - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - - " tableStyles node - lo_element = lo_document->create_simple_element( name = lc_xml_node_tablestyles - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_count - value = '0' ). - lo_element->set_attribute_ns( name = lc_xml_attr_defaulttablestyle - value = zcl_excel_table=>builtinstyle_medium9 ). - lo_element->set_attribute_ns( name = lc_xml_attr_defaultpivotstyle - value = zcl_excel_table=>builtinstyle_pivot_light16 ). - lo_element_root->append_child( new_child = lo_element ). - - "write legacy color palette in case any indexed color was changed - IF excel->legacy_palette->is_modified( ) = abap_true. - lo_element = lo_document->create_simple_element( name = lc_xml_node_colors - parent = lo_document ). - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_indexedcolors - parent = lo_document ). - lo_element->append_child( new_child = lo_sub_element ). - - lt_colors = excel->legacy_palette->get_colors( ). - LOOP AT lt_colors INTO ls_color. - lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_rgbcolor - parent = lo_document ). - lv_value = ls_color. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_rgb - value = lv_value ). - lo_sub_element->append_child( new_child = lo_sub_element_2 ). - ENDLOOP. - - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - -ENDMETHOD. - - - - - - - METHOD create_xl_styles_color_node. - DATA: lo_sub_element TYPE REF TO if_ixml_element, - lv_value TYPE string. - - CONSTANTS: lc_xml_attr_theme TYPE string VALUE 'theme', - lc_xml_attr_rgb TYPE string VALUE 'rgb', - lc_xml_attr_indexed TYPE string VALUE 'indexed', - lc_xml_attr_tint TYPE string VALUE 'tint'. - - "add node only if at least one attribute is set - CHECK is_color-rgb IS NOT INITIAL OR - is_color-indexed <> zcl_excel_style_color=>c_indexed_not_set OR - is_color-theme <> zcl_excel_style_color=>c_theme_not_set OR - is_color-tint IS NOT INITIAL. - - lo_sub_element = io_document->create_simple_element( - name = iv_color_elem_name - parent = io_parent ). - - IF is_color-rgb IS NOT INITIAL. - lv_value = is_color-rgb. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_rgb - value = lv_value ). - ENDIF. - - IF is_color-indexed <> zcl_excel_style_color=>c_indexed_not_set. - lv_value = zcl_excel_common=>number_to_excel_string( is_color-indexed ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_indexed - value = lv_value ). - ENDIF. - - IF is_color-theme <> zcl_excel_style_color=>c_theme_not_set. - lv_value = zcl_excel_common=>number_to_excel_string( is_color-theme ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_theme - value = lv_value ). - ENDIF. - - IF is_color-tint IS NOT INITIAL. - lv_value = zcl_excel_common=>number_to_excel_string( is_color-tint ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_tint - value = lv_value ). - ENDIF. - - io_parent->append_child( new_child = lo_sub_element ). -ENDMETHOD. - - - - - METHOD create_xl_table. - - DATA: lc_xml_node_table TYPE string VALUE 'table', - lc_xml_node_relationship TYPE string VALUE 'Relationship', - " Node attributes - lc_xml_attr_id TYPE string VALUE 'id', - lc_xml_attr_name TYPE string VALUE 'name', - lc_xml_attr_display_name TYPE string VALUE 'displayName', - lc_xml_attr_ref TYPE string VALUE 'ref', - lc_xml_attr_totals TYPE string VALUE 'totalsRowShown', - " Node namespace - lc_xml_node_table_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', - " Node id - lc_xml_node_ridx_id TYPE string VALUE 'rId#'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_element2 TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - - lv_table_name TYPE string, - lv_id TYPE i, - lv_match TYPE i, - lv_syindex TYPE char3, - lv_ref TYPE string, - lv_value TYPE string, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lv_num_columns TYPE i, - ls_fieldcat TYPE zexcel_s_fieldcatalog. - - -********************************************************************** -* STEP 1: Create xml - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node table - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_table - parent = lo_document ). - - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_table_ns ). - - lv_id = io_table->get_id( ). - lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_id ). - lo_element_root->set_attribute_ns( name = lc_xml_attr_id - value = lv_value ). - - FIND ALL OCCURRENCES OF REGEX '[^_a-zA-Z0-9]' IN io_table->settings-table_name IGNORING CASE MATCH COUNT lv_match. - IF io_table->settings-table_name IS NOT INITIAL AND lv_match EQ 0. - lv_table_name = io_table->settings-table_name. - ELSE. - lv_table_name = io_table->get_name( ). - ENDIF. - lo_element_root->set_attribute_ns( name = lc_xml_attr_name - value = lv_table_name ). - - lo_element_root->set_attribute_ns( name = lc_xml_attr_display_name - value = lv_table_name ). - - lv_ref = io_table->get_reference( ). - lo_element_root->set_attribute_ns( name = lc_xml_attr_ref - value = lv_ref ). - IF io_table->has_totals( ) = abap_true. - lo_element_root->set_attribute_ns( name = 'totalsRowCount' - value = '1' ). - ELSE. - lo_element_root->set_attribute_ns( name = lc_xml_attr_totals - value = '0' ). - ENDIF. - -********************************************************************** -* STEP 4: Create subnodes - - " autoFilter - IF io_table->settings-nofilters EQ abap_false. - lo_element = lo_document->create_simple_element( name = 'autoFilter' - parent = lo_document ). - - lv_ref = io_table->get_reference( ip_include_totals_row = abap_false ). - lo_element->set_attribute_ns( name = 'ref' - value = lv_ref ). - - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - "columns - lo_element = lo_document->create_simple_element( name = 'tableColumns' - parent = lo_document ). - -* lo_columns = io_table->get_columns( ). - LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. - ADD 1 TO lv_num_columns. - ENDLOOP. - - lv_value = lv_num_columns. - CONDENSE lv_value. - lo_element->set_attribute_ns( name = 'count' - value = lv_value ). - - lo_element_root->append_child( new_child = lo_element ). - - LOOP AT io_table->fieldcat INTO ls_fieldcat WHERE dynpfld = abap_true. - lo_element2 = lo_document->create_simple_element_ns( name = 'tableColumn' - parent = lo_element ). - - lv_value = ls_fieldcat-position. - SHIFT lv_value LEFT DELETING LEADING '0'. - lo_element2->set_attribute_ns( name = 'id' - value = lv_value ). - lv_value = ls_fieldcat-scrtext_l. - lo_element2->set_attribute_ns( name = 'name' - value = lv_value ). - - IF ls_fieldcat-totals_function IS NOT INITIAL. - lo_element2->set_attribute_ns( name = 'totalsRowFunction' - value = ls_fieldcat-totals_function ). - ENDIF. - - lo_element->append_child( new_child = lo_element2 ). - ENDLOOP. - - - lo_element = lo_document->create_simple_element( name = 'tableStyleInfo' - parent = lo_element_root ). - - lo_element->set_attribute_ns( name = 'name' - value = io_table->settings-table_style ). - - lo_element->set_attribute_ns( name = 'showFirstColumn' - value = '0' ). - - lo_element->set_attribute_ns( name = 'showLastColumn' - value = '0' ). - - IF io_table->settings-show_row_stripes = abap_true. - lv_value = '1'. - ELSE. - lv_value = '0'. - ENDIF. - - lo_element->set_attribute_ns( name = 'showRowStripes' - value = lv_value ). - - IF io_table->settings-show_column_stripes = abap_true. - lv_value = '1'. - ELSE. - lv_value = '0'. - ENDIF. - - lo_element->set_attribute_ns( name = 'showColumnStripes' - value = lv_value ). - - lo_element_root->append_child( new_child = lo_element ). -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - -ENDMETHOD. - - - - method CREATE_XL_THEME. - - -* @TODO * - - DATA: lv_xl_theme TYPE string, - lv_xl_theme_01 TYPE string, - lv_xl_theme_02 TYPE string, - lv_xl_theme_03 TYPE string, - lv_xl_theme_04 TYPE string, - lv_xl_theme_05 TYPE string, - lv_xl_theme_06 TYPE string, - lv_xl_theme_07 TYPE string, - lv_xl_theme_08 TYPE string, - lv_xl_theme_09 TYPE string, - lv_xl_theme_10 TYPE string, - lv_xl_theme_11 TYPE string, - lv_xl_theme_12 TYPE string, - lv_xl_theme_13 TYPE string, - lv_xl_theme_14 TYPE string, - lv_xl_theme_15 TYPE string, - lv_xl_theme_16 TYPE string, - lv_xl_theme_17 TYPE string, - lv_xl_theme_18 TYPE string, - lv_xl_theme_19 TYPE string, - lv_xl_theme_20 TYPE string, - lv_xl_theme_21 TYPE string, - lv_xl_theme_22 TYPE string, - lv_xl_theme_23 TYPE string, - lv_xl_theme_24 TYPE string, - lv_xl_theme_25 TYPE string, - lv_xl_theme_26 TYPE string, - lv_xl_theme_27 TYPE string, - lv_xl_theme_28 TYPE string, - lv_xl_theme_29 TYPE string, - lv_xl_theme_30 TYPE string, - lv_xl_theme_31 TYPE string, - lv_xl_theme_32 TYPE string. - - lv_xl_theme_01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'. - lv_xl_theme_02 = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" '. - lv_xl_theme_03 = 'lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr '. - lv_xl_theme_04 = 'val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink>'. - lv_xl_theme_05 = '<a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/>'. - lv_xl_theme_06 = '<a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" '. - lv_xl_theme_07 = 'typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font '. - lv_xl_theme_08 = 'script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" '. - lv_xl_theme_09 = 'typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. - lv_xl_theme_10 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. - lv_xl_theme_11 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/>'. - lv_xl_theme_12 = '<a:font script="Arab" typeface="Arial"/><a:font script="Hebr" '. - lv_xl_theme_13 = 'typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font '. - lv_xl_theme_14 = 'script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font '. - lv_xl_theme_15 = 'script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" '. - lv_xl_theme_16 = 'typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" '. - lv_xl_theme_17 = 'typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. - lv_xl_theme_18 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod '. - lv_xl_theme_19 = 'val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1">'. - lv_xl_theme_20 = '<a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs '. - lv_xl_theme_21 = 'pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" '. - lv_xl_theme_22 = 'algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr '. - lv_xl_theme_23 = 'val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst>'. - lv_xl_theme_24 = '<a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst>'. - lv_xl_theme_25 = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" '. - lv_xl_theme_26 = 'dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig '. - lv_xl_theme_27 = 'rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/>'. - lv_xl_theme_28 = '</a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade '. - lv_xl_theme_29 = 'val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" '. - lv_xl_theme_30 = 't="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr '. - lv_xl_theme_31 = 'val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme>'. - lv_xl_theme_32 = '</a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>'. - - - CONCATENATE lv_xl_theme_01 lv_xl_theme_02 lv_xl_theme_03 lv_xl_theme_04 lv_xl_theme_05 lv_xl_theme_06 lv_xl_theme_07 lv_xl_theme_08 lv_xl_theme_09 lv_xl_theme_10 lv_xl_theme_11 lv_xl_theme_12 lv_xl_theme_13 lv_xl_theme_14 lv_xl_theme_15 - lv_xl_theme_16 lv_xl_theme_17 lv_xl_theme_18 lv_xl_theme_19 lv_xl_theme_20 lv_xl_theme_21 lv_xl_theme_22 lv_xl_theme_23 lv_xl_theme_24 lv_xl_theme_25 lv_xl_theme_26 lv_xl_theme_27 lv_xl_theme_28 lv_xl_theme_29 lv_xl_theme_30 - lv_xl_theme_31 lv_xl_theme_32 - INTO lv_xl_theme SEPARATED BY space. - - CALL FUNCTION 'SCMS_STRING_TO_XSTRING' - EXPORTING - text = lv_xl_theme - IMPORTING - buffer = ep_content. - - - endmethod. - - - - method CREATE_XL_WORKBOOK. -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmöcker, (done) 2012-11-07 -* - ... -* changes: aligning code -* adding comments to explain what we are trying to achieve -*--------------------------------------------------------------------* -* issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-01 -* changes: correction of pointer to localSheetId -*--------------------------------------------------------------------* - -** Constant node name - DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', - lc_xml_node_fileversion TYPE string VALUE 'fileVersion', - lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', - lc_xml_node_bookviews TYPE string VALUE 'bookViews', - lc_xml_node_workbookview TYPE string VALUE 'workbookView', - lc_xml_node_sheets TYPE string VALUE 'sheets', - lc_xml_node_sheet TYPE string VALUE 'sheet', - lc_xml_node_calcpr TYPE string VALUE 'calcPr', - lc_xml_node_workbookprotection TYPE string VALUE 'workbookProtection', - lc_xml_node_definednames TYPE string VALUE 'definedNames', - lc_xml_node_definedname TYPE string VALUE 'definedName', - " Node attributes - lc_xml_attr_appname TYPE string VALUE 'appName', - lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', - lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', - lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', - lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', - lc_xml_attr_xwindow TYPE string VALUE 'xWindow', - lc_xml_attr_ywindow TYPE string VALUE 'yWindow', - lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', - lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', - lc_xml_attr_activetab TYPE string VALUE 'activeTab', - lc_xml_attr_name TYPE string VALUE 'name', - lc_xml_attr_sheetid TYPE string VALUE 'sheetId', - lc_xml_attr_state TYPE string VALUE 'state', - lc_xml_attr_id TYPE string VALUE 'id', - lc_xml_attr_calcid TYPE string VALUE 'calcId', - lc_xml_attr_lockrevision TYPE string VALUE 'lockRevision', - lc_xml_attr_lockstructure TYPE string VALUE 'lockStructure', - lc_xml_attr_lockwindows TYPE string VALUE 'lockWindows', - lc_xml_attr_revisionspassword TYPE string VALUE 'revisionsPassword', - lc_xml_attr_workbookpassword TYPE string VALUE 'workbookPassword', - lc_xml_attr_hidden TYPE string VALUE 'hidden', - lc_xml_attr_localsheetid TYPE string VALUE 'localSheetId', - " Node namespace - lc_r_ns TYPE string VALUE 'r', - lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', - lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', - " Node id - lc_xml_node_ridx_id TYPE string VALUE 'rId#'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_element_range TYPE REF TO if_ixml_element, - lo_sub_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_iterator_range TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_range TYPE REF TO zcl_excel_range, - lo_autofilters TYPE REF TO zcl_excel_autofilters, - lo_autofilter TYPE REF TO zcl_excel_autofilter. - - DATA: lv_xml_node_ridx_id TYPE string, - lv_value TYPE string, - lv_syindex TYPE string, - l_guid TYPE uuid, - lv_active_sheet TYPE zexcel_active_worksheet. - -********************************************************************** -* STEP 1: Create [Content_Types].xml into the root of the ZIP - lo_ixml = cl_ixml=>create( ). - -********************************************************************** -* STEP 2: Set document attributes - lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian - character_set = 'utf-8' ). - lo_document = lo_ixml->create_document( ). - lo_document->set_encoding( lo_encoding ). - lo_document->set_standalone( abap_true ). - -********************************************************************** -* STEP 3: Create main node - lo_element_root = lo_document->create_simple_element( name = lc_xml_node_workbook - parent = lo_document ). - lo_element_root->set_attribute_ns( name = 'xmlns' - value = lc_xml_node_ns ). - lo_element_root->set_attribute_ns( name = 'xmlns:r' - value = lc_xml_node_r_ns ). - -********************************************************************** -* STEP 4: Create subnode - " fileVersion node - lo_element = lo_document->create_simple_element( name = lc_xml_node_fileversion - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_appname - value = 'xl' ). - lo_element->set_attribute_ns( name = lc_xml_attr_lastedited - value = '4' ). - lo_element->set_attribute_ns( name = lc_xml_attr_lowestedited - value = '4' ). - lo_element->set_attribute_ns( name = lc_xml_attr_rupbuild - value = '4506' ). - lo_element_root->append_child( new_child = lo_element ). - - " fileVersion node - lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookpr - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_themeversion - value = '124226' ). - lo_element_root->append_child( new_child = lo_element ). - - " workbookProtection node - IF me->excel->zif_excel_book_protection~protected EQ abap_true. - lo_element = lo_document->create_simple_element( name = lc_xml_node_workbookprotection - parent = lo_document ). - MOVE me->excel->zif_excel_book_protection~workbookpassword TO lv_value. - IF lv_value IS NOT INITIAL. - lo_element->set_attribute_ns( name = lc_xml_attr_workbookpassword - value = lv_value ). - ENDIF. - MOVE me->excel->zif_excel_book_protection~revisionspassword TO lv_value. - IF lv_value IS NOT INITIAL. - lo_element->set_attribute_ns( name = lc_xml_attr_revisionspassword - value = lv_value ). - ENDIF. - MOVE me->excel->zif_excel_book_protection~lockrevision TO lv_value. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_lockrevision - value = lv_value ). - MOVE me->excel->zif_excel_book_protection~lockstructure TO lv_value. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_lockstructure - value = lv_value ). - MOVE me->excel->zif_excel_book_protection~lockwindows TO lv_value. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_lockwindows - value = lv_value ). - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - - " bookviews node - lo_element = lo_document->create_simple_element( name = lc_xml_node_bookviews - parent = lo_document ). - " bookview node - lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_workbookview - parent = lo_document ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_xwindow - value = '120' ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_ywindow - value = '120' ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowwidth - value = '19035' ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_windowheight - value = '8445' ). - " Set Active Sheet - lv_active_sheet = excel->get_active_sheet_index( ). - IF lv_active_sheet > 1. - lv_active_sheet = lv_active_sheet - 1. - lv_value = lv_active_sheet. - CONDENSE lv_value. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_activetab - value = lv_value ). - ENDIF. - lo_element->append_child( new_child = lo_sub_element )." bookview node - lo_element_root->append_child( new_child = lo_element )." bookviews node - - " sheets node - lo_element = lo_document->create_simple_element( name = lc_xml_node_sheets - parent = lo_document ). - lo_iterator = excel->get_worksheets_iterator( ). - - " ranges node - lo_element_range = lo_document->create_simple_element( name = lc_xml_node_definednames " issue 163 + - parent = lo_document ). " issue 163 + - - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - " sheet node - lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_sheet - parent = lo_document ). - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - lv_syindex = sy-index. " question by Stefan Schmöcker 2012-12-02: sy-index seems to do the job - but is it proven to work or purely coincedence - lv_value = lo_worksheet->get_title( ). - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - lv_xml_node_ridx_id = lc_xml_node_ridx_id. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_name - value = lv_value ). - lo_sub_element->set_attribute_ns( name = lc_xml_attr_sheetid - value = lv_syindex ). - IF lo_worksheet->zif_excel_sheet_properties~hidden EQ zif_excel_sheet_properties=>c_hidden. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_state - value = 'hidden' ). - ELSEIF lo_worksheet->zif_excel_sheet_properties~hidden EQ zif_excel_sheet_properties=>c_veryhidden. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_state - value = 'veryHidden' ). - ENDIF. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_id - prefix = lc_r_ns - value = lv_xml_node_ridx_id ). - lo_element->append_child( new_child = lo_sub_element ). " sheet node - - " issue 163 >>> - lo_iterator_range = lo_worksheet->get_ranges_iterator( ). - -*--------------------------------------------------------------------* -* Defined names sheetlocal: Ranges, Repeat rows and columns -*--------------------------------------------------------------------* - WHILE lo_iterator_range->if_object_collection_iterator~has_next( ) EQ abap_true. - " range node - lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedname - parent = lo_document ). - lo_range ?= lo_iterator_range->if_object_collection_iterator~get_next( ). - lv_value = lo_range->name. - - lo_sub_element->set_attribute_ns( name = lc_xml_attr_name - value = lv_value ). - -* lo_sub_element->set_attribute_ns( name = lc_xml_attr_localsheetid "del #235 Repeat rows/cols - EXCEL starts couting from zero -* value = lv_xml_node_ridx_id ). "del #235 Repeat rows/cols - and needs absolute referencing to localSheetId - lv_value = lv_syindex - 1. "ins #235 Repeat rows/cols - CONDENSE lv_value NO-GAPS. "ins #235 Repeat rows/cols - lo_sub_element->set_attribute_ns( name = lc_xml_attr_localsheetid - value = lv_value ). - - lv_value = lo_range->get_value( ). - lo_sub_element->set_value( value = lv_value ). - lo_element_range->append_child( new_child = lo_sub_element ). " range node - - ENDWHILE. - " issue 163 <<< - - ENDWHILE. - lo_element_root->append_child( new_child = lo_element )." sheets node - - -*--------------------------------------------------------------------* -* Defined names workbookgolbal: Ranges -*--------------------------------------------------------------------* -* " ranges node -* lo_element = lo_document->create_simple_element( name = lc_xml_node_definednames " issue 163 - -* parent = lo_document ). " issue 163 - - lo_iterator = excel->get_ranges_iterator( ). - - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - " range node - lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedname - parent = lo_document ). - lo_range ?= lo_iterator->if_object_collection_iterator~get_next( ). - lv_value = lo_range->name. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_name - value = lv_value ). - lv_value = lo_range->get_value( ). - lo_sub_element->set_value( value = lv_value ). - lo_element_range->append_child( new_child = lo_sub_element ). " range node - - ENDWHILE. - -*--------------------------------------------------------------------* -* Defined names - Autofilters ( also sheetlocal ) -*--------------------------------------------------------------------* - lo_autofilters = excel->get_autofilters_reference( ). - IF lo_autofilters->is_empty( ) = abap_false. - lo_iterator = excel->get_worksheets_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - lv_syindex = sy-index - 1 . - l_guid = lo_worksheet->get_guid( ). - lo_autofilter = lo_autofilters->get( i_sheet_guid = l_guid ) . - IF lo_autofilter IS BOUND. - lo_sub_element = lo_document->create_simple_element_ns( name = lc_xml_node_definedname - parent = lo_document ). - lv_value = lo_autofilters->c_autofilter. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_name - value = lv_value ). - lv_value = lv_syindex. - CONDENSE lv_value NO-GAPS. - lo_sub_element->set_attribute_ns( name = lc_xml_attr_localsheetid - value = lv_value ). - lv_value = '1'. " Always hidden - lo_sub_element->set_attribute_ns( name = lc_xml_attr_hidden - value = lv_value ). - lv_value = lo_autofilter->get_filter_reference( ). - lo_sub_element->set_value( value = lv_value ). - lo_element_range->append_child( new_child = lo_sub_element ). " range node - ENDIF. - - ENDWHILE. - ENDIF. - lo_element_root->append_child( new_child = lo_element_range ). " ranges node - - - " calcPr node - lo_element = lo_document->create_simple_element( name = lc_xml_node_calcpr - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_calcid - value = '125725' ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 5: Create xstring stream - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - - - method FLAG2BOOL. - - - IF ip_flag EQ abap_true. - ep_boolean = 'true'. - ELSE. - ep_boolean = 'false'. - ENDIF. - endmethod. - - - - - method GET_SHARED_STRING_INDEX. - - - DATA ls_shared_string TYPE zexcel_s_shared_string. - - READ TABLE shared_strings INTO ls_shared_string WITH KEY string_value = ip_cell_value BINARY SEARCH. - ep_index = ls_shared_string-string_no. - - endmethod. - - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - method ZIF_EXCEL_WRITER~WRITE_FILE. - me->excel = io_excel. - ep_file = me->create( ). - endmethod. - - - - method CREATE. - -* .csv format with ; delimiter - - ep_excel = me->CREATE_CSV( ). - - endmethod. - - - - method CREATE_CSV. - - TYPES: BEGIN OF lty_format, - cmpname TYPE SEOCMPNAME, - attvalue TYPE SEOVALUE, - END OF lty_format. - DATA: lt_format TYPE STANDARD TABLE OF lty_format, - ls_format LIKE LINE OF lt_format, - lv_date TYPE DATS, - lv_tmp TYPE string, - lv_time TYPE CHAR08. - - DATA: lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - - DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, - lv_row TYPE sytabix, - lv_col TYPE sytabix, - lv_string TYPE string, - lc_value TYPE string, - lv_attrname TYPE SEOCMPNAME. - - DATA: ls_numfmt TYPE zexcel_s_style_numfmt, - lo_style TYPE REF TO zcl_excel_style. - - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. - -* --- Retrieve supported cell format - REFRESH lt_format. - SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_format - FROM seocompodf - WHERE clsname = 'ZCL_EXCEL_STYLE_NUMBER_FORMAT' - AND typtype = 1 - AND type = 'ZEXCEL_NUMBER_FORMAT'. - -* --- Retrieve SAP date format - CLEAR ls_format. - SELECT ddtext INTO ls_format-attvalue FROM dd07t WHERE domname = 'XUDATFM' - AND ddlanguage = sy-langu. - ls_format-cmpname = 'DATE'. - CONDENSE ls_format-attvalue. - CONCATENATE '''' ls_format-attvalue '''' INTO ls_format-attvalue. - APPEND ls_format TO lt_format. - ENDSELECT. - - - LOOP AT lt_format INTO ls_format. - TRANSLATE ls_format-attvalue TO UPPER CASE. - MODIFY lt_format FROM ls_format. - ENDLOOP. - - -* STEP 1: Collect strings from the first worksheet - lo_iterator = excel->get_worksheets_iterator( ). - data: current_worksheet_title type ZEXCEL_SHEET_TITLE. - - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - - IF worksheet_name IS NOT INITIAL. - current_worksheet_title = lo_worksheet->get_title( ). - CHECK current_worksheet_title = worksheet_name. - ELSE. - IF worksheet_index IS INITIAL. - worksheet_index = 1. - ENDIF. - CHECK worksheet_index = sy-index. - ENDIF. - APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. - EXIT. " Take first worksheet only - ENDWHILE. - - DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL. " delete formula content - - SORT lt_cell_data BY cell_row - cell_column. - lv_row = 1. - lv_col = 1. - CLEAR lv_string. - LOOP AT lt_cell_data ASSIGNING <fs_sheet_content>. - -* --- Retrieve Cell Style format and data type - CLEAR ls_numfmt. - IF <fs_sheet_content>-data_type IS INITIAL AND <fs_sheet_content>-cell_style IS NOT INITIAL. - lo_iterator = excel->get_styles_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_style ?= lo_iterator->if_object_collection_iterator~get_next( ). - CHECK lo_style->get_guid( ) = <fs_sheet_content>-cell_style. - ls_numfmt = lo_style->number_format->get_structure( ). - EXIT. - ENDWHILE. - ENDIF. - IF <fs_sheet_content>-data_type IS INITIAL AND ls_numfmt IS NOT INITIAL. - " determine data-type - CLEAR lv_attrname. - CONCATENATE '''' ls_numfmt-NUMFMT '''' INTO ls_numfmt-NUMFMT. - TRANSLATE ls_numfmt-numfmt TO UPPER CASE. - READ TABLE lt_format INTO ls_format WITH KEY attvalue = ls_numfmt-NUMFMT. - IF sy-subrc = 0. - lv_attrname = ls_format-cmpname. - ENDIF. - - IF lv_attrname IS NOT INITIAL. - FIND FIRST OCCURRENCE OF 'DATETIME' IN lv_attrname. - IF sy-subrc = 0. - <fs_sheet_content>-data_type = 'd'. - ELSE. - FIND FIRST OCCURRENCE OF 'TIME' IN lv_attrname. - IF sy-subrc = 0. - <fs_sheet_content>-data_type = 't'. - ELSE. - FIND FIRST OCCURRENCE OF 'DATE' IN lv_attrname. - IF sy-subrc = 0. - <fs_sheet_content>-data_type = 'd'. - ELSE. - FIND FIRST OCCURRENCE OF 'CURRENCY' IN lv_attrname. - IF sy-subrc = 0. - <fs_sheet_content>-data_type = 'n'. - ELSE. - FIND FIRST OCCURRENCE OF 'NUMBER' IN lv_attrname. - IF sy-subrc = 0. - <fs_sheet_content>-data_type = 'n'. - ELSE. - FIND FIRST OCCURRENCE OF 'PERCENTAGE' IN lv_attrname. - IF sy-subrc = 0. - <fs_sheet_content>-data_type = 'n'. - ENDIF. " Purcentage - ENDIF. " Number - ENDIF. " Currency - ENDIF. " Date - ENDIF. " TIME - ENDIF. " DATETIME - ENDIF. " lv_attrname IS NOT INITIAL. - ENDIF. " <fs_sheet_content>-data_type IS INITIAL AND ls_numfmt IS NOT INITIAL. - -* --- Add empty rows - WHILE lv_row < <fs_sheet_content>-cell_row. -* CONCATENATE lv_string cl_abap_char_utilities=>newline INTO lv_string. -* CONCATENATE lv_string cl_abap_char_utilities=>cr_lf INTO lv_string. - CONCATENATE lv_string zcl_excel_writer_csv=>eol INTO lv_string. - lv_row = lv_row + 1. - lv_col = 1. - ENDWHILE. - -* --- Add empty columns - WHILE lv_col < <fs_sheet_content>-cell_column. -* CONCATENATE lv_string ';' INTO lv_string. - CONCATENATE lv_string zcl_excel_writer_csv=>delimiter INTO lv_string. - lv_col = lv_col + 1. - ENDWHILE. - -* ----- Use format to determine the data type and display format. - CASE <fs_sheet_content>-data_type. -* WHEN 'n' OR 'N'. -* lc_value = zcl_excel_common=>excel_number_to_string( ip_value = <fs_sheet_content>-cell_value ). - - WHEN 'd' OR 'D'. - lc_value = zcl_excel_common=>excel_string_to_date( ip_value = <fs_sheet_content>-cell_value ). - TRY. - lv_date = lc_value. - CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL' - EXPORTING - DATE_INTERNAL = lv_date - IMPORTING - DATE_EXTERNAL = lv_tmp - EXCEPTIONS - DATE_INTERNAL_IS_INVALID = 1 - OTHERS = 2 - . - IF SY-SUBRC = 0. - lc_value = lv_tmp. - ENDIF. - - CATCH CX_SY_CONVERSION_NO_NUMBER. - - ENDTRY. - - WHEN 't' OR 'T'. - lc_value = zcl_excel_common=>excel_string_to_time( ip_value = <fs_sheet_content>-cell_value ). - write lc_value to lv_time USING EDIT MASK '__:__:__'. - lc_value = lv_time. - WHEN OTHERS. - lc_value = <fs_sheet_content>-cell_value. - - ENDCASE. - -* REPLACE ALL OCCURRENCES OF '"' in lc_value with '""'. - CONCATENATE zcl_excel_writer_csv=>enclosure zcl_excel_writer_csv=>enclosure INTO lv_tmp. - CONDENSE lv_tmp. - REPLACE ALL OCCURRENCES OF zcl_excel_writer_csv=>enclosure in lc_value with lv_tmp. - -* FIND FIRST OCCURRENCE OF ';' IN lc_value. - FIND FIRST OCCURRENCE OF zcl_excel_writer_csv=>delimiter IN lc_value. - IF sy-subrc = 0. - CONCATENATE lv_string zcl_excel_writer_csv=>enclosure lc_value zcl_excel_writer_csv=>enclosure INTO lv_string. - ELSE. - CONCATENATE lv_string lc_value INTO lv_string. - ENDIF. - - ENDLOOP. " AT lt_cell_data - - CLEAR ep_content. - - CALL FUNCTION 'SCMS_STRING_TO_XSTRING' - EXPORTING - TEXT = lv_string -* MIMETYPE = ' ' -* ENCODING = - IMPORTING - BUFFER = ep_content - EXCEPTIONS - FAILED = 1 - OTHERS = 2 - . - - endmethod. - - - - method SET_ACTIVE_SHEET_INDEX. - CLEAR WORKSHEET_NAME. - WORKSHEET_INDEX = i_active_worksheet. - endmethod. - - - - method SET_ACTIVE_SHEET_INDEX_BY_NAME. - CLEAR WORKSHEET_INDEX. - WORKSHEET_NAME = i_worksheet_name. - endmethod. - - - - method SET_DELIMITER. - delimiter = ip_value. - endmethod. - - - - method SET_ENCLOSURE. - zcl_excel_writer_csv=>enclosure = ip_value. - endmethod. - - - - method SET_ENDOFLINE. - zcl_excel_writer_csv=>eol = ip_value. - endmethod. - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - method CREATE. - - -* Office 2007 file format is a cab of several xml files with extension .xlsx - - DATA: lo_zip TYPE REF TO cl_abap_zip, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_active_worksheet TYPE REF TO zcl_excel_worksheet, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_nested_iterator TYPE REF TO cl_object_collection_iterator, - lo_table TYPE REF TO zcl_excel_table, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_drawings TYPE REF TO zcl_excel_drawings. - - DATA: lv_content TYPE xstring, - lv_active TYPE flag, - lv_xl_sheet TYPE string, - lv_xl_sheet_rels TYPE string, - lv_xl_drawing TYPE string, - lv_xl_drawing_rels TYPE string, - lv_syindex TYPE string, - lv_value TYPE string, - lv_drawing_index TYPE i. - -********************************************************************** -* Start of insertion # issue 139 - Dateretention of cellstyles - me->excel->add_static_styles( ). -* End of insertion # issue 139 - Dateretention of cellstyles - -********************************************************************** -* STEP 1: Create archive object file (ZIP) - CREATE OBJECT lo_zip. - -********************************************************************** -* STEP 2: Add [Content_Types].xml to zip - lv_content = me->create_content_types( ). - lo_zip->add( name = me->c_content_types - content = lv_content ). - -********************************************************************** -* STEP 3: Add _rels/.rels to zip - lv_content = me->create_relationships( ). - lo_zip->add( name = me->c_relationships - content = lv_content ). - -********************************************************************** -* STEP 4: Add docProps/app.xml to zip - lv_content = me->create_docprops_app( ). - lo_zip->add( name = me->c_docprops_app - content = lv_content ). - -********************************************************************** -* STEP 5: Add docProps/core.xml to zip - lv_content = me->create_docprops_core( ). - lo_zip->add( name = me->c_docprops_core - content = lv_content ). - -********************************************************************** -* STEP 6: Add xl/_rels/workbook.xml.rels to zip - lv_content = me->create_xl_relationships( ). - lo_zip->add( name = me->c_xl_relationships - content = lv_content ). - -********************************************************************** -* STEP 6: Add xl/_rels/workbook.xml.rels to zip - lv_content = me->create_xl_theme( ). - lo_zip->add( name = me->c_xl_theme - content = lv_content ). - -********************************************************************** -* STEP 7: Add xl/workbook.xml to zip - lv_content = me->create_xl_workbook( ). - lo_zip->add( name = me->c_xl_workbook - content = lv_content ). - -********************************************************************** -* STEP 8: Add xl/workbook.xml to zip -* lv_content = me->create_xl_styles_static( ). - lv_content = me->create_xl_styles( ). - lo_zip->add( name = me->c_xl_styles - content = lv_content ). - -********************************************************************** -* STEP 9: Add sharedStrings.xml to zip - lv_content = me->create_xl_sharedstrings( ). - lo_zip->add( name = me->c_xl_sharedstrings - content = lv_content ). - -********************************************************************** -* STEP 10: Add sheet#.xml and drawing#.xml to zip - lo_iterator = me->excel->get_worksheets_iterator( ). - lo_active_worksheet = me->excel->get_active_worksheet( ). - lv_drawing_index = 1. - - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ). - lv_active = abap_true. - ELSE. - lv_active = abap_false. - ENDIF. - - lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet - iv_active = lv_active ). - lv_xl_sheet = me->c_xl_sheet. - MOVE sy-index TO lv_syindex. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_syindex. - lo_zip->add( name = lv_xl_sheet - content = lv_content ). - - lv_xl_sheet_rels = me->c_xl_sheet_rels. - lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet - iv_drawing_index = lv_drawing_index ). - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_syindex. - lo_zip->add( name = lv_xl_sheet_rels - content = lv_content ). - - lo_nested_iterator = lo_worksheet->get_tables_iterator( ). - - WHILE lo_nested_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_table ?= lo_nested_iterator->if_object_collection_iterator~get_next( ). - lv_content = me->create_xl_table( lo_table ). - - lv_value = lo_table->get_name( ). - CONCATENATE 'xl/tables/' lv_value '.xml' INTO lv_value. - lo_zip->add( name = lv_value - content = lv_content ). - ENDWHILE. - -* Add drawings ********************************** - lo_drawings = lo_worksheet->get_drawings( ). - IF lo_drawings->is_empty( ) = abap_false. - MOVE lv_drawing_index TO lv_syindex. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - - lv_content = me->create_xl_drawings( lo_worksheet ). - lv_xl_drawing = me->c_xl_drawings. - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_syindex. - lo_zip->add( name = lv_xl_drawing - content = lv_content ). - - lv_content = me->create_xl_drawings_rels( lo_worksheet ). - lv_xl_drawing_rels = me->c_xl_drawings_rels. - REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_syindex. - lo_zip->add( name = lv_xl_drawing_rels - content = lv_content ). - ADD 1 TO lv_drawing_index. - ENDIF. - ENDWHILE. - -********************************************************************** -* STEP 11: Add media - lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lv_content = lo_drawing->get_media( ). - lv_value = lo_drawing->get_media_name( ). - CONCATENATE 'xl/media/' lv_value INTO lv_value. - lo_zip->add( name = lv_value - content = lv_content ). - ENDWHILE. - -********************************************************************** -* STEP 12: Add charts - lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lv_content = lo_drawing->get_media( ). - lv_value = lo_drawing->get_media_name( ). - CONCATENATE 'xl/charts/' lv_value INTO lv_value. - lo_zip->add( name = lv_value - content = lv_content ). - ENDWHILE. - -********************************************************************** -* STEP 9: Add vbaProject.bin to zip - lo_zip->add( name = me->c_xl_vbaproject - content = me->excel->zif_excel_book_vba_project~vbaproject ). - -********************************************************************** -* STEP 12: Create the final zip - ep_excel = lo_zip->save( ). - - endmethod. - - - method CREATE_CONTENT_TYPES. -** Constant node name - DATA: lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.ms-excel.sheet.macroEnabled.main+xml', - lc_xml_node_default TYPE string VALUE 'Default', - " Node attributes - lc_xml_attr_partname TYPE string VALUE 'PartName', - lc_xml_attr_extension TYPE string VALUE 'Extension', - lc_xml_attr_contenttype TYPE string VALUE 'ContentType', - lc_xml_attr_codename TYPE string VALUE 'codeName', - lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml', - lc_xml_node_bin_ext TYPE string VALUE 'bin', - lc_xml_node_bin_ct TYPE string VALUE 'application/vnd.ms-office.vbaProject'. - - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_document_xml TYPE REF TO cl_xml_document, - lo_element_root TYPE REF TO if_ixml_node, - lo_element TYPE REF TO if_ixml_element, - lo_collection TYPE REF TO if_ixml_node_collection, - lo_iterator TYPE REF TO if_ixml_node_iterator, - lo_node TYPE REF TO if_ixml_node, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - - DATA: lv_subrc TYPE sysubrc, - lv_contenttype TYPE string, - lv_syindex(2) TYPE c. - -********************************************************************** -* STEP 3: Create standard contentType - ep_content = super->create_content_types( ). - -********************************************************************** -* STEP 2: modify XML adding the extension bin definition - - CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). - - lo_document ?= lo_document_xml->m_document. - lo_element_root = lo_document->if_ixml_node~get_first_child( ). - - " extension node - lo_element = lo_document->create_simple_element( name = lc_xml_node_default - parent = lo_document ). - lo_element->set_attribute_ns( name = lc_xml_attr_extension - value = lc_xml_node_bin_ext ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_bin_ct ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 3: modify XML changing the contentType of node Override /xl/workbook.xml - - lo_collection = lo_document->get_elements_by_tag_name( 'Override' ). - lo_iterator = lo_collection->create_iterator( ). - lo_element ?= lo_iterator->get_next( ). - WHILE lo_element IS BOUND. - lv_contenttype = lo_element->get_attribute_ns( lc_xml_attr_partname ). - IF lv_contenttype EQ lc_xml_node_workb_pn. - lo_element->remove_attribute_ns( lc_xml_attr_contenttype ). - lo_element->set_attribute_ns( name = lc_xml_attr_contenttype - value = lc_xml_node_workb_ct ). - EXIT. - ENDIF. - lo_element ?= lo_iterator->get_next( ). - ENDWHILE. - -********************************************************************** -* STEP 3: Create xstring stream - CLEAR ep_content. - lo_ixml = cl_ixml=>create( ). - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - method CREATE_XL_RELATIONSHIPS. - -** Constant node name - DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships', - lc_xml_node_relationship TYPE string VALUE 'Relationship', - " Node attributes - lc_xml_attr_id TYPE string VALUE 'Id', - lc_xml_attr_type TYPE string VALUE 'Type', - lc_xml_attr_target TYPE string VALUE 'Target', - " Node id - lc_xml_node_ridx_id TYPE string VALUE 'rId#', - " Node type - lc_xml_node_rid_vba_tp TYPE string VALUE 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', - " Node target - lc_xml_node_rid_vba_tg TYPE string VALUE 'vbaProject.bin'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_document_xml TYPE REF TO cl_xml_document, - lo_element_root TYPE REF TO if_ixml_node, - lo_element TYPE REF TO if_ixml_element, - lo_node TYPE REF TO if_ixml_node, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - - DATA: lv_xml_node_ridx_tg TYPE string, - lv_xml_node_ridx_id TYPE string, - lv_size TYPE i, - lv_subrc TYPE sysubrc, - lv_syindex(2) TYPE c. - -********************************************************************** -* STEP 3: Create standard relationship - ep_content = super->create_xl_relationships( ). - -********************************************************************** -* STEP 2: modify XML adding the vbaProject relation - - CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). - - lo_document ?= lo_document_xml->m_document. - lo_element_root = lo_document->if_ixml_node~get_first_child( ). - - - lv_size = excel->get_worksheets_size( ). - - " Relationship node - lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship - parent = lo_document ). - ADD 4 TO lv_size. - lv_syindex = lv_size. - SHIFT lv_syindex RIGHT DELETING TRAILING space. - SHIFT lv_syindex LEFT DELETING LEADING space. - lv_xml_node_ridx_id = lc_xml_node_ridx_id. - REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_ridx_id WITH lv_syindex. - lo_element->set_attribute_ns( name = lc_xml_attr_id - value = lv_xml_node_ridx_id ). - lo_element->set_attribute_ns( name = lc_xml_attr_type - value = lc_xml_node_rid_vba_tp ). - lo_element->set_attribute_ns( name = lc_xml_attr_target - value = lc_xml_node_rid_vba_tg ). - lo_element_root->append_child( new_child = lo_element ). - -********************************************************************** -* STEP 3: Create xstring stream - CLEAR ep_content. - lo_ixml = cl_ixml=>create( ). - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - - endmethod. - - - method CREATE_XL_SHEET. - -** Constant node name - DATA: lc_xml_attr_codename TYPE string VALUE 'codeName'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_document_xml TYPE REF TO cl_xml_document, - lo_element_root TYPE REF TO if_ixml_node, - lo_element TYPE REF TO if_ixml_element, - lo_collection TYPE REF TO if_ixml_node_collection, - lo_iterator TYPE REF TO if_ixml_node_iterator, - lo_node TYPE REF TO if_ixml_node, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - - DATA: lv_subrc TYPE sysubrc, - lv_syindex(2) TYPE c. - -********************************************************************** -* STEP 3: Create standard relationship - ep_content = super->create_xl_sheet( io_worksheet = io_worksheet - iv_active = iv_active ). - -********************************************************************** -* STEP 2: modify XML adding the vbaProject relation - - CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). - - lo_document ?= lo_document_xml->m_document. - lo_element_root = lo_document->if_ixml_node~get_first_child( ). - -* lo_collection = lo_document->get_elements_by_tag_name( 'fileVersion' ). -* lo_iterator = lo_collection->create_iterator( ). -* lo_element ?= lo_iterator->get_next( ). -* WHILE lo_element IS BOUND. -* lo_element->set_attribute_ns( name = lc_xml_attr_codename -* value = me->excel->zif_excel_book_vba_project~codename ). -* lo_element ?= lo_iterator->get_next( ). -* ENDWHILE. - - lo_collection = lo_document->get_elements_by_tag_name( 'sheetPr' ). - lo_iterator = lo_collection->create_iterator( ). - lo_element ?= lo_iterator->get_next( ). - WHILE lo_element IS BOUND. - lo_element->set_attribute_ns( name = lc_xml_attr_codename - value = io_worksheet->zif_excel_sheet_vba_project~codename_pr ). - lo_element ?= lo_iterator->get_next( ). - ENDWHILE. - -********************************************************************** -* STEP 3: Create xstring stream - CLEAR ep_content. - lo_ixml = cl_ixml=>create( ). - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - endmethod. - - - method CREATE_XL_WORKBOOK. - -** Constant node name - DATA: lc_xml_attr_codename TYPE string VALUE 'codeName'. - - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_document_xml TYPE REF TO cl_xml_document, - lo_element_root TYPE REF TO if_ixml_node, - lo_element TYPE REF TO if_ixml_element, - lo_collection TYPE REF TO if_ixml_node_collection, - lo_iterator TYPE REF TO if_ixml_node_iterator, - lo_node TYPE REF TO if_ixml_node, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer. - - DATA: lv_subrc TYPE sysubrc, - lv_syindex(2) TYPE c. - -********************************************************************** -* STEP 3: Create standard relationship - ep_content = super->create_xl_workbook( ). - -********************************************************************** -* STEP 2: modify XML adding the vbaProject relation - - CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). - - lo_document ?= lo_document_xml->m_document. - lo_element_root = lo_document->if_ixml_node~get_first_child( ). - - lo_collection = lo_document->get_elements_by_tag_name( 'fileVersion' ). - lo_iterator = lo_collection->create_iterator( ). - lo_element ?= lo_iterator->get_next( ). - WHILE lo_element IS BOUND. - lo_element->set_attribute_ns( name = lc_xml_attr_codename - value = me->excel->zif_excel_book_vba_project~codename ). - lo_element ?= lo_iterator->get_next( ). - ENDWHILE. - - lo_collection = lo_document->get_elements_by_tag_name( 'workbookPr' ). - lo_iterator = lo_collection->create_iterator( ). - lo_element ?= lo_iterator->get_next( ). - WHILE lo_element IS BOUND. - lo_element->set_attribute_ns( name = lc_xml_attr_codename - value = me->excel->zif_excel_book_vba_project~codename_pr ). - lo_element ?= lo_iterator->get_next( ). - ENDWHILE. - -********************************************************************** -* STEP 3: Create xstring stream - CLEAR ep_content. - lo_ixml = cl_ixml=>create( ). - lo_streamfactory = lo_ixml->create_stream_factory( ). - lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ). - lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). - lo_renderer->render( ). - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - - - - - - - - method IF_MESSAGE~GET_LONGTEXT. - - IF me->error IS NOT INITIAL - OR me->syst_at_raise IS NOT INITIAL. -*--------------------------------------------------------------------* -* If message was supplied explicitly use this as longtext as well -*--------------------------------------------------------------------* - result = me->get_text( ). - ELSE. -*--------------------------------------------------------------------* -* otherwise use standard method to derive text -*--------------------------------------------------------------------* - super->if_message~get_longtext( EXPORTING - preserve_newlines = preserve_newlines - RECEIVING - result = result ). - ENDIF. - endmethod. - - - method IF_MESSAGE~GET_TEXT. - - IF me->error IS NOT INITIAL. -*--------------------------------------------------------------------* -* If message was supplied explicitly use this -*--------------------------------------------------------------------* - result = me->error . - ELSEIF me->syst_at_raise IS NOT INITIAL. -*--------------------------------------------------------------------* -* If message was supplied by syst create messagetext now -*--------------------------------------------------------------------* - MESSAGE ID syst_at_raise-msgid TYPE syst_at_raise-msgty NUMBER syst_at_raise-msgno - WITH syst_at_raise-msgv1 syst_at_raise-msgv2 syst_at_raise-msgv3 syst_at_raise-msgv4 - INTO result. - ELSE. -*--------------------------------------------------------------------* -* otherwise use standard method to derive text -*--------------------------------------------------------------------* - CALL METHOD super->if_message~get_text - RECEIVING - result = result. - ENDIF. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - method ADD. - ranges->add( ip_range ). - endmethod. - - - method CLEAR. - ranges->clear( ). - endmethod. - - - method CONSTRUCTOR. - - - CREATE OBJECT ranges. - - endmethod. - - - - - method GET. - eo_range ?= ranges->if_object_collection~get( ip_index ). - endmethod. - - - - method GET_ITERATOR. - eo_iterator ?= ranges->if_object_collection~get_iterator( ). - endmethod. - - - - method IS_EMPTY. - is_empty = ranges->if_object_collection~is_empty( ). - endmethod. - - - - method REMOVE. - ranges->remove( ip_range ). - endmethod. - - - - method SIZE. - ep_size = ranges->if_object_collection~size( ). - endmethod. - - - - - - - *"* use this source file for the definition and implementation of -*"* local helper classes, interface definitions and type -*"* declarations - -* Signal "not found" -class lcx_not_found implementation. - method constructor. - super->constructor( textid = textid previous = previous ). - me->error = error. - endmethod. "constructor - method if_message~get_text. - result = error. - endmethod. "if_message~get_text -endclass. "lcx_not_found IMPLEMENTATION - *"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - -* Signal for "Not found" -class lcx_not_found definition inheriting from cx_static_check. - public section. - data error type string. - methods constructor - importing error type string - textid type sotr_conc optional - previous type ref to cx_root optional. - methods if_message~get_text redefinition. -endclass. - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - *"* use this source file for your ABAP unit test classes -class lcl_test definition deferred. -class zcl_excel_reader_huge_file definition local friends lcl_test. - -* -class lcl_test definition for testing " #AU Risk_Level Harmless - inheriting from cl_aunit_assert. " #AU Duration Short - - private section. - data: - out type ref to zcl_excel_reader_huge_file, " object under test - excel type ref to zcl_excel, - worksheet type ref to zcl_excel_worksheet. - methods: - setup, - test_number for testing, - test_shared_string for testing, - test_shared_string_missing for testing, - test_inline_string for testing, - test_empty_cells for testing, - test_boolean for testing, - test_style for testing, - test_style_missing for testing, - test_formula for testing, - test_read_shared_strings for testing, - test_skip_to_inexistent for testing, - get_reader importing iv_xml type string returning value(eo_reader) type ref to if_sxml_reader, - assert_value_equals importing iv_row type i default 1 iv_col type i default 1 iv_value type string, - assert_formula_equals importing iv_row type i default 1 iv_col type i default 1 iv_formula type string, - assert_style_equals importing iv_row type i default 1 iv_col type i default 1 iv_style type ZEXCEL_CELL_STYLE, - assert_datatype_equals importing iv_row type i default 1 iv_col type i default 1 iv_datatype type string. - -endclass. "lcl_test DEFINITION - -* -class lcl_test implementation. - -* - method test_number. - data lo_reader type ref to if_sxml_reader. - lo_reader = get_reader( - `<c r="A1" t="n"><v>17</v></c>` - ). - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - assert_value_equals( `17` ). - assert_datatype_equals( `n` ). - endmethod. "test_shared_string - -* - method test_shared_string. - data lo_reader type ref to if_sxml_reader. - append `Test1` to out->shared_strings. - append `Test2` to out->shared_strings. - lo_reader = get_reader( - `<c r="A1" t="s"><v>1</v></c>` - ). - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - assert_value_equals( `Test2` ). - assert_datatype_equals( `s` ). - endmethod. "test_shared_string -* - method test_shared_string_missing. - - data: lo_reader type ref to if_sxml_reader, - lo_ex type ref to lcx_not_found, - lv_text type string. - append `Test` to out->shared_strings. - lo_reader = get_reader( - `<c r="A1" t="s"><v>1</v></c>` - ). - - try. - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - fail(`Index to non-existent shared string should give an error`). - catch lcx_not_found into lo_ex. - lv_text = lo_ex->get_text( ). " >>> May inspect the message in the debugger - endtry. - - endmethod. -* - method test_inline_string. - data lo_reader type ref to if_sxml_reader. - lo_reader = get_reader( - `<c r="A1" t="inlineStr"><is><t>Alpha</t></is></c>` - ). - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - assert_value_equals( `Alpha` ). - assert_datatype_equals( `inlineStr` ). - endmethod. "test_inline_string - -* - method test_boolean. - data lo_reader type ref to if_sxml_reader. - lo_reader = get_reader( - `<c r="A1" t="b"><v>1</v></c>` - ). - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - assert_value_equals( `1` ). - assert_datatype_equals( `b` ). - endmethod. "test_boolean - -* - method test_formula. - data lo_reader type ref to if_sxml_reader. - lo_reader = get_reader( - `<c r="A1" t="n"><f>A2*A2</f></c>` - ). - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - assert_formula_equals( `A2*A2` ). - assert_datatype_equals( `n` ). - endmethod. "test_formula - -* - method test_empty_cells. - -* There is no need to store an empty cell in the ABAP worksheet structure - - data: lo_reader type ref to if_sxml_reader, - lo_ex type ref to lcx_not_found, - lv_text type string. - append `` to out->shared_strings. - append `t` to out->shared_strings. - lo_reader = get_reader( - `<c r="A1" t="s"><v>0</v></c>` & - `<c r="A2" t="inlineStr"><is><t></t></is></c>` & - `<c r="A3" t="s"><v>1</v></c>` - ). - - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - - assert_value_equals( iv_row = 1 iv_col = 1 iv_value = `` ). - assert_value_equals( iv_row = 2 iv_col = 1 iv_value = `` ). - assert_value_equals( iv_row = 3 iv_col = 1 iv_value = `t` ). - - endmethod. - -* - method test_style. - data: - lo_reader type ref to if_sxml_reader, - lo_style type ref to zcl_excel_style, - lv_guid type ZEXCEL_CELL_STYLE. - create object lo_style. - append lo_style to out->styles. - lv_guid = lo_style->get_guid( ). - - lo_reader = get_reader( - `<c r="A1" s="0"><v>18</v></c>` - ). - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - - assert_style_equals( lv_guid ). - - endmethod. "test_style - -* - method test_style_missing. - - data: - lo_reader type ref to if_sxml_reader, - lo_ex type ref to lcx_not_found, - lv_text type string. - - lo_reader = get_reader( - `<c r="A1" s="0"><v>18</v></c>` - ). - - try. - out->read_worksheet_data( io_reader = lo_reader io_worksheet = worksheet ). - fail(`Reference to non-existent style should throw an lcx_not_found exception`). - catch lcx_not_found into lo_ex. - lv_text = lo_ex->get_text( ). " >>> May inspect the message in the debugger - endtry. - - endmethod. "test_style - -* - method test_read_shared_strings. - data: lo_c2x type ref to cl_abap_conv_out_ce, - lv_xstring type xstring, - lo_reader type ref to if_sxml_reader, - lt_act type stringtab, - lt_exp type stringtab. - - lo_c2x = cl_abap_conv_out_ce=>create( ). - lo_c2x->convert( exporting data = `<sst><si><t/></si><si><t>Alpha</t></si><si><t>Bravo</t></si></sst>` - importing buffer = lv_xstring ). - lo_reader = cl_sxml_string_reader=>create( lv_xstring ). - append : - `` to lt_exp, - `Alpha` to lt_exp, - `Bravo` to lt_exp. - - lt_act = out->read_shared_strings( lo_reader ). - - assert_equals( act = lt_act - exp = lt_exp ). - - endmethod. - -* - method test_skip_to_inexistent. - data: lo_c2x type ref to cl_abap_conv_out_ce, - lv_xstring type xstring, - lo_reader type ref to if_sxml_reader, - lo_ex type ref to lcx_not_found, - lv_text type string. - - lo_c2x = cl_abap_conv_out_ce=>create( ). - lo_c2x->convert( exporting data = `<sst><si><t/></si><si><t>Alpha</t></si><si><t>Bravo</t></si></sst>` - importing buffer = lv_xstring ). - lo_reader = cl_sxml_string_reader=>create( lv_xstring ). - try. - out->skip_to( iv_element_name = `nonExistingElement` io_reader = lo_reader ). - fail(`Skipping to non-existing element must raise lcx_not_found exception`). - catch lcx_not_found into lo_ex. - lv_text = lo_ex->get_text( ). " May inspect exception text in debugger - endtry. - endmethod. - -* - method get_reader. - data: lv_full type string, - lo_c2x type ref to cl_abap_conv_out_ce, - lv_xstring type xstring. - concatenate `<root><sheetData><row>` iv_xml `</row></sheetData></root>` into lv_full. - lo_c2x = cl_abap_conv_out_ce=>create( ). - lo_c2x->convert( exporting data = lv_full - importing buffer = lv_xstring ). - eo_reader = cl_sxml_string_reader=>create( lv_xstring ). - endmethod. "get_reader -* - method assert_value_equals. - - constants: lc_empty_string type string value is initial. - - field-symbols: <ls_cell_data> type zexcel_s_cell_data, - <lv_value> type string. - - read table worksheet->sheet_content assigning <ls_cell_data> - with table key cell_row = iv_row cell_column = iv_col. - if sy-subrc eq 0. - assign <ls_cell_data>-cell_value to <lv_value>. - else. - assign lc_empty_string to <lv_value>. - endif. - - assert_equals( act = <lv_value> - exp = iv_value ). - - endmethod. "assert_value_equals -** - method assert_formula_equals. - - field-symbols: <ls_cell_data> type zexcel_s_cell_data. - - read table worksheet->sheet_content assigning <ls_cell_data> - with table key cell_row = iv_row cell_column = iv_col. - assert_subrc( sy-subrc ). - - assert_equals( act = <ls_cell_data>-cell_formula - exp = iv_formula ). - - endmethod. "assert_formula_equals -* - method assert_style_equals. - - field-symbols: <ls_cell_data> type zexcel_s_cell_data. - - read table worksheet->sheet_content assigning <ls_cell_data> - with table key cell_row = iv_row cell_column = iv_col. - assert_subrc( sy-subrc ). - - assert_equals( act = <ls_cell_data>-cell_style - exp = iv_style ). - - endmethod. -* - method assert_datatype_equals. - - field-symbols: <ls_cell_data> type zexcel_s_cell_data. - - read table worksheet->sheet_content assigning <ls_cell_data> - with table key cell_row = iv_row cell_column = iv_col. - assert_subrc( sy-subrc ). - - assert_equals( act = <ls_cell_data>-data_type - exp = iv_datatype ). - - endmethod. "assert_datatype_equals - method setup. - create object out. - create object excel. - create object worksheet - exporting - ip_excel = excel. - endmethod. "setup -endclass. "lcl_test IMPLEMENTATION - - - - - - - - - - - - - - - - method FILL_CELL_FROM_ATTRIBUTES. - - while io_reader->node_type ne c_end_of_stream. - io_reader->next_attribute( ). - if io_reader->node_type ne c_attribute. - exit. - endif. - case io_reader->name. - when `t`. - es_cell-datatype = io_reader->value. - when `s`. - if io_reader->value is not initial. - es_cell-style = get_style( io_reader->value ). - endif. - when `r`. - es_cell-coord = get_cell_coord( io_reader->value ). - endcase. - endwhile. - -endmethod. - - - - - method GET_CELL_COORD. - - zcl_excel_common=>convert_columnrow2column_a_row( - exporting - i_columnrow = iv_coord - importing - e_column = es_coord-column - e_row = es_coord-row - ). - -endmethod. - - - - - - method GET_SHARED_STRING. - data: lv_tabix type i, - lv_error type string. - lv_tabix = iv_index + 1. - read table shared_strings into ev_value index lv_tabix. - if sy-subrc ne 0. - concatenate 'Entry ' iv_index ' not found in Shared String Table' into lv_error. - raise exception type lcx_not_found - exporting - error = lv_error. - endif. -endmethod. - - - - - - method GET_STYLE. - - data: lv_tabix type i, - lo_style type ref to zcl_excel_style, - lv_error type string. - - if gs_buffer_style-index ne iv_index. - lv_tabix = iv_index + 1. - read table styles into lo_style index lv_tabix. - if sy-subrc ne 0. - concatenate 'Entry ' iv_index ' not found in Style Table' into lv_error. - raise exception type lcx_not_found - exporting - error = lv_error. - else. - gs_buffer_style-index = iv_index. - gs_buffer_style-guid = lo_style->get_guid( ). - endif. - endif. - - ev_style_guid = gs_buffer_style-guid. - -endmethod. - - - - - - method GET_SXML_READER. - - data: lv_xml type xstring. - - lv_xml = get_from_zip_archive( iv_path ). - eo_reader = cl_sxml_string_reader=>create( lv_xml ). - -endmethod. - - - method LOAD_SHARED_STRINGS. - - data: lo_reader type ref to if_sxml_reader. - - lo_reader = get_sxml_reader( ip_path ). - - shared_strings = read_shared_strings( lo_reader ). - -endmethod. - - - method LOAD_WORKSHEET. - - data: lo_reader type ref to if_sxml_reader. - - lo_reader = get_sxml_reader( ip_path ). - - read_worksheet_data( io_reader = lo_reader - io_worksheet = io_worksheet ). - -endmethod. - - - - - method PUT_CELL_TO_WORKSHEET. - check is_cell-value is not initial - or is_cell-formula is not initial - or is_cell-style is not initial. - call method io_worksheet->set_cell - exporting - ip_column = is_cell-column - ip_row = is_cell-row - ip_value = is_cell-value - ip_formula = is_cell-formula - ip_data_type = is_cell-datatype - ip_style = is_cell-style. -endmethod. - - - - - method READ_SHARED_STRINGS. - - while io_reader->node_type ne c_end_of_stream. - io_reader->next_node( ). - if io_reader->node_type eq c_element_close and - io_reader->name eq `t`. - append io_reader->value to et_shared_strings. - endif. - endwhile. - -endmethod. - - - - - - method READ_WORKSHEET_DATA. - - data: ls_cell type t_cell. - -* Skip to <sheetData> element - skip_to( iv_element_name = `sheetData` io_reader = io_reader ). - -* Main loop: Evaluate the <c> elements and its children - while io_reader->node_type ne c_end_of_stream. - io_reader->next_node( ). - case io_reader->node_type. - when c_element_open. - if io_reader->name eq `c`. - ls_cell = fill_cell_from_attributes( io_reader ). - endif. - when c_node_value. - case io_reader->name. - when `f`. - ls_cell-formula = io_reader->value. - when `v`. - if ls_cell-datatype eq `s`. - ls_cell-value = get_shared_string( io_reader->value ). - else. - ls_cell-value = io_reader->value. - endif. - when `t` or `is`. - ls_cell-value = io_reader->value. - endcase. - when c_element_close. - case io_reader->name. - when `c`. - put_cell_to_worksheet( is_cell = ls_cell io_worksheet = io_worksheet ). - when `sheetData`. - exit. - endcase. - endcase. - endwhile. - -endmethod. - - - - - - method SKIP_TO. - - data: lv_error type string. - -* Skip forward to given element - while io_reader->name ne iv_element_name or - io_reader->node_type ne c_element_open. - io_reader->next_node( ). - if io_reader->node_type = c_end_of_stream. - concatenate 'XML error: Didn''t find element <' iv_element_name '>' into lv_error. - raise exception type lcx_not_found - exporting - error = lv_error. - endif. - endwhile. - - -endmethod. - - - - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - CLASS zcl_tc_excel DEFINITION DEFERRED. -CLASS zcl_excel DEFINITION LOCAL FRIENDS zcl_tc_excel. - -*----------------------------------------------------------------------* -* CLASS zcl_Tc_Excel DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_tc_excel DEFINITION FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS -. -*?<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> -*?<asx:values> -*?<TESTCLASS_OPTIONS> -*?<TEST_CLASS>zcl_Tc_Excel -*?</TEST_CLASS> -*?<TEST_MEMBER>f_Cut -*?</TEST_MEMBER> -*?<OBJECT_UNDER_TEST>ZCL_EXCEL -*?</OBJECT_UNDER_TEST> -*?<OBJECT_IS_LOCAL/> -*?<GENERATE_FIXTURE>X -*?</GENERATE_FIXTURE> -*?<GENERATE_CLASS_FIXTURE>X -*?</GENERATE_CLASS_FIXTURE> -*?<GENERATE_INVOCATION>X -*?</GENERATE_INVOCATION> -*?<GENERATE_ASSERT_EQUAL>X -*?</GENERATE_ASSERT_EQUAL> -*?</TESTCLASS_OPTIONS> -*?</asx:values> -*?</asx:abap> - PRIVATE SECTION. -* ================ - DATA: - f_cut TYPE REF TO zcl_excel. "class under test - - CLASS-METHODS: class_setup. - CLASS-METHODS: class_teardown. - METHODS: setup. - METHODS: teardown. - METHODS: create_empty_excel FOR TESTING. - -ENDCLASS. "zcl_Tc_Excel - - -*----------------------------------------------------------------------* -* CLASS zcl_Tc_Excel IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_tc_excel IMPLEMENTATION. -* ================================== - - METHOD class_setup. -* =================== - - - ENDMETHOD. "class_Setup - - - METHOD class_teardown. -* ====================== - - - ENDMETHOD. "class_Teardown - - - METHOD setup. -* ============= - - CREATE OBJECT f_cut. - ENDMETHOD. "setup - - - METHOD teardown. -* ================ - - - ENDMETHOD. "teardown - -*// START TEST METHODS - - METHOD create_empty_excel. -* ================================== - - DATA: lv_count TYPE i. - lv_count = f_cut->get_worksheets_size( ). - - cl_abap_unit_assert=>assert_equals( act = lv_count - exp = 1 - msg = 'Testing number of sheet' - level = if_aunit_constants=>tolerable ). - ENDMETHOD. "create_empty_excel - -*// END TEST METHODS - - -ENDCLASS. "zcl_Tc_Excel - - - - - - - - - - - - - - - METHOD zif_excel_book_properties~initialize. - DATA: lv_timestamp TYPE timestampl. - - me->zif_excel_book_properties~application = 'Microsoft Excel'. - me->zif_excel_book_properties~appversion = '12.0000'. - - GET TIME STAMP FIELD lv_timestamp. - me->zif_excel_book_properties~created = lv_timestamp. - me->zif_excel_book_properties~creator = sy-uname. - me->zif_excel_book_properties~description = zcl_excel=>version. - me->zif_excel_book_properties~modified = lv_timestamp. - me->zif_excel_book_properties~lastmodifiedby = sy-uname. -ENDMETHOD. - - - method ZIF_EXCEL_BOOK_PROTECTION~INITIALIZE. - me->zif_excel_book_protection~protected = zif_excel_book_protection=>c_unprotected. - me->zif_excel_book_protection~lockrevision = zif_excel_book_protection=>c_unlocked. - me->zif_excel_book_protection~lockstructure = zif_excel_book_protection=>c_unlocked. - me->zif_excel_book_protection~lockwindows = zif_excel_book_protection=>c_unlocked. - CLEAR me->zif_excel_book_protection~workbookpassword. - CLEAR me->zif_excel_book_protection~revisionspassword. - endmethod. - - - method ZIF_EXCEL_BOOK_VBA_PROJECT~SET_CODENAME. - me->zif_excel_book_vba_project~codename = ip_codename. - endmethod. - - - method ZIF_EXCEL_BOOK_VBA_PROJECT~SET_CODENAME_PR. - me->zif_excel_book_vba_project~codename_pr = ip_codename_pr. - endmethod. - - - method ZIF_EXCEL_BOOK_VBA_PROJECT~SET_VBAPROJECT. - me->zif_excel_book_vba_project~vbaproject = ip_vbaproject. - endmethod. - - - - - method ADD_NEW_AUTOFILTER. -* Check for autofilter reference: new or overwrite; only one per sheet - ro_autofilter = autofilters->add( io_sheet = io_sheet ) . - endmethod. - - - - - - method ADD_NEW_DRAWING. - DATA: lv_guid TYPE guid_16. -* Create default blank worksheet - CREATE OBJECT eo_drawing - EXPORTING - ip_type = ip_type - ip_title = ip_title. - - CASE ip_type. - WHEN 'image'. - drawings->add( eo_drawing ). - WHEN 'chart'. - charts->add( eo_drawing ). - ENDCASE. - endmethod. - - - - method ADD_NEW_RANGE. -* Create default blank range - CREATE OBJECT eo_range. - ranges->add( eo_range ). - endmethod. - - - - - method ADD_NEW_STYLE. -* Start of deletion # issue 139 - Dateretention of cellstyles -* CREATE OBJECT eo_style. -* styles->add( eo_style ). -* End of deletion # issue 139 - Dateretention of cellstyles -* Start of insertion # issue 139 - Dateretention of cellstyles -* Create default style - CREATE OBJECT eo_style - EXPORTING - ip_guid = ip_guid. - styles->add( eo_style ). - - DATA: style2 TYPE zexcel_s_stylemapping. -* Copy to new representations - style2 = stylemapping_dynamic_style( eo_style ). - INSERT style2 INTO TABLE t_stylemapping1. - INSERT style2 INTO TABLE t_stylemapping2. -* End of insertion # issue 139 - Dateretention of cellstyles - - endmethod. - - - - - - method ADD_NEW_WORKSHEET. - DATA: lv_guid TYPE guid_16. - -* Create default blank worksheet - CREATE OBJECT eo_worksheet - EXPORTING - ip_excel = me - ip_title = ip_title. - - worksheets->add( eo_worksheet ). - worksheets->active_worksheet = worksheets->size( ). - endmethod. - - - method ADD_STATIC_STYLES. - " # issue 139 -* sp#ƒÂ¤ter hier noch die Worksheets abklappern, welche Styles #ƒÂ#berhaupt noch ben#ƒÂ#tigt werden -* und nur diese dann auch hier zur Verf#ƒÂ#gung stellen -* Da muss ich noch mal nachfragen, ob die beiden ersten Styles, die scheinbar immer mit dem -* EXCEL-Objekt erzeugt werden evtl. immer ben#ƒÂ#tigt werden, egal ob verwendet oder nicht -* Aber als Start fange ich mal an einfach alle static styles der Reihe nach hinzuzuf#ƒÂ#gen - FIELD-SYMBOLS: <style1> LIKE LINE OF t_stylemapping1, - <style2> LIKE LINE OF t_stylemapping2. - DATA: style TYPE REF TO zcl_excel_style. - - LOOP AT me->t_stylemapping1 ASSIGNING <style1> WHERE added_to_iterator IS INITIAL. - READ TABLE me->t_stylemapping2 ASSIGNING <style2> WITH TABLE KEY guid = <style1>-guid. - CHECK sy-subrc = 0. " Should always be true since these tables are being filled parallel - - style = me->add_new_style( <style1>-guid ). - - zcl_excel_common=>recursive_struct_to_class( EXPORTING i_source = <style1>-complete_style - i_sourcex = <style1>-complete_stylex - CHANGING e_target = style ). - - ENDLOOP. - endmethod. - - - method CONSTRUCTOR. - DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style TYPE REF TO zcl_excel_style. - -* Inizialize instance objects - CREATE OBJECT security. - CREATE OBJECT worksheets. - CREATE OBJECT ranges. - CREATE OBJECT styles. - CREATE OBJECT drawings - EXPORTING - ip_type = zcl_excel_drawing=>type_image. - CREATE OBJECT charts - EXPORTING - ip_type = zcl_excel_drawing=>type_chart. - CREATE OBJECT legacy_palette. - CREATE OBJECT autofilters. - - me->zif_excel_book_protection~initialize( ). - me->zif_excel_book_properties~initialize( ). - - me->add_new_worksheet( ). - me->add_new_style( ). " Standard style - lo_style = me->add_new_style( ). " Standard style with fill gray125 - lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. - - endmethod. - - - - method GET_ACTIVE_SHEET_INDEX. - r_active_worksheet = me->worksheets->active_worksheet. - endmethod. - - - - method GET_ACTIVE_WORKSHEET. - - eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). - - endmethod. - - - - method GET_AUTOFILTERS_REFERENCE. - - ro_autofilters = autofilters. - - endmethod. - - - - method GET_DEFAULT_STYLE. - ep_style = me->default_style. - endmethod. - - - - - method GET_DRAWINGS_ITERATOR. - - CASE ip_type. - WHEN zcl_excel_drawing=>type_image. - eo_iterator = me->drawings->get_iterator( ). - WHEN zcl_excel_drawing=>type_chart. - eo_iterator = me->charts->get_iterator( ). - WHEN OTHERS. - ENDCASE. - - endmethod. - - - - method GET_NEXT_TABLE_ID. - DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lv_tables_count TYPE i. - - lo_iterator = me->get_worksheets_iterator( ). - WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). - - lv_tables_count = lo_worksheet->get_tables_size( ). - ADD lv_tables_count TO ep_id. - - ENDWHILE. - - ADD 1 TO ep_id. - - endmethod. - - - - method GET_RANGES_ITERATOR. - - eo_iterator = me->ranges->get_iterator( ). - - endmethod. - - - - - - method GET_STATIC_CELLSTYLE_GUID. -" # issue 139 - DATA: style LIKE LINE OF me->t_stylemapping1. - - READ TABLE me->t_stylemapping1 INTO style - WITH TABLE KEY dynamic_style_guid = style-guid " no dynamic style --> look for initial guid here - complete_style = ip_cstyle_complete - complete_stylex = ip_cstylex_complete. - IF sy-subrc <> 0. - style-complete_style = ip_cstyle_complete. - style-complete_stylex = ip_cstylex_complete. - CALL FUNCTION 'GUID_CREATE' - IMPORTING - ev_guid_16 = style-guid. - INSERT style INTO TABLE me->t_stylemapping1. - INSERT style INTO TABLE me->t_stylemapping2. - - ENDIF. - - ep_guid = style-guid. - endmethod. - - - - method GET_STYLES_ITERATOR. - - eo_iterator = me->styles->get_iterator( ). - - endmethod. - - - - - - method GET_STYLE_INDEX_IN_STYLES. - DATA: index TYPE syindex. - DATA: lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_style TYPE REF TO zcl_excel_style. - - CHECK ip_guid IS NOT INITIAL. - - - lo_iterator = me->get_styles_iterator( ). - WHILE lo_iterator->has_next( ) = 'X'. - ADD 1 TO index. - lo_style ?= lo_iterator->get_next( ). - IF lo_style->get_guid( ) = ip_guid. - ep_index = index. - EXIT. - ENDIF. - ENDWHILE. - - IF ep_index IS INITIAL. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Index not found'. - else. - SUBTRACT 1 from ep_index. " In excel list starts with "0" - ENDIF. - endmethod. - - - - - - method GET_STYLE_TO_GUID. - " # issue 139 - - READ TABLE me->t_stylemapping2 INTO ep_stylemapping WITH TABLE KEY guid = ip_guid. - IF sy-subrc <> 0. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'GUID not found'. - ENDIF. - - IF ep_stylemapping-dynamic_style_guid IS NOT INITIAL. - zcl_excel_common=>recursive_class_to_struct( EXPORTING i_source = ep_stylemapping-cl_style - CHANGING e_target = ep_stylemapping-complete_style - e_targetx = ep_stylemapping-complete_stylex ). - ENDIF. - - - endmethod. - - - - method GET_WORKSHEETS_ITERATOR. - - eo_iterator = me->worksheets->get_iterator( ). - - endmethod. - - - - method GET_WORKSHEETS_NAME. - - ep_name = me->worksheets->name. - - endmethod. - - - - method GET_WORKSHEETS_SIZE. - - ep_size = me->worksheets->size( ). - - endmethod. - - - - - method GET_WORKSHEET_BY_NAME. - - DATA: lv_index TYPE zexcel_active_worksheet, - l_size TYPE i. - - l_size = get_worksheets_size( ). - - DO l_size TIMES. - lv_index = sy-index. - eo_worksheet = me->worksheets->get( lv_index ). - IF eo_worksheet->get_title( ) = ip_sheet_name. - RETURN. - ENDIF. - ENDDO. - - CLEAR eo_worksheet. - - endmethod. - - - - method SET_ACTIVE_SHEET_INDEX. - me->worksheets->active_worksheet = i_active_worksheet. - endmethod. - - - - method SET_ACTIVE_SHEET_INDEX_BY_NAME. - - DATA: ws_it TYPE REF TO cl_object_collection_iterator, - ws TYPE REF TO zcl_excel_worksheet, - lv_title TYPE ZEXCEL_SHEET_TITLE, - count TYPE i VALUE 1. - - ws_it = me->worksheets->get_iterator( ). - - WHILE ws_it->if_object_collection_iterator~has_next( ) = abap_true. - ws ?= ws_it->if_object_collection_iterator~get_next( ). - lv_title = ws->get_title( ). - IF lv_title = i_worksheet_name. - me->worksheets->active_worksheet = count. - EXIT. - ENDIF. - count = count + 1. - ENDWHILE. - - endmethod. - - - - - method SET_DEFAULT_STYLE. - me->default_style = ip_style. - endmethod. - - - - - method STYLEMAPPING_DYNAMIC_STYLE. -" # issue 139 - eo_style2-dynamic_style_guid = ip_style->get_guid( ). - eo_style2-guid = eo_style2-dynamic_style_guid. - eo_style2-added_to_iterator = abap_true. - eo_style2-cl_style = ip_style. - -* don't care about attributes here, since this data may change -* dynamically - - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - - - - - method CONSTRUCTOR. - worksheet = io_sheet. - endmethod. - - - - method GET_FILTER_AREA. - - validate_area( ). - - rs_area = filter_area. - - endmethod. - - - - method GET_FILTER_RANGE. - DATA: l_row_start_c TYPE string, - l_row_end_c TYPE string, - l_col_start_c TYPE string, - l_col_end_c TYPE string, - l_value TYPE string. - - validate_area( ). - - l_row_end_c = filter_area-row_end. - CONDENSE l_row_end_c NO-GAPS. - - l_row_start_c = filter_area-row_start. - CONDENSE l_row_start_c NO-GAPS. - - l_col_start_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_start ) . - l_col_end_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_end ) . - - CONCATENATE l_col_start_c l_row_start_c ':' l_col_end_c l_row_end_c INTO r_range. - - endmethod. - - - - method GET_FILTER_REFERENCE. - DATA: l_row_start_c TYPE string, - l_row_end_c TYPE string, - l_col_start_c TYPE string, - l_col_end_c TYPE string, - l_value TYPE string. - - validate_area( ). - - l_row_end_c = filter_area-row_end. - CONDENSE l_row_end_c NO-GAPS. - - l_row_start_c = filter_area-row_start. - CONDENSE l_row_start_c NO-GAPS. - - l_col_start_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_start ) . - l_col_end_c = zcl_excel_common=>convert_column2alpha( ip_column = filter_area-col_end ) . - l_value = worksheet->get_title( ) . - - r_ref = zcl_excel_common=>escape_string( ip_value = l_value ). - - CONCATENATE r_ref '!$' l_col_start_c '$' l_row_start_c ':$' l_col_end_c '$' l_row_end_c INTO r_ref. - - endmethod. - - - - method GET_VALUES. - - rt_filter = values. - - endmethod. - - - - method SET_FILTER_AREA. - - filter_area = is_area. - - endmethod. - - - - - method SET_VALUE. - DATA: ls_values TYPE zexcel_s_autofilter_values. - -* Checks a re missing. - ls_values-column = i_column. - ls_values-value = i_value. - - INSERT ls_values INTO TABLE values. -* Now we need to be sure we don't get the same value again. - DELETE ADJACENT DUPLICATES FROM values COMPARING column value. - - endmethod. - - - - method SET_VALUES. - -* Checks are missing. - values = it_values. - DELETE ADJACENT DUPLICATES FROM values COMPARING column value. - - endmethod. - - - method VALIDATE_AREA. - DATA: l_col TYPE zexcel_cell_column, - l_row TYPE zexcel_cell_row. - - l_row = worksheet->get_highest_row( ) . - l_col = worksheet->get_highest_column( ) . - - IF filter_area IS INITIAL. - filter_area-row_start = 1. - filter_area-col_start = 1. - filter_area-row_end = l_row . - filter_area-col_end = l_col . - ENDIF. - - IF filter_area-row_start < 1. - filter_area-row_start = 1. - ENDIF. - IF filter_area-col_start < 1. - filter_area-col_start = 1. - ENDIF. - IF filter_area-row_end > l_row OR - filter_area-row_end < 1. - filter_area-row_end = l_row. - ENDIF. - IF filter_area-col_end > l_col OR - filter_area-col_end < 1. - filter_area-col_end = l_col. - ENDIF. - IF filter_area-row_start >= filter_area-row_end. - filter_area-row_start = filter_area-row_end - 1. - IF filter_area-row_start < 1. - filter_area-row_start = 1. - filter_area-row_end = 2. - ENDIF. - ENDIF. - IF filter_area-col_start > filter_area-col_end. - filter_area-col_start = filter_area-col_end. - ENDIF. - endmethod. - - - - *"* local class implementation for public class -*"* use this source file for the implementation part of -*"* local helper classes - *"* use this source file for any type declarations (class -*"* definitions, interfaces or data types) you need for method -*"* implementation or private method's signature -TYPES: BEGIN OF ts_objects, - sheet_guid TYPE uuid, - autofilter TYPE REF TO zcl_excel_autofilter, - END OF ts_objects, - - tt_objects TYPE HASHED TABLE OF ts_objects WITH UNIQUE KEY sheet_guid. - *"* use this source file for any macro definitions you need -*"* in the implementation part of the class - - ABAP - - - - - - method ADD. - DATA: ls_autofilters TYPE ts_objects, - l_guid TYPE uuid. - l_guid = io_sheet->get_guid( ) . - READ TABLE autofilters INTO ls_autofilters WITH TABLE KEY sheet_guid = l_guid. - IF sy-subrc = 0. - ro_autofilter = ls_autofilters-autofilter. - ELSE. - CREATE OBJECT ro_autofilter - EXPORTING - io_sheet = io_sheet. - ls_autofilters-autofilter = ro_autofilter. - ls_autofilters-sheet_guid = l_guid. - INSERT ls_autofilters INTO TABLE autofilters . - ENDIF. - endmethod. - - - method CLEAR. - - REFRESH autofilters. - - endmethod. - - - - - method GET. - - DATA: ls_autofilters TYPE ts_objects. - - READ TABLE autofilters INTO ls_autofilters WITH TABLE KEY sheet_guid = i_sheet_guid. - IF sy-subrc = 0. - ro_autofilter = ls_autofilters-autofilter. - ELSE. - CLEAR ro_autofilter. - ENDIF. - - endmethod. - - - - method IS_EMPTY. - IF autofilters IS INITIAL. - r_empty = abap_true. - ENDIF. - endmethod. - - - - method REMOVE. - DATA: ls_autofilters TYPE ts_objects. - - DELETE autofilters WHERE sheet_guid = i_sheet_guid. - - endmethod. - - - - method SIZE. - DESCRIBE TABLE autofilters LINES r_size. - endmethod. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lo_drawing TYPE REF TO zcl_excel_drawing, - lv_style_title_guid TYPE zexcel_cell_style, - ls_key TYPE wwwdatatab. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - - " add logo from SMWO - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 2 - ip_from_col = 'B' ). - - ls_key-relid = 'MI'. - ls_key-objid = 'WBLOGO'. - lo_drawing->set_media_www( ip_key = ls_key - ip_width = 140 - ip_height = 64 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_range TYPE REF TO zcl_excel_range, - lv_style_title_guid TYPE zexcel_cell_style, - ls_key TYPE wwwdatatab. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - - " add logo from SMWO - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 2 - ip_from_col = 'B' ). - - ls_key-relid = 'MI'. - ls_key-objid = 'WBLOGO'. - lo_drawing->set_media_www( ip_key = ls_key - ip_width = 140 - ip_height = 64 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " Add new sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Values' ). - - " Set values for range - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'Values'. - lo_range->set_value( ip_sheet_name = 'Values' - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 8 ). - - lo_excel->set_active_sheet_index( 1 ). - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_range TYPE REF TO zcl_excel_range, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lv_style_title_guid TYPE zexcel_cell_style, - ls_key TYPE wwwdatatab. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). - - " add logo from SMWO - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 2 - ip_from_col = 'B' ). - - ls_key-relid = 'MI'. - ls_key-objid = 'WBLOGO'. - lo_drawing->set_media_www( ip_key = ls_key - ip_width = 140 - ip_height = 64 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " Add new sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Values' ). - - " Set values for range - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'Values'. - lo_range->set_value( ip_sheet_name = 'Values' - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 8 ). - - lo_excel->set_active_sheet_index( 1 ). - - " add data validation - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 7. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). - - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 8. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_range TYPE REF TO zcl_excel_range, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lv_style_title_guid TYPE zexcel_cell_style, - ls_key TYPE wwwdatatab. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). - - " add logo from SMWO - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 2 - ip_from_col = 'B' ). - - ls_key-relid = 'MI'. - ls_key-objid = 'WBLOGO'. - lo_drawing->set_media_www( ip_key = ls_key - ip_width = 140 - ip_height = 64 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " Add new sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Values' ). - - " Set values for range - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'Values'. - lo_range->set_value( ip_sheet_name = 'Values' - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 8 ). - - lo_excel->set_active_sheet_index( 1 ). - - " add data validation - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 7. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). - - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 8. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). - - " add autosize (column width) - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_range TYPE REF TO zcl_excel_range, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lv_style_title_guid TYPE zexcel_cell_style, - ls_key TYPE wwwdatatab. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). - - lo_worksheet->set_cell( ip_column = 'B' ip_row = 10 ip_value = 'Total score' ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 10 ip_formula = 'SUM(C7:C8)' ). - - " add logo from SMWO - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 2 - ip_from_col = 'B' ). - - ls_key-relid = 'MI'. - ls_key-objid = 'WBLOGO'. - lo_drawing->set_media_www( ip_key = ls_key - ip_width = 140 - ip_height = 64 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " Add new sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Values' ). - - " Set values for range - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'Values'. - lo_range->set_value( ip_sheet_name = 'Values' - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 8 ). - - lo_excel->set_active_sheet_index( 1 ). - - " add data validation - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 7. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). - - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 8. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). - - " add autosize (column width) - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lo_style_green TYPE REF TO zcl_excel_style, - lo_style_yellow TYPE REF TO zcl_excel_style, - lo_style_red TYPE REF TO zcl_excel_style, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_range TYPE REF TO zcl_excel_range, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lo_style_conditional TYPE REF TO zcl_excel_style_conditional, - lv_style_title_guid TYPE zexcel_cell_style, - lv_style_green_guid TYPE zexcel_cell_style, - lv_style_yellow_guid TYPE zexcel_cell_style, - lv_style_red_guid TYPE zexcel_cell_style, - ls_cellis TYPE zexcel_conditional_cellis, - ls_key TYPE wwwdatatab. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). - - lo_worksheet->set_cell( ip_column = 'B' ip_row = 10 ip_value = 'Total score' ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 10 ip_formula = 'SUM(C7:C8)' ). - - " add logo from SMWO - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 2 - ip_from_col = 'B' ). - -* ls_key-relid = 'MI'. -* ls_key-objid = 'WBLOGO'. -* lo_drawing->set_media_www( ip_key = ls_key -* ip_width = 140 -* ip_height = 64 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " Add new sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Values' ). - - " Set values for range - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'Values'. - lo_range->set_value( ip_sheet_name = 'Values' - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 8 ). - - lo_excel->set_active_sheet_index( 1 ). - - " add data validation - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 7. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). - - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 8. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). - - " add autosize (column width) - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - - " defne conditional styles - lo_style_green = lo_excel->add_new_style( ). - lo_style_green->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_green->fill->bgcolor-rgb = zcl_excel_style_color=>c_green. - lv_style_green_guid = lo_style_green->get_guid( ). - - lo_style_yellow = lo_excel->add_new_style( ). - lo_style_yellow->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_yellow->fill->bgcolor-rgb = zcl_excel_style_color=>c_yellow. - lv_style_yellow_guid = lo_style_yellow->get_guid( ). - - lo_style_red = lo_excel->add_new_style( ). - lo_style_red->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_red->fill->bgcolor-rgb = zcl_excel_style_color=>c_red. - lv_style_red_guid = lo_style_red->get_guid( ). - - " add conditional formatting - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '5'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. - ls_cellis-cell_style = lv_style_green_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 1. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 10 - ip_stop_column = 'C' - ip_stop_row = 10 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '5'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. - ls_cellis-cell_style = lv_style_yellow_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 2. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 10 - ip_stop_column = 'C' - ip_stop_row = 10 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '0'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. - ls_cellis-cell_style = lv_style_red_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 3. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 10 - ip_stop_column = 'C' - ip_stop_row = 10 ). - - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lo_style_green TYPE REF TO zcl_excel_style, - lo_style_yellow TYPE REF TO zcl_excel_style, - lo_style_red TYPE REF TO zcl_excel_style, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_range TYPE REF TO zcl_excel_range, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lo_style_conditional TYPE REF TO zcl_excel_style_conditional, - lv_style_title_guid TYPE zexcel_cell_style, - lv_style_green_guid TYPE zexcel_cell_style, - lv_style_yellow_guid TYPE zexcel_cell_style, - lv_style_red_guid TYPE zexcel_cell_style, - ls_cellis TYPE zexcel_conditional_cellis, - ls_key TYPE wwwdatatab. - -DATA: lo_send_request TYPE REF TO cl_bcs, - lo_document TYPE REF TO cl_document_bcs, - lo_sender TYPE REF TO cl_sapuser_bcs, - lo_recipient TYPE REF TO cl_sapuser_bcs, - lo_recipient_i TYPE REF TO CL_CAM_ADDRESS_BCS. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lv_bytecount_c TYPE sood-objlen, - lt_file_tab TYPE solix_tab. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Is abap2xlsx simple' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Is abap2xlsx CooL' ). - - lo_worksheet->set_cell( ip_column = 'B' ip_row = 10 ip_value = 'Total score' ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 10 ip_formula = 'SUM(C7:C8)' ). - - " add logo from SMWO - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 2 - ip_from_col = 'B' ). - - ls_key-relid = 'MI'. - ls_key-objid = 'WBLOGO'. - lo_drawing->set_media_www( ip_key = ls_key - ip_width = 140 - ip_height = 64 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " Add new sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Values' ). - - " Set values for range - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 1 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 2 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 3 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 4 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 5 ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'Values'. - lo_range->set_value( ip_sheet_name = 'Values' - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 8 ). - - lo_excel->set_active_sheet_index( 1 ). - - " add data validation - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 7. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Select a value' ). - - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = 'Values'. - lo_data_validation->cell_row = 8. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Select a value' ). - - " add autosize (column width) - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - - " defne conditional styles - lo_style_green = lo_excel->add_new_style( ). - lo_style_green->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_green->fill->bgcolor-rgb = zcl_excel_style_color=>c_green. - lv_style_green_guid = lo_style_green->get_guid( ). - - lo_style_yellow = lo_excel->add_new_style( ). - lo_style_yellow->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_yellow->fill->bgcolor-rgb = zcl_excel_style_color=>c_yellow. - lv_style_yellow_guid = lo_style_yellow->get_guid( ). - - lo_style_red = lo_excel->add_new_style( ). - lo_style_red->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_red->fill->bgcolor-rgb = zcl_excel_style_color=>c_red. - lv_style_red_guid = lo_style_red->get_guid( ). - - " add conditional formatting - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '5'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. - ls_cellis-cell_style = lv_style_green_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 1. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 10 - ip_stop_column = 'C' - ip_stop_row = 10 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '5'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. - ls_cellis-cell_style = lv_style_yellow_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 2. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 10 - ip_stop_column = 'C' - ip_stop_row = 10 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '0'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_greaterthan. - ls_cellis-cell_style = lv_style_red_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 3. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 10 - ip_stop_column = 'C' - ip_stop_row = 10 ). - - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - lv_bytecount_c = lv_bytecount. - - " Send via email - lo_document = cl_document_bcs=>create_document( i_type = 'RAW' - i_subject = 'Demo TechEd' ). - - lo_document->add_attachment( i_attachment_type = 'EXT' - i_attachment_subject = 'abap2xlsx.xlsx' - i_attachment_size = lv_bytecount_c - i_att_content_hex = lt_file_tab ). - - lo_sender = cl_sapuser_bcs=>create( sy-uname ). - lo_recipient = cl_sapuser_bcs=>create( sy-uname ). -* lo_recipient_i = cl_cam_address_bcs=>create_internet_address( 'ivan.femia@techedge.it' ). - - lo_send_request = cl_bcs=>create_persistent( ). - lo_send_request->set_document( lo_document ). - lo_send_request->set_sender( lo_sender ). - lo_send_request->add_recipient( lo_recipient ). - lo_send_request->set_send_immediately( abap_true ). - lo_send_request->send( ). - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZABAP2XLSX_DEMO_SHOW -*&---------------------------------------------------------------------* -REPORT zabap2xlsx_demo_like_se83. - - -*----------------------------------------------------------------------* -* CLASS lcl_perform DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_perform DEFINITION CREATE PRIVATE. - PUBLIC SECTION. - CLASS-METHODS: setup_objects, - collect_reports, - - handle_nav FOR EVENT double_click OF cl_gui_alv_grid - IMPORTING e_row. - - PRIVATE SECTION. - TYPES: BEGIN OF ty_reports, - progname TYPE reposrc-progname, - sort TYPE reposrc-progname, - filename TYPE string, - END OF ty_reports. - - CLASS-DATA: - lo_grid TYPE REF TO cl_gui_alv_grid, - lo_text TYPE REF TO cl_gui_textedit, - cl_document TYPE REF TO i_oi_document_proxy, - - t_reports TYPE STANDARD TABLE OF ty_reports WITH NON-UNIQUE DEFAULT KEY. - CLASS-DATA:error TYPE REF TO i_oi_error, - t_errors TYPE STANDARD TABLE OF REF TO i_oi_error WITH NON-UNIQUE DEFAULT KEY, - cl_control TYPE REF TO i_oi_container_control. "Office Dokument - -ENDCLASS. "lcl_perform DEFINITION - - -START-OF-SELECTION. - lcl_perform=>collect_reports( ). - lcl_perform=>setup_objects( ). - -END-OF-SELECTION. - - WRITE '.'. " Force output - - -*----------------------------------------------------------------------* -* CLASS lcl_perform IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_perform IMPLEMENTATION. - METHOD setup_objects. - DATA: lo_split TYPE REF TO cl_gui_splitter_container, - lo_container TYPE REF TO cl_gui_container. - - DATA: it_fieldcat TYPE lvc_t_fcat, - is_layout TYPE lvc_s_layo, - is_variant TYPE disvariant. - FIELD-SYMBOLS: <fc> LIKE LINE OF it_fieldcat. - - - CREATE OBJECT lo_split - EXPORTING - parent = cl_gui_container=>screen0 - rows = 1 - columns = 3 - no_autodef_progid_dynnr = 'X'. - lo_split->set_column_width( EXPORTING id = 1 - width = 20 ). - lo_split->set_column_width( EXPORTING id = 2 - width = 40 ). - -* Left: List of reports - lo_container = lo_split->get_container( row = 1 - column = 1 ). - - CREATE OBJECT lo_grid - EXPORTING - i_parent = lo_container. - SET HANDLER lcl_perform=>handle_nav FOR lo_grid. - - is_variant-report = sy-repid. - is_variant-handle = '0001'. - - is_layout-cwidth_opt = 'X'. - - APPEND INITIAL LINE TO it_fieldcat ASSIGNING <fc>. - <fc>-fieldname = 'PROGNAME'. - <fc>-tabname = 'REPOSRC'. - - APPEND INITIAL LINE TO it_fieldcat ASSIGNING <fc>. - <fc>-fieldname = 'SORT'. - <fc>-ref_field = 'PROGNAME'. - <fc>-ref_table = 'REPOSRC'. - - - lo_grid->set_table_for_first_display( EXPORTING - is_variant = is_variant - i_save = 'A' - is_layout = is_layout - CHANGING - it_outtab = t_reports - it_fieldcatalog = it_fieldcat - EXCEPTIONS - invalid_parameter_combination = 1 - program_error = 2 - too_many_lines = 3 - OTHERS = 4 ). - -* Middle: Text with coding - lo_container = lo_split->get_container( row = 1 - column = 2 ). - CREATE OBJECT lo_text - EXPORTING - parent = lo_container. - lo_text->set_readonly_mode( cl_gui_textedit=>true ). - lo_text->set_font_fixed( ). - - - -* right: DemoOutput - lo_container = lo_split->get_container( row = 1 - column = 3 ). - - c_oi_container_control_creator=>get_container_control( IMPORTING control = cl_control - error = error ). - APPEND error TO t_errors. - - cl_control->init_control( EXPORTING inplace_enabled = 'X' - no_flush = 'X' - r3_application_name = 'Demo Document Container' - parent = lo_container - IMPORTING error = error - EXCEPTIONS OTHERS = 2 ). - APPEND error TO t_errors. - - cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL - no_flush = ' ' - IMPORTING document_proxy = cl_document - error = error ). - APPEND error TO t_errors. -* Errorhandling should be inserted here - - - ENDMETHOD. "setup_objects - - "collect_reports - METHOD collect_reports. - FIELD-SYMBOLS:<report> LIKE LINE OF t_reports. - DATA: t_source TYPE STANDARD TABLE OF text255 WITH NON-UNIQUE DEFAULT KEY. - -* Get all demoreports - SELECT progname - INTO CORRESPONDING FIELDS OF TABLE t_reports - FROM reposrc - WHERE progname LIKE 'ZDEMO_EXCEL%' - AND progname <> sy-repid - AND subc = '1'. - - LOOP AT t_reports ASSIGNING <report>. - -* Check if already switched to new outputoptions - READ REPORT <report>-progname INTO t_source. - IF sy-subrc = 0. - FIND 'INCLUDE zdemo_excel_outputopt_incl.' IN TABLE t_source IGNORING CASE. - ENDIF. - IF sy-subrc <> 0. - DELETE t_reports. - CONTINUE. - ENDIF. - - -* Build half-numeric sort - <report>-sort = <report>-progname. - REPLACE REGEX '(ZDEMO_EXCEL)(\d\d)\s*$' IN <report>-sort WITH '$1\0$2'. " REPLACE REGEX '(ZDEMO_EXCEL)([^][^])*$' IN <report>-sort WITH '$1$2'.REPLACE REGEX '(ZDEMO_EXCEL)([^][^])*$' IN <report>-sort WITH '$1$2'.REPLACE - - REPLACE REGEX '(ZDEMO_EXCEL)(\d)\s*$' IN <report>-sort WITH '$1\0\0$2'. - ENDLOOP. - SORT t_reports BY sort progname. - - ENDMETHOD. "collect_reports - - METHOD handle_nav. - CONSTANTS: filename TYPE text80 VALUE 'ZABAP2XLSX_DEMO_SHOW.xlsx'. - DATA: wa_report LIKE LINE OF t_reports, - t_source TYPE STANDARD TABLE OF text255, - t_rawdata TYPE solix_tab, - wa_rawdata LIKE LINE OF t_rawdata, - bytecount TYPE i, - length TYPE i, - add_selopt TYPE flag. - - - READ TABLE t_reports INTO wa_report INDEX e_row-index. - CHECK sy-subrc = 0. - -* Set new text into middle frame - READ REPORT wa_report-progname INTO t_source. - lo_text->set_text_as_r3table( EXPORTING table = t_source ). - - -* Unload old xls-file - cl_document->close_document( ). - -* Get the demo -* If additional parameters found on selection screen, start via selection screen , otherwise start w/o - CLEAR add_selopt. - FIND 'PARAMETERS' IN TABLE t_source. - IF sy-subrc = 0. - add_selopt = 'X'. - ELSE. - FIND 'SELECT-OPTIONS' IN TABLE t_source. - IF sy-subrc = 0. - add_selopt = 'X'. - ENDIF. - ENDIF. - IF add_selopt IS INITIAL. - SUBMIT (wa_report-progname) AND RETURN - WITH p_backfn = filename - WITH rb_back = 'X' - WITH rb_down = ' ' - WITH rb_send = ' ' - WITH rb_show = ' '. - ELSE. - SUBMIT (wa_report-progname) VIA SELECTION-SCREEN AND RETURN - WITH p_backfn = filename - WITH rb_back = 'X' - WITH rb_down = ' ' - WITH rb_send = ' ' - WITH rb_show = ' '. - ENDIF. - - OPEN DATASET filename FOR INPUT IN BINARY MODE. - IF sy-subrc = 0. - DO. - CLEAR wa_rawdata. - READ DATASET filename INTO wa_rawdata LENGTH length. - IF sy-subrc <> 0. - APPEND wa_rawdata TO t_rawdata. - ADD length TO bytecount. - EXIT. - ENDIF. - APPEND wa_rawdata TO t_rawdata. - ADD length TO bytecount. - ENDDO. - CLOSE DATASET filename. - ENDIF. - - cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL - no_flush = ' ' - IMPORTING document_proxy = cl_document - error = error ). - - cl_document->open_document_from_table( EXPORTING document_size = bytecount - document_table = t_rawdata - open_inplace = 'X' ). - - ENDMETHOD. "handle_nav - -ENDCLASS. "lcl_perform IMPLEMENTATION - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZANGRY_BIRDS -*& Just for fun -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zangry_birds. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_border_light TYPE REF TO zcl_excel_style_border, - lo_style_color0 TYPE REF TO zcl_excel_style, - lo_style_color1 TYPE REF TO zcl_excel_style, - lo_style_color2 TYPE REF TO zcl_excel_style, - lo_style_color3 TYPE REF TO zcl_excel_style, - lo_style_color4 TYPE REF TO zcl_excel_style, - lo_style_color5 TYPE REF TO zcl_excel_style, - lo_style_color6 TYPE REF TO zcl_excel_style, - lo_style_color7 TYPE REF TO zcl_excel_style, - lo_style_credit TYPE REF TO zcl_excel_style, - lo_style_link TYPE REF TO zcl_excel_style, - lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink. - -DATA: lv_style_color0_guid TYPE zexcel_cell_style, - lv_style_color1_guid TYPE zexcel_cell_style, - lv_style_color2_guid TYPE zexcel_cell_style, - lv_style_color3_guid TYPE zexcel_cell_style, - lv_style_color4_guid TYPE zexcel_cell_style, - lv_style_color5_guid TYPE zexcel_cell_style, - lv_style_color6_guid TYPE zexcel_cell_style, - lv_style_color7_guid TYPE zexcel_cell_style, - lv_style_credit_guid TYPE zexcel_cell_style, - lv_style_link_guid TYPE zexcel_cell_style, - lv_style TYPE zexcel_cell_style. - -DATA: lv_col_str TYPE zexcel_cell_column_alpha, - lv_row TYPE i, - lv_col TYPE i, - lt_mapper TYPE TABLE OF zexcel_cell_style, - ls_mapper TYPE zexcel_cell_style. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'angry_birds.xlsx'. - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - - " Creates active sheet - CREATE OBJECT lo_excel. - - CREATE OBJECT lo_border_light. - lo_border_light->border_color-rgb = zcl_excel_style_color=>c_white. - lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. - - " Create color white - lo_style_color0 = lo_excel->add_new_style( ). - lo_style_color0->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color0->fill->fgcolor-rgb = 'FFFFFFFF'. - lo_style_color0->borders->allborders = lo_border_light. - lv_style_color0_guid = lo_style_color0->get_guid( ). - - " Create color black - lo_style_color1 = lo_excel->add_new_style( ). - lo_style_color1->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color1->fill->fgcolor-rgb = 'FF252525'. - lo_style_color1->borders->allborders = lo_border_light. - lv_style_color1_guid = lo_style_color1->get_guid( ). - - " Create color dark green - lo_style_color2 = lo_excel->add_new_style( ). - lo_style_color2->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color2->fill->fgcolor-rgb = 'FF75913A'. - lo_style_color2->borders->allborders = lo_border_light. - lv_style_color2_guid = lo_style_color2->get_guid( ). - - " Create color light green - lo_style_color3 = lo_excel->add_new_style( ). - lo_style_color3->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color3->fill->fgcolor-rgb = 'FF9DFB73'. - lo_style_color3->borders->allborders = lo_border_light. - lv_style_color3_guid = lo_style_color3->get_guid( ). - - " Create color green - lo_style_color4 = lo_excel->add_new_style( ). - lo_style_color4->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color4->fill->fgcolor-rgb = 'FF92CF56'. - lo_style_color4->borders->allborders = lo_border_light. - lv_style_color4_guid = lo_style_color4->get_guid( ). - - " Create color 2dark green - lo_style_color5 = lo_excel->add_new_style( ). - lo_style_color5->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color5->fill->fgcolor-rgb = 'FF506228'. - lo_style_color5->borders->allborders = lo_border_light. - lv_style_color5_guid = lo_style_color5->get_guid( ). - - " Create color yellow - lo_style_color6 = lo_excel->add_new_style( ). - lo_style_color6->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color6->fill->fgcolor-rgb = 'FFC3E224'. - lo_style_color6->borders->allborders = lo_border_light. - lv_style_color6_guid = lo_style_color6->get_guid( ). - - " Create color yellow - lo_style_color7 = lo_excel->add_new_style( ). - lo_style_color7->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_color7->fill->fgcolor-rgb = 'FFB3C14F'. - lo_style_color7->borders->allborders = lo_border_light. - lv_style_color7_guid = lo_style_color7->get_guid( ). - - " Credits - lo_style_credit = lo_excel->add_new_style( ). - lo_style_credit->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_credit->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. - lo_style_credit->font->size = 20. - lv_style_credit_guid = lo_style_credit->get_guid( ). - - " Link - lo_style_link = lo_excel->add_new_style( ). - lo_style_link->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_link->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. -* lo_style_link->font->size = 20. - lv_style_link_guid = lo_style_link->get_guid( ). - - " Create image map " line 2 - DO 30 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 3 - DO 28 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 5 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 4 - DO 27 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 5 - DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 15 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 6 - DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 13 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 7 - DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 5 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 11 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 5 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 8 - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 9 - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 10 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 11 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 7 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 12 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 13 - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 8 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 14 - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 12 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 15 - DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 8 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 16 - DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 7 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 5 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 17 - DO 8 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 13 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 18 - DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 23 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 19 - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 27 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 20 - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 23 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 21 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 19 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 22 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 17 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 23 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 17 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 8 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 24 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 25 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 8 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 26 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color6_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 27 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color6_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 28 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color6_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 29 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 30 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 31 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color4_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 32 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 8 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color5_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 33 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 34 - DO 3 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 35 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 36 - DO 4 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 37 - DO 5 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color7_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 38 - DO 6 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 10 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 11 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 39 - DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 22 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 1 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 40 - DO 7 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 17 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 41 - DO 8 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 3 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 15 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 42 - DO 9 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 5 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 9 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 2 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 43 - DO 11 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 5 TIMES. APPEND lv_style_color3_guid TO lt_mapper. ENDDO. - DO 7 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 44 - DO 13 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 6 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - DO 4 TIMES. APPEND lv_style_color2_guid TO lt_mapper. ENDDO. - DO 8 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 45 - DO 16 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 13 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - " line 46 - DO 18 TIMES. APPEND lv_style_color0_guid TO lt_mapper. ENDDO. - DO 8 TIMES. APPEND lv_style_color1_guid TO lt_mapper. ENDDO. - APPEND INITIAL LINE TO lt_mapper. " escape - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Angry Birds' ). - - lv_row = 1. - lv_col = 1. - - LOOP AT lt_mapper INTO ls_mapper. - lv_col_str = zcl_excel_common=>convert_column2alpha( lv_col ). - IF ls_mapper IS INITIAL. - lo_row_dimension = lo_worksheet->get_row_dimension( ip_row = lv_row ). - lo_row_dimension->set_row_height( ip_row_height = 8 ). - lv_col = 1. - lv_row = lv_row + 1. - CONTINUE. - ENDIF. - lo_worksheet->set_cell( ip_column = lv_col_str - ip_row = lv_row - ip_value = space - ip_style = ls_mapper ). - lv_col = lv_col + 1. - - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = lv_col_str ). - lo_column_dimension->set_width( ip_width = 2 ). - ENDLOOP. - - lo_worksheet->set_show_gridlines( i_show_gridlines = abap_false ). - - lo_worksheet->set_cell( ip_column = 'AP' - ip_row = 15 - ip_value = 'Created with abap2xlsx' - ip_style = lv_style_credit_guid ). - - lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'http://www.abap2xlsx.org' ). - lo_worksheet->set_cell( ip_column = 'AP' - ip_row = 24 - ip_value = 'http://www.abap2xlsx.org' - ip_style = lv_style_link_guid - ip_hyperlink = lo_hyperlink ). - - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'AP' ). - lo_column_dimension->set_auto_size( ip_auto_size = abap_true ). - lo_worksheet->set_merge( ip_row = 15 ip_column_start = 'AP' ip_row_to = 22 ip_column_end = 'AR' ). - lo_worksheet->set_merge( ip_row = 24 ip_column_start = 'AP' ip_row_to = 26 ip_column_end = 'AR' ). - - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = lv_file - IMPORTING - output_length = lv_bytecount - TABLES - binary_tab = lt_file_tab. -* " This method is only available on AS ABAP > 6.40 -* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). -* lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - - - - - - - - - - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_CALENDAR -*& abap2xlsx Demo: Create Calendar with Pictures -*&---------------------------------------------------------------------* -*& This report creates a monthly calendar in the specified date range. -*& Each month is put on a seperate worksheet. The pictures for each -*& month can be specified in a tab delimited file called "Calendar.txt" -*& which is saved in the Export Directory. By default this is the SAP -*& Workdir. The file contains 3 fields: -*& -*& Month (with leading 0) -*& Image Filename -*& Image Description -*& URL for the Description -*& -*& The Images should be landscape JPEG's with a 3:2 ratio and min. -*& 450 pixel height. They must also be saved in the Export Directory. -*& In my tests I've discovered a limit of 20 MB in the -*& cl_gui_frontend_services=>gui_download method. So keep your images -*& smaller or chnage to a server export using OPEN DATASET. -*&---------------------------------------------------------------------* - -REPORT zdemo_calendar. - -TYPE-POOLS: abap. -CONSTANTS: gc_save_file_name TYPE string VALUE 'Calendar.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. -INCLUDE zdemo_calendar_classes. - -DATA: lv_workdir TYPE string. - -PARAMETERS: p_from TYPE dfrom DEFAULT '20130101', - p_to TYPE dto DEFAULT '20131231'. - -SELECTION-SCREEN BEGIN OF BLOCK orientation WITH FRAME TITLE orient. -PARAMETERS: p_portr TYPE flag RADIOBUTTON GROUP orie, - p_lands TYPE flag RADIOBUTTON GROUP orie DEFAULT 'X'. -SELECTION-SCREEN END OF BLOCK orientation. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - orient = 'Orientation'(000). - -START-OF-SELECTION. - - DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, - lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi, - hyperlink TYPE REF TO zcl_excel_hyperlink, - lo_drawing TYPE REF TO zcl_excel_drawing. - - DATA: lo_style_month TYPE REF TO zcl_excel_style, - lv_style_month_guid TYPE zexcel_cell_style. - DATA: lo_style_border TYPE REF TO zcl_excel_style, - lo_border_dark TYPE REF TO zcl_excel_style_border, - lv_style_border_guid TYPE zexcel_cell_style. - DATA: lo_style_center TYPE REF TO zcl_excel_style, - lv_style_center_guid TYPE zexcel_cell_style. - - DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - - DATA: lv_full_path TYPE string, - image_descr_path TYPE string, - lv_file_separator TYPE c. - DATA: lv_content TYPE xstring, - width TYPE i, - lv_height TYPE i, - lv_from_row TYPE zexcel_cell_row. - - DATA: month TYPE i, - month_nr TYPE fcmnr, - count TYPE i VALUE 1, - title TYPE zexcel_sheet_title, - value TYPE string, - image_path TYPE string, - date_from TYPE datum, - date_to TYPE datum, - row TYPE zexcel_cell_row, - to_row TYPE zexcel_cell_row, - to_col TYPE zexcel_cell_column_alpha, - to_col_end TYPE zexcel_cell_column_alpha, - to_col_int TYPE i. - - DATA: month_names TYPE TABLE OF t247. - FIELD-SYMBOLS: <month_name> LIKE LINE OF month_names. - - TYPES: BEGIN OF tt_datatab, - month_nr TYPE fcmnr, - filename TYPE string, - descr TYPE string, - url TYPE string, - END OF tt_datatab. - - DATA: image_descriptions TYPE TABLE OF tt_datatab. - FIELD-SYMBOLS: <img_descr> LIKE LINE OF image_descriptions. - - CONSTANTS: lv_default_file_name TYPE string VALUE 'Calendar', "#EC NOTEXT - c_from_row_portrait TYPE zexcel_cell_row VALUE 28, - c_from_row_landscape TYPE zexcel_cell_row VALUE 38, - from_col TYPE zexcel_cell_column_alpha VALUE 'C', - c_height_portrait TYPE i VALUE 450, " Image Height in Portrait Mode - c_height_landscape TYPE i VALUE 670, " Image Height in Landscape Mode - c_factor TYPE f VALUE '1.5'. " Image Ratio, default 3:2 - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name '.xlsx' INTO lv_full_path. "#EC NOTEXT - - " Read Image Names for Month and Description - CONCATENATE p_path lv_file_separator lv_default_file_name '.txt' INTO image_descr_path. "#EC NOTEXT - cl_gui_frontend_services=>gui_upload( - EXPORTING - filename = image_descr_path " Name of file - filetype = 'ASC' " File Type (ASCII, Binary) - has_field_separator = 'X' - read_by_line = 'X' " File Written Line-By-Line to the Internal Table - CHANGING - data_tab = image_descriptions " Transfer table for file contents - 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 <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Create Styles - " Create an underline double style - lo_style_month = lo_excel->add_new_style( ). - " lo_style_month->font->underline = abap_true. - " lo_style_month->font->underline_mode = zcl_excel_style_font=>c_underline_single. - lo_style_month->font->name = zcl_excel_style_font=>c_name_roman. - lo_style_month->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_month->font->family = zcl_excel_style_font=>c_family_roman. - lo_style_month->font->bold = abap_true. - lo_style_month->font->size = 36. - lv_style_month_guid = lo_style_month->get_guid( ). - " Create border object - CREATE OBJECT lo_border_dark. - lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. - lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. - "Create style with border - lo_style_border = lo_excel->add_new_style( ). - lo_style_border->borders->allborders = lo_border_dark. - lo_style_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. - lo_style_border->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. - lv_style_border_guid = lo_style_border->get_guid( ). - "Create style alignment center - lo_style_center = lo_excel->add_new_style( ). - lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_center->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. - lv_style_center_guid = lo_style_center->get_guid( ). - - " Get Month Names - CALL FUNCTION 'MONTH_NAMES_GET' - TABLES - month_names = month_names. - - zcl_date_calculation=>months_between_two_dates( - EXPORTING - i_date_from = p_from - i_date_to = p_to - i_incl_to = abap_true - IMPORTING - e_month = month - ). - - date_from = p_from. - - WHILE count <= month. - IF count = 1. - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - ELSE. - lo_worksheet = lo_excel->add_new_worksheet( ). - ENDIF. - - lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. - - title = count. - value = count. - CONDENSE title. - CONDENSE value. - lo_worksheet->set_title( title ). - lo_worksheet->set_print_gridlines( abap_false ). - lo_worksheet->sheet_setup->paper_size = zcl_excel_sheet_setup=>c_papersize_a4. - lo_worksheet->sheet_setup->horizontal_centered = abap_true. - lo_worksheet->sheet_setup->vertical_centered = abap_true. - lo_col_dim = lo_worksheet->get_column_dimension( 'A' ). - lo_col_dim->set_width( '1.0' ). - lo_col_dim = lo_worksheet->get_column_dimension( 'B' ). - lo_col_dim->set_width( '2.0' ). - IF p_lands = abap_true. - lo_worksheet->sheet_setup->orientation = zcl_excel_sheet_setup=>c_orientation_landscape. - lv_height = c_height_landscape. - lv_from_row = c_from_row_landscape. - lo_worksheet->sheet_setup->margin_top = '0.10'. - lo_worksheet->sheet_setup->margin_left = '0.10'. - lo_worksheet->sheet_setup->margin_right = '0.10'. - lo_worksheet->sheet_setup->margin_bottom = '0.10'. - ELSE. - lo_col_dim = lo_worksheet->get_column_dimension( 'K' ). - lo_col_dim->set_width( '3.0' ). - lo_worksheet->sheet_setup->margin_top = '0.80'. - lo_worksheet->sheet_setup->margin_left = '0.55'. - lo_worksheet->sheet_setup->margin_right = '0.05'. - lo_worksheet->sheet_setup->margin_bottom = '0.30'. - lv_height = c_height_portrait. - lv_from_row = c_from_row_portrait. - ENDIF. - - " Add Month Name - month_nr = date_from+4(2). - IF p_portr = abap_true. - READ TABLE month_names WITH KEY mnr = month_nr ASSIGNING <month_name>. - CONCATENATE <month_name>-ltx ` ` date_from(4) INTO value. - row = lv_from_row - 2. - to_col = from_col. - ELSE. - row = lv_from_row - 1. - to_col_int = zcl_excel_common=>convert_column2int( from_col ) + 32. - to_col = zcl_excel_common=>convert_column2alpha( to_col_int ). - to_col_int = to_col_int + 1. - to_col_end = zcl_excel_common=>convert_column2alpha( to_col_int ). - CONCATENATE month_nr '/' date_from+2(2) INTO value. - to_row = row + 2. - lo_worksheet->set_merge( - EXPORTING - ip_column_start = to_col " Cell Column Start - ip_column_end = to_col_end " Cell Column End - ip_row = row " Cell Row - ip_row_to = to_row " Cell Row - ). - ENDIF. - lo_worksheet->set_cell( - EXPORTING - ip_column = to_col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = lv_style_month_guid - ). - -* to_col_int = zcl_excel_common=>convert_column2int( from_col ) + 7. -* to_col = zcl_excel_common=>convert_column2alpha( to_col_int ). -* -* lo_worksheet->set_merge( -* EXPORTING -* ip_column_start = from_col " Cell Column Start -* ip_column_end = to_col " Cell Column End -* ip_row = row " Cell Row -* ip_row_to = row " Cell Row -* ). - - " Add drawing from a XSTRING read from a file - UNASSIGN <img_descr>. - READ TABLE image_descriptions WITH KEY month_nr = month_nr ASSIGNING <img_descr>. - IF <img_descr> IS ASSIGNED. - value = <img_descr>-descr. - IF p_portr = abap_true. - row = lv_from_row - 3. - ELSE. - row = lv_from_row - 2. - ENDIF. - IF NOT <img_descr>-url IS INITIAL. - hyperlink = zcl_excel_hyperlink=>create_external_link( <img_descr>-url ). - lo_worksheet->set_cell( - EXPORTING - ip_column = from_col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_hyperlink = hyperlink - ). - ELSE. - lo_worksheet->set_cell( - EXPORTING - ip_column = from_col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ). - ENDIF. - lo_row_dim = lo_worksheet->get_row_dimension( row ). - lo_row_dim->set_row_height( '22.0' ). - - " In Landscape mode the row between the description and the - " dates should be not so high - IF p_lands = abap_true. - row = lv_from_row - 3. - lo_worksheet->set_cell( - EXPORTING - ip_column = from_col " Cell Column - ip_row = row " Cell Row - ip_value = ' ' " Cell Value - ). - lo_row_dim = lo_worksheet->get_row_dimension( row ). - lo_row_dim->set_row_height( '7.0' ). - row = lv_from_row - 1. - lo_row_dim = lo_worksheet->get_row_dimension( row ). - lo_row_dim->set_row_height( '5.0' ). - ENDIF. - - CONCATENATE p_path lv_file_separator <img_descr>-filename INTO image_path. - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 1 - ip_from_col = 'B' ). - - lv_content = zcl_helper=>load_image( image_path ). - width = lv_height * c_factor. - lo_drawing->set_media( ip_media = lv_content - ip_media_type = zcl_excel_drawing=>c_media_type_jpg - ip_width = width - ip_height = lv_height ). - lo_worksheet->add_drawing( lo_drawing ). - ENDIF. - - " Add Calendar - CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH' - EXPORTING - day_in = date_from - IMPORTING - last_day_of_month = date_to. - IF p_portr = abap_true. - zcl_helper=>add_calendar( - EXPORTING - i_date_from = date_from - i_date_to = date_to - i_from_row = lv_from_row - i_from_col = from_col - i_day_style = lv_style_border_guid - i_cw_style = lv_style_center_guid - CHANGING - c_worksheet = lo_worksheet - ). - ELSE. - zcl_helper=>add_calendar_landscape( - EXPORTING - i_date_from = date_from - i_date_to = date_to - i_from_row = lv_from_row - i_from_col = from_col - i_day_style = lv_style_border_guid - i_cw_style = lv_style_center_guid - CHANGING - c_worksheet = lo_worksheet - ). - ENDIF. - count = count + 1. - date_from = date_to + 1. - ENDWHILE. - - lo_excel->set_active_sheet_index_by_name( '1' ). -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - *&---------------------------------------------------------------------* -*& Include ZDEMO_CALENDAR_CLASSES -*&---------------------------------------------------------------------* - -*&---------------------------------------------------------------------* -*& Class ZCL_DATE_CALCULATION -*&---------------------------------------------------------------------* -* Text -*----------------------------------------------------------------------* -CLASS zcl_date_calculation DEFINITION. - PUBLIC SECTION. - CLASS-METHODS: months_between_two_dates - IMPORTING - i_date_from TYPE datum - i_date_to TYPE datum - i_incl_to TYPE flag - EXPORTING - e_month TYPE i. -ENDCLASS. "ZCL_DATE_CALCULATION - - -*----------------------------------------------------------------------* -* CLASS ZCL_DATE_CALCULATION IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_date_calculation IMPLEMENTATION. - METHOD months_between_two_dates. - DATA: date_to TYPE datum. - DATA: BEGIN OF datum_von, - jjjj(4) TYPE n, - mm(2) TYPE n, - tt(2) TYPE n, - END OF datum_von. - - DATA: BEGIN OF datum_bis, - jjjj(4) TYPE n, - mm(2) TYPE n, - tt(2) TYPE n, - END OF datum_bis. - - e_month = 0. - - CHECK NOT ( i_date_from IS INITIAL ) - AND NOT ( i_date_to IS INITIAL ). - - date_to = i_date_to. - IF i_incl_to = abap_true. - date_to = date_to + 1. - ENDIF. - - datum_von = i_date_from. - datum_bis = date_to. - - e_month = ( datum_bis-jjjj - datum_von-jjjj ) * 12 - + ( datum_bis-mm - datum_von-mm ). - ENDMETHOD. "MONTHS_BETWEEN_TWO_DATES -ENDCLASS. "ZCL_DATE_CALCULATION IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS zcl_date_calculation_test DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_date_calculation_test DEFINITION FOR TESTING - " DURATION SHORT - " RISK LEVEL HARMLESS - "#AU Duration Medium - "#AU Risk_Level Harmless - . - PUBLIC SECTION. - METHODS: - months_between_two_dates FOR TESTING. -ENDCLASS. "zcl_date_calculation_test DEFINITION -*----------------------------------------------------------------------* -* CLASS zcl_date_calculation_test IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_date_calculation_test IMPLEMENTATION. - METHOD months_between_two_dates. - - DATA: date_from TYPE datum VALUE '20120101', - date_to TYPE datum VALUE '20121231'. - DATA: month TYPE i. - - zcl_date_calculation=>months_between_two_dates( - EXPORTING - i_date_from = date_from - i_date_to = date_to - i_incl_to = abap_true - IMPORTING - e_month = month - ). - - cl_aunit_assert=>assert_equals( - exp = 12 " Data Object with Expected Type - act = month " Data Object with Current Value - msg = 'Calculated date is wrong' " Message in Case of Error - ). - - ENDMETHOD. "months_between_two_dates -ENDCLASS. "zcl_date_calculation_test IMPLEMENTATION -*----------------------------------------------------------------------* -* CLASS zcl_helper DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_helper DEFINITION. - PUBLIC SECTION. - CLASS-METHODS: - load_image - IMPORTING - filename TYPE string - RETURNING value(r_image) TYPE xstring, - add_calendar - IMPORTING - i_date_from TYPE datum - i_date_to TYPE datum - i_from_row TYPE zexcel_cell_row - i_from_col TYPE zexcel_cell_column_alpha - i_day_style TYPE zexcel_cell_style - i_cw_style TYPE zexcel_cell_style - CHANGING - c_worksheet TYPE REF TO zcl_excel_worksheet, - add_calendar_landscape - IMPORTING - i_date_from TYPE datum - i_date_to TYPE datum - i_from_row TYPE zexcel_cell_row - i_from_col TYPE zexcel_cell_column_alpha - i_day_style TYPE zexcel_cell_style - i_cw_style TYPE zexcel_cell_style - CHANGING - c_worksheet TYPE REF TO zcl_excel_worksheet, - add_a2x_footer - IMPORTING - i_from_row TYPE zexcel_cell_row - i_from_col TYPE zexcel_cell_column_alpha - CHANGING - c_worksheet TYPE REF TO zcl_excel_worksheet, - add_calender_week - IMPORTING - i_date TYPE datum - i_row TYPE zexcel_cell_row - i_col TYPE zexcel_cell_column_alpha - i_style TYPE zexcel_cell_style - CHANGING - c_worksheet TYPE REF TO zcl_excel_worksheet. -ENDCLASS. "zcl_helper DEFINITION - -*----------------------------------------------------------------------* -* CLASS zcl_helper IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_helper IMPLEMENTATION. - METHOD load_image. - "Load samle image - DATA: lt_bin TYPE solix_tab, - lv_len TYPE i. - - CALL METHOD cl_gui_frontend_services=>gui_upload - EXPORTING - filename = filename - filetype = 'BIN' - IMPORTING - filelength = lv_len - CHANGING - data_tab = lt_bin - 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 <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_len - IMPORTING - buffer = r_image - TABLES - binary_tab = lt_bin - EXCEPTIONS - failed = 1 - OTHERS = 2. - IF sy-subrc <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - ENDMETHOD. "load_image - METHOD add_calendar. - DATA: day_names TYPE TABLE OF t246. - DATA: row TYPE zexcel_cell_row, - row_max TYPE i, - col_int TYPE zexcel_cell_column, - col_max TYPE i, - from_col_int TYPE zexcel_cell_column, - col TYPE zexcel_cell_column_alpha, - lr_col_dim TYPE REF TO zcl_excel_worksheet_columndime, - lr_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi. - DATA: lv_date TYPE datum, - value TYPE string, - weekday TYPE wotnr, - weekrow TYPE wotnr VALUE 1, - day TYPE i, - width TYPE f, - height TYPE f. - DATA: hyperlink TYPE REF TO zcl_excel_hyperlink. - - FIELD-SYMBOLS: <day_name> LIKE LINE OF day_names. - - lv_date = i_date_from. - from_col_int = zcl_excel_common=>convert_column2int( i_from_col ). - " Add description for Calendar Week - c_worksheet->set_cell( - EXPORTING - ip_column = i_from_col " Cell Column - ip_row = i_from_row " Cell Row - ip_value = 'CW'(001) " Cell Value - ip_style = i_cw_style - ). - - " Add Days - CALL FUNCTION 'DAY_NAMES_GET' - TABLES - day_names = day_names. - - LOOP AT day_names ASSIGNING <day_name>. - row = i_from_row. - col_int = from_col_int + <day_name>-wotnr. - col = zcl_excel_common=>convert_column2alpha( col_int ). - value = <day_name>-langt. - c_worksheet->set_cell( - EXPORTING - ip_column = col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = i_cw_style - ). - ENDLOOP. - - WHILE lv_date <= i_date_to. - day = lv_date+6(2). - CALL FUNCTION 'FIMA_X_DAY_IN_MONTH_COMPUTE' - EXPORTING - i_datum = lv_date - IMPORTING - e_wochentag_nr = weekday. - - row = i_from_row + weekrow. - col_int = from_col_int + weekday. - col = zcl_excel_common=>convert_column2alpha( col_int ). - - value = day. - CONDENSE value. - - c_worksheet->set_cell( - EXPORTING - ip_column = col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = i_day_style " Single-Character Indicator - ). - - IF weekday = 7. - " Add Calender Week - zcl_helper=>add_calender_week( - EXPORTING - i_date = lv_date - i_row = row - i_col = i_from_col - i_style = i_cw_style - CHANGING - c_worksheet = c_worksheet - ). - weekrow = weekrow + 1. - ENDIF. - lv_date = lv_date + 1. - ENDWHILE. - " Add Calender Week - zcl_helper=>add_calender_week( - EXPORTING - i_date = lv_date - i_row = row - i_col = i_from_col - i_style = i_cw_style - CHANGING - c_worksheet = c_worksheet - ). - " Add Created with abap2xlsx - row = row + 2. - zcl_helper=>add_a2x_footer( - EXPORTING - i_from_row = row - i_from_col = i_from_col - CHANGING - c_worksheet = c_worksheet - ). - col_int = from_col_int. - col_max = from_col_int + 7. - WHILE col_int <= col_max. - col = zcl_excel_common=>convert_column2alpha( col_int ). - IF sy-index = 1. - width = '5.0'. - ELSE. - width = '11.4'. - ENDIF. - lr_col_dim = c_worksheet->get_column_dimension( col ). - lr_col_dim->set_width( width ). - col_int = col_int + 1. - ENDWHILE. - row = i_from_row + 1. - row_max = i_from_row + 6. - WHILE row <= row_max. - height = 50. - lr_row_dim = c_worksheet->get_row_dimension( row ). - lr_row_dim->set_row_height( height ). - row = row + 1. - ENDWHILE. - ENDMETHOD. "add_calendar - METHOD add_a2x_footer. - DATA: value TYPE string, - hyperlink TYPE REF TO zcl_excel_hyperlink. - - value = 'Created with abap2xlsx. Find more information at http://abap2xlsx.org.'(002). - hyperlink = zcl_excel_hyperlink=>create_external_link( 'http://abap2xlsx.org' ). "#EC NOTEXT - c_worksheet->set_cell( - EXPORTING - ip_column = i_from_col " Cell Column - ip_row = i_from_row " Cell Row - ip_value = value " Cell Value - ip_hyperlink = hyperlink - ). - - ENDMETHOD. "add_a2x_footer - METHOD add_calendar_landscape. - DATA: day_names TYPE TABLE OF t246. - - DATA: lv_date TYPE datum, - day TYPE i, - value TYPE string, - weekday TYPE wotnr. - DATA: row TYPE zexcel_cell_row, - from_col_int TYPE zexcel_cell_column, - col_int TYPE zexcel_cell_column, - col TYPE zexcel_cell_column_alpha. - DATA: lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, - lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi. - - FIELD-SYMBOLS: <day_name> LIKE LINE OF day_names. - - lv_date = i_date_from. - " Add Days - CALL FUNCTION 'DAY_NAMES_GET' - TABLES - day_names = day_names. - - WHILE lv_date <= i_date_to. - day = lv_date+6(2). - CALL FUNCTION 'FIMA_X_DAY_IN_MONTH_COMPUTE' - EXPORTING - i_datum = lv_date - IMPORTING - e_wochentag_nr = weekday. - " Day name row - row = i_from_row. - col_int = from_col_int + day + 2. - col = zcl_excel_common=>convert_column2alpha( col_int ). - READ TABLE day_names ASSIGNING <day_name> - WITH KEY wotnr = weekday. - value = <day_name>-kurzt. - c_worksheet->set_cell( - EXPORTING - ip_column = col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = i_cw_style - ). - - " Day row - row = i_from_row + 1. - value = day. - CONDENSE value. - - c_worksheet->set_cell( - EXPORTING - ip_column = col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = i_day_style " Single-Character Indicator - ). - " width - lo_col_dim = c_worksheet->get_column_dimension( col ). - lo_col_dim->set_width( '3.6' ). - - - lv_date = lv_date + 1. - ENDWHILE. - " Add ABAP2XLSX Footer - row = i_from_row + 2. - c_worksheet->set_cell( - EXPORTING - ip_column = col " Cell Column - ip_row = row " Cell Row - ip_value = ' ' " Cell Value - ). - lo_row_dim = c_worksheet->get_row_dimension( row ). - lo_row_dim->set_row_height( '5.0' ). - row = i_from_row + 3. - zcl_helper=>add_a2x_footer( - EXPORTING - i_from_row = row - i_from_col = i_from_col - CHANGING - c_worksheet = c_worksheet - ). - - " Set with for all 31 coulumns - WHILE day < 32. - day = day + 1. - col_int = from_col_int + day + 2. - col = zcl_excel_common=>convert_column2alpha( col_int ). - " width - lo_col_dim = c_worksheet->get_column_dimension( col ). - lo_col_dim->set_width( '3.6' ). - ENDWHILE. - ENDMETHOD. "ADD_CALENDAR_LANDSCAPE - - METHOD add_calender_week. - DATA: week TYPE kweek, - week_int TYPE i, - value TYPE string. - " Add Calender Week - CALL FUNCTION 'DATE_GET_WEEK' - EXPORTING - date = i_date " Date for which the week should be calculated - IMPORTING - week = week. " Week for date (format:YYYYWW) - value = week+4(2). - week_int = value. - value = week_int. - CONDENSE value. - c_worksheet->set_cell( - EXPORTING - ip_column = i_col " Cell Column - ip_row = i_row " Cell Row - ip_value = value " Cell Value - ip_style = i_style - ). - ENDMETHOD. "add_calender_week -ENDCLASS. "zcl_helper IMPLEMENTATION - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel. - -DATA: lv_workdir TYPE string, - lv_upfile TYPE string. - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = sy-lisel ). - CONCATENATE p_path sy-lisel '01_HelloWorld.xlsx' INTO lv_upfile. - - SUBMIT zdemo_excel1 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Hello world - SUBMIT zdemo_excel2 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Styles - SUBMIT zdemo_excel3 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: iTab binding - SUBMIT zdemo_excel4 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Multi sheets, page setup and sheet properties - SUBMIT zdemo_excel5 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Conditional formatting - SUBMIT zdemo_excel6 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Formulas - SUBMIT zdemo_excel7 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Conditional formatting - SUBMIT zdemo_excel8 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Ranges - SUBMIT zdemo_excel9 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Data validation - SUBMIT zdemo_excel10 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Bind table with field catalog - " zdemo_excel11 is not added because it has a selection screen and - " you also need to have business partners maintained in transaction BP - SUBMIT zdemo_excel12 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Column size - SUBMIT zdemo_excel13 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Merge cell - SUBMIT zdemo_excel14 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Alignment - SUBMIT zdemo_excel16 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Drawing - SUBMIT zdemo_excel17 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Lock sheet - SUBMIT zdemo_excel18 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Lock workbook - SUBMIT zdemo_excel19 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Set active sheet - " zdemo_excel20 is not added because it uses ALV and cannot be processed (OLE2) - SUBMIT zdemo_excel21 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Color Picker - SUBMIT zdemo_excel22 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Bind table with field catalog & sheet style - SUBMIT zdemo_excel23 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Multiple sheets with and w/o grid lines, print options - SUBMIT zdemo_excel24 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Multiple sheets with different default date formats - SUBMIT zdemo_excel25 AND RETURN. " abap2xlsx Demo: Create and xlsx on Application Server (could be executed in batch mode) - " zdemo_excel26 is not added because it uses ALV and cannot be processed (Native) - SUBMIT zdemo_excel27 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Conditional Formatting - SUBMIT zdemo_excel28 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: CSV writer - " SUBMIT zdemo_excel29 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Macro enabled workbook - SUBMIT zdemo_excel30 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: ABAP Cell data types + leading blanks string - SUBMIT zdemo_excel31 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Autosize Column with different Font sizes - " zdemo_excel32 is not added because it uses ALV and cannot be processed (Native) - SUBMIT zdemo_excel33 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Table autofilter - SUBMIT zdemo_excel34 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Static Styles Chess - SUBMIT zdemo_excel35 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Static Styles - SUBMIT zdemo_excel36 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Style applied to sheet, column and single cell - SUBMIT zdemo_excel37 WITH p_upfile = lv_upfile - WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Simplest call of the reader and writer - passthrough data - SUBMIT zdemo_excel38 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Show off integration of drawings ( here using the SAP-Icons ) - SUBMIT zdemo_excel39 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Charts - SUBMIT zdemo_excel40 WITH p_path = p_path AND RETURN. " abap2xlsx Demo: Demo Printsettings - " - " Reader/Writer Demo must always run at the end - " to make sure all documents where created - " - SUBMIT zdemo_excel15 WITH p_path = p_path AND RETURN. " Read Excel and write it back - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL1 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel1. - - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - -CONSTANTS: gc_save_file_name TYPE string VALUE '01_HelloWorld.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). -* lo_worksheet->set_title( ip_title = 'Sheet1' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = sy-datum ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = sy-uzeit ). - lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'http://www.abap2xlsx.org' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 4 ip_value = 'Click here to visit abap2xlsx homepage' ip_hyperlink = lo_hyperlink ). - - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - column_dimension->set_width( ip_width = 11 ). - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL10 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel10. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_conditional2 TYPE REF TO zcl_excel_style_conditional, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - -DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, - ls_table_settings TYPE zexcel_s_table_settings, - ls_iconset TYPE zexcel_conditional_iconset. - -CONSTANTS: gc_save_file_name TYPE string VALUE '10_iTabFieldCatalog.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'Internal table' ). - - ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_5arrows. - ls_iconset-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo1_value = '0'. - ls_iconset-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo2_value = '20'. - ls_iconset-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo3_value = '40'. - ls_iconset-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo4_value = '60'. - ls_iconset-cfvo5_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo5_value = '80'. - ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_true. - - "Conditional style - lo_style_conditional2 = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional2->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional2->mode_iconset = ls_iconset. - lo_style_conditional2->priority = 1. - - DATA lt_test TYPE TABLE OF sflight. - SELECT * FROM sflight INTO TABLE lt_test. "#EC CI_NOWHERE - - lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_test ). - - LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. - CASE <fs_field_catalog>-fieldname. - WHEN 'CARRID'. - <fs_field_catalog>-position = 3. - <fs_field_catalog>-dynpfld = abap_true. - <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_count. - WHEN 'CONNID'. - <fs_field_catalog>-position = 4. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'FLDATE'. - <fs_field_catalog>-position = 2. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'PRICE'. - <fs_field_catalog>-position = 1. - <fs_field_catalog>-dynpfld = abap_true. - <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_sum. - <fs_field_catalog>-cond_style = lo_style_conditional2. - WHEN OTHERS. - <fs_field_catalog>-dynpfld = abap_false. - ENDCASE. - ENDLOOP. - - ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. - - lo_worksheet->bind_table( ip_table = lt_test - is_table_settings = ls_table_settings - it_field_catalog = lt_field_catalog ). - - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'D' ). "make date field a bit wider - column_dimension->set_width( ip_width = 13 ). - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL11 -*& Export Organisation and Contact Persons using ABAP2XLSX -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel11. - -TYPE-POOLS: abap. - -DATA: central_search TYPE bapibus1006_central_search, - addressdata_search TYPE bapibus1006_addr_search, - others_search TYPE bapibus1006_other_data. -DATA: searchresult TYPE TABLE OF bapibus1006_bp_addr, - return TYPE TABLE OF bapiret2. -DATA: lines TYPE i. -FIELD-SYMBOLS: <searchresult_line> LIKE LINE OF searchresult. -DATA: centraldata TYPE bapibus1006_central, - centraldataperson TYPE bapibus1006_central_person, - centraldataorganization TYPE bapibus1006_central_organ. -DATA: addressdata TYPE bapibus1006_address. -DATA: relationships TYPE TABLE OF bapibus1006_relations. -FIELD-SYMBOLS: <relationship> LIKE LINE OF relationships. -DATA: relationship_centraldata TYPE bapibus1006002_central. -DATA: relationship_addresses TYPE TABLE OF bapibus1006002_addresses. -FIELD-SYMBOLS: <relationship_address> LIKE LINE OF relationship_addresses. - -DATA: lt_download TYPE TABLE OF zexcel_s_org_rel. -FIELD-SYMBOLS: <download> LIKE LINE OF lt_download. - -CONSTANTS: gc_save_file_name TYPE string VALUE '11_Export_Org_and_Contact.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -PARAMETERS: md TYPE flag RADIOBUTTON GROUP act. - -SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-00a. -PARAMETERS: partnerc TYPE bu_type DEFAULT 2, " Organizations - postlcod TYPE ad_pstcd1 DEFAULT '8334*', - country TYPE land1 DEFAULT 'DE', - maxsel TYPE bu_maxsel DEFAULT 100. -SELECTION-SCREEN END OF BLOCK a. - -PARAMETERS: rel TYPE flag RADIOBUTTON GROUP act DEFAULT 'X'. - -SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-00b. -PARAMETERS: reltyp TYPE bu_reltyp DEFAULT 'BUR011', - partner TYPE bu_partner DEFAULT '191'. -SELECTION-SCREEN END OF BLOCK b. - -START-OF-SELECTION. - IF md = abap_true. - " Read all Companies by Master Data - central_search-partnercategory = partnerc. - addressdata_search-postl_cod1 = postlcod. - addressdata_search-country = country. - others_search-maxsel = maxsel. - others_search-no_search_for_contactperson = 'X'. - - CALL FUNCTION 'BAPI_BUPA_SEARCH_2' - EXPORTING - centraldata = central_search - addressdata = addressdata_search - OTHERS = others_search - TABLES - searchresult = searchresult - return = return. - - SORT searchresult BY partner. - DELETE ADJACENT DUPLICATES FROM searchresult COMPARING partner. - ELSEIF rel = abap_true. - " Read by Relationship - SELECT but050~partner1 AS partner FROM but050 - INNER JOIN but000 ON but000~partner = but050~partner1 AND but000~type = '2' - INTO CORRESPONDING FIELDS OF TABLE searchresult - WHERE but050~partner2 = partner - AND but050~reltyp = reltyp. - ENDIF. - - DESCRIBE TABLE searchresult LINES lines. - WRITE: / 'Number of search results: ', lines. - - LOOP AT searchresult ASSIGNING <searchresult_line>. - " Read Details of Organization - CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' - EXPORTING - businesspartner = <searchresult_line>-partner - IMPORTING - centraldataorganization = centraldataorganization. - " Read Standard Address of Organization - CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' - EXPORTING - businesspartner = <searchresult_line>-partner - IMPORTING - addressdata = addressdata. - - " Add Organization to Download - APPEND INITIAL LINE TO lt_download ASSIGNING <download>. - " Fill Organization Partner Numbers - CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' - EXPORTING - businesspartner = <searchresult_line>-partner - IMPORTING - businesspartnerout = <download>-org_number - businesspartnerguidout = <download>-org_guid. - - MOVE-CORRESPONDING centraldataorganization TO <download>. - MOVE-CORRESPONDING addressdata TO <download>. - CLEAR: addressdata. - - " Read all Relationships - CLEAR: relationships. - CALL FUNCTION 'BAPI_BUPA_RELATIONSHIPS_GET' - EXPORTING - businesspartner = <searchresult_line>-partner - TABLES - relationships = relationships. - DELETE relationships WHERE relationshipcategory <> 'BUR001'. - LOOP AT relationships ASSIGNING <relationship>. - " Read details of Contact person - CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' - EXPORTING - businesspartner = <relationship>-partner2 - IMPORTING - centraldata = centraldata - centraldataperson = centraldataperson. - " Read details of the Relationship - CALL FUNCTION 'BAPI_BUPR_CONTP_GETDETAIL' - EXPORTING - businesspartner = <relationship>-partner1 - contactperson = <relationship>-partner2 - IMPORTING - centraldata = relationship_centraldata. - " Read relationship address - CLEAR: relationship_addresses. - - CALL FUNCTION 'BAPI_BUPR_CONTP_ADDRESSES_GET' - EXPORTING - businesspartner = <relationship>-partner1 - contactperson = <relationship>-partner2 - TABLES - addresses = relationship_addresses. - - READ TABLE relationship_addresses - ASSIGNING <relationship_address> - WITH KEY standardaddress = 'X'. - - IF <relationship_address> IS ASSIGNED. - " Read Relationship Address - CLEAR addressdata. - CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' - EXPORTING - businesspartner = <searchresult_line>-partner - addressguid = <relationship_address>-addressguid - IMPORTING - addressdata = addressdata. - - APPEND INITIAL LINE TO lt_download ASSIGNING <download>. - CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' - EXPORTING - businesspartner = <relationship>-partner1 - IMPORTING - businesspartnerout = <download>-org_number - businesspartnerguidout = <download>-org_guid. - - CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' - EXPORTING - businesspartner = <relationship>-partner2 - IMPORTING - businesspartnerout = <download>-contpers_number - businesspartnerguidout = <download>-contpers_guid. - - MOVE-CORRESPONDING centraldataorganization TO <download>. - MOVE-CORRESPONDING addressdata TO <download>. - MOVE-CORRESPONDING centraldataperson TO <download>. - MOVE-CORRESPONDING relationship_centraldata TO <download>. - - WRITE: / <relationship>-partner1, <relationship>-partner2. - WRITE: centraldataorganization-name1(20), centraldataorganization-name2(10). - WRITE: centraldataperson-firstname(15), centraldataperson-lastname(15). - WRITE: addressdata-street(25), addressdata-house_no, - addressdata-postl_cod1, addressdata-city(25). - ENDIF. - ENDLOOP. - - ENDLOOP. - - DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_body TYPE REF TO zcl_excel_style, - lo_border_dark TYPE REF TO zcl_excel_style_border, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. - - DATA: lv_style_body_even_guid TYPE zexcel_cell_style, - lv_style_body_green TYPE zexcel_cell_style. - - DATA: row TYPE zexcel_cell_row. - - DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - - DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, - ls_table_settings TYPE zexcel_s_table_settings. - - DATA: column TYPE zexcel_cell_column, - column_alpha TYPE zexcel_cell_column_alpha, - value TYPE zexcel_cell_value. - - FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Create border object - CREATE OBJECT lo_border_dark. - lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. - lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. - "Create style with border even - lo_style_body = lo_excel->add_new_style( ). - lo_style_body->fill->fgcolor-rgb = zcl_excel_style_color=>c_yellow. - lo_style_body->borders->allborders = lo_border_dark. - lv_style_body_even_guid = lo_style_body->get_guid( ). - "Create style with border and green fill - lo_style_body = lo_excel->add_new_style( ). - lo_style_body->fill->fgcolor-rgb = zcl_excel_style_color=>c_green. - lo_style_body->borders->allborders = lo_border_dark. - lv_style_body_green = lo_style_body->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'Internal table' ). - - lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_download ). - - LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. - CASE <fs_field_catalog>-fieldname. - WHEN 'ORG_NUMBER'. - <fs_field_catalog>-position = 1. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'CONTPERS_NUMBER'. - <fs_field_catalog>-position = 2. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'NAME1'. - <fs_field_catalog>-position = 3. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'NAME2'. - <fs_field_catalog>-position = 4. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'STREET'. - <fs_field_catalog>-position = 5. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'HOUSE_NO'. - <fs_field_catalog>-position = 6. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'POSTL_COD1'. - <fs_field_catalog>-position = 7. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'CITY'. - <fs_field_catalog>-position = 8. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'COUNTRYISO'. - <fs_field_catalog>-position = 9. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'FIRSTNAME'. - <fs_field_catalog>-position = 10. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'LASTNAME'. - <fs_field_catalog>-position = 11. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'FUNCTIONNAME'. - <fs_field_catalog>-position = 12. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'DEPARTMENTNAME'. - <fs_field_catalog>-position = 13. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'TEL1_NUMBR'. - <fs_field_catalog>-position = 14. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'TEL1_EXT'. - <fs_field_catalog>-position = 15. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'FAX_NUMBER'. - <fs_field_catalog>-position = 16. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'FAX_EXTENS'. - <fs_field_catalog>-position = 17. - <fs_field_catalog>-dynpfld = abap_true. - WHEN 'E_MAIL'. - <fs_field_catalog>-position = 18. - <fs_field_catalog>-dynpfld = abap_true. - WHEN OTHERS. - <fs_field_catalog>-dynpfld = abap_false. - ENDCASE. - ENDLOOP. - - ls_table_settings-top_left_column = 'A'. - ls_table_settings-top_left_row = '2'. - ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. - - lo_worksheet->bind_table( ip_table = lt_download - is_table_settings = ls_table_settings - it_field_catalog = lt_field_catalog ). - LOOP AT lt_download ASSIGNING <download>. - row = sy-tabix + 2. - IF NOT <download>-org_number IS INITIAL - AND <download>-contpers_number IS INITIAL. - " Mark fields of Organization which can be changed green - lo_worksheet->set_cell_style( - ip_column = 'C' - ip_row = row - ip_style = lv_style_body_green - ). - lo_worksheet->set_cell_style( - ip_column = 'D' - ip_row = row - ip_style = lv_style_body_green - ). -* CATCH zcx_excel. " Exceptions for ABAP2XLSX - ELSEIF NOT <download>-org_number IS INITIAL - AND NOT <download>-contpers_number IS INITIAL. - " Mark fields of Relationship which can be changed green - lo_worksheet->set_cell_style( - ip_column = 'L' ip_row = row ip_style = lv_style_body_green - ). - lo_worksheet->set_cell_style( - ip_column = 'M' ip_row = row ip_style = lv_style_body_green - ). - lo_worksheet->set_cell_style( - ip_column = 'N' ip_row = row ip_style = lv_style_body_green - ). - lo_worksheet->set_cell_style( - ip_column = 'O' ip_row = row ip_style = lv_style_body_green - ). - lo_worksheet->set_cell_style( - ip_column = 'P' ip_row = row ip_style = lv_style_body_green - ). - lo_worksheet->set_cell_style( - ip_column = 'Q' ip_row = row ip_style = lv_style_body_green - ). - lo_worksheet->set_cell_style( - ip_column = 'R' ip_row = row ip_style = lv_style_body_green - ). - ENDIF. - ENDLOOP. - " Add Fieldnames in first row and hide the row - LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog> - WHERE position <> '' AND dynpfld = abap_true. - column = <fs_field_catalog>-position. - column_alpha = zcl_excel_common=>convert_column2alpha( column ). - value = <fs_field_catalog>-fieldname. - lo_worksheet->set_cell( ip_column = column_alpha - ip_row = 1 - ip_value = value - ip_style = lv_style_body_even_guid ). - ENDLOOP. - " Hide first row - row_dimension = lo_worksheet->get_row_dimension( 1 ). - row_dimension->set_visible( abap_false ). - - DATA: highest_column TYPE zexcel_cell_column, - count TYPE int4, - col_alpha TYPE zexcel_cell_column_alpha. - - highest_column = lo_worksheet->get_highest_column( ). - count = 1. - WHILE count <= highest_column. - col_alpha = zcl_excel_common=>convert_column2alpha( ip_column = count ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = col_alpha ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - count = count + 1. - ENDWHILE. -* " Set Column width manuall -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). -* column_dimension->set_width( ip_width = 11 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). -* column_dimension->set_width( ip_width = 11 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). -* column_dimension->set_width( ip_width = 35 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ). -* column_dimension->set_width( ip_width = 18 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'F' ). -* column_dimension->set_width( ip_width = 5 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'G' ). -* column_dimension->set_width( ip_width = 6 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'H' ). -* column_dimension->set_width( ip_width = 12 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'I' ). -* column_dimension->set_width( ip_width = 3 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'J' ). -* column_dimension->set_width( ip_width = 13 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'K' ). -* column_dimension->set_width( ip_width = 13 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'L' ). -* column_dimension->set_width( ip_width = 13 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'M' ). -* column_dimension->set_width( ip_width = 13 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'N' ). -* column_dimension->set_width( ip_width = 12 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'O' ). -* column_dimension->set_width( ip_width = 9 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'P' ). -* column_dimension->set_width( ip_width = 12 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'Q' ). -* column_dimension->set_width( ip_width = 9 ). -* column_dimension = lo_worksheet->get_column_dimension( ip_column = 'R' ). -* column_dimension->set_width( ip_width = 40 ). - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL12 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel12. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: gc_save_file_name TYPE string VALUE '12_HideSizeOutlineRowsAndColumns.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'Sheet1' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world in AutoSize column' ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Hello world in a column width size 50' ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Hello world (hidden column)' ). - lo_worksheet->set_cell( ip_column = 'F' ip_row = 2 ip_value = 'Outline column level 0' ). - lo_worksheet->set_cell( ip_column = 'G' ip_row = 2 ip_value = 'Outline column level 1' ). - lo_worksheet->set_cell( ip_column = 'H' ip_row = 2 ip_value = 'Outline column level 2' ). - lo_worksheet->set_cell( ip_column = 'I' ip_row = 2 ip_value = 'Small' ). - - - lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Hello world (hidden row)' ). - lo_worksheet->set_cell( ip_column = 'E' ip_row = 5 ip_value = 'Hello world in a row height size 20' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Outline row level 0' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'Outline row level 1' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Outline row level 2' ). - - lo_worksheet->zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_off. " By default is on - lo_worksheet->zif_excel_sheet_properties~summaryright = zif_excel_sheet_properties=>c_right_off. " By default is on - - " Column Settings - " Auto size - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'I' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - " Manual Width - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). - column_dimension->set_width( ip_width = 50 ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'D' ). - column_dimension->set_visible( ip_visible = abap_false ). - " Implementation in the Writer is not working yet ===== TODO ===== - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'F' ). - column_dimension->set_outline_level( ip_outline_level = 0 ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'G' ). - column_dimension->set_outline_level( ip_outline_level = 1 ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'H' ). - column_dimension->set_outline_level( ip_outline_level = 2 ). - - row_dimension = lo_worksheet->get_row_dimension( ip_row = 1 ). - row_dimension->set_visible( ip_visible = abap_false ). - row_dimension = lo_worksheet->get_row_dimension( ip_row = 5 ). - row_dimension->set_row_height( ip_row_height = 20 ). - " Implementation in the Writer is not working yet ===== TODO ===== - row_dimension = lo_worksheet->get_row_dimension( ip_row = 6 ). - row_dimension->set_outline_level( ip_outline_level = 0 ). - row_dimension = lo_worksheet->get_row_dimension( ip_row = 7 ). - row_dimension->set_outline_level( ip_outline_level = 1 ). - row_dimension = lo_worksheet->get_row_dimension( ip_row = 8 ). - row_dimension->set_outline_level( ip_outline_level = 2 ). - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL13 -*& -*&---------------------------------------------------------------------* -*& Example by: Alvaro "Blag" Tejada Galindo. -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel13. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lv_style_bold_border_guid TYPE zexcel_cell_style, - lo_style_bold_border TYPE REF TO zcl_excel_style, - lo_border_dark TYPE REF TO zcl_excel_style_border. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '13_MergedCells.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'sheet1' ). - - CREATE OBJECT lo_border_dark. - lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. - lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. - - lo_style_bold_border = lo_excel->add_new_style( ). - lo_style_bold_border->font->bold = abap_true. - lo_style_bold_border->font->italic = abap_false. - lo_style_bold_border->font->color-rgb = zcl_excel_style_color=>c_black. - lo_style_bold_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_bold_border->borders->allborders = lo_border_dark. - lv_style_bold_border_guid = lo_style_bold_border->get_guid( ). - - lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = 'Test' ). - - lo_worksheet->set_cell( ip_row = 2 ip_column = 'B' ip_value = 'Banana' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 2 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 2 ip_column = 'E' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 2 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 2 ip_column = 'G' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Apple' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = '' ip_style = lv_style_bold_border_guid ). - - lo_worksheet->set_merge( ip_row = 4 ip_column_start = 'B' ip_column_end = 'G' ). - - " Test also if merge works when oher merged chells are empty - lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Tomato' ). - lo_worksheet->set_merge( ip_row = 6 ip_column_start = 'B' ip_column_end = 'G' ). - - " Test the patch provided by Victor Alekhin to merge cells in one column - lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = 'Merge cells also over multiple rows by Victor Alekhin' ). - lo_worksheet->set_merge( ip_row = 8 ip_column_start = 'B' ip_column_end = 'G' ip_row_to = 10 ). - - " Test the patch provided by Alexander Budeyev with different column merges - lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = 'Merge cells with different merges by Alexander Budeyev' ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = 'Test' ). - - lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = 'Banana' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = '' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = 'Apple' ip_style = lv_style_bold_border_guid ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = '' ip_style = lv_style_bold_border_guid ). - - " Test merge (issue) - lo_worksheet->set_merge( ip_row = 13 ip_column_start = 'B' ip_column_end = 'C' ip_row_to = 15 ). - lo_worksheet->set_merge( ip_row = 13 ip_column_start = 'D' ip_column_end = 'D' ip_row_to = 14 ). - lo_worksheet->set_merge( ip_row = 13 ip_column_start = 'E' ip_column_end = 'F' ). - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL14 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel14. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_center TYPE REF TO zcl_excel_style, - lo_style_right TYPE REF TO zcl_excel_style, - lo_style_left TYPE REF TO zcl_excel_style, - lo_style_general TYPE REF TO zcl_excel_style, - lo_style_bottom TYPE REF TO zcl_excel_style, - lo_style_middle TYPE REF TO zcl_excel_style, - lo_style_top TYPE REF TO zcl_excel_style, - lo_style_justify TYPE REF TO zcl_excel_style, - lo_style_mixed TYPE REF TO zcl_excel_style, - lo_style_mixed_wrap TYPE REF TO zcl_excel_style, - lo_style_rotated TYPE REF TO zcl_excel_style, - lo_style_shrink TYPE REF TO zcl_excel_style, - lo_style_indent TYPE REF TO zcl_excel_style, - lv_style_center_guid TYPE zexcel_cell_style, - lv_style_right_guid TYPE zexcel_cell_style, - lv_style_left_guid TYPE zexcel_cell_style, - lv_style_general_guid TYPE zexcel_cell_style, - lv_style_bottom_guid TYPE zexcel_cell_style, - lv_style_middle_guid TYPE zexcel_cell_style, - lv_style_top_guid TYPE zexcel_cell_style, - lv_style_justify_guid TYPE zexcel_cell_style, - lv_style_mixed_guid TYPE zexcel_cell_style, - lv_style_mixed_wrap_guid TYPE zexcel_cell_style, - lv_style_rotated_guid TYPE zexcel_cell_style, - lv_style_shrink_guid TYPE zexcel_cell_style, - lv_style_indent_guid TYPE zexcel_cell_style. - -DATA: lo_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. - -CONSTANTS: gc_save_file_name TYPE string VALUE '14_Alignment.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'sheet1' ). - - "Center - lo_style_center = lo_excel->add_new_style( ). - lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lv_style_center_guid = lo_style_center->get_guid( ). - "Right - lo_style_right = lo_excel->add_new_style( ). - lo_style_right->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. - lv_style_right_guid = lo_style_right->get_guid( ). - "Left - lo_style_left = lo_excel->add_new_style( ). - lo_style_left->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_left. - lv_style_left_guid = lo_style_left->get_guid( ). - "General - lo_style_general = lo_excel->add_new_style( ). - lo_style_general->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_general. - lv_style_general_guid = lo_style_general->get_guid( ). - "Bottom - lo_style_bottom = lo_excel->add_new_style( ). - lo_style_bottom->alignment->vertical = zcl_excel_style_alignment=>c_vertical_bottom. - lv_style_bottom_guid = lo_style_bottom->get_guid( ). - "Middle - lo_style_middle = lo_excel->add_new_style( ). - lo_style_middle->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. - lv_style_middle_guid = lo_style_middle->get_guid( ). - "Top - lo_style_top = lo_excel->add_new_style( ). - lo_style_top->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. - lv_style_top_guid = lo_style_top->get_guid( ). - "Justify - lo_style_justify = lo_excel->add_new_style( ). - lo_style_justify->alignment->vertical = zcl_excel_style_alignment=>c_vertical_justify. - lv_style_justify_guid = lo_style_justify->get_guid( ). - - "Shrink - lo_style_shrink = lo_excel->add_new_style( ). - lo_style_shrink->alignment->shrinktofit = abap_true. - lv_style_shrink_guid = lo_style_shrink->get_guid( ). - - "Indent - lo_style_indent = lo_excel->add_new_style( ). - lo_style_indent->alignment->indent = 5. - lv_style_indent_guid = lo_style_indent->get_guid( ). - - "Middle / Centered / Wrap - lo_style_mixed_wrap = lo_excel->add_new_style( ). - lo_style_mixed_wrap->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_mixed_wrap->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. - lo_style_mixed_wrap->alignment->wraptext = abap_true. - lv_style_mixed_wrap_guid = lo_style_mixed_wrap->get_guid( ). - - "Middle / Centered / Wrap - lo_style_mixed = lo_excel->add_new_style( ). - lo_style_mixed->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_mixed->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. - lv_style_mixed_guid = lo_style_mixed->get_guid( ). - - "Center - lo_style_rotated = lo_excel->add_new_style( ). - lo_style_rotated->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_rotated->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center. - lo_style_rotated->alignment->textrotation = 165. " -75° == 90° + 75° - lv_style_rotated_guid = lo_style_rotated->get_guid( ). - - - " Set row size for first 7 rows to 40 - DO 7 TIMES. - lo_row_dimension = lo_worksheet->get_row_dimension( sy-index ). - lo_row_dimension->set_row_height( 40 ). - ENDDO. - - "Horizontal alignment - lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Centered Text' ip_style = lv_style_center_guid ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 'Right Text' ip_style = lv_style_right_guid ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Left Text' ip_style = lv_style_left_guid ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 'General Text' ip_style = lv_style_general_guid ). - - " Shrink & indent - lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'Text shrinked' ip_style = lv_style_shrink_guid ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 'Text indented' ip_style = lv_style_indent_guid ). - - "Vertical alignment - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Bottom Text' ip_style = lv_style_bottom_guid ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Middle Text' ip_style = lv_style_middle_guid ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 'Top Text' ip_style = lv_style_top_guid ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 'Justify Text' ip_style = lv_style_justify_guid ). - - " Wrapped - lo_worksheet->set_cell( ip_row = 10 ip_column = 'B' - ip_value = 'This is a wrapped text centered in the middle' - ip_style = lv_style_mixed_wrap_guid ). - - " Rotated - lo_worksheet->set_cell( ip_row = 10 ip_column = 'D' - ip_value = 'This is a centered text rotated by -75°' - ip_style = lv_style_rotated_guid ). - - " forced line break - DATA: lv_value TYPE string. - CONCATENATE 'This is a wrapped text centered in the middle' cl_abap_char_utilities=>cr_lf - 'and a manuall line break.' INTO lv_value. - lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' - ip_value = lv_value - ip_style = lv_style_mixed_guid ). - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL15 -*& -*&---------------------------------------------------------------------* -*& 2010-10-30, Gregor Wolf: -*& Added the functionality to ouput the read table content -*& 2011-12-19, Shahrin Shahrulzaman: -*& Added the functionality to have multiple input and output files -*&---------------------------------------------------------------------* - -REPORT zdemo_excel15. - -TYPE-POOLS: abap. - -TYPES: - BEGIN OF t_demo_excel15, - input TYPE string, - END OF t_demo_excel15. - -DATA: excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - reader TYPE REF TO zif_excel_reader. - -DATA: ex TYPE REF TO zcx_excel, - msg TYPE string. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_workdir TYPE string, - output_file_path TYPE string, - input_file_path TYPE string, - lv_file_separator TYPE c. - -DATA: worksheet TYPE REF TO zcl_excel_worksheet, - highest_column TYPE zexcel_cell_column, - highest_row TYPE int4, - column TYPE zexcel_cell_column VALUE 1, - col_str TYPE zexcel_cell_column_alpha, - row TYPE int4 VALUE 1, - value TYPE zexcel_cell_value. - -DATA: - lt_files TYPE TABLE OF t_demo_excel15. -FIELD-SYMBOLS: <wa_files> TYPE t_demo_excel15. - -PARAMETERS: p_path TYPE zexcel_export_dir, - p_noout TYPE xfeld DEFAULT abap_true. - - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - - APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. - <wa_files>-input = '01_HelloWorld.xlsx'. - APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. - <wa_files>-input = '02_Styles.xlsx'. - APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. - <wa_files>-input = '03_iTab.xlsx'. - APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. - <wa_files>-input = '04_Sheets.xlsx'. - APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. - <wa_files>-input = '08_Range.xlsx'. - APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. - <wa_files>-input = '13_MergedCells.xlsx'. - APPEND INITIAL LINE TO lt_files ASSIGNING <wa_files>. - <wa_files>-input = '31_AutosizeWithDifferentFontSizes.xlsx'. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - - LOOP AT lt_files ASSIGNING <wa_files>. - CONCATENATE p_path lv_file_separator <wa_files>-input INTO input_file_path. - CONCATENATE p_path lv_file_separator '15_' <wa_files>-input INTO output_file_path. - REPLACE '.xlsx' IN output_file_path WITH 'FromReader.xlsx'. - - TRY. - CREATE OBJECT reader TYPE zcl_excel_reader_2007. - excel = reader->load_file( input_file_path ). - - IF p_noout EQ abap_false. - worksheet = excel->get_active_worksheet( ). - highest_column = worksheet->get_highest_column( ). - highest_row = worksheet->get_highest_row( ). - - WRITE: 'Highest column: ', highest_column, 'Highest row: ', highest_row. - WRITE: /. - - WHILE row <= highest_row. - WHILE column <= highest_column. - col_str = zcl_excel_common=>convert_column2alpha( column ). - worksheet->get_cell( - EXPORTING - ip_column = col_str - ip_row = row - IMPORTING - ep_value = value - ). - WRITE: value. - column = column + 1. - ENDWHILE. - WRITE: /. - column = 1. - row = row + 1. - ENDWHILE. - ENDIF. - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( excel ). - - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = lv_file - IMPORTING - output_length = lv_bytecount - TABLES - binary_tab = lt_file_tab. -* " This method is only available on AS ABAP > 6.40 -* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). -* lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = output_file_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - CATCH zcx_excel INTO ex. " Exceptions for ABAP2XLSX - msg = ex->get_text( ). - WRITE: / msg. - ENDTRY. - ENDLOOP. - - - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL16 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel16. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_drawing TYPE REF TO zcl_excel_drawing. - - -DATA: ls_io TYPE skwf_io. - -CONSTANTS: gc_save_file_name TYPE string VALUE '16_Drawings.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -PARAMETERS: p_objid TYPE sdok_docid DEFAULT '456694429165174BE10000000A1550C0', " Question mark in standard Web Dynpro WDT_QUIZ - p_class TYPE sdok_class DEFAULT 'M_IMAGE_P', - pobjtype TYPE skwf_ioty DEFAULT 'P'. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - "Load samle image - DATA: lt_bin TYPE solix_tab, - lv_len TYPE i, - lv_content TYPE xstring, - ls_key TYPE wwwdatatab. - - CALL METHOD cl_gui_frontend_services=>gui_upload - EXPORTING - filename = 'c:\Program Files\SAP\FrontEnd\SAPgui\wwi\graphics\W_bio.bmp' - filetype = 'BIN' - IMPORTING - filelength = lv_len - CHANGING - data_tab = lt_bin - 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 <> 0. -* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno -* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_len - IMPORTING - buffer = lv_content - TABLES - binary_tab = lt_bin - EXCEPTIONS - failed = 1 - OTHERS = 2. - IF sy-subrc <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'Sheet1' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Image from web repository (SMW0)' ). - - " create global drawing, set position and media from web repository - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 3 - ip_from_col = 'B' ). - - ls_key-relid = 'MI'. - ls_key-objid = 'SAPLOGO.GIF'. - lo_drawing->set_media_www( ip_key = ls_key - ip_width = 166 - ip_height = 75 ). - - " assign drawing to the worksheet - lo_worksheet->add_drawing( lo_drawing ). - - " another drawing from a XSTRING read from a file - lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = 'Image from a file (c:\Program Files\SAP\FrontEnd\SAPgui\wwi\graphics\W_bio.bmp)' ). - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 9 - ip_from_col = 'B' ). - lo_drawing->set_media( ip_media = lv_content - ip_media_type = zcl_excel_drawing=>c_media_type_bmp - ip_width = 83 - ip_height = 160 ). - - lo_worksheet->add_drawing( lo_drawing ). - - ls_io-objid = p_objid. - ls_io-class = p_class. - ls_io-objtype = pobjtype. - IF ls_io IS NOT INITIAL. - " another drawing from a XSTRING read from a file - lo_worksheet->set_cell( ip_column = 'B' ip_row = 18 ip_value = 'Mime repository (by default Question mark in standard Web Dynpro WDT_QUIZ)' ). - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 19 - ip_from_col = 'B' ). - lo_drawing->set_media_mime( ip_io = ls_io - ip_width = 126 - ip_height = 145 ). - - lo_worksheet->add_drawing( lo_drawing ). - ENDIF. - - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL26 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel29. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_excel_reader TYPE REF TO zif_excel_reader. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_filename TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -PARAMETERS: p_path TYPE zexcel_export_dir OBLIGATORY. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - - DATA: lt_filetable TYPE filetable, - lv_rc TYPE i. - - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - - CALL METHOD cl_gui_frontend_services=>file_open_dialog - EXPORTING - window_title = 'Select Macro-Enabled Workbook template' - default_extension = '*.xlsm' - file_filter = 'Excel Macro-Enabled Workbook (*.xlsm)|*.xlsm' - initial_directory = lv_workdir - CHANGING - file_table = lt_filetable - rc = lv_rc - EXCEPTIONS - file_open_dialog_failed = 1 - cntl_error = 2 - error_no_gui = 3 - not_supported_by_gui = 4 - OTHERS = 5. - IF sy-subrc <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - READ TABLE lt_filetable INTO lv_filename INDEX 1. - p_path = lv_filename. - -START-OF-SELECTION. - - lv_full_path = p_path. - - CREATE OBJECT lo_excel_reader TYPE zcl_excel_reader_xlsm. - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_xlsm. - lo_excel = lo_excel_reader->load_file( lv_full_path ). - lv_file = lo_excel_writer->write_file( lo_excel ). - REPLACE '.xlsm' IN lv_full_path WITH 'FromReader.xlsm'. - - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = lv_file - IMPORTING - output_length = lv_bytecount - TABLES - binary_tab = lt_file_tab. - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL28 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel28. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_file_name TYPE string, - lv_file_path TYPE string, - lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE '28_HelloWorld.csv'. - -PARAMETERS: p_path TYPE string. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = p_path - CHANGING selected_folder = p_path ). - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet1' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = sy-datum ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = sy-uzeit ). - - column_dimension = lo_worksheet->get_column_dimension( 'B' ). - column_dimension->set_width( 11 ). - - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). - - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_csv. - zcl_excel_writer_csv=>set_delimiter( ip_value = cl_abap_char_utilities=>horizontal_tab ). - zcl_excel_writer_csv=>set_enclosure( ip_value = '''' ). - zcl_excel_writer_csv=>set_endofline( ip_value = cl_abap_char_utilities=>cr_lf ). - - zcl_excel_writer_csv=>set_active_sheet_index( i_active_worksheet = 2 ). -* zcl_excel_writer_csv=>set_active_sheet_index_by_name( I_WORKSHEET_NAME = 'Sheet2' ). - - lv_file = lo_excel_writer->write_file( lo_excel ). - - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = lv_file - IMPORTING - output_length = lv_bytecount - TABLES - binary_tab = lt_file_tab. -* " This method is only available on AS ABAP > 6.40 -* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). -* lv_bytecount = xstrlen( lv_file ). - - " Save the file - REPLACE FIRST OCCURRENCE OF '.csv' IN lv_full_path WITH '_Sheet2.csv'. - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - -* zcl_excel_writer_csv=>set_active_sheet_index( i_active_worksheet = 2 ). - zcl_excel_writer_csv=>set_active_sheet_index_by_name( I_WORKSHEET_NAME = 'Sheet1' ). - lv_file = lo_excel_writer->write_file( lo_excel ). - REPLACE FIRST OCCURRENCE OF '_Sheet2.csv' IN lv_full_path WITH '_Sheet1.csv'. - - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = lv_file - IMPORTING - output_length = lv_bytecount - TABLES - binary_tab = lt_file_tab. -* " This method is only available on AS ABAP > 6.40 -* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). -* lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL27 -*& Test Styles for ABAP2XLSX -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel27. - -CONSTANTS: c_fish TYPE string VALUE 'Fish'. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_range TYPE REF TO zcl_excel_range, - lo_data_validation TYPE REF TO zcl_excel_data_validation, - lo_style_conditional TYPE REF TO zcl_excel_style_conditional, - lo_style_1 TYPE REF TO zcl_excel_style, - lo_style_2 TYPE REF TO zcl_excel_style, - lv_style_1_guid TYPE zexcel_cell_style, - lv_style_2_guid TYPE zexcel_cell_style, - ls_cellis TYPE zexcel_conditional_cellis. - - -DATA: lv_title TYPE zexcel_sheet_title. - -CONSTANTS: gc_save_file_name TYPE string VALUE '27_ConditionalFormatting.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - - " Creates active sheet - CREATE OBJECT lo_excel. - - lo_style_1 = lo_excel->add_new_style( ). - lo_style_1->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_1->fill->bgcolor-rgb = zcl_excel_style_color=>c_green. - lv_style_1_guid = lo_style_1->get_guid( ). - - lo_style_2 = lo_excel->add_new_style( ). - lo_style_2->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_2->fill->bgcolor-rgb = zcl_excel_style_color=>c_red. - lv_style_2_guid = lo_style_2->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lv_title = 'Data Validation'. - lo_worksheet->set_title( lv_title ). - " Set values for dropdown - lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = c_fish ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Anchovy' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 'Carp' ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 'Catfish' ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 'Cod' ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 'Eel' ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'A' ip_value = 'Haddock' ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = c_fish. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 9 ). - - " 1st validation - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = c_fish. - lo_data_validation->cell_row = 2. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = 'Select a value' ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '"Anchovy"'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. - ls_cellis-cell_style = lv_style_1_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 1. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 2 - ip_stop_column = 'C' - ip_stop_row = 2 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. - ls_cellis-formula = '"Carp"'. - ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. - ls_cellis-cell_style = lv_style_2_guid. - lo_style_conditional->mode_cellis = ls_cellis. - lo_style_conditional->priority = 2. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 2 - ip_stop_column = 'C' - ip_stop_row = 2 ). - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--------------------------------------------------------------------* -* REPORT ZDEMO_EXCEL26 -* Demo for method zcl_excel_worksheet-bind_object: -* export data from ALV (CL_GUI_ALV_GRID) object or cl_salv_table object -* to Excel. -*--------------------------------------------------------------------* -report zdemo_excel26. - -*----------------------------------------------------------------------* -* CLASS lcl_handle_events DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -class lcl_handle_events definition. - public section. - methods: - on_user_command for event added_function of cl_salv_events - importing e_salv_function. -endclass. "lcl_handle_events DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_handle_events IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -class lcl_handle_events implementation. - method on_user_command. - perform user_command." using e_salv_function text-i08. - endmethod. "on_user_command -endclass. "lcl_handle_events IMPLEMENTATION - -*--------------------------------------------------------------------* -* DATA DECLARATION -*--------------------------------------------------------------------* - -data: lo_excel type ref to zcl_excel, - lo_worksheet type ref to zcl_excel_worksheet, - lo_salv type ref to cl_salv_table, - gr_events type ref to lcl_handle_events, - lr_events type ref to cl_salv_events_table, - gt_sbook type table of sbook. - -data: l_path type string, " local dir - lv_workdir type string, - lv_file_separator type c. - -constants: - lv_default_file_name type string value '26_Bind_ALV.xlsx'. -*--------------------------------------------------------------------* -*START-OF-SELECTION -*--------------------------------------------------------------------* - -start-of-selection. - -* get data -* ------------------------------------------ - - select * - into table gt_sbook[] - from sbook "#EC CI_NOWHERE - up to 10 rows. - -* Display ALV -* ------------------------------------------ - - try. - cl_salv_table=>factory( - exporting - list_display = abap_false - importing - r_salv_table = lo_salv - changing - t_table = gt_sbook[] ). - catch cx_salv_msg . - endtry. - - try. - lo_salv->set_screen_status( - exporting - report = sy-repid - pfstatus = 'ALV_STATUS' - set_functions = lo_salv->c_functions_all ). - catch cx_salv_msg . - endtry. - - lr_events = lo_salv->get_event( ). - create object gr_events. - set handler gr_events->on_user_command for lr_events. - - lo_salv->display( ). - - -*&---------------------------------------------------------------------* -*& Form USER_COMMAND -*&---------------------------------------------------------------------* -* ALV user command -*--------------------------------------------------------------------* -form user_command . - if sy-ucomm = 'EXCEL'. - -* get save file path - cl_gui_frontend_services=>get_sapgui_workdir( changing sapworkdir = l_path ). - cl_gui_cfw=>flush( ). - cl_gui_frontend_services=>directory_browse( - exporting initial_folder = l_path - changing selected_folder = l_path ). - - if l_path is initial. - cl_gui_frontend_services=>get_sapgui_workdir( - changing sapworkdir = lv_workdir ). - l_path = lv_workdir. - endif. - - cl_gui_frontend_services=>get_file_separator( - changing file_separator = lv_file_separator ). - - concatenate l_path lv_file_separator lv_default_file_name - into l_path. - -* export file to save file path - perform export_to_excel. - - endif. -endform. " USER_COMMAND - -*--------------------------------------------------------------------* -* FORM EXPORT_TO_EXCEL -*--------------------------------------------------------------------* -* This subroutine is principal demo session -*--------------------------------------------------------------------* -form export_to_excel. - data: lo_converter type ref to zcl_excel_converter. -* create zcl_excel_worksheet object - - create object lo_excel. - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet1' ). - -* write to excel using method Bin_object - try. - lo_worksheet->bind_alv( - io_alv = lo_salv - it_table = gt_sbook - i_top = 2 - i_left = 1 - ). - catch zcx_excel . - endtry. - - perform write_file. - -endform. "EXPORT_TO_EXCEL -*&---------------------------------------------------------------------* -*& Form WRITE_FILE -*&---------------------------------------------------------------------* -* text -*----------------------------------------------------------------------* -* --> p1 text -* <-- p2 text -*----------------------------------------------------------------------* -form write_file . - data: lt_file type solix_tab, - l_bytecount type i, - l_file type xstring. - - data: lo_excel_writer type ref to zif_excel_writer. - - data: ls_seoclass type seoclass. - - create object lo_excel_writer type zcl_excel_writer_2007. - l_file = lo_excel_writer->write_file( lo_excel ). - - select single * into ls_seoclass - from seoclass - where clsname = 'CL_BCS_CONVERT'. - - if sy-subrc = 0. - call method (ls_seoclass-clsname)=>xstring_to_solix - exporting - iv_xstring = l_file - receiving - et_solix = lt_file. - - l_bytecount = xstrlen( l_file ). - else. - " Convert to binary - call function 'SCMS_XSTRING_TO_BINARY' - exporting - buffer = l_file - importing - output_length = l_bytecount - tables - binary_tab = lt_file. - endif. - - cl_gui_frontend_services=>gui_download( exporting bin_filesize = l_bytecount - filename = l_path - filetype = 'BIN' - changing data_tab = lt_file ). - -endform. " WRITE_FILE - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL25 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel25. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_exception TYPE REF TO cx_root. - -DATA: lv_file TYPE xstring. - -CONSTANTS: lv_file_name TYPE string VALUE '25_HelloWorld.xlsx'. -DATA: lv_default_file_name TYPE string. -DATA: lv_error TYPE string. - -CALL FUNCTION 'FILE_GET_NAME_USING_PATH' - EXPORTING - logical_path = 'LOCAL_TEMPORARY_FILES' " Logical path' - file_name = lv_file_name " File name - IMPORTING - file_name_with_path = lv_default_file_name. " File name with path -" Creates active sheet -CREATE OBJECT lo_excel. - -" Get active sheet -lo_worksheet = lo_excel->get_active_worksheet( ). -lo_worksheet->set_title( ip_title = 'Sheet1' ). -lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). - -CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. -lv_file = lo_excel_writer->write_file( lo_excel ). - -TRY. - OPEN DATASET lv_default_file_name FOR OUTPUT IN BINARY MODE. - TRANSFER lv_file TO lv_default_file_name. - CLOSE DATASET lv_default_file_name. - CATCH cx_root INTO lo_exception. - lv_error = lo_exception->get_text( ). - MESSAGE lv_error TYPE 'I'. -ENDTRY. - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL23 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel24. - -TYPE-POOLS: abap. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -DATA: lv_value TYPE string. - -CONSTANTS: gc_save_file_name TYPE string VALUE '24_Sheets_with_different_default_date_formats.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet1' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Default Date Format' ). - " Insert current date - lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Current Date:' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = sy-datum ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet2!A1' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 6 ip_value = 'This is a link to the second sheet' ip_hyperlink = lo_hyperlink ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - - - " Second sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_default_excel_date_format( zcl_excel_style_number_format=>c_format_date_yyyymmdd ). - lo_worksheet->set_title( ip_title = 'Sheet2' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Date Format set to YYYYMMDD' ). - " Insert current date - lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Current Date:' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = sy-datum ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet3!B2' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 6 ip_value = 'This is link to the third sheet' ip_hyperlink = lo_hyperlink ). - - " Third sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - " TODO: It seems that the zcl_excel_style_number_format=>c_format_date_yyyymmddslash - " does not produce a valid output - lo_worksheet->set_default_excel_date_format( zcl_excel_style_number_format=>c_format_date_yyyymmddslash ). - lo_worksheet->set_title( ip_title = 'Sheet3' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Date Format set to YYYY/MM/DD' ). - " Insert current date - lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Current Date:' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = sy-datum ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet4!B2' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 6 ip_value = 'This is link to the 4th sheet' ip_hyperlink = lo_hyperlink ). - - " 4th sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - " Illustrate the Problem caused by: - " Excel 2000 incorrectly assumes that the year 1900 is a leap year. - " http://support.microsoft.com/kb/214326/en-us - lo_worksheet->set_title( ip_title = 'Sheet4' ). - " Loop from Start Date to the Max Date current data in daily steps - CONSTANTS: lv_max type d VALUE '19000302'. - - DATA: lv_date TYPE d VALUE '19000226', - lv_row TYPE i. - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'Formated date' ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Integer value for this date' ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 3 ip_value = 'Date as string' ). - - lv_row = 4. - WHILE lv_date < lv_max. - lo_worksheet->set_cell( ip_column = 'B' ip_row = lv_row ip_value = lv_date ). - lv_value = zcl_excel_common=>date_to_excel_string( lv_date ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = lv_row ip_value = lv_value ). - lv_value = lv_date. - lo_worksheet->set_cell( ip_column = 'D' ip_row = lv_row ip_value = lv_value ). - lv_date = lv_date + 1. - lv_row = lv_row + 1. - ENDWHILE. - - lv_row = lv_row + 1. - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet1!B2' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = lv_row ip_value = 'This is link to the first sheet' ip_hyperlink = lo_hyperlink ). - - lo_excel->set_active_sheet_index_by_name( 'Sheet1' ). - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL23 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel23. - -TYPE-POOLS: abap. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '23_Sheets_with_and_without_grid_lines.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet1' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet with grid lines and print centered horizontal & vertical' ). - lo_worksheet->set_show_gridlines( i_show_gridlines = abap_true ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet2!B2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is a link to the second sheet' ip_hyperlink = lo_hyperlink ). - - lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. - lo_worksheet->zif_excel_sheet_properties~zoomscale = 150. - lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_NORMAL = 150. - - lo_worksheet->sheet_setup->vertical_centered = abap_true. - lo_worksheet->sheet_setup->horizontal_centered = abap_true. - - " Second sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet with grid lines in display and print' ). - lo_worksheet->set_show_gridlines( i_show_gridlines = abap_true ). - lo_worksheet->set_print_gridlines( i_print_gridlines = abap_true ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet3!B2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to the third sheet' ip_hyperlink = lo_hyperlink ). - - lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. - lo_worksheet->zif_excel_sheet_properties~zoomscale = 160. - lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_PAGELAYOUTVIEW = 200. - - " Third sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet3' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the third sheet without grid lines in display and print' ). - lo_worksheet->set_show_gridlines( i_show_gridlines = abap_false ). - lo_worksheet->set_print_gridlines( i_print_gridlines = abap_false ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet4!B2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to the fourth sheet' ip_hyperlink = lo_hyperlink ). - - lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. - lo_worksheet->zif_excel_sheet_properties~zoomscale = 170. - lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_SHEETLAYOUTVIEW = 150. - - " Fourth sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet4' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the fourth sheet with grid lines and print centered ONLY horizontal' ). - lo_worksheet->set_show_gridlines( i_show_gridlines = abap_true ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet1!B2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to the first sheet' ip_hyperlink = lo_hyperlink ). - - lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. - lo_worksheet->zif_excel_sheet_properties~zoomscale = 150. - lo_worksheet->ZIF_EXCEL_SHEET_PROPERTIES~ZOOMSCALE_NORMAL = 150. - -" lo_worksheet->sheet_setup->vertical_centered = abap_true. - lo_worksheet->sheet_setup->horizontal_centered = abap_true. - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL17 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel17. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_protection TYPE REF TO zcl_excel_style, - lv_style_protection_guid TYPE zexcel_cell_style, - lo_style TYPE REF TO zcl_excel_style, - lv_style TYPE zexcel_cell_style. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '17_SheetProtection.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -PARAMETERS: p_pwd TYPE zexcel_aes_password LOWER CASE DEFAULT 'secret'. - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. -* lo_worksheet->zif_excel_sheet_protection~password = 'DAA7'. "it is the encoded word "secret" - lo_worksheet->zif_excel_sheet_protection~password = zcl_excel_common=>encrypt_password( p_pwd ). - lo_worksheet->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_active. - lo_worksheet->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_active. - lo_worksheet->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_active. - " First style to unlock a cell - lo_style_protection = lo_excel->add_new_style( ). - lo_style_protection->protection->locked = zcl_excel_style_protection=>c_protection_unlocked. - lv_style_protection_guid = lo_style_protection->get_guid( ). - " Another style which should not affect the unlock style - lo_style = lo_excel->add_new_style( ). - lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style->fill->fgcolor-rgb = 'FFCC3333'. - lv_style = lo_style->get_guid( ). - lo_worksheet->set_cell( ip_row = 3 ip_column = 'C' ip_value = 'This cell is locked locked and has the second formating' ip_style = lv_style ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'This cell is locked as all the others empty cell' ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'This cell is locked as all the others empty cell' ). - - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED2 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched2. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lo_style_title TYPE REF TO zcl_excel_style, - lv_style_title_guid TYPE zexcel_cell_style. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Styles - lo_style_title = lo_excel->add_new_style( ). - lo_style_title->font->bold = abap_true. - lo_style_title->font->color-rgb = zcl_excel_style_color=>c_blue. - lv_style_title_guid = lo_style_title->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo TechEd' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'TechEd demo' ip_style = lv_style_title_guid ). - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL18 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel18. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lv_style_protection_guid TYPE zexcel_cell_style. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '18_BookProtection.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " Get active sheet - lo_excel->zif_excel_book_protection~protected = zif_excel_book_protection=>c_protected. - lo_excel->zif_excel_book_protection~lockrevision = zif_excel_book_protection=>c_locked. - lo_excel->zif_excel_book_protection~lockstructure = zif_excel_book_protection=>c_locked. - lo_excel->zif_excel_book_protection~lockwindows = zif_excel_book_protection=>c_locked. - - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'This cell is unlocked' ip_style = lv_style_protection_guid ). - - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL19 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel19. - -TYPE-POOLS: abap. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '19_SetActiveSheet.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -PARAMETERS: p_noout TYPE xfeld DEFAULT abap_true. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " First Worksheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'First' ). - lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'This is Sheet 1' ). - - " Second Worksheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( 'Second' ). - lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'This is Sheet 2' ). - - " Third Worksheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( 'Third' ). - lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'This is Sheet 3' ). - - IF p_noout EQ abap_false. - " lo_excel->set_active_sheet_index_by_name( data_sheet_name ). - DATA: active_sheet_index TYPE zexcel_active_worksheet. - active_sheet_index = lo_excel->get_active_sheet_index( ). - WRITE: 'Sheet Index before: ', active_sheet_index. - ENDIF. - lo_excel->set_active_sheet_index( '2' ). - IF p_noout EQ abap_false. - active_sheet_index = lo_excel->get_active_sheet_index( ). - WRITE: 'Sheet Index after: ', active_sheet_index. - ENDIF. - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL2 -*& Test Styles for ABAP2XLSX -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel2. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_bold TYPE REF TO zcl_excel_style, - lo_style_underline TYPE REF TO zcl_excel_style, - lo_style_filled TYPE REF TO zcl_excel_style, - lo_style_border TYPE REF TO zcl_excel_style, - lo_style_button TYPE REF TO zcl_excel_style, - lo_border_dark TYPE REF TO zcl_excel_style_border, - lo_border_light TYPE REF TO zcl_excel_style_border. - -DATA: lv_style_bold_guid TYPE zexcel_cell_style, - lv_style_underline_guid TYPE zexcel_cell_style, - lv_style_filled_guid TYPE zexcel_cell_style, - lv_style_filled_green_guid TYPE zexcel_cell_style, - lv_style_border_guid TYPE zexcel_cell_style, - lv_style_button_guid TYPE zexcel_cell_style, - lv_style_filled_turquoise_guid TYPE zexcel_cell_style. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: gc_save_file_name TYPE string VALUE '02_Styles.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - - -START-OF-SELECTION. - - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Create border object - CREATE OBJECT lo_border_dark. - lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. - lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. - CREATE OBJECT lo_border_light. - lo_border_light->border_color-rgb = zcl_excel_style_color=>c_gray. - lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. - " Create a bold / italic style - lo_style_bold = lo_excel->add_new_style( ). - lo_style_bold->font->bold = abap_true. - lo_style_bold->font->italic = abap_true. - lo_style_bold->font->name = zcl_excel_style_font=>c_name_arial. - lo_style_bold->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_bold->font->color-rgb = zcl_excel_style_color=>c_red. - lv_style_bold_guid = lo_style_bold->get_guid( ). - " Create an underline double style - lo_style_underline = lo_excel->add_new_style( ). - lo_style_underline->font->underline = abap_true. - lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. - lo_style_underline->font->name = zcl_excel_style_font=>c_name_roman. - lo_style_underline->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_underline->font->family = zcl_excel_style_font=>c_family_roman. - lv_style_underline_guid = lo_style_underline->get_guid( ). - " Create filled style yellow - lo_style_filled = lo_excel->add_new_style( ). - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-theme = zcl_excel_style_color=>c_theme_accent6. - lv_style_filled_guid = lo_style_filled->get_guid( ). - " Create border with button effects - lo_style_button = lo_excel->add_new_style( ). - lo_style_button->borders->right = lo_border_dark. - lo_style_button->borders->down = lo_border_dark. - lo_style_button->borders->left = lo_border_light. - lo_style_button->borders->top = lo_border_light. - lv_style_button_guid = lo_style_button->get_guid( ). - "Create style with border - lo_style_border = lo_excel->add_new_style( ). - lo_style_border->borders->allborders = lo_border_dark. - lo_style_border->borders->diagonal = lo_border_dark. - lo_style_border->borders->diagonal_mode = zcl_excel_style_borders=>c_diagonal_both. - lv_style_border_guid = lo_style_border->get_guid( ). - " Create filled style green - lo_style_filled = lo_excel->add_new_style( ). - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_green. - lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. - lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. - lv_style_filled_green_guid = lo_style_filled->get_guid( ). - - " Create filled style turquoise using legacy excel ver <= 2003 palette. (https://code.sdn.sap.com/spaces/abap2xlsx/tickets/92) - lo_style_filled = lo_excel->add_new_style( ). - lo_excel->legacy_palette->set_color( "replace built-in color from palette with out custom RGB turquoise - ip_index = 16 - ip_color = '0040E0D0' ). - - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-indexed = 16. - lv_style_filled_turquoise_guid = lo_style_filled->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Styles' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 9 ip_value = 'Modified color for Excel 2003' ip_style = lv_style_filled_turquoise_guid ). - " Fill the cell and apply one style - lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). - " Change the style - lo_worksheet->set_cell_style( ip_column = 'B' ip_row = 6 ip_style = lv_style_filled_green_guid ). - " Add Style to an empty cell to test Fix for Issue - "#44 Exception ZCX_EXCEL thrown when style is set for an empty cell - " https://code.sdn.sap.com/spaces/abap2xlsx/tickets/44-exception-zcx_excel-thrown-when-style-is-set-for-an-empty-cell - lo_worksheet->set_cell_style( ip_column = 'E' ip_row = 6 ip_style = lv_style_filled_green_guid ). - -* CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. -* lv_file = lo_excel_writer->write_file( lo_excel ). -* -* " Convert to binary -* CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' -* EXPORTING -* buffer = lv_file -* IMPORTING -* output_length = lv_bytecount -* TABLES -* binary_tab = lt_file_tab. -** " This method is only available on AS ABAP > 6.40 -** lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). -** lv_bytecount = xstrlen( lv_file ). -* -* " Save the file -* cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount -* filename = lv_full_path -* filetype = 'BIN' -* CHANGING data_tab = lt_file_tab ). - - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL22 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel22. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style TYPE REF TO zcl_excel_style, - lo_style_date TYPE REF TO zcl_excel_style, - lo_style_editable TYPE REF TO zcl_excel_style, - lo_data_validation TYPE REF TO zcl_excel_data_validation. - -DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, - ls_table_settings TYPE zexcel_s_table_settings, - ls_table_settings_out TYPE zexcel_s_table_settings. - -DATA: lv_style_guid TYPE zexcel_cell_style. - -DATA: lv_row TYPE char10. - -FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. - -CONSTANTS: gc_save_file_name TYPE string VALUE '22_itab_fieldcatalog.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'PN_MASSIVE'). - - DATA lt_test TYPE TABLE OF sflight. - SELECT * FROM sflight INTO TABLE lt_test. "#EC CI_NOWHERE - - " sheet style (white background) - lo_style = lo_excel->add_new_style( ). - lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style->fill->fgcolor-rgb = zcl_excel_style_color=>c_white. - lv_style_guid = lo_style->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->zif_excel_sheet_properties~set_style( lv_style_guid ). - lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. - lo_worksheet->zif_excel_sheet_protection~password = zcl_excel_common=>encrypt_password( 'test' ). - lo_worksheet->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_active. - lo_worksheet->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_active. - lo_worksheet->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_active. - - " Create cell style for display only fields - lo_style = lo_excel->add_new_style( ). - lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style->fill->fgcolor-rgb = zcl_excel_style_color=>c_gray. - lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_text. - - " Create cell style for display only date field - lo_style_date = lo_excel->add_new_style( ). - lo_style_date->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_date->fill->fgcolor-rgb = zcl_excel_style_color=>c_gray. - lo_style_date->number_format->format_code = zcl_excel_style_number_format=>c_format_date_ddmmyyyy. - - " Create cell style for editable fields - lo_style_editable = lo_excel->add_new_style( ). - lo_style_editable->protection->locked = zcl_excel_style_protection=>c_protection_unlocked. - - lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_test ). - - LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. - CASE <fs_field_catalog>-fieldname. - WHEN 'CARRID'. - <fs_field_catalog>-position = 3. - <fs_field_catalog>-dynpfld = abap_true. - <fs_field_catalog>-style = lo_style->get_guid( ). - WHEN 'CONNID'. - <fs_field_catalog>-position = 1. - <fs_field_catalog>-dynpfld = abap_true. - <fs_field_catalog>-style = lo_style->get_guid( ). - WHEN 'FLDATE'. - <fs_field_catalog>-position = 2. - <fs_field_catalog>-dynpfld = abap_true. - <fs_field_catalog>-style = lo_style_date->get_guid( ). - WHEN 'PRICE'. - <fs_field_catalog>-position = 4. - <fs_field_catalog>-dynpfld = abap_true. - <fs_field_catalog>-style = lo_style_editable->get_guid( ). - <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_sum. - WHEN OTHERS. - <fs_field_catalog>-dynpfld = abap_false. - ENDCASE. - ENDLOOP. - - ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2. - ls_table_settings-show_row_stripes = abap_true. - - lo_worksheet->bind_table( EXPORTING - ip_table = lt_test - it_field_catalog = lt_field_catalog - is_table_settings = ls_table_settings - IMPORTING - es_table_settings = ls_table_settings_out ). - - lo_worksheet->freeze_panes( ip_num_rows = 3 ). "freeze column headers when scrolling - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_custom. - lv_row = ls_table_settings_out-top_left_row. - CONDENSE lv_row. - CONCATENATE 'ISNUMBER(' ls_table_settings_out-top_left_column lv_row ')' INTO lo_data_validation->formula1. - lo_data_validation->cell_row = ls_table_settings_out-top_left_row. - lo_data_validation->cell_column = ls_table_settings_out-top_left_column. - lo_data_validation->cell_row_to = ls_table_settings_out-bottom_right_row. - lo_data_validation->cell_column_to = ls_table_settings_out-bottom_right_column. - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL21 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel21. - -TYPES: - BEGIN OF t_color_style, - color TYPE zexcel_style_color_argb, - style TYPE zexcel_cell_style, - END OF t_color_style. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_filled TYPE REF TO zcl_excel_style. - -DATA: color_styles TYPE TABLE OF t_color_style. - -FIELD-SYMBOLS: <color_style> LIKE LINE OF color_styles. - -CONSTANTS: max TYPE i VALUE 255, - step TYPE i VALUE 51. - -DATA: red TYPE i, - green TYPE i, - blue TYPE i, - red_hex(1) TYPE x, - green_hex(1) TYPE x, - blue_hex(1) TYPE x, - red_str TYPE string, - green_str TYPE string, - blue_str TYPE string. - -DATA: color TYPE zexcel_style_color_argb, - tint TYPE zexcel_style_color_tint. - -DATA: row TYPE i, - row_tmp TYPE i, - column TYPE zexcel_cell_column VALUE 1, - col_str TYPE zexcel_cell_column_alpha. - -CONSTANTS: gc_save_file_name TYPE string VALUE '21_BackgroundColorPicker.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - WHILE red <= max. - green = 0. - WHILE green <= max. - blue = 0. - WHILE blue <= max. - red_hex = red. - red_str = red_hex. - green_hex = green. - green_str = green_hex. - blue_hex = blue. - blue_str = blue_hex. - " Create filled - CONCATENATE 'FF' red_str green_str blue_str INTO color. - APPEND INITIAL LINE TO color_styles ASSIGNING <color_style>. - lo_style_filled = lo_excel->add_new_style( ). - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-rgb = color. - <color_style>-color = color. - <color_style>-style = lo_style_filled->get_guid( ). - blue = blue + step. - ENDWHILE. - green = green + step. - ENDWHILE. - red = red + step. - ENDWHILE. - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'Color Picker' ). - LOOP AT color_styles ASSIGNING <color_style>. - row_tmp = ( max / step + 1 ) * 3. - IF row = row_tmp. - row = 0. - column = column + 1. - ENDIF. - row = row + 1. - col_str = zcl_excel_common=>convert_column2alpha( column ). - - " Fill the cell and apply one style - lo_worksheet->set_cell( ip_column = col_str - ip_row = row - ip_value = <color_style>-color - ip_style = <color_style>-style ). - ENDLOOP. - - row = row + 2. - tint = '-0.5'. - DO 10 TIMES. - column = 1. - DO 10 TIMES. - lo_style_filled = lo_excel->add_new_style( ). - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-theme = sy-index - 1. - lo_style_filled->fill->fgcolor-tint = tint. - <color_style>-style = lo_style_filled->get_guid( ). - col_str = zcl_excel_common=>convert_column2alpha( column ). - lo_worksheet->set_cell_style( ip_column = col_str - ip_row = row - ip_style = <color_style>-style ). - - ADD 1 TO column. - ENDDO. - ADD '0.1' TO tint. - ADD 1 TO row. - ENDDO. - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--------------------------------------------------------------------* -* REPORT ZDEMO_EXCEL20 -* Demo for method zcl_excel_worksheet-bind_alv: -* export data from ALV (CL_GUI_ALV_GRID) object to excel -*--------------------------------------------------------------------* -REPORT zdemo_excel20. - -*----------------------------------------------------------------------* -* CLASS lcl_handle_events DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_handle_events DEFINITION. - PUBLIC SECTION. - METHODS: - on_user_command FOR EVENT added_function OF cl_salv_events - IMPORTING e_salv_function. -ENDCLASS. "lcl_handle_events DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_handle_events IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_handle_events IMPLEMENTATION. - METHOD on_user_command. - PERFORM user_command." using e_salv_function text-i08. - ENDMETHOD. "on_user_command -ENDCLASS. "lcl_handle_events IMPLEMENTATION - -*--------------------------------------------------------------------* -* DATA DECLARATION -*--------------------------------------------------------------------* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_alv TYPE REF TO cl_gui_alv_grid, - lo_salv TYPE REF TO cl_salv_table, - gr_events TYPE REF TO lcl_handle_events, - lr_events TYPE REF TO cl_salv_events_table, - gt_sbook TYPE TABLE OF sbook, - gt_listheader TYPE slis_t_listheader, - wa_listheader LIKE LINE OF gt_listheader. - -DATA: l_path TYPE string, " local dir - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: - lv_default_file_name TYPE string VALUE '20_BindAlv.xlsx'. -*--------------------------------------------------------------------* -*START-OF-SELECTION -*--------------------------------------------------------------------* - -START-OF-SELECTION. - -* get data -* ------------------------------------------ - - SELECT * - INTO TABLE gt_sbook[] - FROM sbook "#EC CI_NOWHERE - UP TO 10 ROWS. - -* Display ALV -* ------------------------------------------ - - TRY. - cl_salv_table=>factory( - EXPORTING - list_display = abap_false - IMPORTING - r_salv_table = lo_salv - CHANGING - t_table = gt_sbook[] ). - CATCH cx_salv_msg . - ENDTRY. - - TRY. - lo_salv->set_screen_status( - EXPORTING - report = sy-repid - pfstatus = 'ALV_STATUS' - set_functions = lo_salv->c_functions_all ). - CATCH cx_salv_msg . - ENDTRY. - - lr_events = lo_salv->get_event( ). - CREATE OBJECT gr_events. - SET HANDLER gr_events->on_user_command FOR lr_events. - - lo_salv->display( ). - - -*&---------------------------------------------------------------------* -*& Form USER_COMMAND -*&---------------------------------------------------------------------* -* ALV user command -*--------------------------------------------------------------------* -FORM user_command . - IF sy-ucomm = 'EXCEL'. - -* get save file path - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = l_path ). - cl_gui_cfw=>flush( ). - cl_gui_frontend_services=>directory_browse( - EXPORTING initial_folder = l_path - CHANGING selected_folder = l_path ). - - IF l_path IS INITIAL. - cl_gui_frontend_services=>get_sapgui_workdir( - CHANGING sapworkdir = lv_workdir ). - l_path = lv_workdir. - ENDIF. - - cl_gui_frontend_services=>get_file_separator( - CHANGING file_separator = lv_file_separator ). - - CONCATENATE l_path lv_file_separator lv_default_file_name - INTO l_path. - -* export file to save file path - - PERFORM export_to_excel. - - ENDIF. -ENDFORM. " USER_COMMAND - -*--------------------------------------------------------------------* -* FORM EXPORT_TO_EXCEL -*--------------------------------------------------------------------* -* This subroutine is principal demo session -*--------------------------------------------------------------------* -FORM export_to_excel. - -* create zcl_excel_worksheet object - - CREATE OBJECT lo_excel. - lo_worksheet = lo_excel->get_active_worksheet( ). - -* get ALV object from screen - - CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' - IMPORTING - e_grid = lo_alv. - -* build list header - - wa_listheader-typ = 'H'. - wa_listheader-info = sy-title. - APPEND wa_listheader TO gt_listheader. - - wa_listheader-typ = 'S'. - wa_listheader-info = 'Created by: ABAP2XLSX Group'. - APPEND wa_listheader TO gt_listheader. - - wa_listheader-typ = 'A'. - wa_listheader-info = - 'Project hosting at https://cw.sdn.sap.com/cw/groups/abap2xlsx'. - APPEND wa_listheader TO gt_listheader. - -* write to excel using method Bin_ALV - - lo_worksheet->bind_alv_ole2( - EXPORTING -* I_DOCUMENT_URL = SPACE " excel template -* I_XLS = 'X' " create in xls format? - i_save_path = l_path - io_alv = lo_alv - it_listheader = gt_listheader - i_top = 2 - i_left = 1 -* I_COLUMNS_HEADER = 'X' -* I_COLUMNS_AUTOFIT = 'X' -* I_FORMAT_COL_HEADER = -* I_FORMAT_SUBTOTAL = -* I_FORMAT_TOTAL = - EXCEPTIONS - miss_guide = 1 - ex_transfer_kkblo_error = 2 - fatal_error = 3 - inv_data_range = 4 - dim_mismatch_vkey = 5 - dim_mismatch_sema = 6 - error_in_sema = 7 - OTHERS = 8 - ). - IF sy-subrc <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - -ENDFORM. "EXPORT_TO_EXCEL - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel3. - -TYPE-POOLS: abap. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - -DATA: ls_table_settings TYPE zexcel_s_table_settings. - - -DATA: lv_title TYPE zexcel_sheet_title, - lt_carr TYPE TABLE OF scarr, - row TYPE zexcel_cell_row VALUE 2, - lo_range TYPE REF TO zcl_excel_range. -DATA: lo_data_validation TYPE REF TO zcl_excel_data_validation. -FIELD-SYMBOLS: <carr> LIKE LINE OF lt_carr. - -CONSTANTS: c_airlines TYPE string VALUE 'Airlines'. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '03_iTab.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -PARAMETERS: p_empty TYPE flag. - -START-OF-SELECTION. - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Internal table'). - - DATA lt_test TYPE TABLE OF sflight. - - IF p_empty <> abap_true. - SELECT * FROM sflight INTO TABLE lt_test. "#EC CI_NOWHERE - ENDIF. - - ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2. - ls_table_settings-show_row_stripes = abap_true. - ls_table_settings-nofilters = abap_true. - - lo_worksheet->bind_table( ip_table = lt_test - is_table_settings = ls_table_settings ). - - lo_worksheet->freeze_panes( ip_num_rows = 3 ). "freeze column headers when scrolling - - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ). "make date field a bit wider - column_dimension->set_width( ip_width = 11 ). - " Add another table for data validations - lo_worksheet = lo_excel->add_new_worksheet( ). - lv_title = 'Data Validation'. - lo_worksheet->set_title( lv_title ). - lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = c_airlines ). - SELECT * FROM scarr INTO TABLE lt_carr. "#EC CI_NOWHERE - LOOP AT lt_carr ASSIGNING <carr>. - lo_worksheet->set_cell( ip_row = row ip_column = 'A' ip_value = <carr>-carrid ). - row = row + 1. - ENDLOOP. - row = row - 1. - lo_range = lo_excel->add_new_range( ). - lo_range->name = c_airlines. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'A' - ip_start_row = 2 - ip_stop_column = 'A' - ip_stop_row = row ). - " Set Data Validation - lo_excel->set_active_sheet_index( 1 ). - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = c_airlines. - lo_data_validation->cell_row = 4. - lo_data_validation->cell_column = 'C'. - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL1 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel30. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - - -DATA: lv_value TYPE string, - lv_count TYPE i VALUE 10, - lv_packed TYPE p LENGTH 16 DECIMALS 1 VALUE '1234567890.5'. - -CONSTANTS: lc_typekind_string TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_string, - lc_typekind_packed TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_packed, - lc_typekind_num TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_num, - lc_typekind_date TYPE abap_typekind VALUE cl_abap_typedescr=>typekind_date, - lc_typekind_s_ls TYPE string VALUE 's_leading_blanks'. - -CONSTANTS: gc_save_file_name TYPE string VALUE '30_CellDataTypes.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Cell data types' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'Number as String' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = '11' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 1 ip_value = 'String' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = ' String with leading spaces' - ip_data_type = lc_typekind_s_ls ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = ' Negative Value' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 1 ip_value = 'Packed' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 2 ip_value = '50000.01-' - ip_abap_type = lc_typekind_packed ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 1 ip_value = 'Number with Percentage' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 2 ip_value = '0 %' - ip_abap_type = lc_typekind_num ). - lo_worksheet->set_cell( ip_column = 'E' ip_row = 1 ip_value = 'Date' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'E' ip_row = 2 ip_value = '20110831' - ip_abap_type = lc_typekind_date ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'Positive Value' - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = '5000.02' - ip_abap_type = lc_typekind_packed ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 3 ip_value = '50 %' - ip_abap_type = lc_typekind_num ). - - WHILE lv_count <= 15. - lv_value = lv_count. - CONCATENATE 'Positive Value with' lv_value 'Digits' INTO lv_value SEPARATED BY space. - lo_worksheet->set_cell( ip_column = 'B' ip_row = lv_count ip_value = lv_value - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = lv_count ip_value = lv_packed - ip_abap_type = lc_typekind_packed ). - CONCATENATE 'Positive Value with' lv_value 'Digits formated as string' INTO lv_value SEPARATED BY space. - lo_worksheet->set_cell( ip_column = 'D' ip_row = lv_count ip_value = lv_value - ip_abap_type = lc_typekind_string ). - lo_worksheet->set_cell( ip_column = 'E' ip_row = lv_count ip_value = lv_packed - ip_abap_type = lc_typekind_string ). - lv_packed = lv_packed * 10. - lv_count = lv_count + 1. - ENDWHILE. - - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). - column_dimension->set_auto_size( abap_true ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - column_dimension->set_auto_size( abap_true ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). - column_dimension->set_auto_size( abap_true ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'D' ). - column_dimension->set_auto_size( abap_true ). - column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ). - column_dimension->set_auto_size( abap_true ). - - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL1 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel31. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime. - - -DATA: fieldval TYPE text80, - row TYPE i, - style_column_a TYPE REF TO zcl_excel_style, - style_column_a_guid TYPE zexcel_cell_style, - style_column_b TYPE REF TO zcl_excel_style, - style_column_b_guid TYPE zexcel_cell_style, - style_column_c TYPE REF TO zcl_excel_style, - style_column_c_guid TYPE zexcel_cell_style, - style_font TYPE REF TO zcl_excel_style_font. - -CONSTANTS: gc_save_file_name TYPE string VALUE '31_AutosizeWithDifferentFontSizes.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - " Use active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Regular Font' ). - - style_column_a = lo_excel->add_new_style( ). - style_column_a->font->size = 32. " quite large - style_column_a_guid = style_column_a->get_guid( ). - - style_column_c = lo_excel->add_new_style( ). - style_column_c->font->size = 16. " not so large - style_column_c_guid = style_column_c->get_guid( ). - - - DO 20 TIMES. - row = sy-index. - CLEAR fieldval. - DO sy-index TIMES. - CONCATENATE fieldval 'X' INTO fieldval. - ENDDO. - lo_worksheet->set_cell( ip_column = 'A' ip_row = row ip_value = fieldval ip_style = style_column_a_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = row ip_value = fieldval ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = row ip_value = fieldval ip_style = style_column_c_guid ). - ENDDO. - - column_dimension = lo_worksheet->get_column_dimension( 'A' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - column_dimension = lo_worksheet->get_column_dimension( 'B' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - column_dimension = lo_worksheet->get_column_dimension( 'C' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - - " Add sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Bold Font' ). - - style_column_a = lo_excel->add_new_style( ). - style_column_a->font->size = 32. " quite large - style_column_a->font->bold = abap_true. - style_column_a_guid = style_column_a->get_guid( ). - - style_column_b = lo_excel->add_new_style( ). - style_column_b->font->bold = abap_true. - style_column_b_guid = style_column_b->get_guid( ). - - style_column_c = lo_excel->add_new_style( ). - style_column_c->font->size = 16. " not so large - style_column_c->font->bold = abap_true. - style_column_c_guid = style_column_c->get_guid( ). - - DO 20 TIMES. - row = sy-index. - CLEAR fieldval. - DO sy-index TIMES. - CONCATENATE fieldval 'X' INTO fieldval. - ENDDO. - lo_worksheet->set_cell( ip_column = 'A' ip_row = row ip_value = fieldval ip_style = style_column_a_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = row ip_value = fieldval ip_style = style_column_b_guid ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = row ip_value = fieldval ip_style = style_column_c_guid ). - ENDDO. - - column_dimension = lo_worksheet->get_column_dimension( 'A' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - column_dimension = lo_worksheet->get_column_dimension( 'B' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - column_dimension = lo_worksheet->get_column_dimension( 'C' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - - " Add sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Italic Font' ). - - style_column_a = lo_excel->add_new_style( ). - style_column_a->font->size = 32. " quite large - style_column_a->font->italic = abap_true. - style_column_a_guid = style_column_a->get_guid( ). - - style_column_b = lo_excel->add_new_style( ). - style_column_b->font->italic = abap_true. - style_column_b_guid = style_column_b->get_guid( ). - - style_column_c = lo_excel->add_new_style( ). - style_column_c->font->size = 16. " not so large - style_column_c->font->italic = abap_true. - style_column_c_guid = style_column_c->get_guid( ). - - DO 20 TIMES. - row = sy-index. - CLEAR fieldval. - DO sy-index TIMES. - CONCATENATE fieldval 'X' INTO fieldval. - ENDDO. - lo_worksheet->set_cell( ip_column = 'A' ip_row = row ip_value = fieldval ip_style = style_column_a_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = row ip_value = fieldval ip_style = style_column_b_guid ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = row ip_value = fieldval ip_style = style_column_c_guid ). - ENDDO. - - column_dimension = lo_worksheet->get_column_dimension( 'A' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - column_dimension = lo_worksheet->get_column_dimension( 'B' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - column_dimension = lo_worksheet->get_column_dimension( 'C' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - - " Add sheet for merged cells - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Merged cells' ). - - lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'This is a very long header text' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = 'Some data' ). - lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Some more data' ). - - lo_worksheet->set_merge( - EXPORTING - ip_column_start = 'A' - ip_column_end = 'C' - ip_row = 1 ). - - column_dimension = lo_worksheet->get_column_dimension( 'A' ). - column_dimension->set_auto_size( ip_auto_size = abap_true ). - - lo_excel->set_active_sheet_index( i_active_worksheet = 1 ). - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--------------------------------------------------------------------* -* REPORT ZDEMO_EXCEL32 -* Demo for export options from ALV GRID: -* export data from ALV (CL_GUI_ALV_GRID) object or cl_salv_table object -* to Excel. -*--------------------------------------------------------------------* -REPORT zdemo_excel32. - -*----------------------------------------------------------------------* -* CLASS lcl_handle_events DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_handle_events DEFINITION. - PUBLIC SECTION. - METHODS: - on_user_command FOR EVENT added_function OF cl_salv_events - IMPORTING e_salv_function. -ENDCLASS. "lcl_handle_events DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_handle_events IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_handle_events IMPLEMENTATION. - METHOD on_user_command. - PERFORM user_command." using e_salv_function text-i08. - ENDMETHOD. "on_user_command -ENDCLASS. "lcl_handle_events IMPLEMENTATION - -*--------------------------------------------------------------------* -* DATA DECLARATION -*--------------------------------------------------------------------* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_salv TYPE REF TO cl_salv_table, - gr_events TYPE REF TO lcl_handle_events, - lr_events TYPE REF TO cl_salv_events_table, - gt_sbook TYPE TABLE OF sbook. - -DATA: l_path TYPE string, " local dir - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: - lv_default_file_name TYPE string VALUE '32_Export_ALV.xlsx', - lv_default_file_name2 TYPE string VALUE '32_Export_Convert.xlsx'. -*--------------------------------------------------------------------* -*START-OF-SELECTION -*--------------------------------------------------------------------* - -START-OF-SELECTION. - -* get data -* ------------------------------------------ - - SELECT * - INTO TABLE gt_sbook[] - FROM sbook "#EC CI_NOWHERE - UP TO 100 ROWS. - -* Display ALV -* ------------------------------------------ - - TRY. - cl_salv_table=>factory( - EXPORTING - list_display = abap_false - IMPORTING - r_salv_table = lo_salv - CHANGING - t_table = gt_sbook[] ). - CATCH cx_salv_msg . - ENDTRY. - - TRY. - lo_salv->set_screen_status( - EXPORTING - report = sy-repid - pfstatus = 'ALV_STATUS' - set_functions = lo_salv->c_functions_all ). - CATCH cx_salv_msg . - ENDTRY. - - lr_events = lo_salv->get_event( ). - CREATE OBJECT gr_events. - SET HANDLER gr_events->on_user_command FOR lr_events. - - lo_salv->display( ). - - -*&---------------------------------------------------------------------* -*& Form USER_COMMAND -*&---------------------------------------------------------------------* -* ALV user command -*--------------------------------------------------------------------* -FORM user_command . - -* get save file path - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = l_path ). - cl_gui_cfw=>flush( ). - cl_gui_frontend_services=>directory_browse( - EXPORTING initial_folder = l_path - CHANGING selected_folder = l_path ). - - IF l_path IS INITIAL. - cl_gui_frontend_services=>get_sapgui_workdir( - CHANGING sapworkdir = lv_workdir ). - l_path = lv_workdir. - ENDIF. - - cl_gui_frontend_services=>get_file_separator( - CHANGING file_separator = lv_file_separator ). - - - -* export file to save file path - CASE sy-ucomm. - WHEN 'EXCELBIND'. - CONCATENATE l_path lv_file_separator lv_default_file_name - INTO l_path. - PERFORM export_to_excel_bind. - - WHEN 'EXCELCONV'. - - CONCATENATE l_path lv_file_separator lv_default_file_name2 - INTO l_path. - PERFORM export_to_excel_conv. - - ENDCASE. -ENDFORM. " USER_COMMAND -*--------------------------------------------------------------------* -* FORM EXPORT_TO_EXCEL_CONV -*--------------------------------------------------------------------* -* This subroutine is principal demo session -*--------------------------------------------------------------------* -FORM export_to_excel_conv. - DATA: lo_converter TYPE REF TO zcl_excel_converter. - - CREATE OBJECT lo_converter. -*TRY. - lo_converter->convert( - EXPORTING - io_alv = lo_salv - it_table = gt_sbook - i_row_int = 2 - i_column_int = 2 -* i_table = -* i_style_table = -* io_worksheet = -* CHANGING -* co_excel = - ). -* CATCH zcx_excel . -*ENDTRY. - lo_converter->write_file( i_path = l_path ). - -ENDFORM. "EXPORT_TO_EXCEL_CONV - -*--------------------------------------------------------------------* -* FORM EXPORT_TO_EXCEL_BIND -*--------------------------------------------------------------------* -* This subroutine is principal demo session -*--------------------------------------------------------------------* -FORM export_to_excel_bind. -* create zcl_excel_worksheet object - CREATE OBJECT lo_excel. - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet1' ). - -* write to excel using method Bin_object -*try. - lo_worksheet->bind_alv( - io_alv = lo_salv - it_table = gt_sbook - i_top = 2 - i_left = 1 - ). -* catch zcx_excel . -*endtry. - - - PERFORM write_file. - -ENDFORM. "EXPORT_TO_EXCEL_BIND -*&---------------------------------------------------------------------* -*& Form WRITE_FILE -*&---------------------------------------------------------------------* -* text -*----------------------------------------------------------------------* -* --> p1 text -* <-- p2 text -*----------------------------------------------------------------------* -FORM write_file . - DATA: lt_file TYPE solix_tab, - l_bytecount TYPE i, - l_file TYPE xstring. - - DATA: lo_excel_writer TYPE REF TO zif_excel_writer. - - DATA: ls_seoclass TYPE seoclass. - - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - l_file = lo_excel_writer->write_file( lo_excel ). - - SELECT SINGLE * INTO ls_seoclass - FROM seoclass - WHERE clsname = 'CL_BCS_CONVERT'. - - IF sy-subrc = 0. - CALL METHOD (ls_seoclass-clsname)=>xstring_to_solix - EXPORTING - iv_xstring = l_file - RECEIVING - et_solix = lt_file. - - l_bytecount = XSTRLEN( l_file ). - ELSE. - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = l_file - IMPORTING - output_length = l_bytecount - TABLES - binary_tab = lt_file. - ENDIF. - - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = l_bytecount - filename = l_path - filetype = 'BIN' - CHANGING data_tab = lt_file ). - -ENDFORM. " WRITE_FILE - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel33. - -TYPE-POOLS: abap. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_converter TYPE REF TO zcl_excel_converter, - lo_autofilter TYPE REF TO zcl_excel_autofilter. - -DATA lt_test TYPE TABLE OF t005t. - -DATA: l_cell_value TYPE zexcel_cell_value, - ls_area TYPE zexcel_s_autofilter_area. - -CONSTANTS: c_airlines TYPE string VALUE 'Airlines'. - -CONSTANTS: gc_save_file_name TYPE string VALUE '33_autofilter.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Internal table'). - - SELECT * UP TO 2 ROWS FROM t005t INTO TABLE lt_test. "#EC CI_NOWHERE - - CREATE OBJECT lo_converter. - - lo_converter->convert( EXPORTING - it_table = lt_test - i_row_int = 1 - i_column_int = 1 - io_worksheet = lo_worksheet - CHANGING - co_excel = lo_excel ) . - - lo_autofilter = lo_excel->add_new_autofilter( io_sheet = lo_worksheet ) . - - ls_area-row_start = 1. - ls_area-col_start = 1. - ls_area-row_end = lo_worksheet->get_highest_row( ). - ls_area-col_end = lo_worksheet->get_highest_column( ). - - lo_autofilter->set_filter_area( is_area = ls_area ). - - lo_worksheet->get_cell( EXPORTING - ip_column = 'C' - ip_row = 2 - IMPORTING - ep_value = l_cell_value ). - lo_autofilter->set_value( i_column = 3 - i_value = l_cell_value ). - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL2 -*& Test Styles for ABAP2XLSX -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel34. - -CONSTANTS: width TYPE f VALUE '10.14'. -CONSTANTS: height TYPE f VALUE '57.75'. - -DATA: current_row TYPE i, - col TYPE i, - col_alpha TYPE zexcel_cell_column_alpha, - row TYPE i, - row_board TYPE i, - colorflag TYPE i, - color TYPE zexcel_style_color_argb, - - column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, - - writing1 TYPE string, - writing2 TYPE string. - - - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -CONSTANTS: gc_save_file_name TYPE string VALUE '34_Static Styles_Chess.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Spassky_vs_Bronstein' ). - -* Header - current_row = 1. - - ADD 1 TO current_row. - lo_worksheet->set_cell( ip_row = current_row ip_column = 'B' ip_value = 'White' ). - lo_worksheet->set_cell( ip_row = current_row ip_column = 'C' ip_value = 'Spassky, Boris V -- wins in turn 23' ). - - ADD 1 TO current_row. - lo_worksheet->set_cell( ip_row = current_row ip_column = 'B' ip_value = 'Black' ). - lo_worksheet->set_cell( ip_row = current_row ip_column = 'C' ip_value = 'Bronstein, David I' ). - - ADD 1 TO current_row. -* Set size of column + Writing above chessboard - DO 8 TIMES. - - writing1 = zcl_excel_common=>convert_column2alpha( sy-index ). - writing2 = sy-index . - row = current_row + sy-index. - - col = sy-index + 1. - col_alpha = zcl_excel_common=>convert_column2alpha( col ). - -* Set size of column - column_dimension = lo_worksheet->get_column_dimension( col_alpha ). - column_dimension->set_width( width ). - -* Set size of row - row_dimension = lo_worksheet->get_row_dimension( row ). - row_dimension->set_row_height( height ). - -* Set writing on chessboard - lo_worksheet->set_cell( ip_row = row - ip_column = 'A' - ip_value = writing2 ). - lo_worksheet->change_cell_style( ip_column = 'A' - ip_row = row - ip_alignment_vertical = zcl_excel_style_alignment=>c_vertical_center ). - lo_worksheet->set_cell( ip_row = row - ip_column = 'J' - ip_value = writing2 ). - lo_worksheet->change_cell_style( ip_column = 'J' - ip_row = row - ip_alignment_vertical = zcl_excel_style_alignment=>c_vertical_center ). - - row = current_row + 9. - lo_worksheet->set_cell( ip_row = current_row - ip_column = col_alpha - ip_value = writing1 ). - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = current_row - ip_alignment_horizontal = zcl_excel_style_alignment=>c_horizontal_center ). - lo_worksheet->set_cell( ip_row = row - ip_column = col_alpha - ip_value = writing1 ). - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_alignment_horizontal = zcl_excel_style_alignment=>c_horizontal_center ). - ENDDO. - column_dimension = lo_worksheet->get_column_dimension( 'A' ). - column_dimension->set_auto_size( abap_true ). - column_dimension = lo_worksheet->get_column_dimension( 'J' ). - column_dimension->set_auto_size( abap_true ). - -* Set win-position - CONSTANTS: c_pawn TYPE string VALUE 'Pawn'. - CONSTANTS: c_rook TYPE string VALUE 'Rook'. - CONSTANTS: c_knight TYPE string VALUE 'Knight'. - CONSTANTS: c_bishop TYPE string VALUE 'Bishop'. - CONSTANTS: c_queen TYPE string VALUE 'Queen'. - CONSTANTS: c_king TYPE string VALUE 'King'. - - row = current_row + 1. - lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = c_rook ). - lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_rook ). - lo_worksheet->set_cell( ip_row = row ip_column = 'G' ip_value = c_knight ). - row = current_row + 2. - lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'D' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_queen ). - lo_worksheet->set_cell( ip_row = row ip_column = 'H' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'I' ip_value = c_king ). - row = current_row + 3. - lo_worksheet->set_cell( ip_row = row ip_column = 'I' ip_value = c_pawn ). - row = current_row + 4. - lo_worksheet->set_cell( ip_row = row ip_column = 'D' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_knight ). - row = current_row + 5. - lo_worksheet->set_cell( ip_row = row ip_column = 'E' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'F' ip_value = c_queen ). - row = current_row + 6. - lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = c_bishop ). - row = current_row + 7. - lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'H' ip_value = c_pawn ). - lo_worksheet->set_cell( ip_row = row ip_column = 'I' ip_value = c_pawn ). - row = current_row + 8. - lo_worksheet->set_cell( ip_row = row ip_column = 'G' ip_value = c_rook ). - lo_worksheet->set_cell( ip_row = row ip_column = 'H' ip_value = c_king ). - -* Set Chessboard - DO 8 TIMES. - IF sy-index <= 3. " Black - color = zcl_excel_style_color=>c_black. - ELSE. - color = zcl_excel_style_color=>c_white. - ENDIF. - row_board = sy-index. - row = current_row + sy-index. - DO 8 TIMES. - col = sy-index + 1. - col_alpha = zcl_excel_common=>convert_column2alpha( col ). - TRY. -* Borders around outer limits - IF row_board = 1. - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_borders_top_style = zcl_excel_style_border=>c_border_thick - ip_borders_top_color_rgb = zcl_excel_style_color=>c_black ). - ENDIF. - IF row_board = 8. - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_borders_down_style = zcl_excel_style_border=>c_border_thick - ip_borders_down_color_rgb = zcl_excel_style_color=>c_black ). - ENDIF. - IF col = 2. - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_borders_left_style = zcl_excel_style_border=>c_border_thick - ip_borders_left_color_rgb = zcl_excel_style_color=>c_black ). - ENDIF. - IF col = 9. - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_borders_right_style = zcl_excel_style_border=>c_border_thick - ip_borders_right_color_rgb = zcl_excel_style_color=>c_black ). - ENDIF. -* Style for writing - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_font_color_rgb = color - ip_font_bold = 'X' - ip_font_size = 16 - ip_alignment_horizontal = zcl_excel_style_alignment=>c_horizontal_center - ip_alignment_vertical = zcl_excel_style_alignment=>c_vertical_center - ip_fill_filltype = zcl_excel_style_fill=>c_fill_solid ). -* Color of field - colorflag = ( row + col ) MOD 2. - IF colorflag = 0. - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_fill_fgcolor_rgb = 'FFB5866A' ). - ELSE. - lo_worksheet->change_cell_style( ip_column = col_alpha - ip_row = row - ip_fill_fgcolor_rgb = 'FFF5DEBF' ). - ENDIF. - - - - CATCH zcx_excel . - ENDTRY. - - ENDDO. - ENDDO. - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL2 -*& Test Styles for ABAP2XLSX -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel35. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_bold TYPE REF TO zcl_excel_style, - lo_style_underline TYPE REF TO zcl_excel_style, - lo_style_filled TYPE REF TO zcl_excel_style, - lo_style_border TYPE REF TO zcl_excel_style, - lo_style_button TYPE REF TO zcl_excel_style, - lo_border_dark TYPE REF TO zcl_excel_style_border, - lo_border_light TYPE REF TO zcl_excel_style_border. - -DATA: lv_style_bold_guid TYPE zexcel_cell_style, - lv_style_underline_guid TYPE zexcel_cell_style, - lv_style_filled_guid TYPE zexcel_cell_style, - lv_style_filled_green_guid TYPE zexcel_cell_style, - lv_style_border_guid TYPE zexcel_cell_style, - lv_style_button_guid TYPE zexcel_cell_style, - lv_style_filled_turquoise_guid TYPE zexcel_cell_style. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE '35_Static_Styles.xlsx'. - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>GET_DESKTOP_DIRECTORY( CHANGING DESKTOP_DIRECTORY = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - - sy-title = 'ZDEMO_EXCEL2;Issue 139: Change cellstyle retroactivly'. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Create border object - CREATE OBJECT lo_border_dark. - lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. - lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. - CREATE OBJECT lo_border_light. - lo_border_light->border_color-rgb = zcl_excel_style_color=>c_gray. - lo_border_light->border_style = zcl_excel_style_border=>c_border_thin. - " Create a bold / italic style - lo_style_bold = lo_excel->add_new_style( ). - lo_style_bold->font->bold = abap_true. - lo_style_bold->font->italic = abap_true. - lo_style_bold->font->name = zcl_excel_style_font=>c_name_arial. - lo_style_bold->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_bold->font->color-rgb = zcl_excel_style_color=>c_red. - lv_style_bold_guid = lo_style_bold->get_guid( ). - " Create an underline double style - lo_style_underline = lo_excel->add_new_style( ). - lo_style_underline->font->underline = abap_true. - lo_style_underline->font->underline_mode = zcl_excel_style_font=>c_underline_double. - lo_style_underline->font->name = zcl_excel_style_font=>c_name_roman. - lo_style_underline->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_underline->font->family = zcl_excel_style_font=>c_family_roman. - lv_style_underline_guid = lo_style_underline->get_guid( ). - " Create filled style yellow - lo_style_filled = lo_excel->add_new_style( ). - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-theme = zcl_excel_style_color=>c_theme_accent6. - lv_style_filled_guid = lo_style_filled->get_guid( ). - " Create border with button effects - lo_style_button = lo_excel->add_new_style( ). - lo_style_button->borders->right = lo_border_dark. - lo_style_button->borders->down = lo_border_dark. - lo_style_button->borders->left = lo_border_light. - lo_style_button->borders->top = lo_border_light. - lv_style_button_guid = lo_style_button->get_guid( ). - "Create style with border - lo_style_border = lo_excel->add_new_style( ). - lo_style_border->borders->allborders = lo_border_dark. - lo_style_border->borders->diagonal = lo_border_dark. - lo_style_border->borders->diagonal_mode = zcl_excel_style_borders=>c_diagonal_both. - lv_style_border_guid = lo_style_border->get_guid( ). - " Create filled style green - lo_style_filled = lo_excel->add_new_style( ). - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-rgb = zcl_excel_style_color=>c_green. - lo_style_filled->font->name = zcl_excel_style_font=>c_name_cambria. - lo_style_filled->font->scheme = zcl_excel_style_font=>c_scheme_major. - lv_style_filled_green_guid = lo_style_filled->get_guid( ). - - " Create filled style turquoise using legacy excel ver <= 2003 palette. (https://code.sdn.sap.com/spaces/abap2xlsx/tickets/92) - lo_style_filled = lo_excel->add_new_style( ). - lo_excel->legacy_palette->set_color( "replace built-in color from palette with out custom RGB turquoise - ip_index = 16 - ip_color = '0040E0D0' ). - - lo_style_filled->fill->filltype = zcl_excel_style_fill=>c_fill_solid. - lo_style_filled->fill->fgcolor-indexed = 16. - lv_style_filled_turquoise_guid = lo_style_filled->get_guid( ). - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Styles' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). - lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = 'Borders' ip_style = lv_style_border_guid ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 7 ip_value = 'I''m not a button :)' ip_style = lv_style_button_guid ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 9 ip_value = 'Modified color for Excel 2003' ip_style = lv_style_filled_turquoise_guid ). - " Fill the cell and apply one style - lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). - " Change the style - lo_worksheet->set_cell_style( ip_column = 'B' ip_row = 6 ip_style = lv_style_filled_green_guid ). - " Add Style to an empty cell to test Fix for Issue - "#44 Exception ZCX_EXCEL thrown when style is set for an empty cell - " https://code.sdn.sap.com/spaces/abap2xlsx/tickets/44-exception-zcx_excel-thrown-when-style-is-set-for-an-empty-cell - lo_worksheet->set_cell_style( ip_column = 'E' ip_row = 6 ip_style = lv_style_filled_green_guid ). - - -* Demonstrate how to retroactivly change the cellstyle -*Filled text and underlinded text - lo_worksheet->change_cell_style( ip_column = 'B' - ip_row = 5 - ip_font_bold = abap_true - ip_font_italic = abap_true ). - - lo_worksheet->change_cell_style( ip_column = 'D' - ip_row = 4 - ip_font_bold = abap_true - ip_font_italic = abap_true ). - - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = lv_file - IMPORTING - output_length = lv_bytecount - TABLES - binary_tab = lt_file_tab. -* " This method is only available on AS ABAP > 6.40 -* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). -* lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL36 -REPORT zdemo_excel36. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - col TYPE i. - -DATA: lo_style_arial20 TYPE REF TO zcl_excel_style, - lo_style_times11 TYPE REF TO zcl_excel_style, - lo_style_cambria8red TYPE REF TO zcl_excel_style. - -DATA: lv_style_arial20_guid TYPE zexcel_cell_style, - lv_style_times11_guid TYPE zexcel_cell_style, - lv_style_cambria8red_guid TYPE zexcel_cell_style. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '36_DefaultStyles.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Create a bold / italic style - lo_style_arial20 = lo_excel->add_new_style( ). - lo_style_arial20->font->name = zcl_excel_style_font=>c_name_arial. - lo_style_arial20->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_arial20->font->size = 20. - lv_style_arial20_guid = lo_style_arial20->get_guid( ). - - lo_style_times11 = lo_excel->add_new_style( ). - lo_style_times11->font->name = zcl_excel_style_font=>c_name_roman. - lo_style_times11->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_times11->font->size = 11. - lv_style_times11_guid = lo_style_times11->get_guid( ). - - lo_style_cambria8red = lo_excel->add_new_style( ). - lo_style_cambria8red->font->name = zcl_excel_style_font=>c_name_cambria. - lo_style_cambria8red->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_cambria8red->font->size = 8. - lo_style_cambria8red->font->color-rgb = zcl_excel_style_color=>c_red. - lv_style_cambria8red_guid = lo_style_cambria8red->get_guid( ). - - lo_excel->set_default_style( lv_style_arial20_guid ). " Default for all new worksheets - -* 1st sheet - do not change anything --> defaultstyle from lo_excel should apply - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'Style for complete document' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 4 ip_value = 'All cells in this sheet are set to font Arial, fontsize 20' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 5 ip_value = 'because no separate style was passed for this sheet' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 6 ip_value = 'but a default style was set for the complete instance of zcl_excel' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 1 ip_value = space ). " Missing feature "set active cell - use this to simulate that - - -* 2nd sheet - defaultstyle for this sheet set explicitly ( set to Times New Roman 11 ) - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( 'Style for this sheet' ). - lo_worksheet->zif_excel_sheet_properties~set_style( lv_style_times11_guid ). - - lo_worksheet->set_cell( ip_column = 2 ip_row = 4 ip_value = 'All cells in this sheet are set to font Times New Roman, fontsize 11' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 5 ip_value = 'because this style was passed for this sheet' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 6 ip_value = 'thus the default style from zcl_excel does not apply to this sheet' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 1 ip_value = space ). " Missing feature "set active cell - use this to simulate that - - -* 3rd sheet - defaultstyle for columns ( set to Times New Roman 11 ) - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( 'Style for 3 columns' ). - column_dimension = lo_worksheet->get_column_dimension( 'B' ). - column_dimension->set_column_style_by_guid( ip_style_guid = lv_style_times11_guid ). - column_dimension = lo_worksheet->get_column_dimension( 'C' ). - column_dimension->set_column_style_by_guid( ip_style_guid = lv_style_times11_guid ). - column_dimension = lo_worksheet->get_column_dimension( 'F' ). - column_dimension->set_column_style_by_guid( ip_style_guid = lv_style_times11_guid ). - - lo_worksheet->set_cell( ip_column = 2 ip_row = 4 ip_value = 'The columns B,C and F are set to Times New Roman' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 10 ip_value = 'All other cells in this sheet are set to font Arial, fontsize 20' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 11 ip_value = 'because no separate style was passed for this sheet' ). - lo_worksheet->set_cell( ip_column = 2 ip_row = 12 ip_value = 'but a default style was set for the complete instance of zcl_excel' ). - - lo_worksheet->set_cell( ip_column = 8 ip_row = 1 ip_value = 'Of course' ip_style = lv_style_cambria8red_guid ). - lo_worksheet->set_cell( ip_column = 8 ip_row = 2 ip_value = 'setting a specific style to a cell' ip_style = lv_style_cambria8red_guid ). - lo_worksheet->set_cell( ip_column = 8 ip_row = 3 ip_value = 'takes precedence over all defaults' ip_style = lv_style_cambria8red_guid ). - lo_worksheet->set_cell( ip_column = 8 ip_row = 4 ip_value = 'Here: Cambria 8 in red' ip_style = lv_style_cambria8red_guid ). - - -* Set entry into each of the first 10 columns - DO 20 TIMES. - col = sy-index. - CASE col. - WHEN 2 " B - OR 3 " C - OR 6." F - lo_worksheet->set_cell( ip_column = col ip_row = 6 ip_value = 'Times 11' ). - WHEN OTHERS. - lo_worksheet->set_cell( ip_column = col ip_row = 6 ip_value = 'Arial 20' ). - ENDCASE. - ENDDO. - - lo_worksheet->set_cell( ip_column = 2 ip_row = 1 ip_value = space ). " Missing feature "set active cell - use this to simulate that - - - - lo_excel->set_active_sheet_index( 1 ). - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED3 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched3. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_reader TYPE REF TO zif_excel_reader, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -DATA: lt_files TYPE filetable, - ls_file TYPE file_table, - lv_rc TYPE i, - lv_value TYPE zexcel_cell_value. - -CONSTANTS: gc_save_file_name TYPE string VALUE 'TechEd01.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -START-OF-SELECTION. - -******************************* -* abap2xlsx read XLSX * -******************************* - CREATE OBJECT lo_excel_reader TYPE zcl_excel_reader_2007. - lo_excel = lo_excel_reader->load_file( lv_full_path ). - - lo_excel->set_active_sheet_index( 1 ). - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_worksheet->get_cell( EXPORTING ip_column = 'C' - ip_row = 10 - IMPORTING ep_value = lv_value ). - - WRITE: 'abap2xlsx total score is ', lv_value. - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_TECHED1 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_teched1. - -******************************* -* Data Object declaration * -******************************* - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_excel_writer TYPE REF TO zif_excel_writer, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lv_file TYPE xstring, - lv_bytecount TYPE i, - lt_file_tab TYPE solix_tab. - -DATA: lv_full_path TYPE string, - lv_workdir TYPE string, - lv_file_separator TYPE c. - -CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - -******************************* -* Selection screen management * -******************************* - -PARAMETERS: p_path TYPE zexcel_export_dir. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -START-OF-SELECTION. - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. - - -******************************* -* abap2xlsx create XLSX * -******************************* - - " Create excel instance - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo01' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). - - " Create xlsx stream - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - -******************************* -* Output * -******************************* - - " Convert to binary - lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). - lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab ). - - - - - - - - *&---------------------------------------------------------------------* -*& Include ZDEMO_EXCEL_OUTPUTOPT_INCL -*&---------------------------------------------------------------------* -CLASS lcl_output DEFINITION CREATE PRIVATE. - PUBLIC SECTION. - CLASS-METHODS: output IMPORTING cl_excel TYPE REF TO zcl_excel, - f4_path RETURNING value(selected_folder) TYPE string, - parametertexts. - - PRIVATE SECTION. - METHODS: download_frontend, - download_backend, - display_online, - send_email. - - DATA: xdata TYPE xstring, " Will be used for sending as email - t_rawdata TYPE solix_tab, " Will be used for downloading or open directly - bytecount TYPE i. " Will be used for downloading or open directly -ENDCLASS. "lcl_output DEFINITION - - -SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE txt_bl1. -PARAMETERS: rb_down RADIOBUTTON GROUP rb1 DEFAULT 'X' USER-COMMAND space. - -PARAMETERS: rb_back RADIOBUTTON GROUP rb1. - -PARAMETERS: rb_show RADIOBUTTON GROUP rb1. - -PARAMETERS: rb_send RADIOBUTTON GROUP rb1. - -PARAMETERS: p_path TYPE string LOWER CASE MODIF ID pat. -PARAMETERS: p_email TYPE string LOWER CASE MODIF ID ema. -PARAMETERS: p_backfn TYPE text40 NO-DISPLAY. -SELECTION-SCREEN END OF BLOCK bl1. - - -AT SELECTION-SCREEN OUTPUT. - LOOP AT SCREEN. - - IF rb_down IS INITIAL AND screen-group1 = 'PAT'. - screen-input = 0. - screen-invisible = 1. - ENDIF. - - IF rb_send IS INITIAL AND screen-group1 = 'EMA'. - screen-input = 0. - screen-invisible = 1. - ENDIF. - - MODIFY SCREEN. - - ENDLOOP. - -INITIALIZATION. - IF sy-batch IS INITIAL. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = p_path ). - cl_gui_cfw=>flush( ). - ENDIF. - lcl_output=>parametertexts( ). " If started in language w/o textelements translated set defaults - sy-title = gc_save_file_name. - txt_bl1 = 'Output options'(bl1). - p_backfn = gc_save_file_name. " Use as default if nothing else is supplied by submit - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - p_path = lcl_output=>f4_path( ). - - -*----------------------------------------------------------------------* -* CLASS lcl_output IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_output IMPLEMENTATION. - METHOD output. - - DATA: cl_output TYPE REF TO lcl_output, - cl_writer TYPE REF TO zif_excel_writer. - - CREATE OBJECT cl_output. - CREATE OBJECT cl_writer TYPE zcl_excel_writer_2007. - cl_output->xdata = cl_writer->write_file( cl_excel ). - -* After 6.40 via cl_bcs_convert - cl_output->t_rawdata = cl_bcs_convert=>xstring_to_solix( iv_xstring = cl_output->xdata ). - cl_output->bytecount = xstrlen( cl_output->xdata ). - -* before 6.40 -* CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' -* EXPORTING -* buffer = cl_output->xdata -* IMPORTING -* output_length = cl_output->bytecount -* TABLES -* binary_tab = cl_output->t_rawdata. - - CASE 'X'. - WHEN rb_down. - IF sy-batch IS INITIAL. - cl_output->download_frontend( ). - ELSE. - MESSAGE e001(00) WITH 'Frontenddownload impossible in background processing'. - ENDIF. - - WHEN rb_back. - cl_output->download_backend( ). - - WHEN rb_show. - IF sy-batch IS INITIAL. - cl_output->display_online( ). - ELSE. - MESSAGE e001(00) WITH 'Online display absurd in background processing'. - ENDIF. - - WHEN rb_send. - cl_output->send_email( ). - - ENDCASE. - ENDMETHOD. "output - - METHOD f4_path. - DATA: new_path TYPE string, - repid TYPE syrepid, - dynnr TYPE sydynnr, - lt_dynpfields TYPE TABLE OF dynpread, - ls_dynpfields LIKE LINE OF lt_dynpfields. - -* Get current value - dynnr = sy-dynnr. - repid = sy-repid. - ls_dynpfields-fieldname = 'P_PATH'. - APPEND ls_dynpfields TO lt_dynpfields. - - CALL FUNCTION 'DYNP_VALUES_READ' - EXPORTING - dyname = repid - dynumb = dynnr - TABLES - dynpfields = lt_dynpfields - EXCEPTIONS - invalid_abapworkarea = 1 - invalid_dynprofield = 2 - invalid_dynproname = 3 - invalid_dynpronummer = 4 - invalid_request = 5 - no_fielddescription = 6 - invalid_parameter = 7 - undefind_error = 8 - double_conversion = 9 - stepl_not_found = 10 - OTHERS = 11. - IF sy-subrc <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - EXIT. - ENDIF. - - READ TABLE lt_dynpfields INTO ls_dynpfields INDEX 1. - - new_path = ls_dynpfields-fieldvalue. - selected_folder = new_path. - - cl_gui_frontend_services=>directory_browse( - EXPORTING - window_title = 'Select path to download EXCEL-file' - initial_folder = new_path - CHANGING - selected_folder = new_path - EXCEPTIONS - cntl_error = 1 - error_no_gui = 2 - not_supported_by_gui = 3 - OTHERS = 4 - ). - cl_gui_cfw=>flush( ). - CHECK new_path IS NOT INITIAL. - selected_folder = new_path. - - ENDMETHOD. "f4_path - - METHOD parametertexts. -* If started in language w/o textelements translated set defaults -* Furthermore I don't have to change the selectiontexts of all demoreports. - DEFINE default_parametertext. - if %_&1_%_app_%-text = '&1' or - %_&1_%_app_%-text is initial. - %_&1_%_app_%-text = &2. - endif. - END-OF-DEFINITION. - - default_parametertext: rb_down 'Save to frontend', - rb_back 'Save to backend', - rb_show 'Direct display', - rb_send 'Send via email', - - p_path 'Frontend-path to download to', - p_email 'Email to send xlsx to'. - - ENDMETHOD. "parametertexts - - METHOD: download_frontend. - DATA: filename TYPE string. -* I don't like p_path here - but for this include it's ok - filename = p_path. -* Add trailing "\" or "/" - IF filename CA '/'. - REPLACE REGEX '([^/])\s*$' IN filename WITH '$1/' . - ELSE. - REPLACE REGEX '([^\\])\s*$' IN filename WITH '$1\\'. - ENDIF. - - CONCATENATE filename gc_save_file_name INTO filename. -* Get trailing blank - cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = bytecount - filename = filename - filetype = 'BIN' - CHANGING data_tab = t_rawdata ). - ENDMETHOD. "download_frontend - - METHOD download_backend. - DATA: bytes_remain TYPE i. - FIELD-SYMBOLS: <rawdata> LIKE LINE OF t_rawdata. - - OPEN DATASET p_backfn FOR OUTPUT IN BINARY MODE. - CHECK sy-subrc = 0. - - bytes_remain = bytecount. - - LOOP AT t_rawdata ASSIGNING <rawdata>. - - AT LAST. - CHECK bytes_remain >= 0. - TRANSFER <rawdata> TO p_backfn LENGTH bytes_remain. - EXIT. - ENDAT. - - TRANSFER <rawdata> TO p_backfn. - SUBTRACT 255 FROM bytes_remain. " Solix hat Länge 255 - - ENDLOOP. - - CLOSE DATASET p_backfn. - - - - - IF sy-calld = 'X'. " no need to display anything if download was selected and report was called for demo purposes - LEAVE PROGRAM. - ELSE. - MESSAGE 'Data transferred to default backend directory' TYPE 'I'. - ENDIF. - ENDMETHOD. "download_backend - - METHOD display_online. - DATA:error TYPE REF TO i_oi_error, - t_errors TYPE STANDARD TABLE OF REF TO i_oi_error WITH NON-UNIQUE DEFAULT KEY, - cl_control TYPE REF TO i_oi_container_control,"OIContainerCtrl - cl_document TYPE REF TO i_oi_document_proxy. "Office Dokument - - c_oi_container_control_creator=>get_container_control( IMPORTING control = cl_control - error = error ). - APPEND error TO t_errors. - - cl_control->init_control( EXPORTING inplace_enabled = 'X' - no_flush = 'X' - r3_application_name = 'Demo Document Container' - parent = cl_gui_container=>screen0 - IMPORTING error = error - EXCEPTIONS OTHERS = 2 ). - APPEND error TO t_errors. - - cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL - no_flush = ' ' - IMPORTING document_proxy = cl_document - error = error ). - APPEND error TO t_errors. -* Errorhandling should be inserted here - - cl_document->open_document_from_table( EXPORTING document_size = bytecount - document_table = t_rawdata - open_inplace = 'X' ). - - WRITE: '.'. " To create an output. That way screen0 will exist - ENDMETHOD. "display_online - - METHOD send_email. -* Needed to send emails - DATA: bcs_exception TYPE REF TO cx_bcs, - errortext TYPE string, - cl_send_request TYPE REF TO cl_bcs, - cl_document TYPE REF TO cl_document_bcs, - cl_recipient TYPE REF TO if_recipient_bcs, - cl_sender TYPE REF TO cl_cam_address_bcs, - t_attachment_header TYPE soli_tab, - wa_attachment_header LIKE LINE OF t_attachment_header, - attachment_subject TYPE sood-objdes, - - sood_bytecount TYPE sood-objlen, - mail_title TYPE so_obj_des, - t_mailtext TYPE soli_tab, - wa_mailtext LIKE LINE OF t_mailtext, - send_to TYPE adr6-smtp_addr, - sent TYPE os_boolean. - - - mail_title = 'Mail title'. - wa_mailtext = 'Mailtext'. - APPEND wa_mailtext TO t_mailtext. - - TRY. -* Create send request - cl_send_request = cl_bcs=>create_persistent( ). -* Create new document with mailtitle and mailtextg - cl_document = cl_document_bcs=>create_document( i_type = 'RAW' "#EC NOTEXT - i_text = t_mailtext - i_subject = mail_title ). -* Add attachment to document -* since the new excelfiles have an 4-character extension .xlsx but the attachment-type only holds 3 charactes .xls, -* we have to specify the real filename via attachment header -* Use attachment_type xls to have SAP display attachment with the excel-icon - attachment_subject = gc_save_file_name. - CONCATENATE '&SO_FILENAME=' attachment_subject INTO wa_attachment_header. - APPEND wa_attachment_header TO t_attachment_header. -* Attachment - sood_bytecount = bytecount. " next method expects sood_bytecount instead of any positive integer *sigh* - cl_document->add_attachment( i_attachment_type = 'XLS' "#EC NOTEXT - i_attachment_subject = attachment_subject - i_attachment_size = sood_bytecount - i_att_content_hex = t_rawdata - i_attachment_header = t_attachment_header ). - -* add document to send request - cl_send_request->set_document( cl_document ). - -* set sender in case if no own email is availabe -* cl_sender = cl_cam_address_bcs=>create_internet_address( 'sender@sender.sender' ). -* cl_send_request->set_sender( cl_sender ). - -* add recipient(s) - here only 1 will be needed - send_to = p_email. - IF send_to IS INITIAL. - send_to = 'no_email@no_email.no_email'. " Place into SOST in any case for demonstration purposes - ENDIF. - cl_recipient = cl_cam_address_bcs=>create_internet_address( send_to ). - cl_send_request->add_recipient( cl_recipient ). - -* Und abschicken - sent = cl_send_request->send( i_with_error_screen = 'X' ). - - COMMIT WORK. - - IF sent IS INITIAL. - MESSAGE i500(sbcoms) WITH p_email. - ELSE. - MESSAGE s022(so). - MESSAGE 'Document ready to be sent - Check SOST or SCOT' TYPE 'I'. - ENDIF. - - CATCH cx_bcs INTO bcs_exception. - errortext = bcs_exception->if_message~get_text( ). - MESSAGE errortext TYPE 'I'. - - ENDTRY. - ENDMETHOD. "send_email - - -ENDCLASS. "lcl_output IMPLEMENTATION - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL9 -*& -*&---------------------------------------------------------------------* -*& abap2xlsx Demo: Data validations -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel9. - -CONSTANTS: c_fruits TYPE string VALUE 'Fruits', - c_vegetables TYPE string VALUE 'Vegetables', - c_meat TYPE string VALUE 'Meat', - c_fish TYPE string VALUE 'Fish'. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_range TYPE REF TO zcl_excel_range, - lo_data_validation TYPE REF TO zcl_excel_data_validation. - -DATA: row TYPE zexcel_cell_row. - - -DATA: lv_title TYPE zexcel_sheet_title. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '09_DataValidation.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -PARAMETERS: p_sbook TYPE flag. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lv_title = 'Data Validation'. - lo_worksheet->set_title( lv_title ). - " Set values for dropdown - lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = c_fish ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Anchovy' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = 'Carp' ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'A' ip_value = 'Catfish' ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 'Cod' ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 'Eel' ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'A' ip_value = 'Haddock' ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = c_fish. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'A' - ip_start_row = 4 - ip_stop_column = 'A' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 2 ip_column = 'B' ip_value = c_meat ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'Pork' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 'Beef' ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Chicken' ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 'Turkey' ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = c_meat. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'B' - ip_start_row = 4 - ip_stop_column = 'B' - ip_stop_row = 7 ). - - lo_worksheet->set_cell( ip_row = 2 ip_column = 'C' ip_value = c_fruits ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = c_fruits. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'C' - ip_start_row = 4 - ip_stop_column = 'C' - ip_stop_row = 8 ). - - lo_worksheet->set_cell( ip_row = 2 ip_column = 'D' ip_value = c_vegetables ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Cucumber' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Sweet pepper ' ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 'Lettuce' ). - - lo_range = lo_excel->add_new_range( ). - lo_range->name = c_vegetables. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'D' - ip_start_row = 4 - ip_stop_column = 'D' - ip_stop_row = 6 ). - - lo_worksheet = lo_excel->add_new_worksheet( ). - lv_title = 'Table with Data Validation'. - lo_worksheet->set_title( lv_title ). - - " Maximum Text length - lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = 'Validate Maximum Text length of <= 10 in Cell A2:' ). - lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = 'abcdefghij' ). - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_textlength. - lo_data_validation->operator = zcl_excel_data_validation=>c_operator_lessthanorequal. - lo_data_validation->formula1 = 10. - lo_data_validation->cell_row = 2. - lo_data_validation->cell_column = 'A'. - - " Integer Value between 1 and 10 - lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Validate Integer Value between 1 and 10 in Cell A5:' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'A' ip_value = '5' ). - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_whole. - lo_data_validation->operator = zcl_excel_data_validation=>c_operator_between. - lo_data_validation->formula1 = 1. - lo_data_validation->formula2 = 10. - lo_data_validation->prompttitle = 'Range'. - lo_data_validation->prompt = 'Enter a value between 1 and 10'. - lo_data_validation->errortitle = 'Error'. - lo_data_validation->error = 'You have entered a wrong value. Please use only numbers between 1 and 10.'. - lo_data_validation->cell_row = 5. - lo_data_validation->cell_column = 'A'. - - " Evaluation by Formula from issue #161 - lo_worksheet->set_cell( ip_row = 7 ip_column = 'A' ip_value = 'Validate if B8 contains a "-":' ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'A' ip_value = 'Text' ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = '-' ). - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_custom. - lo_data_validation->formula1 = '"IF(B8<>"""";INDIRECT(LEFT(B8;SEARCH(""-"";B8;1)));EMPTY)"'. - lo_data_validation->cell_row = 8. - lo_data_validation->cell_column = 'A'. - - " There was an error when data validation was combined with cell merges this should test that: - lo_worksheet->set_cell( ip_row = 10 ip_column = 'A' ip_value = 'Demo for data validation with a dropdown list' ). - lo_worksheet->set_merge( ip_row = 10 ip_column_start = 'A' ip_column_end = 'F' ). - - " Headlines - lo_worksheet->set_cell( ip_row = 11 ip_column = 'A' ip_value = c_fruits ). - lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = c_vegetables ). - - row = 12. - WHILE row < 20. " Starting with 14500 the data validation is dropped 14000 are still ok - " 1st validation - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = c_fruits. - lo_data_validation->cell_row = row. - lo_data_validation->cell_column = 'A'. - lo_worksheet->set_cell( ip_row = row ip_column = 'A' ip_value = 'Select a value' ). - " 2nd - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = c_vegetables. - lo_data_validation->cell_row = row. - lo_data_validation->cell_column = 'B'. - lo_worksheet->set_cell( ip_row = row ip_column = 'B' ip_value = 'Select a value' ). - " 3rd - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = c_meat. - lo_data_validation->cell_row = row. - lo_data_validation->cell_column = 'C'. - lo_worksheet->set_cell( ip_row = row ip_column = 'C' ip_value = 'Select a value' ). - " 4th - lo_data_validation = lo_worksheet->add_new_data_validation( ). - lo_data_validation->type = zcl_excel_data_validation=>c_type_list. - lo_data_validation->formula1 = c_fish. - lo_data_validation->cell_row = row. - lo_data_validation->cell_column = 'D'. - lo_worksheet->set_cell( ip_row = row ip_column = 'D' ip_value = 'Select a value' ). - " Increment row - row = row + 1. - ENDWHILE. - - IF p_sbook = abap_true. - DATA: bookings type TABLE OF sbook. - - lo_worksheet = lo_excel->add_new_worksheet( ). - lv_title = 'SBOOK'. - lo_worksheet->set_title( lv_title ). - - SELECT * from sbook INTO TABLE bookings UP TO 4000 ROWS. - - lo_worksheet->bind_table( - EXPORTING - ip_table = bookings -* it_field_catalog = " Table binding field catalog -* is_table_settings = " Excel table binding settings -* IMPORTING -* es_table_settings = " Excel table binding settings - ). - ENDIF. - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL8 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel8. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_range TYPE REF TO zcl_excel_range. - -DATA: lv_title TYPE zexcel_sheet_title. - -CONSTANTS: gc_save_file_name TYPE string VALUE '08_Range.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lv_title = 'Sheet1'. - lo_worksheet->set_title( lv_title ). - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'range'. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'C' - ip_start_row = 4 - ip_stop_column = 'C' - ip_stop_row = 8 ). - - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'Apple' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 'Banana' ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 'Blueberry' ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 'Ananas' ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 'Grapes' ). - - " Define another Range with a name longer than 40 characters that - " tests the fix of issue #168 ranges namescan be only up to 20 chars - - lo_range = lo_excel->add_new_range( ). - lo_range->name = 'A_range_with_a_name_that_is_longer_than_20_characters'. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'D' - ip_start_row = 4 - ip_stop_column = 'D' - ip_stop_row = 5 ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'Range Value 1' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 'Range Value 2' ). - - " issue #163 - " Define another Range with sheet visibility - lo_range = lo_worksheet->add_new_range( ). - lo_range->name = 'A_range_with_sheet_visibility'. - lo_range->set_value( ip_sheet_name = lv_title - ip_start_column = 'E' - ip_start_row = 4 - ip_stop_column = 'E' - ip_stop_row = 5 ). - lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'Range Value 3' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 'Range Value 4' ). - " issue #163 - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL7 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel7. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_conditional TYPE REF TO zcl_excel_style_conditional. - -DATA: ls_iconset3 TYPE zexcel_conditional_iconset, - ls_iconset4 TYPE zexcel_conditional_iconset, - ls_iconset5 TYPE zexcel_conditional_iconset, - ls_databar TYPE zexcel_conditional_databar, - ls_colorscale2 TYPE zexcel_conditional_colorscale, - ls_colorscale3 TYPE zexcel_conditional_colorscale. - -CONSTANTS: gc_save_file_name TYPE string VALUE '07_ConditionalAll.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - ls_iconset3-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset3-cfvo1_value = '0'. - ls_iconset3-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset3-cfvo2_value = '33'. - ls_iconset3-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset3-cfvo3_value = '66'. - ls_iconset3-showvalue = zcl_excel_style_conditional=>c_showvalue_true. - - ls_iconset4-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset4-cfvo1_value = '0'. - ls_iconset4-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset4-cfvo2_value = '25'. - ls_iconset4-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset4-cfvo3_value = '50'. - ls_iconset4-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset4-cfvo4_value = '75'. - ls_iconset4-showvalue = zcl_excel_style_conditional=>c_showvalue_true. - - ls_iconset5-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset5-cfvo1_value = '0'. - ls_iconset5-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset5-cfvo2_value = '20'. - ls_iconset5-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset5-cfvo3_value = '40'. - ls_iconset5-cfvo4_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset5-cfvo4_value = '60'. - ls_iconset5-cfvo5_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset5-cfvo5_value = '80'. - ls_iconset5-showvalue = zcl_excel_style_conditional=>c_showvalue_true. - - ls_databar-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. - ls_databar-cfvo1_value = '0'. - ls_databar-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_max. - ls_databar-cfvo2_value = '0'. - ls_databar-colorrgb = 'FF638EC6'. - - ls_colorscale2-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. - ls_colorscale2-cfvo1_value = '0'. - ls_colorscale2-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percentile. - ls_colorscale2-cfvo2_value = '50'. - ls_colorscale2-colorrgb1 = 'FFF8696B'. - ls_colorscale2-colorrgb2 = 'FF63BE7B'. - - ls_colorscale3-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. - ls_colorscale3-cfvo1_value = '0'. - ls_colorscale3-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percentile. - ls_colorscale3-cfvo2_value = '50'. - ls_colorscale3-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_max. - ls_colorscale3-cfvo3_value = '0'. - ls_colorscale3-colorrgb1 = 'FFF8696B'. - ls_colorscale3-colorrgb2 = 'FFFFEB84'. - ls_colorscale3-colorrgb3 = 'FF63BE7B'. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - -* ICONSET - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3arrows. - - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'B' - ip_start_row = 5 - ip_stop_column = 'B' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'B' ip_value = 'C_ICONSET_3ARROWS' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'B' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'B' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'B' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3arrowsgray. - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 5 - ip_stop_column = 'C' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 'C_ICONSET_3ARROWSGRAY' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = 50 ). - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3flags. - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'D' - ip_start_row = 5 - ip_stop_column = 'D' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 'C_ICONSET_3FLAGS' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'D' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights. - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'E' - ip_start_row = 5 - ip_stop_column = 'E' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 'C_ICONSET_3TRAFFICLIGHTS' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'E' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'F' - ip_start_row = 5 - ip_stop_column = 'F' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'F' ip_value = 'C_ICONSET_3TRAFFICLIGHTS2' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'F' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'F' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'F' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'F' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'F' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3signs. - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'G' - ip_start_row = 5 - ip_stop_column = 'G' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'G' ip_value = 'C_ICONSET_3SIGNS' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'G' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'G' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'G' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'G' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'G' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3symbols. - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'H' - ip_start_row = 5 - ip_stop_column = 'H' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'H' ip_value = 'C_ICONSET_3SYMBOLS' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'H' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'H' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'H' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'H' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'H' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset3-iconset = zcl_excel_style_conditional=>c_iconset_3symbols2. - lo_style_conditional->mode_iconset = ls_iconset3. - lo_style_conditional->set_range( ip_start_column = 'I' - ip_start_row = 5 - ip_stop_column = 'I' - ip_stop_row = 9 ). - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'I' ip_value = 'C_ICONSET_3SYMBOLS2' ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'I' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'I' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'I' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'I' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 9 ip_column = 'I' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4arrows. - lo_style_conditional->mode_iconset = ls_iconset4. - lo_style_conditional->set_range( ip_start_column = 'B' - ip_start_row = 12 - ip_stop_column = 'B' - ip_stop_row = 16 ). - - lo_worksheet->set_cell( ip_row = 11 ip_column = 'B' ip_value = 'C_ICONSET_4ARROWS' ). - lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'B' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 14 ip_column = 'B' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 15 ip_column = 'B' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 16 ip_column = 'B' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4arrowsgray. - lo_style_conditional->mode_iconset = ls_iconset4. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 12 - ip_stop_column = 'C' - ip_stop_row = 16 ). - - lo_worksheet->set_cell( ip_row = 11 ip_column = 'C' ip_value = 'C_ICONSET_4ARROWSGRAY' ). - lo_worksheet->set_cell( ip_row = 12 ip_column = 'C' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'C' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 14 ip_column = 'C' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 15 ip_column = 'C' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 16 ip_column = 'C' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4redtoblack. - lo_style_conditional->mode_iconset = ls_iconset4. - lo_style_conditional->set_range( ip_start_column = 'D' - ip_start_row = 12 - ip_stop_column = 'D' - ip_stop_row = 16 ). - - lo_worksheet->set_cell( ip_row = 11 ip_column = 'D' ip_value = 'C_ICONSET_4REDTOBLACK' ). - lo_worksheet->set_cell( ip_row = 12 ip_column = 'D' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'D' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 14 ip_column = 'D' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 15 ip_column = 'D' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 16 ip_column = 'D' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4rating. - lo_style_conditional->mode_iconset = ls_iconset4. - lo_style_conditional->set_range( ip_start_column = 'E' - ip_start_row = 12 - ip_stop_column = 'E' - ip_stop_row = 16 ). - - lo_worksheet->set_cell( ip_row = 11 ip_column = 'E' ip_value = 'C_ICONSET_4RATING' ). - lo_worksheet->set_cell( ip_row = 12 ip_column = 'E' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'E' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 14 ip_column = 'E' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 15 ip_column = 'E' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 16 ip_column = 'E' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset4-iconset = zcl_excel_style_conditional=>c_iconset_4trafficlights. - lo_style_conditional->mode_iconset = ls_iconset4. - lo_style_conditional->set_range( ip_start_column = 'F' - ip_start_row = 12 - ip_stop_column = 'F' - ip_stop_row = 16 ). - - lo_worksheet->set_cell( ip_row = 11 ip_column = 'F' ip_value = 'C_ICONSET_4TRAFFICLIGHTS' ). - lo_worksheet->set_cell( ip_row = 12 ip_column = 'F' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 13 ip_column = 'F' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 14 ip_column = 'F' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 15 ip_column = 'F' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 16 ip_column = 'F' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5arrows. - lo_style_conditional->mode_iconset = ls_iconset5. - lo_style_conditional->set_range( ip_start_column = 'B' - ip_start_row = 19 - ip_stop_column = 'B' - ip_stop_row = 23 ). - - lo_worksheet->set_cell( ip_row = 18 ip_column = 'B' ip_value = 'C_ICONSET_5ARROWS' ). - lo_worksheet->set_cell( ip_row = 19 ip_column = 'B' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 20 ip_column = 'B' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 21 ip_column = 'B' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 22 ip_column = 'B' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 23 ip_column = 'B' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5arrowsgray. - lo_style_conditional->mode_iconset = ls_iconset5. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 19 - ip_stop_column = 'C' - ip_stop_row = 23 ). - - lo_worksheet->set_cell( ip_row = 18 ip_column = 'C' ip_value = 'C_ICONSET_5ARROWSGRAY' ). - lo_worksheet->set_cell( ip_row = 19 ip_column = 'C' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 20 ip_column = 'C' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 21 ip_column = 'C' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 22 ip_column = 'C' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 23 ip_column = 'C' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5rating. - lo_style_conditional->mode_iconset = ls_iconset5. - lo_style_conditional->set_range( ip_start_column = 'D' - ip_start_row = 19 - ip_stop_column = 'D' - ip_stop_row = 23 ). - - lo_worksheet->set_cell( ip_row = 18 ip_column = 'D' ip_value = 'C_ICONSET_5RATING' ). - lo_worksheet->set_cell( ip_row = 19 ip_column = 'D' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 20 ip_column = 'D' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 21 ip_column = 'D' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 22 ip_column = 'D' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 23 ip_column = 'D' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset5-iconset = zcl_excel_style_conditional=>c_iconset_5quarters. - lo_style_conditional->mode_iconset = ls_iconset5. - lo_style_conditional->set_range( ip_start_column = 'E' - ip_start_row = 19 - ip_stop_column = 'E' - ip_stop_row = 23 ). - -* DATABAR - - lo_worksheet->set_cell( ip_row = 25 ip_column = 'B' ip_value = 'DATABAR' ). - lo_worksheet->set_cell( ip_row = 26 ip_column = 'B' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 27 ip_column = 'B' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 28 ip_column = 'B' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 29 ip_column = 'B' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 30 ip_column = 'B' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_databar. - lo_style_conditional->priority = 1. - lo_style_conditional->mode_databar = ls_databar. - lo_style_conditional->set_range( ip_start_column = 'B' - ip_start_row = 26 - ip_stop_column = 'B' - ip_stop_row = 30 ). - -* COLORSCALE - - lo_worksheet->set_cell( ip_row = 25 ip_column = 'C' ip_value = 'COLORSCALE 2 COLORS' ). - lo_worksheet->set_cell( ip_row = 26 ip_column = 'C' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 27 ip_column = 'C' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 28 ip_column = 'C' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 29 ip_column = 'C' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 30 ip_column = 'C' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_colorscale. - lo_style_conditional->priority = 1. - lo_style_conditional->mode_colorscale = ls_colorscale2. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 26 - ip_stop_column = 'C' - ip_stop_row = 30 ). - - - lo_worksheet->set_cell( ip_row = 25 ip_column = 'D' ip_value = 'COLORSCALE 3 COLORS' ). - lo_worksheet->set_cell( ip_row = 26 ip_column = 'D' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 27 ip_column = 'D' ip_value = 20 ). - lo_worksheet->set_cell( ip_row = 28 ip_column = 'D' ip_value = 30 ). - lo_worksheet->set_cell( ip_row = 29 ip_column = 'D' ip_value = 40 ). - lo_worksheet->set_cell( ip_row = 30 ip_column = 'D' ip_value = 50 ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_colorscale. - lo_style_conditional->priority = 1. - lo_style_conditional->mode_colorscale = ls_colorscale3. - lo_style_conditional->set_range( ip_start_column = 'D' - ip_start_row = 26 - ip_stop_column = 'D' - ip_stop_row = 30 ). - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL6 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel6. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lv_row TYPE syindex, - lv_formula TYPE string. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '06_Formulas.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - -*--------------------------------------------------------------------* -* Get some testdata -*--------------------------------------------------------------------* - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = -10 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). - - -*--------------------------------------------------------------------* -* Demonstrate using formulas -*--------------------------------------------------------------------* - lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_formula = 'SUM(C4:C8)' ). - - -*--------------------------------------------------------------------* -* Demonstrate standard EXCEL-behaviour when copying a formula to another cell -* by calculating the resulting formula to put into another cell -*--------------------------------------------------------------------* - DO 10 TIMES. - - lv_formula = zcl_excel_common=>shift_formula( iv_reference_formula = 'SUM(C4:C8)' - iv_shift_cols = 0 " Offset in Columns - here we copy in same column --> 0 - iv_shift_rows = sy-index ). " Offset in Row - here we copy downward --> sy-index - lv_row = 9 + sy-index. " Absolute row = sy-index rows below reference cell - lo_worksheet->set_cell( ip_row = lv_row ip_column = 'C' ip_formula = lv_formula ). - - ENDDO. - -*--------------------------------------------------------------------* -*** Create output -*--------------------------------------------------------------------* - lcl_output=>output( lo_excel ). - - - - - - - - - - - - - REPORT zdemo_excel37. - -DATA: excel TYPE REF TO zcl_excel, - reader TYPE REF TO zif_excel_reader, - go_error TYPE REF TO cx_root, - gv_message type string. - - -CONSTANTS: gc_save_file_name TYPE string VALUE '37-passthrough.xlsx'. - -SELECTION-SCREEN BEGIN OF BLOCK blx WITH FRAME. -PARAMETERS: p_upfile TYPE string DEFAULT 'c:\temp\whatever.xlsx' LOWER CASE. -SELECTION-SCREEN END OF BLOCK blx. - -INCLUDE zdemo_excel_outputopt_incl. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_upfile. - PERFORM f4_p_upfile CHANGING p_upfile. - - -START-OF-SELECTION. - - TRY. - CREATE OBJECT reader TYPE zcl_excel_reader_2007. -* CREATE OBJECT reader TYPE zcl_excel_reader_xlsm. - excel = reader->load_file( p_upfile ). - - "Use template for charts - excel->use_template = abap_true. -*--------------------------------------------------------------------* -* CL_ABAP_ZIP may have problems reading LibreOffice generated files -* You may have to use alternate ZIP-Class - see comments in issue #234 in abap2xlsx at developers network -* excel = reader->load_file( i_filename = p_upfile -* iv_use_alternate_zip = 'ZCL_EXCEL_ABAP_ZIP' ). -*--------------------------------------------------------------------* - -*** Create output - lcl_output=>output( excel ). - CATCH cx_root INTO go_error. - MESSAGE 'Error reading excelfile' TYPE 'I'. - gv_message = go_error->get_text( ). - IF gv_message IS NOT INITIAL. - MESSAGE gv_message TYPE 'I'. - ENDIF. - ENDTRY. - - -*&---------------------------------------------------------------------* -*& Form F4_P_UPFILE -*&---------------------------------------------------------------------* -FORM f4_p_upfile CHANGING p_upfile TYPE string. - - DATA: lv_repid TYPE syrepid, - lt_fields TYPE dynpread_tabtype, - ls_field LIKE LINE OF lt_fields, - lt_files TYPE filetable. - - lv_repid = sy-repid. - - CALL FUNCTION 'DYNP_VALUES_READ' - EXPORTING - dyname = lv_repid - dynumb = '1000' - request = 'A' - TABLES - dynpfields = lt_fields - EXCEPTIONS - invalid_abapworkarea = 01 - invalid_dynprofield = 02 - invalid_dynproname = 03 - invalid_dynpronummer = 04 - invalid_request = 05 - no_fielddescription = 06 - undefind_error = 07. - READ TABLE lt_fields INTO ls_field WITH KEY fieldname = 'P_UPFILE'. - p_upfile = ls_field-fieldvalue. - - cl_gui_frontend_services=>file_open_dialog( EXPORTING - default_filename = p_upfile - file_filter = zcl_excel_common=>c_xlsx_file_filter - CHANGING - file_table = lt_files - rc = sy-tabix - EXCEPTIONS - OTHERS = 1 ). - READ TABLE lt_files INDEX 1 INTO p_upfile. - -ENDFORM. " F4_P_UPFILE - - - - - - - - - REPORT. - - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime, - lo_drawing TYPE REF TO zcl_excel_drawing. - -TYPES: BEGIN OF gty_icon, -* name TYPE icon_name, "Fix #228 - name TYPE iconname, "Fix #228 - objid TYPE w3objid, - END OF gty_icon, - gtyt_icon TYPE STANDARD TABLE OF gty_icon WITH NON-UNIQUE DEFAULT KEY. - -DATA: lt_icon TYPE gtyt_icon, - lv_row TYPE sytabix, - ls_wwwdatatab TYPE wwwdatatab, - lt_mimedata TYPE STANDARD TABLE OF w3mime WITH NON-UNIQUE DEFAULT KEY, - lv_xstring TYPE xstring. - -FIELD-SYMBOLS: <icon> LIKE LINE OF lt_icon, - <mimedata> LIKE LINE OF lt_mimedata. - -CONSTANTS: gc_save_file_name TYPE string VALUE '38_SAP-Icons.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -TABLES: icon. -SELECT-OPTIONS: s_icon FOR icon-name DEFAULT 'ICON_LED_*' OPTION CP. - -START-OF-SELECTION. - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo Icons' ). - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). - lo_column_dimension->set_auto_size( 'X' ). - lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). - lo_column_dimension->set_auto_size( 'X' ). - -* Get all icons - SELECT name - INTO TABLE lt_icon - FROM icon - WHERE name IN s_icon - ORDER BY name. - LOOP AT lt_icon ASSIGNING <icon>. - - lv_row = sy-tabix. -*--------------------------------------------------------------------* -* Set name of icon -*--------------------------------------------------------------------* - lo_worksheet->set_cell( ip_row = lv_row - ip_column = 'A' - ip_value = <icon>-name ). -*--------------------------------------------------------------------* -* Check whether the mime-repository holds some icondata for us -*--------------------------------------------------------------------* - -* Get key - SELECT SINGLE objid - INTO <icon>-objid - FROM wwwdata - WHERE text = <icon>-name. - CHECK sy-subrc = 0. " :o( - lo_worksheet->set_cell( ip_row = lv_row - ip_column = 'B' - ip_value = <icon>-objid ). - -* Load mimedata - CLEAR lt_mimedata. - CLEAR ls_wwwdatatab. - ls_wwwdatatab-relid = 'MI' . - ls_wwwdatatab-objid = <icon>-objid. - CALL FUNCTION 'WWWDATA_IMPORT' - EXPORTING - key = ls_wwwdatatab - TABLES - mime = lt_mimedata - EXCEPTIONS - wrong_object_type = 1 - import_error = 2 - OTHERS = 3. - CHECK sy-subrc = 0. " :o( - - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = lv_row - ip_from_col = 'C' ). - CLEAR lv_xstring. - LOOP AT lt_mimedata ASSIGNING <mimedata>. - CONCATENATE lv_xstring <mimedata>-line INTO lv_xstring IN BYTE MODE. - ENDLOOP. - - lo_drawing->set_media( ip_media = lv_xstring - ip_media_type = zcl_excel_drawing=>c_media_type_jpg - ip_width = 16 - ip_height = 14 ). - lo_worksheet->add_drawing( lo_drawing ). - - ENDLOOP. - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL16 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel39. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_drawing TYPE REF TO zcl_excel_drawing. - -DATA lv_value TYPE i. - -DATA: ls_io TYPE skwf_io. - -DATA: ls_upper TYPE zexcel_drawing_location, - ls_lower TYPE zexcel_drawing_location. - -DATA lo_bar1 TYPE REF TO zcl_excel_graph_bars. -DATA lo_bar2 TYPE REF TO zcl_excel_graph_bars. -DATA lo_pie TYPE REF TO zcl_excel_graph_pie. -DATA lo_line TYPE REF TO zcl_excel_graph_line. - -CONSTANTS: gc_save_file_name TYPE string VALUE '39_Charts.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - -START-OF-SELECTION. - - " Create a pie chart and series - CREATE OBJECT lo_pie. - - CALL METHOD lo_pie->create_serie - EXPORTING - ip_order = 0 - ip_sheet = 'Values' - ip_lbl_from_col = 'B' - ip_lbl_from_row = '1' - ip_lbl_to_col = 'B' - ip_lbl_to_row = '3' - ip_ref_from_col = 'A' - ip_ref_from_row = '1' - ip_ref_to_col = 'A' - ip_ref_to_row = '3' - ip_sername = 'My serie 1'. - - " Set style - lo_pie->set_style( zcl_excel_graph=>c_style_15 ). - - " Create a bar chart, series and axes - CREATE OBJECT lo_bar1. - - CALL METHOD lo_bar1->create_serie - EXPORTING - ip_order = 0 - ip_invertifnegative = zcl_excel_graph_bars=>c_invertifnegative_no - ip_lbl = 'Values!$D$1:$D$3' - ip_ref = 'Values!$C$1:$C$3' - ip_sername = 'My serie 1'. - - CALL METHOD lo_bar1->create_serie - EXPORTING - ip_order = 1 - ip_invertifnegative = zcl_excel_graph_bars=>c_invertifnegative_no - ip_lbl = 'Values!$B$1:$B$3' - ip_ref = 'Values!$A$1:$A$3' - ip_sername = 'My serie 2'. - - CALL METHOD lo_bar1->create_ax - EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_catax -* ip_orientation = -* ip_delete = -* ip_axpos = -* ip_formatcode = -* ip_sourcelinked = -* ip_majortickmark = -* ip_minortickmark = -* ip_ticklblpos = -* ip_crossax = -* ip_crosses = -* ip_auto = -* ip_lblalgn = -* ip_lbloffset = -* ip_nomultilvllbl = -* ip_crossbetween = - . - - CALL METHOD lo_bar1->create_ax - EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_valax -* ip_orientation = -* ip_delete = -* ip_axpos = -* ip_formatcode = -* ip_sourcelinked = -* ip_majortickmark = -* ip_minortickmark = -* ip_ticklblpos = -* ip_crossax = -* ip_crosses = -* ip_auto = -* ip_lblalgn = -* ip_lbloffset = -* ip_nomultilvllbl = -* ip_crossbetween = - . - - " Set style - lo_bar1->set_style( zcl_excel_graph=>c_style_default ). - - " Set label to none - lo_bar1->set_print_lbl( zcl_excel_graph_bars=>c_show_false ). - - " Create a bar chart, series and axes - CREATE OBJECT lo_bar2. - - CALL METHOD lo_bar2->create_serie - EXPORTING - ip_order = 0 - ip_invertifnegative = zcl_excel_graph_bars=>c_invertifnegative_yes - ip_lbl = 'Values!$D$1:$D$3' - ip_ref = 'Values!$C$1:$C$3' - ip_sername = 'My serie 1'. - - CALL METHOD lo_bar2->create_ax - EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_catax -* ip_orientation = -* ip_delete = -* ip_axpos = -* ip_formatcode = -* ip_sourcelinked = -* ip_majortickmark = -* ip_minortickmark = -* ip_ticklblpos = -* ip_crossax = -* ip_crosses = -* ip_auto = -* ip_lblalgn = -* ip_lbloffset = -* ip_nomultilvllbl = -* ip_crossbetween = - . - - CALL METHOD lo_bar2->create_ax - EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_valax -* ip_orientation = -* ip_delete = -* ip_axpos = -* ip_formatcode = -* ip_sourcelinked = -* ip_majortickmark = -* ip_minortickmark = -* ip_ticklblpos = -* ip_crossax = -* ip_crosses = -* ip_auto = -* ip_lblalgn = -* ip_lbloffset = -* ip_nomultilvllbl = -* ip_crossbetween = - . - - " Set layout - lo_bar2->set_show_legend_key( zcl_excel_graph_bars=>c_show_true ). - lo_bar2->set_show_values( zcl_excel_graph_bars=>c_show_true ). - lo_bar2->set_show_cat_name( zcl_excel_graph_bars=>c_show_true ). - lo_bar2->set_show_ser_name( zcl_excel_graph_bars=>c_show_true ). - lo_bar2->set_show_percent( zcl_excel_graph_bars=>c_show_true ). - lo_bar2->set_varycolor( zcl_excel_graph_bars=>c_show_true ). - - " Create a line chart, series and axes - CREATE OBJECT lo_line. - - CALL METHOD lo_line->create_serie - EXPORTING - ip_order = 0 - ip_symbol = zcl_excel_graph_line=>c_symbol_auto - ip_smooth = zcl_excel_graph_line=>c_show_false - ip_lbl = 'Values!$D$1:$D$3' - ip_ref = 'Values!$C$1:$C$3' - ip_sername = 'My serie 1'. - - CALL METHOD lo_line->create_serie - EXPORTING - ip_order = 1 - ip_symbol = zcl_excel_graph_line=>c_symbol_none - ip_smooth = zcl_excel_graph_line=>c_show_false - ip_lbl = 'Values!$B$1:$B$3' - ip_ref = 'Values!$A$1:$A$3' - ip_sername = 'My serie 2'. - - CALL METHOD lo_line->create_serie - EXPORTING - ip_order = 2 - ip_symbol = zcl_excel_graph_line=>c_symbol_auto - ip_smooth = zcl_excel_graph_line=>c_show_false - ip_lbl = 'Values!$F$1:$F$3' - ip_ref = 'Values!$E$1:$E$3' - ip_sername = 'My serie 3'. - - CALL METHOD lo_line->create_ax - EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_line=>c_catax -* ip_orientation = -* ip_delete = -* ip_axpos = -* ip_majortickmark = -* ip_minortickmark = -* ip_ticklblpos = -* ip_crossax = -* ip_crosses = -* ip_auto = -* ip_lblalgn = -* ip_lbloffset = -* ip_nomultilvllbl = -* ip_crossbetween = - . - - CALL METHOD lo_line->create_ax - EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_line=>c_valax -* ip_orientation = -* ip_delete = -* ip_axpos = -* ip_formatcode = -* ip_sourcelinked = -* ip_majortickmark = -* ip_minortickmark = -* ip_ticklblpos = -* ip_crossax = -* ip_crosses = -* ip_auto = -* ip_lblalgn = -* ip_lbloffset = -* ip_nomultilvllbl = -* ip_crossbetween = - . - - - - - - - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet (Pie sheet) - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( 'PieChart' ). - - " Create global drawing, set type as pie chart, assign chart, set position and media type - lo_drawing = lo_worksheet->excel->add_new_drawing( - ip_type = zcl_excel_drawing=>type_chart - ip_title = 'CHART PIE' ). - lo_drawing->graph = lo_pie. - lo_drawing->graph_type = zcl_excel_drawing=>c_graph_pie. - - "Set chart position (anchor 2 cells) - ls_lower-row = 30. - ls_lower-col = 20. - lo_drawing->set_position2( - EXPORTING - ip_from = ls_upper - ip_to = ls_lower ). - - lo_drawing->set_media( - EXPORTING - ip_media_type = zcl_excel_drawing=>c_media_type_xml ). - - lo_worksheet->add_drawing( lo_drawing ). - - " BarChart1 sheet - - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'BarChart1' ). - - " Create global drawing, set type as bar chart, assign chart, set position and media type - lo_drawing = lo_worksheet->excel->add_new_drawing( - ip_type = zcl_excel_drawing=>type_chart - ip_title = 'CHART BARS WITH 2 SERIES' ). - lo_drawing->graph = lo_bar1. - lo_drawing->graph_type = zcl_excel_drawing=>c_graph_bars. - - "Set chart position (anchor 2 cells) - ls_upper-row = 0. - ls_upper-col = 11. - ls_lower-row = 22. - ls_lower-col = 21. - lo_drawing->set_position2( - EXPORTING - ip_from = ls_upper - ip_to = ls_lower ). - - lo_drawing->set_media( - EXPORTING - ip_media_type = zcl_excel_drawing=>c_media_type_xml ). - - lo_worksheet->add_drawing( lo_drawing ). - - " BarChart2 sheet - - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'BarChart2' ). - - " Create global drawing, set type as bar chart, assign chart, set position and media type - lo_drawing = lo_worksheet->excel->add_new_drawing( - ip_type = zcl_excel_drawing=>type_chart - ip_title = 'CHART BARS WITH 1 SERIE' ). - lo_drawing->graph = lo_bar2. - lo_drawing->graph_type = zcl_excel_drawing=>c_graph_bars. - - "Set chart position (anchor 2 cells) - ls_upper-row = 0. - ls_upper-col = 0. - ls_lower-row = 30. - ls_lower-col = 20. - lo_drawing->set_position2( - EXPORTING - ip_from = ls_upper - ip_to = ls_lower ). - - lo_drawing->set_media( - EXPORTING - ip_media_type = zcl_excel_drawing=>c_media_type_xml ). - - lo_worksheet->add_drawing( lo_drawing ). - - " LineChart sheet - - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'LineChart' ). - - " Create global drawing, set type as line chart, assign chart, set position and media type - lo_drawing = lo_worksheet->excel->add_new_drawing( - ip_type = zcl_excel_drawing=>type_chart - ip_title = 'CHART LINES' ). - lo_drawing->graph = lo_line. - lo_drawing->graph_type = zcl_excel_drawing=>c_graph_line. - - "Set chart position (anchor 2 cells) - ls_upper-row = 0. - ls_upper-col = 0. - ls_lower-row = 30. - ls_lower-col = 20. - lo_drawing->set_position2( - EXPORTING - ip_from = ls_upper - ip_to = ls_lower ). - - lo_drawing->set_media( - EXPORTING - ip_media_type = zcl_excel_drawing=>c_media_type_xml ). - - lo_worksheet->add_drawing( lo_drawing ). - - " Values sheet - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Values' ). - - " Set values for chart - lv_value = 1. - lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = lv_value ). - lv_value = 2. - lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = lv_value ). - lv_value = 3. - lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = lv_value ). - - " Set labels for chart - lo_worksheet->set_cell( ip_column = 'B' ip_row = 1 ip_value = 'One' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Two' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'Three' ). - - " Set values for chart - lv_value = 3. - lo_worksheet->set_cell( ip_column = 'C' ip_row = 1 ip_value = lv_value ). - lv_value = 2. - lo_worksheet->set_cell( ip_column = 'C' ip_row = 2 ip_value = lv_value ). - lv_value = -1. - lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = lv_value ). - - " Set labels for chart - lo_worksheet->set_cell( ip_column = 'D' ip_row = 3 ip_value = 'One (Minus)' ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 2 ip_value = 'Two' ). - lo_worksheet->set_cell( ip_column = 'D' ip_row = 1 ip_value = 'Three' ). - - " Set values for chart - lv_value = 3. - lo_worksheet->set_cell( ip_column = 'E' ip_row = 1 ip_value = lv_value ). - lv_value = 1. - lo_worksheet->set_cell( ip_column = 'E' ip_row = 2 ip_value = lv_value ). - lv_value = 2. - lo_worksheet->set_cell( ip_column = 'E' ip_row = 3 ip_value = lv_value ). - - " Set labels for chart - lo_worksheet->set_cell( ip_column = 'F' ip_row = 3 ip_value = 'Two' ). - lo_worksheet->set_cell( ip_column = 'F' ip_row = 2 ip_value = 'One' ). - lo_worksheet->set_cell( ip_column = 'F' ip_row = 1 ip_value = 'Three' ). - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL5 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel5. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_style_conditional TYPE REF TO zcl_excel_style_conditional. - -DATA: ls_iconset TYPE zexcel_conditional_iconset. - - - -CONSTANTS: gc_save_file_name TYPE string VALUE '05_Conditional.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - - - ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. - ls_iconset-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo1_value = '0'. - ls_iconset-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo2_value = '33'. - ls_iconset-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. - ls_iconset-cfvo3_value = '66'. - ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_true. - - lo_style_conditional->mode_iconset = ls_iconset. - lo_style_conditional->set_range( ip_start_column = 'C' - ip_start_row = 4 - ip_stop_column = 'C' - ip_stop_row = 8 ). - - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ). - - - lo_style_conditional = lo_worksheet->add_new_conditional_style( ). - lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. - lo_style_conditional->priority = 1. - ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. - ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_false. - lo_style_conditional->mode_iconset = ls_iconset. - lo_style_conditional->set_range( ip_start_column = 'E' - ip_start_row = 4 - ip_stop_column = 'E' - ip_stop_row = 8 ). - - - lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 100 ). - lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 1000 ). - lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = 150 ). - lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = 10 ). - lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = 500 ). - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - REPORT. - - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet. - -DATA: lv_row TYPE zexcel_cell_row, - lv_col TYPE i, - lv_row_char TYPE char10, - lv_value TYPE string, - ls_fontcolor TYPE zexcel_style_color_argb. - -CONSTANTS: gc_save_file_name TYPE string VALUE '40_Printsettings.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - - -START-OF-SELECTION. - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Demo Printsettings' ). - -*--------------------------------------------------------------------* -* Prepare sheet with trivial data -* - first 4 columns will have fontocolor set -* - first 3 rows will have fontcolor set -* These marked cells will be used for repeatable rows/columns on printpages -*--------------------------------------------------------------------* - DO 100 TIMES. " Rows - - lv_row = sy-index . - WRITE lv_row TO lv_row_char. - - DO 20 TIMES. - - lv_col = sy-index - 1. - CONCATENATE sy-abcde+lv_col(1) lv_row_char INTO lv_value. - lv_col = sy-index. - lo_worksheet->set_cell( ip_row = lv_row - ip_column = lv_col - ip_value = lv_value ). - - TRY. - IF lv_row <= 3. - lo_worksheet->change_cell_style( ip_column = lv_col - ip_row = lv_row - ip_fill_filltype = zcl_excel_style_fill=>c_fill_solid - ip_fill_fgcolor_rgb = zcl_excel_style_color=>c_yellow ). - ENDIF. - IF lv_col <= 4. - lo_worksheet->change_cell_style( ip_column = lv_col - ip_row = lv_row - ip_font_color_rgb = zcl_excel_style_color=>c_red ). - ENDIF. - CATCH zcx_excel . - ENDTRY. - - ENDDO. - - - - ENDDO. - - -*--------------------------------------------------------------------* -* Printsettings -*--------------------------------------------------------------------* - TRY. - lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = 'A' - iv_columns_to = 'D' ). - lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = 1 - iv_rows_to = 3 ). - CATCH zcx_excel . - ENDTRY. - - - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_EXCEL4 -*& -*&---------------------------------------------------------------------* -*& -*& -*&---------------------------------------------------------------------* - -REPORT zdemo_excel4. - -DATA: lo_excel TYPE REF TO zcl_excel, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - - lo_hyperlink TYPE REF TO zcl_excel_hyperlink, - - lv_tabcolor TYPE zexcel_s_tabcolor, - - ls_header TYPE zexcel_s_worksheet_head_foot, - ls_footer TYPE zexcel_s_worksheet_head_foot. - -CONSTANTS: gc_save_file_name TYPE string VALUE '04_Sheets.xlsx'. -INCLUDE zdemo_excel_outputopt_incl. - - -START-OF-SELECTION. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet1' ). - lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the first sheet' ). -* Set color to tab with sheetname - Red - lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = 'FF' - ip_green = '00' - ip_blu = '00' ). - lo_worksheet->set_tabcolor( lv_tabcolor ). - - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet2!B2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to second sheet' ip_hyperlink = lo_hyperlink ). - - " Page printing settings - lo_worksheet->sheet_setup->set_page_margins( ip_header = '1' ip_footer = '1' ip_unit = 'cm' ). - lo_worksheet->sheet_setup->black_and_white = 'X'. - lo_worksheet->sheet_setup->fit_to_page = 'X'. " you should turn this on to activate fit_to_height and fit_to_width - lo_worksheet->sheet_setup->fit_to_height = 0. " used only if ip_fit_to_page = 'X' - lo_worksheet->sheet_setup->fit_to_width = 2. " used only if ip_fit_to_page = 'X' - lo_worksheet->sheet_setup->orientation = zcl_excel_sheet_setup=>c_orientation_landscape. - lo_worksheet->sheet_setup->page_order = zcl_excel_sheet_setup=>c_ord_downthenover. - lo_worksheet->sheet_setup->paper_size = zcl_excel_sheet_setup=>c_papersize_a4. - lo_worksheet->sheet_setup->scale = 80. " used only if ip_fit_to_page = SPACE - - " Header and Footer - ls_header-right_value = 'print date &D'. - ls_header-right_font-size = 8. - ls_header-right_font-name = zcl_excel_style_font=>c_name_arial. - - ls_footer-left_value = '&Z&F'. "Path / Filename - ls_footer-left_font = ls_header-right_font. - ls_footer-right_value = 'page &P of &N'. "page x of y - ls_footer-right_font = ls_header-right_font. - - lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header - ip_odd_footer = ls_footer ). - - - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet2' ). -* Set color to tab with sheetname - Green - lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = '00' - ip_green = 'FF' - ip_blu = '00' ). - lo_worksheet->set_tabcolor( lv_tabcolor ). - lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'This is the second sheet' ). - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'Sheet1!B2' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 'This is link to first sheet' ip_hyperlink = lo_hyperlink ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 4 ip_value = 'Sheet3 is hidden' ). - - lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header - ip_odd_footer = ls_footer ). - - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet3' ). -* Set color to tab with sheetname - Blue - lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = '00' - ip_green = '00' - ip_blu = 'FF' ). - lo_worksheet->set_tabcolor( lv_tabcolor ). - lo_worksheet->zif_excel_sheet_properties~hidden = zif_excel_sheet_properties=>c_hidden. - - lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header - ip_odd_footer = ls_footer ). - - lo_worksheet = lo_excel->add_new_worksheet( ). - lo_worksheet->set_title( ip_title = 'Sheet4' ). -* Set color to tab with sheetname - other color - lv_tabcolor-rgb = zcl_excel_style_color=>create_new_argb( ip_red = '00' - ip_green = 'FF' - ip_blu = 'FF' ). - lo_worksheet->set_tabcolor( lv_tabcolor ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Cell B3 has value 0' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = 0 ). - lo_worksheet->zif_excel_sheet_properties~show_zeros = zif_excel_sheet_properties=>c_hidezero. - - lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header - ip_odd_footer = ls_footer ). - - lo_excel->set_active_sheet_index_by_name( 'Sheet1' ). - - -*** Create output - lcl_output=>output( lo_excel ). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/ABAP2XLSX_V_7_0_2.nugg.zip b/build/ABAP2XLSX_V_7_0_2.nugg.zip deleted file mode 100644 index d50351c6f29240b2dcda484801316e5e6e655141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319157 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�hYPwc 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Ⓢ5M1)jniC?xb z{T#EY-99Vin)}Mt1td~xoJYvOJ1ZNVfpq$A}*{IbU1sC3MJ&VffDwo})?NU9e935Xjs#d>8ZCZRAmfoc?wp#yAL7c6;Wr+cL z%Xxs;rE$zJmZg8X{{LEfvsiK|_}>;N_rbX@_?IgXFY!>H9FCyJ2%K*V8mJ0~9aC6% z8LWdP@GSz@T1F8p95YVzhd6U(3I#{`++xh*SG3`o^f3zO{9f<0wI0?>uw)J9sO81v zoTmfF!c?N!%z(v<1l06dJQ_)hkY94_--g$OSA`_Y zWm6YkdD*-JPj=sty2h)b^#0L3owq?}ukp>j4MTRu2tF-+w?>~$^<%1yShB?zXYd@g zY}w@)xvTaIrd;+cLk0%zZSe@07T!-mDVcUMd)0*1WfNA{O;}wxVRhvMvbl7^>e>mb zizlqEp0K)n!tVMBy9+4nuAs2Hgu?C`3cHIa?5?7)yNtr_I*RfODN;9O@of~FxQ}AR z8!58BPi;5^JoQ4~cY&8)Sn#Yd3?i6k-*1t0gGQ|=&%>OdNHzV{^S7DjUaa(o7tDm@ zDM~|O+nI=F-Cb7MEqc}E6Ps;hLtJsVfJIwyA>SLNAdkV*nN-Tu2hn5?-ZwV)DOo(G zy};ngl`R0n4bxR%k$+1KJ$3#j*FummJA=u_U}UbeB@lR^o(V!E?y*%U4i|M13zvVX zrK_|g-B&4<)7(V}1~uk)rr=|kWNto$aw6nXEvLC#lLS5?<c;53veC^AzaQe^5MIdF$$ z7|Qi51&^I9nuOW&ck+1>r6maINso>iMXo5=O%*!}dCN(hNz`(}W^+2gC}2u3n)FC0 zzW{?P26_cXc3+xm#WP;&A8*n#v3lXW==7TIXA*JRxuOxLZmZuLT#p@9RLg=2m*NI> z(Q;ZwV|&5o#A7(Qhg0}>^vDvMBt&QRf{P`S%@Sr2P9chd>&t9bYGuH=J2C!3vYUD) z)2btK3EE-n9c)~|HgJNHxSOy+oQC#Tnx1@Pet$*M#VBOp4Cwi z$=J~dFD;UxY&M(QdFuR@Emc0~;nT&gW}{c7Uum&d64|&Fbte9jk5FfhBncyf|D^<} z@K9FxSP89Bp(!VtvD51WY@+PX6drdXe*4Rz@r`KpP$_UB?zR=UqD)ph46H1P~ zF7%q~D6w`w_1aa+gtbym_3~lNuWX{}bjD(pHlvm)2)cA8;ne6%Ikv9bHGq+}JWl!BP)p*KsS4dg;%;ciBJ{%ht$|n3gN#fh5=gmRmb9eL^T}W|Rnq>jkA4ah-8*LUMv7$g|9r@C=8U{|xDKbGfvwC$ptCs4Mxfl~ivj7( zP3NgpTRrE5wgV#>YOK6GZMNI#A!71$eXBWeC~Ix%|Z!C@-a;e29$N69k;82WHX+BKo6G8N?a=4&~^e?@AXd(jqIV_El zM(R-0WN|-h==FJl*{D2XN)V2tzviVJuyQP?Il0 zxafQyj7gQvU5POI0nF*M9|rEAIldJ4Bk(?t$c66gMhFDA`=oaxG~VpO-3UXUybO;d z;_|$WUn8JE-8A& z1@j;YycsrHW}y11QOcT-rx2S@yoQKk_B;UxD???9L;o7%j=$Dk@&h2|0{^6%EnoV^NOj3Dgm|`v3>x|{GQ>Wg7Mf%n>mrZgg zpPrx+?{^B%GiqZ9zaY{ydW5$1;2V{|k6^}%^^lJ%K@P^=4TO+R*=eyn{F6%Xd&^l8 z(6>$EAMuocXBl#rJGsA++WQOfE{Gn1(@F@mLfkjlp73Uf8c|7MSKm}>=>kK?)?Ps` z-d2LWN-y43YH5h4<|0n~TnTa;&dh#=V*(z3o>empYuPqdY2qCArRdw8bae<1m0~kI z@n#{R7ON*WSch}Ba8D?<@O&`aC*CslQINn>r^sW|0PJtYlL&4i_2{kS4AfJ�$_k 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 -Us{-$@7#eT%$+9DzckgYc>4GQXP!|*I2tvp zv#kAzU;sFZjnC4^#VP2hqgRN-X|;nsX}?>m!z$?;2ET?Gx<-64)+!t-am2F zkCyJ3+pswUV!mo`$ly8v27lElgznvDjlUxVB_`P0xNr^Tv5(hF05PdnN)Lr^NST9=V*cyrusG`wh4!z0vUIx$?{6CyiQ>8S zgPkoZ|LqmdC>O<#vbIm01n53D)%|PpkTRq-&u0)i>l{o(rZk-A$6RFN{9`8C7o({4 zE;k6wBL&cdk&I+Uh>*vbEH3qMxEtaO`+ z-#~dKxdfhjR(P`GKtw6f<0=6|i>qUd z$YHGkzX+ALY*q{X$NRTo?S6->4S6Vr0;gXSe*MpYl_nDK%8}W`_uIm0U8~RrPz23A z>cg6JCwYMK$EDy=AVLj@dDRLT-KO*TZ>M@yOet zpkldub1ykNBnKntqh&dm!)gUnq$%wxXh@BbUY0?NlHQ+2zC#2{E|S6vySvH$ni})e z%$U2$%fjHLn+l3(+CVLdX6m+*Pn!yrRejV(U;r(RrJCjtfEoWR9*@h1sPNZxx3(^O z`%v9P!9ueAvIsiqVKE1cJAY9{WQpWRX$=N{7v|Rz%pi?w1+heZa^J_O)kGR(ew3RJ zvk=n2-N!)Uhg%`TSgBQ-Qwg;ID^xI@W~%lh`~|m?%g4Ub8hpR0Dv1USoPxBY4Qrva zLEI#?Ct)kzM@)SduVG~?evuEPL{nBY-UO6_q%{vfQ$~T0sHI>l&a9>INABNv?r$1)CE*(b-I_qxqQjfK+53bOsh zpr&$w<_MEzkhONupR9hJEPF<)+jEMC^Yi|=^)kilJZPCM`KJ(;|4e8N5m zSnO-`=|ExtWs>6HzWL=7?0@5r%1r*gbJvek0$JK~I)mVT{@IbITLu~St+S8Z15-n9 zVIlwP93q6Zm0wvQ#1}BMu3R}fB}9t-=(x2_yLi?|YUkMz^ROg%3;3k)s(zc~*5jBJ z`&IKs<+}bC*a&*O9ZawK4bEkq9He)fNbhaki|(oV>h8y=>w&!u!`9`G+sWkx%Oc{_ z<(7U!v2-Uj1=mG~Fx6fT2*S4_sJeI>o)dBqlc2dVEYzlGGwT4v7(a3rmasLkb!~(g z_-XqWZMSXR$WRyk0{5jRr6kF&#}z_FlW0R_9)IXb@Nq;;E0=OOM&#S!z=YthspH1n zO}3@6xZ=@lY(l%Ey}J89$OfC9=5m&dK{6I&*rBF$=x0KZcv$sVcxR@jw#al~RK{!9 z9bA@;O{uXOPbyi#$fK0dN|x{qe9zJ0n6W`ek81V5W|+1^PaT`D1}`Xo?alEnA>Bi! zYqW$Iy47rH%N-XG)&#^e)%ThXJ+sT>AK%xVm!C-KQa~NFGw0)X#axjk zb*v)s+>fGbNSR!jO*V`NY0@@Vtt1j7`-!V4%(QJS!t1B9E@DsR1$HeQG%#75^hBx7 z8Lv=q9#DZ{HgcF!b&||*oyn`G=3cXst05K{7UFAU z`p=bdKGJW?G_Vml;|N7D=ShyHL_}{hkvqR<&hNAXSxv#EK2NyzFfc9l{?Bo^ z&{;Si`FjESCw_*dX&C}d(7@zi8@irJ!hJTj*|X8=$H7w$l~P_PUijMv;?`ljfcsmX zvS2hx%fL)(AUck>2#d|2d`}T{UkWR(CwYuISGZZ6^Y6mnW=3KiIB#FG8A0!-=IGif zdX9c`%Kp?vd&KJ!;83*inl^K{7*Oxg7aqxvi^3r($N7Lerk8=R|kQ5pRa#i z&Geb~mR~f(whOg@s3B@a#64@lIOf}tY5jSE^;KLl!TjcaMvqX)v>o)c>+vL(vJxLL zy~8ncdG+<^EQOE>rfK0dhU9rR-jOp2Ctq}Y|Mc22OAs4_Ng8#-4C&f1Iuwctw~%)z z=fDIw;gB6mR;gefYHiC8_@|Ki!*tQQ(52tNEBgXYmPF-j>cr5XZTth2+Z z+^n4`|F@t$lH;vFyhlI_R^n-@@EAEYNUB4PA%I+0KgYS^-b;#`8ofzn%uKx4X`y;( zG;Dh5$M$$V^&?R@)fNX{&f|RwA=OO6rO5bd?>&DPw5}HMra`{2i$LSwP45w3>7-MM z-m%N7#-f7k1*i@8XU2ZKth<1+WY?6|gIuMUTAoy_o-vK{-QyU6t_)MV(-sWpOO{Mp z+AW2EOpGezo@Nz!nNZAu64&owbs9m78;RJI8VsDu*LC5-tfRwQwf!`GZz-*^w*Il1 z^Z)h(pqNZ~kj`^1^@JzYI7-zq|OOJV$s zL;e~_YNf79W6v>5Jp`tv=}+A)5Cs77YVAvurCKInoO_GD)~iCGUW>k;5`e8jaKhz=OQBq`U8$g97xq2=ha+N6zd6@1zz6WHI272WgJXgz9x?)1zpJ7rTZ-c=z)> zp}<9gGjetrEOx!{67Q%hY@D~TQB-o`(KI>&+7p$OxE!|Na_*Vy){p4TkxUa^subnv zhL9Y|a}A2LE!Tn5t|5b zN}ibaDBO;e+--^)jgQMVB+QJZi#I2gWO@IINVwU5R$b6B zI-SJJw1G-R`WPXK*MdTQ^*q$CV2GY_4zbVEuLdrN>(wsx>s5dXn@31(dCtSI+U9XkYuT`&P{IqS5%0FPDVBCtgA#vxo7xJfIqF~y? zV`?X@B*u_3v#fw3qHCsPX^z<|P5vc5v96*np=YIPY_$SJ2<@P0ChFJbCFRgTlS_7W z)f|pk+w!-e#X>;9)FD{)h%5BoC4R(gopuOuMj8R~O${uf7vMY3s#mS^8LW=Ntaor* z$dgSs9F&@bE{sMlH}uA74U&0+4>fII%#M%(6oe($v=aeTBsB;S25O;tx7U=Nu3QP< zR^E>mCdPII864y`q$}-W z`}(P&H8iLQS{N|s@uPIHyI1dLQSz%Njd4Zk`idinoDEHrr1az|xb zz3BnJuqv4*Sc5SCy4?X^Si$*42M*Q&{*k3y{Yn;B`kKKAd0_6oh~Km#8xiutBL7Bb zL!}6s|3n}T`Qz%qw8vbXsf*W2@AOk3FZ8=3ruR(PW9s<=^)Q*ak03H~@v}dE%H*8g zxkldJGU|kpMoQ<{3xgA`k482^ZLt-YbqxPwIbwPOLM;=Y}%gD$^E`s;I;AP869TV!WqH*%k$oe0a};T zMSw=~2~h$&hBF6w0YTbY!~c?`v=d*x@02idX#8d4!>#L+w4L=06b6QSYU~KlqOMSm)=93JaUl{y;1QZ@F5}{4w)OMb#65WPt*XQ5nrHm5WhFz^%@xV zEFh)i<`4_mo#Gz^F~RG*++KBXpI_zFF~EOQRj%{4!T;_5MP1|LpbkKs`4P@q5;!5a z@IIeHxBz50jetI7_kIZY>>%gZ$@Ag|-tT>n{OMDIDT)IDvvGGY_dQ>TJH;aey^B%M zl4g8i>qXW@a4M*jxYt_XVwgZ}>#28V;8!O*V)2DASCk)7!Ms#=R(|-YjCA`qCMq&brU&Hv3v7@e zQaiM%#~eNVr4)!k{NuwBFk#AONf5j=ISld9y&(Em|sfXQedF>h{I-$0*bB2VXZIr zoccYOc9uMy(XjdDOt8adBKl?C|G3$LA8wZX|GC-wO(u-xq%tt#k(*W-)o27{IN%br zOnvUgTc0C6b$jfe)(Ego&TOngRcXC+*xKUsjX|_UJLuu#?HYMB>QgxYD#F4H0QJ9# zZv$J}5)-v);XkJ}%u2*n&9EY3)JO3oaPmUr!-`l%b5Ca_ZTdxaw*PD-ACbi&5J{uO zr8rbfj1phiockv{NdH!p{H^%n%WBPNh5CI&4`D4T6X!H3a@YRuXFCRsO;jjfiiF=*DxZ{C~V`><=%y`#)Z` zyeDbNMeCKqZI2#VJzGfaWAj+R;eiNc!f4r_c`Tt<+Sezb6Ipo9_}?U(ZtM!|fxWBp zPm)bk7&Q#!f%~s6ds+d|$iNb^nxa$k^a=1^8!t&GKn74E&{VIT@%usn?cajFXJNrZ zNU`w$NwHa)ggkWs_7*Zb8s(c9M|E(qnt*N0aVR(B4i zQG67_$5aj$gCkCiGuY^aO+(s0Ls0uZ65{Xt47U{RrD z=-84#N*KidjU1+9eg!;0K~LKje1~Cy*ab3X(@W;qTCj<8sar%z@$X{lB) zQ#)B?`xxXqf8gL=DKM50nERc!cj61fkA6HOz99{r@a{$8b}@RJ7ws_1P*_0-#@SGm z&sK&2$O$8-TZK|Aa+c4Qi|(w1Q7|dLL-Q%+)t3rL(suR@#ga_*DZ@~I)QuLE^4%BiM}C(Ai4-4M2(V-uu815N_2~Vz4_k%`_6gJnK?7h zGc)(hnYrh_u9^G68(SpmdQBxNRdf3$eOy=d6bUn~SwTc3*%3hIwWdF+o<}C_3AJ1a zp^B`F`@JH{3lE;#DX^B9vnsL9MZ!LR$<<)!bC%>tBJ!pNrubrRxZ50oFgIxXcxd~a z%^(-_mvM!>@`zH}K3Fm=+U=0x4*BhZ`N($ZyW+Ew%y~L*QC$=Q3z3aBs3SLTMMJ6d z`N)Xtm79^3Ab~CllDh`j$Zk__Mouq9l00*9gS_zTfs9(K)6LC>g@y0*@ObKBu{}j0 z{%yrBs>^8v@HA*;v+>(c|S%_K-C<420D@uiSQV9^w9F{YdKLb-* z@~kK`$dd@|$+YT(!BU@bB!ooJoSX#f=;G;ub++M%G~c9p_?a$U&7qK0Y*1;Kf-wi!1{hR5Io(_GDVccGfBbIxAB;~ z9~L)o~U?fdh`v? zm&kA2^J#y}+zH+`%oAcQ(LXYMSX}6>huggN40f(+q8}R`9oJA|Oz=#wCN~1SyioIM zKgO=6L_zfivljaCij-%s%Ku;!Q{Oa`P3^uLy07?gQBFh5#7|ntEDY!=eHR5!b2u7TSOG3(^y?=(_lp&&2q(7#W z0Vy(D?cZgwab*(m5G^e$elqx@Ucgy)-T644ra?rn3hw$?X`s8 z@6Qrd96cQ$kL}5(t1|uTLC86?m3c}W$rnK{iz%@sJyoZFOsYmSmIjZz)QWz-ePAh6 z@v5Jwa%eVJvUCSs-6_mUmRLTeZ#XG+i+X$-Cn4njF-y~0=55xYnO)M2W2oDzs%-Sv zbDd>}K_9n{uf@BbWeyil@voV+90~fcH|2`A<@25l03zSvw5Uku;&--Ft_wN$<1dvl zsyc7bp~7&^2@_6nw@O-HQ7?JpPR3fpJOQLBE`~dW#6E*#P`62n-4wtWZpd2wkJj^f zKO1h8KU!I}zI?fOREAQ0{mxJ}gNjNb)r-MZ=Jyw_-KSgsiK!L!CwxjhAm-jTlleVydH$ zRpa)s22gcED8DyEM?KP`bF59Vij7K;d_|T4fE4jOlxD1(A#MyuVIEZo*k8x=Uw)O& z=)-bp!#_i^yNt&PI*c7D8m}TcKaPa2UR}= zo(WO4g&TuAAw)*suxM(s-Ngir__&RT`)4h(u2sOw;^9inWY7fT(sH|c@(E~9F@Imt zLX%t|nYp;>QdV&p*Zx70x`C88yXCpSOF^$0VRWm&za=@pn!9yZw}2!FgqrV<_Z*gw z<#uwoBmLY^+?FA&rMxs-imjzN2l~BkIqoA=$nR80s16bX9iqBKD~2%yx+ z_PmQwT3gau_3-7{5EA2EVw>&Kb!&dNpm7vwd8~9*?87b14;mFM0M8aeX-~!lsQxx` zh>Xp%g@n%Bx{BD$)w5;t%0Gowv|^3^_H9%s78Svt&juczRgmNJC&;FpzyE37zpUo< z+7&d`bygdzrDW=XBFMW*#^&Gh6YzJGeqtr;m#&yN^y@W`yI(>r>fun*?|0IjLklMwV#Pt?!NFVPr9ds3#nG`VipL$opeKq zSLZ+ywGXEKTOdvR;Z*aGYvA+OJG4-$z-(6Geh$)3b-=+BG=-b;HE?7;(Ob}eS4YbB z+5aq#?FLeAv`l1#IR$+gICT*4ojs{7DWVqP0tmb_WpY zx{h#g9Wiru4B;x-B#&3%_nrKt7Rl3Cwhrj-6qA zCyTa}lu#E^3`uWo67iIraF%En^oQqEQ9qjIs}^r=v}cB1^wzhc4MoLlO+5)*FgIrp zN%lhwTk@YiUW2**yKWI=Tz1~<)qe5pRC)3_W4%_l)Zz&zcIcgtFWnnm`B*M^eVCcr ziNR(PZfE1ULgRGJH6y7;O{g`J2Z_o6QyE&MKa@076m2T!*_Sln4)u6-Qrs!kx-Zjs z8pQOiyj27@(4eO^o+zSp_MV-sc=CLo#Z^cW55^UehQcO;&;Q@$zjP+!(L~J#xv>knSVZC;Ib2g1a&U)eE9CKkC{J!H>de21s_Wa|o z^=oBU3s7iWU~>YR#_p_#;Nepo2iER#jVJzL)$RH1^F0~N=^oA630|Ao@8h`luD^NN z6X;Afrm#6)e2lsxwL*5ZTm_yDaT_TJyRS4;5dX78By0v1#-I6-;Q3O-s-3v39R8>& z7`r}U7WkXab-kpz@hf*1%WgSW8JmtIAQ9LGePI!Ec^UhI{n#(l; zYWe2{aM!G&%nUs)u!}ugD8$$2qU&=f>e;3Q&NdhiHyDpMoLy9~WgnW$K71()!)Ar< zk{m8k?S65|F~x$-eT16sSf!}ERqt4c3+iFmrzm-G3XQAjTiExhIqqy*xq8T);MClg z3q05{?v}erXS%y%UIW#{?d*tl_z2BQzjg5z>QB8n*!FC_(=jcGjE+*1A7r2)MftT> zaEg@-6GQ_AX?(ifmChoGdUU7uqJ=8+bHVyhSYtB0Rt)#O%HpNrgJeqZeP#v>GmofX zWbX*jR8uIh-PWEw9vOq1;2Yhp$6AXj3(~Ql!YGIw_{;1-g~B<}SM!E$py($mgip?u z3}@YAJ+5cxek}L~hh=%iWbH7;PbPceL?jlsx(z!=mnYe~9AmEX+rP=t};~v#R*h@z2vypRAcjI&@-A z-;rk?ChY$_(HS`TzUkmRA!OvQ)fQ;7F~P9u2+Y$qZZ&EMQZUx+!#Uy+Ni##};fMKZ zlxFif)#+GAYQ78LcCEyZVLcwl!Q*dGB~pp)__QLNXMHVQ${Mz*hh-?ve!##a>*woX zudI`I0Rc0SZSE|Gik9Bcnk1bUB^s2>)Vfam(L+#r+tal;b9PnXA@E@_^eQ|QgZTfM}^*9F=k;-J^3ny!8$O9%Rg zT4~RpSi}UWGJ6x$g=8+cZ$0-*78v{TsBj=4Ual<@+#b1=0Y)Rp^-*ZVk=BFkf(1^_ z(=f^@PHgtzsz6W}6(QD)2!qXDAe!2pE#GZTpWbUa4o=Gd{;?OV8Pm%FkUWT*RHp;`c)9IfF;rtv+e*NotP9mzIQBcJH5;as@shm|kI`5`h-R zqxDJ7d=v3eqAYjU*%`; zS{JCw1d@#EFc!>a79CtZa`9#jLB4nj%IX9|@5RlNP>weg!g&LpcDru=q8~Mj`2D95 z0xdL8`!l1G0kPlt0E~b;gmeIa2*B}A2mrtp z;X0zm8v4doMplwm!d9Y!9!MuA%KzjO0d4?p^1M2d8P?~reYy;F5G163 Q%OV0e6C#p?IskzG16DP>^Z)<= diff --git a/build/ABAP2XLSX_V_7_0_2.zip b/build/old_releases/ABAP2XLSX_V_7_0_2.zip similarity index 100% rename from build/ABAP2XLSX_V_7_0_2.zip rename to build/old_releases/ABAP2XLSX_V_7_0_2.zip From c7c0e0d13961ef13e3e10bf30d82479a9335d78a Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 12 Jan 2015 18:59:45 -0600 Subject: [PATCH 5/5] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 5a742fb..9a3a4df 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,3 @@ For general information please refer to the blog series [abap2xlsx - Generate yo Please refer to the official wiki for the [installation guide & F.A.Q.](https://github.com/ivanfemia/abap2xlsx/wiki). Discussion Board is on [SAP Community Network - Code Exchange space](http://scn.sap.com/community/code-exchange/), once you create a new discussion please add the prefix [abap2xlsx] in the title and tag the discussion with abap2xlsx. - -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/ivanfemia/abap2xlsx/trend.png)](https://bitdeli.com/free "Bitdeli Badge") \ No newline at end of file

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 O;0M#NU-b27twQN(8)H~Yp>Uw7WHtd{*|{+B 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