From 8620ff1b70a1f077862bf58a497b6d119548f1f0 Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 16 Jan 2015 15:02:41 -0600 Subject: [PATCH 01/32] Updating DDic objects Export slinkee with the latest saplink pluings for Domain and Data Element --- ZA2X/DOMA/ZEXCEL_BOOLE01.slnk | 9 ++++++--- ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk | 9 ++++++--- ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk | 11 +++++++---- ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk | 6 +++++- ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk | 11 +++++++---- ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk | 9 ++++++--- ZA2X/DOMA/ZEXCEL_FORMAT.slnk | 9 ++++++--- ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk | 6 +++++- ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk | 9 ++++++--- ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_APPLICATION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_APPVERSION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_BORDER.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_BREAK.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CATEGORY.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_COLOR.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_COMPANY.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_CREATOR.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_FILL.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_FONT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_FORMAT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_HIDDEN.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_INDENT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_LOCKED.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk | 4 +--- ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk | 4 +--- ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_PROTECTION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_ROTATION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SCALECROP.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_SUBJECT.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_TITLE.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk | 6 ++++-- ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk | 6 ++++-- 105 files changed, 432 insertions(+), 219 deletions(-) diff --git a/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk b/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk index 84ec899..0871150 100644 --- a/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk +++ b/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk @@ -1,5 +1,8 @@ - - - + + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk b/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk index ad910a1..e6a2297 100644 --- a/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk +++ b/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk @@ -1,5 +1,8 @@ - - - + + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk b/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk index 7a91743..49f3e0b 100644 --- a/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk +++ b/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk @@ -1,6 +1,9 @@ - - - - + + + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk b/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk index e2457b1..5026052 100644 --- a/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk +++ b/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk @@ -1,2 +1,6 @@ - + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk b/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk index 3256348..12cec84 100644 --- a/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk +++ b/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk @@ -1,6 +1,9 @@ - - - - + + + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk b/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk index 9503e1e..c026f59 100644 --- a/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk +++ b/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk @@ -1,5 +1,8 @@ - - - + + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_FORMAT.slnk b/ZA2X/DOMA/ZEXCEL_FORMAT.slnk index 5b23647..70efef7 100644 --- a/ZA2X/DOMA/ZEXCEL_FORMAT.slnk +++ b/ZA2X/DOMA/ZEXCEL_FORMAT.slnk @@ -1,5 +1,8 @@ - - - + + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk b/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk index 831a53a..f6549fd 100644 --- a/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk +++ b/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk @@ -1,2 +1,6 @@ - + + + + + diff --git a/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk b/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk index f42564e..032b043 100644 --- a/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk +++ b/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk @@ -1,5 +1,8 @@ - - - + + + + + + diff --git a/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk index bce7111..6ee9d8b 100644 --- a/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk +++ b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk index c66e97f..543bc67 100644 --- a/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk index 2b7ec9f..9f194d7 100644 --- a/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk index 6f6379d..7f775f8 100644 --- a/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk index 160dce9..9a61a48 100644 --- a/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk +++ b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk index 8381c44..82e8396 100644 --- a/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_BORDER.slnk b/ZA2X/DTEL/ZEXCEL_BORDER.slnk index ef5aeea..a980445 100644 --- a/ZA2X/DTEL/ZEXCEL_BORDER.slnk +++ b/ZA2X/DTEL/ZEXCEL_BORDER.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_BREAK.slnk b/ZA2X/DTEL/ZEXCEL_BREAK.slnk index 55278e2..d027fc2 100644 --- a/ZA2X/DTEL/ZEXCEL_BREAK.slnk +++ b/ZA2X/DTEL/ZEXCEL_BREAK.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk index 8116da8..3f2c8d5 100644 --- a/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk +++ b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk index b068929..17d8ecd 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk index 6e0fcf2..692677d 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk index 1805010..5cf0a52 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk index 3b80419..ac0c34f 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk index cca5778..b07c979 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk index 803b57d..5f44f6a 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk index 707dafc..0edd4a4 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk index 54e7683..1b4afc6 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk index 6c20d90..6e99cf6 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_COLOR.slnk b/ZA2X/DTEL/ZEXCEL_COLOR.slnk index 624d45b..41d84f3 100644 --- a/ZA2X/DTEL/ZEXCEL_COLOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_COLOR.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_COMPANY.slnk b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk index 9ec378e..bc84916 100644 --- a/ZA2X/DTEL/ZEXCEL_COMPANY.slnk +++ b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk index 71687fb..6a57088 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk index 556401e..553d265 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk index 0e3a899..f63d682 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk index 0d4a54e..66b6308 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk index e363816..774e5cf 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk index 30766b7..f170a50 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk index 049393f..8fdcc25 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk index f652647..23190c8 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk index 29ab61a..981eb8c 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk index efe0099..e188c22 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk index ad69df5..0a5d2f3 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_CREATOR.slnk b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk index 480d349..a712185 100644 --- a/ZA2X/DTEL/ZEXCEL_CREATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk index 59f06ef..17fdd62 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk index e595bb1..4b2e34f 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk index dbcc4c0..916f815 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk b/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk index ec0001f..4396478 100644 --- a/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk +++ b/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk index e17e3f1..eb3255d 100644 --- a/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk index b22f162..2b58b49 100644 --- a/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk +++ b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk index 84075a3..45d1922 100644 --- a/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk +++ b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk b/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk index ebc1c24..018f4be 100644 --- a/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk index e5bcdae..dcdada2 100644 --- a/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk b/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk index 590f0a2..2ef0734 100644 --- a/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk +++ b/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL.slnk b/ZA2X/DTEL/ZEXCEL_FILL.slnk index 55eadf2..02f974f 100644 --- a/ZA2X/DTEL/ZEXCEL_FILL.slnk +++ b/ZA2X/DTEL/ZEXCEL_FILL.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk index fc1e23f..6161e78 100644 --- a/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FONT.slnk b/ZA2X/DTEL/ZEXCEL_FONT.slnk index f8dea36..fc0bfab 100644 --- a/ZA2X/DTEL/ZEXCEL_FONT.slnk +++ b/ZA2X/DTEL/ZEXCEL_FONT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_FORMAT.slnk b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk index bbae5a3..95538cd 100644 --- a/ZA2X/DTEL/ZEXCEL_FORMAT.slnk +++ b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk index 217c8b9..4dc045c 100644 --- a/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk b/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk index 8ac650f..9e0d5a5 100644 --- a/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk +++ b/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_INDENT.slnk b/ZA2X/DTEL/ZEXCEL_INDENT.slnk index ae47deb..af8be40 100644 --- a/ZA2X/DTEL/ZEXCEL_INDENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_INDENT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk index ce515c9..a563443 100644 --- a/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk +++ b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_LOCKED.slnk b/ZA2X/DTEL/ZEXCEL_LOCKED.slnk index bfd8b85..f812511 100644 --- a/ZA2X/DTEL/ZEXCEL_LOCKED.slnk +++ b/ZA2X/DTEL/ZEXCEL_LOCKED.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk b/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk index 3fd4707..b78d7fe 100644 --- a/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk +++ b/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk b/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk index 1b0180e..1379e55 100644 --- a/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk +++ b/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk @@ -1,4 +1,2 @@ - - - + diff --git a/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk index b20a3ee..0f7b3e1 100644 --- a/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk @@ -1,4 +1,2 @@ - - - + diff --git a/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk b/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk index d7cfd87..d4ad5f6 100644 --- a/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk +++ b/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk index eb1e15d..566fbaa 100644 --- a/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk b/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk index d0a4e88..fac84c4 100644 --- a/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk +++ b/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk index 33adc7d..a476de4 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk index 5145a39..330f3d4 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk index 6a7c871..98e81c6 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk index 7c83f25..d457772 100644 --- a/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk index 360ef06..4a3fba3 100644 --- a/ZA2X/DTEL/ZEXCEL_ROTATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk index 5afcd45..9fc73fa 100644 --- a/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk +++ b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk index 6240783..2adfca6 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk index 2aa0027..7e2826d 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk index 77fb60f..d01dcc6 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk index 1302f6b..ecdeb81 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk index 65d77d0..27cd870 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk index 6877cce..e795a1d 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk index b8fe668..6ee236f 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk index 37dce2e..1b80869 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk index 3b941d9..041f5c3 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk index 9bbc2d6..41267f5 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk index 26ca58f..6e4a688 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk b/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk index 420d344..fa94565 100644 --- a/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk b/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk index 33f19b6..e7f9d60 100644 --- a/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk index 88b51f5..63c9852 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk index 39c919f..48e8111 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk index e9e71a8..f8bfd4f 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk index bba3c92..fe267c0 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk index 1c9cbb9..771d065 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk index e328ef3..4c8730d 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk index 5d5800e..ec3ba07 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk index 961eb58..1ef04ad 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk index 0b70a8b..34fb6d7 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk index 8092e1b..35ab5c0 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk index 88326de..4b1c398 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk index f40ce4c..4fd2a13 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk index c673acc..7500693 100644 --- a/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk +++ b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk index 6b3fd1e..ef2f7c0 100644 --- a/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk index ca69cc4..81d71fd 100644 --- a/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk index d4c8c09..517bb4e 100644 --- a/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_TITLE.slnk index b13188f..ff4f555 100644 --- a/ZA2X/DTEL/ZEXCEL_TITLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_TITLE.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk index 33743c1..9f3b4f9 100644 --- a/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk +++ b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk index ecdaaef..c37e51d 100644 --- a/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk @@ -1,4 +1,6 @@ - - + + + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk index 0c7a9da..7f77bf4 100644 --- a/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk @@ -1,4 +1,6 @@ - - + + + + From b2732ee2f7d7f827594cf4cf717d718b812e012b Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 16 Jan 2015 15:05:32 -0600 Subject: [PATCH 02/32] New Daily Build Removed the DEVC object from the package issue #353 --- build/ABAP2XLSX_V_7_0_3.nugg | 900 ++++++++++++++++++++----------- build/ABAP2XLSX_V_7_0_3.nugg.zip | Bin 321144 -> 321857 bytes 2 files changed, 584 insertions(+), 316 deletions(-) diff --git a/build/ABAP2XLSX_V_7_0_3.nugg b/build/ABAP2XLSX_V_7_0_3.nugg index 07b89ea..40f01b6 100644 --- a/build/ABAP2XLSX_V_7_0_3.nugg +++ b/build/ABAP2XLSX_V_7_0_3.nugg @@ -1,5 +1,5 @@ - + @@ -10361,6 +10361,7 @@ ENDMETHOD. 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_node_stop TYPE REF TO if_ixml_element, lo_fill TYPE REF TO zcl_excel_style_fill, ls_color TYPE t_color. @@ -10439,7 +10440,60 @@ ENDMETHOD. * gradientFill *--------------------------------------------------------------------* WHEN 'gradientFill'. - " 2do§1 Support gradientFill + lo_fill->gradtype-type = lo_node_fill_child->get_attribute( 'type' ). + lo_fill->gradtype-top = lo_node_fill_child->get_attribute( 'top' ). + lo_fill->gradtype-left = lo_node_fill_child->get_attribute( 'left' ). + lo_fill->gradtype-right = lo_node_fill_child->get_attribute( 'right' ). + lo_fill->gradtype-bottom = lo_node_fill_child->get_attribute( 'bottom' ). + lo_fill->gradtype-degree = lo_node_fill_child->get_attribute( 'degree' ). + free lo_node_stop. + lo_node_stop ?= lo_node_fill_child->find_from_name( 'stop' ). + while lo_node_stop is bound. + if lo_fill->gradtype-position1 is initial. + lo_fill->gradtype-position1 = lo_node_stop->get_attribute( 'position' ). + lo_node_bgcolor = lo_node_stop->find_from_name( 'color' ). + 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. + elseif lo_fill->gradtype-position2 is initial. + lo_fill->gradtype-position2 = lo_node_stop->get_attribute( 'position' ). + lo_node_fgcolor = lo_node_stop->find_from_name( 'color' ). + 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. + elseif lo_fill->gradtype-position3 is initial. + lo_fill->gradtype-position3 = lo_node_stop->get_attribute( 'position' ). + "BGColor is filled already with position 1 no need to check again + endif. + + lo_node_stop ?= lo_node_stop->get_next( ). + ENDWHILE. WHEN OTHERS. @@ -14059,6 +14113,7 @@ ENDMETHOD. method build_gradient. check check_filltype_is_gradient( ) eq abap_true. + clear gradtype. case filltype. when c_fill_gradient_horizontal90. gradtype-degree = '90'. @@ -27394,326 +27449,538 @@ ENDMETHOD. endmethod. - - - - + + + + + + - - - + + + + + + - - - - + + + + + + + - - - - - + + + + - - - + + + + + + + - - - + + + + + + - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -40948,11 +41215,12 @@ CONSTANTS: lv_default_file_name TYPE string VALUE 'TechEd01.xlsx'. - + + diff --git a/build/ABAP2XLSX_V_7_0_3.nugg.zip b/build/ABAP2XLSX_V_7_0_3.nugg.zip index b01422fb8656522135795dfd292203d9c46c244a..1e8f76ca097155548bfe4dcb46a04ea0bf78a710 100644 GIT binary patch delta 317116 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

HH`OE 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
  • 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�<*;Fp2Imt&ct+|AE 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

    vGio+-hHrKJ`1pc7Jqsa`MABPV2)JdEV-`o5S|# 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 z zTqRilq3X+j3?#Ax***psYMtu+k2&SbTu1K_U3K zl+{)+!l=eFSaD0cQ_rUSLB`HIgVN(pX=xSDW^;Uh+H+L4_0H@!_XAfEE_d8Jb}z_c;Z=^LOFu6oj-+?>zDycKL7V3Fs9!n=M{^nZ zH1bA>oWMm>fBemzpvQZc2Ee0J&&tb=8Uo25}a5|E60GdRulACw(fdw{P*G znUx=Z@OcKv?e%wq-fcWM^9<0t!UGG{@VmWpnmxX~kc--tp7g1P+^roo942ntc$pj- z<=wv9?$m{AhurBK*00ShY?Uoh2P_;Imdp9l3KWAU?dI@X**1T`_`L*^)rcskB@lc` zqM%VOCNa=9hT{t6{AYvXvXVl^@}^})WfSaw;p4fStdNkrS!q$-PbBg&$MY3#c1T`+Uj^0oPYXAgk_X^7hwaKX-^0gtIl&R*dBbv}@{#NT zW0;24E`i-X3HQBGvrlr<_aotTix0$AcuI7yuj=JttMjSPqOg}>#ew(WM>K%+M)~o7 zN8YaO%-E3f{;q(1_^(bU7-Iv|+Qtw9=_?scQ z?A~`bj*^FuasFKUS~y?MSHk*Q_a1&IoI_Sw@w+kYwf-aT#;pFZ3`TvrE!Z4RpTnN3 zgge3?;k8~m*yr+GuLj!q%;=B%UT+zHwEQt2?9Ic>ANa-IJhW`)$=;p499n)TKf;^6 zWk*|Sw(r>G^T&I&x5T>pdDtoCQuaCUcKG5ehe}X^B;yXZV=U25quR*{vIaxTB+ckLvOe^NzZtVrp`2QtFWICXpJ^bXVAy`EHip0Dlb^~~Z1I!7|91$sX1TU4W(bt*W*O|UABAYkS*}2@= z+eBxyum8lKHClcvxBQ;B+>bC-*Qe(DSVmpX>C2Bk@<2ye1Yoe41FtxLA#+}kn~(C_ z&zGdkr~s0he8XDX2gDX7QOa%`-9EY2jaQuJutnanK-Tp|i)tpIBQ#!MRd3jB_FzGQ z7t4n5h64fWvhxMjUR>q6)w(iTA7i~Ga=%9d-=DIjaq7(PmOvgnqNW9vX$CE5&<7I{ ztXX)8Gxp!_FuC?=g^eaD8ER zTF9cNzhlZ!q>-bpF}muvtzY3~=jFnt4}6Dzr$rJUJn`Ttzzzs8p^&!Ny)&OoU3>04 zpv(Rc8J{qlqKUu6Guj?cz415HzeE`JyQOD4(+3-#0@gMpeL7vBDOR_TYX|=0G3}a- zF)=V=IrtS_7#})+J?JWWk|0)ET?GCedA9?qK;TzD48})1HCZ|&9Lzc>EPczKvZAHw zQ;cdEqt{l!JLU+bq=A=cL#kt_Qj9#ETO3aPGt( zFNw@i>v^{Ci98!4;rmmH9|Whwy{b=}tHVd1JEJSq>-Ua-@aFEnt_@)7=CwIOAC0fa zDa5!zfW+D2!zRh4xldCsUdo=;F$fxAx4)zUR{vCjPNqPI{}OZ2YvCjxqTt5_C>Hs#j7e@ z87~tqhM5^Ire2geGf8g5IEV0%GDmTJk)f?Ga)orE9ea^Yo~Iu>5v?|T7~41v|5iHi zLVM~wVX|@Xpd3w0mV3Z^2nQquDL3&#mcRx~Uba4evc7gN`X-jof1O7ExE%wFA$TMV z|J5UNPy&oC)P%BhRimzJ0&5%qu-A~~A%p6 zxDfZFO&2{SMO1&~DXD3YDyhf&b8~utCO)reV4}l3S0cSi18Yu=+_-28+wi zhaRv?JoOn|al#QPP828J6>P|0Kc-9*sYc}7kn%{>fE|D}Y;7OJxJ&R#$O16HGoRFv z$`=g^>JV?o++hj+2SyOnl+?2^+u&Y2<&iuid;-yWP_OWD}-FS0{c#f?sY+<3q4cV%e&p)d!E-3PSd*;laYzQ)zTCSDV zy3D6Px-y1VRxVz+#Jbh>CRob;ibk-1`+D^75;yk2khrgft1cGz)UpLzz+!z$yJ)f6 zLI8oa)SpkE>>1X2UMBaLWG#z=r7J5MO8r~hKIY!68pj9 zsiXjmwL3hU9kDf1K=2YTC94MCJT|1Aux}jcY&oQfcpc;$) z6Y}1f-X6`daDa1iI2GW90DeG$zZ1v`=^i`-g~u_v2WGPccDoP87lxyke-clXVpUAcIwuA)L)QBnhN(i;<`P6qN$j6cmbITF%nNR|`5=6QfPyNsp zNiW4F7gl7rSOfALes^vG%O0#L&J+oY061PO=eVOe3dNl=YIpxT3L^(2_Q7*fdFb!R z2gi~}FLYV4$2UGde-AX8Ly4q9SrLoPpgC;f$%VDytTlzz$y&N3e$gB34O3c)q@Jld za@40Pc|q@aOJ^Yj>H;W#$Bjz0I~F&7ii+0tMYl6TFVhV7il`(*V{|?2B~@S|C>QpP zGyZl9#vLx2wB>>uQm}9r#|uyV$9bVb&kKhxW~kDI;Sq>re_$P4h2Dz# z!mUUsY?*z_e@LN8OU0l2{cY^`^~uru{@|Ysr5%)w=A5I=>5^>>DqbPy?&*{2{iFBy-C?JilWWCxyfohS#zm=^ZL< zE$>z-Bv*zT&h!F&QI~O1x&DnGOx(bp!bwa){ScUzRgjyY>3AFL2Pb8k$f#SZP`6&8 z?rDX(e`giyo>!>*wnE)^Yt{|mtZ%)#5H7EfJyUg=chbbek}!n*V|HD^+N=`Pk(n!=S>9l0qH{|^<8NEDT&#Dg+l;2?D(TKJvTgIFv{bSTwo>s70-SM7AYYG>SDon#`$IvN`Pb!}K9Vi2HBQ7`j&+zmOMxr*RT(L8eJ zV7Uq&ys;Y+FA7}R9plkssKGl|*)VxDFpYidPba_`4XKM&cQ@S63o%=yJK@dBt+Eqc zh95bHU`0gLiJif72M1g3&{;qM*38Qoe-NAzqbmghcWAzSBrTDB^2-A7w3h^+Lg$j# zNtp}vZOP`0!V#)$ER8V1-wh4V(*a?2hhPCca9&~nrHg7O0x=KC)ACq85JxTW*MZ=Y zR5L1RSt8&)r8_QCuof8zKcUVW#2>wItEz zk|Th820whYLE27AGm3ld<)K{PiHA-ZVEP~Wqm*;OY3367Ie;{Y&2y(Up zLF#$p>pa!fnq)cO4q1}TW{~ClZy1tZ!4jtVxl# z+o4FZ*$j%bPK|o~ER!N{t5W1`If}g907c%VdRdbq@3upcWV0C*xj1dr&ayS(cU39! zt{g?)6;fp4QPQ6N&7eyJ~(*jc1}qShb(DF^?3#qpm%&+(t}@xR+E{c!`e{08cU z4V*ns3Y;_Wf5``b7Zf<(HxIn6$^*|-3cY3EzpKgv1qdv`1E&>vpkNvoLr_4%%5vaz z`w%=+E__#xiFP0de+m}UVhU8|!dmUw&w~Oa{+tI{^Wc3s1nyuSRHne`-g%(%JlMZp zR2c^a0`=gju(z4`%g>p3C_HcwGqLg>u>gX~R45)oW$m;w4xXtjsGXF<;B#QZ=e{63 z2Vqc*#A*hkO-Pe%%d>->%e5b8E*IErcCe)UoQj7q6`$*}e_H=>rsB4Bs~xc6w)M+m zGH!b+?!a_bSsWE?)()Nz_9spFd1~bydu1l5EDS0$L1i|qjDvz96jR~-mLb?b4u0IJ zc($pjxNYOv4%EZ_PsM@;im6at90@Y)MIi2PB5)6j%IBKItpz`T>0T&fRuJRe~3`~Wv`N86U)JKr^5aw!m~LL+=bn+>XNvBe|h}e&ouWp5l(-ciLifZSlxhL zbt>-Pa`{YMMCxaonh5(p*{{4$-S$K{FK!_Js&?fyso2k^z~QVi1jRV`!|qbf%OPO@ zYtjy8Qe`fxY*%?6bvYGs-Jb2|UX z>)J0r&bn54B5WH6m8aqk7KO^@@NL^(DkHHNe}Zj?tScVEwtWbH3dAgdczW{V2*mww znYXQ4JO@3!vhC#u5Xsx#DLe-?d)t05KaDq;GQIZW$n^dDJNy9F>}}7apGxi@M7!Ab zY&=+rT0a+ ze=hHz3eR<$aCR_LasNzE&_Ia|chw69e^@p=FSjT^2i!gCeq+#mP=B7;1CKCXP2v41{(u3OauiZr!%KCbT1ymz(W zxw0X5S=xU9%IemFs?l`+s7!EnvMDC0f4o;O&`wK8f-Q%K`Ei+mpX*kRz3mU-S1;}di2-3=pT1(WYh9-nV0C*ak3sM9OA-}7fs!l$Xn2FxV^tR3qSlv zbAA^*p$jjVgfxLPLYjH71OE{htR1tT7zykrB$)mF05wPP`0&VKxFH`dr7*3B(HP*m zzmKPM5IAi%^XCl!Z|u(>+#rHtf6Ljt?o1c=&P(3kE7nZsGHw}lERN-4&PI697+QPc z&D?qD`E!ae6%T+kr4Ydf9V8p=tIP%kCL#6S_3rK?UY-5Kt-O~TkP#-5l-~X(<+b{~ zQKxrpumsFWolA~F9YHY?rvw0sHrgn|bpG68W5yp2NMZR0XS#Hue7JDNe+5$)7bkOu zG%rZ@N?`{9Ekl7ACml>N8I$F*FcJ5gZd;)8(VIl~qy_Q~H&AEwFcpB!`HaxfA-u;7 za2I$JkVPSGC6R(#b8ei4ed|m^H=bPONXq8ufc~3@cbTa4*_$%tr0uo>*NNN-di3z% z0oeNYY52WVpE0F{qzv4Ne-}|nDUJ6233CBP$Tvj_h*T;F2pl*oa)Y@uwIKuJ<4#}^eTy7gx16`sYpX379&~eB_H&1m_`b+0Ye1U1(jv& zE5wi}w3(@=;xi^k=Hzphk#C3I?{skzzxcF?f~A{B)R`OHxsn{me_L_^4n~p_L}{Ry z)Q)^0V_hom&L?r{VKGM~JFlOu*!kNsokRDnq0t-}sDJS(-V4#pjqd#k z!r%P)^a(i+jyH8~Fy`=VXj-Uw(HtN^8G3sRwoF`GY7RG!e<^S?4sE8;5SjKJFGAk@ z&IY#jr`~rW&sd@~T7vM`NEr^!g@SmfFO^~vT`UJHjM2S|IL0spSRB~5fj^HhL)oDl zJa}U_B(Olv#DAPmeP{AACIsM!w9e*T8l|g#ps~3#lf>2SayqpaPISM1gAo>5tU=08 zn74{0XX?|se`@wVz^Erqq;o58UEfqa86sMqWojTgVQ zjc(t@a{%iI&EX65sX1(!jTc{DAnW>~)p${Rfri$oIcmHZ;cwk$uibcYassJlzlpya zFVJP@%V0#RT(??RM(ZPdhknpMBfJO>e1A%Qp?^-DfBD_gxpR><7&fiOi#9FB3K~-v zOVtQ8k=%eu!x;lA*)tAu_e{U|sz#HF3%lX|4gyH=#y29|)(2F<4t<*#-A3w*H z&q~#;i@HYeySu!L(9DZs1>+cfc0mfcs58IygP9ZIb-|q@%yw8Fu*FhYD32xZPfl`R z7>b@ne|^+;Xa28RO^p&T0R( zbOSmr3GDZ!8ibiSOf`7rkMGxP@N(GiiuT&9JsF+v%E8qfUF9`X&tr_ZnNdF%mUGd_ zKi_c9&zK0tN)w?UcsQHzS%rzvsxT4ss`fFufAsL`KlAZi@Z!0EoM>CqfWm=Vg#Dd> z!ZYy3(K2vDX?W+m`7F>Ne(}cypp3 ze}xNo?A>~J=1l<703+5t7Ht{M_?}h;-4E-Rpzt{;bn!L`iVMyE7!HY$N_=s&0`{;ou6RJeaD*{e`>BH zD0o7%Wr%f>Y3LJ@<>EIU*&NND5azfjL>&qN*25=WIQFsPk6UmMp)>MtQT+sUFIbbJ zfzoO^+mak3%SYc_cY&VptVbTfiD)gH0UrejV|08!2c+YD8nADGp+PPk#xew|^#?`| zwVR`+WsHtDJv0COr=bDD5~1HGe^@Tqd=ip93+z#k2K~Ni{YvBqPHgpiSVQiOaLV1- z2HaB>oNOJ)o|f&CJ~hp2gBz=Oqp^(&H`VF2%fWSk?qaL(^Mf2ojsm9 zVd#bgNZ4jz{nV4*cU*@nJ6_OzuLxS^V%FSf1v9pwbPT@ zNsa#cySianfH5HMWkP(}b1H8I{l|H(2;gY3MItk%%LRJ}0pwg&Yt(S_M>eZJ%ZA5xXs@zkDT z`(3iQ%!jhMDOHeIe+rq2QU!&Z(d5EO7>IUYPe89?W%cFQ(6FdnI9O-$nH_n2taLdh z0yWASFg-EL7~=y!8P(>&I!O%YDKg+hW#rO4Ni{@g!8~5J#Qdom~7A%^Ux{+Haf>oO zGGc1S=S=NadmMs>{C8o%z&m-$Y@JK4Xs6tMvJ~*xd8Tk%pss+@wji-IHZ;p6-38#u z&}xp19-PlIfYL>^(}bZR-pDc!DrucR*31s+{BP(w6NbJX5u0FDq1GC(e<-$<4L}N( zDGAV|f1;rSw#1R-azPFxGmeLqvqb6B(C9fFEr1KKy~O9pi6ca%9d_hyu^EfvcEF^C zMo{S`&hB*njxNY?@+;oxy%XBRXeJ?0ZuE1F$Lg9lv6GZ#1bDJgVa8tyGz} zF&!d1TrOZ;bjd8iw zK}7pGVe3lQu&m|>19jR^XcpdiOvR99?b5=S>F31&-#RmI`c$%ETDT<0H~w^@qC%xr?r_1cNU3}J zmOG|tO<5XlOEwO=8L5b=Z$2`;_ypJY{=v{as59E?rt>LBzX*- zH&bU^)RyeTsW+DK#%THI-kVFqW22+3kP|OjP9Z?Ty0^~UO|&JAAf%P1Q}$D|sKIBd z3A_^D&EZ6x{DKwtcQ|{T>aZcoGK9pX?SP!#mFooj@Vv1z)uTMw2``Nof7gY|pb2|r z4vR{l=y_BjqJRKV)1)%0gsrm@C23omBm-@+WG|bdL&AWYLk9^Il@5}$fLk|ow?uYN zL{Mm)TD$$;=*kASKg<4LjAWf&bvBg^SPhNw3C2x~dw6W)<&+!=ks*_!p?%{PgX%TcWP^j%$O~bqTw$ZZ;e_A1#NNVKWBVrfB zXm79bN-hF#9?4f-68Bp470GCE_2q*6UN{R_2dSsABnRSR3?HN*l(U_)vW=&t6G6SI zsFY|%h#%2NTHjI5I7{D@V5SD;W`W#N@=6l7n4M(SSheqq75lEI`X=@`df=Z%N(t=B zjtTiJAeD^mnDS*he{t_FZSItdiG!ww))ZVG^qCXfd2?8ms8FPsIXSMK2uFt1TAI4I z(Pml-=sDX4TDtM0h)DH}mXb1cO-B5fV5?$QJWa7;1(Lnr7|G7hH$}3Obz4f2>@+nx z-DKfM5XEyPQBqwI+3MY#OeAHBW{G38MyxOV?d)Y;ktNjYe@G`w@TRTJ&a!0HiWpZu z8eh?jv@AMlT2|*n4~+Neb3xIjYy?jiJDNt{(f^146X3o)dqu6?@=8k2U>gd;j!<3X zveVRtI5^VH9bFT(L=)twwA{UET=HdnQ1uG^4V`KLTHyw^1i>pkSkjNbr9r0`+NyRa z(@RjAa`zi1e-2{Ss${ zxO&U*l^&{6L%wq>zGn_Faqm`qmn(dNM5T)MZf$Inf1+jS#^*I-r>b-F-LcYErHS&I zHI>WEuTx}soz2Pu)Es8kR9AU9kB{Zb<=HqW~=#cCRDA<_62F;)7Ad=upgmR|kx zbSmABY*X#fOg7)@vo*=cjt-~swhUP)~iOR~hYLDDB7(ZsaLlW8fg zFC*7jrB!7ct0v=5e2+`L%A)EIjhj~)>?ye$my02j6*op3F^27`)opdc4%U&KZpgV7 zob*FC%s@zfOVWindyxAjN;|}aDBYZy`wNDOjE`5OE;EhvRR(69iwoKRv$!j6RB{w=(7_eg;ojqX1pIf7 z{RfypFo47>dSkw%3v#biWbHc zW0yxL8AXIVPM*TxAvz&A@jekR9AaN-e{c`+a#oZC=K+TJ-M7L`u5!+lf>tWR4wcw< zwSbsis_4=bBD;ooAxQS~#CB>8?ZK>CdiBKlRljD+!tA~m;q^NIT%9MWK2e-dXh zlDvQY`Zaevp?6M6n`3?hm9PT+szg{?HO7qH!a~O~taPlIPF94ORpZKJhtr4yAav&A z=@RRtS-|l~2B#;75Xk^>aO002@XcR_-p+XF?13xG=(m=Mm!OdWV`*KRFV zRawNwSF94bM7rv7V=oGE-vg`+cp1A4re?RyGXGf%d zG83WM42~)?GNULXlidareF{ZZ3)GDl?i?uGrvS!f1!L7Xp07IPIIf!15t4faf%Lc==Jgck;?XPGxrztSiVz-+D0>9- zz&m)+G);Jgw|cRke*F2He^Pe_*Wu;5BtgWjrM#Y$G2}x94cWC=_JuL}Y#2Rz^tn%@ zfR!zvq{^ja#`Z*(Zo=CTk40KLo}tW24gp>EhX|8|FDY!h+P)rAgj-j5xsfu49qS|3 zzdjizx@r!)reRre?q8bMsJ#rRaO~pUJ6+P^%pqLlFx>~NoL)J>e{AZ8WckcqgZb*q zIWIeklV*Rx+0b;BsRG^Q5Eg!ZId@~ofK>KOrVbh=flt`h7f?w86@ zY~ke!PYz1$5w0K$?&t4k1TP6&T{VIeQ6l-z_RqK?f&1TGYut^g8O}u zo>g$~E1q4b?L-dhf0N4*^csQjeL)>n;j&}g7TyNy+7j?)HP>1O0c;!-M)X;Dr)y5! z3Ma(lA=>at`WX20yVyX_dh24j1Y1^bj#^Gg?s*z;ElfpPnH4a5(@;r7ZBa-t2;%uo zjZM#M)l0!#c9%!fV#|5Xq!PynQYZqRJ2XbuLvq+o&VybCf3&q%x)3L_1uv(&{QYFn zj#4$(=>ij^N)nr0ZZHD1b8f`bN4$~C#wNV{vS|aJY`!ZODoSr3{fXyo;Mu8vw{Lx) z-7(6<@7D0MS$=T?8_Vo(g{+dr2K30dXo%E_sWkb^kiHTc$}7*Bbzvt9(X&&KwQ$QC zalG8HHHjkGe}v$ip@VlxNLq_n)T{_^(C3LzUWyJpeSjAXl8P)jbY$I@jGB?7$z})6 zxD}CF<+6FfF;b!SGnQQTEJLCVI@;_RkR6|bVlp0NGSoz=U=yXnO_T~aQ7Ys_sh|_3 z!cLS5JW(q2M5*8t<-$*t3qVmW1Vyre=Zb7xnLCK!cpW0q=?Ow+0iIA z5szZUh!jcNXXaBc^nDk2>4iDZ7P>)r^W^(2l5Eh373F!D1`1TwU%h{uc69`=kVhIsuB#I?7zLfVoRxT9YAIJOGLAy605aQR0YD^iJ9DV5X2 zA_RpR(>qb{(T@_5522jmvmck!#MUH^Pe}P_XeN1wNo8)8GLko#Tt-1k?CD$(&{v2y zO-Mw}^y!F*VmgTGoC>-#A%ziFxF{m+tzIcge2!e_A|8dtxZBk%8Y z*Ep1lvNNu{g)DzjhuHu>ivZcRSIO%6*LLC!b<%h$p|0&bh1m-lc=Kt4JfxSISS&U) zJi%W^jZ3NbJ7oS+ZUZJUC^BOvQh4fbspgKzG?eSDcC#pb|4zP7qVxnVJ@M7iLY6DK ze?~{gUV`7U+`scLy{&$8qJY5^XEf=NP#yq-3kDhjBY7@OrDB7Z`rF(1POP3eFFW0) z{e^g(c6!v~)Nb{=gX@uzd;~4qscHN-t&zi&`<}fDP!3F$s8_J z^Gl&1G|)Tg#z4x4+Lf0g_+)y;GAmxGt0I!JqhVfJB!SsvHrMmi^(|Q{f6~K8=ewHp zULB{MSJhi2T#IUmZ}JuD#FZqWWbki_lL~ibEv80kN@SjlW>O#r`^A_q!g{{de^i5Q zjozexdW{y-T@KgaDz>5LBTDwY&a|5AFtPSH_0mCk%tgp4AbEt|59U+dn=4}7?+pl zlXm!JEEUPKSIJfpPef(+M;FJe{q5>|L!tZTJd?ia+l^v}BNV<0x0~f>#r3bDXGGV3 zemlgHp&W9qIIe_TL!=X;VnHH9w}fCWkdJVAh9WfghB@8BDoTba4kK*FaqIQ<(hxB{dx1EIjDaz ztuN?O^2^d}3%LB)fYP?Qf3~)kAs?l@c9U!&#UEXJU$SPb3Jr#NM3ZN;=U14?a+%*X z90xfV&!;uG4Gm-srOUex~$v>8U)uvM(w5r7VDYWpQMXpcbDEf8%3`I2Mv}D&GO1 zPXy7o${|1z8DAWIXe=E3g*_;(q>(yQH93|B1Mrj9NuMw2F8kN7`1ASmD|N39Rpk() z0*ehLCZt?kGL>oLW^ZJ(yv{y(J6mLRAx@l`u4 z`rAW@jWBe{%kW4-F3;Oe^nz`*o_u&deiSM7p1aN{g0q(k`pT~=PE+rri#J`FA;SF* z7_{lTgMa>0bA(b4nPVwSoMMiK#(!NK)`(n&T*NW0B-k2qe|oM1FfQ#vAgCw%2Fr-h zeHn`&wGzOCwRk%gIa8ldlGT%etikebhc%?wB2aQ~eE(Yp zP#cl8E9qvMr{dCVS3k)VWB8vCHO)^%RT(>Te<*b0g1Q11(s0?AebcDF%FsnOq93m) zgz!#a;Eli0a{>)aI~R<(>k6VK2C4)K8=5g4#)`zLo|0xze5Xlf{huA?XPssd%|= ze=ZhNII4rC+rk@NH$X4P-16&wcgM?!uJQDWEd;fHl`&`ER+zIr2Sh^FtlhaVmzC$s z0_C~BbHU!SKB33JV<(UNEGZ4x288=c9PW$*A8QC8SSAGv&*{#UX*jf{hIP1djo^xR zi2jDAt^*r$bTf74-$E(ij0WbNFCNWhf8>)FH<>D%kQtXg{tNO${fs=VZ)--L?p*kf z$a3Xigxq@5C~GY}-MLt|;F-%YGdZEwJ&V1k0c|4&leIz10BYx2yG38mhE<1dFlm?= z#LnD^{fT&!Guf*}zYsM10Ne>ghA zd+IQZ?gM{$cTYr9#+Y}$%2?2ve|w7;|H!>#;V1Dp*uxAV0{8L2MPM7aBcrpLgQLzE z-ptAp8#~`_fJ;)AB6YU&H3>C7=Ly~vr5-FPjLR+S-P+&7;o z(~@z_mYBJn>7(-$qF^~sSO{1>e>}lw&Nr;|E-|OTM40&FC72tq0!+Av`o~YyPBk0V z>e4e09WXp(knsLuZo)EoTr}os2uF1h>sPnLUPc@|Jns zHe_tG7exF;M8e84+-py)W3L|~3d59ntTi;?z_@?$FI-1ZjvWEBx*s%VHHBJ5Alf1ZkbL)>H3f>JfbColVHImx>!`TiF3p=zLd>>b6+NN3C& z?C4bPD117iR}yo;QOKXu>yq z>kk9b#pUE+bcO8oni{{z768~V(`p!*rtS~U=HKnZu-{7gh{jCl~UBCJF_p3o+9#O6CZP1R%(xv~fQXEzbzP`N@G51toZ zU#Y2`*x;UY2_tFIf01lbwSjSIE>+%!DtgJ~N)*=wGxvVHCZ;81#;XnTD7;MY>|OiQ*6mFYvFc*Tat0QIe>?k~sJiR5q) ziF);|LRHU$s-6SZ=~lry%>(N!2duNLf_0V$*4rGg&bJEIe|a8Q?=!#xE0CsIIj}@! z{?=41Jme!maV)N1y)^18f8tn{-lV1^PSP!rs=;#Vt~3a!AT14fZNqV{SaKQ?8Vl+z z0xyn#Oe4ZT1z0^{@g%Qls4*16+bLY`Bkj^90=-6;!+w|NP!DHXo;4xIz-V>sUjOrz zF=Q9DQcHBke`Pl6uN^NYbO%ec*oFX=3uPYvFV(nuOhR$8sT}B0n5h%@x4))t^E3j6bUk=!ymDq{DoxQ&~KLB6c?tT&&Vrn=e)h-Y5=zZ zXjMrZNiv?vrOcyD^6^qTjYb;sf+kY?oJLyqZNo~_PKG%mheXu(iI^1}bmPI@=m|aP zU&W4de=6)aJF(*Ap7?y+<+a8RGp?MRG=*h_-DSLaLNh0XqdPcZmQHa_>p9k%xWNle zgMmxm&I<3nMcEd!4NV5Qkcaxgoiq1B7Kv*<0Z*(5UNalGL5Ta3>`dn+>`blxHFTF} zXsVSt{^~ZrSa5+gyP0|!vsbsBb=fqFK=m@ve+}@~yJrk@!8$NhcmlEyLh}Sc+^a^@z!&uGDh41`O4VmI_v+Ueso*p9l$&X+Fr8^hcsvHga z#6SgtNiqe(-ZX&Cn(G8(c83_3@NSl2?d0UGt>z0$9^UT-ZWxl+U9ze|nPfdby2r@Q zf2=~X$(u3996(wWcLv_W>Yhukd9xt>iH-s{S_X4X1)NbAjT49J__ZUAEl=(q4yiPe z(&Qq?3A_?tO!;PsY4j?cXuGy$WG8_>IjQq}e|=>(s8m$ML>r=5@fdj7{IMu4N|t%>|ADtq z65t5aF{T$FR1XHPobFm`xq>~tW>aBmV_|Az8EP{bx~5fKj$$xlBfgzFcWBsbclsCC zqfx(yJ`DTU1F&n;Tk**_2I6h`3$x$)h&5~C6?F*>qfuvsu?OqW(a8zO6eVl|f4%HC zW-PPhw!XG;*}OJKsQ!0uSMN&`DY50iBaWtHpTX`->_r%jCpFOsGv=M1p1syQISiWr z67%L0o8J((vqsX@`fWp7dFFf%UGWki9sx_>l`-!gYcPg)gA%?{;Uq9~6;UDq-WNgn zV*1=<(&y$l1qY^x7#sVk_Iz|z_9&<*VyrMq;tu|2mC4SC1A5k~iK^aI$hS@}8 zbCCV-91>Y)w!o}}g$-8Bx>O@>GpAUTSd5Q2gW?U|9Xu}95G>1DPp`s9gdg#C6xgUC zxHG%F;6Fs8u#sP^xUyIu31;J;2ID_%>ABCo!Q*dW>HsOh7PN+jZJ-5Re+Ve7jCJgb z>p|1D47?4!vg?I$pp>Pzkw9u(OkU}Law*)zMH4S>DI?{jlF>^Qy``c2j0-U>g*Qxp z3Vc|g&MEC&eB~^_19o9992uzD{#Ubwm2}j;9+(}7!C^7uvs@b@nKt1qG^G&;VcsE2 zQvv^CjvY$t7lV=7x^I@zf64jDzgfFA)U?F>BXH1sKJZQtZ^O{P`dBVN#>oi;qoLn; z6Bw3Mn|L;|LPS!FR5XBFsCjShm0(-LAXk~3UlKE8tx{nn!@BPrOK zOkhc*DTjz^32A#cr8SZ8ms3YY689an8VapVXpafs??@pXf0Gwd1Cm<{XR3@=jlKz> z?C#EXs`H1SwXbo{GHc&%oh3lXs12{9A-fuXG7d!{mudKovxY(fL@@s{D|UxyE&g>E zFGUIuzhVSJ?WA3oKipGeh%1krIzD%p^oa zwe-wSctMI&moBZciv(T~g_BYwT9R!RIN8o82bWo2e_obTPBY~K@05zmN4fU{s_oEH znKl|Wb$2?v1~ZC<(c^cpITqn36w|Kal9)*nYfJR5inf)>7?suuVN_v_rlY!xMu%K+ z9*%TA7S-bL@YkTA<TewA$8UexSwuf* z9KYQOl@RK1<@iAeH4YjlB1~Gqwc___fZVVh2B8nJ=sLjRpWk`gz&6)j!q=+_LXvZW zinSL`_yjPcw)yM$#26{@SCtba)z6S{k*YV|fAT380xl}nzVZAe-dXj(7OG7va6qab zK;eK1cV`r*NcvK%D2;YZ9@BoX*Ct(wQTvAnqcHs!2>=LphawLg| zjBCE7u0cb^Z=OOMd*V~Y`MVZeny5LnZqjfA&vm}RD-jj-b3bY)e}vZKYX_v{OW8K)@#}X(wTx(pIIyjsGMLF0tbV z@*@TS2Ny&0gOp$0#>CL%rwn3xJi%$~f5!}v1owbo;kxuEMKCosnQ|%7vqU2hW(oya z&vFO}u}nmAL5E)>NilZyQd}EoYspCe-1!4 zyW^fJ(|o9TQVr(6D`Ik1_w>dQ@q?M_NPVmqpZ;Jvo5P$^m43(d;xp`2L#JkG%=~6m zP^wuL_Y62E09SxjL8@k{JU507ykaS@qBYBAjF9m~RXR6n7SH|8mx@|O%@P_ALgX<< zGgX9Y7SV=z743+WN2WF@{rpE8f4zxsl4}p}rK{XgEht1ISOTJ7WFO` z%=gJ7n4{WoywJ!kN^>vKORaN@XK+=#7w|TVjV^&rBF=#q;;v~%dJ3V?f!3f62#+JO zL2^^9UUEsrnb(+X+TA&~cXkkI&qa3aw$aV->#!y6=TUyyxtB+qe@`@=(Oa?9L6jDC zi|ZZw*3dx#15rCTdePMWdru0t<0>AopNQTX zlubDH{ig5Nf28#N`q4|L@2@fHxu%$Bg`nbsA;l#Eien_Uf5>`g7qYRUsn(%0OUD-h zrb^+)1AAlnR_M{ZEsG=dTt&JGB4CCr;PEzu<6BejG3cz9R3<2;EXuqF;JeG-|IGIq zfg2RAdxhbkvr4_~-4_x`+qRhBkt~_mFLH9MjzTYqg5)A09)*KDXSuZ36pOd&4fhMs zo$@>DvTHvef4NzqvlpsuR^YEo)i!nYHU|aToZVZlD@5*=Zl;rLrcsP{P~i%UV*ZaOH>AI6iEgYIx(owKi~ha|J4-kZ4G- zXlj(R0_~7}r3?)>PDhB;D8XcCj1dKB4ubH}LjwYbe?dKl8A8PVwz1Yrd-;pzky%g` zt+Y@-PNOy8@t~9LFv6wI#w9XU-Z-I%esZXvX_hZ1g%qDZoE1B?fR(L{?`>>9bnM_i zgYEsjfRwQOYU%N?=Wa2a(;kD9<2_KY zR}7nI*AZqn`L4B-TaXd?2CyQ4iB5vA(6R&qk>1pdxO(k{uws1${r?HHWcVOssy8NI z>+WQ~SSP87GO>ulaD*oa+&)I&qAuhbdqD28e=g+oNT921iF0aKp}q0lTv`c(lbsmA zQ=)vaD)c8=n2DRvyFsS89ooO(iQufmtpg_Ek)~ZE9M|@vc5jDw-cp0RpCACug6B; zzJ#b^q1-}=%tHAIg{Z?+Z9}JN;+eJV!py37`{woS&jiW+87Z3IO*R+`FwJHq(~v|J zNfHuoO^?cXlCbvtYEFnm#X?IRG0d;2L{2$Ogu?9_mID0i&hwo=Al;}dfgBZ7y>pl( z(eE$3W81cE+qSu5+v*+Lwr$(CZSUB|zVrRz-uwQM>Le%0shqBQp6*kXPm1Rb2RLVO zr~l@zD~neocgfN~{a%={Bg_VvnYKctZJLhnkRajpIrBh1bajAja?V;EZfO_(8@4a3 zrf6P5-K`RQ z3Bff~mFUx@obFn%claai`HS3#TDoPCS;g~uTPHuYS1Yq<;tanG_&PiqjsChR`i75l zFRRmYfu9Qo66B)od6fskK-`I7b9t}yxnL|77y52yIZgB^QHF9RjbiYWuTRl-dk)AM z)jL^vEv58AORQtz3rG||b~~0r$TIMX!wKhm<1MLixC zr}B*~bu4gQs6w4bjt56AH!H^~D6x>n8P^qmF1KXY?++j^7C(t-k@ymhkhHzfcB(*< za@_;%U-8q?1i$4>K?c@KN93d;@pEI{-duN4SaGQ=DT&UOdkF@tzuDmbU2)&@zh)Ew zItB25)ql-a6P)ddTpat3PYsKFN^?E2Y>ksT$yL*v>`n~x6kb<%xA;z~Rd^o;=eyUg zTz5C>I)ySzFT-`qeRG;FeSNS)W-liyZ+o9+cB|T8tg;dKS{L@==!YFWDwl8X&A6`^ zEIYWxL674FQmF!7gwkM?;BUJ0k|F%Chthi^)d$~B4}A8;DwR$cJV1a;SAXrMUgP|J zTUaLS#ZQIqwqTq1Yx*Jn+VuEq=u*!H<4VZnszDREhF(s3V2*2f=tNf6_T6wWpgqpCXsx9MVTExwxga1Ty3 z1JbC-OF0J+l&h%xGr14eAlg`PJO0Y_#sN~A%aeJ6RVypkflOE{mF%@F%}jhbVGwOb zLNxL6E!UryW_yYfM)9U7`)%vFsKrq;RhL3yD7*Zo+)e6AnoY_eY=8WRRUR~GOtrcN z)dKyeYSR{~Ofj+m^}Q$t^b2w=JdCOKxVhM&fsq_wBlns)ud(%8CSt=)cKbAm4 zg{#@U?WFG}q&RMvk}W4zRgGpPO&tr(1{&KxFNQO*S6g&EHxs1qyMzjU={aJhFi6UD zo^Z4+r4@cY?Spj8s-kRp(==sQDqk{d2iAtyOBSkyT}mOLJrb&|6-prgefsa|-xtBZ zmw%rCfq%RIB&=JTV@L011uVB@l;BRQPg-yrkJ6k<@Jz~s;J|#)Q4#_Zm&yso;BEg} z(&2jS;uK0e^e6XU6H2BJ4$oYGDufbx_bSy$4#wvkSk6t}A8!76+q*Q66FOxaD29)g|5%$WEvZ=T&83vPATPhqE>{KN++zSROm57)5nSM`9 z_fV@&?%Y$boAIwcxEZiDm>vi>NBQV_;8bs*P7Q&jJC9>gj*>N0SIG6tik6X)6O)Jl zL>U8-oe^D{r(;lp#&3fTZHW4Ldm0onBHZES;fyR}K|$cGD`ChV&))QzbAtC|JcLy3 zQ225ao;s9g$x@?|{(3HHZMl|gZSz7!glq4Dk&(?i7P-(W@*I(t+v}{2MKc#8nQ)DA zn(bVBEL}}SBYD&$Lnw+w5U`7)yQkO#>_kRg52^@z&T1qXq<**g_Zd-jahb$YR`px( z$K2B4>o1l~^;XHTxgCKYX%z^{_XNVGscdR*@M8cMU_b+5MUSpNKvI(M$(Krvp^Mlo zCCaJT|CIS9B=Y52EyeD$@^dBm>~FS?*}Yx1R~i%oXOj(C4n!H)uENyy$N3=x`2B?r zZRa)PB1Pu}6KR6k+Ug)L=p8|#2SfbUUSDArVCd$C#&)YeLW7G0^HZ*?Ab8+CU03Gl z$B+i#9WGc!L--{OVcTioivI4KMA_Ryl*HoC_<_-LanOU4*lw)~C)P^0%0s=6<0g#} z%B=3W$t4nTw$F38d?X#sBT7pEEVITYIfW>5YOv%)lO?Hu8cErAk=M2$TEl}+n~Ra? z;s}#&v4P}}V`cGv!+_oh=r&!4HN&=vfpGOz@4#P{9;foy)x2M_Ev*Ih< zZO5Mh%VqeiWmzrI3>wsOx9Vd{B@r$iEWcZ|HfCRaKco`-|I+xm72V>2(}1%-Gh zGnD@w*qGOWOKm$y6-e;_0MF8X_BZnZLW1HD<+3h%(5h*_*QFKR&_(HFrCu-fUdPh= zrASw&w?wR5OR0%Z&DKk)_QsJ$|CrI$zst=kPEzW;XADyXhni;yZzMVwnWjsHO1U+B zjwGVpzPWcz2*D?JAxlp9NR_kUz{qUqCgDT1(=+Uhv)(Mj%S(CzkS_Yf=a9{kdtf15 zL^alX-fgj)5#)f+>D(?kn~JvqoT%%N%bR^(cJr~6IwT*maCFkZ4ea39v&%}tL&-nS z%6qIDpSrwTNQ+pVg7WhWG=uxHbEvpmO`OsKF7#_iky72|6G&IST0}7n&AJ^J41hMm zS9q^Pv3$kH3iU!jDWK)ht$~=A=EK+(AErF=lze^`^k+viYv@O3b9t{1)w;Fof z6{4n(ZV!un-#?VPK*N7~sh*O_I2CEcmzMbXOc?~osot_z2l62~DA0(X5f;C7M{k58 zoUk_(-~i+dDCPKlFb(T51)rt#)Khl^5_VNnK@s&t)8Kvq(6}TY`cD<$Kt$QE-v3^0Zn3NZnb79C@IRuUv`mpF;sBMaGug(#iZ$SzTcAqN|t%L`gvFBu`2Ft^w4ZoPN<;>{Go8eOWcg{1w%wc&N zeMRY+Mmy&!>WMtd5$`XC0tB+@;tb1lJ2gUho7DQ}q}fl86! zmdkq4@1%R_e7|Dx(_+xkdJU6@FQD5^H`g7!>Gyh%7ASdkgU7ovMIe+`Qa{HZmdp82 zTry4NsUVDk=xo%o2MFQ*C5xFp|6n~GU^Vwjq`z>TFj=ilh|6OY(h2K}v0L<-SWHt@0)`5~@UIziu5L z+`z}X>Egi-n9o(hpLFsKd%crn8}S`ycQLpEB3z}+#QoK^l&IS%cl^&hmcl=u9E1IE z%X9s>+17d0xIam`S-LZOM@J_EieJ#G)nO>yRFMBxCoV3=R;PT|J9;g=&T(^Kj~*>r zW@X{J$EFV`1m7C8N}_~Pwt0`8{@qipyC^nhCrh%VEHgbpjp528=_sRraZHE_BpcopbkoCzWGG%EZkU#a5Q-G{_kw1+;jRl!(ic5& zg<00@4CPu=$H@PrOHGQZj${ip{l4MkL`olhkRjb~UV^v|<1WZq+&g1j+j)h#6zXSR zWonGAiCTvZ*C;|1qACJ!44gc|IEbHrT5e}5?p?)C{g>%iXCB+-XHmxh;Qm-JG0+ZB zVMmr@o=i&{G{jWFNzc8eY8Tb@?2^KnzDu$|q&;P)&?&!BV)OUgU=ny{&?bdesWnCY#cq>3WJtWcLve&m$=Em6h?lZNEI6CitGT7_djWfAi z*7E{`tdk#d5qJXPPxtZ+Sg1FdvouIkPIoj6>N%kl&lS}(uin2F;khK9++N|NiGoZi zP){m?r9lYox#D)LDXIi&l@OId1Y_>-tYyK9VHlCX2;?_ljpiY68Fm#MOHnzoK4AODK0 zv2x8y>~f=D7AN`?5Pqfc6t3t>%}VOL4}GQ=;L#g?!%Ayf9kD3*n>Z;0Iy$Re(S-dH zvG*m6x=m^{(i{}lvWFuTW6;Y#G7VJSF53bAS$S&ef^0Ue`ex95uWR@{A!Nwg;;?OV zO<~<;1<#-xW$HAbW>w>a_3M^|OHKgQA)}&04sGF|Epg2j0E&o&LrpjHq?FnNNv zoHbKPCkIt#IrYOIG<&$Q1w8fogeje2ssY3~aK(jHSjLv~J1T0(&fJVNE8jmFHnUE0 zX*rT&JVDn;_UtA1k!EdcVKT;&tD-@yIQ+0sRU|5}9-?9O%qQ=$(8S?3dE8Ka?IJjo z0XB&Gh>VOA@U7pG>2t9VhrX2eFQ_djnK!RWDW@n4lu}TcIjk5*D1+=B{jxRQ@OLfU z?p;7bv|`Eiq0KK*UP5QbPPgu14IlM6G-o|W;96Dgur_@9tXHV&eNdEfQaCLiIO0S? zO9ri>Hr;-PsdWs0fQcq#s{_C+viTO*_$qxpp7GW~Pjg<>Hpiw0jUc>wH!ac{ z3C8PqyzxTxq!z0ZqFu~@FVtD%pN*%7CS>|2&e?qYi>o-lQv^Bv9(TAe_0~Y*+T?XnjI@7LXNu zcyb%v{$0S?^+zYSu$rF5H`M<0Hp(08iTeZwB2B4V&2y+tj}<4&f#7(`@?AOh6%YPA z1)MS4opE_@$v$$P_ED3C&21B&SRbGdLrD`MBb|H!g@=;a*AW_KPKl})TSwp^g+qy4 zNL!iCve&3~mC|SFk~Lu(a&kORJY2m>T49IPRaT)9f#c}wVQ%1R-_*yhP&a)I==snO zEB}M{Atvn=TR)WFt)>x;)j#+kle$Sf1swHwM@s|XAVM_n)!fr{40=3m?e93tG23*hHvH~ z#H${!bWFNbubGY6d^hz|I}M_GeOq)hO_FE~aqN7HJURXK;16{O%Ei91=U>H}0Y+t- z^BT7E47)~IY!FcT=J7E}Qs?ovRGyt#GBx~Kp4K7VGDf4w z?g*x79g^0JHSuw~6^G zmSFL*IT6|uVVOq8Ju60FfHPYn5P7dH6n4RPl?WJO3u3Z_XpJ_so7Yn&yVe}CFw4m@*05wF>6!UVnNAx4>^h3+^mVJ332A+%=?)OhtLXC48-`uUULJe2&2>QF20M^+$Ce^1u*7!fF_?+nYPXaCCHvzJR2d0Hss`yvBy4e*RTDrRSws~%(BMz< zw>7iM%o>fuqTTc7Oq!I&y=jk^dW3PMpLEF=iwbkX6@+mKfYaofg5@eVJ)u5YfR^QJ zsW&${Q}yxYCMXqqIyd1A%aaNk@GazdR%+;_Z`MI|)3k-8_~*iEo(RnrM{uasdRIG= z!fTU6`TMN9@cqtFWmB^Tk2t{!!u@v}l%MZE`~*IHu*oMSL)#eiov#l=W4g;dUl-sz zK4$!$jo-K5fWq&Vk-W|}(Ein;GNge`qWwUS4aeP`Hb}ZFvx~O<{Kl1AorJhdb<%w_ zhYHtvIN?VhFGu`EaP44(qqq`t?R}J8bKw}~L!N|v5s;HuozW4;8&1#DzR4k2qamrD zxe#7lMn`=rE^08)RhHeneVZ{3x{g#JMc8NWbnu=s0RDYuhv`h0`RVe$6Ile@&qHi( z+@fOB_E_3MdEDCSKMD-t3N+EPY%uL|#$^7V(jC>YagXj>5D@+aqq#P!30!O>v39U)P=il$_;Bh0-Fuc{qpZwBxw6`fU(APyj zU`=1um}dt?09as(<55UTIiJbt-SFp6J>` zIS8~`_|e6#Q$#?6#h4smXg;7~*vQ{s(G1S2_ z`LbAs33;y;?wqX=RU%c`LgxI(RJHLZfK4)Qvxr8t^73)pcSA&bPIX!-dtOBxG*G#G zMXK8Dlg$%vceir9I@_%p8(a2C&y;kAG5iS zVaGsg<-yC=(`gg0lnkkE3cjg-LGT*h-zumMmXokORw7iE3lz>{-U;l{t$oTHv-yjIj`|XtNq-5d`~JACbXt z!-Y`YT&Sz@y5aQd4bD5X^BaFnKny`)`jg;R6w(>G=D)yYj2c+|4F4+uPMFNBkWh{| z=KiOuVjmz0cp1QaaBda|PY&EpghFz@m1OnG?(Xl7@`|x!0!VEb{+ zjQ%1Ac)b}aGx(FvGYPVd=C0d@c`hF@jrvyE`xLgktSwz77(9=W1s&3Y;(-)~m0;+Z%GCxuMYcQ697an+oO^a)Pn zyq3LZ-q#DyNcwn$k^qW1fRsCh;%B78a2^kSx(RXteLn(bu0SjQce=gzU;pZP2^&ur zmmx*W6hWa{s9-fLRI}qUMwYpxwj(7ARxs4}Fb=KB!mN~kMRQGD!m(h;nB~vSNC(f% zwx`NHqMH|6E$%GN4QG`zhLm&OH@Y_3|Vkxl2P{>WQ=2103RgSPi4%#uIcOt zr>fA&QO(B?VD!J$D?%OnDtn-?q4NCjgHC}$%G4Qc*rVX5z|<_8!57p#HIs!Mfc-X{%N z6^1Rl_U?5oHEP760PL@WQ*bQ!2-4Z|b{wnGFtO^JQQ?%Uvp-s%*yd#!deare`{jwU z)r&O!`NR60N0F8gi-O>|C1ca}C$S*&V4kFL9Z2ZG->dt zsbhh+vr-2819V^mw*#0#0v{PMnNdsjc4;C-l&DdM`Wb>ij>t-_6|t6|Ue>qTq^tGb z8JpeE1ot}fs?Kag5NZ$&ELc(uvZZo7{a6kQB4t2vskUQRRPv%VXjWpB^0MQdc;cgS zPS}mJ0JIb%eNqvqUtAvFW}j(n3SuYzG*z`6j|uql00JI{NR=K#nqU>zAg5(!F=8}> z@2GuI(+s@>FI;vCVD{9O&T)IMj!o1#EyC6>e&ak{=p3EM+Tr%5-MPtX(QKtvL~fT)uKw(c;4AbO zoktuB02q&%k8=UgM*>2t8sg=U$O*Ge2j<0``{ieTTbdhrYH?VIHEhQ~5kERzHO%hD z78lG)Z=^0Q`1XiCW`p;sr_lER7v{4x+b#j@>Bv$S{?mxhAx8I*jl(`YAV zF%vt>mZ27`lUf=w=FsDqm=PmQ*FBgdAH?nOYH#IC>OjUg$ElyUfsbh?Hmcf4Z5A5> zz$*^MOCT|hbA29_)JM8$VJP#UWz0f(T#=(Njg>(E9R z0(#0GAyO>!r|z#<8kQ+r03XkypCiWe zAqDH9$x541LyU!T74ye*6QAa3V$U^Ha~Vd^WozTFav&%31$zO zk@NqlG@IaRgH!#zgkt7zAxDf`^~Bt}%|NF0FOo3U3xHHAkg%|VOpv+f)w`&!k?xxt zw7x3)h%?JI<3(Nw)Q@OvoI4}byu$ccvd*AXNyJs8n ze3nx6utw*>eE;y{z#n-x5G!&ibi$9de8la1558wVElXmRT%!>3FWe{9f>{^S#H;llS>bwO_>021=lY?AI$lAyUM zJRQ8P9AqZK)tR{beG#euW*zr|2^2tY#Y%76;NGB*QUn7XI|#7HqP{QBEx$L5bWKY~ zaDX=yhe*L2yl5dr7C0-*ZW(^4f!W2h^%Jd9J2Xm=?qI9Z*8l<&tQy9)J z26fC8iM5D6f;CSULrCPjX^cRzJhGr8GOwNjL&#WxK0y47K47Fr7ZhnPi|Ipoq0D~i z#>?VAbUFSsx0ZO3pMUb-yrMJT5ezfis)(^dP3TCDE&|*SUzm20AAj+G3|Il@?tH9E zx(LyH?fBTD2_=#zm5o5Qc&5} zn~&?Ty$=N(SEaquUetu`r8sMdE}y$;pt|tyH_A{uJgCdeYo$~+pL;vi{+`VrR*lhts9XCamaX6`=3kDO7XL#RfS0thkNdQ9Nzz;jtp~| z-9&R4jRzaFP#tCY%kjqIn;)w5Y z7^;Og3}xaP4`Kh20rQby%YWN@*t<0q)am+aAD{47tfkN#T?*h^Kf!P`~+(Opx$7Ppt~rT%1Pkl_vO zXITN(%ld-)x$vLCAO5J8|3BLQm=&LZQ^B`p-P)A53q=&FIN!?1(7hHn|2VJwIBP$F z^#<*7wv8@)3X{?~WgSNJ+PmyvJ#jDQtoP!>n{Su@j*?6`>C7jV`m7g5Ri zc}fHKuyW9ndg?JWx3`jzXadXAfXo&*;!NuHQ8@MKP3qa`(KNZ6+{p@ZCyR944wU6$ zNK^X7frJ!U^~XddK~b7(ksyW4yt9Xe8gb|xw>&Tfx;o0QaBiaSPCSd#NJou0j(CK> zR2|2ti@1iMWvEBNFq+J+0{|y0jd{&UrJ2o;DCpP^ z2)bB>*86hv9bOf7l@8lx71x&g9o4Ga2*DRQMd#AEE#Vzr=+)S7O$&_{%VVXVT)uZ}!Ib%F~zD^dFEC4}eNn{^^4_O{Ds?k9Ko|#qw0C z+W!gwi{+%bb2A*P#Bci&&eQ^fEZp?R{Y)E>0zz26fczMV#QwPHivUJ#B-rs5S0PM_ zpHC0eAjb*AvDZ4nC0j zV82CuHWH?u0vL(;ZK)nCNe)!fyQm>aPE-J{yhi+LIUmts3Z}ngfZO)T<^9v(#@ULKA2LVMnya zlZC(!jem~7Bq`?;M`6KU{lP-uBtz|*M#c?UsS#vo7hvdr^wSA4S+L@jN5~X`O4%|`X)?<7x}82LY`pX-IEsiyFkV@8=x6-`vCuox+)@9QFpS9zf7pl7gA;xl8Kq9I^KHGmiY zWH2oPURZTP6sWY4m()*b4N#mgOk$%nWt_lHLdGnHlm1`3K;<7hA*%ni`+v-S!u^jK zsJP|-V`j5VxcU=k!WAnj;b*GBJ-{q$FQen~}>FNhy8ew4s)?ke8PJ zDnzdrW4DP%5O`&Kj%Mu_a!UVF(VZ`iod`T=4=_7W3P{8r0Fii!D!wgg8_a^!Jto4W50b_CL^qIh9uoNH{3HyVXQe1xQcqJ=h~rh7ZI+QInYt zL8*YNO0&b>-ia3D`$xt1*OxNgl=)i~uc4eWDgq}P(Pps=La9d7 zJCvZ3DO!#Mn9xh-d1wVcR8a~^)thHUYeMNqh*|D1p&1g0A{DL;H>N-yD?}KYBvFG= zD>qeITQZeR0JODXD;iQtR!eoxp3c;n%24f7l82bel3sDACoNUIe6f@DbIDNyrCsZI z_%uM1wFx>@#I(;ohthHJsfFjkC?f=4*O{p(RE!AefWoMgCbX?#so6F=REF0}O3ifK zxz#|`v{GY))K-c;bM?jaxWU!LQcn(nsLvOEX76wT{LD^|7bwm2o+`y9m$=KeRxX{| zU(xW5qf?{sh51h!9i2;AGZn@*op{hJdtvVs-{08 zK7Zf1>M+SZH_d`qG!vv_Jk#UA7$0FknR`%!O0#z1uiYr!FS~8_gXlvtot82+b z{;b`Ckz#Ulle*G2wSiwt#JReupxQIVXr9yOxM|(Nu(>B2Wq^tvi}iA;(r_O2N3pRY zm){vOYwb~LOup)^%%~vq*MjN0$}q#vl2v_;{P_KdDTk@_AQgZHdHleM`EeOTH9d-0 zA=8T^Q^X%}^3TtK3@AH2&&lPU`F~%#GN}X^LqDu1{WWq^Ma}kT z9<}ugQyK164{UWq^9QqHgvE>Lo|>EE&spkjk=0e0kc%o(x3?KnqUmli#mQp0Lsh6c zIgSDp-7pnQS4tlQbKpX>QD`1J@?bm|7rhhtT ze$Hv>^rlQ0@PoptjqwRN;p%<<1*Q?^rT5hS%UzyowOcvW)nPNvY1{hAtrTs=cMU+K zSmRyI|I%+?s{Im~p@!^Pn{?r)WcAWjNWQAny_AwcI97S zbeDNx#G%Ao)n8kpEH{n}QCcM3+ykIB5R3O}ND=}&r>giY%Si}JlTH4FDa%M0%BHj; zw_-n(ov&wCafzBn%{F2YGnkZ}pJi5gte-;tqG1usbSSZ~o=P z{bYDNNtnU;41BoZ*s;(!)He@XvD|k{n$u>W1C+z9UuK0vTwD&6YP#HN>e=~OS$L6w18+;^581RMmtomQcgz-*xrIW{& zd4UzAP~_#1@6B9Ovu2c7K7e_)ydCgvZt={v+x2uy!UpSS10EBw?1J! z|9ii#3z_W%eA?eMl`~-}oB}eQTXP)Q*z3a!2?ir`d~YmiW>>GTZfA6?0JOS`-z{}| z5AzSb;O;GW_&b~z#g^>|y~1EP20bNo)pHB#J?^#n%c4Ag;in@n{Gn(jhh65pD?K>? ztr+>}Uf3ZaRx3*wD~SRrkj?=Wem;+}|Ef#SDZ9r?c`m2SG9o3NLIELj&2k_8`l0?S zEboEyzfz{Pb*fP``OhW#EE6vt_VX&IqwF3f7i*&4j@vjsl0O$%?QQMmlh`nJzW9Jk zo<>!sUxO~Kr?u&?irY78!hNt`*p>|cXa=*75?XBRL5J8fcFfr*|4|dR#V*7bf00b| z`92nC(SNP&9Nps@#Rs^WSm@@@xc5xnVa$($$cON7O(bEEkD$W6B$Ia$8wccYU2GnC zSml4w@w&v!GX7$10{x7smt)NuL`a8?$4z?|g-=Mx_JnZ69k9|qt?LD$1$wT{kTKQT zQqc6ly#7{r8Dtb7ql2jW`y<>+*`5UnFK9f+37PgGs%!m@S z5^XKvYUj(&-oRas6t%gbrI5rpPA>A(8lqzJ+Ua(M=rG9=gxv>H0xexhLzyncVf ztME0fjtQy3pGN@q)ri%{ZA-u;b9k|WwHc!exM&6&G}ad(MH?F(t)6Wgr8Bo1bKk=o z9{s)NqbFS2Up&`?^Bf$n;`sQ>oXv<%i*NgF08W+=6Ql}fyW)HlIib$xaA=U-$ibiv zNrmCMCikd3$weF$c;m~L-G30?>$x$tO`tN@--u?f6or6FR|v_#PajKJIPfbkV3s_` zD!I{I^ClWTinX>Cl)t~JyVDf_0!DkmmRsMco3{q>0Wp~8XN3A=(F`s`u>?dp!n*eK zRK&K^9rf%d6HXvH1;1{ee0~sdW1-XAL|+@B7Ghj@9zP2cSqjqMsA^U;O9xq$5Ve#@X?5rC|!mS z^}b>M0oPFqOk>6z7W)Jrw`^5yHJ+y)5Pk6P;>_ENJ6lc1F?|13E0ORSCi|y71iXZU zwd4*5R=k9&Lsu^fc$L-^Yk|_tyo*H3uSJIc29p&aJl}J=TL{I%TErzU z=y$)?nowrFn4xXnFTF7M0H4VN+kKDO=J-wvKU1igq}uGf{==^i^HZB zpbW!f5Vf(O;KyR;B7IqyUQ{ipbO_38u;l>&StgSvAwd2T`~xx5=>;ncqhAo+G?#1T z5){Di6jZxT?7wO~K71T1rp(Pu+c_>~#CZ(MoC z>ljIo$VGT{gp4~8%IG90+}})oqik*Ygtk^ryCxFCxqO@VtHO1L2jy$h;aRLxFso&s za4ArQ0)j%^P1)wa+av0xixAX#NZ0@{=z#M1{{3}uN2ys88z;*rT#5Jo13-ibzY{o6 z4g)TYwY6&*+k>(Z-fx8}4KL_$BQpZ4IXc>eKn6{@M#*!sa2D z+)U!j&=$!~N+qNY-HmgSpZH@|3`#v39l9gFfy76Duu-X~UerHd_+Jll%ub5u&xpuW zcKt~uYV04yRuFQ3vB0RjBJyg&{XU+$#wxpGfcSK(ad$hLF5e%+M%f`Z+Bn@|Ul;Rg5_4)=x8$-S2B76+RMx0Hyr8PUNv+uly zbmV7)j~(*AB5}THWCgA`@3m&len2pA9`g{H{o+2!<>5YQd=|u4H2|j;gyT2OsS7In z2q&qJS0aJF^XsYP9}7m}Xlm2` zv-rpKYxkF#kv#XqBuAL)*r!eJnNkMsupz&=;`bHbV4z(nl&1LR?+-@!(j`BPu$i6f zQNnEum$ws5kVdL0umccYjySeoI}?cM@$?z_La(Tvigzf?j(~4MX?#B!8SU>YIJz(b z7_fN&Jp|0kjtNPZ4D0a?d2WOL4PNt6kNpCHiEW$Y$GV+Fba%X)P9@~Ds)1FxNnf(slP#g{A=9d}byRJ8s`3s%v^qUqKqYHQd zO&snhv22Z{BnTXf%z#YJ$WCFB>`o!pj(tKbQrOj(wu}PNdjPCaAVX|tvJ(E8NhS}? zIA<$N!8Mx0Bgd4p^&Q&d*;50|b|zihHJ1Uxq6LU%(8g-8DX&uC_r6;ZTwKDDWdp70c^e~5 z3_+=kL{v;go_+W!BdM)=fH#KRuesoT?{mCztmMO;MyLS&!PO%i<#@D%9q6Xzu&_g2 z&}gDr4b#mjYT@?x_kQM36(c-}c37bM9Yu!LHk-%yY>qf`ipC5WCYB5PE%D5G{7BeG9AHZeBdflH8 zYI!uo*IIV_5HJ_mSC?FgFac93u!u*;IwS3UL`l-TPp+T%3?EZ`4jw)(18>P*9w2V~ zg6QVF%0cute;35g6P-Weoq|np4|2UTuK|wS7i8Lb@P+gkU_e1)h-K%ZRx3oW6*DPi z2u|PThl*b44qIA2>`CU9;I)evL{efaMnR^uR$j*Mc+!Y={QOpm>ERR3AjtiK9u4aO zm5X#6?l)->LaG9^6&SKeLr3HW2u3tFS4v#1q54Z#^B&->5Ko4p@@BZKAC+ctdH`C8 z0?$=+A#7~Pom-(G)FCBtQbGyf1qEVu zc>Ehfga>k`gRWw{L)LQKrv$Vbq0*^eWZ08Z4zFavq23~bP>oe|0qAP|r+|Z)pIUwq z+?;fr-A%%)h5EpMLwA8eWyA-=Lc#3t*B=V+Xf|M?l~YbhhDvAmSDHe9paVfC=W?!o z05pYJGLubCIO@s`-BK-6bf{olVx#2F#3j2V>vqKhg1cLMMqwt{5)uN3I4K^`Vod7) zXxm5Ay3$4m-gwFHzOSfYF95u}0mdKX;VOiLcN(g$R3eI$vy5bHf<*LkYh;co#OL>A zNNN?Z!H&_`C2|4hfjI~m18`(*A8AK#fpk`G}NW=b5p;llv@kZC@%0SLtgEpL@3x~=Q6w97~DJ_YuenE%;Zi|WefsvNZ;QCB#q?e zz*o9wi`m$*;uG0cT?_J0p^~Mns655Jf~7`8iHnWnE^}&Enipi;mmGm`lulqF7s;+YD&yCrpld@%PNlCYGlJe- zjjM>ESMBsxR8~Ugs0RX9toSy`3QNZ;A4530FxDEtd$Ir&y|es~_BHT)_t`0#hJPf* zI2oNdxbarZ=A7CVUL%lnJw?RcDQnsUQ<81_Ky0y2e^eTjb<1@8)yYOFjliErDg!*Efj=Qg44M_}gb()m4PrSro3(F3sZ-=lQ!rf&=@ z53M4LK1YgsP+4!XZ{cr<1$tgsebj-c0X(l@1PV}W_JIl%Bbk^4F$Nd(;tvuV!xs4U zinD{`m^?AR2@M8UM(`3k_z&W1-<}E!T(B$N>M~DY8vzwiRaV66!v=FE!xG-IQ#DWA z&AsleKM(AUTX_`l;f2q$7Asszaj*y-RUv2s5t{P}1MrL-42;k` z&hGDD-;;{D0|F1IS(Q96V-Kf;Gmc5&Cv-Dp;1yNbl7$Vr$(!4iwY>w|UY;8K4n5t5 zu-GE$Mp(b07$BahRuu0KMo(Q-Cj2MXv+CZFze#TzNzWgOc>Je}jtiQ)9xg zvTwqDPp8dBy|UPvp8$tzaf2taN0jNNIg+GNprq031quSn5_OzGfoBV;ejqMLYHdkz zCuTn%mlUSIU?tmr-uNKJ=PN|DA^`EY;^}Op@8Dq@lpVNmcQB#NLERFFVp9N(sxl@Fd za%LZqS<`^P(7ydjZW)0CA3Oe{%$cY9@LT}`c)&^W(~S(T{hukDX!rs`Tb7mD%tgzW zNVG@u2h`Rc4Z*zyts0~=rQex!;i0;_NP&3@11D}Mt@>q2@tx;s2*yqR8*CF5iXlvD zRl_@2;HUdOYAPr`vL`z~Zbg*EjoL;2IK+=eGA%%XYf>omp5V^zFOZ0u$rFU>u`exl zNsA>st*XSZ(q+7Q`hH;Caepc!ECl>QmR)lfM_;=&1r=D!;+A-VltKRZL0>)yk)ULV zAXk5NW!r|Qh{qA`h{{4z<;c!vV4;&$9PjP@ESOvbWysbSZ}(fbbG$!`{5&4yEEet!Bl|y6>~cr@k17tJ>&BaYPk$`U_T-@AjWn+!{cs z-@k2rLOakF&%cTCu>~i#QUiarEZ)>CO9vf)`;zu{RG94XBTNc!1uqc;!y}nepcR`* zwm9tWt1xBczmHCv@UsNxo0(=Ae&KW znBaw0lVgMu{Jq5vQ@h0(S>VYkmV~sVN*PgzB!8n3PHL@LaI(6MY?(rEo40oy$l*ds z_c5|>XOkR=haJ|xC>66RkVdscsFqz7tycFO;;-Q(UF~0*;=Rv87~Y3K@R3f!$2y0EW!7)RHGgK!E+pTOwevi0OD)}E{z7Uv*Jgp2QS=%#Wy z30y^+`I_L&I&w{s9pI|;@Z!xz=g235YFt**#*@uMS4ce$!Qjir&-TV}fv(iNLQzf< zF)FxP`G`3MZI}L1nC1d}A}mF7XDd=3|4Y_AabN=BcbsNyjY(>2kZ^F)jxsK2g9*sk z_r@X-lFLTEf@<8hSb;ePQ;wCwY&W$bjI3lF5TDwtnLCY>sP&1xu{~h)yLLI*AHMxz z%KJeN7oH;}8<&9=^;V3REmx#k0>R#9Bbxp42Fl&*wbU%%d}n~3`QwqaHw!szD8IR` zD)UFoy)j^I0r|%J{FOaOrPtY-IDj80Z9260hJENOicGqlq@*OTPHu{|r&&I=!+6`K z1q}U5f@S>TZXTL8o8)Q3oDu1Ab*ltleb?3AOsR>3M(Tl8PqzaHg7Ll{Qv=Um?j8AI zEGC)?*ZA&NG%kR!z}lXj&th>Pz6+|x0hKF*l2vG(>LT6hwEcHo9<191t0}?y>o$m8 zqlnD1T`6gwAa)54Br3-E4)6lrGJ3Opni!MC z>r4$ihz%JI8|Ky2fdOIUZPe)isA7ArIV&iU|DeGlH&U|?J#Q7)>fiCf50sSqAgJU- zI`$J4D>4t0sy~9w{c>#D9SXaExbJ6wbQ0abCT17MTAGD+s!fPg&EHB2++ynCek)=* z<#=YH*#hv+!rByDy9kYE933!UrVM~$XE~c#>Bo7Q5JW}k2XgA-y5ZqtQX7Ihq+<>X zAH*ZAltc}62HzyoExgwM1ULQr!*vfrqP+tu%nIAV^kUdFO_#B*z@Zy?20Og_go9)% zIN!>r-5DtzomIV$Hv07##7w8D7+1C?nOPu1jsX8;N)ylw>PNekJ0hSs-JgCElLMUZ zBq(IC&8^ME$h!+#m_jBV)iP*CHCSKt#0a-3cI0D@?9^PF7R)X+@QLglM0M^#$tqaq z4v*}`k5@|f7z@Z{MFT1joO~Gw5``?c;zGtCWxA2gkwn;eFevDt;uCeByK8YBedak% zkpT7CvAOf41zxJ!)!EuQnMek*&bsLBd{)VI1hv>Zt~WA-hv(4ZJ{p!ks~Y4niVbI_ zT=vIvc6M0?wUO)odS{-#mpe1fiz=Gj?4#4Y*#RI6#ldkJ8Yxz;6cRY7PaJ_XKn1|)m^K>b z9uhv`r{6Z+CfWHer^w(r7bNuT!VqO6<;eM0 z0cn~`_oX+3_L-+;vYb+Ee>OWi|I{`lYe7YH%6o3XGCn$8v>v*evrYf%>s`f54h@7bk?|RW!XYqYpPby@|tLUQ~JKHe3Zk9#u@r3 zh0Yr@#VRHnWs5N>q!{@aGCi{X#xjSKxX{EN8HGYTa(k^^!W4 z6vmogYfXMDLXNRj#gDVF$x3|FMgmB%waOoPR!N$8S5Faov9;1iOwmG-;%t~4b<|0k zY$zS8uGtkohmeNwnS2~+CDG;OwiILK%X+n+ z4U{htehy~JP!~!d!%bANS}K8wD1!}ydOul%jl0nBpXaohxHrI*BNi^H7B6GZo~~7u zf{D-3ss%trhU{DUQP5yiDruA0{^}pYa^$4q3YRT}01QJ72*lu1E{c@=kMP3(sucg1 z=CoxL;+C+cQX8fId%4pPyL`1~p_Zpc2=`YFY-ga8UUOm9%GD&^$bSGWLj8a%IYN7& zYkyUNE+)0gx$DVCN3GUnner6O=!~xJIxl6cnP!$|pak-zzkMQ#+9J6E*nUuArZeIo#OVJ>;`#;oe@WsP_Ue|&ZMKPE zdnQ~AtqI$WPufA;NB|yrb0Kh9ATjd~N#tln?C4?JL+5vwi$$jxQ4J~z3Y)pZhVTzf z_1|G`jR!6T%s-3KutEDbW$B1vP%y<=6OL1Ul_Q#w!jz>EF>Kv$M`?wD$&5x%hqEU4I zk~q21^GS9-dqs|{(Czo(uT>+_U}6w=0%!cguDzj*>30N(ESn8+cCZ|w$V}K<;tK=E zqOUd<2wi{W%t32cfIuJuUn^+ifm_RfX~eT`$1rGeU^z^&6!+uO|LRAn+N% z{{95ir)f$`J4{|9?u7zaI4DP|bGnKNF@u!A#DqdY^g6xL1zYmC@gbEV|4a}lGc3G`sq6y+ZX>4MzpdB}CS6*gv341Q!*mzdGKE z&`82j$)TNxS~45NpqJJDXRWt%`}8)y9W$UKhJs9Qxio;}uSHHiu2z^6vbDp)f6cM% z1Af}Qcr934q5h*0qMa9JqeO0o*U4SCiHY(^5YnqAh`@4e>)#T-ulXYnHaj9R`UjZW zToRQj(+`IOm2Oqnlfksdutw6DZU9NviV1WmQ2Clwj_)7beFbv+A3i$qtma)ABx?P+ zgRE0M20=t$*`5BoieJH&3@n8h4)KK&01;UWS+=lr1}R6O`yu@xqs7aTfPg(+^ zJ|Q&RMATCFXm%D@W!4?Nu{tlS#=Xyi)OAtI;NHU(C{C9F@ zXt%3t?XA7kaFK6jFhhKdD0UnQpx`LnQ)>?7SK3#9yXZI-R9KX!1R2enC*g!T?Q_H++bub-y`nDAgG%A*b= zs)vKq_~A`ko1!XlyY{tsOA+@D!+_!=$KQK+sLEiNckrh-v#ICjZ(NcuEZLk0Q^9K^ z0}VBXHL4Wd#s0N zZrkxAc58XXS+6#wLS{=u`r?PKaeJ)lCKsB*pj_N@GA4HP2_gN2qBb z0nJbAB2%BC(dDC!T!?o}`4jd8P5JY$;RL~Y+^WNng$-)$FlX%ohH_ueqjx10;a)dA zV+6(Q9j!*NDOlY6UH*qqk0i%DK8Q2^x(Af%_hoNrW%$0AL$$ed9}b6<_rxvMqFJV( z9bFiY2i-I@>{pN9cSaNrFhKTnhvpS$D5;1qI^c+V1xA%#oWr;hYIfBt(GPb5lvwB7 zSgX#CD#2d?6{t6hQkBC?1tAr@%o7mum;9E$6Hf>*rS9D#-cbe9x3D7o$Q&=aX^<^c zjv9yPVj~2x-6waovn}Ndc3Hx?>>kOrPnoO9Fh!x=WRpNiW6*|=6w*1{U}v8`{v+&$ zLGCRfvhTN6%>V6RQJCiwwJYo22>HNc3?@&|yM53HJ;Z9{cF!I3=Z-@)9)2kxJb=C5$&R4!CdP~z$^Ltm@s~|?L z->RA>Jd zM*MHczxgh_*@27w%gc7^_*K7N9Yr17K>ZPHqgjhcFIsCt2uk>*6 zXm3p>D5RZ$t^c|elQ@5a0G)l>Z8q~%UUx8@8~C(BHB_dFV)m%juUPj5m5G`b*xy|A zKH-wYf7jFH`@lJBK6&#Ql zDVEIOHwJtO?L&?GX^!q3a~joQ)?(WDz7uVIKK2e1F?6FZ_+A1Er5Jq{^~8rZp?Q62 zIjqRYbxA-^^(-Ck$T!yeKKOFKIJ($QOPc>?OS(&`nJl}3YmV1WOe5CG=%&y@*Ldw3 zSE0PD$m~}VBqqqcQq*dJ=@F=jKMlJpBi^|b3Ok-=wf#@&=457H<7&pGAUa5#@t=Ni z-KUZw9SFug9efe*Zqd>HHcKiJny~=TbpWDaWLp^#Q|{)a0##^rmQk6t1y@WD z$F*BsnW{-JLG-&zurauD5UoD=)$@<1PdX|iI0?+PQSDT#`i@+5R)tjkIVqa|pfew# zz7(oiDlSnnU%XIJ9OyEc@*R~Dy5^^>hGsO4HVZ)Cos$^YeWPyd;Y@f^Ej{#&98Y#q zn2*~DP<@=Z$J{Pxfbi1~+qdlLnT^_8Sd-8uK@YN9- zY(B^ga*d;(b(3_ajPM3WZB3 z3<36z3-dlIiXayal)Nx`Wbgju3RUJ3?d!#QcQFqhzHo4G@zJezP0y(kBovOI*g6gyU-OZHhHQaAJm8BpZ%4T@bskD+$cIACG^K=$00+E2 z1JZ=ewhzY+@PuO{WG5N}P#yMB#D}=%kRRpIswhYwi?m12IV*BInrW zc*F@g?4G_6g|M}9_mpE zagPmZK5kf=;4MBw2{+nn1QQ2iV3tYUu&qfCsnAw=$h3X#G%>-UAfb%H;XI-8o4yjS zCj82@X>ARpB>k^8-xoW!)ly|7)Q^J2T_?-BV2-g;X&jN1ST zGB6vX3ib77=2{BC!;Wg}^c)07wh6c8ru_gVL;hj$b&*fqB#+gX(1wCA$qZ#tNz|1XZrtZGD~%?@uWNmUhun+DvZ>rgeyz z>J(U(SGx=ilFm4!stQ7N`~a5fjI}RZnV(OaT*E@ zIUv#n?2FzFFD3{8WsvXRp~ zzJGP8Vs&V0cMCbJtF;_AQCivOvzQ%_e&8g{Fe%8gIzgZ5X?pEBquS@2U$^~dbaxbcZKU%)~0$` zBa7#jGdZVagnAQ&sr?+zTq^v*Oi$FlRY5^8+m}y(XD=8YpdS!ET9+@a+Jyv4*~#fE zYSd^U>+z>KVSU}KF}><5s^0Hz*K-rSFX{a6Zo)QxObm#J8b2<_O8T;q=#$NE0N@NF zGu1M)Xmw26zdje2tg;8<-jUAkoHI@ysV<*-l?a3Ia_V4mG5(dW4iq=*mLwGkVC`p>1kPEB4m2;6 ziL=p|kvpxXOtDdz`CPHtA=vCyN>8%z++EL_-c(Ea;rdcbkYzywgg*Q6DFE6n3dxtC z5y4nkxvhF|&t6>Cgano>{(1%!%vF)|MX(&aNq}f^-;}>^S;ze141hAql32rnKu}`q zz+!xT>aQf#Sm-ZoW>C=qsR^o|u~>uY^GiceWDEA73Zfg6Or^&IRk$O`rrWbj6w1+j z5O@w(IV)VTuu5g1VaO+cM*+?~_YFHXMWiQC^(`SqbTfow>QNk^tmkU|rMm%#<^!eg zmGx)cG&a$ZYkcPa3e66@9ok4`_AG`Oh}l|!QW1tsMUHyfLf;v_kP;_o@wVU2f&kcr zJ_lup`j7nw^3+we)yU9(bSPwCO1$ef_i8f~O}i;MUMhL~%N2Pe7f zZ91#>4IU@zYW}1LR?pOl=z7(PZ7Zv26vu;F|7RpIS|P~0jGLHvdTL$n_UF9G%^Ag!7;RROEhQl zRCBT*QPrK7&0C|M&aIvaT5YLG)w+pcaHD~CmqdxdGT8>J2;iuuF$c=A3P?-=1Lgav zxSi)^^T?gF(zw4YUfhy-!ZSjj!cs1Z}E=~0)Z2+^yOFi zkP!ewnqb-_rU3(F!4XeXBdnP`?Xf_rT$oGwRHoKwp_b<|UEs^K-Jf48)0r4E-PPIR zQjKf!iFwv1vw)U|ll8YwB(KmGRKl6AwuERct3DBQgyR$~xw>`?)GEuXy%xIZ#uEOu zFVw)^o{|%WhB||M$1C6_)*FJnre-S}36!0ntd5rtHJyx_J!ZjtWA=}?c*mF1b4NVYCcDb8x0CEs*d~FG3mwjMmzq=Qa~fajv9r|xcTTPV=h(+>tS7g z#R` zoli#G2!IU%$S=Jc>_B7a=Z{fawo!m10ue$SmIjhXe8nfbBoCO)|)AsjhPvL zxG$BE7IJ&;q?y!hVT$#faH4Z4t#dK{CwBlm7i;dEF*MbY2@Cz&H0_3V60ca4V%d+= zMpLg&Iu#M(orlm3prrPd^g&!8nUW(y3v6lf@!j-NyJdSJRd{;BYdsC<`^)N_mK2MB zVKh1(y<#byiYIS6Nk0zYmCh4Li%PV}!q-}gSHXMXvHqI)WPXX$Q`-~v2OBQS8RhUc zlcWd`DNy=VPJ`xO6=gZ1-WmT*E#$r^9LL)cY|WF|8n#lux~g_%L|JI%%j4eY(hP@n zdF;RnanS$Q8$YC0VDB$lkf%D_y=CXMg@>yjGUdQo-cx{(f#DfI_a@ts3!>|D zvKIxK50^a^df4LgFA0nwylh_YgPCzLJP|r9yUgt=swz5}-Qw;)ZG<2!ojn*=k1Wm3 z%I)~nnFmW|UO8=V?U)L&17MdI;=6Gjs@osKaVuWf!kJ9$c$x z@QSM!L|km%zYQk_V!b?P4%SaTH2J>5zS8oqf)ZF3;yH_#&-%S?$qgpm_O*ERiWLr! zTkAz|nlCF4Ae7y2dzQ7w??HRboUOGC3X)a_=4HrsT0FRbu*bW;rpqZ=BTONQrm|U* z=f_Z8YpG%#R6>apPs%K#cc(%v@0bcBI`#Q zygzOpHk-d3OO$naQkLFJnpECO61MEwKDv^v?RjvQ|9E7YmHFhj@M7V)4i|ch9(>#Y#;IC;It*8?q1>J>8OvGtHJsP@ z!S8odGV@)Nj~KO1+Wmb28lB*qtoH^wjXP4mdtGWc6&&}9sPtkXF*}`Kq(x5`+(o;% zb4Z#!VH#h&8Sp}{W{YSmi6t->@1$5qaLgS|$JX6@I%j;{ZY&pOPCWCTQ3|7#FX+OD zu@^-Fwn zW7hX_9tN`vN6WP-Xy337VLwIf>OVC#SwY@uEZl-Vd>pW zm_e(Uj$?4MKAEB)e$RuBn%tVSGxElq;jFy8%F1E=Jj!bf9Mrt}sdaru&oLOG+_wq? zAi}kT8$DXFw{u8$BYvBKLBjs)7Jyta2Z+T0dr+>=z_is4@N4WDH+Y!|#ccWGWB{}O z5(;H63$~K%f)1W9=L4%WC*@dE+Xy#j+KeA6=nKPYP8O-iJJlJuE#6k5DIkYmWPac~y7dHX&-f<+NFv9rRX_fMePhmL5d+v8S>5)&EHQwhUu-03L6KisRHp3 zTkSk_`)x+m+hBwXUaEVXQ@51$%N7S$Qi`#CmK3`k4(=uyFt1~9?bZOslZ}#YN4M%i z2_pO~;v7#S!C9DsSBi+xOP0a-aB=@UvU*Ggqp&Jyn$xRjQ;2U4;Fqf{{4QmiGauJf zXy37Ur7I>QJmxF*HRi}?pCqJa{u@1AOM}Lhn$dF()>Ye~a{}|)jp$`x)H>b`J44>& zlGQW-^=I$pU|ncG%nSgkh`|VLw20Uc%SB8ANgj9rjb|L{Kx%*qPErDE^r-7z!oM8X zrzo090W7+-zjqAkpk}Cu$=!d*>6&UYO}mCo+L|~CgF;fC#d5L!G!a>%$wz}Mi366^ ztA;OW<>xF?Rg}eYu>M~%a;WJ-sPLy*kaC)w6%2%FFmXn+I-s5L$?MFhB23OIeVkX)TajJ_bv4*Ga;%RprjLFK{#PB%kGvwk*SqO3Ipf{p4t7_4RwUn88|cLb0|ebfLU)J(jAkUd{n7vo zZIiAhXdq=$Bwwv(WGY@n$ygg2^%XWCa#|T{D=i<60$@#2ZWhf8xIqU)H*t|upkM08 za^LS+`gz`F1U6xa&~Q5{r#%MnajX?d zWD^xxH#$g3Bh_&cdLWAG;GS8q$gS~aY?ju~q9dTPSQ{M- z$UGb%DzND-!cG${WMRot2Q4}R**yp*8{WuV{_I2n7;7zFYW@tT_2hTCo84M}X2E(1 zadu9@da*@|AbOQXx%0w0t**Of;Z`pe!sod5%S8PZkM-6L{Dv{hD*I)_gl3xw)Uau- zb~vra*5`n$5q77;R*zAX{z_-MiF*61V}$9WSxPZrV`ayw+NCZ%h+&AS>ho0iJd~ z;{sz9Hy-v^GebMu&y~noxcDQT_Urui5B=m*#v#L~l@KnGz0R`Xci4jXeb=Z-5P+!; zMy0!Kl5s>$v^XV{HugJzOi zFpQe$tX)`*(BU4D6v&WAo4Wj&GXQ4u*+1~Bj;274<@dm^{``FY$AVovUo9#EpuIkl zWf*WIqEzi-?VV(>ep9FG2BkVNZ%gWxoIMSFB< z{jd_XNBY9fsp$Jon{DFj(7oo*X5Fsm+wAvaVzjq|F9h*AIsGlLop`^jFrHg$LYrBb zj^6t={$`@c%t+9pyHX;iKY-U~pw4@%z}1btFA1#R5O#n13*jVDIsBmneQmOCWh9p# z|BC=9;vfm(ln~uj$>oL+b{*f%T)t?gwyUBLTtV#FCG2V(%zmn)NSDU8MaJ-~{6JnjO(SP7UzVb~)<=BI)Bc~I3yC#d%wA*?8?OBogi{~HLu1$MU(Uj+2BWLJ?Rm5||&UR~vw?yGVL|VpGR~Y4fp#X&6 z=$ZtM!d{qIXgGqLD}W}fa^|^No;%ifIJNmwu0TLFT8_XK53GNvnRi?LcxY^pw(?<(N(;8JO+J=??x6({*Mz78oVE$ z5|l;F)pX4Sm8QVjYqGS#I4)$Ghx^jN6M3XTg2ZD?MXn0WH6W|-IH_G9SaupY;QAEg zGTpMA+43&L+15S{SKapa4mXYNy|=f=@`3v(`#Hu&4UFmqu&&|AcJDfPO)ju*T24}# zf3*XFpL7>r?seS1_e-?J$PyBSoawv65u;G(j~Rp{y^2x8gtWkVk2cx^s(!og3qVxd z=iO@>Ofu){E&^3~(>3U3j{Lrg_oUF<^Rv7bU3UhRZ{bjJ12T86=`ofZf+U~ zPLajV1K_3{Oy0}nC!;+$otV-#f&;<{87@>zt&$=V^;bzu*&JAx5h63E53N+{aeAet z{9D|2Y&lSY|4YOD8jPO#G@v^a#OHZE2}N?RW;l5Tr;KlNec#b^cdJZWRm^#HJeRn^z;ZD%PNsSwo)OeyGDRm*lIf(e+R)DPs;f-Jw zxB;nXF(fe7tSIvfFqA0HVtt+k$!2!+Xxn>lVy@ca6UXGjWEn!*ssvzxK{tT9 zM&v(pJZmcA^;>;8@sD-vEfOc!ICM5p9N-SRxx*U~`ch{{7 zWPZ8kF)*2>`nik)x4hEIAZRo&j%RP7*g@fr8P*ER;1R6Hh>>dlTR!64TRv)>+6L6Z zo^oEBjWbA%8tfh2D^-^2(R?QoY4it=rpJdAUuRF(v=QOE{~p(T904$KLW=!ANC6bLFl$4*gPB}_^uzQLy(%j4QydVvXh zV6-A+9tKA;217c&F)^H4;-HeGpmsEO!)F0rPzxe-rd)DAiDm1Wcm$wS%azx!c{>y~4&3ahJ-vCqNJ%THA z2#0cNLc>>u@&bmGf@`p{+-;9a?1ClL0tgPOXKs2ws+{*dC9uCQ$!;&)hnS~mx5&Up z(Sx-7Q67f_pH_DZTtOmj!=sLM8@L~}DG-QIKrFVc(5{lf)~BnANoO8wU2CXAW-^_e zV$K|D)WMJ#!dEI+mhXr^L+FM@8kN?!9wNXUs1@>q%l}!%30^3piej2?TwKJ17j?6N z6`#s=ZrhdT>TNj;inz(44G8UsS%NAAd@ego_a>OY`6Mvejg z^x(zK++uzZUAE%58g<>_zIF3oBRJjxoR-g8{enalh&do%L=u=i)NMG)un{G%RQY~4 z2)?>-57TIDUBBzUfPR=w-sP__^4pK2f~7v6n_2I0nL2UXDdw}h_rW};dh9R;Slf*B zDwh_F*k5o$6|4{+#{y`tZ=g1r=xf34j6a5q)>Dq~2~;7p zzrJ!&OqmFCmeI2*@fdDz^y0;YCb?tzYOFRJM+IJvcd@k>r2;$ym|XHzFD8E~S2~S8 zR-g6dmt5s>F{m~qw0>EGgGDi|`;r%oHFeKUlbEYt{mO}TqS+vmr2?^mP>i@#P=*O( zkpvk!trv_HX&7X+?Jb_b!x&0Hn^W{qBfqtvY|5AB)UO~gxAvAT6@L>($$M^lnJBM1 zj`N2EyEZwTO8^uZiKa+Nx$b#$cuTIakIF2%Depd*qG0R}MOUM`qcq(a-(Ym`S69>7 z!{CY-?j3u0q_it#W5BQAKr=8i_Tw;KEuo85&dd9WwnEra)k(z8N=!tlzBiTUn|m+; z%|t4)4b#$6^5R-zSY!Hh)hW(($!nlC^64~48Ra*i{eZxjD^hTTCB|efXoGwNyvxnV z2TG=g8gFOWFqjdM`vwqJQF#sq?*-2JPR1i4Wy$72UDuXk6jhp09gw5640PcoEEyZ0 z_OPUJl;U61_^*UA^@ERC8u9RPO~>ciO;MG5CEH9$aI%-uJ!QXeEl~zGnArjYO41lR zDi3qPTLJu-GMMs!XH{pe2kg4(ygrW{o68v9vTr^mgV0M?YD`E*5z&T(=~($D&YiFP zV>3O!>_Gm33Lx(0D~0#QFH5esM_R1H>GJ77Otq@}K#Iv0vzjFYL@RmAe5w?C{K`v? zE?UBFZV%_;HQA}cLGzv`-wELYrwH+;{CG^}NB}B~*0YnZwRMOZX@X*src@nnWh*{> zp9}K?(T+DKMlPVc*SDkj7|~lV09dyPUm>?G#|=?AO>Dv^yE} z1Yob{>1l)Ei0z7`yZGaN84|>uS;=E~jPu7fFEXZPrRY`H zd{W$uP^SE&iv_|*?BU2GJ@*eUY4=oY@`_rjn~P~MQ7+JIl%P#O4of*uil^kD5P-fe zy57UZw3K!=sAJZB2~8_89EgZlK!5%xG3JE)URqHXXK+{HgiYiVclp2 zaUI z61(X8gLs7MM|LS7xQRt>-Pgt~0Z^*Q@FgpWo#2gZsgz(Qg}`BeCQZ)(!Krs3v#%Jw zL$q&cNW+$3p`#nQpC7tP!zsSu;p&cBTtxn&5vZ|N1r5vMY7iZp36%DUvt|1G%95{v z5%f(L5speASQ&eE0w}IDP`3yq z`}OIcmqatWxx1o6seZkCQath9;+p-7WdRT{8=)zBcGyXH3QKP}QhaNjfgdro4MP}l z$q=D;$Rz{CY8aKF`$OjA8W}S& z(wt&r)KDExZX3uI*2(eT2`pp#cFJ3nqPtjs(A>Cmf+BR5UvqVqSj+o}X+0bM((H%= zX{jAUm)`Q~N?29&3w&8>@F7JGdHo?3(&P~v^RMR@U?k?~cKGmL>jAXs(HoXzcVfxD z%=}XH>nB#~!Xg>WEpwYd>#h9bTnd!MY}JQ>6v_dLaRj9REWNWt-j|j^#z5@A~ zg*}v_>Z!T$x3Y=Un2(eLE+@D;#yGGGPgbv^&*?kWVf zy3OGV*Zw!7bxcutr)oFO^M`O~F~DX0;<5KVp3Q`m@%0^24j~ z$Ojgac8elzpbe`bu(ltsR)@%Ep;P>Kh zZ#naSmiBVMby}Qi6A!GRYkMBwABtDh2@x0X4#T21fzb?_LGK6K2DM&E)Vb^(2#VUO zJUc2oC%hRgn{-z%~2Zi0x`c#2m%-eXBbIt zad!scK_?+Y04VNMs-q4$4l_mA{OsAOFMY$CCv@kdu(c0(jAM$~%3uaN;mT&HkevH( zHeCnx48PsbCY>f|-B2*zaX*WEG3X~-F;d}v>VG1~nmgx)nAcqNk~l-|;`L>ItD-*x zY}PJ7O;Fjk^-+ej%!EUDy}yEC z#t-T*7Y0laVgXNL>C6Bnh+jT)+Az7xvH>s}FS*6W<6LD%yNjrNQ&!wj(-hlY7+Qea zo6dC&7ArXC*pseDF@D`biD#s(1zZWZtLQ*Cz0XY4Kgva_V}xn7CLSN>va?ntsiZpdXFE7!CikVNCm&g%jfpLfSI|uP7u+XHaCZ1_3Zg zH$G0mem0Wj2|5Og$T^kM!ik#Bt1ny8LDU%6r1Zn|UsH&(%_N^K9&YwzDR0o?*K)|3 zWsuxl_ImedwT0dl>HcF6AvDbo%e(1vvAcW&6}*3;P0>qT(-7pdiErt4;lMrdzudCp zxY*sgSaqJbg6ubTMOwQE>TrMI(FANPvHH-bf#}m!|H;LqkC}?dw5V2LwVEu}@5vDoHWwSgp1jjQT+8E;=61|{c}uEq zLx@mL`T4z&fFX^_H=tHw^#a-)H)py-yss9J4{0*K1h=gsQD+dArf6iF{QTLWp0t>3 zWOnt5yt_;F$z4TS;)Np+utR&+jXaArn>u{ za~hfy2U>C1+^v}ThJUX64N(fYaM^eXu;z3Yz7^EFTe+gf+A8_D>r-g&an}SkQ37r8 zPZmK~8nH0g@4nvW346fr_yXruTAZx{Oru3z(Jn9artF$L{=$#*i{a#!r=A9T9B9V8i)tr)BR74JX zN5h6=3Pur5R_OGScgt;0)_4dMl18gtH_D!I0B~n19c8<=ds%QEgf%;iZms?o1hcDs zuZAf}52hn-!-`A)@B~H-gw%!hr2V=fK2;x4n0xnH8fOi+qt4*oDleJVKKAJ6bB(Cb zKob)Vg8z^%YhrJFuRY|-g5GB_IG}{{In#$VcJvmk>>l3f#{gMh5~u>wS((teJqX=0 z^0XpCSzq^M12oK|ix&L+oaCT8ED4EWqvf_B4vVA~S*gUF4;#t9=YEf#8gr z;&B_%IGjz94UW!1Nv!HVO`h<+Usc9Tu6#D~`IcsCgdbPvuSw6a;#m@X z)Kor2XgECMIKFXM{+@|ksYRa48&Zhf1C3#fAIIxp;P8Nt#S6W>4N@_8Ib!9KWV*SG zJygZdcFhGDLUb?ia*aGb=_=aas)w2+nAB~~N93q3I{nn(nh^kySf{vrQLMc$D-TZ{ zW7TMWP!?7QsREHOGb}a9P|4gch8c1itde+?I6Ft>qKTxvn}=nW9!B|QwrAWLKLU5L z1YV@N6|wQ`b!87kwYoHi8nIYH6nmpa4csK+V0&WPT`UpAN2j2vqm^bxp%32%?C^B_ z>HuYuHBdu0k_(UMLh3)FL=d?exV(;$b>eIBY0(E``l{M%lfIA=Lbct4pdna+%E=VSto@J-?s5Qnt1yF@cT0V zIjXY3UQHF)2?`U`M7n;>N`c(kZy~w5-rQ({%cC)fDl2SCqMaR*l4B)PHT& zu&n5}pXC(;0RgPEB>1nd7eOg7y|35%`gxj9wEZ_MO($7nPUmV!_=Sqp2#}{tGeqd) z56>`yCF*-Ns)Bk92g&QiTYy$UC|yb{HDc(okwoOng917ff9-?qc0V-cyT>|UC2!3P zX1@-cAAl!FqIOS93-wy3aSSFK4UQ*S#g$z99Nctvjq6HiU~4$FP9cs`Hh12t5%{a) zPvD5}c5|`4Cm=scGn&wl}G`knB?-_HPOO{5SOM?3ch?XKw_v>>LIBbhTO8 z=DYg$^l$!OwI;;mCS;DAMR!-ujzhm>d;|MBet4w`A@vPOQ*ff0zwJ4f(KQ5C&~qa~ z_vJ6uVW+WqSb|L*iMm3o?GB{bsOfdC=}AyQ$G65{{MWzJ#noA2r7|!lmK2%Xi-j9N z9nBV#X_^BynzH^T-}Ev_@f^!?07UDb(pj~M3*tDRgWt(enYeg39>1My{P1i8T$jRO z=$CBQjP@}vzvaaUM1yuURx|C5KjF+iZNEPft5?m+xbLA5_#G^rCSWe|%e7FUUTps` z0C`KzxDPa*WaauZ%Qx$>amRWB3a|DZK%BCDC?-k{;e$zaeNLxq8v6Rq?ZYv##h}L2oxxM{#bA*2(C8 zcuXT@RDr}&Aqv0A+6;avir_B3zfb30Idc#*FoVX)FHL7*gTt(nM){nl0n-Z#2+S0| zk<=;Sv_LK@LS}K^)R7v-)X~v-2;1L%%l)P2{)re@f#izl(5>q^odbUwN1cE-yYo7i zV89L|ydfSq5`UWK{%{ECDg%d(8a8_p>$p=sv5(x{;DLQxP}|$3&#e<>(-CXRgUqvh zuya9fE0>{l-v?@uUUn=X9{=wIxSxhv47p00c3S)pwwQ1{JTQ9Az2DPI2tENN-{7Dl zz)aaYF?F0Ih;X&pjuld)qIT;=LWosy)v-MbAnZwCG$n!j`@*WsQpz;rHo6)DXNht; z>Jm0dJF<0ag-hY$BN`Sw*2wlM?oTWa<)kElE;P@t-obl@0Bvc{zj@FItT-AXmiAlc zSutnFvK^yFb`1=yM|=I{P7yHv+Yuh5LIdv!a!vI!!$0!gRWNv8?gSI>e3p@LODT~f zDT@e+sUSugl-Wp>6;x7a9HN$wSEw{I^@5PNo8)f?A~bWd39ZMB4MeI9S!VaOJnfSOEwn^H=KGg`He+}Zg8OZY)@jD) z3qmA+a!Hg%N&`UvSSrCL!p!F}M1fL%%hQ$*l#lfKmMIB?dl{wbPd$7)&}=G|HT>H5 z8%HiZ#K%~Yea_-A)w^UFb^6)rujd4R4K~;$-vHHzW)Nl`F-H{EamNZ>hm&s40w-J- z95iWFcOE754c#^-U3ZOb_&yzngj?$ooC!ryz_Nz-X}hTs0(Lfa{9Pzd0-ByTBANb=$8K$tj;Dk`0U!QH3jP!Q1B!7e zixwEu_lz$0)bn#jh%?UmSP*`~<1B&j7|=7FSB8X~L|4fV2;C&(4mkzNin0^fruf9V z7^Pp2IiD@o0IXEW*{}(^sIO#%zLJuFMnX`u1(zjQA?0)n3-^RXUa~I#@8y{NM})hp zrF~HP>3;-Bg7>pj0b_shzYyiwoOTZM(P_t))_BW_@z{AU{%u(tl=ihoik&vnLWuCp? z1RRPXA!=YON%e_%izh5$>ci%emXFL7{^)x+NvDF;&t<;f67ahxKYTH)1KZmI_?6FV z6O@g7Ji|*7h&T%&8@m_4T;kWqO}n(Y`!+pw%3$F}*+7ksx0*V1t^8RTdz)GNlv!P9 zeJ79_0CeBTu$S;{OAjjkUjwal$D$RJlTiuOBo_yOvkaM;KnmB9heQnFeL}~R0Z}jR z(7(8U**(uf>%U}u__$7t$hX%6kAC=^Ze0xNaJ&@~y_VK{%02Q3$)~`bEkymKVK&QO zfHMjC5@m z6fjZ~gK||Bme51}`6!-W&qV6aOplkEb~q0YhHZwe-O9Cn&1zR^8+4O^NtYEqgc-Wo z-5D|q`E;WlZ_Jw@wwWsrWr=O%Bmo=tP{{mr%0jo`D@rr2jQo^ax@3AmieTu3a!{yX zIamps3(XL>_;Q{%qnXVpc}%cDRos-(3uv#VUDd7-*~*K)ShBZ6q)|rxH8taKeF|*l zD7fIh#3|Rmy#8BehKBI%D^2UP0};_M;Pv6>>!6Y{dbyHQQn|;#YvgsyQ&FNz+J`nZ z8VVUsy16Qc3i1=m%#F^(vt1xcRJiBE8Uu{;A$$oYW_AW|PlsH+9F-L(<6G7>Er6iF z-R$q=&vVg7_cipJBUEML@gs<4Q^66lb~~NzJ+fYT%pUo^HsGM3-EKIa!%iFj*O#+o zQ}fE36p7BrUgJkOrW)gSh~7IDG9>~KtPNu<=#8~PonhF+J*TCi1R8};OZs)dJFI8a zYnv^m2*zx}9o245*BgK0MRE%z3JAAzkqE-TR|B*NjooMu28mOI-T-c0O8?2^lv$5A7$&kkkeyaoCYGUG&u8u`;X@tk*TW(qz zwt>mGqbN7(cCxL^Qt>->%Y(*Pi*2ao<;kMbG4x)dr zjyL{IE4fEID5#$z$pAxs^rx&Ai-nao=OVK2?x|FQ*ss-%n_22x7TIQTBvPW!GnM)V z@L&Bz=MxSwpfw~_x(LWul0Zk3-v`wLOX&~%5L*^;p(UZZhT|h%c=G2$PtMeIVtue4 zUC0d%0)Oxg?`Iw`;hC58!NRprO+X74`q|SFqZ0NLXNh+60Q0}-Y+DiH4 zb3Q-xD9dXc5?eE4tYjE!8hVK(RpNZy2--z0k~@WZd2$sZw<;U~wZxIQNHLB&5@((8>50J^+!t)H(i43B3~wA!O6dr4N4zDVra0LnrkYN0Q~PXYrgmsuQQ87LTGWj_a-Chu5YbxM2t?Om0&}-l)(l z7ryThT|caI>1Ca^g+>L-lFzsH)t+{o_oE7GS0~yULYnv9d;s@FgtLU|1YfD@h=;!w zh7b$s_uHEf_l#=K-z0Y(e-%fVu0k=ynuFd0fi6ekQ~eM1xm3%nVG=-X-W$P~;H0M+ z0r&gLB9t`0vc|onX1pdQBvKUdv!{u|dfFR!lvv%sXPKT+>I|RRCU}BKmyk)_vL}TR z0+>$UjVbZm9Kbdt;;1vQUH*_bWBr@;v_4%_RM82t6xP3`l6Ln(HAp-@*IxNOIp(?T z;F5iJuVjyr;PCuYj41x@^xN&3dNB5hK0)6RnhreSw_$RM$)h28)C>u*qt&-hFE_=0 zp>kaID^&kT8cW?rb9TXED8FO2gi7+Ws2PG8WzBeJ!_4J~r%`s97y-INBTyNiVx&3N@uhuBzDnf#G&|>A@Xd1bKvp$d6V& zzC*j5i)el^V!+9`XLg&%;8vU=l>lcV9CL1=U|V?}oKkNQ)(uzfx$EyEQPwwBeX^f}IFl@B>&7Q4mAdkYovtR3S{ZyP zPZeW*JyzE=LJTS9kFHlPsHQq$F|cB7A!vqZAJ4bs>6%y@DESNhKRF}iI@TBF>wcob zGvcO^=$K%N)rTkytG!?OIl7zH(f?%h7t&ySzW}!Ph7M&5Y@-(kW^M<2u&m9@1;%{) zBb2yNV*sQT>3+Jz?*miRPL6@sTSrFU$G7u3C<#2qp7;&LL50-E=BT4B{az)s z=mZG;hi$Y+U*C8!54$>6H{s;_fTc`$#|L?87SR`qJr9MKBWL~#Byg5pGQo1M~*7H*Jtg&eGK z-0I4Rj-D68$)8G$ZK8J&)XE@Zs$M({27t|R|A|t0W$@tYJ?+i*HT=`L!(f04>cIvC zX-oHq>*h=ely>U2pRO|`{Y>VXKVvyIS9e!;DB4e{JoU0;+8&Rbts865V(w}8j;Ozc z!4d=Hj#W(6w*vbTFoRUH)_QV-Cyu+%OcT1%LoC|IYxOuBgfl)1PlalqfrPekBmg5s zpXG}-+1C2}m2rt=>YdDim+{JboVQy$qwEBec2=pZnb1`=P|@nB~`x7%vkryoa~t2lYK zxE#>e=8cU_cW$Y3O|{c2{|*e5{xvoB#|kF z`L?0lpdXR`z(3g7Geq;E%5DxUR4;1&{E6-EjNqaCQ!#rs4B|`$Lkqt-g8&E|XNHGX zN=M96L&+y3D`B=X<<;}S{pgR8ZhQj1Qvy^%hX!JrkPr{X}u_`n0CLfBj2v|J$~k&yascM2O1JDrqRVWh>?pRMZs=5QBR-_xVc9>QWCpEz&(phKRMD|fMOQhM>$W*g zW&cjzRNmGra`cpIYV#cv-S=SJkb*6PO;A8@71h!mewO3>u6>uxvd>K8o%86`@8Q2V zR>VaV(O{_xnZOJHsR`n_H_GA|D*UZ9vNC4O85B{K$L{4-E3vA!7o!b}bgJL~395bv zQr9uctG<;_F*QCAYg-{Ju)gsx{7GITeXv#jk*jH8-Vkc8iHP_aBpOYPW{#om-3d60 zXn>W@1igyE(MA6>-*D22jj1?|E*bLn_sHX)gT#NPvI4y2Y;a$*y)X z8>>CQWmZ_)R;Y-m#SWH`VGQ4g(}ezI-&&JVespehDfm$$4jy)1SNdcSiilI)mb?8L zr6Tu3qnXRo&bdz5kA3TV@j$%VC7lMs2xj zAQHydD_#ebu(H~Lu0?P>xV^8>6r_&Vs{958|CKtwSqH^>d%9q^XZs1k_soqbh$y5m z+SSoU*=km2a7PLDkh*8+gRJ)#dmZfScg44h0n@T*ePf)@Oc=yaA^HsGxoh;PK;YV~ z&-hbfF)GmAwtY&w28ZYiuwP~S;BV5(5&4-zEP4w}S%fRt2BB%)kmTBJO!?O*x%?z+ z+G-H+Q8@ossK)FtV&;m1i%zH1w%RY^qw()H58XyXrWr?DWMWa35NMnC4SjiVsD=FceocbS)fILHbKBA=~#W|h+|_H{$|h=L&qlHfH(QTURi9i(PL|6zVC&f>4;}-lD|bHfXn9(K5p;95e6OSUCJAkfgOcD+ot}Y{tg3{S^2@1_#pwsRNQ#h+1jDgH`2y zS;hG#jS^+)0-KA7o726EPmP(J$ChRbz!!?+S-!~~^G1>FKWM!>8b&am-xMokym4&X z(N2d)3kON+SP6t32O4Zj6OgcT`ofmh?bW~&LNeSTb_=HOUOEUhSXiX+SgB8Kn~*Y^ zK>B}1W(=S;JIj4b9`7)2v)FEMfmYZ<`81p1CjjZxpOZ_hvQ$){9>me*>NmT)ap8+lQdIi|@ zUXZ%o zcdGeRn|@lb?N56#xk7+B|1cZqPwC28l4LdS(^{{_`}<{B0x*2Ea_7ME zqTj=l#`)Z%<9S|R`!jMCqXqafqT~yb4bPL1sGkb#mXeFQ(`Fz|`y{bA2$a}oU6J>W ziDnzbrO`#sTs&Km)>6H9e1`2VrWQ)R73(_`iV>~G4Z4LfQ z?oC?J|8*xt5n=p7t=J%Tvnc0J42|}?r&l+A79zJR1P<$AkIpnuJ)v?ZC~MjpNs@W; zQc(ZdC*LxX6|w`Eh=I>tMV6H*tp=<%B5xP^i+G2yVOIN!QkOjr9D*XXVlUt>7s0dj zU!mIMw{OcjhsSxgiIL_7Lfm&;c5Gu+A2#lJIH#taRXY&w4B^kS1!=lqUK%+QE|0r3 z^tQ6q_E*CSCSbdS_1ZYHidIsKH3-HH6H{ILbd~RmcaH&QpNvGBwma}%I*-_(NKxNr zPKTCw9_W$#WUlCY_yB=_gStgRe5UKPPR3&|M%;NlJIlA8o{O(lpc2y?H+b-kdzA0( zIDLE}PTzvk5WpV1m~;ZKG``Ze8*7fEx}&M33)`i%Bf_)sq`)Qb1f)c*0_ueaW7xsz z?mc?FM>w!A$Y0s#_^y%GgZI8-Bu#l3^~rrbYZ5E=J`@e={k^A)=LOL-dCoJLVQcQ^ zzK1ll)oS<2UzeOc=+Efar3CzSA*z)h*99^A3(h!^It{j85=%rfd1Tu>m1->0Zm$Btd)oIUhu{gNlxrX)tfOPQG*@iTz(2*10pi_`YXfTuC+d$;3}jT`ytT z#tNNp=`*r=YB_cq$Q%?L$;eIsbhD1#)P=3Sa+MmP5Uv+%;EPzMAStHOv z?2<3^I{W!0@!1jPJCX~ax}9Ixq~nQq`G&|@w?VgIym!1(A%_3Zq=cD0xdt0L(IV`VGQ5C}-PZPp221Nmk%M^wt4<4P{o`Pz(}#Fz z6kI;e*LP_d;&IAnI430&o{nioECvjh-$3z5q%gv3mv&kE0KQ(Xabd! z1X7j|fxrI4+o`hD1N-=tjO3h8STQIm8 zf=nKzpC2Wwe9-Li3sEJt1i!DsDZ)REP$nwEUu}RAUx__5?B+Ce>$q>Rzuw;WLbXekFy4)hkB$eocx=<6;H6+V1B}%j+zs*^K?%)bS zbTUYm=PxTZgS02mjOq_D1~cbOBH>Ng*z({Yzip-Ai+trp)Z0i(HZ)!!zXgvaYN5np z$?2gev4U49qb$TmZ3cO%c9G<&Ge_Vu{Mrn%V)q+|HGv|hX(8#Z(nUEx_0Yf)+4PNu z5Z~X+Uv?DZ`q@`vOowvN5C35dxEm;C=g85aN+YrrZIkI~vi&v?4`81Xp6-mL4#+MB za+z4ABlxfbB+$6V+0r;r-YmUkTD`5X z@}8jZh>sal1uMB-$I&;+*Zg(q$T9@^^=hUO!I$2yqsyICL(uX7jJmlGEs^}g0G zkA&D?l>?KY1W!GAmb>1+sON&QZky$%JXNegF<2`p4L8Vqv31}!QONXpAD z^9|MslyKrHw^sh*pK4z#rG<(?l<*{|kgN&Ti5khm9;$GFd8>y~lm`aV(WuFi#M7aU z7Ro~0mB9t_SBU;^)#j^;7sy{N2@#iOCJw;~z}N=RjcV=HXSIMG^>uPExh$t2O28e` zTOx`KT7IHZ8j%pmRTGohU9aYx;YVqBM3+_}Op90(};!+H~T)8chEzz5R z0ik;w1Fu;bFNZOd>V{vt8c0s4U{vbGz1_aztAywmV;a=HYV>QO*{lyzMe^>o2g&8Y z2(6mRcV|2fq6A6U+JF8&Nx!IK?byda_!NWxkk6BVHba*R9#V<2;iJ}r#H;O{pq48W zUT~|#9?n&o!7CaGtq4G#PQPuY(}>s%@dW=PP3HgN7^o;)Bm#! z#Y^StC~?}83V=KatvNa^0|gwOJ6i2fpyzz$EyIqhHI@j0E* zl$OLrLMDHGrl!eZT-=Hpj3VHbZcz^rYCcM2pof#fh_7fI&eu)z0YfCJP#I3W(*rWA z%^L8najfYrHjb3Y^xrC&HUI%SNu@PD_fJQ8)*+0h3~~9rXtVtE3^wHmo!Gl0z#|^~ zj?qV`9m02A%zN}h%Ky3Br{QjQ_ss8Z$a&e!{>^Pa0A78UTemeGlm)QpY}$Txb8+$@ zVRt~Lnk6rQ)q^TnVWVeL$SHqf$BD#lYay2y0_{-}XpIl>dZL#=yCU?c>l-E)q=bDB z%DN4qN`h=lU95>;bvF%B=em;%0O~a#-IOl`X;92|beQccko5d>z>VH89i$&L5o|90 zM8o7HW*D4}C}j%_>;b91>tvpBkGef;V9cwgHCOITYD~fkXFM9mVGh@eE#)rRmId-g z$i>(Dmh}XKH2qZ!bQZ*rU$E3qG`QnK$ek{Pts1z;$Ho|tjzzkpvo8xaQ`IuJhzh~Gk zm6351#_(z_&}!sZ9?UIKcBWy)d4RKeQ>xDoh6dLzy(m(D3#iT#A;#eq87p%K<;%LA z#?|Hev4OBV|HUHYeN?UT^;OCmoF+D#UAdun#IxAD=_dPP1}lD$T8lF3{rYV4MQNOq z&}WsE<_)GuiU6jTMGKSsWVojV4tue01y@`jy?@TGDO(s)qJ`kmPlHXO#IJhELF&1z>ly(2vRQ5o9dto4ZY=a~=xiV{Z2 z%+X9RAt&jG(qKz3^jiccvnctym2N?zrZ2`n&5c7-k$=E3U^30CqA{KDBYIVB+n{6_ z8#|qZ%c~bD^1)O>;~jh=v|M$B+y!1&TMZ+%MHU0jh=52(A2Q2iB?^}rQ;g$Z(NoxM z=IxiP*fkdFbhWIqe?nYm5W|-^Nb*Lpi%9k<8NQBzo~4*AO<@!G5BSexdwF)3F}z5l8;}# zp2Ss5_h?^a@S##yaot}rCoNfdTV}=Kk?-znCkf9)!C_#T4#}vqR*>4!AlCZR@wzh< zovtP|Xvo1ITJe65ivAwH4F4qBHmd*1-E~uzA`pm}sMIaW=qf1H%hPCeS8C&_lu*Rr zqxo3o_Rse|tXOyO(x__vg>|();d06d{v#RJil}S^H=pPT^p%Rfg2yP=EZBR{=U?SC zxsqVGdJ#~4X})`Lb!A%dYui&psO@`=!N)z3*hhL`s)i6%S@BXl>Qds_2#A`7kdmv= z<}IMKYw}cX*rmUIX1}IWZQ9YeyPHqvIN?us{QivXG9BO3A zI_EA(b6`#UJtzzC;OgklQUk5(Ei?nmiX9Do0W2i)JkqY^O)@7lLcol4Ep}`gB)(}Xtdk)@_E|kst8Gus)PS-HwZvw zm+>Y;Vg7!|q8oR9IrqTf#c>tow#G4T_Dgx6r#2aB0NfBP-IF`|lAJhkK((yza+uVn zZ$NN5IT;gO8UL>gXV7|ohv62ut8)9pO_E+-wfgjsSry zp4v^y@C-Jx{bZ3mo^9M>U1MSM$V|Xc)F4BCWGfUdMX$+WB*7e>tLUWW;wO5gBygWkoN=FNz`?IYFXnKbX>tOyI#7Jrp#)_ucMtR<2)~lbQXMFK zGNKnM6wz5G8nDYb9lR`}(@cPxO&6T_+4QGHm>vjuE$&B_PV#5HK@YIWed<2YmIJOF zvmr&|M)2dYTH;)@bYQbMX;V55SE+ImIxm$UHPHW}PwYy^GDGA;f2?Budic=YE24e8d zuI!zIt-PRGi(^c^8M*FsKO;5vu1zt=rA<-l$R)?6rTUn+OT)Dnp7G6Ne9&WrufeWeK9UiICTua+y9MM`nqlz~;j%3(CtMorxh9HUfCA*l4P zPaV|4`oT2d#SS)QZR3s*Q)TRfn(}|jBg_QjQgL}yg%QR}e_)mnX?k0!QbpSQ$=7T% zTUD17_sfO!mkZ29=bniMQM#_Rs}8H8PtUXlMFYJf=*eA zvLRx;qA<}~T%)WIAyRw_EfNryOi|}d8ZAp4FG0iAP+ij_E0m?nk~dSA8Cw&dp`)#o zy~`OI&iYz;PP;Bkl%>K<(U75Rh^kPQ!M%&hJlH;UTf}YdAg)l6F>i>Dp)0rhk)T4E zGR4eVQB)5rDVcIFHO*2XPq`P#x}!pvBF{)y87KP(OCvvy)eM_s#2#q9E5_4M=d2km ziyEiG!qre&ny5Evl^LdC0h{vzFc!}a#8M}OHpSEQV-;%!=Gg;kCTOJtW=i51zVSrAeY8%@krH@ zFb`gn{E9B!Uj2W~dnqIft>UOpTRDl1+n&-&P0nn6Ra_ti!BWorKCyRgJLi$R!=l1+ zGH&l;y7zcl>LKQo_2ph=7(M*%v@pisPS7uTPG_n(9uGHX>AEc5#frjz+ngx2=%gq| zR*V3BM|FDX{c0}f_0}`?iXEwV{3I@{@V01!=uy@t*6c~PS@^88&4yjt`k3xOMC6F$ zKcmnQ&@l*p*PhluLS)r))GE`944KU!g8iqs)_Dt&pHbglWM(CKmZ-W;zJ?FiBvq(- zsj^Ny?lrCC{XfPDQtAqkP^!>9x>fu&u&u3gslu9wrc0*e9PcLVlv>H;2q6AYM%;2~R}0gfC=6(roV?g$A3Y}LWyqy+|n z-0#?RZIa}&Dfo@ru#D2S4kuK#C6>PI!$w8doXQP@nlwcRSN620%{r}nplxFmIAQ+F zc|y!K@9F6T`x_U*kbZT5U9u%SOY>&0iC>VAmgdJS+}r&k9@&)gZ%HvT8;KPZ zDITwHE0HZRef}e!O|p&RB_(GTS7{9EqZDX%bnj<(e73~<7d9U2QMC-F^|e){7E_Io z={DMIYV=F>7W+()DTa6{wH75MnYwCF!@hVzH8)?w^n~D8T?^tckvxb!p1iDOGka1 z_THq!tcN<7w-4C`P1o~Eu`W`d<{~IX)rTE(RJI5{x{ddE3Y6oes|7L_ zu$R+KrzR!_Omjoeg235S@I&aIxDadPcTga`EJm* zN8kFJu7|G?jky6Ii~Pgov-%8WLw1u%06oFTOVtxckEcz&8X7)uy8hXY#^oagpJiK~ zEz7$$7V8x)%YQKl^<$dV6TAenY!GT&O{+f(_(K0u>FZ9~{?Wjl5X?!M^GBm5SEDyq zoSSI<8#43v2t(9_Y@ISxGm=xOH!lLL8rhlXdI$3vM}rO^I_+ zieB7!QEDSjt40sB({#}?%7*opu&+y@ppb_+*l^pZ^YidgC&~1Hu@3@?=uEVkk?--Bb#-;zR z#Arh#m}3t>SH^U?bFdmM@sakkqPHCX! zsl^~2MVEBKW&hY{2|?mqr}f9BkLP)8b@9lpZ~kFLkUu|`xc4|UCp^or7abuL$BMu& zsa#5Vue3V4xw)4M`?0EzB~ql_BL*6ar|y<^<7YzP=R~n7G}0OrKc#7Cvl@!nJ4u(f zz5szn0nv{DD)hiL@Y4ok%9Z4+Jv?j12Khfxc(ROp21(Pf89tS0e? zqnO`A)|xV@(8$T&gkm2v9LqC2()49&vn&~=QwR)hWWWPyWd4MvR2-)JS52{>+U3q#oP&y zGxy48ZZ(N)^W<{XQYX%%g;V&+HxkZJHC2WGb9Z@z2|Il;G}7R@ej~9&0VQ%1k-py! zl`4vSLImBG&FmBkcMznb)>1O;1(hoK*)trVxP$tI+vt7SZ?l4=V){YdT#g6B&R|*Q5a?7L& zHH08dLql7fx8t1ez*Jvkr5Ld-JlF| z+WK{ip7?jCs8E{be7jQy?B(pcmHCc9lX2mCFZM1W# z{+J{aQYB)iWVcdu#%GH3`y6n#GWhCo!wB$^M7yl(hD zu)WXkD%c3z%6~=|$@F3wU;F}|O0K0!lRQPKc=&In!>CP~RbFisbro_9wrZBUt{n(~ z?#5tY8KxZOEoP*A_Co3Aa8~ojcI&Fk*iqz?ONE+Y>;N>2{42<^vz$=(OGfOtf1(QN zDJ;v)N?G~#V8IZ2_ReS$Cuqemtygk0B{zPKP5DTVm8)qPh_piE&|H8v^Ck4e_rO9% zL+Hksqs_G|)iVW7b6+t-b=7-(DT6{hEo$OE;vC~z*FX_y5IEi;B$y!0G2~K&O>#R) zbjMSFaPtQ`aJ@O60EK_|%P1kvezIpr!Rx~p#s`yKj44)j0|G2DUUi&hlHx=hB8Mcg zXuV0H5^*=5A+qAvL2keg%V7BQNWKA;C-4kL+y5osklv=tL#y%5*mv7AyzU9lNIhC& z4Lc5BF7%bTa^$Ge^5Msy=$*{i9NNs|UwcX&=h4g5HXkc8$_UC(UR}(-JY|rqzTfyex zeGb*(y*DvpGDz@wt^QiedZ`NH3RfI@u{f7ikn=eP+>aG!(b^vWQzSF8Rh6idYQNsV zwq(JcMSiE0NNxBFPk8qJO0=iP+|qYxFnAHQru7QMfDVa`?0uyvQfBL4$!8Y+eAX+sl-W+m5j2ag5!FUF{Ii4R{b8 z4~ESie4}$R%G~wp%|y9ChKzJiy+;q3Y&n0JFMggTI=NoU>5xfIfamKp$e| z=peDCxgJ;`{NgtUkON#@0zW^Jf>={$)7p^=l$jDZvQNpH87@F zS)-1gz7AvmTeFD$j<4nDcdTXpOA~Z(zag3?W!Me8simk`WhmDEyv`-1W_a}^fsHB8 zDmF%(gAX^wM@vHPRWn12Q-r(rR=Y~;su}IZTk1xIH%ZDa%tW#jh zZ`b_bla=1;R=v_ne@)7Os1P}+*4Weh4cVwK6EBsVR02c+WlA}5^YKZq*sgh5RDo z=ZYK2Q6|#3ZL9AG#LxdpU)YgfxpvYP=a$OAd5$R?LLt4ve(j_R$0FL%>41O1rhf=v zZZe4uUmB0c8c5TvI~p!vUcnJO*a$GcK@)tAs~QM(^&Eg3=nE(Mn1M`PF#??3A@~@M zzwdsyt;;>gY5z_ z#WWA)GRSk@@S-b5%o}d%eL#DBS}*C7HVY;zWs>YoZnHFb-QeTZ^zB2Dr3zRgAE{9A z(*X@b-JSNN=bp0TpngMW3Kmb?z|U0P;9DvNkp~ch5YZ#e2|7NNlT&-kivUSpQ)u7Y z5{cxbo#5C81KmaC=4zE1Cme>FB!R+HpR<%BrtOTKnY``Wo{I^Wk>*~!|TV}{VVA;Kf>-C$A8mlz($01Qv896naahR^wMA47u=2kh)kpVL#IAj|kV%D;Ua)x}(Y$MhBO`BJyQ> z?AA;Zkne~WM~S_2FoHxjWN1t*nQQ1%+Iah_G3DU@9I>kD7k>i{7Z2;NEq*j8REYar zL}d5A<~09@t#1ymwCCQfZQHhO+qP|c*Y4D|ZQHgzwcTkuooY_s_dDOYe&<~0pOuxB zJlW6AwRe(x<<83N^NtWxhY18Zr|{mIxiFNdVT26$4{IpVCY8E4d>=_OHhCzD@|*;~ z%Zs|&!$o{#lZ25|G6#Sb3a&RgiV!`nft6J>Fd=7!>4}po$%yBmSZ? zE*+W@xfnf2=p$rESnNRw7nmyfn)%O?xiosS=L0$FYzKHR4!?5fWDyNt2gV3>5O?AG z%H7U>6R?G6m*1b+6YA8UnWf}=U1OnWo|hPKsK#!v@oe`4M?L_9gm9B#{idMHT3SMv zy+ZdovZcvRH(pyeQY?3IGBM)xXZ_!^=f45}p80W^#MKK;Kw~^Lw5=aL=LcH$D*&4S zyz6o-0N%61D+OjfB{6qjT0DUtFtqst4q+AE4&Q?s4#<%$)pP?UQQAul!6dK4T-m&S zZD{R(fsV;M06smLT^~t(K@?@bv>|e4IufldLSibU6D|^+ZDtYP50hIe%`wQ9{=>P;wbzq%$#BtwN?Lhdl;04?B3WA zCGCgzZyb5Mpw+& zz-psZHTN*(vYHjfcV`dvF+O@3Em5Sur_!$QoA}xE1O}gi;|eA3fOqnuCQJ+Kr|s>s zT6of}sv^ik@*UPx&yj_X7-}eP1p<1cPeR84T6cmSr)0>9?P3%nLGnB`kOjY*n_X)N z&lOoC8BkltXEVVKn^Pv{W$`?qfnCu{QqC~3hsiVIDJ(vABk=J2&d~$Q1 zR24R?#;qRb&%So2lQ+!=>^`>FpczC5Z|RlW1{g0l{-Dsvm&d>?j`^&P8T^jv<0AYb zde;o&i%|KEaqj5hGwyH1elSk;9PSdpcO9yF9x=Lm!8-Ph!WCfgJ&fwS|7?!{l^*@x za>$jNsQe8sC`-5)8NwbhLOq`@8{UZGYoh^srzd-1y$DVE7%6P`U^v8k_(1iN&l42$yIj_u@^4MF~N5U0R?4a+zM zJ22msQh`U@&(ti=@Ns1A=@rbs?vN;H2A~mHA!Ym}xgpUa{TOQ@<TTBOn_W-|S zQ5QsLlQ~Y#4YNF>R&KRygI2rl^y6S1a=Tl}c1%IAEPFmgCwi~i)B9@Il@HvSTbn+P z?Q^&Xq!VeKxUwjOvRR}kHd02_8 zylv04-T|{(tX|+$qVOA6mfh!H=mtXn=@`IJ*Vi zYv1O6#vCFPzaU19j;1;UqI%Id%UbmP?DNX1qHytP-5TUn1SRqzGTsX$M#91nsseSf zpGDWT{2M=d@8f@mbkE|9)96qKEHY|5o=5upTxtx%H9GH6f;_`g3SQ5u#RFVK>-dm* zhF)E2)dtIGe~_ckx_w}uWS)%|Gr2~oh@2uTqgG0tTpVTD*erLtVtl!oaH9HR+_c^m|P6L0b;w)?`^%K$d#n_o6cud)tP zNr=)6$49I~pNefTfuu_nN(WG(KD|vRbJBFh0D}ZEU4xeZXl3Bloo=MJYav1P);sYd zD58!n5URls-jV*f?}^YwTr0+TG>HeI?G2W=!^aLoTvJ=s7bL>s!J1|=0DI5|cP!H> z;GmcZ(*f5lNdU$X$!%d2W#j}4~pbBx`~b*WnurSx_{ND#BBmkrbJ(M;=g38<5D8b<1JtwY$7UsG>SXrbKdi-K>a&$1nIZ?dLg-Hyr{nT*7i!zyoqa+7c1SOP_`Y>k> zT#{IsOo7FEL$(9!X9gH`){3sP6}QKt_D%>FgCbw582gr1+IAY!ucTE4qc<4i|Inqn zjh;Dx!jiKlZ%7!?;M)n@FeJ|RJEh`nLz^x$Z!l5whle|>-%oIS@sDqYtNv^GG7tPN z*%(zUKk74Pb4^`QftD<>X>cEW-F$+$;>K=4GLHw>#4W=Tl>zwFHEE?xsu&fdJhl#N z)uyb_j1c;w3&4vcRG$7q@duTmh?kQ{rj7-ZqWcjJwXbaavN^Y5MW(3u^B4@)e(j@} zl;`o#h|@DD7^OS zneD5f*OIhd8VA6EeC8I9fcQIjbEg~DD^D*68U^(_c-Y6E@!kMS@G&wDiGKpvcR*Y{ zg1Akwt9|YR7T1?&C;8SY3qwRbLcgaFRqr?d?}m+>(oR#E*@Y9E3v;c8>#eThSff3z zzwnJHROM&bQ!OIUW0B=>FD$OC*{nD|IWs16?LpFt`163Sbl0t`zPsGDfZ%M$?+bBC zB?WxGTncwIew}Leex)GJ)I0yBX6JIq1)qNQ>3la%Camj>&A@MQI+fkVlqBt$0V;fY zX1ELobFH1Ii)!*5#6#A2mCyi<&4rbQZmg ztgGlL-kKQG53h~C9OXjz8EmfHgon2KRie~Z+BcuRUI7+c92G%d8r5^#BPYRRc0e5& zQ)^CAsT#m7wXvnSc-xBw)7=E0ydc{{3#E9Eknjb*Oo1c{feJi$U{x&m?+lp^*uVFqCM(cu zv9_V1%X3JRa;-;Lm(qJ}z?cDKot1|Mct+yZ4${&NmqHeTrQx^>5%YDk@fTZc0p#mt z56PVz0`YxWHqz^3>+4e0&h~jD)%&x|y~tup;&I^I2*fo+moAgR8YRb?)A{4jw^iU9 zHMN*Zj+&@H;+2g%u@Ukf`=YRc<=LW0; zO8<0!CC~2dQL{axvTTYi)WGNu3}HzByUIJ zVyv?$f)adgAX#d9E5;hThtgd9IJDHn%HU9fU)kkyvppvw!Apv5Kh@*5hVuS7Y4b!n zsqOtS5l@;Q^@|YY47rwa5h5tH;M{;s;kUl%SSa-k%+Z)++4eU-5PqfvT9(v5V_~G? z51vK<0_~aKmzD9!ShMDvsZZ&=@`+`=8)sys=A}05UZ3P@&QEjYwhGm1iJX2eL2i#b1~LI9Uu?7O&309$dxZlj51U&L(JB6&oj-z>uIjDt2#LS-U6U0 z<97`wX-V3uhIhqld9a1Su7zaZV6B6vHFYg4yVnh?7Sn36HHp)5Uwia(Cpf}yCpJzR zse_Z2L?Y1VYM)59kNFWfHUh@9LzWRehpIjHtL@FN%Qgakr@BcLhB?i9#7 z3H~^-tDNN2jLZo!O_dAs?-4 zr*Fc!JWu0LUWx6T2480}*j*bR`lkI`csUk>CdT zwqvBTt1azI%Y^(D^u628?WiOB=;f;+qBh(gnMX->xAf9{tOp~ z^c-@9GW(7K$e;fu^A$p_on{7U8nI$<^#pA$YjkzyqF$+XS+fq{5Nv{UHjktg)x$oV zLednt=x}L321C##6S%21{L=_=(zR-4X)TZ5BYf_0oE<8F(y}#9$-ZS~G8Z>P;rHU! zxp6C|PZIa*sVRru9O!Wig5j$#X{Gc@Env1vlm9XI=@+()NWVsQSXQb^50lwLf_^H$ z8DFZ7*@Te|R9QG6<*%=!swgHCJD92{6FV9~SY@G2dHCAmRRE76pLjQA)y_}_x&zp< z9MkNGG7Qt~znWN&xp5YBS*FqdNBkVj0heR#?IiZ~U6y-A&g;Ei8_XFQuQ(exex-kt zucX4Xq#}HAu07^UjOru=7`G`G0SxZN5Z;u9Io}ma1XFgWZ39fs_63nCo{dx(#{qZt zDt9RV=!g{0L&Z#$kjXy(Q&9R8{99zCaz~ZyQ~y3>5#m~%{FxMEs1xy5UYU(CDp)=z zK6hG>N3(xWk9KmF%j zQGQ-ldRiVl>M|4azk=Qh3U%4hEDe>SY;PxFaD+`xE{38kak~GJo#nV&-gm}MPw*43 zvTIgYk@zs?#O1H#8YvpbkfoR+;umWMa-Qt_=a-Pz+D?G<8P9p(OWh`u8{n;K^G>0A zBeNN|z9Yg|lYB?aVEoUm$p)xD?q-GGsXtktffMOwW?qpe^0Vp?z1(xw-B;o1)2wMZ z#j7X7*V+sc;#%b~>yJIg=3NACg_U|rMdTiW$xisMS@Jn39S4K7;CGoE{JjWFI)pO$ z!;h=`WkJ(3L4QsWdT#|wdw^u^+I#@kv0Q7?-?R?;fH_NEK(lX7ZN_b~bkPb@X=>D~ z0)OqM@J4!H+K;)iSF?|zNWWCMzXi#p;-N>hZ068cVzPNh3GY|d zltr6T)$l^Pp>2N!8Jo=mDxg;lcvg9o{FBr;ZK@iMI2|vH+JWqbYylB|+7s#OA9uYc z(*~k_bjQ;oeRf`GkLJXN8uz;ijPHHF%ojI|hRs6obOGJP;bbj&R84EY83*6Lxmj*D zezEo;-FwyeWwRbHAHi}YZIfgDhJ1`gcaxiDT?N^0*Vf}sWfJXInZ=7wWvn#3x*1&d zKJz(k`t@gA@Zg)K;((oe%_wx9Q^|$3%^-?p-({$8O+I{$|>+=|oc`>h9^7_gahgD_Sx7C12k#}dd_%G{a zm`t&p0l%5bSiYPAICBeO>rFkN4=m`4j7q`6vZDR-w_BdX!fU__o49G~Lpwk>ts1;5 zV-^NdeCUXH5KdkO&At>??1jJ40+KT>-Zf7<0R6$j1s=M2BzCSuH;b?QJcSxFl`>~=PA z-YBPP+3$GD_-{Hw>cV2YvCjdH%WbubkhR;bal!zTr&*#14EBqSF{`IDNLwZe!UgED zjYbHrO^z?d6l_oG%!khTi7wM8qoO{fwR08rC&BAG2SKYbGe2B^WC7&QTgPGPdQ7&z z1%>&z1hx`?x_@~e`BY*TzgRBghV4BF_1PYPKN|5bki|}Bx7=1>FpSxm&I1iBc{#@~bEngo6N8JJ(_TyM_ z@{Ao|d`t)NLWV1d$+3WB#(h7_^=qvk#_=f7mp9A#glzDhM&X3N>64TZSo~Th*2L0H z5jtI-bQ}Gm-|iY&D1X`Ux|4MQ=y^Ls^q*4OiIwr!vBNd(QTV=3VT;CHd|`lrVz-I! zcIMr9EJOwEvm14aF0+o+QBugBCA8joWj!T^X-14y?-Jc#?%)6j#zZ31e@={C$)GcS zh?5!k;4tb(V%`$r)+^Yh*fzQfGmY^|1%@N$gGW%UiPhSD83%X0j;$r|(7~uDXLMu4 z^A_1-IC`=<&cX(_PmWwprEH2**ke|;5O=49!gHGSHGSWaDSE@6$)G#4c;)+Gdf=#X z8OtXYh(VxN%S{7_TOT^bCqsh0GtUhCT)*2;Q)K1Zo z!h_Tv==aknfA$(FvDUIOVC%reL`p}TV4 zfe+BB42K>nOmGSmgT*3paPxf22y%|S>yOn%zgY=+O(h3CQ;-x~s`lU!YN~b)Do!Pb zdWqW7f}J_x&L9_FB4?PXn}5sK3&TeZ{+3Zg+$6zfeP8t`1s>R7(vj3ynrx?^V0S^L z>x1AQ4uH1o|8>d!Fh-7QqE}WFoiZXVecc-hjcc$Z=i@Bn;_z)t< zM9G%i6{C|&++<|`pa&Llya)FX#Ql6YF$eG08Gv=Jatu*b{sZq3L&$;tc#S}f-g2Nc z>tf>BmS`E71;4XFyF;m*TOf&|e)BQ%a}+gRdktPWUR}NyTIKXTU~1ZIoi(3}CYe88 zTuq0KKS{uS6xp%@9*2I-(Wadf%&Qz=no zGY{-eD4Dw9=7ntliZR^1kGk5h=aTWY#}63I`?_rbNCE;Lyo&Q*pt%MNJO3fLq#1 zjlQenH>s}M14cVIUDwMXeb+Go5@G`L`OXx~?qkoNj^&QtDu8&|p@kcHKu?paYwB{J zs)GjYjYTU0;LrkGv~HAbM&ozr1S+Oh+$lT#O!g%Ujkt%ygaP60SgR@tUfxzlk$v={fF~FNFR%SyI7RC~@Iu8lkxS5; zLet&l;^L!h#*cUf(k=xxj^IoAhYZ7O6E@2zW_V4o)LjKV@Q#UlRIraM_mSVWxHp{euO+Ib7A zw6&$7a_Ke3ejje@JS{BY6i>LK%f=#B_Ha_S-Jxqdm)D|X;}01^!AyR>ERw6$8*Pp* zVAWyPW$=ONC@w6m`+hno4!&eCPW#qBVr?D3Q1Vlk(YTCEHx*IA)SIhv0ERltw@hy9Jz@x9 z^LGj;{UeROcNBG0#mw6qydk4J^}HCb#4s=>I5E%C#P&Qh0M>mOWgOPFhRJNL&{_8p zGN~9IgQ~h$ERawsUDlP!y8{Y@Ra{dC2m;vz1_1-ry#^{JroDQOEu)u^KHHS+7Y{o5 z_T;dmnZ81dBXE>s0Ae5z;DlhfFk-k5&mUM5eZ7w_ewgqe`35U#kO`(db-!0ddfk0@ zKLTu%52B(4o40?pF7dT?@EshtJ!rb=Do5-}Ol$0x*0One7U5}0L*eynl#hWfD0`Tg&S zvSjS5Jhqq}zP4<%eet0~8dsU4CWBTij`SQd+N6mj2XN7m^Uy_WX@nP4MeKke{;>zr z;tv9i|l_ zi3n+S1SpSmZ*pQRsfVwYUGHt&VlH1{6*J9zZZ^#F#zdpb;^pI-X3Qj75%T^$|1!Og zZ*FehliCT$RjvV#Q(!aXD)J~Oy=r#fxu@D(d2``H;35fgUE%! z0<0{``e@v!eJp~Ur_I#&>EcN{uf zX$~0k&KkcP;cZ>5ib8~4h=PT@5{VmmdA#ZI@{p;9crbii!#v=2o4Rd(-?}1Xe4`!0 zI*bvzRaWVMkXo`jVWz}I?J`4F`{2W=3vg&9WUPMozg60glGv8FA_NG~D-$l?i#dLJ zGV-Ky+?iOz!?)$Rmp9pk8vw^GJ4gRXHkKvEJln(`KjBU8+#T=he|(r4`swl_B+(lj zpAsf$xHIoz>r+W0X``yba)`deBkq~FAa2|}1w`9qz;l^yr87b`3|h`@hn3$vuI$#yj(d$$ zRnI!wKmtAshD{w|#G%$w_8r zX(t1L{bxDY}}gkv7`fm8V;nZg^Ax5Vl~c?Sbu*S#Y|nk3`g)n z>(~!YR#Z-jeevav5dYS9RBzR&_k^}<74#NP~@F`$6}8l^B1sinnx+F z{_o>|fT~35GpqLXvR|1^7z6)eU5xw1veXOTBRMmWej>FRJRs?R0^BP`=P$;KU)#-U z-xT+9Kg=;|OwsMH=+k)n^VGM4vw_sN3v9M+@kqjnE4CnPmr{YJiyQ5as(r~)ccZ5F zt#knqc%u>aNpyydQwVn;$z;VWiOYdGo)ZbwGFtOp$p@vN27#K$JqZ>+=Z~n!OxTS~ z8<*uqrc7b?M^SUc0fFYapjVdHePLq*!xqfrzX${|5YO|%t`5-XL3`1riTWtrgqNI& zEq`3N;drWv6PEckC=ac{(bw+JLN{X&3yXq zGS1hiZMjWWd@Vh~n!}C4UcEI$%^@Ep(WHQZGs70H6!(XSN@j_? zBW$pch&7G`&5QxHuI-rFxhGskSOC_XWtjD{F{gibbn|9X6f)2uRd#%+?40>H_8U%&A zzPXQ`3`QU7w%5a)Oh%|ae3T3g#Rs8Sgoc(n@e1ZjSG{P!9Eza&5=Itna+O+5mjqC? zRXrsOkdr+1vV(uSh^oS=R~LASCOf1UP%*#H`=;hK0fnSa39TD9^@cFqmTms@l79Pe zZu7YZ6l4>eJL~;1kBKRFXa(4WLRM95WJjo7U+{`BJPV2bnZ=)oeh7AmD6eNS^>U9~ zO+yU` z)t^4^2G!=dM(@}xKd~?j8LDU=;sWQ)t{VY!c-eMtF6>h7Z5551g+}MZg~0_jDDB*o zmr?}jka20wMhbvvGdQzQ#BZlnHbM%mV>gS#5j_n^L>uo7v!orh=KWct%+0c z4w=VBT_oS{7Me~FMy>RNBm8v;I7YrJ(<%%N_dy`O+xu+XKv+fa*hb*!qRM zYHEL{N#4M9NqpBFVtGOI&rM%`sGUzmUx}OA#^8U?hXB9STp*GQ))Y0033Pbj(^T*+ znV^B{NSvtEoFQU>7HC4#TEbc7L_xK^?c^=3vX5HYcwPup2wThAcI^#rJsEKgef1d6 zbnV;pZ2Hyh635yjydZq*uCdV^Dbd>m4}d&ud>elHv{w84jNwh;tb^y+*VQOz&%8ez z0@s!5jRRCN-0lw&s5t5}uaFtcn8R`;g7i%t!+Iowbjg&!wk3jeOa)h4a;1H$$6_86 zt>M)3bepYhG}QjUV$^a$@IoJf{Yx7f^K%AfAEaaD0LT5fdrgQ3Y+oIX@hTgP0V)hs zPy7JKca753FGivlKwAdKLK@f#x&9}L7QnB<*k(U z*oWE9zwdG888&OwqcGjBnCD|5fcfAZ8HPr7T|gH{Mb~4aJD(m26rRBYqOBTygURk5 z%=&E4ngH8&T-9Y?@ov+oeBm1@394U0$uvS_D5!1`qrf*=1kzkgC5O>q?WM%hnsuDC z2?v}rRD`qCT1YKG^i4Hq5&wj9OSNDZt-;=>fzsS#?ONJo(Z{n>c;jN9-dwo*T6oLe z^!t6axgM~#zc=;hv+BVclS(l_$K9Q zed|u>t=(q2jY4az4eD%I40|$|LkB{d0O77fM%!rUkU%b^7nvb9W@98Y$RPu1Em=7% zv9X|rp~fhyqr^kr@|$k1){YJ<;|2MKi$f0VV+ntglW_ZLINIJ?oa-X#yCUu4PQ(*? zHe*UwFXSE+7H<#Y-s10N*X6S^+EN@FF_NC`=R#FufYO#UYVhEIruAl+Jro2eK;PUP zvyB+x`}O1rn_~NTnMO+0x6=3R^E2Avjn{RmW0&vS3PHwnpWEhf3kWZ32runaD!jJO zkZ!>HWPY{H6O&?}(@bv*L($L#Ddjy-?-ipd{{8)wPw8_*&Q2-x;Ou#T-@dhV#f;n)EU7D66A7fQ^|8V=F=D=qvyF#kfCvsQ5S`tB!Q7hx2j?lwWP*qk zn}`-_6LTKwHX4fwN)glu92j@kXKjCZ<3<~0jEEB(%U3*7^>joS4F8@ca^2`~C*xa6vg~c*WaR|UkZGl9XS43b7{%Hlt`o)Vy$AJng&cQ(LwY;G7F_KK@^d#*3_gFdM+TR${|%hsj(_)z+$480ULrn8-FjDImEW5$;tp}yE_Ys#&d2t3H{>3iVede#VMu@p$PR|r zfOs3$5Os?Qy7<7;RiyfXwc&v@k!M%a&wx2c{=nTaAa>wjlGI|7aSy;V-P+Wm*c|ef zbf`@JwHL|)X;2TO_r7%mbwLfRAu*eL1O(tFBm)_t16@gsiiD@SI4+5Va|b9vlWR}R zLNtKer5Y1+690fR`!@}T`>t4hhpm5ct*MG9_Rpw5`~Qpzb5d#Xcq56z^k_iUwlDmu z!5E>5z_ldI*q(eI_{=&;k`OI01?0O#b$to3)-)RHe!n-9IkXkJ(DzUe z0c$}ATmxbh$Md*~%B25o6`p>Bn05iGK^ge(Fy8~9rGT@b4Qc=h{m(EjoCnS$gt?HK zTvth29STny1=NUlfsuIyGc671l%iizooTR2OE6B<^T|u~NiYYV*HrF6)3_3jQy!?M zGJv6dAtDF6r-@E?TO~LS1=0(-Eq#?YReE6kwSU3WcwWk1g5b z13iH3BsSw&NLbf)L04bq>$EBTi!SdLYr8=DJ`{nCobAAF6{HPVT=kVb)P6x`8-gBL z{@Xp2HTE^1ds^$+ypX$rIywPewIo9M%Z=APG?2EZ34l}dJjxo}O*95`dO0{k2eom& z)(nw9<}jbc1mXHJpd~!!1fQk%j927vs_he5)sM@5HV zQw0r^)ahi`$y4;c=HFj}y1{Cpe#fy)?>$1yrX^?{CIvw|{- zg^(hI0o?&5o_(1z5S)5INEuyg_0xa>x+d`8fX#vZ1}%_^6yFzL<1prSONRGHJxbDs zh?II_N>*OCm>ouI&E@RRE>LTDDNpkbJ6EhP#V z0Jnda@+fL%VP;?L&sJPz#0cYU?cb7@o23L@s;pz+2tM#|Ps+lSxo7G@$p)yDy+i2~ z>6GA%x&4AqzK=`U?#du4ocgC)LD>e4*>&qDe>5ML%?U7GFH-+pv;s>HDyP30?pLH= zRIEdySC$7r=kb6}1@S*`H7vA#Pxc8X05O9gT^|~U3-*rE{WO9(`qJsJ5M3S1_Lj*w zhG1P72W#T?6oz(q2kMT}u$`qcx^nOx6(?Cy6*FUXCt1Z=di9FTIoKZ*2KLgO#}QgJ znl239p3J^l^%k-&i9;rxD`Wk67wHI+|GJTC*Ij5B#BMPkzE6;GlE65}eFt4%w|W#w zLs}2)kXY=15Ilx%~#PeogVqN8L# ziKe4ur{G_$Oe!%<4KPT~kDjj9H>?wbiv*tk1pih-PlXR5Z~^SUgu&?sEntoRt)L-- z=07PW`7%)-+JOTrLX6UVpEPj`UDqw%S9N^YfZWlaWCC|U4QfYOL z9NT7{b#(EXOP(cbqpqK3r$2Aak8I%J;S~9eCldyavHkaH$GP6 ze%0`t^s+~JlRNNwB01{ezHpBBAJ#g+P54}|+QChj!$#|^uX>*$V5)Wg5Z~|ZPa~&t zg};3_mI?;&tnc^JHiLxKDJ}*vp6B8GFbAL?CG-k__?9ns#3V&WUqCik$uQ7_?`qtP zUt2eRh`(`_qy(0ZN9M$;+DqhV>(nG&Nc9P`a@bXqmR;cRnct_tE{6R@ZyIIn&b6v) z0A=5rbGCGQ8~O7GSq&Xj@4ocO6QZbSPP0H+qnQ$rudY@YyKg51jdyGP?Pz4B7~0e3 z#Am;ph`F;+%!I%j)lW%_R0WZWP#A$8^Y@LH*T*Q;k{Mt#5mOke`fxEk8kB#?Qe%NF~o%Pd9DlsDi-1GZ_l zz|IfY#*t!E#{~i%Fo4t=ygVLxPcVAk&DLV9?(ElQ(5Unzbq?HjOiJU~gui|&!N#3f>bybw0`AvCjNZ}ttw75bnm35k;o zEPmbsMOX{rS{Xn3KeYzZ;0fqHn})~*wyL3%kz z=vs2aNiI#DT%0g3l7Pipyl@ORYfc_aY3 zwX<7;pyKG)wXcLG5Akq)5W%xAr~E%lo0b0?@GKIfA`s{|<1O)Cru`he48|$-bo&SO zoZEot3uz95z#cVTMP3A>zzS(Hca^-$wh`51Y|vP_PDVe9NYEFkGxgBzg`DGk<3yN2 zbbzKR+y*!h1R$^%hDjf8gB%FrTWd(eYM=#z1ER%BiLBZ?WvrQBo9Aye@>FBL$|pW3dtkJ<09zUJ-auo3Et zhq=Di{&n50VbAt`4uhtl)zZHC?ou>qNP(uIolG>Q~ zXp8OdX%u;-(_$Pmzx<$J9ItqlQ*Q3H<>z@UHut?wd&1BsMWVior|uk0Oa)x-m@`) z1aaR3#u4sW&p!DGCsCg=Tc7hBVt|NWaoPjC_5o0&qmUn|qF)H^PUtJd2OP2esit&jkpmow|Gvh<#NvW~L-EDU#f#!g{5Cwbe8EQ6^e z#zA)Qb+!mwAL{7^uyr&&Rq*vEm9{5*Jyj=pQnixm?Ll^a^mR3j_tzv`Z1C|Xd7iSK zb26^7{R|8bxlU#|C%LPOjHxEZL1yrAwg^+7QCQbtQ<|CxfKNy_mSWn9$fwdWegTO+#41dmZz zb(rx-p}I?Aje_*+DwLycz$G;H!?|k-g68)YNKk}MzW8~*yrZ4F8P>y4Mj*0L3KrhE zr!Pa-$@x2AgzBNFU{IZMR<6j}&!H zF-M2Bs?*AjM&FD&hwpiSKs_6KD&t>wg<}S=ukQ>v?{F{A`#x+#GAizU#;xf(=2^5p z?G6JAkCU|?)p;N2T@-|4z9t|n+^BF~?HKJKN8`xnrWmRES-9DUo*cy zXf}rH3!7ab*u2L`2&Y2XUqljUfX_pZ)>RlTyW@UQT)}1Njb_GucT_8UR)wM-{lMjO zWd(Hf%SUitCLN8OSeiXUa$Sp2dpcLaP+r#)Je)ziHy;8%Zn~6LuBKVda6djmf2R=Z zMu{c`9FuQ0!f!rOP5h|k;%!5TARbMWv9J?u3xHuUrJatgg%p3R*$8*rR+@;WXQgeU z$eCa;T^*s9Py2o&4fZb+`4>c%^nuc);(7wY{0sZo~P$mu82ya=-lwAxbkaQHcf= zP5tJ(Oq8a%AUYyifYmU5yuPH|8h8S@*$IVg7qJ>Dh7qtPxE-DJY!3xp7f20EXk2MG z7+XCs9S|+2*28bMFsBRnK-hg6xO9f_YUppjC?M>>ChA}bxXu$X{VfY7ops*%m>t~~ z@44PdUfc<`0xOnY+8XRr|4On(8S!)0r8J>s#Bc>xT6Ua(#(F8qju1ym$0uD{mQGRz z`mt#gBcbJKE-6hb8V%*RG9k2~gPN+>0ry_I6~DP`@+aoWT#6c4CjLKM7ry2U?5hzqvw_%e92O}Z3@vaU z{ww)=jp3Tw%S5)IWDIFjk_##OQMrYFb|$H$3}-i(zO;uO34>WbkY&d1`=||$J_R)f zkuq?QXQ8Un<{$wDVceE*fW zRxOTOX+x5VCf_u?jHM=276y6S)7xVH%B!MHNQF}c4fD^Im9V!bIk8VFp1xwh8-Kf( zk!R+D8dC@xCJStR+Sn(W;lRHqy~jazceCf%?9Il@eS9gWw_EwD^wk}}9vx=&%6kHr zPy?s5Z03Z!s5AZ3(J2m7*eH53LRN$#kCB5+(9+>f(GMk^o`BL(TK`wD z)sgu3<3xAcYTxUL?ZkR6&fm@)89Kz zKGRPaUoJn!%-i$?!S1pE57+NY>kju$wFETY!wa54IjM+>vkxAd?Mi-9j8cR!`r=O6 z-iW3DWrBQD9$2?%Easql|7dLG*gDU0yE3(n87?|X;CtY9)xK4PiwYE23Q7@k$Hk96 z@d=!XWn-Yu8~drE^ZohUPkqmt7_t9r`6C@{u?)(kx1tsR)@i^AfFU*D*WqxXH$Mhx z9VU^4k#+=$u{O;6hkrCFrNS4PszsdXHEKv!Ry|tLY=DVB7j8>*FS%HZ*@8~VVc263 zM7-B2ij95KlDLTRr}!K5di+C)V4_|VY}qZY|GpgEzY#{@TI5r#irFndC(L^O>IPdf zo?kN872u}r61iqMC|`@M_dbojEDlZ_#Sz^lOX-fes3)a`T`zS~3uX5^=E6NTF>^Qx zpTCZimtKwG<+{6{>>egQ42)se^!N!+Kt>otD!9(>%`STz6B~|LLhb98Y_2Xt$Qc@g zXE)7CmF!%eO^_#O%K452jOWYm;V~tM=#FU6=sS#dFp~pvo}%c)Rh(#Ha*Rm13(WF1 zzPaTu6nix4oX@4UVHfme%`Zx^j^3$6Qzw~q?IQ9T90Y~r0 z8p6c{$<|@%7b;g8vFe`c~m|pJLV%i4YO&O7Z%vxCdBhBczI&_vp&D*}oOwdb1 zzS@#?WnN73lb5;%L(Kc&Uethnc8^75V*MR8vjW(2l%-W?$lc11*@@X**>#VU0v6!iaUP0^tY(>ben$43~@g`o0txVVpc#p zd@v^5TFcPZCXnwG^$0#C7Z3mOG|fIBtgR?E<<^l#*R=ZMrz$5$#KEh7H!12r z{x>f`E0@1;Cv5ZSLeKfw&e@nhZt>i3$U+-+4XN%US7*!~O;-GnHloIF1KwXr-3(?* zK3&+|U>*8-8$W20L(S;j;+Uw2q1WFW+R-2gm{@bx96b%p9&e6^tKhZ5MF zH&qRdthL_T9~-W@6iW`Dj@kR+ARmraY_N8LCiebWsfQZ~mQR=3xCWY%9v)8^gZC9t zRqgD&d~9$eFNC&7c+;8SVvMSeCYyBjQ$E{g~x=kb*xYmg=$^p;gY+RJEC&4V~ z4*gUw5)f(s1u+E4jggzgiL6gHUpVw!7wEJD{!AY=2Y|vl#oa#;Up@%%E}$+#3?t99 zrpSZ@a}Xr2TVDT3@Tl!@lboKI2D&9Pym?tr%-s{qgZ|8&h5ZuZh<6~tTkkQup6so| zySrReD7g4-(x&maR>7Wb<4OadqGuEO8c$_!%Z#Mw3mqp@>GE1Yy#MUz7#_y5aczx{2u5?)>^kg z`^{WhKdK*B?4^qI$)$&q{w3su?I_lUy7E1A^;$fktWb+AKO~_Q1%jbwA=T~mS1Oi! zEvte(SV53RY&^zFm_)uqFVI$&&668j1;r&vc^(&$?nAr38r2kw z6-mt!bwY9Ui*x49xX`p_4sSQThO96bPf>ng;R^GQr*M5RO2dc{+}QG(J;00OKR9D; zmFYeEw4D-+fKEuE!NY&Jn9U=!;f0@)QDa;t?J)q?%2P~do0O}o4lLBgCVT%(oYf<} z0Z??CaLyJj-)c8(d@QuzGb>dvzZjx!W9Rf81x)%E{Rku6+Hzvre>jF2rfVOi3Km1; znpgoP)u313uaA6);(o%osWNs?n(QX1&v0GA=^$Ox?Wq-*w~te#&u1;4(I*-4$?+=x z7U}@Kg7n>tCu??AB4>AZ(W%tKm6Rxc0?d?W8X%QPhqW}BO7glcdwREx`0DU5nZtTY6q;hvnwxc7pF#OZW}8aVVY>&aysM)&Y(-hi!X3`~YF z&rFVWO}Xeg8na~@pF2EY5qTcv9G(y)(NMkaSqcB0b=%}ihT46m{U4VGGN5P9rnCzeNLmrQFayEuUunk1q+Z;aojg zek3MGu2%47=iJ|ZcyXa?7t#?w6*}e)>G8KvE1EL+UbA6?alcOwgoPR~(K)+)O+)*= zivk|149sZ+D?!qt@<#tCG`pi~`oW1EzLRf?JS?_9PgnbSCZ`jmPm+|nOWdZ)fnN1l zp5CmLXgNz{KL};1QVgg*5D4t~akly0ZMj@OGhm|pP9d*OtnKahV`MIOjIDVMYUoro zjbq_V$mu@PQ{e-pAD8<HLX3>$&s7)|E=`M}ieo zf>$kzIKL-t{0qD~(7H<1L4F0N$ZWwPY~a2lLi9510E?O}iz8s_;-owgN;=f~b+&&F z>51zH>n+FQNIbi9L)xu;)NT%?m87~>$giktwyOThIM~qFrii-2TX+IjNR|>gHw5Tk!A9sAfJ1zrlCo#JbGbWbHI_3AfI16fN3 z{f8UD7~XdrYBuFn|K=`wYt0UGT+PIwbq@Dl4#uRc=j#!$x$Y+`*~XmTg9R(`Ef$%} zA~qv5JT-7fLalcileb|noXLnngHbFX%qjn9pQHJQ&Q0TM?J{4bzU$Ff9O0iqr*^z~ zP5gVlN&LpjAy8J_cp7eR$-X(%Ho--*{gk!Wv{<4y6O41jk&Ekd@jkJvZ1T=L=-73LlX5sO#T6Bn&LL`CjqvIx6k-A^D$~TW1g-V z2h#|XCh8uw-qYqvAu#NDZQ6kofzeVo)Nhtnq%{&HnmBDLoCLZ z1MGA@_-={DU<3N}auAkv%IwMQ{_cWB@_Lt+o8(odN<0>u*0+M4v3XO*N z*d7f0FWfLRBkw(SPcz1x^#hNMHm-xv4Y&v))x~0m3)^t8k@|fqh7$jUu?N(wW5IQa zOm~;8(=sMtnF3r`jK;Mr#pm z8+FSBy-bVH#Ddjey=M1KDLyzKLb4BIx2+z=*rU;Hwl@$dOocX*zZ|{XDs-ty? z)KQQm$|R0;=gf8&cU6^5S$ZY~_ujYy8(j?RmjCin#rD;vX14P}NNO}^_Zyl`3I2$efNlB{uuq`baVC%oLr;#oRGP9;cRm zj#5P6^```dgr|_4Fl}Vl-k5!EjYvuR&Pye@khZEoc7jJx4}QNPL4#A|bSjfWNmRIW zOlv|9Y`Ri|?YFGaYqFFELi3v_H#xysoISHDz-3VyGABw*mb#!>pj*ue}ZSX-~(i^|3gBAiX*7LA-xG7^3P z8^%S_`WPm)DfCvGXi03CB%GPA^KZ{4b<2~O_cE~h$4GsKUZIm3BbJ8Oogu!=EpyaZ zD5NT}LcS-)qoYKbb#?g7kmD|)a1`F@3_dTH9LqUxH9`dTIuaH_T|fJr+78$2F5BI5 z9NY+wcB@6v+MXFCDsqiJqetkYTB~FOgnZu^aYpsm=F!6NGxbU5*)0qev*)NZiYvW$XWAfW9En0TrZ$tVPtB!{>CAYkK#Un zNu_-??lNdWCgsV)O|bTN>I0WyyCz{isGlrb$EVHLK2G38&WaX6#Xk2ngra^$Z^Zi0 z{sVKy{hEav+dhtOb=atiA&k-`@Z3`tY6dDE^Wu;A9qIrRmQqx9An3JDb`qn9u2G;2 zj`-;Ply{OHGz;vSxg_}D=?^6L%G@0b!P6)2{5d6wdrKm|mie~NPPIg@wbaE#G;Y6* zW|*diM*dY`G$mM?OeC^qj_rhB@x=Bcd%f}==**4)_HalY2mLz6C7*9i}}Z_c#( z5{vjO`|NgIt6N^JPw)&<-MwDg-7JDz+d-Vn4VE$IRl1ax^=1ugTJeRd|p1@;EEyfGaZ(uI-fORc)#1QQ)R!A7{(y(}&GN>vl zXnbwhc$AlsEZmk@56y5Dp-3+XPd(MHX%k)1hT~VhwV*54v zc_m%yUZT^0qi|@#py)iX$F^Rww(c#$+2K-rqTt&JRZ3s%N+58Gr0poaryBN%MOavy zw+h)t^3rKigGBCu=&&b*VJ(?Xx!hE-=pcIo&tq&nTpiLBTpApC?Ig_Kz(jwLK`G-X z%L9EpBM5pL+aNkg7X!s)F+Mtj%C}=7-jHa5ggu zrNC5D1Xt!6tTS*hw4JxOR-Prnz#FUda@CKhZ#}mwOsNdzA5Mt};$_w>poaXnNs&00 z22WUlJ+_d}tJJ5t6ANAA>Y4CPzmTuc?F^!%2m z#wIl9kyy0{p+}nyDe)ogs?g}YlWwN0XYWY74#47!9e}-{V_JyQ@xdTpIK`&Y_O|b- zw1T~(9It!w%_n>qWMmT2MMzXwX-*-}Em1(B8poqF?}cZa$ zSIG8U!n-y|s+e%COxRNqtiAv}`ZHz!p#=}n)`uH&p?7FAB>b_2^UK9MI+|c%pMQq9 zKwSL6o=9f%UftIHR#NJ1gq_pd(-kQ;x=M7118^}NK&o1JN(yh8*Qeces14}*Vc88e zhEON6YSw+{ACXcOH8IK7t7V}t)-;rJa2Z}tr>2MH0V{HtS@6#vgyim%`1UgT&WCb; zxa3VLi;O#Vunv|H1I)Kahyh zl^O7OW}E!yl146t)Y}bsRCgBaE1K)%1#E{x@fC5?9_9YfSlChToi9-+r23Y|@Vk#B zaZ2mzt&b?WVyTF-$WQo#Uoa-i*hcK+BNo8b^+)C^Ls=y$7E;y8ryoM^FPB&6`eVo4 zvuh*M**YD5cP)X%{8efD$r4^6WiQ8f6uU@NPRp1gS7)t#We*Vt>17AJVMd#`5n#)c zJ&r3fjf8qMjXV^55jBj>3Ec1AUC+ePC}8m4yx;- zQtiC>%8a$4CCub@`blB7)V5VFRJWwnw*Aes!CQwnK0^PV7_6{Yn++XCJiyme6cp2Q_Jj_$IkO9t)wH|~GKSBFtd^`P*TX`TbqS@zD&Cr@tH4&+Lk z{LHdB!WQXY$4CYR4cfwoJlpSLD~eX%iZ?#JPhW~|mmK|k-WVf?FgvsZ8m-#pN_o~M zmJ zbeB4tW`D!m3(<|xY$FaM0c9r)zjL{8Acbh>^-R4)ENxqHz{4G#b!C8*D3v`sMRS>m zBIOy%*_V^frCBL0jv#OpfQW>X>eAkPP?IBTdmyzgwDs@R?f>!owQxW9YJDz1ciwPi)O7Q15dLFE zyn$SlmfsBnFFUjVSX1aOZ2MLkDb|!u<&y@1nBufsZP-0dq0FfNbzwvnrYy$psu55> z<&~P2t4g>qy+-)M2Y2SHDYHpWc(K>zRcc)lE%*3SUjE5&g-*`) zrLbNy#Rmw$=x}10gZq&4+x6jmjf|5&R!A;s2(4<&pTiWs6FDQDYGp3NJl4UpUaTR$ zPRYo%7DfWwmoE`nhFAQ|$joSSN1=Wl;)~~!+RBH zQbUymcVrP{aEXPVeA(?5%|tdPXJHVcym@?YKp-p%dGu5so1nhmc~`QyYYKubs093l zOITClVun)h#rw<}o23myDSSOpEiw{1 zMkb9U2j?Uox$LGw(>3~2>M4H7>jKCIK1pt8Kk*T@*% zfqXh%htwJB9_6+6=`nfT}p&j$|EUb&%=L2HR0EMJfV*2QvNps=vY=b;` z0{`ln1ENBai+;RJ79Rx5m~Wez)U$E*YD+OD8_1h-NPDMA&F~!N9;GQcEne@>)fnx3&vz-Le7T#FpGf z0h}BNueH@oST4ngW@TT$#W?@$D^nZaPq)Ev`@CGeo+;uIM=_^O1}R>hEVrJ|UF5`( zB3yrlwej@w#?mK`PE*4-g@>@wlc|F|FagEGfO`Hj#8Xn#+tC=6%J%ojy#@18hw-1;^U|IpmXZ8 z8h!lnZx?Kx zoGmnQPE){%z6pC#86YRCgb56ZVU#uX7tb&G4Rf}@$lRK~aXqn&n z1t`o{5di>y<9#Clnc%Z9n)CniWyKg;JKzpu`}7A`3E!al8v7x~QxRPMkeR#Xw;VC2 zpT!*%LVrZB`{hrK!)D+}wp(||J)xpa&5#~bWR{&+m>xD$iN;=XAt*c0ozEh}{Zm7B z>KR8bIa$KhsF39_dj5XLBLfO_E2+LY#fzk5eqNsdb`5KugmKH&-)~;du>ZJbWtx=* zO<5!P%MTqe;|7Y9i{m?>I^F3jDbO%~ny*V&LB+KX8kHo{MO9DmU@6Fd%W(-#Jz$t> zW-H+4$GPWDN=W_0{lK$t2=DqeF9fHwD7&+cHDGh>m_VEVd6n;Ih3yzks;XZ+nGuSn zUfCNBkY)-+E=Ca`@{o1KFfza4FZexMnFhJULV;h}wJrr?i*`*LP&PS2`bFFnzVQXA z_RZK?`C6Vp1(x*5J($CFnlH(+pIm#qoJWKX`q;C&gC%46mdVA<-Clu*n&*PBzR}0x z+8ccJ^lQk}G?S}-WBx*P#&4;6bs5!KXO)p6AX(NmuBRFM^D>uqJ}*v?s_DF8!^#t+ zYGLi#Dp@GetWjpl1~peY_g@(Viy-Wc*%!F@z}*K4ocJrcr;a#to%oDsESzRToDsaS z7?(Rbf;){PsWu}jrXG_rCTvit<9{^qRE25#DZvshx2gCrj0~4j2u%YO)w9y)3&6og z0#+t^>d?#q_5n2UFTuhQLdBSjQ18Ze)~M*D9sV6eopy-A<*wNigi5HCh5x$_|1(B_ zuA7qWvA?Nm{~=y^bP$*S1UZk8UwyNt{lxQ8+K+(S$*thqmN`+eC7EbyI(rR2eE9Gb zzmY>V1-X&>v>q{q-IaIKQkY~uLBJ+;)LBuJ+|5`E+nLH5>oy$womG*}Fkh}<_I^_T zY3j#GVpYYW8DM@rVBMlqPT+45_^u(^CQRlD)o-Tk>+oNam+69sbQFi2+U(dnS75uQ7ZG!}?GBDMGnf+y5# zSOgj;)4+h^e23%NXG^nosMy4(Y=Ei#QkNxlT+Z<<$t33Onhg3oZAo4w7H_~QoMuY~ z4?`YY96H|c+cir0b5c?}OjJn-?{tinR9$SMY{zIHm3}pSNL|$3P$j_-XANBL$KX{T zoh5w14mEc5spU0t2FzR%$C{JholPSOOvev!fi^N&W5gINs1S1~mdVDs5Rn0zdy?$9 zTx?`VM)s+!KSTQ-m6(u>V)|F5WH*oTkLXpRIL=)0=4TRUcH|b?LK+T-nsPUuII{jD z#hCu+xLI<)tnrTTowP)jzNXW+WODk5>dA{?DPoCJ*~_-G0Zi1GLsmcaJVo`4>#ZrQ z#&i36ZxwVFMP*=F}8H%)a%=f(R_wS5>@p zhr^v}s0~<;5y0o~0^!LoyoBJ*(t&JaeUZEAY8z7ZV7aWpA~-SFjNqxbW(r998TRL3 z{Kfe(4w2=OvK}M{0Ju9uDw3|G;B>NtY7>Qrg37?iBpJV^w>KQ;zDu8)GNFT_xW=i4 z4z(a|sVtWAHSo%1L9{VP45jwAo5t9Ce>qhonyShJM1$X>B0PWNMGMIe23$W!L=9zk zf)lrAzdpvn6U&oTm5PQqKsl5w3)B40@!Z>#<*~b+IRLee1-0JG6L2nifc7vIxVMiy zW+G_c(zoUnyTwPEfh0SSray#w-#;xPaPh;;B6#uN-4Oq?jehQ-2#y z=@MwSmv5qN58YrzJkvS9Uv=vv$vwbEep6#+!-?Gn3AUXZCtE2*R)%QZbr{k?1p~+{ z--I)(>{a)VG=)VnNwD(DdVl_8;aB_FWc<{G8H&HOdz*Y9wd-W{sD&5RQR3hf&(Ih` zfH05v9;wB9)owLx=V79!@@Y2~dF;FD$O=Hcga#XxX1y7zjCkf5MK_f0;{72g0u6kB+3w(^qDZc4WnsP5XB&5WXfc+wK0p?9I)`Ov+0ydY=a zy?4qhTDKQZFg~w@tvtpf&&VvIOyC#qTL66u8qeEjlqpEnE6;vqXz@pc*%+>SD|jHD z63wgFP6@`E0H}uSsos0Xa-ZIR=#s>uFWx<%d>9QORvUTcIsGZgn=0&$T~!V?HkcQf#)-?euh&~^DGeT%ynUaD2Ozb%MmEk!?c^2g%0Z4(Yf%ITUr8o=Tb$oapF zNDTFlUgzzlgBW9yy?4$KE>Q$!IO)!Sy z)FI%y&JLdgEfiGp03C*@gb@%5$DYTKyVRLagt7!RfDa=z`ZQK>=icZ=Buxhf4Eh!Z%p9otD5 zNaYg>ZcJBOKR;q?Q1m$w_Qz<%8taV9womlk>fI~8ht<2*)58XS(rLxvnXC@a)x!;i zTb|LcCHBX4kqoNNzLE|Gium%1!g%pRV&zx8;!^#ohp!#I46_BufhGrvo^;Q!IFNm< z$@0d_N~j*JXMtXW_>vJvUrLqu zO?G7TtafB-X%3*-PuZzsx^$rIb}H@^t;nm4&H#swbh`%ZS|y(`tlil%z!=eC3Vmtk zS6cnEA3|E!524qhMQvy@yF6s;#cvRHI@-C zoekoDSGQb)7RGUIK%UKyx#Gu?qu@yo>`(M|m!-;JdhcSqN|^1jQiB$j5PX!SkfU(@ zQ^~9<4!(?-6w(50mFl?;iDwr6$V#`*b4DQyjTTJGWT(_0OH@C{PvJOE z@F@TJ+LF*+e?cmKs5?G&d-A9l*5I^7V+riIUA+V8q!<-R%(1y)69jm%buO(5~O3}{X&bTdktEWUQ@{hnefeI(P7N|5y z*YLt5ZLigv%xYDVz4%|2 zs^od0kYvedOZ|UoqBr9VHCrSnqber-|MFB7E&Y{0$vODcUv?Q)H~USChzH>p=eQD( z0x{7^K0ZDWWCLnrz<~a!%Gf||Z$U~8J?y<_zN(7lmywTT_RU2r2?-9>xm%hvXROB( zQG4VZhpB>S-*bvaGx<Uzz)1xcIgMqg@_;o%RXo|JC|Y64o5*&hc9cMD~zKX z4}htQf(?VzDspS+|E7BjXkKBm4LIw51i>~AtHS!-Lc29eqI5y%0IGn_u32WwpG0IVGt z%6WR*Ye(C>4||4mD$mL(-fl~kK(~wlPB2M)DXF0AD}nBSyYra`?=!W#vyEnu?r>fi?T<=w ztdZ-()!K2r;XE3)AC>gk!+#D}f!W=b81eg7-qzHZe@G%oe}H0j{Z!jtWGkJ-WAlSJ z8s3aBSMGs=&~_B(-`$7*dk!*|xc_@a5mNjHj~b?(L0m=8>^dD2M)qYn?pWqau8-b` zOJQ5YN}mUtHbIV;9-Wo!_YH>KUiX9bLyCT;O+5fF05da?6RMvne1Pd;M>h1^Jbko7 zPlWzgJn&sC(OoRe^-HpTCc@}gl4u8_i1L3gC!=akqwQi9ArHk={_5N=vhzoMT1=mY z*E2^+SFryI&y|CzfPY)TnWKP@o<1GG_1|8d=igodlHx`QgCF$Bny%mucxOrnCGHlP z*=J^BdW^se`eVZBnG-SG#Nie~Fx30#9Tw2~p|mSpepT(5mex!nbIaKd8f~AJUIBBt z{MrLQkS?*59f0Y9qE}r0bXj08?s+Lx#xAtrt)TaU?4@ui1pk<=zD`N@kbQeCRAr2v zupQw4x%4Uip?&Hl&VK-ZHu)Y<7yJ^j@!h%-@dH^{dq{Jft?V3grDqDRHl{CtoRgZ!EAKjssi zGmlM^`fcTAP)&Rgi9rGO(?{XhSU;cogWTt+P8nbvnPC!J$8okjzZ899QRsAzxlAqc zHH&9L`@*zsz(Z7vus)rTn$DS7zDZg9SZ`oA!VKcOU?iHgqRNS^u}0EyZP@t#A@eXET8_`|APCg5>~&NeTskcPG>t*9}k6>413XlhXvH}suB*)-og<}y#Xf&mC@ zTXRm=sT7~hhzNc+_os8adXUN^YgtwrLG)lf3C(ZU3HW6xan|vl&9P`EAg(Z3XELEH{_^4pt9GFUnOs_V&mOwK}&?ikq=OdG8Ug=$BbR`>6aSp zWBFD_JQXqfCOi(d#OW0}oChivL;*YC%IyzW{UOk3O#2JNQcd5;lX%UvLqQd9s7{j! zdiC1pr9srlj@)VXhATk~+p#}7J8XhW%si=_r_%gbO?9d7%qwo(K>ylk@&lEi2dl)D zUG+o_cBTVGp{mNKTU(s(E*^HnlY7>;+wXz|JkLol#cT~{pzFQMbLC-m5AfjHvSjHW zwi^-TIKCP^ZDD56PSEz`Kv?U_ihZT{6K~0x;=Z>Urw-TePK2m_C`vd|Yr~F%atoxo zH--fpF#oiSb7GKev0+cmMmjD>S~h-erGyCjv~DU4-RN6^GV7QYg#qGI@cDlH#pSwxDCh30Hj&{36cSY6|GQ`PKb65EyJw%UIZJ-$wPhz_{2YoN z=BU|dA7oWG!f@Xpb%|%sE&W$kW=|`g78&6E^uQ4sfTmqZ(TdORvb+Wybl$ecZ@so98Tg@+{SDasoEG9iDIZmshSv0*zrLVW?_2--Y|gO6NOi zOaMAIo?mW4iv6Yyq*89mzV+&H*O1k~68DP)+QC=>9YAV60^N3>9EbM9T^UM@4BE`tW@XB-&=;z{~sBN zos3y=z^JkR2;VnN`(!V>c!AYe!J5D8KW>P5@l9mLz~?hmo$EFB z4rSobKpt$5nZnz^$9OZy#>$}M-3=4S#^W49V@*FBn9D^ihU({}B~gZAW5`CLVR+CF zg}xk2$N>7G)C_QU+dinp-hBBhEG4Y7nNJ6-LL%`Vdti-^61d>@mNclL+im9A3X_F% z94QJzIaJ(!)s=-I`+<|&+^xn%z-EjDu4&>ne}H5FRjs$9I5swuDV*H079Z15mPj*jW{$n51s9Y-PRjBFH>;1fx&RGMUtSTrrJ9)ez&u_Gyi-_p{ z9l%{cIFC0hk&Zzb+V>{_h1t=soO%67I+PwK*F`e$*5l_QlOnnJt(F_VUFkU1M#GzcAqQotTaYo#Lk6FtlYn2x9nzO!UzL@=ax z3KruqAyhZqhdYos1P^gAeDCB3^^eVBO_^*DtgfC(fegcBP@QnW3?`E}B7+}67bpVx zWYm$YXXODFN^gJL2op$aCZ_xUM{CB%(9d3^5ML8{kS0_q0E(*Ch3?PVcr>u?fQtEp z(9>PM^;@&%#mn=CQAcUUZgWHH@F^1Fu?x5})L|r8f$3k$(D{Weu;lM|-BKh$&}Li{ ze|@jpYwxEWJvSds#e^`4-_{OF*tuq*Y(r8ojZ1JJ#6)3Uk9izTqW6%`xzl3TBzaMq z#c%=|v|lu~UuO7pK`0Gi@ps+_M%NZJ!6RXSxjB|x2i2#ks$6)eyPOfdQ4%CJfF(T( zUqvLPYxQg3t19NNg&Op@ys9JWfnwQtyQC-T6_2~|&9X?ddA)0HqlyG3X9CmWCIF;c zX8C^0gTuh{0RJA#<}vI90$YxJkW#L`R^(>+XF2VWH|s|?bOB#x$o`)=PNdSbeBHsp z0308~-;xUYjNI@o3R}VPdJN{$>yf`h_@b7iC$Jg>(l#kOsq!XmKIa(yWg=CEO{(~Y z);Oj~VA~&VsC**O-4CKWqtW!*qQ;g^h8*?V9>~oj67THlKuWLzGc7w`meoJ)N_x^^ zr(*%w@HM$IBY4r{&F>s#G$TMb}I`KgR<>g0?>3ag`}JL~0ql7`YQ6B_t3;&9GH@nbXb}9!ADmzT=X_ zc`utjMOD^r+I?$JAHp&9=CfU{tu`!N2LX33OU$Vn^Ey)1HtG&(J-2fe8?je0KKSeN z7NP=>fJ&gfm)Ot2kCh{w-E3D#WM8y)LdG@7a8+jKKF88W!iSPbiV(c%{X${hW!ja% zubeN;?{`Ams)J**gOZ?@T#3AcjQl`?L9%dTHRv7wgjmUKQTb$KH_LEWX#JM2dI${I zGBezfqnBA1d`qN5mI1M2$^WO9V$TnJMkArfmV(b1pF5jJep1~kC()#KU-FBBo+D$_ zRq|yRm_HE%SE~A0V-z}4SA~n9M|IG=@$CJD7}0zT!16k*mMC9B& zjE90(l+ujBi(G3QRkKknZ_fR4v(%3hRfh{EEOoke1Wz(?I9Smk)PGvZ*qDDn^KMPQ zjH!>3IqfK0PNasb-{VLaX@4I)5i&?vkS1G<2PkR%d?&Pk?}#H>*aktCS{_V@he2 zQ1@Jx3qOe!m2`*quxZmOrh2#8i>} zZl1hyw6P|e-xy;%Nv1qe!0xPzq6WezRv%z&qF*d><@_7~I>~$Roq@zRIPZo1ey|Ubkls#|173y&dq|`H2DnUFeD! zNe}MpvJ^aT4Ae=tFF1*lfwQLEzk@Q6Gd?Qa?oJN|N7c-5{33P$`K>49W?4i8~r z%iI$0`lb820@Jr&c0RAKhjuSp0A*mg%CCqG>~EEzA`Qp9u;xdt`u)H9w74%FE!&IL zBzMF`q^RGqQ>_wJ#ltGurj*!LKt2Z+bu^Poj@29M^hU8A16O{13bX-jy9pX=PX0PJPdlwHeC z(p>eCXJus+v1SIPwD z8|ZJ%etzUM;Rh~5J8ZmRqI~ee?#RVoXYNvXfb~kXe*WIVxC2O7{HW^tM=Z)+S!7_m z{>}Z`>cC0>MCfMXY^zNSa_C6W5p2O@ZE^5)y49gy9qRQScCO6ew+UZu>-B7RuJj;` zMn;6(;{@MNAlkjK$?hP{Ei4;^ZtWwT>=N1bB6U3y*@lH^gb-DZA<sbHH;O_jy6 zCrdc_ z8NNFK7;(zOkfvPS@8Mh$vaUzVsH%0UlW8SL!;kLtdDlu4hsNU|zv7SqR-`J-?=Tiz zE{NA(F2!8zL6psr)Fb%YivB>}I#|f{22Xlk^t$UXeWqVq+MsR%2GN4_r3qq&NvGaf z{TZLnZG0?)l2i=K|8#2v96zbLWO_3K4jz*=rmO#y9}s*LvP_Tb&L#q;8iz1tJJlcW zg|r$!HMBAD-7vaG6ERj1%>G_@W@5slQi1jFGUdB zH_o&!ibk4J2FX8M@)Cs(nTBY0m#3Rq{&TOYDb-Crqq#2_Keeqrl1BUhE(uDTbz@Uf zcwSDf-J0iTi}odGUa|=cXlyLWhvl^@FW!GmjTqokkxi^?$U(2UnXN^pyXEJ$6>~~E zeLA54uhA}BV}nP7k6gottPvit9}_)w0OfbmVAN=g5(n@5;4s};r^Tv=C+mcKL-+2_ zecoHSf7Wri|6I}%ZxxgaJX5f;D6IqpAYrBKG1c~qiFMOd|a^APpZY31I`$cXAhva+8I(%U)bwI=v=BpIulRj$JRV5fW9a;JZe1Ac3@{ljN z($h=yCdPNM7*A?cXsr=&Dvq^PMCP@mU~#au5ao6PtS(B5=zim0=+}bpb$Ot|1q7Qozvzr|@JYjycM)d|F>4@9 z$vnt9c?)C~HKe*MsAA(CN+*WvFo))U&`iA&2Zv+ABWA;CC8@CDTNObR(EMR@674jt z)Z#d_(bu_{J6vSlUFhW)hMAR8=3?FhpN0v!hV=}kit8!IB?+#vNc|eqb)7ELz%%_eeX$mRhZWx z2l(sTUoe|_X_o}6c;XE|D{qP>;v>&p6; zd6!iOaO-iPUT4R1Pr%r~P;_X+KfGZ|!`?)YIjIAz(MI&Mcn75;}aXgsH0&RR^ zRC+rW`n*d?gHtcPF1KTh+~7|s)lzm)6abxEriK@N-14I_w69E#oN8&QzZ>@icd zQQj^(u1AH6?<`bPt*W5Hd}(d2+HJ06PHUp`XXRqs#3Z=KB#5g9DN_VL=WVwgp0u!`344R`l zaJZpO^!=B!lR7bJ{tAt(Ua5d_)jW@90c^=FDQ=G{@Ov^qK&u!sc}_%)oG#{3A&`;Y2w_3o(0>#;}yS?qT%8B*Fn&U z5;Pm^uMrwLYIgV$nxeFJ6cnNfT?>c%@WAy%t%J(?Y~zpP)d{I>v;JV~f*LC=G<1|s zA7b#yz8AP8hBvbkeus2apUoCjV=T@`aZ+DJ2!;GgtHAfYV1f>4{m??w0P1Xv8dvZf zZohJW9AuAv`Dau9uB>ml(i_(GTSw=oUtiZ8)^%@cp*eF#&>q(1+E`D#BYP;@uKGQ! zYhiXU`1O30>Y#FeMPS6KtG~^tz@XGPt##t*;^|aTd;_2PhH%XxVS>f_XVZjvO-SUz zg7})LGb11z@MHew?>tq0?YjKG^-s1H0~OfRfHT3LUPDwDf(I4vm2S^m^EJUdMNpo+ zqEb|=tn4y3(suX}P?RrKZ;X!?G1DL{oKZ!rI-BBu1$z655w@PW{Ita3rE0-&PPq!X~p zi1tRqf4gX54dd5{*-dU}#Ml>CfcaSx#w1uUIHvKas){`_-)wppW>%YA<3iX@pA>ay zv3|_gHKk}n;>mEnsn7?mIP1^6oz`Lkjjv-+k=R$hX>(UCLjydgp-;G6>x<*EMSUNAOSXe;x#w-Scyj_Wc%~_zC3` z=TSajRet&4E0adcVj{Xj0s6Yo>_aQEw<#+L0l#qTlM>jcrj24e0< z_LO*O1O-xANzB9s&H$0qMZ@HW7f+_M-d=0-))pVnLKgx2?Fo#-iz0_R_*=>m55q4E zKC){2KNH>mzW`zco%^Qxl!@7ObdNRmu42%Z(;v*pQ_LW$8P{+y7G5|!&>^1W=fIH$8SqXGjM|M!roFM1mt?^ zadNK7NNLTHT^8jTHmS$i^mRq7?S)w(bX=vX14bJ1@Z+$Ls^Z;j@i1FVDZjk?@p^we zUrr^qm8}wh{cIcH2~n7CF5oKpCOz-C7=euQxmn83@oMtm(d(~rXDV=!EJ>SJcyYnO z(lzX6w62S#?QYVt)e;T&^f5JhKq>>$Fl31gcC>O|)j^3s_TEADIAXQ0!!hppBjhez zi*1p! z*93WORZmw+B%KP=jQM)9l2;wo-IB?S$Al)wL91#;!_5xNS@s`r%SDDoeByt$2d&92 ze#N1Oe|Q*^UnxoavPR`t2V{7v=SOVPPkZqF~0AY`a+)MKK%1BIqYb z;MrWk8c8uJyzbY@`LBW~iizRi0%gIM_$WY8AjJR?-$dEWdvqf~$_7!o2D*9t;G=o2 z=haxQ9#G*;oSIZER@~X12mK{K4`|dY0s^eR6y$+~$+iA47T$k}Rk?q#APWG> z>#MH1hs#ILLtlkX7Ufo$i?%g8NskYP=!Q%B@WE5rvUHBEHJi^R4h2potNgA_0wrF7 zKh!jo8~{b?YM4;w0H{v1otyZr9QrU<6#`0wr>|||xvwDHsjSH{>Mnoxgo+-&^m4x@ zugev?A%UKx64Ppoyg`3ZQw<<-g&wol$61qCXz}*lVb%zWnoD|dlr@a1=n~#KWR0Sz zxX3GKtcfd*Ya00zNF8K#Vye9zd)p8Pxty3`v&)UPC9VygiA!W_%ml`rF4YwpzvSS8+kGl0UvPi?mlcKQ;xG=xG-_ld z&C5tPs_g_(#I}oe7)JU<%=T^+J;;NvM`>tE{<7nqCE>3_qH^Z-X(8N*6tu&|3|a4X z=ssQw>pl)M<-4UKC#{bXe*dy~olYlf^yfcNO928C02BZK00;mZu`EWDk$vUr!`bGA?d)XJ=4L1qJ{B000310RTh*001851ONa48#t$U From 020637fa12dccd7587d4a4b3106704ed8ef00306 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 12 Feb 2015 22:28:29 +0100 Subject: [PATCH 03/32] Corrected issue #355 ( writer not writing strings with leading blanks ) Added Marcus von Cube's addition that allows to write very large files by using a transformation instead of ixml-handling in the string --- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 65 +- ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk | 817 ++++++++++++++++++++++ ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk | 24 + ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk | 309 ++++++++ 4 files changed, 1183 insertions(+), 32 deletions(-) create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk create mode 100644 ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk create mode 100644 ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index eb50abe..825543a 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of @@ -27,7 +27,7 @@ - + @@ -2522,39 +2522,39 @@ ENDMETHOD. - method CREATE_XL_SHAREDSTRINGS. + 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', + 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', + 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'. + 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: 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. + 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. @@ -2624,9 +2624,10 @@ ENDMETHOD. 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. +* if <fs_sheet_string>-string_type EQ 's_leading_blanks'. + IF <fs_sheet_string>-string_value IS NOT INITIAL AND <fs_sheet_string>-string_value(1) EQ ` `. + 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 ). @@ -2639,7 +2640,7 @@ ENDMETHOD. lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). lo_renderer->render( ). - endmethod. +ENDMETHOD. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk new file mode 100644 index 0000000..759ea0b --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk @@ -0,0 +1,817 @@ + + + + *"* 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_xl_sharedstrings. +* +* Redefinition using simple transformation instead of CL_IXML +* +** Constant node name + + TYPES: + BEGIN OF ts_root, + count TYPE string, + unique_count TYPE string, + END OF ts_root. + + DATA: + lv_last_allowed_char TYPE char1, + lv_invalid TYPE string. + + DATA: + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: + ls_root TYPE ts_root, + lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_sytabix TYPE sytabix. + + FIELD-SYMBOLS: + <sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 0: Build Regex for invalid characters + CASE cl_abap_char_utilities=>charsize. + WHEN 1.lv_last_allowed_char = cl_abap_conv_in_ce=>uccpi( 255 ). " FF in non-Unicode + WHEN 2.lv_last_allowed_char = cl_abap_conv_in_ce=>uccpi( 65533 )." FFFD in Unicode + ENDCASE. + CONCATENATE '[^\n\t\r -' lv_last_allowed_char ']' INTO lv_invalid. + +********************************************************************** +* 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 + OR data_type NE 's'. " MvC: Only shared strings + + ls_root-count = lines( lt_cell_data ). + CONDENSE ls_root-count. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + ls_root-unique_count = lines( lt_cell_data ). + CONDENSE ls_root-unique_count. + + LOOP AT lt_cell_data ASSIGNING <sheet_content>. + + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <sheet_content>-cell_value TO ls_shared_string-string_value. + REPLACE ALL OCCURRENCES OF REGEX lv_invalid + IN ls_shared_string-string_value WITH ` `. + APPEND ls_shared_string TO shared_strings. + + ENDLOOP. + +********************************************************************** +* STEP 2: Create XML + + CALL TRANSFORMATION zexcel_tr_shared_strings + SOURCE root = ls_root + shared_strings = shared_strings + OPTIONS xml_header = 'full' + RESULT XML ep_content. + + +ENDMETHOD. + + + METHOD create_xl_sheet. +* +* Build Sheet#.xml with Simple Transformation ZEXCEL_TR_SHEET +* +* This is an adaption of ZCL_EXCEL_WRITER_2007. +* Not all features are supported, notably the autofilter settings, +* conditional formatting and sheet protection. +* +* Bug reports to marcus.voncube AT deutschebahn.com +* + TYPES: + lty_bool TYPE c LENGTH 5. + + CONSTANTS: + lc_false TYPE lty_bool VALUE 'false', "#EC NEEDED + lc_true TYPE lty_bool VALUE 'true', + lc_zero TYPE c LENGTH 1 VALUE '0', + lc_one TYPE c LENGTH 1 VALUE '1', + lc_default_col_width TYPE float VALUE '9.10'. + + TYPES: + BEGIN OF lty_column, + min TYPE i, + max TYPE i, + width TYPE float, + hidden TYPE lty_bool, + customwidth TYPE lty_bool, + bestfit TYPE lty_bool, + collapsed TYPE lty_bool, + outlinelevel TYPE i, + style TYPE i, + END OF lty_column, + + BEGIN OF lty_row, + row TYPE i, + index TYPE i, + spans TYPE c LENGTH 11, "12345:12345" + hidden TYPE lty_bool, + customheight TYPE lty_bool, + height TYPE float, + collapsed TYPE lty_bool, + outlinelevel TYPE i, + customformat TYPE lty_bool, + style TYPE i, + END OF lty_row, + + BEGIN OF lty_mergecell, + ref TYPE c LENGTH 21, "AAA1234567:BBB1234567" + END OF lty_mergecell, + + BEGIN OF lty_hyperlink, + ref TYPE string, + location TYPE string, + r_id TYPE string, + END OF lty_hyperlink, + + BEGIN OF lty_table, + r_id TYPE string, + END OF lty_table, + + BEGIN OF lty_table_area, + left TYPE i, + right TYPE i, + top TYPE i, + bottom TYPE i, + END OF lty_table_area, + + BEGIN OF ty_missing_columns, + first_column TYPE zexcel_cell_column, + last_column TYPE zexcel_cell_column, + END OF ty_missing_columns. + +* +* Root node for transformation +* + DATA: + BEGIN OF l_worksheet, + dimension TYPE string, + tabcolor TYPE string, + summarybelow TYPE c, + summaryright TYPE c, + fittopage TYPE c, + showzeros TYPE c, + tabselected TYPE c, + zoomscale TYPE i, + zoomscalenormal TYPE i, + zoomscalepageview TYPE i, + zoomscalesheetview TYPE i, + workbookviewid TYPE c, + showgridlines TYPE c, + showrowcolheaders TYPE c, + activepane TYPE string, + state TYPE string, + ysplit TYPE i, + xsplit TYPE i, + topleftcell TYPE c LENGTH 10, + activecell TYPE c LENGTH 10, + customheight TYPE lty_bool, + defaultrowheight TYPE float, + defaultcolwidth TYPE float, + outlinelevelrow TYPE i, + outlinelevelcol TYPE i, + cols TYPE STANDARD TABLE OF lty_column, + rows TYPE STANDARD TABLE OF lty_row, + mergecells_count TYPE i, + mergecells TYPE STANDARD TABLE OF lty_mergecell, + hyperlinks_count TYPE i, + hyperlinks TYPE STANDARD TABLE OF lty_hyperlink, + BEGIN OF printoptions, + gridlines TYPE lty_bool, + horizontalcentered TYPE lty_bool, + verticalcentered TYPE lty_bool, + END OF printoptions, + BEGIN OF pagemargins, + left TYPE zexcel_dec_8_2, + right TYPE zexcel_dec_8_2, + top TYPE zexcel_dec_8_2, + bottom TYPE zexcel_dec_8_2, + header TYPE zexcel_dec_8_2, + footer TYPE zexcel_dec_8_2, + END OF pagemargins, + BEGIN OF pagesetup, + blackandwhite TYPE c, + cellcomments TYPE string, + copies TYPE i, + draft TYPE c, + errors TYPE string, + firstpagenumber TYPE i, + fittopage TYPE c, + fittoheight TYPE i, + fittowidth TYPE i, + horizontaldpi TYPE i, + orientation TYPE string, + pageorder TYPE string, + paperheight TYPE string, + papersize TYPE i, + paperwidth TYPE string, + scale TYPE i, + usefirstpagenumber TYPE c, + useprinterdefaults TYPE c, + verticaldpi TYPE i, + END OF pagesetup, + BEGIN OF headerfooter, + differentoddeven TYPE c, + oddheader TYPE string, + oddfooter TYPE string, + evenheader TYPE string, + evenfooter TYPE string, + END OF headerfooter, + drawings TYPE string, + tables_count TYPE i, + tables TYPE STANDARD TABLE OF lty_table, + END OF l_worksheet. + +* +* Local data +* + DATA: + lo_iterator TYPE REF TO cl_object_collection_iterator, + 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, + lv_value TYPE string, + lv_index TYPE i, + lv_spans TYPE string, + lt_range_merge TYPE string_table, + lv_column TYPE zexcel_cell_column, + lv_style_guid TYPE zexcel_cell_style, + ls_last_row TYPE zexcel_s_cell_data, + 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, + 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, + 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, + lts_sorted_columns TYPE SORTED TABLE OF zexcel_cell_column + WITH UNIQUE KEY table_line, + t_missing_columns TYPE STANDARD TABLE OF ty_missing_columns + WITH NON-UNIQUE DEFAULT KEY, + missing_column LIKE LINE OF t_missing_columns, + lo_link TYPE REF TO zcl_excel_hyperlink, + lo_drawings TYPE REF TO zcl_excel_drawings. + + FIELD-SYMBOLS: + <sheet_content> TYPE zexcel_s_cell_data, + <range_merge> LIKE LINE OF lt_range_merge, + <column_dimension> TYPE zexcel_s_worksheet_columndime, + <row_dimension> TYPE zexcel_s_worksheet_rowdimensio, + <col> TYPE lty_column, + <row> TYPE lty_row, + <hyperlink> TYPE lty_hyperlink, + <mergecell> TYPE lty_mergecell, + <table> TYPE lty_table. + +********************************************************************** +* STEP 1: Fill root node +* + l_worksheet-tabcolor = io_worksheet->tabcolor-rgb. + l_worksheet-summarybelow = io_worksheet->zif_excel_sheet_properties~summarybelow. + l_worksheet-summaryright = io_worksheet->zif_excel_sheet_properties~summaryright. + + IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL. + l_worksheet-fittopage = lc_one. + ENDIF. + + l_worksheet-dimension = io_worksheet->get_dimension_range( ). + + IF io_worksheet->zif_excel_sheet_properties~show_zeros EQ abap_true. + l_worksheet-showzeros = lc_one. + ELSE. + l_worksheet-showzeros = lc_zero. + ENDIF. + + IF iv_active = abap_true + OR io_worksheet->zif_excel_sheet_properties~selected EQ abap_true. + l_worksheet-tabselected = lc_one. + ELSE. + l_worksheet-tabselected = lc_zero. + ENDIF. + + 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. + l_worksheet-zoomscale = io_worksheet->zif_excel_sheet_properties~zoomscale. + + 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. + l_worksheet-zoomscalenormal = io_worksheet->zif_excel_sheet_properties~zoomscale_normal. + 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. + l_worksheet-zoomscalepageview = io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview. + 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. + l_worksheet-zoomscalesheetview = io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview. + ENDIF. + + l_worksheet-workbookviewid = lc_zero. + + IF io_worksheet->show_gridlines = abap_true. + l_worksheet-showgridlines = lc_one. + ELSE. + l_worksheet-showgridlines = lc_zero. + ENDIF. + + IF io_worksheet->show_rowcolheaders = abap_true. + l_worksheet-showrowcolheaders = lc_one. + ELSE. + l_worksheet-showrowcolheaders = lc_zero. + ENDIF. + +* +* Freeze +* + 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. + IF lv_freeze_cell_row > 1. + l_worksheet-ysplit = lv_freeze_cell_row - 1. + ENDIF. + + IF lv_freeze_cell_column > 1. + lv_value = lv_freeze_cell_column - 1. + l_worksheet-xsplit = lv_freeze_cell_row - 1. + 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. + l_worksheet-topleftcell = lv_value. + + l_worksheet-activepane = 'bottomRight'. + l_worksheet-state = 'frozen'. + ENDIF. + + l_worksheet-activecell = io_worksheet->get_active_cell( ). + +* +* Row and column info +* + column_dimensions[] = io_worksheet->get_column_dimensions( ). + row_dimensions[] = io_worksheet->get_row_dimensions( ). + + IF NOT column_dimensions IS INITIAL. + io_worksheet->calculate_column_widths( ). + column_dimensions[] = io_worksheet->get_column_dimensions( ). + ENDIF. + + default_row_dimension = io_worksheet->get_default_row_dimension( ). + IF default_row_dimension IS BOUND. + IF default_row_dimension->get_row_height( ) >= 0. + l_worksheet-customheight = lc_true. + lv_value = default_row_dimension->get_row_height( ). + ELSE. + lv_value = '12.75'. + ENDIF. + ELSE. + lv_value = '12.75'. + ENDIF. + CONDENSE lv_value. + l_worksheet-defaultrowheight = lv_value. + + default_col_dimension = io_worksheet->get_default_column_dimension( ). + IF default_col_dimension IS BOUND. + IF default_col_dimension->get_width( ) >= 0. + l_worksheet-defaultcolwidth = default_col_dimension->get_width( ). + ENDIF. + ENDIF. + + LOOP AT row_dimensions ASSIGNING <row_dimension>. + IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row. + l_worksheet-outlinelevelrow = <row_dimension>-row_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + + LOOP AT column_dimensions ASSIGNING <column_dimension>. + IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col. + l_worksheet-outlinelevelcol = <column_dimension>-column_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + +* +* Set column information (width, style, ...) +* + LOOP AT column_dimensions ASSIGNING <column_dimension>. + APPEND INITIAL LINE TO l_worksheet-cols ASSIGNING <col>. + <col>-min = <col>-max = <column_dimension>-column_dimension->get_column_index( ). + <col>-width = <column_dimension>-column_dimension->get_width( ). + IF <col>-width < 0. + <col>-width = lc_default_col_width. + ENDIF. + IF <column_dimension>-column_dimension->get_visible( ) = abap_false. + <col>-hidden = lc_true. + ENDIF. + IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. + <col>-bestfit = lc_true. + ENDIF. + IF default_col_dimension IS BOUND. + IF <column_dimension>-column_dimension->get_width( ) + <> default_col_dimension->get_width( ). + <col>-customwidth = lc_true. + ENDIF. + ELSE. + <col>-customwidth = lc_true. + ENDIF. + IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. + <col>-collapsed = lc_true. + ENDIF. + <col>-outlinelevel = <column_dimension>-column_dimension->get_outline_level( ). + lv_style_guid = <column_dimension>-column_dimension->get_column_style_guid( ). + <col>-style = me->excel->get_style_index_in_styles( lv_style_guid ) - 1. + ENDLOOP. + +* +* 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 +* + LOOP AT t_missing_columns INTO missing_column. + APPEND INITIAL LINE TO l_worksheet-cols ASSIGNING <col>. + <col>-min = missing_column-first_column. + <col>-max = missing_column-last_column. + IF default_col_dimension IS BOUND AND default_col_dimension->get_width( ) >= 0. + <col>-width = default_col_dimension->get_width( ). + ELSE. + <col>-width = lc_default_col_width. + ENDIF. + lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). + <col>-style = me->excel->get_style_index_in_styles( lv_style_guid ) - 1. + ENDLOOP. + +* +* 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. + +* +* Build sheet data node +* +* Spans is constant amongst all rows +* + col_count = io_worksheet->get_highest_column( ). + lv_spans = col_count. + CONCATENATE '1:' lv_spans INTO lv_spans. + CONDENSE lv_spans. + + LOOP AT io_worksheet->sheet_content ASSIGNING <sheet_content>. + + IF ls_last_row-cell_row NE <sheet_content>-cell_row. +* +* Fill row information. +* Cell data is filled in by callback GET_CELLS called from transformation +* + lv_index = sy-tabix. + APPEND INITIAL LINE TO l_worksheet-rows ASSIGNING <row>. + <row>-row = <sheet_content>-cell_row. + <row>-index = lv_index. + <row>-spans = lv_spans. + +* +* Row dimension attributes +* + row_dimension = io_worksheet->get_row_dimension( <sheet_content>-cell_row ). + IF row_dimension->get_visible( ) = abap_false. + <row>-hidden = lc_true. + ENDIF. + + IF row_dimension->get_row_height( ) >= 0. + <row>-customheight = lc_one. + <row>-height = row_dimension->get_row_height( ). + ENDIF. + +* +* Collapsed +* + IF row_dimension->get_collapsed( ) = abap_true. + <row>-collapsed = lc_true. + ENDIF. + +* +* Outline level +* + <row>-outlinelevel = row_dimension->get_outline_level( ). + +* +* Style +* + <row>-style = row_dimension->get_xf_index( ). + IF <row>-style <> 0. + <row>-customformat = lc_one. + ENDIF. + ENDIF. + + ls_last_row = <sheet_content>. + ENDLOOP. + +* +* Merged cells +* + lt_range_merge = io_worksheet->get_merge( ). + IF lt_range_merge IS NOT INITIAL. + l_worksheet-mergecells_count = lines( lt_range_merge ). + + LOOP AT lt_range_merge ASSIGNING <range_merge>. + APPEND INITIAL LINE TO l_worksheet-mergecells ASSIGNING <mergecell>. + <mergecell>-ref = <range_merge>. + io_worksheet->delete_merge( ). + ENDLOOP. + ENDIF. + +* +* Hyperlinks +* + l_worksheet-hyperlinks_count = io_worksheet->get_hyperlinks_size( ). + IF l_worksheet-hyperlinks_count > 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( ). + + APPEND INITIAL LINE TO l_worksheet-hyperlinks ASSIGNING <hyperlink>. + <hyperlink>-ref = lo_link->get_ref( ). + IF lo_link->is_internal( ) = abap_true. + <hyperlink>-location = lo_link->get_url( ). + ELSE. + ADD 1 TO lv_relation_id. + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + <hyperlink>-r_id = lv_value. + ENDIF. + ENDWHILE. + ENDIF. + +* +* Print options +* + IF io_worksheet->print_gridlines = abap_true. + l_worksheet-printoptions-gridlines = lc_true. + ENDIF. + + IF io_worksheet->sheet_setup->horizontal_centered = abap_true. + l_worksheet-printoptions-horizontalcentered = lc_true. + ENDIF. + + IF io_worksheet->sheet_setup->vertical_centered = abap_true. + l_worksheet-printoptions-verticalcentered = lc_true. + ENDIF. + +* +* Page margins +* + l_worksheet-pagemargins-left = io_worksheet->sheet_setup->margin_left. + l_worksheet-pagemargins-right = io_worksheet->sheet_setup->margin_right. + l_worksheet-pagemargins-top = io_worksheet->sheet_setup->margin_top. + l_worksheet-pagemargins-bottom = io_worksheet->sheet_setup->margin_bottom. + l_worksheet-pagemargins-header = io_worksheet->sheet_setup->margin_header. + l_worksheet-pagemargins-footer = io_worksheet->sheet_setup->margin_footer. + +* +* Page setup +* + l_worksheet-pagesetup-cellcomments = io_worksheet->sheet_setup->cell_comments. + l_worksheet-pagesetup-copies = io_worksheet->sheet_setup->copies. + l_worksheet-pagesetup-firstpagenumber = io_worksheet->sheet_setup->first_page_number. + l_worksheet-pagesetup-fittopage = io_worksheet->sheet_setup->fit_to_page. + l_worksheet-pagesetup-fittoheight = io_worksheet->sheet_setup->fit_to_height. + l_worksheet-pagesetup-fittowidth = io_worksheet->sheet_setup->fit_to_width. + l_worksheet-pagesetup-horizontaldpi = io_worksheet->sheet_setup->horizontal_dpi. + l_worksheet-pagesetup-orientation = io_worksheet->sheet_setup->orientation. + l_worksheet-pagesetup-pageorder = io_worksheet->sheet_setup->page_order. + l_worksheet-pagesetup-paperheight = io_worksheet->sheet_setup->paper_height. + l_worksheet-pagesetup-papersize = io_worksheet->sheet_setup->paper_size. + l_worksheet-pagesetup-paperwidth = io_worksheet->sheet_setup->paper_width. + l_worksheet-pagesetup-scale = io_worksheet->sheet_setup->scale. + l_worksheet-pagesetup-usefirstpagenumber = io_worksheet->sheet_setup->use_first_page_num. + l_worksheet-pagesetup-verticaldpi = io_worksheet->sheet_setup->vertical_dpi. + + IF io_worksheet->sheet_setup->black_and_white IS NOT INITIAL. + l_worksheet-pagesetup-blackandwhite = lc_one. + ENDIF. + + IF io_worksheet->sheet_setup->draft IS NOT INITIAL. + l_worksheet-pagesetup-draft = lc_one. + ENDIF. + + IF io_worksheet->sheet_setup->errors IS NOT INITIAL. + l_worksheet-pagesetup-errors = io_worksheet->sheet_setup->errors. + ENDIF. + + IF io_worksheet->sheet_setup->use_printer_defaults IS NOT INITIAL. + l_worksheet-pagesetup-useprinterdefaults = lc_one. + ENDIF. + +* +* Header and footer +* + IF io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. + l_worksheet-headerfooter-differentoddeven = lc_one. + ENDIF. + + io_worksheet->sheet_setup->get_header_footer_string( + IMPORTING + ep_odd_header = l_worksheet-headerfooter-oddheader + ep_odd_footer = l_worksheet-headerfooter-oddfooter + ep_even_header = l_worksheet-headerfooter-evenheader + ep_even_footer = l_worksheet-headerfooter-evenfooter ). + +* +* Drawings +* + lo_drawings = io_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + ADD 1 TO lv_relation_id. + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO l_worksheet-drawings. + ENDIF. + +* +* Tables +* + l_worksheet-tables_count = io_worksheet->get_tables_size( ). + IF l_worksheet-tables_count > 0. + 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( ). + APPEND INITIAL LINE TO l_worksheet-tables ASSIGNING <table>. + ADD 1 TO lv_relation_id. + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO <table>-r_id. + ENDWHILE. + ENDIF. + +********************************************************************** +* STEP 2: Create XML + + me->worksheet = io_worksheet. "Neccessary for callback GET_CELL + + CALL TRANSFORMATION zexcel_tr_sheet + SOURCE worksheet = l_worksheet + cells = me->cells + writer = me + OPTIONS xml_header = 'full' + RESULT XML ep_content. + +ENDMETHOD. "CREATE_XL_SHEET + + + + + METHOD get_cells. +* +* Callback method from transformation ZEXCEL_TR_SHEET +* +* The method fills the data cells for each row. +* This saves memory if there are many rows. +* + DATA: + lv_cell_style TYPE zexcel_cell_style. + + FIELD-SYMBOLS: + <cell> TYPE ty_cell, + <content> TYPE zexcel_s_cell_data, + <style> TYPE zexcel_s_styles_mapping. + + CLEAR cells. + + LOOP AT worksheet->sheet_content FROM i_index ASSIGNING <content>. + IF <content>-cell_row <> i_row. +* +* End of row +* + EXIT. + ENDIF. + +* +* Determine style index +* + IF lv_cell_style <> <content>-cell_style. + lv_cell_style = <content>-cell_style. + UNASSIGN <style>. + IF lv_cell_style IS NOT INITIAL. + READ TABLE styles_mapping ASSIGNING <style> WITH KEY guid = lv_cell_style. + ENDIF. + ENDIF. +* +* Add a new cell +* + APPEND INITIAL LINE TO cells ASSIGNING <cell>. + <cell>-name = <content>-cell_coords. + <cell>-formula = <content>-cell_formula. + <cell>-type = <content>-data_type. + IF <cell>-type = 's'. + <cell>-value = me->get_shared_string_index( <content>-cell_value ). + ELSE. + <cell>-value = <content>-cell_value. + ENDIF. + IF <style> IS ASSIGNED. + <cell>-style = <style>-style. + ELSE. + <cell>-style = -1. + ENDIF. + + ENDLOOP. + +ENDMETHOD. + + diff --git a/ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk b/ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk new file mode 100644 index 0000000..4fb6d8e --- /dev/null +++ b/ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk @@ -0,0 +1,24 @@ + + + <?sap.transform simple?> +<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"> + + <tt:root name="ROOT"/> + <tt:root name="SHARED_STRINGS"/> + + <tt:template> + <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> + <tt:attribute name="count" value-ref="ROOT.COUNT"/> + <tt:attribute name="uniqueCount" value-ref="ROOT.UNIQUE_COUNT"/> + <tt:loop ref="SHARED_STRINGS"> + <si> + <t> + <tt:value ref="STRING_VALUE"/> + </t> + </si> + </tt:loop> + </sst> + </tt:template> + +</tt:transform> + diff --git a/ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk b/ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk new file mode 100644 index 0000000..e575d35 --- /dev/null +++ b/ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk @@ -0,0 +1,309 @@ + + + <?sap.transform simple?> +<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> + + <tt:root name="WORKSHEET"/> + <tt:root name="CELLS"/> + <tt:root name="WRITER"/> + <tt:variable name="owriter" ref-type="ZCL_EXCEL_WRITER_HUGE_FILE"/> + + <tt:template> + <tt:assign ref="WRITER" to-var="owriter"/> + <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" + mc:Ignorable="x14ac"> + <tt:namespace name="r" /> + <tt:namespace name="mc" /> + <tt:namespace name="x14ac" /> + <sheetPr> + <tt:cond check="not-initial(WORKSHEET.TABCOLOR)"> + <tabColor> + <tt:attribute name="rgb" value-ref="WORKSHEET.TABCOLOR" /> + </tabColor> + </tt:cond> + <outlinePr> + <tt:attribute name="summaryRight" value-ref="WORKSHEET.SUMMARYRIGHT" /> + <tt:attribute name="summaryBelow" value-ref="WORKSHEET.SUMMARYBELOW" /> + </outlinePr> + </sheetPr> + <tt:cond check="not-initial(WORKSHEET.FITTOPAGE)"> + <pageSetupPr> + <tt:attribute name="fitToPage" value-ref="WORKSHEET.FITTOPAGE" /> + </pageSetupPr> + </tt:cond> + <dimension> + <tt:attribute name="ref" value-ref="WORKSHEET.DIMENSION" /> + </dimension> + <sheetViews> + <sheetView> + <tt:attribute name="showZeros" value-ref="WORKSHEET.SHOWZEROS" /> + <tt:attribute name="tabSelected" value-ref="WORKSHEET.TABSELECTED" /> + <tt:attribute name="zoomScale" value-ref="WORKSHEET.ZOOMSCALE" /> + <tt:cond check="WORKSHEET.ZOOMSCALENORMAL != 0"> + <tt:attribute name="zoomScaleNormal" value-ref="WORKSHEET.ZOOMSCALENORMAL" /> + </tt:cond> + <tt:cond check="WORKSHEET.ZOOMSCALEPAGEVIEW != 0"> + <tt:attribute name="zoomScalePageLayoutView" value-ref="WORKSHEET.ZOOMSCALEPAGEVIEW" /> + </tt:cond> + <tt:attribute name="zoomScaleSheetLayoutView" value-ref="WORKSHEET.ZOOMSCALESHEETVIEW" /> + <tt:attribute name="workbookViewId" value-ref="WORKSHEET.WORKBOOKVIEWID" /> + <tt:attribute name="showGridLines" value-ref="WORKSHEET.SHOWGRIDLINES" /> + <tt:attribute name="showRowColHeaders" value-ref="WORKSHEET.SHOWROWCOLHEADERS" /> + <tt:cond check="WORKSHEET.YSPLIT != 0 or WORKSHEET.XSPLIT != 0"> + <pane activePane="bottomRight" state="frozen"> + <tt:cond check="WORKSHEET.YSPLIT != 0"> + <tt:attribute name="ySplit" value-ref="WORKSHEET.YSPLIT" /> + </tt:cond> + <tt:cond check="WORKSHEET.XSPLIT != 0"> + <tt:attribute name="xSplit" value-ref="WORKSHEET.XSPLIT" /> + </tt:cond> + <tt:attribute name="topLeftCell" value-ref="WORKSHEET.TOPLEFTCELL" /> + </pane> + </tt:cond> + <selection> + <tt:attribute name="activeCell" value-ref="WORKSHEET.ACTIVECELL" /> + <tt:attribute name="sqref" value-ref="WORKSHEET.ACTIVECELL" /> + </selection> + </sheetView> + </sheetViews> + <sheetFormatPr> + <tt:attribute name="defaultRowHeight" value-ref="WORKSHEET.DEFAULTROWHEIGHT" /> + <tt:cond check="WORKSHEET.DEFAULTCOLWIDTH != 0"> + <tt:attribute name="defaultColWidth" value-ref="WORKSHEET.DEFAULTCOLWIDTH" /> + </tt:cond> + <tt:attribute name="x14ac:outlineLevelRow" value-ref="WORKSHEET.OUTLINELEVELROW" /> + <tt:attribute name="x14ac:outlineLevelCol" value-ref="WORKSHEET.OUTLINELEVELCOL" /> + </sheetFormatPr> + <cols> + <tt:loop ref="WORKSHEET.COLS"> + <col> + <tt:attribute name="min" value-ref="MIN" /> + <tt:attribute name="max" value-ref="MAX" /> + <tt:attribute name="width" value-ref="WIDTH" /> + <tt:cond check="not-initial(HIDDEN)"> + <tt:attribute name="hidden" value-ref="HIDDEN" /> + </tt:cond> + <tt:cond check="not-initial(CUSTOMWIDTH)"> + <tt:attribute name="customWidth" value-ref="CUSTOMWIDTH" /> + </tt:cond> + <tt:cond check="not-initial(BESTFIT)"> + <tt:attribute name="bestFit" value-ref="BESTFIT" /> + </tt:cond> + <tt:cond check="not-initial(COLLAPSED)"> + <tt:attribute name="collapsed" value-ref="COLLAPSED" /> + </tt:cond> + <tt:cond check="OUTLINELEVEL != 0"> + <tt:attribute name="outlineLevel" value-ref="OUTLINELEVEL" /> + </tt:cond> + <tt:cond check="STYLE >= 0"> + <tt:attribute name="style" value-ref="STYLE" /> + </tt:cond> + </col> + </tt:loop> + </cols> + <sheetData> + <tt:loop ref="WORKSHEET.ROWS"> + <row> + <tt:attribute name="r" value-ref="ROW" /> + <tt:attribute name="spans" value-ref="SPANS" /> + <tt:cond check="not-initial(HIDDEN)"> + <tt:attribute name="hidden" value-ref="HIDDEN" /> + </tt:cond> + <tt:cond check="not-initial(CUSTOMHEIGHT)"> + <tt:attribute name="customHeight" value-ref="CUSTOMHIGHT" /> + <tt:attribute name="ht" value-ref="HIGHT" /> + </tt:cond> + <tt:cond check="not-initial(COLLAPSED)"> + <tt:attribute name="collapsed" value-ref="COLLAPSED" /> + </tt:cond> + <tt:cond check="OUTLINELEVEL != 0"> + <tt:attribute name="outlineLevel" value-ref="OUTLINELEVEL" /> + </tt:cond> + <tt:cond check="STYLE != 0"> + <tt:attribute name="customFormat" value-ref="CUSTOMFORMAT" /> + <tt:attribute name="s" value-ref="STYLE" /> + </tt:cond> + <!-- Aufruf get_cells --> + <tt:call-method s-name="GET_CELLS" var="owriter"> + <tt:with-parameter name="I_ROW" ref="ROW" /> + <tt:with-parameter name="I_INDEX" ref="INDEX" /> + </tt:call-method> + <tt:loop ref=".CELLS"> + <c> + <tt:attribute name="r" value-ref="NAME" /> + <tt:cond check="STYLE >= 0"> + <tt:attribute name="s" value-ref="STYLE" /> + </tt:cond> + <tt:cond check="not-initial(FORMULA)"> + <tt:attribute name="f" value-ref="FORMULA" /> + </tt:cond> + <tt:cond check="not-initial(VALUE) and initial(FORMULA)"> + <tt:attribute name="t" value-ref="TYPE" /> + <tt:cond check="TYPE = 'inlineStr'"> + <is> + <t> + <tt:value ref="VALUE" /> + </t> + </is> + </tt:cond> + <tt:cond check="TYPE != 'inlineStr'"> + <v> + <tt:value ref="VALUE" /> + </v> + </tt:cond> + </tt:cond> + </c> + </tt:loop> + </row> + </tt:loop> + </sheetData> + <tt:cond check="WORKSHEET.MERGECELLS_COUNT != 0"> + <mergeCells> + <tt:attribute name="count" value-ref="WORKSHEET.MERGECELLS_COUNT" /> + <tt:loop ref="WORKSHEET.MERGECELLS"> + <mergeCell> + <tt:attribute name="ref" value-ref="REF" /> + </mergeCell> + </tt:loop> + </mergeCells> + </tt:cond> + <tt:cond check="WORKSHEET.HYPERLINKS_COUNT != 0"> + <hyperlinks> + <tt:loop ref="WORKSHEET.HYPERLINKS"> + <hyperlink> + <tt:attribute name="ref" value-ref="REF" /> + <tt:cond check="not-initial(LOCATION)"> + <tt:attribute name="location" value-ref="LOCATION" /> + </tt:cond> + <tt:cond check="not-initial(R_ID)"> + <tt:attribute name="r:id" value-ref="R_ID" /> + </tt:cond> + </hyperlink> + </tt:loop> + </hyperlinks> + </tt:cond> + <tt:cond check="not-initial(WORKSHEET.PRINTOPTIONS)"> + <printOptions> + <tt:ref name="WORKSHEET.PRINTOPTIONS"> + <tt:cond check="not-initial(GRIDLINES)"> + <tt:attribute name="gridLines" value-ref="GRIDLINES" /> + </tt:cond> + <tt:cond check="not-initial(HORIZONTALCENTERED)"> + <tt:attribute name="horizontalCentered" value-ref="HORIZONTALCENTERED" /> + </tt:cond> + <tt:cond check="not-initial(VERTICALCENTERED)"> + <tt:attribute name="verticalCentered" value-ref="VERTICALCENTERED" /> + </tt:cond> + </tt:ref> + </printOptions> + </tt:cond> + <pageMargins> + <tt:ref name="WORKSHEET.PAGEMARGINS"> + <tt:attribute name="left" value-ref="LEFT" /> + <tt:attribute name="right" value-ref="RIGHT" /> + <tt:attribute name="top" value-ref="TOP" /> + <tt:attribute name="bottom" value-ref="BOTTOM" /> + <tt:attribute name="header" value-ref="HEADER" /> + <tt:attribute name="footer" value-ref="FOOTER" /> + </tt:ref> + </pageMargins> + <pageSetup> + <tt:ref name="WORKSHEET.PAGESETUP"> + <tt:cond check="not-initial(BLACKANDWHITE)"> + <tt:attribute name="blackAndWhite" value-ref="BLACKANDWHITE" /> + </tt:cond> + <tt:cond check="not-initial(CELLCOMMENTS)"> + <tt:attribute name="cellComments" value-ref="CELLCOMMENTS" /> + </tt:cond> + <tt:cond check="COPIES != 0"> + <tt:attribute name="copies" value-ref="COPIES" /> + </tt:cond> + <tt:cond check="not-initial(DRAFT)"> + <tt:attribute name="draft" value-ref="DRAFT" /> + </tt:cond> + <tt:cond check="not-initial(ERRORS)"> + <tt:attribute name="errors" value-ref="ERRORS" /> + </tt:cond> + <tt:cond check="FIRSTPAGENUMBER != 0"> + <tt:attribute name="firstPageNumber" value-ref="FIRSTPAGENUMBER" /> + </tt:cond> + <tt:cond check="not-initial(FITTOPAGE)"> + <tt:attribute name="fitToHeight" value-ref="FITTOHIGHT" /> + <tt:attribute name="fitToWidth" value-ref="FITTOWIDTH" /> + </tt:cond> + <tt:cond check="HORIZONTALDPI != 0"> + <tt:attribute name="horizontalDpi" value-ref="HORIZONTALDPI" /> + </tt:cond> + <tt:cond check="not-initial(ORIENTATION)"> + <tt:attribute name="orientation" value-ref="ORIENTATION" /> + </tt:cond> + <tt:cond check="not-initial(PAGEORDER)"> + <tt:attribute name="pageOrder" value-ref="PAGEORDER" /> + </tt:cond> + <tt:cond check="not-initial(PAPERHEIGHT)"> + <tt:attribute name="paperHeight" value-ref="PAPERHEIGHT" /> + </tt:cond> + <tt:cond check="PAPERSIZE != 0"> + <tt:attribute name="paperSize" value-ref="PAPERSIZE" /> + </tt:cond> + <tt:cond check="not-initial(PAPERWIDTH)"> + <tt:attribute name="paperWidth" value-ref="PAPERWIDTH" /> + </tt:cond> + <tt:cond check="SCALE != 0"> + <tt:attribute name="scale" value-ref="SCALE" /> + </tt:cond> + <tt:cond check="not-initial(USEFIRSTPAGENUMBER)"> + <tt:attribute name="useFirstPageNumber" value-ref="USEFIRSTPAGENUMBER" /> + </tt:cond> + <tt:cond check="not-initial(USEPRINTERDEFAULTS)"> + <tt:attribute name="usePrinterDefaults" value-ref="USEPRINTERDEFAULTS" /> + </tt:cond> + <tt:cond check="VERTICALDPI != 0"> + <tt:attribute name="verticalDpi" value-ref="VERTICALDPI" /> + </tt:cond> + </tt:ref> + </pageSetup> + <tt:cond check="not-initial(WORKSHEET.HEADERFOOTER)"> + <headerFooter> + <tt:ref name="WORKSHEET.HEADERFOOTER"> + <tt:cond check="not-initial(WORKSHEET.HEADERFOOTER)"> + <tt:attribute name="differentOddEven" value-ref="DIFFERENTODDEVEN" /> + </tt:cond> + <oddHeader> + <tt:value ref="ODDHEADER" /> + </oddHeader> + <oddFooter> + <tt:value ref="ODDFOOTER" /> + </oddFooter> + <evenHeader> + <tt:value ref="EVENHEADER" /> + </evenHeader> + <evenFooter> + <tt:value ref="EVENFOOTER" /> + </evenFooter> + </tt:ref> + </headerFooter> + </tt:cond> + <tt:cond check="not-initial(WORKSHEET.DRAWINGS)"> + <drawing> + <tt:attribute name="r:id" value-ref="WORKSHEET.DRAWINGS" /> + </drawing> + </tt:cond> + <tt:cond check="WORKSHEET.TABLES_COUNT != 0"> + <mergeCells> + <tt:attribute name="count" value-ref="WORKSHEET.TABLES_COUNT" /> + <tt:loop ref="WORKSHEET.TABLES"> + <tablePart> + <tt:attribute name="r:id" value-ref="R_ID" /> + </tablePart> + </tt:loop> + </mergeCells> + </tt:cond> + </worksheet> + </tt:template> +</tt:transform> + From 3c5601e47b0500b89da8a1d583aa00a2300a8ca9 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 19 Feb 2015 17:05:10 -0600 Subject: [PATCH 04/32] Domains and Data Elements reverted Reverted to latest official SAPlink plungin version (no support for multi languages) --- ZA2X/DOMA/ZEXCEL_BOOLE01.slnk | 9 +++------ ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk | 9 +++------ ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk | 11 ++++------- ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk | 6 +----- ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk | 11 ++++------- ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk | 9 +++------ ZA2X/DOMA/ZEXCEL_FORMAT.slnk | 9 +++------ ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk | 6 +----- ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk | 9 +++------ ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_APPLICATION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_APPVERSION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_BORDER.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_BREAK.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CATEGORY.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_COLOR.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_COMPANY.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_CREATOR.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_FILL.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_FONT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_FORMAT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_HIDDEN.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_INDENT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_LOCKED.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk | 4 +++- ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk | 4 +++- ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_PROTECTION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_ROTATION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SCALECROP.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_SUBJECT.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_TITLE.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk | 6 ++---- ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk | 6 ++---- build/ABAP2XLSX_V_7_0_3.nugg.zip | Bin 321857 -> 4121 bytes 106 files changed, 219 insertions(+), 432 deletions(-) diff --git a/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk b/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk index 0871150..84ec899 100644 --- a/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk +++ b/ZA2X/DOMA/ZEXCEL_BOOLE01.slnk @@ -1,8 +1,5 @@ - - - - - - + + + diff --git a/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk b/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk index e6a2297..ad910a1 100644 --- a/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk +++ b/ZA2X/DOMA/ZEXCEL_CELL_PROTECTION.slnk @@ -1,8 +1,5 @@ - - - - - - + + + diff --git a/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk b/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk index 49f3e0b..7a91743 100644 --- a/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk +++ b/ZA2X/DOMA/ZEXCEL_CONVERTER_OPTION.slnk @@ -1,9 +1,6 @@ - - - - - - - + + + + diff --git a/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk b/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk index 5026052..e2457b1 100644 --- a/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk +++ b/ZA2X/DOMA/ZEXCEL_DEC_8_2.slnk @@ -1,6 +1,2 @@ - - - - - + diff --git a/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk b/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk index 12cec84..3256348 100644 --- a/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk +++ b/ZA2X/DOMA/ZEXCEL_DRAWING_ANCHOR.slnk @@ -1,9 +1,6 @@ - - - - - - - + + + + diff --git a/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk b/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk index c026f59..9503e1e 100644 --- a/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk +++ b/ZA2X/DOMA/ZEXCEL_DRAWING_TYPE.slnk @@ -1,8 +1,5 @@ - - - - - - + + + diff --git a/ZA2X/DOMA/ZEXCEL_FORMAT.slnk b/ZA2X/DOMA/ZEXCEL_FORMAT.slnk index 70efef7..5b23647 100644 --- a/ZA2X/DOMA/ZEXCEL_FORMAT.slnk +++ b/ZA2X/DOMA/ZEXCEL_FORMAT.slnk @@ -1,8 +1,5 @@ - - - - - - + + + diff --git a/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk b/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk index f6549fd..831a53a 100644 --- a/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk +++ b/ZA2X/DOMA/ZEXCEL_PWD_HASH.slnk @@ -1,6 +1,2 @@ - - - - - + diff --git a/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk b/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk index 032b043..f42564e 100644 --- a/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk +++ b/ZA2X/DOMA/ZEXCEL_SHEET_BOOL.slnk @@ -1,8 +1,5 @@ - - - - - - + + + diff --git a/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk index 6ee9d8b..bce7111 100644 --- a/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk +++ b/ZA2X/DTEL/ZEXCEL_ACTIVE_WORKSHEET.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk index 543bc67..c66e97f 100644 --- a/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_AES_PASSWORD.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk index 9f194d7..2b7ec9f 100644 --- a/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_ALIGNMENT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk index 7f775f8..6f6379d 100644 --- a/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_APPLICATION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk index 9a61a48..160dce9 100644 --- a/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk +++ b/ZA2X/DTEL/ZEXCEL_APPVERSION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk index 82e8396..8381c44 100644 --- a/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_BOOK_PROTECTION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_BORDER.slnk b/ZA2X/DTEL/ZEXCEL_BORDER.slnk index a980445..ef5aeea 100644 --- a/ZA2X/DTEL/ZEXCEL_BORDER.slnk +++ b/ZA2X/DTEL/ZEXCEL_BORDER.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_BREAK.slnk b/ZA2X/DTEL/ZEXCEL_BREAK.slnk index d027fc2..55278e2 100644 --- a/ZA2X/DTEL/ZEXCEL_BREAK.slnk +++ b/ZA2X/DTEL/ZEXCEL_BREAK.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk index 3f2c8d5..8116da8 100644 --- a/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk +++ b/ZA2X/DTEL/ZEXCEL_CATEGORY.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk index 17d8ecd..b068929 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk index 692677d..6e0fcf2 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COLUMN_ALPHA.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk index 5cf0a52..1805010 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_COORDS.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk index ac0c34f..3b80419 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_DATA_TYPE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk index b07c979..cca5778 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_FORMULA.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk index 5f44f6a..803b57d 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_PROTECTION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk index 0edd4a4..707dafc 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_ROW.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk index 1b4afc6..54e7683 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_STYLE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk index 6e99cf6..6c20d90 100644 --- a/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CELL_VALUE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_COLOR.slnk b/ZA2X/DTEL/ZEXCEL_COLOR.slnk index 41d84f3..624d45b 100644 --- a/ZA2X/DTEL/ZEXCEL_COLOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_COLOR.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_COMPANY.slnk b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk index bc84916..9ec378e 100644 --- a/ZA2X/DTEL/ZEXCEL_COMPANY.slnk +++ b/ZA2X/DTEL/ZEXCEL_COMPANY.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk index 6a57088..71687fb 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk index 553d265..556401e 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_SHOW_VALUE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk index f63d682..0e3a899 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_TYPE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk index 66b6308..0d4a54e 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITIONAL_VALUE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk index 774e5cf..e363816 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_OPERATOR.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk index f170a50..30766b7 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk index 8fdcc25..049393f 100644 --- a/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONDITION_RULE_ICONSET.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk index 23190c8..f652647 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_FILTER.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk index 981eb8c..29ab61a 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDEHD.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk index e188c22..efe0099 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_HIDENC.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk index 0a5d2f3..ad69df5 100644 --- a/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk +++ b/ZA2X/DTEL/ZEXCEL_CONVERTER_OPTION_SUBTOT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_CREATOR.slnk b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk index a712185..480d349 100644 --- a/ZA2X/DTEL/ZEXCEL_CREATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_CREATOR.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk index 17fdd62..59f06ef 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_ERROR_STYLE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk index 4b2e34f..e595bb1 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_OPERATOR.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk index 916f815..dbcc4c0 100644 --- a/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DATA_VAL_TYPE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk b/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk index 4396478..ec0001f 100644 --- a/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk +++ b/ZA2X/DTEL/ZEXCEL_DEC_8_2.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk index eb3255d..e17e3f1 100644 --- a/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_DESCRIPTION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk index 2b58b49..b22f162 100644 --- a/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk +++ b/ZA2X/DTEL/ZEXCEL_DIAGONAL.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk index 45d1922..84075a3 100644 --- a/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk +++ b/ZA2X/DTEL/ZEXCEL_DOCSECURITY.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk b/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk index 018f4be..ebc1c24 100644 --- a/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk +++ b/ZA2X/DTEL/ZEXCEL_DRAWING_ANCHOR.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk index dcdada2..e5bcdae 100644 --- a/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_DRAWING_TYPE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk b/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk index 2ef0734..590f0a2 100644 --- a/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk +++ b/ZA2X/DTEL/ZEXCEL_EXPORT_DIR.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL.slnk b/ZA2X/DTEL/ZEXCEL_FILL.slnk index 02f974f..55eadf2 100644 --- a/ZA2X/DTEL/ZEXCEL_FILL.slnk +++ b/ZA2X/DTEL/ZEXCEL_FILL.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk index 6161e78..fc1e23f 100644 --- a/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_FILL_TYPE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FONT.slnk b/ZA2X/DTEL/ZEXCEL_FONT.slnk index fc0bfab..f8dea36 100644 --- a/ZA2X/DTEL/ZEXCEL_FONT.slnk +++ b/ZA2X/DTEL/ZEXCEL_FONT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_FORMAT.slnk b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk index 95538cd..bbae5a3 100644 --- a/ZA2X/DTEL/ZEXCEL_FORMAT.slnk +++ b/ZA2X/DTEL/ZEXCEL_FORMAT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk index 4dc045c..217c8b9 100644 --- a/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_GRAPH_TYPE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk b/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk index 9e0d5a5..8ac650f 100644 --- a/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk +++ b/ZA2X/DTEL/ZEXCEL_HIDDEN.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_INDENT.slnk b/ZA2X/DTEL/ZEXCEL_INDENT.slnk index af8be40..ae47deb 100644 --- a/ZA2X/DTEL/ZEXCEL_INDENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_INDENT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk index a563443..ce515c9 100644 --- a/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk +++ b/ZA2X/DTEL/ZEXCEL_KEYWORDS.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_LOCKED.slnk b/ZA2X/DTEL/ZEXCEL_LOCKED.slnk index f812511..bfd8b85 100644 --- a/ZA2X/DTEL/ZEXCEL_LOCKED.slnk +++ b/ZA2X/DTEL/ZEXCEL_LOCKED.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk b/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk index b78d7fe..3fd4707 100644 --- a/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk +++ b/ZA2X/DTEL/ZEXCEL_NUMBER_FORMAT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk b/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk index 1379e55..1b0180e 100644 --- a/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk +++ b/ZA2X/DTEL/ZEXCEL_PANE_STATE.slnk @@ -1,2 +1,4 @@ - + + + diff --git a/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk b/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk index 0f7b3e1..b20a3ee 100644 --- a/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk +++ b/ZA2X/DTEL/ZEXCEL_PANE_TYPE.slnk @@ -1,2 +1,4 @@ - + + + diff --git a/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk b/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk index d4ad5f6..d7cfd87 100644 --- a/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk +++ b/ZA2X/DTEL/ZEXCEL_PRINT_GRIDLINES.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk index 566fbaa..eb1e15d 100644 --- a/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_PROTECTION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk b/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk index fac84c4..d0a4e88 100644 --- a/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk +++ b/ZA2X/DTEL/ZEXCEL_PWD_HASH.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk index a476de4..33adc7d 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_GUID.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk index 330f3d4..5145a39 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_NAME.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk index 98e81c6..6a7c871 100644 --- a/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk +++ b/ZA2X/DTEL/ZEXCEL_RANGE_VALUE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk index d457772..7c83f25 100644 --- a/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_REVISIONSPASSWORD.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk index 4a3fba3..360ef06 100644 --- a/ZA2X/DTEL/ZEXCEL_ROTATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_ROTATION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk index 9fc73fa..5afcd45 100644 --- a/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk +++ b/ZA2X/DTEL/ZEXCEL_SCALECROP.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk index 2adfca6..6240783 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_HIDDEN.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk index 7e2826d..2aa0027 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_ORIENATATION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk index d01dcc6..77fb60f 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PAPER_SIZE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk index ecdeb81..1302f6b 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk index 27cd870..65d77d0 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_PROTECTION_BOOL.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk index e795a1d..6877cce 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SELECTED.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk index 6ee236f..b8fe668 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SHOWZEROS.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk index 1b80869..37dce2e 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_STATE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk index 041f5c3..3b941d9 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_SUMMARY.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk index 41267f5..9bbc2d6 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_TITLE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk b/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk index 6e4a688..26ca58f 100644 --- a/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHEET_ZOOMSCALE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk b/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk index fa94565..420d344 100644 --- a/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHOW_GRIDLINES.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk b/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk index e7f9d60..33f19b6 100644 --- a/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk +++ b/ZA2X/DTEL/ZEXCEL_SHOW_ROWCOLHEADER.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk index 63c9852..88b51f5 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_ARGB.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk index 48e8111..39c919f 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_COMPONENT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk index f8bfd4f..e9e71a8 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_INDEXED.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk index fe267c0..bba3c92 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_THEME.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk index 771d065..1c9cbb9 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_COLOR_TINT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk index 4c8730d..e328ef3 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_FAMILY.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk index ec3ba07..5d5800e 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_NAME.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk index 1ef04ad..961eb58 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SCHEME.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk index 34fb6d7..0b70a8b 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_SIZE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk index 35ab5c0..8092e1b 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FONT_UNDERLINE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk index 4b1c398..88326de 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_FORMULA.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk index 4fd2a13..f40ce4c 100644 --- a/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk +++ b/ZA2X/DTEL/ZEXCEL_STYLE_PRIORITY.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk index 7500693..c673acc 100644 --- a/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk +++ b/ZA2X/DTEL/ZEXCEL_SUBJECT.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk index ef2f7c0..6b3fd1e 100644 --- a/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_TABLE_STYLE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk index 81d71fd..ca69cc4 100644 --- a/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk +++ b/ZA2X/DTEL/ZEXCEL_TABLE_TOTALS_FUNCTION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk index 517bb4e..d4c8c09 100644 --- a/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk +++ b/ZA2X/DTEL/ZEXCEL_TEXT_ROTATION.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_TITLE.slnk b/ZA2X/DTEL/ZEXCEL_TITLE.slnk index ff4f555..b13188f 100644 --- a/ZA2X/DTEL/ZEXCEL_TITLE.slnk +++ b/ZA2X/DTEL/ZEXCEL_TITLE.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk index 9f3b4f9..33743c1 100644 --- a/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk +++ b/ZA2X/DTEL/ZEXCEL_VALIDATION_FORMULA1.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk index c37e51d..ecdaaef 100644 --- a/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk +++ b/ZA2X/DTEL/ZEXCEL_WORKBOOKPASSWORD.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk index 7f77bf4..0c7a9da 100644 --- a/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk +++ b/ZA2X/DTEL/ZEXCEL_WORKSHEETS_NAME.slnk @@ -1,6 +1,4 @@ - - - - + + diff --git a/build/ABAP2XLSX_V_7_0_3.nugg.zip b/build/ABAP2XLSX_V_7_0_3.nugg.zip index 1e8f76ca097155548bfe4dcb46a04ea0bf78a710..84b9b83d45dd5181aae3b3bc331845ee55777498 100644 GIT binary patch delta 4084 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

    88)io>swn& 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 S0096207L))0O#lg0000f(srBx delta 316548 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%0Ayuh%6Zy*7#F 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

  • +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�UBICtL3@TtP4R&EY;m@&|Ypt)_ed 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
    t3=+O0;X<%!z=Y2%AFeldZjShmeMnW zE?LJxW-^~iA^+&2nB}Jate6w7tUPfMaaPpsrPqy);z0^V3 z43}@1r?X=_`F$iUfrcL~i^UMXH)A&`ChR7N^)xz1wZ7Tj=t+rai5InAozbC4r4Xw9 zTNLV$7!SHpq8*C<32696Scq^uwl;N$zo?GJ8?1KcE*vghTNpi&N&7o|?_x6BhUj?I zd5DSp$A&fGScyAzHYwE>68!c?$`b9sTM2<*Hot2l)g9$C1#)vR-$U}f^?|Oqv&8^= z(6Fv@uCW}niU&u)X+iam^VqHhL+uxbx)N)Dr48h|qE}Ly(=Ti|qG-eFRWO(&{;Erh zcyUqFIF77*^IjgM_J+MVz3Q@lFC&IqX?*%g;sGR4l?s>p9%2~!+(ElC!CpDyPfVGU z&%%7WtQB;qT34ifwmET;s)p5`&0(BO+~n&eBZSIo;2l6wu<5xo8WA>`H%F z%%nMEL@okev3=DyaGE_bJw(VFro(Gydg@>q8>Y%@2PreTcZU`JMr{J4uzPH-a2rjB zfV*-u@bj{+^rU#L{g1nrL+nXH_X}z(d1a)?dk(Fg@H-5EofGbrQ$NboaVKvsx163P9V6L-(nWfM)CUK_9vuTrjIf#fre5IcqUC zw=SUI>$|ehHGR2k&E%prirHs#fpo8_-&^nnutZy$A%Wmt{ z-FQvEaA}#VEKiJKdY7AQU!|QAkt-mdhtx>mLN9@7LN>y|&?ZR8U)FxP3GM>~jO98| z8g+nY{1x%;+XT6`AMT8xttb{vbR*H$i|J;yGhu|-N_=;!P>po0?uk`u1h|fSNW10d zs25(!aC1Cv^#Gm;-Dg`zUpX+AsZlGt9LvBTTX+ z2qBSJUoDbQ_G9RQuvd4s%aOq!Og)aCeV3MnF!A9LN=g10N>F)X4B(eJ`?*EHKHCsYc9Qb6|c1 z6)6G+Z1iqZOEcz<+4_(T+KcS z4)H+=v%_bU_%@Q<+^ekp1t#P+#^4bQD@dE$sTAJTrMKctNr*<+{8Bay!me>;i5147 z-bBvl>v+8&43wKQ*lc1p>SrU)h$q~n-aIgT@y3i=q^swb0TH3Jl2^U=PomJW$XvUQ z(O$+avjZk&|FV>~DT3zvq;)ixS?Pi&7MuNN0ha-yC9I5khnbFzg(Vi5dJ7||Hu?gi z@!F|nf*PSmZ9HRS7v)QVkna0L2B^|F^%WYD%bRq$p%4C@456w&h%}lX;Hzt9CF@TFf|6$dRT0`;d~BQsdE8 k*3^Y+Lj|B*P+m?)4=XD*B}}ZxdZ@^!EHd3j9*=_Z9~W1YU;qFB From 661790539a0029ab3524b819ab61e646eafe05c1 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 19 Feb 2015 17:07:26 -0600 Subject: [PATCH 05/32] new daily build fixed DTEL and DOMA elements --- build/ABAP2XLSX_V_7_0_3.nugg | 837 ++++++++++++------------------- build/ABAP2XLSX_V_7_0_3.nugg.zip | Bin 4121 -> 334594 bytes 2 files changed, 312 insertions(+), 525 deletions(-) diff --git a/build/ABAP2XLSX_V_7_0_3.nugg b/build/ABAP2XLSX_V_7_0_3.nugg index 40f01b6..00c7575 100644 --- a/build/ABAP2XLSX_V_7_0_3.nugg +++ b/build/ABAP2XLSX_V_7_0_3.nugg @@ -27449,538 +27449,325 @@ ENDMETHOD. endmethod. - - - - - - + + + - - - - - - + + + - - - - - - - + + + + - - - - + + + + + - - - - - - - + + + - - - - - - + + + - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/ABAP2XLSX_V_7_0_3.nugg.zip b/build/ABAP2XLSX_V_7_0_3.nugg.zip index 84b9b83d45dd5181aae3b3bc331845ee55777498..770df0d24344da917e541ed70bc4f4f914f97dc7 100644 GIT binary patch literal 334594 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 z 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 y695zd000O8p#W4yB;zw1iw^(*Q Date: Sat, 28 Feb 2015 15:48:16 +0100 Subject: [PATCH 06/32] fixed issue #362 - Error when reading templates with certain fonts --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 54 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 1d7d9bf..9932b3f 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -1416,7 +1416,7 @@ ENDMETHOD. - method LOAD_STYLE_FONTS. + METHOD load_style_fonts. *--------------------------------------------------------------------* * issue #230 - Pimp my Code @@ -1427,10 +1427,10 @@ ENDMETHOD. * 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. + 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 @@ -1508,6 +1508,8 @@ ENDMETHOD. lo_node2 = lo_node_font->find_from_name( 'scheme' ). IF lo_node2 IS BOUND. lo_font->scheme = lo_node2->get_attribute( 'val' ). + ELSE. + CLEAR lo_font->scheme. ENDIF. *--------------------------------------------------------------------* @@ -1537,7 +1539,7 @@ ENDMETHOD. ENDWHILE. - endmethod. +ENDMETHOD. From 24515b3a0af29b1239ff1de681c15b79315ca2cc Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 2 Mar 2015 09:46:24 -0600 Subject: [PATCH 07/32] =?UTF-8?q?fix=20issue=20#361=20#363=20#357=20by=20S?= =?UTF-8?q?tefan=20Schm=C3=B6cker""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I commit the changes due to an inconsistency in Stefan's repository --- ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk | 10 +- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 360 +++++++++++++++-------------- 2 files changed, 191 insertions(+), 179 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk index a5c0f20..c70801c 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk @@ -1166,15 +1166,17 @@ ENDCLASS. "lcl_Excel_Common_Test ABAP - + + - - - + + + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 42e976d..1f6bdc6 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -1,35 +1,44 @@ - - - - - - + + - @@ -192,10 +201,13 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION - - + + + + + @@ -203,6 +215,9 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION + + + @@ -211,44 +226,44 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION ABAP SLIS SOI - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_COLUMNS. @@ -301,7 +316,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_COLUMNS. *--------------------------------------------------------------------* * issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 +* - Stefan Schmöcker, 2012-12-02 *--------------------------------------------------------------------* DATA: lv_col_from_int TYPE i, @@ -350,7 +365,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_ROWS. *--------------------------------------------------------------------* * issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 +* - Stefan Schmöcker, 2012-12-02 *--------------------------------------------------------------------* DATA: lv_errormessage TYPE string. @@ -2618,7 +2633,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION method BIND_TABLE. *--------------------------------------------------------------------* * issue #230 - Pimp my Code -* - Stefan Schmöcker, (wi p) 2012-12-01 +* - Stefan Schmöcker, (wi p) 2012-12-01 * - ... * aligning code * message made to support multilinguality @@ -3191,7 +3206,7 @@ ENDMETHOD. * ). * " 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 +* " 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. @@ -3685,12 +3700,33 @@ ENDMETHOD. endmethod. - method DELETE_MERGE. + + + METHOD delete_merge. - DELETE sheet_content_merge INDEX 1. - DELETE sheet_content_merge INDEX 1. + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. + DATA: is_merged TYPE abap_bool. +*--------------------------------------------------------------------* +* If cell information is passed delete merge including this cell, +* otherwise delete all merges +*--------------------------------------------------------------------* + IF ip_cell_column IS INITIAL + OR ip_cell_row IS INITIAL. + CLEAR me->mt_merged_cells. + ELSE. + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. - endmethod. + is_merged = me->is_cell_merged( ip_column = ip_cell_column + ip_row = ip_cell_row ). + IF is_merged = abap_true. + DELETE me->mt_merged_cells. " Delete this merge, that includes this cell + EXIT. + ENDIF. + + ENDLOOP. + ENDIF. + +ENDMETHOD. @@ -4078,78 +4114,30 @@ ENDMETHOD. - method GET_MERGE. + 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: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + DATA: lv_col_from TYPE string, + lv_col_to TYPE string, + lv_row_from TYPE string, + lv_row_to TYPE string, + lv_merge_range TYPE string. - DESCRIBE TABLE sheet_content_merge LINES lv_count. + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. - 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 ':'. + lv_col_from = zcl_excel_common=>convert_column2alpha( <ls_merged_cell>-col_from ). + lv_col_to = zcl_excel_common=>convert_column2alpha( <ls_merged_cell>-col_to ). + lv_row_from = <ls_merged_cell>-row_from. + lv_row_to = <ls_merged_cell>-row_to . + CONCATENATE lv_col_from lv_row_from ':' lv_col_to lv_row_to + INTO lv_merge_range. + CONDENSE lv_merge_range NO-GAPS. 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. + ENDLOOP. -* IF range_from NE space AND range_to NE space. -* CONCATENATE range_from range_to INTO ep_merge_range -* SEPARATED BY ':'. -* ENDIF. - - endmethod. +ENDMETHOD. @@ -4235,11 +4223,11 @@ 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. + 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. @@ -4266,18 +4254,22 @@ ENDMETHOD. IF sy-subrc = 0. CALL FUNCTION l_function EXPORTING - input = ip_value + input = ip_value IMPORTING * LONG_TEXT = - output = l_value + output = l_value * SHORT_TEXT = EXCEPTIONS - OTHERS = 1. + 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. + TRY. + ep_value = l_value. + CATCH cx_root. + ep_value = ip_value. + ENDTRY. ENDIF. ENDIF. ENDIF. @@ -4286,31 +4278,36 @@ ENDMETHOD. ENDIF. ENDIF. - endmethod. +ENDMETHOD. - method IS_CELL_MERGED. - DATA lt_merge_range TYPE string_table. + METHOD is_cell_merged. - FIELD-SYMBOLS <lv_merge_range> LIKE LINE OF lt_merge_range. + DATA: lv_column TYPE i. + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. - lt_merge_range = me->get_merge( ). + lv_column = zcl_excel_common=>convert_column2int( ip_column ). - 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. + rp_is_merged = abap_false. " Assume not in merged area + + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. + + IF <ls_merged_cell>-col_from <= lv_column + AND <ls_merged_cell>-col_to >= lv_column + AND <ls_merged_cell>-row_from <= ip_row + AND <ls_merged_cell>-row_to >= ip_row. + rp_is_merged = abap_true. " until we are proven different + RETURN. ENDIF. + ENDLOOP. -endmethod. + +ENDMETHOD. method PRINT_TITLE_SET_RANGE. @@ -4451,7 +4448,7 @@ endmethod. * 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 + 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. @@ -4767,41 +4764,54 @@ endmethod. - method SET_MERGE. + 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. + DATA: ls_merge TYPE mty_merge, + lv_errormessage TYPE string. - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + FIELD-SYMBOLS: <ls_merge> LIKE LINE OF me->mt_merged_cells. - 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. +*--------------------------------------------------------------------* +* Build new range area to insert into range table +*--------------------------------------------------------------------* + ls_merge-row_from = ip_row. + ls_merge-row_to = ip_row_to. + IF ls_merge-row_from > ls_merge-row_to. + lv_errormessage = 'Merge: First row larger then last row'(405). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. 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. + ls_merge-col_from = zcl_excel_common=>convert_column2int( ip_column_start ). + ls_merge-col_to = zcl_excel_common=>convert_column2int( ip_column_end ). + IF ls_merge-col_from > ls_merge-col_to. + lv_errormessage = 'Merge: First column larger then last column'(406). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. - endmethod. +*--------------------------------------------------------------------* +* Check merge not overlapping with existing merges +*--------------------------------------------------------------------* + LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS WHERE NOT ( row_from > ls_merge-row_to + OR row_to < ls_merge-row_from + OR col_from > ls_merge-col_to + OR col_to < ls_merge-col_from ). + lv_errormessage = 'Overlapping merges'(404). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + + ENDLOOP. + +*--------------------------------------------------------------------* +* Everything seems ok --> add to merge table +*--------------------------------------------------------------------* + INSERT ls_merge INTO TABLE me->mt_merged_cells. + +ENDMETHOD. @@ -4990,7 +5000,7 @@ ENDMETHOD. method SET_TITLE. *--------------------------------------------------------------------* * ToDos: -* 2do§1 The current coding for replacing a named ranges name +* 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 *--------------------------------------------------------------------* @@ -5066,7 +5076,7 @@ ENDMETHOD. * 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 +* 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 *--------------------------------------------------------------------* From 6958ff2b05f1258c0835ef4e7330d3950144b291 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 12 Mar 2015 23:23:34 +0100 Subject: [PATCH 08/32] Minor corrections to cellmerging: ZCL_EXCEL_WORKSHEET->DELETE_MERGE: Parameters made optional ZCL_EXCEL_WORKSHEET->SET_MERGE: ColumnParameters set to "simple" and added Defaultvalues --- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 1f6bdc6..bd0c49d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -1,5 +1,5 @@ - + @@ -3700,8 +3701,8 @@ ENDMETHOD. endmethod. - - + + METHOD delete_merge. FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. @@ -4759,10 +4760,10 @@ ENDMETHOD. endmethod. - - - - + + + + METHOD set_merge. From ef19367c68d4a8ed49843bed840c1f35af770914 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 12 Mar 2015 23:44:15 +0100 Subject: [PATCH 09/32] Further correction to make Demoreport 37 work as before ( changed behaviour is optional merging to-parameters for row or column are omitted to allow intuitive merging like "Row 4, Columns C-F" --- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index bd0c49d..e37b3b7 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -4776,7 +4776,11 @@ ENDMETHOD. * Build new range area to insert into range table *--------------------------------------------------------------------* ls_merge-row_from = ip_row. - ls_merge-row_to = ip_row_to. + IF ip_row IS SUPPLIED AND ip_row IS NOT INITIAL AND ip_row_to IS NOT SUPPLIED. + ls_merge-row_to = ls_merge-row_from. + ELSE. + ls_merge-row_to = ip_row_to. + ENDIF. IF ls_merge-row_from > ls_merge-row_to. lv_errormessage = 'Merge: First row larger then last row'(405). RAISE EXCEPTION TYPE zcx_excel @@ -4785,7 +4789,11 @@ ENDMETHOD. ENDIF. ls_merge-col_from = zcl_excel_common=>convert_column2int( ip_column_start ). - ls_merge-col_to = zcl_excel_common=>convert_column2int( ip_column_end ). + IF ip_column_start IS SUPPLIED AND ip_column_start IS NOT INITIAL AND ip_column_end IS NOT SUPPLIED. + ls_merge-col_to = ls_merge-col_from. + ELSE. + ls_merge-col_to = zcl_excel_common=>convert_column2int( ip_column_end ). + ENDIF. IF ls_merge-col_from > ls_merge-col_to. lv_errormessage = 'Merge: First column larger then last column'(406). RAISE EXCEPTION TYPE zcx_excel From d5137127bfe70abfaa56eb678e520aad014d46d3 Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 18 Mar 2015 15:27:42 -0500 Subject: [PATCH 10/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a3a4df..341d24c 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,4 @@ Generate your professional Excel spreadsheet from ABAP For general information please refer to the blog series [abap2xlsx - Generate your professional Excel spreadsheet from ABAP](http://scn.sap.com/community/abap/blog/2010/07/12/abap2xlsx--generate-your-professional-excel-spreadsheet-from-abap) and the [Wiki section](https://github.com/ivanfemia/abap2xlsx/wiki). 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. +Discussion Board is on [SAP Community Network - Open Source space](http://scn.sap.com/community/open-source), once you create a new discussion please add the prefix [abap2xlsx] in the title and tag the discussion with abap2xlsx. From d14eb709492055eca3494705dd1b0f636237f436 Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 18 Mar 2015 15:29:39 -0500 Subject: [PATCH 11/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 341d24c..329071b 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,4 @@ Generate your professional Excel spreadsheet from ABAP For general information please refer to the blog series [abap2xlsx - Generate your professional Excel spreadsheet from ABAP](http://scn.sap.com/community/abap/blog/2010/07/12/abap2xlsx--generate-your-professional-excel-spreadsheet-from-abap) and the [Wiki section](https://github.com/ivanfemia/abap2xlsx/wiki). 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 - Open Source space](http://scn.sap.com/community/open-source), once you create a new discussion please add the prefix [abap2xlsx] in the title and tag the discussion with abap2xlsx. +**Discussion Board is on [SAP Community Network - Open Source space](http://scn.sap.com/community/open-source), once you create a new discussion please add the prefix [abap2xlsx] in the title and tag the discussion with abap2xlsx.** From ee180cc21dd9f83efad04d391e99d1a98ac55851 Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 18 Mar 2015 15:30:03 -0500 Subject: [PATCH 12/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 329071b..51429e3 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,4 @@ Generate your professional Excel spreadsheet from ABAP For general information please refer to the blog series [abap2xlsx - Generate your professional Excel spreadsheet from ABAP](http://scn.sap.com/community/abap/blog/2010/07/12/abap2xlsx--generate-your-professional-excel-spreadsheet-from-abap) and the [Wiki section](https://github.com/ivanfemia/abap2xlsx/wiki). 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 - Open Source space](http://scn.sap.com/community/open-source), once you create a new discussion please add the prefix [abap2xlsx] in the title and tag the discussion with abap2xlsx.** +**Discussion Board is on [SAP Community Network - Open Source space](http://scn.sap.com/community/open-source), please add the prefix [abap2xlsx] in the title and tag the discussion with abap2xlsx.** From e4906d956218f823efd72ffc52d7f0f4215d3c3d Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 26 Mar 2015 21:16:19 +0100 Subject: [PATCH 13/32] Issue #365 + some new methods to access/delete sheets ZCL_EXCEL->GET_WORKSHEET_BY_INDEX ( new ) ZCL_EXCEL->SET_ACTIVE_SHEET_INDEX ( Test if worksheet is existing --> raise on error ) ZCL_EXCEL->DELETE_WORKSHEET ( new ) ZCL_EXCEL->DELETE_WORKSHEET_BY_NAME ( new ) ZCL_EXCEL->DELETE_WORKSHEET_BY_INDEX ( new ) ZCL_EXCEL_WRITER_2007->CREATE_XL_WORKBOOK ( Set active sheet to 1 if illegal active sheet is passed ) --- ZA2X/CLAS/ZCL_EXCEL.slnk | 169 +++++++++++++++++++++------ ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 126 ++++++++++---------- 2 files changed, 198 insertions(+), 97 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL.slnk b/ZA2X/CLAS/ZCL_EXCEL.slnk index aa008b9..b81d22b 100644 --- a/ZA2X/CLAS/ZCL_EXCEL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL.slnk @@ -1,5 +1,5 @@ - + @@ -111,6 +111,12 @@ CLASS zcl_tc_excel IMPLEMENTATION. ENDCLASS. "zcl_Tc_Excel + + + + + + @@ -290,13 +296,73 @@ ENDMETHOD. endmethod. - + + + + METHOD delete_worksheet. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + l_size TYPE i, + lv_errormessage TYPE string. + + l_size = get_worksheets_size( ). + IF l_size = 1. " Only 1 worksheet left --> check whether this is the worksheet to be deleted + lo_worksheet = me->get_worksheet_by_index( 1 ). + IF lo_worksheet = io_worksheet. + lv_errormessage = 'Deleting last remaining worksheet is not allowed'(002). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + ENDIF. + + me->worksheets->remove( io_worksheet ). + +ENDMETHOD. + + + + METHOD delete_worksheet_by_index. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. + + lo_worksheet = me->get_worksheet_by_index( iv_index ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + me->delete_worksheet( lo_worksheet ). + +ENDMETHOD. + + + + METHOD delete_worksheet_by_name. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. + + lo_worksheet = me->get_worksheet_by_name( iv_title ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + me->delete_worksheet( lo_worksheet ). + +ENDMETHOD. + + method GET_ACTIVE_SHEET_INDEX. r_active_worksheet = me->worksheets->active_worksheet. endmethod. - + method GET_ACTIVE_WORKSHEET. @@ -304,7 +370,7 @@ ENDMETHOD. endmethod. - + method GET_AUTOFILTERS_REFERENCE. @@ -312,13 +378,13 @@ ENDMETHOD. endmethod. - + method GET_DEFAULT_STYLE. ep_style = me->default_style. endmethod. - + method GET_DRAWINGS_ITERATOR. @@ -333,7 +399,7 @@ ENDMETHOD. endmethod. - + method GET_NEXT_TABLE_ID. DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, @@ -353,7 +419,7 @@ ENDMETHOD. endmethod. - + method GET_RANGES_ITERATOR. @@ -361,7 +427,7 @@ ENDMETHOD. endmethod. - + @@ -387,7 +453,7 @@ ENDMETHOD. ep_guid = style-guid. endmethod. - + method GET_STYLES_ITERATOR. @@ -395,7 +461,7 @@ ENDMETHOD. endmethod. - + @@ -426,7 +492,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -449,7 +515,7 @@ ENDMETHOD. endmethod. - + method GET_WORKSHEETS_ITERATOR. @@ -457,7 +523,7 @@ ENDMETHOD. endmethod. - + method GET_WORKSHEETS_NAME. @@ -465,21 +531,34 @@ ENDMETHOD. endmethod. - + - method GET_WORKSHEETS_SIZE. + METHOD get_worksheets_size. ep_size = me->worksheets->size( ). - endmethod. +ENDMETHOD. - + + + + METHOD get_worksheet_by_index. + + + DATA: lv_index TYPE zexcel_active_worksheet. + + lv_index = iv_index. + eo_worksheet = me->worksheets->get( lv_index ). + +ENDMETHOD. + + - method GET_WORKSHEET_BY_NAME. + METHOD get_worksheet_by_name. - DATA: lv_index TYPE zexcel_active_worksheet, - l_size TYPE i. + DATA: lv_index TYPE zexcel_active_worksheet, + l_size TYPE i. l_size = get_worksheets_size( ). @@ -493,22 +572,38 @@ ENDMETHOD. CLEAR eo_worksheet. - endmethod. +ENDMETHOD. - + - method SET_ACTIVE_SHEET_INDEX. - me->worksheets->active_worksheet = i_active_worksheet. - endmethod. - - - - method SET_ACTIVE_SHEET_INDEX_BY_NAME. + + METHOD set_active_sheet_index. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. - 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. +*--------------------------------------------------------------------* +* Check whether worksheet exists +*--------------------------------------------------------------------* + lo_worksheet = me->get_worksheet_by_index( i_active_worksheet ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + 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( ). @@ -522,16 +617,16 @@ ENDMETHOD. count = count + 1. ENDWHILE. - endmethod. +ENDMETHOD. - + method SET_DEFAULT_STYLE. me->default_style = ip_style. endmethod. - + method STYLEMAPPING_DYNAMIC_STYLE. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 825543a..70f533b 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -6052,7 +6052,7 @@ ENDMETHOD. - method CREATE_XL_WORKBOOK. + METHOD create_xl_workbook. *--------------------------------------------------------------------* * issue #230 - Pimp my Code * - Stefan Schmöcker, (done) 2012-11-07 @@ -6066,69 +6066,69 @@ ENDMETHOD. *--------------------------------------------------------------------* ** 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', + 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', + 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', + 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#'. + 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: 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. + 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 @@ -6218,6 +6218,12 @@ ENDMETHOD. value = '8445' ). " Set Active Sheet lv_active_sheet = excel->get_active_sheet_index( ). +* issue #365 - test if sheet exists - otherwise set active worksheet to 1 + lo_worksheet = excel->get_worksheet_by_index( lv_active_sheet ). + IF lo_worksheet IS NOT BOUND. + lv_active_sheet = 1. + excel->SET_ACTIVE_SHEET_INDEX( lv_active_sheet ). + ENDIF. IF lv_active_sheet > 1. lv_active_sheet = lv_active_sheet - 1. lv_value = lv_active_sheet. @@ -6369,7 +6375,7 @@ ENDMETHOD. lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). lo_renderer->render( ). - endmethod. +ENDMETHOD. From ebad7f4166950cfca414585c8d75a1f539ec7d7c Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Tue, 31 Mar 2015 16:02:29 +0200 Subject: [PATCH 14/32] issue #366, added support of conditional formatting to readerclass, added 2 more conditional formatting rules, added support of these formatting rules to writerclass, modified writerclass to have a uniform way of creating dxfs-style-entries --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 736 +++++++++++-- ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk | 83 +- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 1072 ++++++++++--------- ZA2X/TABL/ZEXCEL_CONDITIONAL_ABOVE_AVG.slnk | 8 + ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk | 5 +- ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk | 7 + 6 files changed, 1343 insertions(+), 568 deletions(-) create mode 100644 ZA2X/TABL/ZEXCEL_CONDITIONAL_ABOVE_AVG.slnk create mode 100644 ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 9932b3f..ef61935 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -272,6 +272,7 @@ endclass. IXML + @@ -557,6 +558,136 @@ ENDMETHOD. endmethod. + + + + + + METHOD get_dxf_style_guid. + DATA: lo_ixml_dxf_children TYPE REF TO if_ixml_node_list, + lo_ixml_iterator_dxf_children TYPE REF TO if_ixml_node_iterator, + lo_ixml_dxf_child TYPE REF TO if_ixml_element, + + lv_dxf_child_type TYPE string, + + lo_ixml_element TYPE REF TO if_ixml_element, + lo_ixml_element2 TYPE REF TO if_ixml_element, + lv_val TYPE string. + + DATA: ls_cstyle TYPE zexcel_s_cstyle_complete, + ls_cstylex TYPE zexcel_s_cstylex_complete. + + + + lo_ixml_dxf_children = io_ixml_dxf->get_children( ). + lo_ixml_iterator_dxf_children = lo_ixml_dxf_children->create_iterator( ). + lo_ixml_dxf_child ?= lo_ixml_iterator_dxf_children->get_next( ). + WHILE lo_ixml_dxf_child IS BOUND. + + lv_dxf_child_type = lo_ixml_dxf_child->get_name( ). + CASE lv_dxf_child_type. + + WHEN 'font'. +*--------------------------------------------------------------------* +* italic +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'i' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'val' ). + IF lv_val <> '0'. + ls_cstyle-font-italic = 'X'. + ls_cstylex-font-italic = 'X'. + ENDIF. + + ENDIF. +*--------------------------------------------------------------------* +* bold +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'b' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'val' ). + IF lv_val <> '0'. + ls_cstyle-font-bold = 'X'. + ls_cstylex-font-bold = 'X'. + ENDIF. + + ENDIF. +*--------------------------------------------------------------------* +* strikethrough +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'strike' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'val' ). + IF lv_val <> '0'. + ls_cstyle-font-strikethrough = 'X'. + ls_cstylex-font-strikethrough = 'X'. + ENDIF. + + ENDIF. +*--------------------------------------------------------------------* +* color +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'color' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'rgb' ). + ls_cstyle-font-color-rgb = lv_val. + ls_cstylex-font-color-rgb = 'X'. + ENDIF. + + WHEN 'fill'. + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'patternFill' ). + IF lo_ixml_element IS BOUND. + lo_ixml_element2 = lo_ixml_element->find_from_name( 'bgColor' ). + IF lo_ixml_element2 IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element2->get_attribute_ns( 'rgb' ). + IF lv_val IS NOT INITIAL. + ls_cstyle-fill-filltype = zcl_excel_style_fill=>c_fill_solid. + ls_cstyle-fill-bgcolor-rgb = lv_val. + ls_cstylex-fill-filltype = 'X'. + ls_cstylex-fill-bgcolor-rgb = 'X'. + ENDIF. + ENDIF. + CLEAR lv_val. + lv_val = lo_ixml_element2->get_attribute_ns( 'theme' ). + IF lv_val IS NOT INITIAL. + ls_cstyle-fill-filltype = zcl_excel_style_fill=>c_fill_solid. + ls_cstyle-fill-bgcolor-theme = lv_val. + ls_cstylex-fill-filltype = 'X'. + ls_cstylex-fill-bgcolor-theme = 'X'. + ENDIF. + ENDIF. + +* 2do - borders into dxf-styles. Here and in writerclass +* WHEN 'border'. +* lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'left' ). +* IF lo_ixml_element IS BOUND. +* CLEAR lv_val. +* lv_val = lo_ixml_element2->get_attribute_ns( 'style' ). +* IF lv_val IS NOT INITIAL. +* ls_cstyle-borders-left-border_style = lv_val. +* ls_cstylex-borders-left-border_style = 'X'. +* ENDIF. +* ENDIF. + + ENDCASE. + + lo_ixml_dxf_child ?= lo_ixml_iterator_dxf_children->get_next( ). + + ENDWHILE. + + + + + rv_style_guid = io_excel->get_static_cellstyle_guid( ip_cstyle_complete = ls_cstyle + ip_cstylex_complete = ls_cstylex ). + + +ENDMETHOD. @@ -753,6 +884,52 @@ ENDMETHOD. endmethod. + + + + + METHOD load_dxf_styles. + + DATA: lo_styles_xml TYPE REF TO if_ixml_document, + lo_node_dxfs TYPE REF TO if_ixml_element, + + lo_nodes_dxf TYPE REF TO if_ixml_node_collection, + lo_iterator_dxf TYPE REF TO if_ixml_node_iterator, + lo_node_dxf TYPE REF TO if_ixml_element, + + lv_dxf_count TYPE i. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF mt_dxf_styles. + +*--------------------------------------------------------------------* +* Look for dxfs-node +*--------------------------------------------------------------------* + lo_styles_xml = me->get_ixml_from_zip_archive( iv_path ). + lo_node_dxfs = lo_styles_xml->find_from_name( 'dxfs' ). + CHECK lo_node_dxfs IS BOUND. + + +*--------------------------------------------------------------------* +* loop through all dxf-nodes and create style for each +*--------------------------------------------------------------------* + lo_nodes_dxf ?= lo_node_dxfs->get_elements_by_tag_name( 'dxf' ). + lo_iterator_dxf = lo_nodes_dxf->create_iterator( ). + lo_node_dxf ?= lo_iterator_dxf->get_next( ). + WHILE lo_node_dxf IS BOUND. + + APPEND INITIAL LINE TO mt_dxf_styles ASSIGNING <ls_dxf_style>. + <ls_dxf_style>-dxf = lv_dxf_count. " We start counting at 0 + ADD 1 TO lv_dxf_count. " prepare next entry + + <ls_dxf_style>-guid = get_dxf_style_guid( io_ixml_dxf = lo_node_dxf + io_excel = io_excel ). + lo_node_dxf ?= lo_iterator_dxf->get_next( ). + + ENDWHILE. + + +ENDMETHOD. + @@ -876,7 +1053,7 @@ ENDMETHOD. - method LOAD_STYLES. + METHOD load_styles. *--------------------------------------------------------------------* * issue #230 - Pimp my Code @@ -887,63 +1064,63 @@ ENDMETHOD. * 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, + 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, + 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, + 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, + 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, + 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, + 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_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, + 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. + 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 @@ -1109,9 +1286,9 @@ ENDMETHOD. ENDWHILE. ENDIF. - endmethod. +ENDMETHOD. - + method LOAD_STYLE_BORDERS. @@ -1241,7 +1418,7 @@ ENDMETHOD. endmethod. - + method LOAD_STYLE_FILLS. @@ -1413,7 +1590,7 @@ ENDMETHOD. endmethod. - + METHOD load_style_fonts. @@ -1541,7 +1718,7 @@ ENDMETHOD. ENDMETHOD. - + method LOAD_STYLE_NUM_FORMATS. @@ -1654,7 +1831,7 @@ ENDMETHOD. endmethod. - + @@ -1854,6 +2031,8 @@ ENDMETHOD. INTO lv_full_filename. me->load_styles( ip_path = lv_full_filename ip_excel = io_excel ). + me->load_dxf_styles( iv_path = lv_full_filename + io_excel = io_excel ). WHEN OTHERS. @@ -2073,7 +2252,7 @@ ENDMETHOD. endmethod. - + @@ -2333,7 +2512,7 @@ ENDMETHOD. 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 + CATCH zcx_excel. "--> then ignore it ENDTRY. WHEN lc_rel_printer. @@ -2787,10 +2966,447 @@ ENDMETHOD. CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify ENDTRY. + " Issue #366 - conditional formatting + TRY. + me->load_worksheet_cond_format( io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet ). + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. + + ENDMETHOD. - + + + + + METHOD load_worksheet_cond_format. + + DATA: lo_ixml_cond_formats TYPE REF TO if_ixml_node_collection, + lo_ixml_cond_format TYPE REF TO if_ixml_element, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, +* lo_ixml_iterator2 TYPE REF TO if_ixml_node_iterator, +* lo_ixml TYPE REF TO if_ixml_element, + lo_ixml_rule TYPE REF TO if_ixml_element, +* lo_ixml_rule_iconset TYPE REF TO if_ixml_element, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional. + + + DATA: lv_area TYPE string, + lv_area_start_row TYPE zexcel_cell_row, + lv_area_end_row TYPE zexcel_cell_row, + lv_area_start_col TYPE zexcel_cell_column_alpha, + lv_area_end_col TYPE zexcel_cell_column_alpha, + lv_rule TYPE zexcel_condition_rule. + + +* FIELD-SYMBOLS: <ls_external_hyperlink> LIKE LINE OF it_external_hyperlinks. + + lo_ixml_cond_formats = io_ixml_worksheet->get_elements_by_tag_name( name = 'conditionalFormatting' ). + lo_ixml_iterator = lo_ixml_cond_formats->create_iterator( ). + lo_ixml_cond_format ?= lo_ixml_iterator->get_next( ). + + WHILE lo_ixml_cond_format IS BOUND. + + CLEAR: lv_area, + lo_ixml_rule, + lo_style_conditional. + + +*--------------------------------------------------------------------* +* Get type of rule +*--------------------------------------------------------------------* + lo_ixml_rule ?= lo_ixml_cond_format->get_first_child( ). " = cfRule + IF lo_ixml_rule IS BOUND. + lv_rule = lo_ixml_rule->get_attribute_ns( 'type' ). + +*--------------------------------------------------------------------* +* Depending on ruletype get additional information +*--------------------------------------------------------------------* + CASE lv_rule. + + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_ci( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + +* WHEN zcl_excel_style_conditional=>c_rule_containstext. +* + WHEN zcl_excel_style_conditional=>c_rule_databar. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_db( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_expression. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_ex( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_is( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_colorscale. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_cs( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_top10. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_t10( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_above_average. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_aa( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + +* WHEN zcl_excel_style_conditional=>c_rule_none. +* + + WHEN OTHERS. + ENDCASE. + ENDIF. + + IF lo_style_conditional IS BOUND. + lo_style_conditional->rule = lv_rule. + lo_style_conditional->priority = lo_ixml_rule->get_attribute_ns( 'priority' ). +*--------------------------------------------------------------------* +* Set area to which conditional formatting belongs +*--------------------------------------------------------------------* + lv_area = lo_ixml_cond_format->get_attribute_ns( 'sqref' ). + zcl_excel_common=>convert_range2column_a_row( EXPORTING + i_range = lv_area + IMPORTING + e_column_start = lv_area_start_col + e_column_end = lv_area_end_col + e_row_start = lv_area_start_row + e_row_end = lv_area_end_row ). + lo_style_conditional->set_range( ip_start_column = lv_area_start_col + ip_stop_column = lv_area_end_col + ip_start_row = lv_area_start_row + ip_stop_row = lv_area_end_row ). + + ENDIF. + + + lo_ixml_cond_format ?= lo_ixml_iterator->get_next( ). + + ENDWHILE. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_aa. + DATA: lv_dxf_style_index TYPE i, + val TYPE string. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + +*--------------------------------------------------------------------* +* above or below average +*--------------------------------------------------------------------* + val = io_ixml_rule->get_attribute_ns( 'aboveAverage' ). + IF val = '0'. " 0 = below average + io_style_conditional->mode_above_average-above_average = space. + ELSE. + io_style_conditional->mode_above_average-above_average = 'X'. " Not present or <> 0 --> we use above average + ENDIF. + +*--------------------------------------------------------------------* +* Equal average also? +*--------------------------------------------------------------------* + CLEAR val. + val = io_ixml_rule->get_attribute_ns( 'equalAverage' ). + IF val = '1'. " 0 = below average + io_style_conditional->mode_above_average-equal_average = 'X'. + ELSE. + io_style_conditional->mode_above_average-equal_average = ' '. " Not present or <> 1 --> we use not equal average + ENDIF. + +*--------------------------------------------------------------------* +* Standard deviation instead of value ( 2nd stddev, 3rd stdev ) +*--------------------------------------------------------------------* + CLEAR val. + val = io_ixml_rule->get_attribute_ns( 'stdDev' ). + CASE val. + WHEN 1 + OR 2 + OR 3. " These seem to be supported by excel - don't try anything more + io_style_conditional->mode_above_average-standard_deviation = val. + ENDCASE. + +*--------------------------------------------------------------------* +* Cell formatting for top10 +*--------------------------------------------------------------------* + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_above_average-cell_style = <ls_dxf_style>-guid. + ENDIF. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_ci. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element, + lv_dxf_style_index TYPE i, + lo_excel_style LIKE LINE OF me->styles. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + + io_style_conditional->mode_cellis-operator = io_ixml_rule->get_attribute_ns( 'operator' ). + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_cellis-cell_style = <ls_dxf_style>-guid. + ENDIF. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'formula' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_cellis-formula = lo_ixml->get_value( ). + + WHEN 2. + io_style_conditional->mode_cellis-formula2 = lo_ixml->get_value( ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_cs. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element. + + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'cfvo' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_colorscale-cfvo1_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_colorscale-cfvo1_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 2. + io_style_conditional->mode_colorscale-cfvo2_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_colorscale-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 3. + io_style_conditional->mode_colorscale-cfvo3_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_colorscale-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'color' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_colorscale-colorrgb1 = lo_ixml->get_attribute_ns( 'rgb' ). + + WHEN 2. + io_style_conditional->mode_colorscale-colorrgb2 = lo_ixml->get_attribute_ns( 'rgb' ). + + WHEN 3. + io_style_conditional->mode_colorscale-colorrgb3 = lo_ixml->get_attribute_ns( 'rgb' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_db. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element. + + lo_ixml ?= io_ixml_rule->find_from_name( 'color' ). + IF lo_ixml IS BOUND. + io_style_conditional->mode_databar-colorrgb = lo_ixml->get_attribute_ns( 'rgb' ). + ENDIF. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'cfvo' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_databar-cfvo1_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_databar-cfvo1_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 2. + io_style_conditional->mode_databar-cfvo2_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_databar-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_ex. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element, + lv_dxf_style_index TYPE i, + lo_excel_style LIKE LINE OF me->styles. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_expression-cell_style = <ls_dxf_style>-guid. + ENDIF. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'formula' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_expression-formula = lo_ixml->get_value( ). + + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_is. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element, + lo_ixml_rule_iconset TYPE REF TO if_ixml_element. + + lo_ixml_rule_iconset ?= io_ixml_rule->get_first_child( ). + io_style_conditional->mode_iconset-iconset = lo_ixml_rule_iconset->get_attribute_ns( 'iconSet' ). + io_style_conditional->mode_iconset-showvalue = lo_ixml_rule_iconset->get_attribute_ns( 'showValue' ). + lo_ixml_nodes ?= lo_ixml_rule_iconset->get_elements_by_tag_name( 'cfvo' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_iconset-cfvo1_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo1_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 2. + io_style_conditional->mode_iconset-cfvo2_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 3. + io_style_conditional->mode_iconset-cfvo3_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo3_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 4. + io_style_conditional->mode_iconset-cfvo4_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo4_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 5. + io_style_conditional->mode_iconset-cfvo5_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo5_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_t10. + DATA: lv_dxf_style_index TYPE i. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + + io_style_conditional->mode_top10-topxx_count = io_ixml_rule->get_attribute_ns( 'rank' ). " Top10, Top20, Top 50... + + io_style_conditional->mode_top10-percent = io_ixml_rule->get_attribute_ns( 'percent' ). " Top10 percent instead of Top10 values + if io_style_conditional->mode_top10-percent = '1'. + io_style_conditional->mode_top10-percent = 'X'. + else. + io_style_conditional->mode_top10-percent = ' '. + endif. + + io_style_conditional->mode_top10-bottom = io_ixml_rule->get_attribute_ns( 'bottom' ). " Bottom10 instead of Top10 + if io_style_conditional->mode_top10-bottom = '1'. + io_style_conditional->mode_top10-bottom = 'X'. + else. + io_style_conditional->mode_top10-bottom = ' '. + endif. +*--------------------------------------------------------------------* +* Cell formatting for top10 +*--------------------------------------------------------------------* + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_top10-cell_style = <ls_dxf_style>-guid. + ENDIF. + +ENDMETHOD. + + @@ -2909,7 +3525,7 @@ ENDMETHOD. endmethod. - + @@ -2983,7 +3599,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -3018,7 +3634,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD read_from_applserver. @@ -3062,7 +3678,7 @@ ENDMETHOD. binary_tab = lt_binary_data. ENDMETHOD. - + @@ -3122,7 +3738,7 @@ ENDMETHOD. ENDMETHOD. - + method RESOLVE_PATH. @@ -3166,7 +3782,7 @@ ENDMETHOD. endmethod. - + method RESOLVE_REFERENCED_FORMULAE. TYPES: BEGIN OF ty_referenced_cells, sheet TYPE REF TO zcl_excel_worksheet, diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk index cbb9715..26a80b9 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_CONDITIONAL.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -8,6 +8,7 @@ *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class + @@ -43,6 +44,7 @@ + @@ -50,17 +52,20 @@ - - - - - - - - - - - + + + + + + + + + + + + + + method CONSTRUCTOR. @@ -90,6 +95,60 @@ me->start_cell-cell_column = 1. endmethod. + + + + + + + + + + + + + + + + METHOD factory_cond_style_iconset. + +*--------------------------------------------------------------------* +* Work in progress +* Missing: LE or LT may be specified --> extend structure ZEXCEL_CONDITIONAL_ICONSET to hold this information as well +*--------------------------------------------------------------------* + +* DATA: lv_needed_values TYPE i. +* CASE icon_type. +* +* WHEN 'C_ICONSET_3ARROWS' +* OR 'C_ICONSET_3ARROWSGRAY' +* OR 'C_ICONSET_3FLAGS' +* OR 'C_ICONSET_3SIGNS' +* OR 'C_ICONSET_3SYMBOLS' +* OR 'C_ICONSET_3SYMBOLS2' +* OR 'C_ICONSET_3TRAFFICLIGHTS' +* OR 'C_ICONSET_3TRAFFICLIGHTS2'. +* lv_needed_values = 3. +* +* WHEN 'C_ICONSET_4ARROWS' +* OR 'C_ICONSET_4ARROWSGRAY' +* OR 'C_ICONSET_4RATING' +* OR 'C_ICONSET_4REDTOBLACK' +* OR 'C_ICONSET_4TRAFFICLIGHTS'. +* lv_needed_values = 4. +* +* WHEN 'C_ICONSET_5ARROWS' +* OR 'C_ICONSET_5ARROWSGRAY' +* OR 'C_ICONSET_5QUARTERS' +* OR 'C_ICONSET_5RATING'. +* lv_needed_values = 5. +* +* WHEN OTHERS. +* RETURN. +* ENDCASE. + +ENDMETHOD. + method GET_DIMENSION_RANGE. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 70f533b..bece09f 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -875,6 +875,145 @@ ENDMETHOD. endmethod. + + + + + + + + + METHOD create_dxf_style. + + CONSTANTS: lc_xml_node_dxf TYPE string VALUE 'dxf', + 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_attr_val TYPE string VALUE 'val', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + y TYPE i VALUE 0. + + DATA: ls_styles_mapping TYPE zexcel_s_styles_mapping, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lv_index TYPE i, + ls_font TYPE zexcel_s_style_font, + lo_element_font TYPE REF TO if_ixml_element, + lv_value TYPE string, + ls_fill TYPE zexcel_s_style_fill, + lo_element_fill TYPE REF TO if_ixml_element, + x. + + CHECK iv_cell_style IS NOT INITIAL. + + READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = iv_cell_style. + ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0 + READ TABLE it_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 = iv_cell_style. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ELSE. + ls_style_cond_mapping-guid = iv_cell_style. + ls_style_cond_mapping-style = ls_styles_mapping-style. + ls_style_cond_mapping-dxf = cv_dfx_count. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ADD 1 TO cv_dfx_count. + + " dxf node + lo_sub_element = io_ixml_document->create_simple_element( name = lc_xml_node_dxf + parent = io_ixml_document ). + + "Conditional formatting font style correction by Alessandro Iannacci START + lv_index = ls_cellxfs-fontid + 1. + READ TABLE it_fonts INTO ls_font INDEX lv_index. + IF ls_font IS NOT INITIAL. + lo_element_font = io_ixml_document->create_simple_element( name = lc_xml_node_font + parent = io_ixml_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_b + parent = io_ixml_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_i + parent = io_ixml_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_u + parent = io_ixml_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 = io_ixml_document->create_simple_element( name = lc_xml_node_strike + parent = io_ixml_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + "color + create_xl_styles_color_node( + io_document = io_ixml_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 it_fills INTO ls_fill INDEX ls_cellxfs-fillid. + IF ls_fill IS NOT INITIAL. + " fill properties + lo_element_fill = io_ixml_document->create_simple_element( name = lc_xml_node_fill + parent = io_ixml_document ). + "pattern + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_patternfill + parent = io_ixml_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 = io_ixml_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 = io_ixml_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. + + io_dxf_element->append_child( new_child = lo_sub_element ). +ENDMETHOD. + method CREATE_RELATIONSHIPS. @@ -2685,155 +2824,155 @@ ENDMETHOD. ** 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', + 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', + 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'. + 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, @@ -2868,6 +3007,8 @@ ENDMETHOD. ls_iconset TYPE zexcel_conditional_iconset, ls_cellis TYPE zexcel_conditional_cellis, ls_expression TYPE zexcel_conditional_expression, + ls_conditional_top10 TYPE zexcel_conditional_top10, + ls_conditional_above_avg TYPE zexcel_conditional_above_avg, lt_cfvo TYPE TABLE OF cfvo, ls_cfvo TYPE cfvo, lt_colors TYPE TABLE OF colors, @@ -3854,6 +3995,7 @@ ENDMETHOD. 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. @@ -3911,6 +4053,7 @@ ENDMETHOD. 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. @@ -4004,6 +4147,7 @@ ENDMETHOD. 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. @@ -4020,6 +4164,14 @@ ENDMETHOD. 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 + IF ls_cellis-formula2 IS NOT INITIAL. + lv_value = ls_cellis-formula2. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lo_element_3->set_value( value = lv_value ). + lo_element_2->append_child( new_child = lo_element_3 ). " 2nd formula node + ENDIF. + 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. @@ -4033,6 +4185,52 @@ ENDMETHOD. 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 + +* begin of ins issue #366 - missing conditional rules: top10 + WHEN zcl_excel_style_conditional=>c_rule_top10. + ls_conditional_top10 = lo_style_conditional->mode_top10. + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_conditional_top10-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_conditional_top10-topxx_count. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = 'rank' + value = lv_value ). + IF ls_conditional_top10-bottom = 'X'. + lo_element_2->set_attribute_ns( name = 'bottom' + value = '1' ). + ENDIF. + IF ls_conditional_top10-percent = 'X'. + lo_element_2->set_attribute_ns( name = 'percent' + value ='1' ). + ENDIF. + + WHEN zcl_excel_style_conditional=>c_rule_above_average. + ls_conditional_above_avg = lo_style_conditional->mode_above_average. + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_conditional_above_avg-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 ). + + IF ls_conditional_above_avg-above_average IS INITIAL. " = below average + lo_element_2->set_attribute_ns( name = 'aboveAverage' + value = '0' ). + ENDIF. + IF ls_conditional_above_avg-equal_average = 'X'. " = equal average also + lo_element_2->set_attribute_ns( name = 'equalAverage' + value = '1' ). + ENDIF. + IF ls_conditional_above_avg-standard_deviation <> 0. " standard deviation instead of value + lv_value = ls_conditional_above_avg-standard_deviation. + lo_element_2->set_attribute_ns( name = 'stdDev' + value = lv_value ). + ENDIF. + +* end of ins issue #366 - missing conditional rules: top10 + ENDCASE. lo_element->append_child( new_child = lo_element_2 ). " cfRule node @@ -4640,59 +4838,65 @@ ENDMETHOD. METHOD create_xl_styles. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 dxfs-cellstyles are used in conditional formats: +* CellIs, Expression, top10 ( forthcoming above average as well ) +* create own method to write dsfx-cellstyle to be reuseable by all these +*--------------------------------------------------------------------* ** Constant node name - CONSTANTS: lc_xml_node_stylesheet TYPE string VALUE 'styleSheet', + 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', + 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', + 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', + 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', + 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', + 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', + 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', + lc_xml_node_alignment TYPE string VALUE 'alignment', " Protection - lc_xml_node_protection TYPE string VALUE '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', @@ -4732,67 +4936,69 @@ ENDMETHOD. 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'. + 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, + 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. + 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, + 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. + ls_cellis TYPE zexcel_conditional_cellis, + ls_expression TYPE zexcel_conditional_expression, + ls_conditional_top10 TYPE zexcel_conditional_top10, - 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. + 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 @@ -5055,112 +5261,112 @@ ENDMETHOD. lo_element_fill = lo_document->create_simple_element( name = lc_xml_node_fill parent = lo_document ). - if ls_fill-gradtype is not initial. - "gradient + 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. + 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 ). + 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 ). + 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 ). + lo_sub_element_2 = lo_document->create_simple_element( name = lc_xml_node_stop + parent = lo_sub_element ). - lv_value = ls_fill-gradtype-position2. + lv_value = ls_fill-gradtype-position2. - lo_sub_element_2->set_attribute_ns( name = lc_xml_attr_position - value = lv_value ). + 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 ). + 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 ). + 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 ). + 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 ). + 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 ). + 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 ). + 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 ). + 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 ). + 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. + 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. + ELSE. "pattern lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_patternfill parent = lo_document ). @@ -5187,7 +5393,7 @@ ENDMETHOD. iv_color_elem_name = lc_xml_node_bgcolor ). ENDIF. - endif. + ENDIF. lo_element_fill->append_child( new_child = lo_sub_element )."pattern lo_element_fills->append_child( new_child = lo_element_fill ). @@ -5508,176 +5714,54 @@ ENDMETHOD. 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. +* begin of change issue #366 - missing conditional rules: top10, move dfx-styles to own method 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 + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_cellis-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). - " 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 + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_expression-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). - 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 ). + WHEN zcl_excel_style_conditional=>c_rule_top10. + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_top10-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). - 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. + WHEN zcl_excel_style_conditional=>c_rule_above_average. + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_above_average-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). +* begin of change issue #366 - missing conditional rules: top10, move dfx-styles to own method - " 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. diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_ABOVE_AVG.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_ABOVE_AVG.slnk new file mode 100644 index 0000000..756dd7a --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_ABOVE_AVG.slnk @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk index 082dad3..94cf2da 100644 --- a/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_CELLIS.slnk @@ -2,6 +2,7 @@ - - + + + diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk new file mode 100644 index 0000000..c554a9c --- /dev/null +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk @@ -0,0 +1,7 @@ + + + + + + + From 5fc05a9ec5293a3364437010419055ee0e45e13e Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 9 Apr 2015 21:58:31 +0200 Subject: [PATCH 15/32] Issue #367 - Enhancement: Added feature "Hide columns from Added feature to Reader_20007, Writer_2007, Demoreport 12 --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 292 +++++++++++----------- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 17 ++ ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk | 1 + ZA2X/PROG/ZDEMO_EXCEL12.slnk | 18 +- 4 files changed, 174 insertions(+), 154 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index ef61935..3338bcf 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -2280,188 +2280,188 @@ ENDMETHOD. * own method ( load_worksheet_pagemargins ) *--------------------------------------------------------------------* TYPES: BEGIN OF lty_cell, - r TYPE string, - t TYPE string, - s TYPE string, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + alignwithmargins TYPE string, + differentoddeven TYPE string, END OF lty_headerfooter. TYPES: BEGIN OF lty_tabcolor, - rgb TYPE string, - theme TYPE string, + 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, + 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'. + 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, + 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_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_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_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_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_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_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_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_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 + 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, + 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, + 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, + 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. + 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 @@ -2774,17 +2774,15 @@ ENDMETHOD. 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. + +* issue #367 - hide columns from + IF ls_column-max = 16384 " Max = very right column + AND ls_column-hidden = 1 " all hidden + AND ls_column-min > 0. + io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). + ENDIF. + + ENDWHILE. "Now we need to get information from the sheetView node diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index bece09f..79bcf94 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -3486,6 +3486,23 @@ ENDMETHOD. ENDLOOP. "ins issue #157 - set sheet style ( add missing columns ENDIF. +*--------------------------------------------------------------------* +* issue #367 add feature hide columns from +*--------------------------------------------------------------------* + IF io_worksheet->zif_excel_sheet_properties~hide_columns_from IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = zcl_excel_common=>convert_column2int( io_worksheet->zif_excel_sheet_properties~hide_columns_from ). + CONDENSE lv_value NO-GAPS. + 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 = '16384' ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = '1' ). + lo_element->append_child( new_child = lo_element_2 ). " col node + ENDIF. + lo_element_root->append_child( new_child = lo_element ). " cols node ENDIF. " sheetData node diff --git a/ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk b/ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk index 071fe19..4b62b09 100644 --- a/ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk +++ b/ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk @@ -11,6 +11,7 @@ + diff --git a/ZA2X/PROG/ZDEMO_EXCEL12.slnk b/ZA2X/PROG/ZDEMO_EXCEL12.slnk index 151fd8a..6b174ee 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL12.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL12.slnk @@ -16,14 +16,14 @@ 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: 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_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE solix_tab. DATA: lv_full_path TYPE string, lv_workdir TYPE string, @@ -115,6 +115,10 @@ START-OF-SELECTION. * Hint: the order you create the outlines can be arbitrary * You can start with inner outlines or with outer outlines +*--------------------------------------------------------------------* +* Hide columns right of column M +*--------------------------------------------------------------------* + lo_worksheet->zif_excel_sheet_properties~hide_columns_from = 'M'. *** Create output lcl_output=>output( lo_excel ). From 60bd05f89d4da6478a48277517b9a9e0d36e46d7 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 9 Apr 2015 22:30:10 +0200 Subject: [PATCH 16/32] issue #368 - first part: correction autofilter with no values in filter in writerclass --- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 79bcf94..3546856 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -3578,9 +3578,13 @@ ENDMETHOD. 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. + IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much CLEAR l_autofilter_hidden. + ELSE. + 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. ENDIF. CLEAR ls_style_mapping. * Create row element @@ -3676,7 +3680,13 @@ ENDMETHOD. lo_element_2->set_attribute_ns( name = 'customFormat' value = '1'). ENDIF. ENDIF. - l_autofilter_hidden = abap_true. " First default is not showing + IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much + CLEAR l_autofilter_hidden. + ELSE. + l_autofilter_hidden = abap_true. " First default is not showing + ENDIF. + ELSE. + ENDIF. ENDWHILE. From 53aae02a08af311ab4d074c20ec056ea21e269cf Mon Sep 17 00:00:00 2001 From: Hannes Rempel Date: Fri, 17 Apr 2015 17:25:33 +0200 Subject: [PATCH 17/32] compatibility with NW 7.2 --- ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk | 2 ++ ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 6 +++--- ZA2X/PROG/ZDEMO_EXCEL37.slnk | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk index 10e1aae..5b65e3d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE_FILL.slnk @@ -8,6 +8,8 @@ *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class + + ABAP diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index e37b3b7..873d4b6 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -3021,7 +3021,7 @@ METHOD calculate_cell_width. ld_flag_italic = ls_stylemapping-complete_style-font-italic. ENDIF. - CATCH zcx_excel ##NO_HANDLER. + CATCH zcx_excel. "#EC NO_HANDLER " Style GUID is present, but style was not found " Continue with default values @@ -3850,7 +3850,7 @@ ENDMETHOD. 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 + " 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. @@ -5149,4 +5149,4 @@ ENDMETHOD. ENDMETHOD. - + \ No newline at end of file diff --git a/ZA2X/PROG/ZDEMO_EXCEL37.slnk b/ZA2X/PROG/ZDEMO_EXCEL37.slnk index d146253..9b24ed1 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL37.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL37.slnk @@ -26,6 +26,8 @@ REPORT zdemo_excel37. +TYPE-POOLS: vrm. + DATA: excel TYPE REF TO zcl_excel, reader TYPE REF TO zif_excel_reader, go_error TYPE REF TO cx_root, From 5e86e69e97a5b92643d5c0ee9fa616dfaf950f48 Mon Sep 17 00:00:00 2001 From: oliver-huetkoeper Date: Mon, 18 May 2015 21:14:56 +0200 Subject: [PATCH 18/32] Style of remaining columns with no values When setting a style for all columns the reader only reads this style for filled columns. The style of the remaining columns is dropped. Example: You activate border lines for all cells, but you fill only the first three columns. After reading and writing it with ABAP2XLSX, only the first three columns have border lines. This is fixed by setting the default style here. --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 3338bcf..899e3e4 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -2776,10 +2776,14 @@ ENDMETHOD. ENDIF. * issue #367 - hide columns from - IF ls_column-max = 16384 " Max = very right column - AND ls_column-hidden = 1 " all hidden - AND ls_column-min > 0. - io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). + IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col " Max = very right column + IF ls_column-hidden = 1 " all hidden + AND ls_column-min > 0. + io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). + ELSEIF ls_column-style > ''. +* Set default style for remaining columns + io_worksheet->zif_excel_sheet_properties~set_style( dummy_zexcel_cell_style ). + ENDIF. ENDIF. From 959b02aa1264308025b2aaa659a9111669dfd765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BCdiger=20Plantiko?= Date: Sun, 24 May 2015 20:55:43 +0200 Subject: [PATCH 19/32] Def-376 Bug in shared string table reader If Excel's shared string table (SST) contains the empty string not only at the beginning but also redundantly at a further place, the following bug in the shared string table reader of class ZCL_EXCEL_READER_HUGE_FILE occurs: Since the sXML reader was not cleared with the beginning of each node, the last read string of the table was carried over into the next string . Added unit test ```test_shared_string_some_empty``` to reproduce the bug, and fixed it in the way proposed by Kai Walter (see Def-376) --- ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk | 128 ++++++++++++++-------- 1 file changed, 81 insertions(+), 47 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk index 9769451..db86a89 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 +429,9 @@ endclass. "lcl_test IMPLEMENTATION endmethod. - - - + + + method GET_CELL_COORD. zcl_excel_common=>convert_columnrow2column_a_row( @@ -418,10 +444,10 @@ endmethod. endmethod. - - - - + + + + method GET_SHARED_STRING. data: lv_tabix type i, lv_error type string. @@ -435,10 +461,10 @@ endmethod. endif. endmethod. - - - - + + + + method GET_STYLE. data: lv_tabix type i, @@ -463,10 +489,10 @@ endmethod. endmethod. - - - - + + + + method GET_SXML_READER. data: lv_xml type xstring. @@ -499,9 +525,9 @@ endmethod. endmethod. - - - + + + method PUT_CELL_TO_WORKSHEET. check is_cell-value is not initial or is_cell-formula is not initial @@ -516,25 +542,33 @@ endmethod. ip_style = is_cell-style. endmethod. - - - - method READ_SHARED_STRINGS. + + + + method read_shared_strings. + + data lv_value type string. 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. + if io_reader->name eq `t`. + case io_reader->node_type . + when c_element_open . + clear lv_value . + when c_node_value . + lv_value = lv_value && io_reader->value . + when c_element_close . + append lv_value to et_shared_strings. + endcase . endif. endwhile. endmethod. - - - - + + + + method READ_WORKSHEET_DATA. data: ls_cell type t_cell. @@ -575,10 +609,10 @@ endmethod. endmethod. - - - - + + + + method SKIP_TO. data: lv_error type string. From 1741fa6a6362fb309469b0c31cc1df1f33ac8856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BCdiger=20Plantiko?= Date: Sun, 24 May 2015 21:25:51 +0200 Subject: [PATCH 20/32] Changed source language back to 'E' I had erroneously maintained the last correction in original language 'D'. --- ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk | 77 ++++++++++++----------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk index db86a89..281390e 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_HUGE_FILE.slnk @@ -1,6 +1,6 @@ - - + - - + @@ -404,10 +407,10 @@ endclass. "lcl_test IMPLEMENTATION - - - - + + + + method FILL_CELL_FROM_ATTRIBUTES. while io_reader->node_type ne c_end_of_stream. @@ -429,9 +432,9 @@ endclass. "lcl_test IMPLEMENTATION endmethod. - - - + + + method GET_CELL_COORD. zcl_excel_common=>convert_columnrow2column_a_row( @@ -444,10 +447,10 @@ endmethod. endmethod. - - - - + + + + method GET_SHARED_STRING. data: lv_tabix type i, lv_error type string. @@ -461,10 +464,10 @@ endmethod. endif. endmethod. - - - - + + + + method GET_STYLE. data: lv_tabix type i, @@ -489,10 +492,10 @@ endmethod. endmethod. - - - - + + + + method GET_SXML_READER. data: lv_xml type xstring. @@ -525,9 +528,9 @@ endmethod. endmethod. - - - + + + method PUT_CELL_TO_WORKSHEET. check is_cell-value is not initial or is_cell-formula is not initial @@ -542,9 +545,9 @@ endmethod. ip_style = is_cell-style. endmethod. - - - + + + method read_shared_strings. data lv_value type string. @@ -565,10 +568,10 @@ endmethod. endmethod. - - - - + + + + method READ_WORKSHEET_DATA. data: ls_cell type t_cell. @@ -609,10 +612,10 @@ endmethod. endmethod. - - - - + + + + method SKIP_TO. data: lv_error type string. From 0f83a0a7585ff9deab30ede2359338eabfc94ced Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Mon, 1 Jun 2015 14:23:50 +0200 Subject: [PATCH 21/32] Issue #377 - support pagebreaks --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 87 ++++++++++- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 145 ++++++++++-------- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk | 40 +++++ ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 143 ++++++++++++++--- 4 files changed, 315 insertions(+), 100 deletions(-) create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 899e3e4..3037956 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -559,7 +559,7 @@ ENDMETHOD. endmethod. - + @@ -2776,7 +2776,7 @@ ENDMETHOD. ENDIF. * issue #367 - hide columns from - IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col " Max = very right column + IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col. " Max = very right column IF ls_column-hidden = 1 " all hidden AND ls_column-min > 0. io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). @@ -2975,6 +2975,12 @@ ENDMETHOD. CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify ENDTRY. + " Issue #377 - pagebreaks + TRY. + me->load_worksheet_pagebreaks( io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet ). + CATCH zcx_excel. " Ignore pagebreak reading errors - pass everything we were able to identify + ENDTRY. ENDMETHOD. @@ -3601,7 +3607,74 @@ ENDMETHOD. ENDMETHOD. - + + + + + METHOD load_worksheet_pagebreaks. + + DATA: lo_node TYPE REF TO if_ixml_element, + lo_ixml_rowbreaks TYPE REF TO if_ixml_node_collection, + lo_ixml_colbreaks TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml_rowbreak TYPE REF TO if_ixml_element, + lo_ixml_colbreak TYPE REF TO if_ixml_element, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_count TYPE i. + + + DATA: lt_pagebreaks TYPE STANDARD TABLE OF zcl_excel_worksheet_pagebreaks=>ts_pagebreak_at, + lo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks. + + FIELD-SYMBOLS: <ls_pagebreak_row> LIKE LINE OF lt_pagebreaks. + FIELD-SYMBOLS: <ls_pagebreak_col> LIKE LINE OF lt_pagebreaks. + +*--------------------------------------------------------------------* +* Get minimal number of cells where to add pagebreaks +* Since rows and columns are handled in separate nodes +* Build table to identify these cells +*--------------------------------------------------------------------* + lo_node ?= io_ixml_worksheet->find_from_name( 'rowBreaks' ). + lo_ixml_rowbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). + lo_ixml_iterator = lo_ixml_rowbreaks->create_iterator( ). + lo_ixml_rowbreak ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_rowbreak IS BOUND. + APPEND INITIAL LINE TO lt_pagebreaks ASSIGNING <ls_pagebreak_row>. + <ls_pagebreak_row>-cell_row = lo_ixml_rowbreak->get_attribute_ns( 'id' ). + + lo_ixml_rowbreak ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + CHECK <ls_pagebreak_row> IS ASSIGNED. + + lo_node ?= io_ixml_worksheet->find_from_name( 'colBreaks' ). + lo_ixml_colbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). + lo_ixml_iterator = lo_ixml_colbreaks->create_iterator( ). + lo_ixml_colbreak ?= lo_ixml_iterator->get_next( ). + CLEAR lv_count. + WHILE lo_ixml_colbreak IS BOUND. + ADD 1 TO lv_count. + READ TABLE lt_pagebreaks INDEX lv_count ASSIGNING <ls_pagebreak_col>. + IF sy-subrc <> 0. + APPEND INITIAL LINE TO lt_pagebreaks ASSIGNING <ls_pagebreak_col>. + <ls_pagebreak_col>-cell_row = <ls_pagebreak_row>-cell_row. + ENDIF. + <ls_pagebreak_col>-cell_column = lo_ixml_colbreak->get_attribute_ns( 'id' ). + + lo_ixml_colbreak ?= lo_ixml_iterator->get_next( ). + ENDWHILE. +*--------------------------------------------------------------------* +* Finally add each pagebreak +*--------------------------------------------------------------------* + lo_pagebreaks = io_worksheet->get_pagebreaks( ). + LOOP AT lt_pagebreaks ASSIGNING <ls_pagebreak_row>. + lo_pagebreaks->add_pagebreak( ip_column = <ls_pagebreak_row>-cell_column + ip_row = <ls_pagebreak_row>-cell_row ). + ENDLOOP. + + +ENDMETHOD. + + @@ -3636,7 +3709,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD read_from_applserver. @@ -3680,7 +3753,7 @@ ENDMETHOD. binary_tab = lt_binary_data. ENDMETHOD. - + @@ -3740,7 +3813,7 @@ ENDMETHOD. ENDMETHOD. - + method RESOLVE_PATH. @@ -3784,7 +3857,7 @@ ENDMETHOD. endmethod. - + method RESOLVE_REFERENCED_FORMULAE. TYPES: BEGIN OF ty_referenced_cells, sheet TYPE REF TO zcl_excel_worksheet, diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 873d4b6..5c975fc 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -246,25 +246,26 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION + - - - - - - + + + + + + - - - + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_COLUMNS. @@ -2893,7 +2894,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION endmethod. - + @@ -3021,7 +3022,7 @@ METHOD calculate_cell_width. ld_flag_italic = ls_stylemapping-complete_style-font-italic. ENDIF. - CATCH zcx_excel. "#EC NO_HANDLER + CATCH zcx_excel. "#EC NO_HANDLER " Style GUID is present, but style was not found " Continue with default values @@ -3147,7 +3148,7 @@ METHOD calculate_cell_width. ENDMETHOD. - + method CALCULATE_COLUMN_WIDTHS. TYPES: @@ -3231,7 +3232,7 @@ ENDMETHOD. endmethod. - + @@ -3651,11 +3652,11 @@ ENDMETHOD. ENDMETHOD. - + - method CONSTRUCTOR. + METHOD constructor. DATA: lv_title TYPE zexcel_sheet_title. me->excel = ip_excel. @@ -3678,6 +3679,7 @@ ENDMETHOD. CREATE OBJECT data_validations. CREATE OBJECT tables. CREATE OBJECT ranges. " issue #163 + CREATE OBJECT mo_pagebreaks. CREATE OBJECT drawings EXPORTING ip_type = zcl_excel_drawing=>type_image. @@ -3698,9 +3700,9 @@ ENDMETHOD. upper_cell-cell_row = 1. upper_cell-cell_column = 1. - endmethod. +ENDMETHOD. - + METHOD delete_merge. @@ -3729,7 +3731,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -3745,7 +3747,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -3775,7 +3777,7 @@ ENDMETHOD. freeze_pane_cell_row = ip_num_rows + 1. endmethod. - + method GENERATE_TITLE. DATA: lo_worksheets_iterator TYPE REF TO cl_object_collection_iterator, @@ -3810,7 +3812,7 @@ ENDMETHOD. ENDDO. endmethod. - + method GET_ACTIVE_CELL. @@ -3826,7 +3828,7 @@ ENDMETHOD. endmethod. - + @@ -3865,7 +3867,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -3892,33 +3894,33 @@ ENDMETHOD. 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. @@ -3932,7 +3934,7 @@ ENDMETHOD. r_column_dimension = me->default_column_dimension. endmethod. - + method GET_DEFAULT_EXCEL_DATE_FORMAT. CONSTANTS: c_lang_e TYPE lang VALUE 'E'. @@ -3958,7 +3960,7 @@ ENDMETHOD. ep_default_excel_date_format = default_excel_date_format. endmethod. - + method GET_DEFAULT_EXCEL_TIME_FORMAT. DATA: l_timefm TYPE xutimefm. @@ -3994,7 +3996,7 @@ ENDMETHOD. ep_default_excel_time_format = default_excel_time_format. endmethod. - + method GET_DEFAULT_ROW_DIMENSION. IF me->default_row_dimension IS NOT BOUND. @@ -4004,7 +4006,7 @@ ENDMETHOD. r_row_dimension = me->default_row_dimension. endmethod. - + method GET_DIMENSION_RANGE. @@ -4024,7 +4026,7 @@ ENDMETHOD. endmethod. - + method GET_DRAWINGS. @@ -4056,7 +4058,7 @@ ENDMETHOD. ENDCASE. endmethod. - + method GET_DRAWINGS_ITERATOR. @@ -4068,7 +4070,7 @@ ENDMETHOD. ENDCASE. endmethod. - + method GET_FREEZE_CELL. @@ -4076,7 +4078,7 @@ ENDMETHOD. ep_column = me->freeze_pane_cell_column. endmethod. - + METHOD get_guid. @@ -4084,7 +4086,7 @@ ENDMETHOD. ENDMETHOD. - + method GET_HIGHEST_COLUMN. @@ -4092,7 +4094,7 @@ ENDMETHOD. r_highest_column = me->lower_cell-cell_column. endmethod. - + METHOD get_highest_row. @@ -4100,19 +4102,19 @@ ENDMETHOD. 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. @@ -4140,7 +4142,14 @@ ENDMETHOD. ENDMETHOD. - + + + + method GET_PAGEBREAKS. + ro_pagebreaks = mo_pagebreaks. +endmethod. + + method GET_RANGES_ITERATOR. @@ -4148,7 +4157,7 @@ ENDMETHOD. endmethod. - + METHOD GET_ROW_DIMENSION. @@ -4173,7 +4182,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD get_row_dimensions. @@ -4181,7 +4190,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD get_row_outlines. @@ -4189,25 +4198,25 @@ ENDMETHOD. 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. @@ -4220,7 +4229,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -4281,7 +4290,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -4310,7 +4319,7 @@ ENDMETHOD. ENDMETHOD. - + method PRINT_TITLE_SET_RANGE. *--------------------------------------------------------------------* * issue#235 - repeat rows/columns @@ -4409,7 +4418,7 @@ ENDMETHOD. endmethod. - + @@ -4645,7 +4654,7 @@ ENDMETHOD. endmethod. - + @@ -4679,7 +4688,7 @@ ENDMETHOD. endmethod. - + @@ -4709,7 +4718,7 @@ ENDMETHOD. endmethod. - + @@ -4745,7 +4754,7 @@ ENDMETHOD. endmethod. - + method SET_DEFAULT_EXCEL_DATE_FORMAT. @@ -4759,7 +4768,7 @@ ENDMETHOD. default_excel_date_format = ip_default_excel_date_format. endmethod. - + @@ -4822,13 +4831,13 @@ ENDMETHOD. ENDMETHOD. - + method SET_PRINT_GRIDLINES. me->print_gridlines = i_print_gridlines. endmethod. - + @@ -4859,7 +4868,7 @@ ENDMETHOD. endmethod. - + @@ -4901,25 +4910,25 @@ ENDMETHOD. 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. - + @@ -5003,7 +5012,7 @@ ENDMETHOD. endmethod. - + method SET_TITLE. @@ -5106,7 +5115,7 @@ ENDMETHOD. endmethod. - + METHOD update_dimension_range. @@ -5149,4 +5158,4 @@ ENDMETHOD. ENDMETHOD. - \ No newline at end of file + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk new file mode 100644 index 0000000..8df439c --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk @@ -0,0 +1,40 @@ + + + + + *"* 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_pagebreak. + DATA: ls_pagebreak LIKE LINE OF me->mt_pagebreaks. + + ls_pagebreak-cell_row = ip_row. + ls_pagebreak-cell_column = zcl_excel_common=>convert_column2int( ip_column ). + + INSERT ls_pagebreak INTO TABLE me->mt_pagebreaks. + + +ENDMETHOD. + + + + METHOD get_all_pagebreaks. + rt_pagebreaks = me->mt_pagebreaks. +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 3546856..410b5a4 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -37,13 +37,13 @@ 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. @@ -243,7 +243,7 @@ ENDMETHOD. endmethod. - + method CREATE_CONTENT_TYPES. @@ -518,7 +518,7 @@ ENDMETHOD. endmethod. - + method CREATE_DOCPROPS_APP. @@ -741,7 +741,7 @@ ENDMETHOD. endmethod. - + method CREATE_DOCPROPS_CORE. @@ -875,7 +875,7 @@ ENDMETHOD. endmethod. - + @@ -1014,7 +1014,7 @@ ENDMETHOD. io_dxf_element->append_child( new_child = lo_sub_element ). ENDMETHOD. - + method CREATE_RELATIONSHIPS. @@ -1113,7 +1113,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_CHARTS. @@ -2018,7 +2018,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_DRAWINGS. @@ -2098,7 +2098,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_DRAWINGS_RELS. @@ -2197,7 +2197,7 @@ ENDMETHOD. endmethod. - + @@ -2511,7 +2511,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_RELATIONSHIPS. @@ -2659,7 +2659,7 @@ ENDMETHOD. endmethod. - + METHOD create_xl_sharedstrings. @@ -2781,7 +2781,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -3037,7 +3037,7 @@ ENDMETHOD. write_current_row TYPE boolean, lt_values TYPE zexcel_t_autofilter_values, ls_values TYPE zexcel_s_autofilter_values, - lv_guid TYPE uuid, +* 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, @@ -3511,9 +3511,9 @@ ENDMETHOD. " Get column count col_count = io_worksheet->get_highest_column( ). " Get autofilter - lv_guid = io_worksheet->get_guid( ) . +* lv_guid = io_worksheet->get_guid( ) . lo_autofilters = excel->get_autofilters_reference( ). - lo_autofilter = lo_autofilters->get( i_sheet_guid = lv_guid ) . + lo_autofilter = lo_autofilters->get( io_worksheet = io_worksheet ) . IF lo_autofilter IS BOUND. lt_values = lo_autofilter->get_values( ) . ls_area = lo_autofilter->get_filter_area( ) . @@ -4631,6 +4631,14 @@ ENDMETHOD. ENDIF. +* issue #377 pagebreaks + TRY. + create_xl_sheet_pagebreaks( io_document = lo_document + io_parent = lo_element_root + io_worksheet = io_worksheet ) . + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. + * drawing DATA: lo_drawings TYPE REF TO zcl_excel_drawings. @@ -4691,7 +4699,92 @@ ENDMETHOD. ENDMETHOD. - + + + + + + METHOD create_xl_sheet_pagebreaks. + DATA: lo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks, + lt_pagebreaks TYPE zcl_excel_worksheet_pagebreaks=>tt_pagebreak_at, + lt_rows TYPE HASHED TABLE OF int4 WITH UNIQUE KEY table_line, + lt_columns TYPE HASHED TABLE OF int4 WITH UNIQUE KEY table_line, + + lo_node_rowbreaks TYPE REF TO if_ixml_element, + lo_node_colbreaks TYPE REF TO if_ixml_element, + lo_node_break TYPE REF TO if_ixml_element, + + lv_value TYPE string. + + + FIELD-SYMBOLS: <ls_pagebreak> LIKE LINE OF lt_pagebreaks. + + lo_pagebreaks = io_worksheet->get_pagebreaks( ). + CHECK lo_pagebreaks IS BOUND. + + lt_pagebreaks = lo_pagebreaks->get_all_pagebreaks( ). + CHECK lt_pagebreaks IS NOT INITIAL. " No need to proceed if don't have any pagebreaks. + + lo_node_rowbreaks = io_document->create_simple_element( name = 'rowBreaks' + parent = io_document ). + + lo_node_colbreaks = io_document->create_simple_element( name = 'colBreaks' + parent = io_document ). + + + LOOP AT lt_pagebreaks ASSIGNING <ls_pagebreak>. + +* Count how many rows and columns need to be broken + INSERT <ls_pagebreak>-cell_row INTO TABLE lt_rows. + IF sy-subrc = 0. " New + lv_value = <ls_pagebreak>-cell_row. + CONDENSE lv_value. + + lo_node_break = io_document->create_simple_element( name = 'brk' + parent = io_document ). + lo_node_break->set_attribute( name = 'id' value = lv_value ). + lo_node_break->set_attribute( name = 'man' value = '1' ). " Manual break + lo_node_break->set_attribute( name = 'max' value = '16383' ). " Max columns + + lo_node_rowbreaks->append_child( new_child = lo_node_break ). + ENDIF. + + INSERT <ls_pagebreak>-cell_column INTO TABLE lt_columns. + IF sy-subrc = 0. " New + lv_value = <ls_pagebreak>-cell_column. + CONDENSE lv_value. + + lo_node_break = io_document->create_simple_element( name = 'brk' + parent = io_document ). + lo_node_break->set_attribute( name = 'id' value = lv_value ). + lo_node_break->set_attribute( name = 'man' value = '1' ). " Manual break + lo_node_break->set_attribute( name = 'max' value = '1048575' ). " Max rows + + lo_node_colbreaks->append_child( new_child = lo_node_break ). + ENDIF. + + + ENDLOOP. + + lv_value = lines( lt_rows ). + CONDENSE lv_value. + lo_node_rowbreaks->set_attribute( name = 'count' value = lv_value ). + lo_node_rowbreaks->set_attribute( name = 'manualBreakCount' value = lv_value ). + + lv_value = lines( lt_rows ). + CONDENSE lv_value. + lo_node_colbreaks->set_attribute( name = 'count' value = lv_value ). + lo_node_colbreaks->set_attribute( name = 'manualBreakCount' value = lv_value ). + + + + + io_parent->append_child( new_child = lo_node_rowbreaks ). + io_parent->append_child( new_child = lo_node_colbreaks ). + +ENDMETHOD. + + @@ -4862,7 +4955,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD create_xl_styles. *--------------------------------------------------------------------* @@ -5842,7 +5935,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -5893,7 +5986,7 @@ ENDMETHOD. io_parent->append_child( new_child = lo_sub_element ). ENDMETHOD. - + METHOD create_xl_table. @@ -6072,7 +6165,7 @@ ENDMETHOD. ENDMETHOD. - + method CREATE_XL_THEME. @@ -6161,7 +6254,7 @@ ENDMETHOD. endmethod. - + METHOD create_xl_workbook. *--------------------------------------------------------------------* @@ -6488,7 +6581,7 @@ ENDMETHOD. ENDMETHOD. - + method FLAG2BOOL. @@ -6501,7 +6594,7 @@ ENDMETHOD. ENDIF. endmethod. - + METHOD get_shared_string_index. From 93cbadacf04a66528eed47fbe3bc58a11485a50c Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Tue, 16 Jun 2015 14:59:39 +0200 Subject: [PATCH 22/32] issue #380: File filter in ZCL_EXCEL_COMMON made language dependant --- ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk | 61 ++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk index c70801c..eb61a3d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -1156,12 +1156,14 @@ ENDCLASS. "lcl_Excel_Common_Test + + @@ -1175,9 +1177,9 @@ ENDCLASS. "lcl_Excel_Common_Test - + - + @@ -1227,7 +1229,7 @@ ENDCLASS. "lcl_Excel_Common_Test ENDIF. endmethod. - + @@ -1280,7 +1282,7 @@ endmethod. ENDIF. ENDMETHOD. - + @@ -1344,7 +1346,12 @@ ENDMETHOD. endmethod. - + + METHOD class_constructor. + c_xlsx_file_filter = 'Excel Workbook (*.xlsx)|*.xlsx|'(005). +ENDMETHOD. + + @@ -1385,7 +1392,7 @@ endmethod. ENDMETHOD. - + @@ -1544,7 +1551,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -1567,7 +1574,7 @@ ENDMETHOD. endmethod. - + @@ -1660,7 +1667,7 @@ endmethod. e_sheet = unescape_string( lv_sheet ). " Return in unescaped form endmethod. - + method DATE_TO_EXCEL_STRING. @@ -1678,7 +1685,7 @@ endmethod. ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_date_diff ). endmethod. - + method DESCRIBE_STRUCTURE. @@ -1729,7 +1736,7 @@ endmethod. ENDIF. endmethod. - + @@ -1759,7 +1766,7 @@ endmethod. ENDMETHOD. "determine_resulting_formula - + method ENCRYPT_PASSWORD. @@ -1801,7 +1808,7 @@ ENDMETHOD. "determine_resulting_formula endmethod. - + method ESCAPE_STRING. @@ -1852,7 +1859,7 @@ endmethod. endmethod. - + @@ -1875,7 +1882,7 @@ endmethod. ENDTRY. endmethod. - + @@ -1888,7 +1895,7 @@ endmethod. endmethod. - + @@ -1911,7 +1918,7 @@ endmethod. ENDTRY. endmethod. - + @@ -1951,7 +1958,7 @@ endmethod. endmethod. - + method GET_FIELDCATALOG. @@ -2012,7 +2019,7 @@ endmethod. endmethod. - + @@ -2052,7 +2059,7 @@ endmethod. ENDIF. endmethod. - + method NUMBER_TO_EXCEL_STRING. @@ -2071,7 +2078,7 @@ endmethod. ENDIF. endmethod. - + @@ -2130,7 +2137,7 @@ endmethod. endmethod. - + @@ -2201,7 +2208,7 @@ endmethod. ENDMETHOD. - + @@ -2589,7 +2596,7 @@ endmethod. endmethod. - + @@ -2676,7 +2683,7 @@ endmethod. endmethod. - + method TIME_TO_EXCEL_STRING. @@ -2690,7 +2697,7 @@ endmethod. ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_day_fraction ). endmethod. - + From 0c3282ca76d48773f1b9c8ddf104eba12aa44916 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Tue, 16 Jun 2015 15:24:28 +0200 Subject: [PATCH 23/32] =?UTF-8?q?Added=20pseudocomment=20=E2=80=9C#EC=20CI?= =?UTF-8?q?=5FSUBMIT=20after=20all=20submit-statements=20in=20the=20demore?= =?UTF-8?q?ports=20to=20prevent=20a=20message=20in=20the=20code-inspector?= =?UTF-8?q?=20"Security"-section.=20Thanks=20to=20Stefan=20Schnell=20for?= =?UTF-8?q?=20pointing=20this=20out=20to=20us.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk | 4 +- ZA2X/PROG/ZDEMO_EXCEL.slnk | 74 ++++++++++++++--------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk b/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk index ed04a39..dceb904 100644 --- a/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk +++ b/ZA2X/PROG/ZABAP2XLSX_DEMO_SHOW.slnk @@ -221,14 +221,14 @@ CLASS lcl_perform IMPLEMENTATION. ENDIF. ENDIF. IF add_selopt IS INITIAL. - SUBMIT (wa_report-progname) AND RETURN + SUBMIT (wa_report-progname) AND RETURN "#EC CI_SUBMIT 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 + SUBMIT (wa_report-progname) VIA SELECTION-SCREEN AND RETURN "#EC CI_SUBMIT WITH p_backfn = filename WITH rb_back = 'X' WITH rb_down = ' ' diff --git a/ZA2X/PROG/ZDEMO_EXCEL.slnk b/ZA2X/PROG/ZDEMO_EXCEL.slnk index d485a0f..d3eff8d 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL.slnk @@ -40,52 +40,52 @@ START-OF-SELECTION. 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 + SUBMIT zdemo_excel1 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Hello world + SUBMIT zdemo_excel2 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Styles + SUBMIT zdemo_excel3 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: iTab binding + SUBMIT zdemo_excel4 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Conditional formatting + SUBMIT zdemo_excel6 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Formulas + SUBMIT zdemo_excel7 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Conditional formatting + SUBMIT zdemo_excel8 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Ranges + SUBMIT zdemo_excel9 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Data validation + SUBMIT zdemo_excel10 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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 + SUBMIT zdemo_excel12 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Column size + SUBMIT zdemo_excel13 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Merge cell + SUBMIT zdemo_excel14 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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 + SUBMIT zdemo_excel16 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Drawing + SUBMIT zdemo_excel17 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Lock sheet + SUBMIT zdemo_excel18 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Lock workbook + SUBMIT zdemo_excel19 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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) + SUBMIT zdemo_excel21 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Color Picker + SUBMIT zdemo_excel22 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Multiple sheets with different default date formats + SUBMIT zdemo_excel25 AND RETURN. "#EC CI_SUBMIT 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 + SUBMIT zdemo_excel27 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Conditional Formatting + SUBMIT zdemo_excel28 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: CSV writer + " SUBMIT zdemo_excel29 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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_excel33 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Table autofilter + SUBMIT zdemo_excel34 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Static Styles + SUBMIT zdemo_excel36 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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 + WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Charts + SUBMIT zdemo_excel40 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Demo Printsettings + SUBMIT zdemo_excel41 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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 + SUBMIT zdemo_excel15 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT Read Excel and write it back From af00a56683cda592ccaed2af8b1df7976d16863a Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Tue, 16 Jun 2015 16:03:05 +0200 Subject: [PATCH 24/32] Issue #379 - obsolete function modules Added new class/method to wrap obsolete function GUID_CREATE and use replacement class SAP provides. Old function call still found in wrapper class commented out for use in older releases, which don't have the new methods from SAP yet ( 7.01 does not have it for example ) Replaced calls to function by calls to wrapper-method Changed calculation of last date in month in ZDEMO_CALENDAR since it was calling an obsoleted function as well. --- ZA2X/CLAS/ZCL_EXCEL.slnk | 22 +++++---- ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk | 13 +++--- ZA2X/CLAS/ZCL_EXCEL_OBSOLETE_FUNC_WRAP.slnk | 52 +++++++++++++++++++++ ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk | 13 +++--- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 7 +-- ZA2X/PROG/ZDEMO_CALENDAR.slnk | 16 ++++--- 6 files changed, 92 insertions(+), 31 deletions(-) create mode 100644 ZA2X/CLAS/ZCL_EXCEL_OBSOLETE_FUNC_WRAP.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL.slnk b/ZA2X/CLAS/ZCL_EXCEL.slnk index b81d22b..ced9521 100644 --- a/ZA2X/CLAS/ZCL_EXCEL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL.slnk @@ -170,13 +170,14 @@ ENDMETHOD. me->zif_excel_book_vba_project~vbaproject = ip_vbaproject. endmethod. - + - method ADD_NEW_AUTOFILTER. + + METHOD add_new_autofilter. * Check for autofilter reference: new or overwrite; only one per sheet - ro_autofilter = autofilters->add( io_sheet = io_sheet ) . - endmethod. + ro_autofilter = autofilters->add( io_sheet ) . +ENDMETHOD. @@ -431,8 +432,8 @@ ENDMETHOD. - method GET_STATIC_CELLSTYLE_GUID. -" # issue 139 + METHOD get_static_cellstyle_guid. + " # issue 139 DATA: style LIKE LINE OF me->t_stylemapping1. READ TABLE me->t_stylemapping1 INTO style @@ -442,16 +443,17 @@ ENDMETHOD. 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. +* CALL FUNCTION 'GUID_CREATE' +* IMPORTING +* ev_guid_16 = style-guid. + style-guid = zcl_excel_obsolete_func_wrap=>guid_create( ). INSERT style INTO TABLE me->t_stylemapping1. INSERT style INTO TABLE me->t_stylemapping2. ENDIF. ep_guid = style-guid. - endmethod. +ENDMETHOD. diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk index 6ba6b3d..8e292bf 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -45,11 +45,12 @@ - method CONSTRUCTOR. + METHOD constructor. - CALL FUNCTION 'GUID_CREATE' - IMPORTING - ev_guid_16 = me->guid. +* CALL FUNCTION 'GUID_CREATE' " del issue #379 - function is outdated in newer releases +* IMPORTING +* ev_guid_16 = me->guid. + me->guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call IF ip_title IS NOT INITIAL. title = ip_title. @@ -63,7 +64,7 @@ anchor = anchor_one_cell. from_loc-col = 1. from_loc-row = 1. - endmethod. +ENDMETHOD. diff --git a/ZA2X/CLAS/ZCL_EXCEL_OBSOLETE_FUNC_WRAP.slnk b/ZA2X/CLAS/ZCL_EXCEL_OBSOLETE_FUNC_WRAP.slnk new file mode 100644 index 0000000..c959881 --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_OBSOLETE_FUNC_WRAP.slnk @@ -0,0 +1,52 @@ + + + *"* 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 guid_create. + + TRY. + rv_guid_16 = cl_system_uuid=>if_system_uuid_static~create_uuid_x16( ). + CATCH cx_uuid_error. + ENDTRY. + +*--------------------------------------------------------------------* +* If you are on a release that does not yet have the class cl_system_uuid +* please use the following coding instead which is using the function +* call that was used before but which has been flagged as obsolete +* in newer SAP releases +*--------------------------------------------------------------------* +* +* CALL FUNCTION 'GUID_CREATE' +* IMPORTING +* ev_guid_16 = rv_guid_16. + +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk b/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk index 69b0366..b57481e 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_STYLE.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -17,7 +17,7 @@ - method CONSTRUCTOR. + METHOD constructor. CREATE OBJECT font. @@ -32,14 +32,15 @@ me->guid = ip_guid. ELSE. * End of insertion # issue 139 - Dateretention of cellstyles - CALL FUNCTION 'GUID_CREATE' - IMPORTING - ev_guid_16 = me->guid. +* CALL FUNCTION 'GUID_CREATE' " del issue #379 - function is outdated in newer releases +* IMPORTING +* ev_guid_16 = me->guid. + me->guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call * Start of insertion # issue 139 - Dateretention of cellstyles ENDIF. * End of insertion # issue 139 - Dateretention of cellstyles - endmethod. +ENDMETHOD. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 5c975fc..005a500 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -3661,9 +3661,10 @@ ENDMETHOD. me->excel = ip_excel. - CALL FUNCTION 'GUID_CREATE' - IMPORTING - ev_guid_16 = me->guid. +* CALL FUNCTION 'GUID_CREATE' " del issue #379 - function is outdated in newer releases +* IMPORTING +* ev_guid_16 = me->guid. + me->guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call IF ip_title IS NOT INITIAL. lv_title = ip_title. diff --git a/ZA2X/PROG/ZDEMO_CALENDAR.slnk b/ZA2X/PROG/ZDEMO_CALENDAR.slnk index e7cd72c..21647be 100644 --- a/ZA2X/PROG/ZDEMO_CALENDAR.slnk +++ b/ZA2X/PROG/ZDEMO_CALENDAR.slnk @@ -43,7 +43,7 @@ *& 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. +*& smaller or change to a server export using OPEN DATASET. *&---------------------------------------------------------------------* REPORT zdemo_calendar. @@ -368,11 +368,15 @@ START-OF-SELECTION. ENDIF. " Add Calendar - CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH' - EXPORTING - day_in = date_from - IMPORTING - last_day_of_month = date_to. +* CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH' +* EXPORTING +* day_in = date_from +* IMPORTING +* last_day_of_month = date_to. + date_to = date_from. + date_to+6(2) = '01'. " First of month + add 31 to date_to. " Somewhere in following month + date_to = date_to - date_to+6(2). " Last of month IF p_portr = abap_true. zcl_helper=>add_calendar( EXPORTING From b9581c0113b0ee6fcc3661bc34c3ed0e3aa1f5c9 Mon Sep 17 00:00:00 2001 From: Alessandro Iannacci Date: Wed, 17 Jun 2015 14:12:53 +0200 Subject: [PATCH 25/32] Specify abap type in bind table method - Added new field in the field catalog (ABAP_TYPE) - Added the abap type management in the BIND_TABLE method --- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 41 ++++++++++++++++++++++++---- ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk | 1 + 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 005a500..9159448 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -2812,25 +2812,56 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION " 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 + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = <fs_fldval> + ip_abap_type = <ls_field_catalog>-abap_type ip_style = <ls_field_catalog>-style ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = <fs_fldval> + ip_style = <ls_field_catalog>-style ). + ENDIF. ELSE. - me->set_cell( ip_column = lv_column_alpha + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int - ip_formula = <fs_fldval> ). + + ip_formula = <fs_fldval> + ip_abap_type = <ls_field_catalog>-abap_type ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = <fs_fldval> ). + ENDIF. ENDIF. ELSE. IF <ls_field_catalog>-style IS NOT INITIAL. - me->set_cell( ip_column = lv_column_alpha + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = <fs_fldval> + ip_abap_type = <ls_field_catalog>-abap_type ip_style = <ls_field_catalog>-style ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> + ip_style = <ls_field_catalog>-style ). + ENDIF. ELSE. - me->set_cell( ip_column = lv_column_alpha + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int + ip_abap_type = <ls_field_catalog>-abap_type ip_value = <fs_fldval> ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> ). + ENDIF. ENDIF. ENDIF. ADD 1 TO lv_row_int. diff --git a/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk b/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk index 2752a5a..9119d9c 100644 --- a/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk +++ b/ZA2X/TABL/ZEXCEL_S_FIELDCATALOG.slnk @@ -14,4 +14,5 @@ + From e26b71976a0404ea910f2ad8e12df81382ba28c9 Mon Sep 17 00:00:00 2001 From: Alessandro Iannacci Date: Tue, 23 Jun 2015 14:39:58 +0200 Subject: [PATCH 26/32] New Daily Nugget V 7.0.4 (NO Transports - just nugget) New Daily Nugget V 7.0.4 (NO Transports - just nugget) included all the new slenkees, consistency check and corrections. --- build/ABAP2XLSX_V_7_0_4.nugg | 42337 ++++++++++++++++ build/ABAP2XLSX_V_7_0_4.nugg.zip | Bin 0 -> 324753 bytes .../{ => old_releases}/ABAP2XLSX_V_7_0_3.nugg | 0 .../ABAP2XLSX_V_7_0_3.nugg.zip | Bin .../{ => old_releases}/ABAP2XLSX_V_7_0_3.zip | Bin 5 files changed, 42337 insertions(+) create mode 100644 build/ABAP2XLSX_V_7_0_4.nugg create mode 100644 build/ABAP2XLSX_V_7_0_4.nugg.zip rename build/{ => old_releases}/ABAP2XLSX_V_7_0_3.nugg (100%) rename build/{ => old_releases}/ABAP2XLSX_V_7_0_3.nugg.zip (100%) rename build/{ => old_releases}/ABAP2XLSX_V_7_0_3.zip (100%) diff --git a/build/ABAP2XLSX_V_7_0_4.nugg b/build/ABAP2XLSX_V_7_0_4.nugg new file mode 100644 index 0000000..9fced81 --- /dev/null +++ b/build/ABAP2XLSX_V_7_0_4.nugg @@ -0,0 +1,42337 @@ + + + + *"* 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_dxf_style_guid. + DATA: lo_ixml_dxf_children TYPE REF TO if_ixml_node_list, + lo_ixml_iterator_dxf_children TYPE REF TO if_ixml_node_iterator, + lo_ixml_dxf_child TYPE REF TO if_ixml_element, + + lv_dxf_child_type TYPE string, + + lo_ixml_element TYPE REF TO if_ixml_element, + lo_ixml_element2 TYPE REF TO if_ixml_element, + lv_val TYPE string. + + DATA: ls_cstyle TYPE zexcel_s_cstyle_complete, + ls_cstylex TYPE zexcel_s_cstylex_complete. + + + + lo_ixml_dxf_children = io_ixml_dxf->get_children( ). + lo_ixml_iterator_dxf_children = lo_ixml_dxf_children->create_iterator( ). + lo_ixml_dxf_child ?= lo_ixml_iterator_dxf_children->get_next( ). + WHILE lo_ixml_dxf_child IS BOUND. + + lv_dxf_child_type = lo_ixml_dxf_child->get_name( ). + CASE lv_dxf_child_type. + + WHEN 'font'. +*--------------------------------------------------------------------* +* italic +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'i' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'val' ). + IF lv_val <> '0'. + ls_cstyle-font-italic = 'X'. + ls_cstylex-font-italic = 'X'. + ENDIF. + + ENDIF. +*--------------------------------------------------------------------* +* bold +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'b' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'val' ). + IF lv_val <> '0'. + ls_cstyle-font-bold = 'X'. + ls_cstylex-font-bold = 'X'. + ENDIF. + + ENDIF. +*--------------------------------------------------------------------* +* strikethrough +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'strike' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'val' ). + IF lv_val <> '0'. + ls_cstyle-font-strikethrough = 'X'. + ls_cstylex-font-strikethrough = 'X'. + ENDIF. + + ENDIF. +*--------------------------------------------------------------------* +* color +*--------------------------------------------------------------------* + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'color' ). + IF lo_ixml_element IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element->get_attribute_ns( 'rgb' ). + ls_cstyle-font-color-rgb = lv_val. + ls_cstylex-font-color-rgb = 'X'. + ENDIF. + + WHEN 'fill'. + lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'patternFill' ). + IF lo_ixml_element IS BOUND. + lo_ixml_element2 = lo_ixml_element->find_from_name( 'bgColor' ). + IF lo_ixml_element2 IS BOUND. + CLEAR lv_val. + lv_val = lo_ixml_element2->get_attribute_ns( 'rgb' ). + IF lv_val IS NOT INITIAL. + ls_cstyle-fill-filltype = zcl_excel_style_fill=>c_fill_solid. + ls_cstyle-fill-bgcolor-rgb = lv_val. + ls_cstylex-fill-filltype = 'X'. + ls_cstylex-fill-bgcolor-rgb = 'X'. + ENDIF. + ENDIF. + CLEAR lv_val. + lv_val = lo_ixml_element2->get_attribute_ns( 'theme' ). + IF lv_val IS NOT INITIAL. + ls_cstyle-fill-filltype = zcl_excel_style_fill=>c_fill_solid. + ls_cstyle-fill-bgcolor-theme = lv_val. + ls_cstylex-fill-filltype = 'X'. + ls_cstylex-fill-bgcolor-theme = 'X'. + ENDIF. + ENDIF. + +* 2do - borders into dxf-styles. Here and in writerclass +* WHEN 'border'. +* lo_ixml_element = lo_ixml_dxf_child->find_from_name( 'left' ). +* IF lo_ixml_element IS BOUND. +* CLEAR lv_val. +* lv_val = lo_ixml_element2->get_attribute_ns( 'style' ). +* IF lv_val IS NOT INITIAL. +* ls_cstyle-borders-left-border_style = lv_val. +* ls_cstylex-borders-left-border_style = 'X'. +* ENDIF. +* ENDIF. + + ENDCASE. + + lo_ixml_dxf_child ?= lo_ixml_iterator_dxf_children->get_next( ). + + ENDWHILE. + + + + + rv_style_guid = io_excel->get_static_cellstyle_guid( ip_cstyle_complete = ls_cstyle + ip_cstylex_complete = ls_cstylex ). + + +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_dxf_styles. + + DATA: lo_styles_xml TYPE REF TO if_ixml_document, + lo_node_dxfs TYPE REF TO if_ixml_element, + + lo_nodes_dxf TYPE REF TO if_ixml_node_collection, + lo_iterator_dxf TYPE REF TO if_ixml_node_iterator, + lo_node_dxf TYPE REF TO if_ixml_element, + + lv_dxf_count TYPE i. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF mt_dxf_styles. + +*--------------------------------------------------------------------* +* Look for dxfs-node +*--------------------------------------------------------------------* + lo_styles_xml = me->get_ixml_from_zip_archive( iv_path ). + lo_node_dxfs = lo_styles_xml->find_from_name( 'dxfs' ). + CHECK lo_node_dxfs IS BOUND. + + +*--------------------------------------------------------------------* +* loop through all dxf-nodes and create style for each +*--------------------------------------------------------------------* + lo_nodes_dxf ?= lo_node_dxfs->get_elements_by_tag_name( 'dxf' ). + lo_iterator_dxf = lo_nodes_dxf->create_iterator( ). + lo_node_dxf ?= lo_iterator_dxf->get_next( ). + WHILE lo_node_dxf IS BOUND. + + APPEND INITIAL LINE TO mt_dxf_styles ASSIGNING <ls_dxf_style>. + <ls_dxf_style>-dxf = lv_dxf_count. " We start counting at 0 + ADD 1 TO lv_dxf_count. " prepare next entry + + <ls_dxf_style>-guid = get_dxf_style_guid( io_ixml_dxf = lo_node_dxf + io_excel = io_excel ). + lo_node_dxf ?= lo_iterator_dxf->get_next( ). + + ENDWHILE. + + +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_node_stop 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'. + lo_fill->gradtype-type = lo_node_fill_child->get_attribute( 'type' ). + lo_fill->gradtype-top = lo_node_fill_child->get_attribute( 'top' ). + lo_fill->gradtype-left = lo_node_fill_child->get_attribute( 'left' ). + lo_fill->gradtype-right = lo_node_fill_child->get_attribute( 'right' ). + lo_fill->gradtype-bottom = lo_node_fill_child->get_attribute( 'bottom' ). + lo_fill->gradtype-degree = lo_node_fill_child->get_attribute( 'degree' ). + free lo_node_stop. + lo_node_stop ?= lo_node_fill_child->find_from_name( 'stop' ). + while lo_node_stop is bound. + if lo_fill->gradtype-position1 is initial. + lo_fill->gradtype-position1 = lo_node_stop->get_attribute( 'position' ). + lo_node_bgcolor = lo_node_stop->find_from_name( 'color' ). + 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. + elseif lo_fill->gradtype-position2 is initial. + lo_fill->gradtype-position2 = lo_node_stop->get_attribute( 'position' ). + lo_node_fgcolor = lo_node_stop->find_from_name( 'color' ). + 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. + elseif lo_fill->gradtype-position3 is initial. + lo_fill->gradtype-position3 = lo_node_stop->get_attribute( 'position' ). + "BGColor is filled already with position 1 no need to check again + endif. + + lo_node_stop ?= lo_node_stop->get_next( ). + ENDWHILE. + + 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' ). + ELSE. + CLEAR lo_font->scheme. + 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 ). + me->load_dxf_styles( iv_path = lv_full_filename + io_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 + 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. + +* issue #367 - hide columns from + IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col. " Max = very right column + IF ls_column-hidden = 1 " all hidden + AND ls_column-min > 0. + io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). + ELSEIF ls_column-style > ''. +* Set default style for remaining columns + io_worksheet->zif_excel_sheet_properties~set_style( dummy_zexcel_cell_style ). + ENDIF. + 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. + + " Issue #366 - conditional formatting + TRY. + me->load_worksheet_cond_format( io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet ). + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. + + " Issue #377 - pagebreaks + TRY. + me->load_worksheet_pagebreaks( io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet ). + CATCH zcx_excel. " Ignore pagebreak reading errors - pass everything we were able to identify + ENDTRY. + + +ENDMETHOD. + + + + + + METHOD load_worksheet_cond_format. + + DATA: lo_ixml_cond_formats TYPE REF TO if_ixml_node_collection, + lo_ixml_cond_format TYPE REF TO if_ixml_element, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, +* lo_ixml_iterator2 TYPE REF TO if_ixml_node_iterator, +* lo_ixml TYPE REF TO if_ixml_element, + lo_ixml_rule TYPE REF TO if_ixml_element, +* lo_ixml_rule_iconset TYPE REF TO if_ixml_element, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional. + + + DATA: lv_area TYPE string, + lv_area_start_row TYPE zexcel_cell_row, + lv_area_end_row TYPE zexcel_cell_row, + lv_area_start_col TYPE zexcel_cell_column_alpha, + lv_area_end_col TYPE zexcel_cell_column_alpha, + lv_rule TYPE zexcel_condition_rule. + + +* FIELD-SYMBOLS: <ls_external_hyperlink> LIKE LINE OF it_external_hyperlinks. + + lo_ixml_cond_formats = io_ixml_worksheet->get_elements_by_tag_name( name = 'conditionalFormatting' ). + lo_ixml_iterator = lo_ixml_cond_formats->create_iterator( ). + lo_ixml_cond_format ?= lo_ixml_iterator->get_next( ). + + WHILE lo_ixml_cond_format IS BOUND. + + CLEAR: lv_area, + lo_ixml_rule, + lo_style_conditional. + + +*--------------------------------------------------------------------* +* Get type of rule +*--------------------------------------------------------------------* + lo_ixml_rule ?= lo_ixml_cond_format->get_first_child( ). " = cfRule + IF lo_ixml_rule IS BOUND. + lv_rule = lo_ixml_rule->get_attribute_ns( 'type' ). + +*--------------------------------------------------------------------* +* Depending on ruletype get additional information +*--------------------------------------------------------------------* + CASE lv_rule. + + WHEN zcl_excel_style_conditional=>c_rule_cellis. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_ci( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + +* WHEN zcl_excel_style_conditional=>c_rule_containstext. +* + WHEN zcl_excel_style_conditional=>c_rule_databar. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_db( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_expression. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_ex( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_iconset. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_is( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_colorscale. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_cs( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_top10. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_t10( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + + WHEN zcl_excel_style_conditional=>c_rule_above_average. + lo_style_conditional = io_worksheet->add_new_conditional_style( ). + load_worksheet_cond_format_aa( io_ixml_rule = lo_ixml_rule + io_style_conditional = lo_style_conditional ). + +* WHEN zcl_excel_style_conditional=>c_rule_none. +* + + WHEN OTHERS. + ENDCASE. + ENDIF. + + IF lo_style_conditional IS BOUND. + lo_style_conditional->rule = lv_rule. + lo_style_conditional->priority = lo_ixml_rule->get_attribute_ns( 'priority' ). +*--------------------------------------------------------------------* +* Set area to which conditional formatting belongs +*--------------------------------------------------------------------* + lv_area = lo_ixml_cond_format->get_attribute_ns( 'sqref' ). + zcl_excel_common=>convert_range2column_a_row( EXPORTING + i_range = lv_area + IMPORTING + e_column_start = lv_area_start_col + e_column_end = lv_area_end_col + e_row_start = lv_area_start_row + e_row_end = lv_area_end_row ). + lo_style_conditional->set_range( ip_start_column = lv_area_start_col + ip_stop_column = lv_area_end_col + ip_start_row = lv_area_start_row + ip_stop_row = lv_area_end_row ). + + ENDIF. + + + lo_ixml_cond_format ?= lo_ixml_iterator->get_next( ). + + ENDWHILE. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_aa. + DATA: lv_dxf_style_index TYPE i, + val TYPE string. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + +*--------------------------------------------------------------------* +* above or below average +*--------------------------------------------------------------------* + val = io_ixml_rule->get_attribute_ns( 'aboveAverage' ). + IF val = '0'. " 0 = below average + io_style_conditional->mode_above_average-above_average = space. + ELSE. + io_style_conditional->mode_above_average-above_average = 'X'. " Not present or <> 0 --> we use above average + ENDIF. + +*--------------------------------------------------------------------* +* Equal average also? +*--------------------------------------------------------------------* + CLEAR val. + val = io_ixml_rule->get_attribute_ns( 'equalAverage' ). + IF val = '1'. " 0 = below average + io_style_conditional->mode_above_average-equal_average = 'X'. + ELSE. + io_style_conditional->mode_above_average-equal_average = ' '. " Not present or <> 1 --> we use not equal average + ENDIF. + +*--------------------------------------------------------------------* +* Standard deviation instead of value ( 2nd stddev, 3rd stdev ) +*--------------------------------------------------------------------* + CLEAR val. + val = io_ixml_rule->get_attribute_ns( 'stdDev' ). + CASE val. + WHEN 1 + OR 2 + OR 3. " These seem to be supported by excel - don't try anything more + io_style_conditional->mode_above_average-standard_deviation = val. + ENDCASE. + +*--------------------------------------------------------------------* +* Cell formatting for top10 +*--------------------------------------------------------------------* + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_above_average-cell_style = <ls_dxf_style>-guid. + ENDIF. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_ci. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element, + lv_dxf_style_index TYPE i, + lo_excel_style LIKE LINE OF me->styles. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + + io_style_conditional->mode_cellis-operator = io_ixml_rule->get_attribute_ns( 'operator' ). + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_cellis-cell_style = <ls_dxf_style>-guid. + ENDIF. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'formula' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_cellis-formula = lo_ixml->get_value( ). + + WHEN 2. + io_style_conditional->mode_cellis-formula2 = lo_ixml->get_value( ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_cs. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element. + + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'cfvo' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_colorscale-cfvo1_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_colorscale-cfvo1_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 2. + io_style_conditional->mode_colorscale-cfvo2_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_colorscale-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 3. + io_style_conditional->mode_colorscale-cfvo3_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_colorscale-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'color' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_colorscale-colorrgb1 = lo_ixml->get_attribute_ns( 'rgb' ). + + WHEN 2. + io_style_conditional->mode_colorscale-colorrgb2 = lo_ixml->get_attribute_ns( 'rgb' ). + + WHEN 3. + io_style_conditional->mode_colorscale-colorrgb3 = lo_ixml->get_attribute_ns( 'rgb' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_db. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element. + + lo_ixml ?= io_ixml_rule->find_from_name( 'color' ). + IF lo_ixml IS BOUND. + io_style_conditional->mode_databar-colorrgb = lo_ixml->get_attribute_ns( 'rgb' ). + ENDIF. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'cfvo' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_databar-cfvo1_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_databar-cfvo1_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 2. + io_style_conditional->mode_databar-cfvo2_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_databar-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_ex. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element, + lv_dxf_style_index TYPE i, + lo_excel_style LIKE LINE OF me->styles. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_expression-cell_style = <ls_dxf_style>-guid. + ENDIF. + + lo_ixml_nodes ?= io_ixml_rule->get_elements_by_tag_name( 'formula' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_expression-formula = lo_ixml->get_value( ). + + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_is. + DATA: lo_ixml_nodes TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml TYPE REF TO if_ixml_element, + lo_ixml_rule_iconset TYPE REF TO if_ixml_element. + + lo_ixml_rule_iconset ?= io_ixml_rule->get_first_child( ). + io_style_conditional->mode_iconset-iconset = lo_ixml_rule_iconset->get_attribute_ns( 'iconSet' ). + io_style_conditional->mode_iconset-showvalue = lo_ixml_rule_iconset->get_attribute_ns( 'showValue' ). + lo_ixml_nodes ?= lo_ixml_rule_iconset->get_elements_by_tag_name( 'cfvo' ). + lo_ixml_iterator = lo_ixml_nodes->create_iterator( ). + lo_ixml ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml IS BOUND. + + CASE sy-index. + WHEN 1. + io_style_conditional->mode_iconset-cfvo1_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo1_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 2. + io_style_conditional->mode_iconset-cfvo2_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo2_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 3. + io_style_conditional->mode_iconset-cfvo3_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo3_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 4. + io_style_conditional->mode_iconset-cfvo4_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo4_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN 5. + io_style_conditional->mode_iconset-cfvo5_type = lo_ixml->get_attribute_ns( 'type' ). + io_style_conditional->mode_iconset-cfvo5_value = lo_ixml->get_attribute_ns( 'val' ). + + WHEN OTHERS. + EXIT. + ENDCASE. + + lo_ixml ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + +ENDMETHOD. + + + + + METHOD load_worksheet_cond_format_t10. + DATA: lv_dxf_style_index TYPE i. + + FIELD-SYMBOLS: <ls_dxf_style> LIKE LINE OF me->mt_dxf_styles. + + io_style_conditional->mode_top10-topxx_count = io_ixml_rule->get_attribute_ns( 'rank' ). " Top10, Top20, Top 50... + + io_style_conditional->mode_top10-percent = io_ixml_rule->get_attribute_ns( 'percent' ). " Top10 percent instead of Top10 values + if io_style_conditional->mode_top10-percent = '1'. + io_style_conditional->mode_top10-percent = 'X'. + else. + io_style_conditional->mode_top10-percent = ' '. + endif. + + io_style_conditional->mode_top10-bottom = io_ixml_rule->get_attribute_ns( 'bottom' ). " Bottom10 instead of Top10 + if io_style_conditional->mode_top10-bottom = '1'. + io_style_conditional->mode_top10-bottom = 'X'. + else. + io_style_conditional->mode_top10-bottom = ' '. + endif. +*--------------------------------------------------------------------* +* Cell formatting for top10 +*--------------------------------------------------------------------* + lv_dxf_style_index = io_ixml_rule->get_attribute_ns( 'dxfId' ). + READ TABLE me->mt_dxf_styles ASSIGNING <ls_dxf_style> WITH KEY dxf = lv_dxf_style_index. + IF sy-subrc = 0. + io_style_conditional->mode_top10-cell_style = <ls_dxf_style>-guid. + ENDIF. + +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_pagebreaks. + + DATA: lo_node TYPE REF TO if_ixml_element, + lo_ixml_rowbreaks TYPE REF TO if_ixml_node_collection, + lo_ixml_colbreaks TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml_rowbreak TYPE REF TO if_ixml_element, + lo_ixml_colbreak TYPE REF TO if_ixml_element, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_count TYPE i. + + + DATA: lt_pagebreaks TYPE STANDARD TABLE OF zcl_excel_worksheet_pagebreaks=>ts_pagebreak_at, + lo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks. + + FIELD-SYMBOLS: <ls_pagebreak_row> LIKE LINE OF lt_pagebreaks. + FIELD-SYMBOLS: <ls_pagebreak_col> LIKE LINE OF lt_pagebreaks. + +*--------------------------------------------------------------------* +* Get minimal number of cells where to add pagebreaks +* Since rows and columns are handled in separate nodes +* Build table to identify these cells +*--------------------------------------------------------------------* + lo_node ?= io_ixml_worksheet->find_from_name( 'rowBreaks' ). + lo_ixml_rowbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). + lo_ixml_iterator = lo_ixml_rowbreaks->create_iterator( ). + lo_ixml_rowbreak ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_rowbreak IS BOUND. + APPEND INITIAL LINE TO lt_pagebreaks ASSIGNING <ls_pagebreak_row>. + <ls_pagebreak_row>-cell_row = lo_ixml_rowbreak->get_attribute_ns( 'id' ). + + lo_ixml_rowbreak ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + CHECK <ls_pagebreak_row> IS ASSIGNED. + + lo_node ?= io_ixml_worksheet->find_from_name( 'colBreaks' ). + lo_ixml_colbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). + lo_ixml_iterator = lo_ixml_colbreaks->create_iterator( ). + lo_ixml_colbreak ?= lo_ixml_iterator->get_next( ). + CLEAR lv_count. + WHILE lo_ixml_colbreak IS BOUND. + ADD 1 TO lv_count. + READ TABLE lt_pagebreaks INDEX lv_count ASSIGNING <ls_pagebreak_col>. + IF sy-subrc <> 0. + APPEND INITIAL LINE TO lt_pagebreaks ASSIGNING <ls_pagebreak_col>. + <ls_pagebreak_col>-cell_row = <ls_pagebreak_row>-cell_row. + ENDIF. + <ls_pagebreak_col>-cell_column = lo_ixml_colbreak->get_attribute_ns( 'id' ). + + lo_ixml_colbreak ?= lo_ixml_iterator->get_next( ). + ENDWHILE. +*--------------------------------------------------------------------* +* Finally add each pagebreak +*--------------------------------------------------------------------* + lo_pagebreaks = io_worksheet->get_pagebreaks( ). + LOOP AT lt_pagebreaks ASSIGNING <ls_pagebreak_row>. + lo_pagebreaks->add_pagebreak( ip_column = <ls_pagebreak_row>-cell_column + ip_row = <ls_pagebreak_row>-cell_row ). + ENDLOOP. + + +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 + *"* 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' " del issue #379 - function is outdated in newer releases +* IMPORTING +* ev_guid_16 = me->guid. + me->guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call +* 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 factory_cond_style_iconset. + +*--------------------------------------------------------------------* +* Work in progress +* Missing: LE or LT may be specified --> extend structure ZEXCEL_CONDITIONAL_ICONSET to hold this information as well +*--------------------------------------------------------------------* + +* DATA: lv_needed_values TYPE i. +* CASE icon_type. +* +* WHEN 'C_ICONSET_3ARROWS' +* OR 'C_ICONSET_3ARROWSGRAY' +* OR 'C_ICONSET_3FLAGS' +* OR 'C_ICONSET_3SIGNS' +* OR 'C_ICONSET_3SYMBOLS' +* OR 'C_ICONSET_3SYMBOLS2' +* OR 'C_ICONSET_3TRAFFICLIGHTS' +* OR 'C_ICONSET_3TRAFFICLIGHTS2'. +* lv_needed_values = 3. +* +* WHEN 'C_ICONSET_4ARROWS' +* OR 'C_ICONSET_4ARROWSGRAY' +* OR 'C_ICONSET_4RATING' +* OR 'C_ICONSET_4REDTOBLACK' +* OR 'C_ICONSET_4TRAFFICLIGHTS'. +* lv_needed_values = 4. +* +* WHEN 'C_ICONSET_5ARROWS' +* OR 'C_ICONSET_5ARROWSGRAY' +* OR 'C_ICONSET_5QUARTERS' +* OR 'C_ICONSET_5RATING'. +* lv_needed_values = 5. +* +* WHEN OTHERS. +* RETURN. +* ENDCASE. + +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 + + ABAP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method build_gradient. + check check_filltype_is_gradient( ) eq abap_true. + clear gradtype. + 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. + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = <fs_fldval> + ip_abap_type = <ls_field_catalog>-abap_type + ip_style = <ls_field_catalog>-style ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = <fs_fldval> + ip_style = <ls_field_catalog>-style ). + ENDIF. + ELSE. + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + + ip_formula = <fs_fldval> + ip_abap_type = <ls_field_catalog>-abap_type ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_formula = <fs_fldval> ). + ENDIF. + ENDIF. + ELSE. + IF <ls_field_catalog>-style IS NOT INITIAL. + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> + ip_abap_type = <ls_field_catalog>-abap_type + ip_style = <ls_field_catalog>-style ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> + ip_style = <ls_field_catalog>-style ). + ENDIF. + ELSE. + IF <ls_field_catalog>-abap_type IS NOT INITIAL. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_abap_type = <ls_field_catalog>-abap_type + ip_value = <fs_fldval> ). + ELSE. + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = <fs_fldval> ). + ENDIF. + 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. "#EC 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' " del issue #379 - function is outdated in newer releases +* IMPORTING +* ev_guid_16 = me->guid. + me->guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call + + 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 mo_pagebreaks. + 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. + + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. + DATA: is_merged TYPE abap_bool. +*--------------------------------------------------------------------* +* If cell information is passed delete merge including this cell, +* otherwise delete all merges +*--------------------------------------------------------------------* + IF ip_cell_column IS INITIAL + OR ip_cell_row IS INITIAL. + CLEAR me->mt_merged_cells. + ELSE. + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. + + is_merged = me->is_cell_merged( ip_column = ip_cell_column + ip_row = ip_cell_row ). + IF is_merged = abap_true. + DELETE me->mt_merged_cells. " Delete this merge, that includes this cell + EXIT. + ENDIF. + + ENDLOOP. + ENDIF. + +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. + + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. + + DATA: lv_col_from TYPE string, + lv_col_to TYPE string, + lv_row_from TYPE string, + lv_row_to TYPE string, + lv_merge_range TYPE string. + + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. + + lv_col_from = zcl_excel_common=>convert_column2alpha( <ls_merged_cell>-col_from ). + lv_col_to = zcl_excel_common=>convert_column2alpha( <ls_merged_cell>-col_to ). + lv_row_from = <ls_merged_cell>-row_from. + lv_row_to = <ls_merged_cell>-row_to . + CONCATENATE lv_col_from lv_row_from ':' lv_col_to lv_row_to + INTO lv_merge_range. + CONDENSE lv_merge_range NO-GAPS. + APPEND lv_merge_range TO merge_range. + + ENDLOOP. + +ENDMETHOD. + + + + + method GET_PAGEBREAKS. + ro_pagebreaks = mo_pagebreaks. +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. + TRY. + ep_value = l_value. + CATCH cx_root. + ep_value = ip_value. + ENDTRY. + ENDIF. + ENDIF. + ENDIF. + ELSE. + ep_value_type = lo_addit->get_data_type_kind( ip_value ). + ENDIF. + ENDIF. + +ENDMETHOD. + + + + + + + METHOD is_cell_merged. + + DATA: lv_column TYPE i. + + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. + + lv_column = zcl_excel_common=>convert_column2int( ip_column ). + + rp_is_merged = abap_false. " Assume not in merged area + + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. + + IF <ls_merged_cell>-col_from <= lv_column + AND <ls_merged_cell>-col_to >= lv_column + AND <ls_merged_cell>-row_from <= ip_row + AND <ls_merged_cell>-row_to >= ip_row. + rp_is_merged = abap_true. " until we are proven different + RETURN. + 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: ls_merge TYPE mty_merge, + lv_errormessage TYPE string. + + FIELD-SYMBOLS: <ls_merge> LIKE LINE OF me->mt_merged_cells. + +*--------------------------------------------------------------------* +* Build new range area to insert into range table +*--------------------------------------------------------------------* + ls_merge-row_from = ip_row. + IF ip_row IS SUPPLIED AND ip_row IS NOT INITIAL AND ip_row_to IS NOT SUPPLIED. + ls_merge-row_to = ls_merge-row_from. + ELSE. + ls_merge-row_to = ip_row_to. + ENDIF. + IF ls_merge-row_from > ls_merge-row_to. + lv_errormessage = 'Merge: First row larger then last row'(405). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + ls_merge-col_from = zcl_excel_common=>convert_column2int( ip_column_start ). + IF ip_column_start IS SUPPLIED AND ip_column_start IS NOT INITIAL AND ip_column_end IS NOT SUPPLIED. + ls_merge-col_to = ls_merge-col_from. + ELSE. + ls_merge-col_to = zcl_excel_common=>convert_column2int( ip_column_end ). + ENDIF. + IF ls_merge-col_from > ls_merge-col_to. + lv_errormessage = 'Merge: First column larger then last column'(406). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + +*--------------------------------------------------------------------* +* Check merge not overlapping with existing merges +*--------------------------------------------------------------------* + LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS WHERE NOT ( row_from > ls_merge-row_to + OR row_to < ls_merge-row_from + OR col_from > ls_merge-col_to + OR col_to < ls_merge-col_from ). + lv_errormessage = 'Overlapping merges'(404). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + + ENDLOOP. + +*--------------------------------------------------------------------* +* Everything seems ok --> add to merge table +*--------------------------------------------------------------------* + INSERT ls_merge INTO TABLE me->mt_merged_cells. + +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_dxf_style. + + CONSTANTS: lc_xml_node_dxf TYPE string VALUE 'dxf', + 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_attr_val TYPE string VALUE 'val', + lc_xml_node_fill TYPE string VALUE 'fill', + lc_xml_node_patternfill TYPE string VALUE 'patternFill', + lc_xml_attr_patterntype TYPE string VALUE 'patternType', + lc_xml_node_fgcolor TYPE string VALUE 'fgColor', + lc_xml_node_bgcolor TYPE string VALUE 'bgColor', + y TYPE i VALUE 0. + + DATA: ls_styles_mapping TYPE zexcel_s_styles_mapping, + ls_cellxfs TYPE zexcel_s_cellxfs, + ls_style_cond_mapping TYPE zexcel_s_styles_cond_mapping, + lo_sub_element TYPE REF TO if_ixml_element, + lo_sub_element_2 TYPE REF TO if_ixml_element, + lv_index TYPE i, + ls_font TYPE zexcel_s_style_font, + lo_element_font TYPE REF TO if_ixml_element, + lv_value TYPE string, + ls_fill TYPE zexcel_s_style_fill, + lo_element_fill TYPE REF TO if_ixml_element, + x. + + CHECK iv_cell_style IS NOT INITIAL. + + READ TABLE me->styles_mapping INTO ls_styles_mapping WITH KEY guid = iv_cell_style. + ADD 1 TO ls_styles_mapping-style. " the numbering starts from 0 + READ TABLE it_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 = iv_cell_style. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ELSE. + ls_style_cond_mapping-guid = iv_cell_style. + ls_style_cond_mapping-style = ls_styles_mapping-style. + ls_style_cond_mapping-dxf = cv_dfx_count. + APPEND ls_style_cond_mapping TO me->styles_cond_mapping. + ADD 1 TO cv_dfx_count. + + " dxf node + lo_sub_element = io_ixml_document->create_simple_element( name = lc_xml_node_dxf + parent = io_ixml_document ). + + "Conditional formatting font style correction by Alessandro Iannacci START + lv_index = ls_cellxfs-fontid + 1. + READ TABLE it_fonts INTO ls_font INDEX lv_index. + IF ls_font IS NOT INITIAL. + lo_element_font = io_ixml_document->create_simple_element( name = lc_xml_node_font + parent = io_ixml_document ). + IF ls_font-bold EQ abap_true. + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_b + parent = io_ixml_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_font-italic EQ abap_true. + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_i + parent = io_ixml_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + IF ls_font-underline EQ abap_true. + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_u + parent = io_ixml_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 = io_ixml_document->create_simple_element( name = lc_xml_node_strike + parent = io_ixml_document ). + lo_element_font->append_child( new_child = lo_sub_element_2 ). + ENDIF. + "color + create_xl_styles_color_node( + io_document = io_ixml_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 it_fills INTO ls_fill INDEX ls_cellxfs-fillid. + IF ls_fill IS NOT INITIAL. + " fill properties + lo_element_fill = io_ixml_document->create_simple_element( name = lc_xml_node_fill + parent = io_ixml_document ). + "pattern + lo_sub_element_2 = io_ixml_document->create_simple_element( name = lc_xml_node_patternfill + parent = io_ixml_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 = io_ixml_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 = io_ixml_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. + + io_dxf_element->append_child( new_child = lo_sub_element ). +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'. + IF <fs_sheet_string>-string_value IS NOT INITIAL AND <fs_sheet_string>-string_value(1) EQ ` `. + 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, + ls_conditional_top10 TYPE zexcel_conditional_top10, + ls_conditional_above_avg TYPE zexcel_conditional_above_avg, + 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. +*--------------------------------------------------------------------* +* issue #367 add feature hide columns from +*--------------------------------------------------------------------* + IF io_worksheet->zif_excel_sheet_properties~hide_columns_from IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = zcl_excel_common=>convert_column2int( io_worksheet->zif_excel_sheet_properties~hide_columns_from ). + CONDENSE lv_value NO-GAPS. + 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 = '16384' ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = '1' ). + lo_element->append_child( new_child = lo_element_2 ). " col node + 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 = io_worksheet->get_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. + IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much + CLEAR l_autofilter_hidden. + ELSE. + 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. + 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. + IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much + CLEAR l_autofilter_hidden. + ELSE. + l_autofilter_hidden = abap_true. " First default is not showing + ENDIF. + ELSE. + + 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 + IF ls_cellis-formula2 IS NOT INITIAL. + lv_value = ls_cellis-formula2. + lo_element_3 = lo_document->create_simple_element( name = lc_xml_node_formula + parent = lo_document ). + lo_element_3->set_value( value = lv_value ). + lo_element_2->append_child( new_child = lo_element_3 ). " 2nd formula node + ENDIF. + + 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 + +* begin of ins issue #366 - missing conditional rules: top10 + WHEN zcl_excel_style_conditional=>c_rule_top10. + ls_conditional_top10 = lo_style_conditional->mode_top10. + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_conditional_top10-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_conditional_top10-topxx_count. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = 'rank' + value = lv_value ). + IF ls_conditional_top10-bottom = 'X'. + lo_element_2->set_attribute_ns( name = 'bottom' + value = '1' ). + ENDIF. + IF ls_conditional_top10-percent = 'X'. + lo_element_2->set_attribute_ns( name = 'percent' + value ='1' ). + ENDIF. + + WHEN zcl_excel_style_conditional=>c_rule_above_average. + ls_conditional_above_avg = lo_style_conditional->mode_above_average. + READ TABLE me->styles_cond_mapping INTO ls_style_cond_mapping WITH KEY guid = ls_conditional_above_avg-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 ). + + IF ls_conditional_above_avg-above_average IS INITIAL. " = below average + lo_element_2->set_attribute_ns( name = 'aboveAverage' + value = '0' ). + ENDIF. + IF ls_conditional_above_avg-equal_average = 'X'. " = equal average also + lo_element_2->set_attribute_ns( name = 'equalAverage' + value = '1' ). + ENDIF. + IF ls_conditional_above_avg-standard_deviation <> 0. " standard deviation instead of value + lv_value = ls_conditional_above_avg-standard_deviation. + lo_element_2->set_attribute_ns( name = 'stdDev' + value = lv_value ). + ENDIF. + +* end of ins issue #366 - missing conditional rules: top10 + + 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. + +* issue #377 pagebreaks + TRY. + create_xl_sheet_pagebreaks( io_document = lo_document + io_parent = lo_element_root + io_worksheet = io_worksheet ) . + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. + +* 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_pagebreaks. + DATA: lo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks, + lt_pagebreaks TYPE zcl_excel_worksheet_pagebreaks=>tt_pagebreak_at, + lt_rows TYPE HASHED TABLE OF int4 WITH UNIQUE KEY table_line, + lt_columns TYPE HASHED TABLE OF int4 WITH UNIQUE KEY table_line, + + lo_node_rowbreaks TYPE REF TO if_ixml_element, + lo_node_colbreaks TYPE REF TO if_ixml_element, + lo_node_break TYPE REF TO if_ixml_element, + + lv_value TYPE string. + + + FIELD-SYMBOLS: <ls_pagebreak> LIKE LINE OF lt_pagebreaks. + + lo_pagebreaks = io_worksheet->get_pagebreaks( ). + CHECK lo_pagebreaks IS BOUND. + + lt_pagebreaks = lo_pagebreaks->get_all_pagebreaks( ). + CHECK lt_pagebreaks IS NOT INITIAL. " No need to proceed if don't have any pagebreaks. + + lo_node_rowbreaks = io_document->create_simple_element( name = 'rowBreaks' + parent = io_document ). + + lo_node_colbreaks = io_document->create_simple_element( name = 'colBreaks' + parent = io_document ). + + + LOOP AT lt_pagebreaks ASSIGNING <ls_pagebreak>. + +* Count how many rows and columns need to be broken + INSERT <ls_pagebreak>-cell_row INTO TABLE lt_rows. + IF sy-subrc = 0. " New + lv_value = <ls_pagebreak>-cell_row. + CONDENSE lv_value. + + lo_node_break = io_document->create_simple_element( name = 'brk' + parent = io_document ). + lo_node_break->set_attribute( name = 'id' value = lv_value ). + lo_node_break->set_attribute( name = 'man' value = '1' ). " Manual break + lo_node_break->set_attribute( name = 'max' value = '16383' ). " Max columns + + lo_node_rowbreaks->append_child( new_child = lo_node_break ). + ENDIF. + + INSERT <ls_pagebreak>-cell_column INTO TABLE lt_columns. + IF sy-subrc = 0. " New + lv_value = <ls_pagebreak>-cell_column. + CONDENSE lv_value. + + lo_node_break = io_document->create_simple_element( name = 'brk' + parent = io_document ). + lo_node_break->set_attribute( name = 'id' value = lv_value ). + lo_node_break->set_attribute( name = 'man' value = '1' ). " Manual break + lo_node_break->set_attribute( name = 'max' value = '1048575' ). " Max rows + + lo_node_colbreaks->append_child( new_child = lo_node_break ). + ENDIF. + + + ENDLOOP. + + lv_value = lines( lt_rows ). + CONDENSE lv_value. + lo_node_rowbreaks->set_attribute( name = 'count' value = lv_value ). + lo_node_rowbreaks->set_attribute( name = 'manualBreakCount' value = lv_value ). + + lv_value = lines( lt_rows ). + CONDENSE lv_value. + lo_node_colbreaks->set_attribute( name = 'count' value = lv_value ). + lo_node_colbreaks->set_attribute( name = 'manualBreakCount' value = lv_value ). + + + + + io_parent->append_child( new_child = lo_node_rowbreaks ). + io_parent->append_child( new_child = lo_node_colbreaks ). + +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. +*--------------------------------------------------------------------* +* ToDos: +* 2do§1 dxfs-cellstyles are used in conditional formats: +* CellIs, Expression, top10 ( forthcoming above average as well ) +* create own method to write dsfx-cellstyle to be reuseable by all these +*--------------------------------------------------------------------* + + +** 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, + ls_conditional_top10 TYPE zexcel_conditional_top10, + + 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. +* begin of change issue #366 - missing conditional rules: top10, move dfx-styles to own method + WHEN zcl_excel_style_conditional=>c_rule_cellis. + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_cellis-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). + + WHEN zcl_excel_style_conditional=>c_rule_expression. + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_expression-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). + + + + WHEN zcl_excel_style_conditional=>c_rule_top10. + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_top10-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). + + WHEN zcl_excel_style_conditional=>c_rule_above_average. + me->create_dxf_style( EXPORTING + iv_cell_style = lo_style_conditional->mode_above_average-cell_style + io_dxf_element = lo_element + io_ixml_document = lo_document + it_cellxfs = lt_cellxfs + it_fonts = lt_fonts + it_fills = lt_fills + CHANGING + cv_dfx_count = lv_dfx_count ). +* begin of change issue #366 - missing conditional rules: top10, move dfx-styles to own method + + 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( ). +* issue #365 - test if sheet exists - otherwise set active worksheet to 1 + lo_worksheet = excel->get_worksheet_by_index( lv_active_sheet ). + IF lo_worksheet IS NOT BOUND. + lv_active_sheet = 1. + excel->SET_ACTIVE_SHEET_INDEX( lv_active_sheet ). + ENDIF. + 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. + + + + *"* 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. + + + + + + + *"* 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_shared_string_some_empty 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_shared_string_some_empty. + data: lo_reader type ref to if_sxml_reader, + lt_act type stringtab, + lt_exp type stringtab. + lo_reader = cl_sxml_string_reader=>create( cl_abap_codepage=>convert_to( + `<sst><si><t/></si>` & + `<si><t>Alpha</t></si>` & + `<si><t/></si>` & + `<si><t>Bravo</t></si></sst>` + ) ). + append : + `` to lt_exp, + `Alpha` to lt_exp, + `` 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. + + data lv_value type string. + + while io_reader->node_type ne c_end_of_stream. + io_reader->next_node( ). + if io_reader->name eq `t`. + case io_reader->node_type . + when c_element_open . + clear lv_value . + when c_node_value . + lv_value = lv_value && io_reader->value . + when c_element_close . + append lv_value to et_shared_strings. + endcase . + 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 add_pagebreak. + DATA: ls_pagebreak LIKE LINE OF me->mt_pagebreaks. + + ls_pagebreak-cell_row = ip_row. + ls_pagebreak-cell_column = zcl_excel_common=>convert_column2int( ip_column ). + + INSERT ls_pagebreak INTO TABLE me->mt_pagebreaks. + + +ENDMETHOD. + + + + METHOD get_all_pagebreaks. + rt_pagebreaks = me->mt_pagebreaks. +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 guid_create. + + TRY. + rv_guid_16 = cl_system_uuid=>if_system_uuid_static~create_uuid_x16( ). + CATCH cx_uuid_error. + ENDTRY. + +*--------------------------------------------------------------------* +* If you are on a release that does not yet have the class cl_system_uuid +* please use the following coding instead which is using the function +* call that was used before but which has been flagged as obsolete +* in newer SAP releases +*--------------------------------------------------------------------* +* +* CALL FUNCTION 'GUID_CREATE' +* IMPORTING +* ev_guid_16 = rv_guid_16. + +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 ) . +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 delete_worksheet. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + l_size TYPE i, + lv_errormessage TYPE string. + + l_size = get_worksheets_size( ). + IF l_size = 1. " Only 1 worksheet left --> check whether this is the worksheet to be deleted + lo_worksheet = me->get_worksheet_by_index( 1 ). + IF lo_worksheet = io_worksheet. + lv_errormessage = 'Deleting last remaining worksheet is not allowed'(002). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + ENDIF. + + me->worksheets->remove( io_worksheet ). + +ENDMETHOD. + + + + METHOD delete_worksheet_by_index. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. + + lo_worksheet = me->get_worksheet_by_index( iv_index ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + me->delete_worksheet( lo_worksheet ). + +ENDMETHOD. + + + + METHOD delete_worksheet_by_name. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. + + lo_worksheet = me->get_worksheet_by_name( iv_title ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + me->delete_worksheet( lo_worksheet ). + +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. + style-guid = zcl_excel_obsolete_func_wrap=>guid_create( ). + 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_index. + + + DATA: lv_index TYPE zexcel_active_worksheet. + + lv_index = iv_index. + eo_worksheet = me->worksheets->get( lv_index ). + +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. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. + +*--------------------------------------------------------------------* +* Check whether worksheet exists +*--------------------------------------------------------------------* + lo_worksheet = me->get_worksheet_by_index( i_active_worksheet ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + 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 class_constructor. + c_xlsx_file_filter = 'Excel Workbook (*.xlsx)|*.xlsx|'(005). +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' " del issue #379 - function is outdated in newer releases +* IMPORTING +* ev_guid_16 = me->guid. + me->guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call + + 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. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& 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. + +TYPE-POOLS: vrm. + +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 ). + + + + + + + + *&---------------------------------------------------------------------* +*& 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( ). + + + + + + + + + + + + + + + + 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 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 "#EC CI_SUBMIT + 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 "#EC CI_SUBMIT + 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 change 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. + date_to = date_from. + date_to+6(2) = '01'. " First of month + add 31 to date_to. " Somewhere in following month + date_to = date_to - date_to+6(2). " Last of month + 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. "#EC CI_SUBMIT abap2xlsx Demo: Hello world + SUBMIT zdemo_excel2 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Styles + SUBMIT zdemo_excel3 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: iTab binding + SUBMIT zdemo_excel4 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Conditional formatting + SUBMIT zdemo_excel6 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Formulas + SUBMIT zdemo_excel7 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Conditional formatting + SUBMIT zdemo_excel8 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Ranges + SUBMIT zdemo_excel9 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Data validation + SUBMIT zdemo_excel10 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Column size + SUBMIT zdemo_excel13 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Merge cell + SUBMIT zdemo_excel14 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Drawing + SUBMIT zdemo_excel17 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Lock sheet + SUBMIT zdemo_excel18 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Lock workbook + SUBMIT zdemo_excel19 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Color Picker + SUBMIT zdemo_excel22 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Multiple sheets with different default date formats + SUBMIT zdemo_excel25 AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Conditional Formatting + SUBMIT zdemo_excel28 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: CSV writer + " SUBMIT zdemo_excel29 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Table autofilter + SUBMIT zdemo_excel34 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Static Styles + SUBMIT zdemo_excel36 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT abap2xlsx Demo: Charts + SUBMIT zdemo_excel40 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT abap2xlsx Demo: Demo Printsettings + SUBMIT zdemo_excel41 WITH rb_down = abap_true WITH rb_show = abap_false WITH p_path = p_path AND RETURN. "#EC CI_SUBMIT 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. "#EC CI_SUBMIT 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 + +*--------------------------------------------------------------------* +* Hide columns right of column M +*--------------------------------------------------------------------* + lo_worksheet->zif_excel_sheet_properties~hide_columns_from = 'M'. + +*** 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_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_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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/ABAP2XLSX_V_7_0_4.nugg.zip b/build/ABAP2XLSX_V_7_0_4.nugg.zip new file mode 100644 index 0000000000000000000000000000000000000000..d9d4b422e2c728387f89d1a023c1b9404b8d836e GIT binary patch literal 324753 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 knKKTTbk_PxVC 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

    mY&ZZr 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%0DYHcf5p=uzx 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 z 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%0A`39wri_;{x#DYG7HM%UKz)LQjnTw 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 Y{zp~hVPOAz2;}E&^GPx9p+D3A0~+lEy#N3J literal 0 HcmV?d00001 diff --git a/build/ABAP2XLSX_V_7_0_3.nugg b/build/old_releases/ABAP2XLSX_V_7_0_3.nugg similarity index 100% rename from build/ABAP2XLSX_V_7_0_3.nugg rename to build/old_releases/ABAP2XLSX_V_7_0_3.nugg diff --git a/build/ABAP2XLSX_V_7_0_3.nugg.zip b/build/old_releases/ABAP2XLSX_V_7_0_3.nugg.zip similarity index 100% rename from build/ABAP2XLSX_V_7_0_3.nugg.zip rename to build/old_releases/ABAP2XLSX_V_7_0_3.nugg.zip diff --git a/build/ABAP2XLSX_V_7_0_3.zip b/build/old_releases/ABAP2XLSX_V_7_0_3.zip similarity index 100% rename from build/ABAP2XLSX_V_7_0_3.zip rename to build/old_releases/ABAP2XLSX_V_7_0_3.zip From 1288a1a27213e2cfd1c198ba99b419834177200e Mon Sep 17 00:00:00 2001 From: Alessandro Iannacci Date: Tue, 23 Jun 2015 15:02:47 +0200 Subject: [PATCH 27/32] Issue #383 - Report 10 modified to show the new functionality Issue #383 - Report 10 modified to show the new functionality --- ZA2X/PROG/ZDEMO_EXCEL10.slnk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ZA2X/PROG/ZDEMO_EXCEL10.slnk b/ZA2X/PROG/ZDEMO_EXCEL10.slnk index 0914eb8..45477e8 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL10.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL10.slnk @@ -73,6 +73,9 @@ START-OF-SELECTION. WHEN 'CONNID'. <fs_field_catalog>-position = 4. <fs_field_catalog>-dynpfld = abap_true. + <fs_field_catalog>-abap_type = cl_abap_typedescr=>typekind_int. + "This avoid the excel warning that the number is formatted as a text: abap2xlsx is not able to recognize numc as a number so it formats the number as a text with + "the related warning. You can force the type and the framework will correctly format the number as a number WHEN 'FLDATE'. <fs_field_catalog>-position = 2. <fs_field_catalog>-dynpfld = abap_true. From 28b73e024835240f22f7b19f7d0d1ea20f2ffb4f Mon Sep 17 00:00:00 2001 From: Alessandro Iannacci Date: Wed, 24 Jun 2015 11:38:35 +0200 Subject: [PATCH 28/32] Issue #384 solved - Excel reader problem with pagebreaks: nullreference Excel reader problem with pagebreaks: nullreference --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 42 +++++++++++++++------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 3037956..43568bd 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -3635,6 +3635,7 @@ ENDMETHOD. * Build table to identify these cells *--------------------------------------------------------------------* lo_node ?= io_ixml_worksheet->find_from_name( 'rowBreaks' ). + check lo_node is bound. lo_ixml_rowbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). lo_ixml_iterator = lo_ixml_rowbreaks->create_iterator( ). lo_ixml_rowbreak ?= lo_ixml_iterator->get_next( ). @@ -3647,6 +3648,7 @@ ENDMETHOD. CHECK <ls_pagebreak_row> IS ASSIGNED. lo_node ?= io_ixml_worksheet->find_from_name( 'colBreaks' ). + check lo_node is bound. lo_ixml_colbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). lo_ixml_iterator = lo_ixml_colbreaks->create_iterator( ). lo_ixml_colbreak ?= lo_ixml_iterator->get_next( ). From 9ef116622af60a07206b9bd02613de9621b91165 Mon Sep 17 00:00:00 2001 From: Alessandro Iannacci Date: Thu, 25 Jun 2015 15:03:39 +0200 Subject: [PATCH 29/32] issue #386 - Method BIND_TABLE - Unable to have columns with same name (method adds an index to the column) Method BIND_TABLE - Unable to have columns with same name (method adds an index to the column) --- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 48 ++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 9159448..1eba835 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -1,15 +1,15 @@ - - + - - - - - - - - - - - + + + *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes @@ -199,6 +199,12 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION *"* use this source file for any macro definitions you need *"* in the implementation part of the class + + + + + + @@ -219,6 +225,15 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION + + + + + + + + + @@ -2789,9 +2804,10 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION EXIT. ELSE. lv_syindex = sy-index. - CONCATENATE <ls_field_catalog>-scrtext_l lv_syindex INTO lv_value. + DO lv_syindex TIMES. + CONCATENATE lv_value ' ' INTO lv_value RESPECTING BLANKS. + ENDDO. ENDIF. - ENDWHILE. " First of all write column header IF <ls_field_catalog>-style_header IS NOT INITIAL. @@ -2812,7 +2828,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION " issue #290 Add formula support in table IF <ls_field_catalog>-formula EQ abap_true. IF <ls_field_catalog>-style IS NOT INITIAL. - IF <ls_field_catalog>-abap_type IS NOT INITIAL. + IF <ls_field_catalog>-abap_type IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = <fs_fldval> From f1981a4ebd402f9a9665f6edefd0a6f5f933d3d4 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Mon, 13 Jul 2015 00:00:15 +0200 Subject: [PATCH 30/32] issue #372 - added support of stacking bars in charts --- ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk | 40 +++++----- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 14 +++- ZA2X/PROG/ZDEMO_EXCEL39.slnk | 114 ++++++++++++++++++++------- 3 files changed, 120 insertions(+), 48 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk index 51d1fe2..ba3f71d 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_GRAPH_BARS.slnk @@ -1,6 +1,6 @@ - - + - *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type @@ -30,25 +30,27 @@ *"* components in the private section *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - + - - - + + + + - - - - - - - - - - - + + + + + + + + + + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 410b5a4..ac9562c 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -1153,6 +1153,7 @@ ENDMETHOD. 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 + lc_xml_node_overlap TYPE string VALUE 'c:overlap', "note: numcache avoided lc_xml_node_dlbls TYPE string VALUE 'c:dLbls', lc_xml_node_showlegendkey TYPE string VALUE 'c:showLegendKey', @@ -1415,6 +1416,12 @@ ENDMETHOD. ENDIF. ENDLOOP. "endseries + IF lo_chartb->ns_groupingval = zcl_excel_graph_bars=>c_groupingval_stacked. + lo_element4 = lo_document->create_simple_element( name = lc_xml_node_overlap + parent = lo_element3 ). + lo_element4->set_attribute_ns( name = 'val' + value = '100' ). + ENDIF. lo_element4 = lo_document->create_simple_element( name = lc_xml_node_dlbls parent = lo_element3 ). @@ -2724,12 +2731,15 @@ ENDMETHOD. 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. + clear lv_count. + LOOP AT lt_cell_data ASSIGNING <fs_sheet_content> where data_type = 's'. +* lv_sytabix = sy-tabix - 1. + lv_sytabix = lv_count. 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. + add 1 to lv_count. ENDLOOP. diff --git a/ZA2X/PROG/ZDEMO_EXCEL39.slnk b/ZA2X/PROG/ZDEMO_EXCEL39.slnk index 1aaeb05..f9e42e3 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL39.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL39.slnk @@ -19,21 +19,22 @@ 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: 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: 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. +DATA: lo_bar1 TYPE REF TO zcl_excel_graph_bars, + lo_bar1_stacked TYPE REF TO zcl_excel_graph_bars, + lo_bar2 TYPE REF TO zcl_excel_graph_bars, + lo_pie TYPE REF TO zcl_excel_graph_pie, + 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. @@ -81,8 +82,8 @@ START-OF-SELECTION. CALL METHOD lo_bar1->create_ax EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_catax +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_catax * ip_orientation = * ip_delete = * ip_axpos = @@ -93,7 +94,7 @@ START-OF-SELECTION. * ip_ticklblpos = * ip_crossax = * ip_crosses = -* ip_auto = +* ip_auto = * ip_lblalgn = * ip_lbloffset = * ip_nomultilvllbl = @@ -102,8 +103,8 @@ START-OF-SELECTION. CALL METHOD lo_bar1->create_ax EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_valax +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_valax * ip_orientation = * ip_delete = * ip_axpos = @@ -114,7 +115,7 @@ START-OF-SELECTION. * ip_ticklblpos = * ip_crossax = * ip_crosses = -* ip_auto = +* ip_auto = * ip_lblalgn = * ip_lbloffset = * ip_nomultilvllbl = @@ -127,6 +128,43 @@ START-OF-SELECTION. " Set label to none lo_bar1->set_print_lbl( zcl_excel_graph_bars=>c_show_false ). +* Same barchart - but this time stacked + CREATE OBJECT lo_bar1_stacked. + + CALL METHOD lo_bar1_stacked->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_stacked->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_stacked->create_ax + EXPORTING + ip_type = zcl_excel_graph_bars=>c_catax . + + CALL METHOD lo_bar1_stacked->create_ax + EXPORTING + ip_type = zcl_excel_graph_bars=>c_valax. + + " Set style + lo_bar1_stacked->set_style( zcl_excel_graph=>c_style_default ). + + " Set label to none + lo_bar1_stacked->set_print_lbl( zcl_excel_graph_bars=>c_show_false ). + + " Make it stacked + lo_bar1_stacked->ns_groupingval = zcl_excel_graph_bars=>c_groupingval_stacked. + + " Create a bar chart, series and axes CREATE OBJECT lo_bar2. @@ -140,8 +178,8 @@ START-OF-SELECTION. CALL METHOD lo_bar2->create_ax EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_catax +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_catax * ip_orientation = * ip_delete = * ip_axpos = @@ -152,7 +190,7 @@ START-OF-SELECTION. * ip_ticklblpos = * ip_crossax = * ip_crosses = -* ip_auto = +* ip_auto = * ip_lblalgn = * ip_lbloffset = * ip_nomultilvllbl = @@ -161,8 +199,8 @@ START-OF-SELECTION. CALL METHOD lo_bar2->create_ax EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_bars=>c_valax +* ip_axid = + ip_type = zcl_excel_graph_bars=>c_valax * ip_orientation = * ip_delete = * ip_axpos = @@ -173,7 +211,7 @@ START-OF-SELECTION. * ip_ticklblpos = * ip_crossax = * ip_crosses = -* ip_auto = +* ip_auto = * ip_lblalgn = * ip_lbloffset = * ip_nomultilvllbl = @@ -220,8 +258,8 @@ START-OF-SELECTION. CALL METHOD lo_line->create_ax EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_line=>c_catax +* ip_axid = + ip_type = zcl_excel_graph_line=>c_catax * ip_orientation = * ip_delete = * ip_axpos = @@ -230,7 +268,7 @@ START-OF-SELECTION. * ip_ticklblpos = * ip_crossax = * ip_crosses = -* ip_auto = +* ip_auto = * ip_lblalgn = * ip_lbloffset = * ip_nomultilvllbl = @@ -239,8 +277,8 @@ START-OF-SELECTION. CALL METHOD lo_line->create_ax EXPORTING -* ip_axid = - ip_type = zcl_excel_graph_line=>c_valax +* ip_axid = + ip_type = zcl_excel_graph_line=>c_valax * ip_orientation = * ip_delete = * ip_axpos = @@ -251,7 +289,7 @@ START-OF-SELECTION. * ip_ticklblpos = * ip_crossax = * ip_crosses = -* ip_auto = +* ip_auto = * ip_lblalgn = * ip_lbloffset = * ip_nomultilvllbl = @@ -320,6 +358,28 @@ START-OF-SELECTION. lo_worksheet->add_drawing( lo_drawing ). + lo_drawing = lo_worksheet->excel->add_new_drawing( + ip_type = zcl_excel_drawing=>type_chart + ip_title = 'Stacked CHART BARS WITH 2 SER.' ). + lo_drawing->graph = lo_bar1_stacked. + lo_drawing->graph_type = zcl_excel_drawing=>c_graph_bars. + + "Set chart position (anchor 2 cells) + ls_upper-row = 0. + ls_upper-col = 1. + ls_lower-row = 22. + ls_lower-col = 10. + 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( ). From f1b69468d1d15d927d53dadd753fe3a9a1b80d18 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Mon, 13 Jul 2015 00:24:10 +0200 Subject: [PATCH 31/32] issue #377 - Added missing Structureenhancement and autofilter adjustment to get rid of sheet-guid --- ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk | 105 +++++++++++++----------- ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk | 1 + 2 files changed, 60 insertions(+), 46 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk b/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk index 1056ba3..2038e10 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_AUTOFILTERS.slnk @@ -1,87 +1,100 @@ - + + + *"* 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. +*"* 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: 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. + + METHOD add. + + DATA: ls_autofilter LIKE LINE OF me->mt_autofilters. + + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + READ TABLE me->mt_autofilters ASSIGNING <ls_autofilter> WITH TABLE KEY worksheet = io_sheet. 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 . + RAISE EXCEPTION TYPE zcx_excel. " adding another autofilter to sheet is not allowed ENDIF. - endmethod. + + CREATE OBJECT ro_autofilter + EXPORTING + io_sheet = io_sheet. + + ls_autofilter-worksheet = io_sheet. + ls_autofilter-autofilter = ro_autofilter. + INSERT ls_autofilter INTO TABLE me->mt_autofilters. + + +ENDMETHOD. - method CLEAR. + METHOD clear. - REFRESH autofilters. + CLEAR me->mt_autofilters. - endmethod. +ENDMETHOD. - - - method GET. + + + + METHOD get. - DATA: ls_autofilters TYPE ts_objects. + DATA: ls_autofilter LIKE LINE OF me->mt_autofilters. - READ TABLE autofilters INTO ls_autofilters WITH TABLE KEY sheet_guid = i_sheet_guid. + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + READ TABLE me->mt_autofilters ASSIGNING <ls_autofilter> WITH TABLE KEY worksheet = io_worksheet. IF sy-subrc = 0. - ro_autofilter = ls_autofilters-autofilter. + ro_autofilter = <ls_autofilter>-autofilter. ELSE. CLEAR ro_autofilter. ENDIF. - endmethod. +ENDMETHOD. - method IS_EMPTY. - IF autofilters IS INITIAL. + METHOD is_empty. + IF me->mt_autofilters IS INITIAL. r_empty = abap_true. ENDIF. - endmethod. +ENDMETHOD. - - method REMOVE. - DATA: ls_autofilters TYPE ts_objects. + + METHOD remove. - DELETE autofilters WHERE sheet_guid = i_sheet_guid. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet. - endmethod. + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + DELETE TABLE me->mt_autofilters WITH TABLE KEY worksheet = lo_worksheet. + +ENDMETHOD. - method SIZE. - DESCRIBE TABLE autofilters LINES r_size. - endmethod. + METHOD size. + DESCRIBE TABLE me->mt_autofilters LINES r_size. +ENDMETHOD. diff --git a/ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk b/ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk index c554a9c..942e7c7 100644 --- a/ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk +++ b/ZA2X/TABL/ZEXCEL_CONDITIONAL_TOP10.slnk @@ -4,4 +4,5 @@ + From e8ec7e89c5c64abf3a0f5c6d31e51c3779d9429a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schm=C3=B6cker?= Date: Mon, 13 Jul 2015 22:54:06 +0200 Subject: [PATCH 32/32] Fixed issue #231: Reader does not read drawings correctly Basically only the size was miscalulated. Added new method to Drawing class to convert from emu to pixel and use this on reading a drawing. Probable still not working when using different dpi then standard - but I have to see this before I can tackle it. --- ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk | 100 ++++++++++++++++++ ZA2X/CLAS/ZCL_EXCEL.slnk | 6 +- ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk | 36 +++++-- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 120 ++++++++++++---------- 4 files changed, 193 insertions(+), 69 deletions(-) create mode 100644 ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk diff --git a/ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk b/ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk new file mode 100644 index 0000000..2038e10 --- /dev/null +++ b/ZA2X/CLAS/CLAS_ZCL_EXCEL_AUTOFILTERS.slnk @@ -0,0 +1,100 @@ + + + + + *"* 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: ls_autofilter LIKE LINE OF me->mt_autofilters. + + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + READ TABLE me->mt_autofilters ASSIGNING <ls_autofilter> WITH TABLE KEY worksheet = io_sheet. + IF sy-subrc = 0. + RAISE EXCEPTION TYPE zcx_excel. " adding another autofilter to sheet is not allowed + ENDIF. + + CREATE OBJECT ro_autofilter + EXPORTING + io_sheet = io_sheet. + + ls_autofilter-worksheet = io_sheet. + ls_autofilter-autofilter = ro_autofilter. + INSERT ls_autofilter INTO TABLE me->mt_autofilters. + + +ENDMETHOD. + + + METHOD clear. + + CLEAR me->mt_autofilters. + +ENDMETHOD. + + + + + + METHOD get. + + DATA: ls_autofilter LIKE LINE OF me->mt_autofilters. + + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + READ TABLE me->mt_autofilters ASSIGNING <ls_autofilter> WITH TABLE KEY worksheet = io_worksheet. + IF sy-subrc = 0. + ro_autofilter = <ls_autofilter>-autofilter. + ELSE. + CLEAR ro_autofilter. + ENDIF. + +ENDMETHOD. + + + + METHOD is_empty. + IF me->mt_autofilters IS INITIAL. + r_empty = abap_true. + ENDIF. +ENDMETHOD. + + + + METHOD remove. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet. + + FIELD-SYMBOLS: <ls_autofilter> LIKE LINE OF me->mt_autofilters. + + DELETE TABLE me->mt_autofilters WITH TABLE KEY worksheet = lo_worksheet. + +ENDMETHOD. + + + + METHOD size. + DESCRIBE TABLE me->mt_autofilters LINES r_size. +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL.slnk b/ZA2X/CLAS/ZCL_EXCEL.slnk index ced9521..db60250 100644 --- a/ZA2X/CLAS/ZCL_EXCEL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL.slnk @@ -181,7 +181,7 @@ ENDMETHOD. - + method ADD_NEW_DRAWING. DATA: lv_guid TYPE guid_16. @@ -443,10 +443,10 @@ ENDMETHOD. IF sy-subrc <> 0. style-complete_style = ip_cstyle_complete. style-complete_stylex = ip_cstylex_complete. -* CALL FUNCTION 'GUID_CREATE' +* CALL FUNCTION 'GUID_CREATE' " del issue #379 - function is outdated in newer releases * IMPORTING * ev_guid_16 = style-guid. - style-guid = zcl_excel_obsolete_func_wrap=>guid_create( ). + style-guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call INSERT style INTO TABLE me->t_stylemapping1. INSERT style INTO TABLE me->t_stylemapping2. diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk index 8e292bf..4922614 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk @@ -44,7 +44,7 @@ - + METHOD constructor. * CALL FUNCTION 'GUID_CREATE' " del issue #379 - function is outdated in newer releases @@ -78,6 +78,22 @@ ENDMETHOD. CONDENSE media_name NO-GAPS. endmethod. + + + + + METHOD emu2pixel. +* suppose 96 DPI + IF ip_dpi IS SUPPLIED. +* r_emu = ip_pixel * 914400 / ip_dpi. + r_pixel = ip_emu * ip_dpi / 914400. + ELSE. +* suppose 96 DPI +* r_emu = ip_pixel * 914400 / 96. + r_pixel = ip_emu * 96 / 914400. + ENDIF. +ENDMETHOD. + method GET_FROM_COL. @@ -105,7 +121,7 @@ ENDMETHOD. CONDENSE r_height NO-GAPS. endmethod. - + method GET_INDEX. rp_index = me->index. @@ -193,7 +209,7 @@ ENDMETHOD. r_name = title. endmethod. - + method GET_POSITION. rp_position-anchor = anchor. @@ -214,7 +230,7 @@ ENDMETHOD. r_to_row = me->to_loc-row. endmethod. - + method GET_TYPE. rp_type = me->type. @@ -227,7 +243,7 @@ ENDMETHOD. CONDENSE r_width NO-GAPS. endmethod. - + method LOAD_CHART_ATTRIBUTES. DATA: node TYPE REF TO if_ixml_element. @@ -927,7 +943,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -946,7 +962,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -972,7 +988,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -996,7 +1012,7 @@ ENDMETHOD. size-height = ip_height. endmethod. - + @@ -1013,7 +1029,7 @@ ENDMETHOD. anchor = anchor_one_cell. endmethod. - + diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 43568bd..ee55120 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -736,52 +736,52 @@ ENDMETHOD. - method LOAD_DRAWING_ANCHOR. + METHOD load_drawing_anchor. TYPES: BEGIN OF t_c_nv_pr, - name TYPE string, - id TYPE string, - END 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. + cstate TYPE string, + embed TYPE string, + END OF t_blip. TYPES: BEGIN OF t_chart, - id TYPE string, - END 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. + 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'. + 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, + 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, + 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 string, - cnvpr TYPE t_c_nv_pr, - blip TYPE t_blip, - chart TYPE t_chart, - drawing_type TYPE zexcel_drawing_type, + 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. + rel_drawing TYPE t_rel_drawing. node ?= io_anchor_element->find_from_name( name = 'from' namespace = 'xdr' ). CHECK node IS NOT INITIAL. @@ -801,6 +801,14 @@ ENDMETHOD. me->fill_struct_from_attributes( EXPORTING ip_element = node CHANGING cp_structure = ext ). ls_size-width = ext-cx. ls_size-height = ext-cy. + TRY. + ls_size-width = zcl_excel_drawing=>emu2pixel( ls_size-width ). + CATCH cx_root. + ENDTRY. + TRY. + ls_size-height = zcl_excel_drawing=>emu2pixel( ls_size-height ). + CATCH cx_root. + ENDTRY. ENDIF. node ?= io_anchor_element->find_from_name( name = 'to' namespace = 'xdr' ). @@ -877,12 +885,12 @@ ENDMETHOD. ip_width = ls_size-width ip_height = ls_size-height ). - if drawing_type = zcl_excel_drawing=>type_chart. + 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. + ENDIF. - endmethod. +ENDMETHOD.

    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