diff --git a/ZA2X/CLAS/ZCL_EXCEL.slnk b/ZA2X/CLAS/ZCL_EXCEL.slnk index 65e8c31..534b638 100644 --- a/ZA2X/CLAS/ZCL_EXCEL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL.slnk @@ -1,5 +1,5 @@ - + class ZCL_EXCEL definition public final @@ -72,15 +72,15 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - - - - + + + + + + + + + method ADD_NEW_DRAWING. DATA: lv_guid TYPE guid_16. * Create default blank worksheet @@ -90,16 +90,16 @@ private section. drawings->add( eo_drawing ). endmethod. - - + + method ADD_NEW_RANGE. * Create default blank range CREATE OBJECT eo_range. ranges->add( eo_range ). endmethod. - - + + method ADD_NEW_STYLE. * Create default style CREATE OBJECT eo_style. @@ -107,9 +107,9 @@ endmethod. endmethod. - - - + + + method ADD_NEW_WORKSHEET. DATA: lv_guid TYPE guid_16. * Create default blank worksheet @@ -121,7 +121,7 @@ endmethod. worksheets->active_worksheet = worksheets->size( ). endmethod. - + method CONSTRUCTOR. DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, lo_style TYPE REF TO zcl_excel_style. @@ -140,32 +140,32 @@ endmethod. lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_pattern_gray125. endmethod. - - + + method GET_ACTIVE_WORKSHEET. eo_worksheet = me->worksheets->get( me->worksheets->active_worksheet ). endmethod. - - + + method GET_DRAWINGS_ITERATOR. eo_iterator = me->drawings->get_iterator( ). 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->has_next( ) EQ abap_true. - lo_worksheet ?= lo_iterator->get_next( ). + 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. @@ -176,40 +176,40 @@ endmethod. endmethod. - - + + method GET_RANGES_ITERATOR. eo_iterator = me->ranges->get_iterator( ). endmethod. - - + + method GET_STYLES_ITERATOR. eo_iterator = me->styles->get_iterator( ). 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( ). diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk index d79f133..7fcc781 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWING.slnk @@ -1,5 +1,5 @@ - + class ZCL_EXCEL_DRAWING definition public final @@ -10,17 +10,71 @@ public section. type-pools ABAP . - data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE . + data TITLE type STRING value 'image1.jpg'. "#EC NOTEXT . data X_REFERENCES type CHAR1 . data Y_REFERENCES type CHAR1 . - data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE . + class-methods PIXEL2EMU + importing + !IP_PIXEL type INT4 + !IP_DPI type INT2 optional + returning + value(R_EMU) type INT4 . methods CONSTRUCTOR importing !IP_TITLE type ZEXCEL_SHEET_TITLE optional . + methods CREATE_MEDIA_NAME + importing + !IP_INDEX type I . + methods GET_FROM_COL + returning + value(R_FROM_COL) type ZEXCEL_CELL_COLUMN . + methods GET_FROM_ROW + returning + value(R_FROM_ROW) type ZEXCEL_CELL_ROW . methods GET_GUID returning - value(EP_GUID) type GUID_16 . + value(EP_GUID) type GUID_16 . + methods GET_MEDIA + returning + value(R_MEDIA) type XSTRING . + methods GET_MEDIA_NAME + returning + value(R_NAME) type STRING . + methods GET_MEDIA_TYPE + returning + value(R_TYPE) type STRING . + methods GET_NAME + returning + value(R_NAME) type STRING . + methods GET_TO_COL + returning + value(R_TO_COL) type ZEXCEL_CELL_COLUMN . + methods GET_TO_ROW + returning + value(R_TO_ROW) type ZEXCEL_CELL_ROW . + methods SET_MEDIA + importing + !IP_MEDIA type XSTRING + !IP_MEDIA_TYPE type STRING + !IP_WIDTH type INT4 + !IP_HEIGHT type INT4 . + methods SET_MEDIA_WWW + importing + !IP_KEY type WWWDATATAB + !IP_WIDTH type INT4 + !IP_HEIGHT type INT4 . + methods SET_POSITION + importing + !IP_FROM_ROW type ZEXCEL_CELL_ROW + !IP_FROM_COL type ZEXCEL_CELL_COLUMN_ALPHA . + methods GET_WIDTH_EMU_STR + returning + value(R_WIDTH) type STRING . + methods GET_HEIGHT_EMU_STR + returning + value(R_HEIGHT) type STRING . *"* protected components of class ZCL_EXCEL_DRAWING *"* do not include other source files here!!! protected section. @@ -28,10 +82,19 @@ protected section. *"* do not include other source files here!!! private section. + constants C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT + constants C_MEDIA_SOURCE_WWW type CHAR1 value 1. "#EC NOTEXT + constants C_MEDIA_SOURCE_XSTRING type CHAR1 value 0. "#EC NOTEXT data GUID type GUID_16 . data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data MEDIA type XSTRING . + data MEDIA_KEY_WWW type WWWDATATAB . + data MEDIA_NAME type STRING . + data MEDIA_SOURCE type CHAR1 . + data MEDIA_TYPE type STRING . data UPPER_CELL type ZEXCEL_S_CELL_DATA . - constants C_EXCEL_COL_MODULE type INT2 value 64. "#EC NOTEXT + data WIDTH type INT4 . + data HEIGHT type INT4 . methods CONVERT_COLUMN2ALPHA importing @@ -53,16 +116,25 @@ private section. *"* in the implementation part of the class ABAP - - - - - - - - - - + + + + + + + + + + + + + + + + + + + method CONSTRUCTOR. CALL FUNCTION 'GUID_CREATE' @@ -82,9 +154,9 @@ private section. upper_cell-cell_column = 1. endmethod. - - - + + + method CONVERT_COLUMN2ALPHA. DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, lv_uccpi TYPE i, @@ -105,9 +177,9 @@ endmethod. endmethod. - - - + + + method CONVERT_COLUMN2INT. DATA: lv_uccpi TYPE i, @@ -135,12 +207,182 @@ endmethod. endmethod. - - + + + METHOD create_media_name. + DATA: lv_index TYPE string. + +* if media name is initial, create unique name + CHECK media_name IS INITIAL. + + lv_index = ip_index. + CONCATENATE `image` lv_index INTO media_name. + CONDENSE media_name NO-GAPS. +ENDMETHOD. + + + + METHOD GET_FROM_COL. + r_from_col = me->upper_cell-cell_column. +ENDMETHOD. + + + + METHOD get_from_row. + r_from_row = me->upper_cell-cell_row. +ENDMETHOD. + + + method GET_GUID. ep_guid = me->guid. +endmethod. + + + + METHOD get_height_emu_str. + r_height = pixel2emu( height ). + CONDENSE r_height NO-GAPS. +ENDMETHOD. + + + + METHOD get_media. + CASE media_source. + WHEN c_media_source_xstring. + r_media = media. + WHEN c_media_source_www. + DATA: lt_mime TYPE tsfmime, + lv_filesize TYPE i, + lv_filesizec(10). + + 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. + + 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_TO_COL. + r_to_col = me->lower_cell-cell_column. +ENDMETHOD. + + + + METHOD GET_TO_ROW. + r_to_row = me->lower_cell-cell_row. +ENDMETHOD. + + + + METHOD get_width_emu_str. + r_width = pixel2emu( width ). + CONDENSE r_width NO-GAPS. +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. + media = ip_media. + media_type = ip_media_type. + media_source = c_media_source_xstring. + width = ip_width. + height = ip_height. +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 '.'. + + width = ip_width. + height = ip_height. +ENDMETHOD. + + + + + method SET_POSITION. + upper_cell-cell_column = zcl_excel_common=>convert_column2int( ip_from_col ) - 1. + upper_cell-cell_row = ip_from_row - 1. endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk b/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk index ad3adfb..efa681e 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DRAWINGS.slnk @@ -1,5 +1,5 @@ - + class ZCL_EXCEL_DRAWINGS definition public final @@ -47,30 +47,33 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - method ADD. + + + + METHOD add. + DATA: lv_index TYPE i. drawings->add( ip_drawing ). -endmethod. + lv_index = drawings->if_object_collection~size( ). + ip_drawing->create_media_name( lv_index ). +ENDMETHOD. - + method CLEAR. drawings->clear( ). endmethod. - + method CONSTRUCTOR. CREATE OBJECT drawings. endmethod. - - - + + + method GET. DATA lv_index TYPE i. @@ -78,29 +81,29 @@ endmethod. eo_drawing ?= drawings->if_object_collection~get( lv_index ). endmethod. - - + + method GET_ITERATOR. eo_iterator ?= drawings->if_object_collection~get_iterator( ). 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( ). diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 8ff3f5f..c5fcb9f 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -1,5 +1,5 @@ - + class ZCL_EXCEL_WORKSHEET definition public final @@ -22,6 +22,10 @@ public section. data SHEET_STATE type ZEXCEL_SHEET_STATE . data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . + methods GET_FREEZE_CELL + exporting + !EP_ROW type ZEXCEL_CELL_ROW + !EP_COLUMN type ZEXCEL_CELL_COLUMN . methods ADD_NEW_CONDITIONAL_STYLE returning value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . @@ -113,6 +117,9 @@ public section. !IP_COLUMN_START type ZEXCEL_CELL_COLUMN_ALPHA optional !IP_COLUMN_END type ZEXCEL_CELL_COLUMN_ALPHA optional !IP_ROW type ZEXCEL_CELL_ROW optional . + methods GET_TABLES_SIZE + returning + value(EP_SIZE) type I . methods SET_TABLE importing !IP_TABLE type STANDARD TABLE @@ -121,22 +128,24 @@ public section. !IP_TABLE_TITLE type STRING !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . - methods GET_TABLES_SIZE - returning - value(EP_SIZE) type I . methods GET_TABLES_ITERATOR returning value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods GET_FREEZE_CELL - exporting - !EP_ROW type ZEXCEL_CELL_ROW - !EP_COLUMN type ZEXCEL_CELL_COLUMN . methods FREEZE_PANES importing !IP_NUM_COLUMNS type I optional !IP_NUM_ROWS type I optional raising - ZCX_EXCEL . + ZCX_EXCEL . + methods GET_DRAWINGS + returning + value(R_DRAWINGS) type ref to ZCL_EXCEL_DRAWINGS . + methods GET_DRAWINGS_ITERATOR + returning + value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . + methods ADD_DRAWING + importing + !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . *"* protected components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! protected section. @@ -149,15 +158,16 @@ private section. data DATA_VALIDATIONS type ref to ZCL_EXCEL_DATA_VALIDATIONS . data GUID type OLTPGUID16 . data LOWER_CELL type ZEXCEL_S_CELL_DATA . + data FREEZE_PANE_CELL_COLUMN type ZEXCEL_CELL_COLUMN . + data FREEZE_PANE_CELL_ROW type ZEXCEL_CELL_ROW . data UPPER_CELL type ZEXCEL_S_CELL_DATA . data COLUMN_DIMENSIONS type ZEXCEL_T_WORKSHEET_COLUMNDIME . data ROW_DIMENSIONS type ZEXCEL_T_WORKSHEET_ROWDIMENSIO . data DEFAULT_COLUMN_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . data DEFAULT_ROW_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . - data EXCEL type ref to ZCL_EXCEL . data TABLES type ref to CL_OBJECT_COLLECTION . - data FREEZE_PANE_CELL_COLUMN type ZEXCEL_CELL_COLUMN . - data FREEZE_PANE_CELL_ROW type ZEXCEL_CELL_ROW . + data EXCEL type ref to ZCL_EXCEL . + data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . methods UPDATE_DIMENSION_RANGE . *"* local class implementation for public class @@ -170,52 +180,59 @@ private section. *"* in the implementation part of the class ABAP - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + method ADD_DRAWING. + drawings->add( ip_drawing ). +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 bind_table. + + + + + method BIND_TABLE. DATA: lv_row_int TYPE zexcel_cell_row, @@ -335,11 +352,11 @@ endmethod. " Set field catalog lo_table->fieldcat = lt_field_catalog[]. -ENDMETHOD. +endmethod. - - - + + + method CONSTRUCTOR. me->excel = ip_excel. @@ -360,6 +377,7 @@ ENDMETHOD. CREATE OBJECT conditional_styles. CREATE OBJECT data_validations. CREATE OBJECT tables. + CREATE OBJECT drawings. * initialize active cell coordinates active_cell-cell_row = 1. @@ -372,7 +390,7 @@ ENDMETHOD. upper_cell-cell_column = 1. endmethod. - + method DELETE_MERGE. DELETE sheet_content_merge INDEX 1. @@ -380,8 +398,38 @@ endmethod. 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 GET_ACTIVE_CELL. DATA: lv_active_column TYPE zexcel_cell_column_alpha, @@ -395,11 +443,11 @@ endmethod. endmethod. - - - - - + + + + + method GET_CELL. DATA: lv_column TYPE zexcel_cell_column, @@ -416,9 +464,9 @@ endmethod. ep_value = ls_sheet_content-cell_value. endmethod. - - - + + + method GET_COLUMN_DIMENSION. FIELD-SYMBOLS: <fs_column_dimension> LIKE LINE OF column_dimensions. @@ -438,46 +486,46 @@ 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. r_column_dimension = me->default_column_dimension. endmethod. - - + + method GET_DEFAULT_ROW_DIMENSION. r_row_dimension = me->default_row_dimension. endmethod. - - + + method GET_DIMENSION_RANGE. me->update_dimension_range( ). @@ -489,30 +537,50 @@ endmethod. endmethod. - - + + + method GET_DRAWINGS. + r_drawings = drawings. +endmethod. + + + + method GET_DRAWINGS_ITERATOR. + eo_iterator = drawings->get_iterator( ). +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_MERGE. DATA: lv_column_start TYPE string, @@ -583,9 +651,9 @@ endmethod. endmethod. - - - + + + method GET_ROW_DIMENSION. FIELD-SYMBOLS: <fs_row_dimension> LIKE LINE OF row_dimensions. @@ -605,30 +673,30 @@ endmethod. endmethod. - - + + method GET_ROW_DIMENSIONS. r_row_dimension[] = me->row_dimensions[]. endmethod. - - + + method GET_TABLES_ITERATOR. - eo_iterator = tables->get_iterator( ). + eo_iterator = tables->if_object_collection~get_iterator( ). endmethod. - - + + method GET_TABLES_SIZE. - ep_size = tables->size( ). + ep_size = tables->if_object_collection~size( ). endmethod. - - - - - - + + + + + + method SET_CELL. DATA: lv_column TYPE zexcel_cell_column, @@ -715,11 +783,11 @@ endmethod. endmethod. - - - - - + + + + + method SET_CELL_STYLE. DATA: lv_column TYPE zexcel_cell_column, @@ -747,10 +815,10 @@ endmethod. endmethod. - - - - + + + + method SET_MERGE. DATA: lv_column_start TYPE zexcel_cell_column, @@ -781,13 +849,13 @@ endmethod. endmethod. - - - - - - - + + + + + + + method SET_TABLE. DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, @@ -844,7 +912,7 @@ endmethod. endmethod. - + method UPDATE_DIMENSION_RANGE. DATA: ls_sheet_content TYPE zexcel_s_cell_data, @@ -882,44 +950,6 @@ endmethod. SHIFT lv_row_alpha LEFT DELETING LEADING space. CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. -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 GET_FREEZE_CELL. - ep_row = me->freeze_pane_cell_row. - ep_column = me->freeze_pane_cell_column. endmethod. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 071cd74..1928237 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -1,6 +1,6 @@ - - + + class ZCL_EXCEL_WRITER_2007 definition public final @@ -22,6 +22,8 @@ private section. constants C_DOCPROPS_APP type STRING value 'docProps/app.xml'. "#EC NOTEXT constants C_DOCPROPS_CORE type STRING value 'docProps/core.xml'. "#EC NOTEXT constants C_RELATIONSHIPS type STRING value '_rels/.rels'. "#EC NOTEXT + constants C_XL_DRAWINGS type STRING value 'xl/drawings/drawing#.xml'. "#EC NOTEXT + constants C_XL_DRAWINGS_RELS type STRING value 'xl/drawings/_rels/drawing#.xml.rels'. "#EC NOTEXT constants C_XL_RELATIONSHIPS type STRING value 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT constants C_XL_SHAREDSTRINGS type STRING value 'xl/sharedStrings.xml'. "#EC NOTEXT constants C_XL_SHEET type STRING value 'xl/worksheets/sheet#.xml'. "#EC NOTEXT @@ -48,6 +50,16 @@ private section. methods CREATE_RELATIONSHIPS returning value(EP_CONTENT) type XSTRING . + methods CREATE_XL_DRAWINGS + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + returning + value(EP_CONTENT) type XSTRING . + methods CREATE_XL_DRAWINGS_RELS + importing + !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + returning + value(EP_CONTENT) type XSTRING . methods CREATE_XL_RELATIONSHIPS returning value(EP_CONTENT) type XSTRING . @@ -63,19 +75,20 @@ private section. methods CREATE_XL_SHEET_RELS importing !IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET + !IV_DRAWING_INDEX type I returning value(EP_CONTENT) type XSTRING . methods CREATE_XL_STYLES returning value(EP_CONTENT) type XSTRING . - methods CREATE_XL_THEME - returning - value(EP_CONTENT) type XSTRING . methods CREATE_XL_TABLE importing !IO_TABLE type ref to ZCL_EXCEL_TABLE returning value(EP_CONTENT) type XSTRING . + methods CREATE_XL_THEME + returning + value(EP_CONTENT) type XSTRING . methods CREATE_XL_WORKBOOK returning value(EP_CONTENT) type XSTRING . @@ -97,28 +110,30 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + method ZIF_EXCEL_WRITER~WRITE_FILE. me->excel = io_excel. ep_file = me->create( ). endmethod. - - + + method CREATE. @@ -129,14 +144,19 @@ endmethod. 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_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_syindex TYPE string, - lv_value TYPE string. + 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. ********************************************************************** @@ -199,9 +219,10 @@ endmethod. content = lv_content ). ********************************************************************** -* STEP 10: Add sheet#.xml to zip +* 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( ). @@ -222,7 +243,8 @@ endmethod. content = lv_content ). lv_xl_sheet_rels = me->c_xl_sheet_rels. - lv_content = me->create_xl_sheet_rels( lo_worksheet ). + 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 ). @@ -234,20 +256,55 @@ endmethod. lv_content = me->create_xl_table( lo_table ). lv_value = lo_table->get_name( ). - CONCATENATE 'xl/tables/' lv_value '.xml' into lv_value. + 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: Create the final zip +* STEP 11: Add media + lo_iterator = me->excel->get_drawings_iterator( ). + + 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: Create the final zip ep_excel = lo_zip->save( ). endmethod. - - + + method CREATE_CONTENT_TYPES. @@ -282,7 +339,8 @@ endmethod. 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_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'. DATA: lo_ixml TYPE REF TO if_ixml, lo_document TYPE REF TO if_ixml_document, @@ -301,7 +359,9 @@ endmethod. lv_worksheets_numc TYPE numc3, lv_xml_node_worksheet_pn TYPE string, lv_xml_size TYPE i, - lv_value TYPE string. + 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 @@ -401,8 +461,8 @@ endmethod. lo_nested_iterator = lo_worksheet->get_tables_iterator( ). - WHILE lo_nested_iterator->has_next( ) EQ abap_true. - lo_table ?= lo_nested_iterator->get_next( ). + 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. @@ -415,8 +475,61 @@ endmethod. 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( ). + 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. + " Strings node lo_element = lo_document->create_simple_element( name = lc_xml_node_override parent = lo_document ). @@ -444,8 +557,8 @@ endmethod. endmethod. - - + + method CREATE_DOCPROPS_APP. @@ -665,8 +778,8 @@ endmethod. endmethod. - - + + method CREATE_DOCPROPS_CORE. @@ -781,8 +894,8 @@ endmethod. endmethod. - - + + method CREATE_RELATIONSHIPS. @@ -880,8 +993,318 @@ endmethod. 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', + lc_xml_node_onecellanchor TYPE string VALUE 'xdr:oneCellAnchor', + 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_blipfill TYPE string VALUE 'xdr:blipFill', + lc_xml_node_ablip TYPE string VALUE 'a:blip', + 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_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_element3 TYPE REF TO if_ixml_element, + lo_element_onecellanchor TYPE REF TO if_ixml_element, + lo_element_from 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, + 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_drawing TYPE REF TO zcl_excel_drawing, + + lv_col TYPE string, " zexcel_cell_column, + lv_row TYPE string, " zexcel_cell_row. + lv_counter TYPE i VALUE 0, + 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 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 + + lo_iterator = io_worksheet->get_drawings_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ). + + lo_element_onecellanchor = lo_document->create_simple_element( name = lc_xml_node_onecellanchor + parent = lo_document ). + +* from cell ****************************** + lo_element_from = lo_document->create_simple_element( name = lc_xml_node_from + parent = lo_document ). + + lv_col = lo_drawing->get_from_col( ). + lv_row = lo_drawing->get_from_row( ). + CONDENSE lv_col NO-GAPS. + CONDENSE lv_row NO-GAPS. + + lo_element = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lo_element->set_value( value = lv_col ). + lo_element_from->append_child( new_child = lo_element ). + + lo_element = lo_document->create_simple_element( name = lc_xml_node_coloff + parent = lo_document ). + lo_element->set_value( value = `0` ). + lo_element_from->append_child( new_child = lo_element ). + + lo_element = lo_document->create_simple_element( name = lc_xml_node_row + parent = lo_document ). + lo_element->set_value( value = lv_row ). + lo_element_from->append_child( new_child = lo_element ). + + lo_element = lo_document->create_simple_element( name = lc_xml_node_rowoff + parent = lo_document ). + lo_element->set_value( value = `0` ). + lo_element_from->append_child( new_child = lo_element ). + +* ext ****************************** + lo_element_ext = lo_document->create_simple_element( name = lc_xml_node_ext + parent = lo_document ). + + lv_value = lo_drawing->get_width_emu_str( ). + lo_element_ext->set_attribute_ns( name = 'cx' + value = lv_value ). + lv_value = lo_drawing->get_height_emu_str( ). + lo_element_ext->set_attribute_ns( name = 'cy' + value = lv_value ). + + +* pic ********************************** + lo_element_pic = lo_document->create_simple_element( name = lc_xml_node_pic + parent = lo_document ). +* nvPicPr + lo_element = lo_document->create_simple_element( name = lc_xml_node_nvpicpr + parent = lo_document ). +* cNvPr + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_cnvpr + parent = lo_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 = 'Image 1' ). + lo_element->append_child( new_child = lo_element2 ). + +* cNvPicPr + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_cnvpicpr + parent = lo_document ). + +* picLocks + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_piclocks + parent = lo_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 + 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_blipfill + parent = lo_document ). + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_ablip + parent = lo_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_element_pic->append_child( new_child = lo_element ). + +* spPr + lo_element = lo_document->create_simple_element( name = lc_xml_node_sppr + parent = lo_document ). + + lo_element2 = lo_document->create_simple_element( name = lc_xml_node_apgeom + parent = lo_document ). + lo_element2->set_attribute_ns( name = 'prst' + value = 'rect' ). + lo_element3 = lo_document->create_simple_element( name = lc_xml_node_aavlst + parent = lo_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 ). + +* client data *************************** + lo_element_clientdata = lo_document->create_simple_element( name = lc_xml_node_clientdata + parent = lo_document ). + + + + + lo_element_onecellanchor->append_child( new_child = lo_element_from ). + lo_element_onecellanchor->append_child( new_child = lo_element_ext ). + lo_element_onecellanchor->append_child( new_child = lo_element_pic ). + lo_element_onecellanchor->append_child( new_child = lo_element_clientdata ). + lo_element_root->append_child( new_child = lo_element_onecellanchor ). + + 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'. + + 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_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_iterator = io_worksheet->get_drawings_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 ). + lo_element->set_attribute_ns( name = lc_xml_attr_type + value = lc_xml_node_rid_image_tp ). + + lv_value = lo_drawing->get_media_name( ). + CONCATENATE '../media/' lv_value 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. + +********************************************************************** +* 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_RELATIONSHIPS. @@ -1028,8 +1451,8 @@ endmethod. endmethod. - - + + method CREATE_XL_SHAREDSTRINGS. @@ -1145,10 +1568,10 @@ endmethod. endmethod. - - - - + + + + method CREATE_XL_SHEET. ********************************************************************** * abap2xlsx @@ -1207,6 +1630,7 @@ endmethod. lc_xml_node_formula1 TYPE string VALUE 'formula1', lc_xml_node_mergecell TYPE string VALUE 'mergeCell', lc_xml_node_mergecells TYPE string VALUE 'mergeCells', + lc_xml_node_drawing TYPE string VALUE 'drawing', " Node attributes lc_xml_attr_ref TYPE string VALUE 'ref', lc_xml_attr_summarybelow TYPE string VALUE 'summaryBelow', @@ -1415,9 +1839,8 @@ endmethod. lo_element_3->set_attribute_ns( name = 'state' value = 'frozen' ). - lo_element_2->append_child( lo_element_3 ). + 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 ). @@ -1638,8 +2061,8 @@ endmethod. lo_element_3->append_child( new_child = lo_element_4 ). " fomula node ELSE. IF <ls_sheet_content>-data_type IS NOT INITIAL. - lo_element_3->set_attribute_ns( name = lc_xml_attr_t - value = <ls_sheet_content>-data_type ). + lo_element_3->set_attribute_ns( name = lc_xml_attr_t + value = <ls_sheet_content>-data_type ). ENDIF. " value node @@ -1649,10 +2072,10 @@ endmethod. IF <ls_sheet_content>-data_type EQ 's'. lv_value = me->get_shared_string_index( <ls_sheet_content>-cell_value ). lo_element_4->set_value( value = lv_value ). - ELSE. - lv_value = <ls_sheet_content>-cell_value. - lo_element_4->set_value( value = lv_value ). - ENDIF. + ELSE. + lv_value = <ls_sheet_content>-cell_value. + lo_element_4->set_value( value = lv_value ). + ENDIF. lo_element_3->append_child( new_child = lo_element_4 ). " value node ENDIF. @@ -1878,10 +2301,10 @@ endmethod. 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_table_count. + ADD 1 TO lv_table_count. lv_value = lv_table_count. - condense lv_value. + CONDENSE lv_value. CONCATENATE 'rId' lv_value INTO lv_value. lo_element_2 = lo_document->create_simple_element( name = 'tablePart' parent = lo_element ). @@ -1895,6 +2318,18 @@ endmethod. ENDIF. +* drawing + DATA: lo_drawings TYPE REF TO zcl_excel_drawings. + + lo_drawings = io_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + lo_element = lo_document->create_simple_element( name = lc_xml_node_drawing + parent = lo_document ). + lo_element->set_attribute( name = 'r:id' + value = 'rId1' ). + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + ********************************************************************** * STEP 5: Create xstring stream lo_streamfactory = lo_ixml->create_stream_factory( ). @@ -1904,9 +2339,10 @@ endmethod. endmethod. - - - + + + + method CREATE_XL_SHEET_RELS. @@ -1919,7 +2355,8 @@ endmethod. 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_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'. + lc_xml_node_rid_table_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table', + lc_xml_node_rid_drawing_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing'. DATA: lo_ixml TYPE REF TO if_ixml, lo_document TYPE REF TO if_ixml_document, @@ -1933,7 +2370,8 @@ endmethod. lo_table TYPE REF TO zcl_excel_table. DATA: lv_value TYPE string, - lv_counter TYPE i. + lv_counter TYPE i, + lv_index_str TYPE string. ********************************************************************** * STEP 1: Create [Content_Types].xml into the root of the ZIP @@ -1982,6 +2420,28 @@ endmethod. 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 ). + lo_element->set_attribute_ns( name = lc_xml_attr_id + value = 'rId1' ). + 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. + ********************************************************************** * STEP 5: Create xstring stream lo_streamfactory = lo_ixml->create_stream_factory( ). @@ -1991,8 +2451,8 @@ endmethod. endmethod. - - + + method CREATE_XL_STYLES. @@ -2721,9 +3181,9 @@ endmethod. endmethod. - - - + + + method CREATE_XL_TABLE. DATA: lc_xml_node_table TYPE string VALUE 'table', @@ -2892,8 +3352,8 @@ endmethod. endmethod. - - + + method CREATE_XL_THEME. @@ -2981,8 +3441,8 @@ endmethod. endmethod. - - + + method CREATE_XL_WORKBOOK. @@ -3159,9 +3619,9 @@ endmethod. endmethod. - - - + + + method FLAG2BOOL. @@ -3172,9 +3632,9 @@ endmethod. ENDIF. endmethod. - - - + + + method GET_SHARED_STRING_INDEX. diff --git a/ZA2X/PROG/ZDEMO_EXCEL10.slnk b/ZA2X/PROG/ZDEMO_EXCEL10.slnk index 2967939..2a38a00 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL10.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL10.slnk @@ -1,5 +1,5 @@ - + @@ -77,7 +77,7 @@ lo_worksheet->bind_table( ip_table = lt_test it_field_catalog = lt_field_catalog ). column_dimension = lo_worksheet->get_column_dimension( 'D' ). "make date field a bit wider -column_dimension->set_width( 13 ). +column_dimension->set_width( ip_width = 13 ). create object lo_excel_writer type zcl_excel_writer_2007. lv_file = lo_excel_writer->write_file( lo_excel ). diff --git a/ZA2X/PROG/ZDEMO_EXCEL11.slnk b/ZA2X/PROG/ZDEMO_EXCEL11.slnk index 4f262fa..38d50b2 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL11.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL11.slnk @@ -1,5 +1,5 @@ - + @@ -401,39 +401,39 @@ START-OF-SELECTION. " Set Column width column_dimension = lo_worksheet->get_column_dimension( 'A' ). - column_dimension->set_width( 11 ). + column_dimension->set_width( ip_width = 11 ). column_dimension = lo_worksheet->get_column_dimension( 'B' ). - column_dimension->set_width( 11 ). + column_dimension->set_width( ip_width = 11 ). column_dimension = lo_worksheet->get_column_dimension( 'C' ). - column_dimension->set_width( 35 ). + column_dimension->set_width( ip_width = 35 ). column_dimension = lo_worksheet->get_column_dimension( 'E' ). - column_dimension->set_width( 18 ). + column_dimension->set_width( ip_width = 18 ). column_dimension = lo_worksheet->get_column_dimension( 'F' ). - column_dimension->set_width( 5 ). + column_dimension->set_width( ip_width = 5 ). column_dimension = lo_worksheet->get_column_dimension( 'G' ). - column_dimension->set_width( 6 ). + column_dimension->set_width( ip_width = 6 ). column_dimension = lo_worksheet->get_column_dimension( 'H' ). - column_dimension->set_width( 12 ). + column_dimension->set_width( ip_width = 12 ). column_dimension = lo_worksheet->get_column_dimension( 'I' ). - column_dimension->set_width( 3 ). + column_dimension->set_width( ip_width = 3 ). column_dimension = lo_worksheet->get_column_dimension( 'J' ). - column_dimension->set_width( 13 ). + column_dimension->set_width( ip_width = 13 ). column_dimension = lo_worksheet->get_column_dimension( 'K' ). - column_dimension->set_width( 13 ). + column_dimension->set_width( ip_width = 13 ). column_dimension = lo_worksheet->get_column_dimension( 'L' ). - column_dimension->set_width( 13 ). + column_dimension->set_width( ip_width = 13 ). column_dimension = lo_worksheet->get_column_dimension( 'M' ). - column_dimension->set_width( 13 ). + column_dimension->set_width( ip_width = 13 ). column_dimension = lo_worksheet->get_column_dimension( 'N' ). - column_dimension->set_width( 12 ). + column_dimension->set_width( ip_width = 12 ). column_dimension = lo_worksheet->get_column_dimension( 'O' ). - column_dimension->set_width( 9 ). + column_dimension->set_width( ip_width = 9 ). column_dimension = lo_worksheet->get_column_dimension( 'P' ). - column_dimension->set_width( 12 ). + column_dimension->set_width( ip_width = 12 ). column_dimension = lo_worksheet->get_column_dimension( 'Q' ). - column_dimension->set_width( 9 ). + column_dimension->set_width( ip_width = 9 ). column_dimension = lo_worksheet->get_column_dimension( 'R' ). - column_dimension->set_width( 40 ). + column_dimension->set_width( ip_width = 40 ). CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. lv_file = lo_excel_writer->write_file( lo_excel ). diff --git a/ZA2X/PROG/ZDEMO_EXCEL12.slnk b/ZA2X/PROG/ZDEMO_EXCEL12.slnk index 10803ee..c96e139 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL12.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL12.slnk @@ -1,5 +1,5 @@ - + @@ -47,11 +47,11 @@ lo_worksheet->set_cell( ip_column = 'B' ip_row = 8 ip_value = &apos " Column Settings column_dimension = lo_worksheet->get_column_dimension( 'B' ). -column_dimension->set_auto_size( abap_true ). +column_dimension->set_auto_size( ip_auto_size = abap_true ). column_dimension = lo_worksheet->get_column_dimension( 'C' ). -column_dimension->set_width( 50 ). +column_dimension->set_width( ip_width = 50 ). column_dimension = lo_worksheet->get_column_dimension( 'D' ). -column_dimension->set_visible( abap_false ). +column_dimension->set_visible( ip_visible = abap_false ). " Implementation in the Writer is not working yet ===== TODO ===== column_dimension = lo_worksheet->get_column_dimension( 'F' ). column_dimension->set_outline_level( 0 ). diff --git a/ZA2X/PROG/ZDEMO_EXCEL16.slnk b/ZA2X/PROG/ZDEMO_EXCEL16.slnk new file mode 100644 index 0000000..168eb11 --- /dev/null +++ b/ZA2X/PROG/ZDEMO_EXCEL16.slnk @@ -0,0 +1,133 @@ + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZIFE_TEST_EXCEL +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel16. + +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_drawing TYPE REF TO zcl_excel_drawing, + column_dimension TYPE REF TO zcl_excel_worksheet_columndime. + +DATA: lv_file TYPE xstring, + lv_bytecount TYPE i, + lt_file_tab TYPE STANDARD TABLE OF solisti1. + +" 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. + +" Get active sheet +lo_worksheet = lo_excel->get_active_worksheet( ). +lo_worksheet->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 = 'bmp' + ip_width = 83 + ip_height = 160 ). + +lo_worksheet->add_drawing( lo_drawing ). + + +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. + +" Save the file +CALL FUNCTION 'GUI_DOWNLOAD' + EXPORTING + bin_filesize = lv_bytecount + filename = 'C:\Drawings.xlsx' + filetype = 'BIN' + TABLES + data_tab = lt_file_tab. +