diff --git a/src/demos/zdemo_excel_fill_template.prog.abap b/src/demos/zdemo_excel_fill_template.prog.abap new file mode 100644 index 0000000..fc7ec89 --- /dev/null +++ b/src/demos/zdemo_excel_fill_template.prog.abap @@ -0,0 +1,353 @@ +*&---------------------------------------------------------------------* +*& Report Fill Template +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zdemo_excel_fill_template. + +*================= +* Start of generated code. +* All these types were generated +* by ZEXCEL_TEMPLATE_GET_TYPES based +* on the Excel file ZDEMO_EXCEL_TEMPLATE +* from SMW0. +*================= +TYPES t_number TYPE p length 16 decimals 4. +TYPES: + begin of t_TABLE1, + PERSON type string, + SALARY type t_number, + end of t_TABLE1, + + tt_TABLE1 type standard table of t_TABLE1 with default key, + + begin of t_LINE1, + CARRID type string, + CONNID type string, + FLDATE type d, + PRICE type t_number, + end of t_LINE1, + + tt_LINE1 type standard table of t_LINE1 with default key, + + begin of t_TABLE2, + CARRID type string, + PRICE type t_number, + LINE1 type tt_LINE1, + end of t_TABLE2, + + tt_TABLE2 type standard table of t_TABLE2 with default key, + + begin of t_Sheet1, + DATE type d, + TIME type t, + USER type string, + TOTAL type t_number, + PRICE type t_number, + TABLE1 type tt_TABLE1, + TABLE2 type tt_TABLE2, + end of t_Sheet1, + + + begin of t_TABLE3, + PERSON type string, + SALARY type t_number, + end of t_TABLE3, + + tt_TABLE3 type standard table of t_TABLE3 with default key, + + begin of t_Sheet2, + DATE type d, + TIME type t, + USER type string, + TOTAL type t_number, + TABLE3 type tt_TABLE3, + end of t_Sheet2. + + +DATA: lo_data type ref to ZCL_EXCEL_TEMPLATE_DATA. +*================= +* End of generated code +*================= + +* define variables +DATA: gs_sheet1 TYPE t_sheet1, + gs_sheet2 TYPE t_sheet2. + +TABLES: sscrfields. + +CONSTANTS: gc_save_file_name TYPE string VALUE 'fill_template.xlsx'. +INCLUDE zdemo_excel_outputopt_incl. + +PARAMETERS: p_smw0 RADIOBUTTON GROUP rad1 DEFAULT 'X'. +PARAMETERS: p_objid TYPE w3objid OBLIGATORY DEFAULT 'ZDEMO_EXCEL_TEMPLATE'. + +PARAMETERS: p_file RADIOBUTTON GROUP rad1. +PARAMETERS: p_fpath TYPE string OBLIGATORY LOWER CASE DEFAULT 'c:\temp\whatever.xlsx'. + +SELECTION-SCREEN SKIP 1. + +SELECTION-SCREEN PUSHBUTTON /1(45) but_txt USER-COMMAND get_types. + + +INITIALIZATION. + but_txt = '@BY@ Analyze file to propose TYPES'. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fpath. + PERFORM get_file_path CHANGING p_fpath. + +AT SELECTION-SCREEN. + CASE sscrfields-ucomm. + WHEN 'GET_TYPES'. + SUBMIT zexcel_template_get_types + WITH p_smw0 = p_smw0 + WITH p_objid = p_objid + WITH p_file = p_file + WITH p_fpath = p_fpath + AND RETURN. + ENDCASE. + +START-OF-SELECTION. + PERFORM load_data. + PERFORM generate_file. + +FORM load_data. + + FIELD-SYMBOLS: TYPE t_table1, + TYPE t_line1, + TYPE t_table2. + + gs_sheet1-date = sy-datum. + gs_sheet1-time = sy-uzeit. + gs_sheet1-user = sy-uname. + gs_sheet1-total = 5600. + + APPEND INITIAL LINE TO gs_sheet1-table1 ASSIGNING . + -person = 'Lurch Schpellchek'. + -salary = 1200. + + APPEND INITIAL LINE TO gs_sheet1-table1 ASSIGNING . + -person = 'Russell Sprout'. + -salary = 1300. + + APPEND INITIAL LINE TO gs_sheet1-table1 ASSIGNING . + -person = 'Fergus Douchebag'. + -salary = 3000. + + APPEND INITIAL LINE TO gs_sheet1-table1 ASSIGNING . + -person = 'Bartholomew Shoe'. + -salary = 100. + + + gs_sheet1-price = 14003. + + APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING . + -carrid = 'AC'. + -price = 1222. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'AC'. + -connid = '0820'. + -fldate = '20021220'. + -price = 1222. + + + APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING . + -carrid = 'AF'. + -price = 2222. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'AF'. + -connid = '0820'. + -fldate = '20021223'. + -price = 2222. + + + APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING . + -carrid = 'LH'. + -price = 9488. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'LH'. + -connid = '0400'. + -fldate = '19950228'. + -price = 899. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'LH'. + -connid = '0400'. + -fldate = '19951117'. + -price = 1499. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'LH'. + -connid = '0400'. + -fldate = '19950606'. + -price = 1090. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'LH'. + -connid = '0400'. + -fldate = '19950428'. + -price = 6000. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'LH'. + -connid = '0400'. + -fldate = '20021221'. + -price = 222. + + APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING . + -carrid = 'SQ'. + -price = 849. + + APPEND INITIAL LINE TO -line1 ASSIGNING . + -carrid = 'SQ'. + -connid = '0026'. + -fldate = '19950228'. + -price = 849. + + + MOVE-CORRESPONDING gs_sheet1 TO gs_sheet2. + gs_sheet2-table3 = gs_sheet1-table1. + +ENDFORM. + +FORM generate_file. + + DATA: lo_excel TYPE REF TO zcl_excel, + lo_reader TYPE REF TO zif_excel_reader, + lo_root TYPE REF TO cx_root. + + TRY. + +* prepare data + CREATE OBJECT lo_data. + lo_data->add( iv_sheet = 'Sheet1' iv_data = gs_sheet1 ). + lo_data->add( iv_sheet = 'Sheet2' iv_data = gs_sheet2 ). + +* create reader + CREATE OBJECT lo_reader TYPE zcl_excel_reader_2007. + +* load template + IF p_file IS NOT INITIAL. + lo_excel = lo_reader->load_file( p_fpath ). + ELSE. + PERFORM load_smw0 USING lo_reader p_objid CHANGING lo_excel. + ENDIF. + +* merge data with template + lo_excel->fill_template( lo_data ). + + +*** Create output + lcl_output=>output( lo_excel ). + + CATCH cx_root INTO lo_root. + MESSAGE lo_root TYPE 'I' DISPLAY LIKE 'E'. + ENDTRY. + +ENDFORM. + +*&---------------------------------------------------------------------* +*& Form Get_file_path +*&---------------------------------------------------------------------* +FORM get_file_path CHANGING cv_path TYPE string. + + DATA: + lv_rc TYPE i, + lv_user_action TYPE i, + lt_file_table TYPE filetable, + ls_file_table LIKE LINE OF lt_file_table. + + CLEAR cv_path. + + cl_gui_frontend_services=>file_open_dialog( + EXPORTING + window_title = 'select template xlsx' + multiselection = '' + default_extension = '*.xlsx' + file_filter = 'Text file (*.xlsx)|*.xlsx|All (*.*)|*.*' + CHANGING + file_table = lt_file_table + rc = lv_rc + user_action = lv_user_action + EXCEPTIONS + OTHERS = 1 + ). + IF sy-subrc = 0. + IF lv_user_action = cl_gui_frontend_services=>action_ok. + IF lt_file_table IS NOT INITIAL. + READ TABLE lt_file_table INTO ls_file_table INDEX 1. + IF sy-subrc = 0. + cv_path = ls_file_table-filename. + ENDIF. + ENDIF. + ENDIF. + ENDIF. +ENDFORM. " Get_file_path + +FORM load_smw0 + USING + io_reader TYPE REF TO zif_excel_reader + iv_w3objid TYPE w3objid + CHANGING + ro_excel TYPE REF TO zcl_excel + RAISING + zcx_excel. + + DATA: lv_excel_data TYPE xstring, + lt_mime TYPE TABLE OF w3mime, + ls_key TYPE wwwdatatab, + lv_errormessage TYPE string, + lv_filesize TYPE i, + lv_filesizec TYPE c LENGTH 10. + +*--------------------------------------------------------------------* +* Read file into binary string +*--------------------------------------------------------------------* + + ls_key-relid = 'MI'. + ls_key-objid = iv_w3objid . + + CALL FUNCTION 'WWWDATA_IMPORT' + EXPORTING + key = ls_key + TABLES + mime = lt_mime + EXCEPTIONS + OTHERS = 1. + IF sy-subrc <> 0. + lv_errormessage = 'A problem occured when reading the MIME object'(004). + zcx_excel=>raise_text( lv_errormessage ). + ENDIF. + + CALL FUNCTION 'WWWPARAMS_READ' + EXPORTING + relid = ls_key-relid + objid = ls_key-objid + name = 'filesize' + IMPORTING + value = lv_filesizec. + + lv_filesize = lv_filesizec. + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filesize + IMPORTING + buffer = lv_excel_data + TABLES + binary_tab = lt_mime + EXCEPTIONS + failed = 1 + OTHERS = 2. + +*--------------------------------------------------------------------* +* Parse Excel data into ZCL_EXCEL object from binary string +*--------------------------------------------------------------------* + ro_excel = io_reader->load( i_excel2007 = lv_excel_data ). + +ENDFORM. diff --git a/src/demos/zdemo_excel_fill_template.prog.xml b/src/demos/zdemo_excel_fill_template.prog.xml new file mode 100644 index 0000000..e75f886 --- /dev/null +++ b/src/demos/zdemo_excel_fill_template.prog.xml @@ -0,0 +1,58 @@ + + + + + + ZDEMO_EXCEL_FILL_TEMPLATE + 1 + T + E + X + X + + + + R + abap2xlsx Demo: Fill template + 29 + + + S + P_FILE + Load template from file + 31 + + + S + P_FPATH + Path to template.xlsx + 29 + + + S + P_OBJID + Object ID + 17 + + + S + P_PATH + . + 9 + D + + + S + P_SMW0 + Load template from SMW0 + 31 + + + S + RB_BACK + 17 + + + + + diff --git a/src/demos/zdemo_excel_template.w3mi.data.xlsx b/src/demos/zdemo_excel_template.w3mi.data.xlsx new file mode 100644 index 0000000..d4e57b4 Binary files /dev/null and b/src/demos/zdemo_excel_template.w3mi.data.xlsx differ diff --git a/src/demos/zdemo_excel_template.w3mi.xml b/src/demos/zdemo_excel_template.w3mi.xml new file mode 100644 index 0000000..cf00104 --- /dev/null +++ b/src/demos/zdemo_excel_template.w3mi.xml @@ -0,0 +1,29 @@ + + + + + ZDEMO_EXCEL_TEMPLATE + ZDEMO_EXCEL_TEMPLATE + + + MI + ZDEMO_EXCEL_TEMPLATE + fileextension + .xlsx + + + MI + ZDEMO_EXCEL_TEMPLATE + filename + ZABAP2XLSX_EXAMPLE.xlsx + + + MI + ZDEMO_EXCEL_TEMPLATE + mimetype + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + + + + + diff --git a/src/not_cloud/zexcel_template_get_types.prog.abap b/src/not_cloud/zexcel_template_get_types.prog.abap new file mode 100644 index 0000000..865bf39 --- /dev/null +++ b/src/not_cloud/zexcel_template_get_types.prog.abap @@ -0,0 +1,381 @@ +*&---------------------------------------------------------------------* +*& Report ZEXCEL_TEMPLATE_GET_TYPES +*& +*&---------------------------------------------------------------------* +*& +*& +*&---------------------------------------------------------------------* + +REPORT zexcel_template_get_types. + +TYPES : tt_text TYPE TABLE OF text80. + +DATA: go_excel TYPE REF TO zcl_excel, + go_reader TYPE REF TO zif_excel_reader, + go_template_filler TYPE REF TO zcl_excel_fill_template, + go_error TYPE REF TO zcx_excel. + +SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME. + +PARAMETERS: p_smw0 RADIOBUTTON GROUP rad2 DEFAULT 'X'. +PARAMETERS: p_objid TYPE w3objid OBLIGATORY DEFAULT 'ZDEMO_EXCEL_TEMPLATE'. + +PARAMETERS: p_file RADIOBUTTON GROUP rad2. +PARAMETERS: p_fpath TYPE string OBLIGATORY LOWER CASE DEFAULT 'c:\temp\whatever.xlsx'. + +SELECTION-SCREEN END OF BLOCK b02. + +SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME. + +PARAMETERS: p_normal RADIOBUTTON GROUP rad1 DEFAULT 'X', + p_other RADIOBUTTON GROUP rad1. + +SELECTION-SCREEN END OF BLOCK b01. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fpath. + PERFORM get_file_path CHANGING p_fpath. + + +START-OF-SELECTION. + + TRY. + + CREATE OBJECT go_reader TYPE zcl_excel_reader_2007. + +* load template + IF p_file IS NOT INITIAL. + go_excel = go_reader->load_file( p_fpath ). + ELSE. + PERFORM load_smw0 USING go_reader p_objid CHANGING go_excel. + ENDIF. + + go_template_filler = zcl_excel_fill_template=>create( go_excel ). + + PERFORM get_types. + + CATCH zcx_excel INTO go_error. + MESSAGE go_error TYPE 'I' DISPLAY LIKE 'E'. + ENDTRY. + + +*&---------------------------------------------------------------------* +*& Form Get_file_path +*&---------------------------------------------------------------------* +FORM get_file_path CHANGING cv_path TYPE string. + + DATA: + lv_rc TYPE i, + lv_user_action TYPE i, + lt_file_table TYPE filetable, + ls_file_table LIKE LINE OF lt_file_table. + + CLEAR cv_path. + + cl_gui_frontend_services=>file_open_dialog( + EXPORTING + window_title = 'select template xlsx' + multiselection = '' + default_extension = '*.xlsx' + file_filter = 'Text file (*.xlsx)|*.xlsx|All (*.*)|*.*' + CHANGING + file_table = lt_file_table + rc = lv_rc + user_action = lv_user_action + EXCEPTIONS + OTHERS = 1 ). + IF sy-subrc = 0. + IF lv_user_action = cl_gui_frontend_services=>action_ok. + IF lt_file_table IS NOT INITIAL. + READ TABLE lt_file_table INTO ls_file_table INDEX 1. + IF sy-subrc = 0. + cv_path = ls_file_table-filename. + ENDIF. + ENDIF. + ENDIF. + ENDIF. +ENDFORM. " Get_file_path + +FORM get_types . + + DATA: lv_sum TYPE i, + lt_res TYPE tt_text, + lt_buf TYPE tt_text, + lv_lines TYPE i. + + FIELD-SYMBOLS: LIKE LINE OF go_template_filler->mt_sheet, + TYPE text80. + + + LOOP AT go_template_filler->mt_sheet ASSIGNING . + + CLEAR lv_sum. + + READ TABLE go_template_filler->mt_range TRANSPORTING NO FIELDS WITH KEY sheet = . + + ADD sy-subrc TO lv_sum. + + READ TABLE go_template_filler->mt_var TRANSPORTING NO FIELDS WITH KEY sheet = . + + ADD sy-subrc TO lv_sum. + + CHECK lv_sum <= 4. + + PERFORM get_type_r USING 0 CHANGING lt_buf. + + APPEND LINES OF lt_buf TO lt_res. + + ENDLOOP. + + + IF p_normal IS INITIAL. + READ TABLE lt_res ASSIGNING INDEX 1. + TRANSLATE USING ',:'. + INSERT INITIAL LINE INTO lt_res ASSIGNING INDEX 1. + = 'TYPES'. + APPEND INITIAL LINE TO lt_res ASSIGNING . + = '.'. + + lv_lines = lines( lt_res ) - 2. + DELETE lt_res INDEX lv_lines. + DELETE lt_res INDEX lv_lines. + + ELSE. + INSERT INITIAL LINE INTO lt_res ASSIGNING INDEX 1. + = 'TYPES:'. + + lv_lines = lines( lt_res ) - 2. + + READ TABLE lt_res ASSIGNING INDEX lv_lines. + TRANSLATE USING ',.'. + ADD 1 TO lv_lines. + + ENDIF. + + INSERT 'TYPES t_number TYPE p length 16 decimals 4.' INTO lt_res INDEX 1. + + IF p_normal IS INITIAL. + APPEND INITIAL LINE TO lt_res ASSIGNING . + = 'DATA'. + APPEND INITIAL LINE TO lt_res ASSIGNING . + = ': lo_data type ref to ZCL_EXCEL_TEMPLATE_DATA'. + APPEND INITIAL LINE TO lt_res ASSIGNING . + = '.'. + + ELSE. + APPEND INITIAL LINE TO lt_res ASSIGNING . + = 'DATA: lo_data type ref to ZCL_EXCEL_TEMPLATE_DATA.'. + ENDIF. + + cl_demo_output=>new( 'TEXT' )->display( lt_res ). +ENDFORM. + + +FORM get_type_r USING iv_sheet TYPE zexcel_sheet_title + iv_parent TYPE i + CHANGING ct_result TYPE tt_text. + + DATA: lt_buf TYPE tt_text, + lt_tmp TYPE tt_text, + lv_sum TYPE i, + lv_name TYPE string, + lv_type TYPE string, + lv_string TYPE string, + lt_sorted_counters TYPE TABLE OF i, + lv_biggest_counter TYPE i. + + FIELD-SYMBOLS: TYPE text80, + LIKE LINE OF go_template_filler->mt_range, + TYPE zcl_excel_fill_template=>ts_variable, + TYPE zcl_excel_fill_template=>ts_name_style. + + + CLEAR ct_result. + + LOOP AT go_template_filler->mt_range ASSIGNING WHERE sheet = iv_sheet + AND parent = iv_parent. + + PERFORM get_type_r + USING + iv_sheet + -id + CHANGING + lt_tmp. + + APPEND LINES OF lt_tmp TO lt_buf. + + + ENDLOOP. + + ADD sy-subrc TO lv_sum. + + IF iv_parent = 0. + lv_name = iv_sheet. + ELSE. + READ TABLE go_template_filler->mt_range ASSIGNING + WITH KEY sheet = iv_sheet + id = iv_parent. + lv_name = -name. + ENDIF. + + APPEND INITIAL LINE TO lt_buf ASSIGNING . + IF p_normal IS INITIAL. + CONCATENATE ', begin of t_' lv_name INTO . + ELSE. + CONCATENATE ' begin of t_' lv_name ',' INTO . + ENDIF. + + + LOOP AT go_template_filler->mt_var ASSIGNING WHERE sheet = iv_sheet + AND parent = iv_parent. + + READ TABLE go_template_filler->mt_name_styles + WITH KEY sheet = iv_sheet + name = -name + parent = iv_parent + ASSIGNING . + IF sy-subrc <> 0. + lv_type = 'string'. + ELSE. + CLEAR lt_sorted_counters. + APPEND -numeric_counter TO lt_sorted_counters. + APPEND -date_counter TO lt_sorted_counters. + APPEND -time_counter TO lt_sorted_counters. + APPEND -text_counter TO lt_sorted_counters. + SORT lt_sorted_counters BY table_line DESCENDING. + READ TABLE lt_sorted_counters INDEX 1 INTO lv_biggest_counter. + ASSERT sy-subrc = 0. + CASE lv_biggest_counter. + WHEN -numeric_counter. + lv_type = 't_number'. + WHEN -date_counter. + lv_type = 'd'. + WHEN -time_counter. + lv_type = 't'. + WHEN -text_counter. + lv_type = 'string'. + ENDCASE. + ENDIF. + + APPEND INITIAL LINE TO lt_buf ASSIGNING . + IF p_normal IS INITIAL. + CONCATENATE ', ' -name ' type ' lv_type INTO RESPECTING BLANKS. + ELSE. + CONCATENATE ' ' -name ' type ' lv_type ',' INTO RESPECTING BLANKS. + ENDIF. + + + ENDLOOP. + + ADD sy-subrc TO lv_sum. + + LOOP AT go_template_filler->mt_range ASSIGNING WHERE sheet = iv_sheet + AND parent = iv_parent. + + APPEND INITIAL LINE TO lt_buf ASSIGNING . + lv_string = -name. + IF p_normal IS INITIAL. + CONCATENATE ', ' -name ' type tt_' lv_string INTO RESPECTING BLANKS . + ELSE. + CONCATENATE ' ' -name ' type tt_' lv_string ',' INTO RESPECTING BLANKS . + ENDIF. + + + ENDLOOP. + + IF lv_sum > 4. + APPEND INITIAL LINE TO lt_buf ASSIGNING . + IF p_normal IS INITIAL. + = ', xz type i'. + ELSE. + = ' xz type i,'. + ENDIF. + + ENDIF. + + + APPEND INITIAL LINE TO lt_buf ASSIGNING . + IF p_normal IS INITIAL. + CONCATENATE ', end of t_' lv_name INTO . + ELSE. + CONCATENATE ' end of t_' lv_name ',' INTO . + ENDIF. + + APPEND INITIAL LINE TO lt_buf ASSIGNING . + + IF iv_parent NE 0. + APPEND INITIAL LINE TO lt_buf ASSIGNING . + IF p_normal IS INITIAL. + CONCATENATE ', tt_' lv_name ' type standard table of t_' lv_name ' with default key' INTO RESPECTING BLANKS . + ELSE. + CONCATENATE ' tt_' lv_name ' type standard table of t_' lv_name ' with default key,' INTO RESPECTING BLANKS . + ENDIF. + + ENDIF. + + APPEND INITIAL LINE TO lt_buf ASSIGNING . + + + ct_result = lt_buf. +ENDFORM. + +FORM load_smw0 + USING + io_reader TYPE REF TO zif_excel_reader + iv_w3objid TYPE w3objid + CHANGING + ro_excel TYPE REF TO zcl_excel + RAISING + zcx_excel. + + DATA: lv_excel_data TYPE xstring, + lt_mime TYPE TABLE OF w3mime, + ls_key TYPE wwwdatatab, + lv_errormessage TYPE string, + lv_filesize TYPE i, + lv_filesizec TYPE c LENGTH 10. + +*--------------------------------------------------------------------* +* Read file into binary string +*--------------------------------------------------------------------* + + ls_key-relid = 'MI'. + ls_key-objid = iv_w3objid . + + CALL FUNCTION 'WWWDATA_IMPORT' + EXPORTING + key = ls_key + TABLES + mime = lt_mime + EXCEPTIONS + OTHERS = 1. + IF sy-subrc <> 0. + lv_errormessage = 'A problem occured when reading the MIME object'(004). + zcx_excel=>raise_text( lv_errormessage ). + ENDIF. + + CALL FUNCTION 'WWWPARAMS_READ' + EXPORTING + relid = ls_key-relid + objid = ls_key-objid + name = 'filesize' + IMPORTING + value = lv_filesizec. + + lv_filesize = lv_filesizec. + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filesize + IMPORTING + buffer = lv_excel_data + TABLES + binary_tab = lt_mime + EXCEPTIONS + failed = 1 + OTHERS = 2. + +*--------------------------------------------------------------------* +* Parse Excel data into ZCL_EXCEL object from binary string +*--------------------------------------------------------------------* + ro_excel = io_reader->load( i_excel2007 = lv_excel_data ). + +ENDFORM. diff --git a/src/not_cloud/zexcel_template_get_types.prog.xml b/src/not_cloud/zexcel_template_get_types.prog.xml new file mode 100644 index 0000000..e48b857 --- /dev/null +++ b/src/not_cloud/zexcel_template_get_types.prog.xml @@ -0,0 +1,58 @@ + + + + + + ZEXCEL_TEMPLATE_GET_TYPES + 1 + T + E + X + X + + + + R + Generate ABAP code (Types) for template workbook + 48 + + + S + P_FILE + Load template from file + 31 + + + S + P_FPATH + Path to template.xlsx + 29 + + + S + P_NORMAL + Normal comma at end, + 28 + + + S + P_OBJID + Object ID + 17 + + + S + P_OTHER + , comma at begin of line + 37 + + + S + P_SMW0 + Load template from SMW0 + 31 + + + + + diff --git a/src/zcl_excel.clas.abap b/src/zcl_excel.clas.abap index 361eb6e..29a6b12 100644 --- a/src/zcl_excel.clas.abap +++ b/src/zcl_excel.clas.abap @@ -146,6 +146,11 @@ CLASS zcl_excel DEFINITION METHODS set_theme IMPORTING !io_theme TYPE REF TO zcl_excel_theme . + METHODS fill_template + importing + !iv_data TYPE REF TO ZCL_EXCEL_TEMPLATE_DATA + RAISING + zcx_excel . PROTECTED SECTION. DATA worksheets TYPE REF TO zcl_excel_worksheets . @@ -670,4 +675,26 @@ CLASS zcl_excel IMPLEMENTATION. METHOD zif_excel_book_vba_project~set_vbaproject. me->zif_excel_book_vba_project~vbaproject = ip_vbaproject. ENDMETHOD. + + + METHOD fill_template. + + DATA: lo_template_filler TYPE REF TO zcl_excel_fill_template. + + FIELD-SYMBOLS: + TYPE zexcel_sheet_title, + TYPE zcl_excel_template_data=>ts_template_data_sheet. + + + lo_template_filler = zcl_excel_fill_template=>create( me ). + + LOOP AT lo_template_filler->mt_sheet ASSIGNING . + + READ TABLE iv_data->mt_data ASSIGNING WITH KEY sheet = . + CHECK sy-subrc = 0. + lo_template_filler->fill_sheet( ). + + ENDLOOP. + + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_excel_fill_template.clas.abap b/src/zcl_excel_fill_template.clas.abap new file mode 100644 index 0000000..f332eb5 --- /dev/null +++ b/src/zcl_excel_fill_template.clas.abap @@ -0,0 +1,649 @@ +CLASS zcl_excel_fill_template DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + TYPES: tv_range_name TYPE c LENGTH 30, + BEGIN OF ts_range, + sheet TYPE zexcel_sheet_title, + name TYPE tv_range_name, + start TYPE zexcel_cell_row, + stop TYPE zexcel_cell_row, + id TYPE i, + parent TYPE i, + length TYPE i, + END OF ts_range, + tt_ranges TYPE STANDARD TABLE OF ts_range WITH DEFAULT KEY, + BEGIN OF ts_variable, + sheet TYPE zexcel_sheet_title, + parent TYPE i, + name TYPE tv_range_name, + END OF ts_variable, + BEGIN OF ts_name_style, + sheet TYPE zexcel_sheet_title, + name TYPE tv_range_name, + parent TYPE i, + numeric_counter TYPE i, + date_counter TYPE i, + time_counter TYPE i, + text_counter TYPE i, + END OF ts_name_style, + tt_variables TYPE STANDARD TABLE OF ts_variable WITH DEFAULT KEY, + tt_sheet_titles TYPE STANDARD TABLE OF zexcel_sheet_title WITH DEFAULT KEY, + tt_name_styles TYPE STANDARD TABLE OF ts_name_style WITH DEFAULT KEY. + + DATA mt_sheet TYPE tt_sheet_titles READ-ONLY. + DATA mt_range TYPE tt_ranges READ-ONLY. + DATA mt_var TYPE tt_variables READ-ONLY. + DATA mo_excel TYPE REF TO zcl_excel READ-ONLY. + DATA mt_name_styles TYPE tt_name_styles READ-ONLY. + + CLASS-METHODS create + IMPORTING + !io_excel TYPE REF TO zcl_excel + RETURNING + VALUE(eo_template_filler) TYPE REF TO zcl_excel_fill_template + RAISING + zcx_excel. + + METHODS fill_sheet + IMPORTING + !iv_data TYPE zcl_excel_template_data=>ts_template_data_sheet + RAISING + zcx_excel . + + PROTECTED SECTION. + PRIVATE SECTION. + + TYPES: tt_cell_data_no_key TYPE STANDARD TABLE OF zexcel_s_cell_data WITH DEFAULT KEY. + + METHODS fill_range + IMPORTING + !iv_sheet TYPE zexcel_sheet_title + !iv_parent TYPE zexcel_cell_row + !iv_data TYPE data + VALUE(iv_range_length) TYPE zexcel_cell_row + !io_sheet TYPE REF TO zcl_excel_worksheet + CHANGING + !ct_cells TYPE tt_cell_data_no_key + !cv_diff TYPE zexcel_cell_row + !ct_merged_cells TYPE zcl_excel_worksheet=>mty_ts_merge + RAISING + zcx_excel . + METHODS get_range . + METHODS validate_range + IMPORTING + !io_range TYPE REF TO zcl_excel_range . + METHODS discard_overlapped . + METHODS sign_range . + METHODS find_var + RAISING + zcx_excel . + +ENDCLASS. + + + +CLASS zcl_excel_fill_template IMPLEMENTATION. + + + METHOD create. + + CREATE OBJECT eo_template_filler . + + eo_template_filler->mo_excel = io_excel. + eo_template_filler->get_range( ). + eo_template_filler->discard_overlapped( ). + eo_template_filler->sign_range( ). + eo_template_filler->find_var( ). + + ENDMETHOD. + + METHOD discard_overlapped. + DATA: + lt_range TYPE tt_ranges. + FIELD-SYMBOLS: + TYPE ts_range, + TYPE ts_range. + + SORT mt_range BY sheet start stop. + + LOOP AT mt_range ASSIGNING . + + LOOP AT mt_range ASSIGNING WHERE sheet = -sheet + AND name <> -name + AND stop >= -start + AND start < -start + AND stop < -stop. + EXIT. + ENDLOOP. + + IF sy-subrc NE 0. + APPEND TO lt_range. + ENDIF. + + ENDLOOP. + + mt_range = lt_range. + + SORT mt_range BY sheet start stop DESCENDING. + + ENDMETHOD. + + + METHOD fill_range. + + DATA: lt_tmp_cells_template TYPE tt_cell_data_no_key, + lt_cells_result TYPE tt_cell_data_no_key, + lt_tmp_cells TYPE tt_cell_data_no_key, + ls_cell TYPE zexcel_s_cell_data, + lt_tmp_merged_cells_template TYPE zcl_excel_worksheet=>mty_ts_merge, + lt_merged_cells_result TYPE zcl_excel_worksheet=>mty_ts_merge, + lt_tmp_merged_cells TYPE zcl_excel_worksheet=>mty_ts_merge, + ls_merged_cell LIKE LINE OF lt_tmp_merged_cells, + lv_start_row TYPE i, + lv_stop_row TYPE i, + lv_cell_row TYPE i, + lv_column_alpha TYPE string, + lt_matches TYPE match_result_tab, + lv_search TYPE string, + lv_var_name TYPE string, + lv_cell_value TYPE string. + + FIELD-SYMBOLS: + TYPE ANY TABLE, + TYPE any, + TYPE ts_range, + TYPE zexcel_s_cell_data, + TYPE match_result, + TYPE any. + + + cv_diff = cv_diff + iv_range_length . + + lv_start_row = 1. + + +* recursive fill nested range + + LOOP AT mt_range ASSIGNING WHERE sheet = iv_sheet + AND parent = iv_parent. + + + lv_stop_row = -start - 1. + +* update cells before any range + + LOOP AT ct_cells INTO ls_cell WHERE cell_row >= lv_start_row AND cell_row <= lv_stop_row . + ls_cell-cell_row = ls_cell-cell_row + cv_diff. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( ls_cell-cell_column ). + + ls_cell-cell_coords = ls_cell-cell_row. + CONCATENATE lv_column_alpha ls_cell-cell_coords INTO ls_cell-cell_coords. + CONDENSE ls_cell-cell_coords NO-GAPS. + + APPEND ls_cell TO lt_cells_result. + ENDLOOP. + + + +* update merged cells before range + + LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from >= lv_start_row AND row_to <= lv_stop_row. + ls_merged_cell-row_from = ls_merged_cell-row_from + cv_diff. + ls_merged_cell-row_to = ls_merged_cell-row_to + cv_diff. + + APPEND ls_merged_cell TO lt_merged_cells_result. + + ENDLOOP. + + + + lv_start_row = -stop + 1. + + + + CLEAR: + lt_tmp_cells_template, + lt_tmp_merged_cells_template. + + +*copy cell template + LOOP AT ct_cells INTO ls_cell WHERE cell_row >= -start AND cell_row <= -stop. + APPEND ls_cell TO lt_tmp_cells_template. + ENDLOOP. + + LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from >= -start AND row_to <= -stop. + APPEND ls_merged_cell TO lt_tmp_merged_cells_template. + ENDLOOP. + + + ASSIGN COMPONENT -name OF STRUCTURE iv_data TO
. + CHECK sy-subrc = 0. + + cv_diff = cv_diff - -length. + +*merge each line of data table with template + LOOP AT
ASSIGNING . +* make local copy + lt_tmp_cells = lt_tmp_cells_template. + lt_tmp_merged_cells = lt_tmp_merged_cells_template. + +*fill data + + fill_range( + EXPORTING + io_sheet = io_sheet + iv_sheet = iv_sheet + iv_parent = -id + iv_data = + iv_range_length = -length + CHANGING + ct_cells = lt_tmp_cells + ct_merged_cells = lt_tmp_merged_cells + cv_diff = cv_diff ). + +*collect data + + APPEND LINES OF lt_tmp_cells TO lt_cells_result. + APPEND LINES OF lt_tmp_merged_cells TO lt_merged_cells_result. + + ENDLOOP. + + ENDLOOP. + + + IF IS ASSIGNED. + + LOOP AT ct_cells INTO ls_cell WHERE cell_row > -stop . + ls_cell-cell_row = ls_cell-cell_row + cv_diff. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( ls_cell-cell_column ). + + ls_cell-cell_coords = ls_cell-cell_row. + CONCATENATE lv_column_alpha ls_cell-cell_coords INTO ls_cell-cell_coords. + CONDENSE ls_cell-cell_coords NO-GAPS. + + APPEND ls_cell TO lt_cells_result. + ENDLOOP. + + ct_cells = lt_cells_result. + + LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from > -stop. + ls_merged_cell-row_from = ls_merged_cell-row_from + cv_diff. + ls_merged_cell-row_to = ls_merged_cell-row_to + cv_diff. + + APPEND ls_merged_cell TO lt_merged_cells_result. + ENDLOOP. + + ct_merged_cells = lt_merged_cells_result. + + ELSE. + + + LOOP AT ct_cells ASSIGNING . + -cell_row = -cell_row + cv_diff. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( -cell_column ). + + -cell_coords = -cell_row. + CONCATENATE lv_column_alpha -cell_coords INTO -cell_coords. + CONDENSE -cell_coords NO-GAPS. + ENDLOOP. + + LOOP AT ct_merged_cells INTO ls_merged_cell . + ls_merged_cell-row_from = ls_merged_cell-row_from + cv_diff. + ls_merged_cell-row_to = ls_merged_cell-row_to + cv_diff. + + APPEND ls_merged_cell TO lt_merged_cells_result. + ENDLOOP. + + ct_merged_cells = lt_merged_cells_result. + + ENDIF. + + +*check if variables in this range + READ TABLE mt_var TRANSPORTING NO FIELDS WITH KEY sheet = iv_sheet parent = iv_parent. + + IF sy-subrc = 0. + +* replace variables of current range with data + LOOP AT ct_cells ASSIGNING . + + + REFRESH lt_matches. + + lv_cell_value = -cell_value. + + FIND ALL OCCURRENCES OF REGEX '\[[^\]]*\]' IN -cell_value RESULTS lt_matches. + + SORT lt_matches BY offset DESCENDING . + + LOOP AT lt_matches ASSIGNING . + lv_search = -cell_value+-offset(-length). + lv_var_name = lv_search. + + TRANSLATE lv_var_name TO UPPER CASE. + TRANSLATE lv_var_name USING '[ ] '. + CONDENSE lv_var_name . + + ASSIGN COMPONENT lv_var_name OF STRUCTURE iv_data TO . + CHECK sy-subrc = 0. + + " Use SET_CELL to format correctly + io_sheet->set_cell( ip_column = -cell_column ip_row = -cell_row - cv_diff ip_value = ). + lv_cell_row = -cell_row - cv_diff. + READ TABLE io_sheet->sheet_content INTO ls_cell + WITH KEY cell_column = -cell_column + cell_row = lv_cell_row. + REPLACE ALL OCCURRENCES OF lv_search IN -cell_value WITH ls_cell-cell_value. + ENDLOOP. + + IF lines( lt_matches ) = 1. + lv_cell_row = -cell_row - cv_diff. + READ TABLE io_sheet->sheet_content INTO ls_cell + WITH KEY cell_column = -cell_column + cell_row = lv_cell_row. + -data_type = ls_cell-data_type. + ENDIF. + + ENDLOOP. + ENDIF. + + ENDMETHOD. + + + METHOD fill_sheet. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lt_sheet_cells TYPE tt_cell_data_no_key, + lt_merged_cells TYPE zcl_excel_worksheet=>mty_ts_merge, + lt_merged_cells_2 TYPE zcl_excel_worksheet=>mty_ts_merge, + lv_initial_diff TYPE i. + FIELD-SYMBOLS: + TYPE any, + TYPE zexcel_s_cell_data, + TYPE zcl_excel_worksheet=>mty_merge. + + + lo_worksheet = mo_excel->get_worksheet_by_name( iv_data-sheet ). + + lt_sheet_cells = lo_worksheet->sheet_content. + lt_merged_cells = lo_worksheet->mt_merged_cells. + + ASSIGN iv_data-data->* TO . + + fill_range( + EXPORTING + io_sheet = lo_worksheet + iv_range_length = 0 + iv_sheet = iv_data-sheet + iv_parent = 0 + iv_data = + CHANGING + ct_cells = lt_sheet_cells + ct_merged_cells = lt_merged_cells + cv_diff = lv_initial_diff ). + + + REFRESH lo_worksheet->sheet_content. + + LOOP AT lt_sheet_cells ASSIGNING . + INSERT INTO TABLE lo_worksheet->sheet_content. + ENDLOOP. + + lt_merged_cells_2 = lo_worksheet->mt_merged_cells. + LOOP AT lt_merged_cells_2 ASSIGNING . + lo_worksheet->delete_merge( ip_cell_column = -col_from ip_cell_row = -row_from ). + ENDLOOP. + + LOOP AT lt_merged_cells ASSIGNING . + lo_worksheet->set_merge( + ip_column_start = -col_from + ip_column_end = -col_to + ip_row = -row_from + ip_row_to = -row_to ). + ENDLOOP. + + ENDMETHOD. + + + METHOD find_var. + + DATA: lv_row TYPE i, + lv_column TYPE i, + lv_column_alpha TYPE string, + lv_value TYPE string, + ls_name_style TYPE ts_name_style, + lo_style TYPE REF TO zcl_excel_style, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + ls_variable TYPE ts_variable, + lv_highest_column TYPE zexcel_cell_column, + lv_highest_row TYPE int4, + lt_matches TYPE match_result_tab, + lv_search TYPE string, + lv_replace TYPE string. + + FIELD-SYMBOLS: + TYPE match_result, + TYPE ts_range, + TYPE zexcel_sheet_title, + TYPE ts_name_style. + + + LOOP AT mt_sheet ASSIGNING . + + lo_worksheet ?= mo_excel->get_worksheet_by_name( ). + lv_row = 1. + + lv_highest_column = lo_worksheet->get_highest_column( ). + lv_highest_row = lo_worksheet->get_highest_row( ). + + WHILE lv_row <= lv_highest_row. + lv_column = 1. + WHILE lv_column <= lv_highest_column. + lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column ). + CLEAR lo_style. + lo_worksheet->get_cell( + EXPORTING + ip_column = lv_column_alpha + ip_row = lv_row + IMPORTING + ep_value = lv_value + ep_style = lo_style ). + + FIND ALL OCCURRENCES OF REGEX '\[[^\]]*\]' IN lv_value RESULTS lt_matches. + + LOOP AT lt_matches ASSIGNING . + lv_search = lv_value+-offset(-length). + lv_replace = lv_search. + + TRANSLATE lv_replace TO UPPER CASE. + + CLEAR ls_variable. + + ls_variable-sheet = . + ls_variable-name = lv_replace. + TRANSLATE ls_variable-name USING '[ ] '. + CONDENSE ls_variable-name . + + LOOP AT mt_range ASSIGNING WHERE sheet = + AND start <= lv_row + AND stop >= lv_row. + ls_variable-parent = -id. + EXIT. + ENDLOOP. + + READ TABLE mt_var TRANSPORTING NO FIELDS WITH KEY sheet = ls_variable-sheet name = ls_variable-name parent = ls_variable-parent. + IF sy-subrc NE 0. + APPEND ls_variable TO mt_var. + ENDIF. + + READ TABLE mt_name_styles WITH KEY sheet = ls_variable-sheet name = ls_variable-name parent = ls_variable-parent ASSIGNING . + IF sy-subrc NE 0. + CLEAR ls_name_style. + ls_name_style-sheet = . + ls_name_style-name = ls_variable-name. + ls_name_style-parent = ls_variable-parent. + APPEND ls_name_style TO mt_name_styles ASSIGNING . + ENDIF. + IF lo_style IS NOT BOUND. + -text_counter = -text_counter + 1. + ELSE. + IF lo_style->number_format->format_code CA '0' + AND lo_style->number_format->format_code NS '0]'. + -numeric_counter = -numeric_counter + 1. + ELSEIF lo_style->number_format->format_code CA 'm' + AND lo_style->number_format->format_code CA 'd' + AND lo_style->number_format->format_code NA 'h'. + -date_counter = -date_counter + 1. + ELSEIF ( lo_style->number_format->format_code CA 'h' OR lo_style->number_format->format_code CA 's' ) + AND lo_style->number_format->format_code NA 'd'. + -time_counter = -time_counter + 1. + ELSE. + -text_counter = -text_counter + 1. + ENDIF. + ENDIF. + + ENDLOOP. + lv_column = lv_column + 1. + ENDWHILE. + lv_row = lv_row + 1. + ENDWHILE. + ENDLOOP. + + SORT mt_range BY id . + ENDMETHOD. + + + METHOD get_range. + + DATA: + lo_worksheets_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range_iterator TYPE REF TO cl_object_collection_iterator, + lo_range TYPE REF TO zcl_excel_range. + + + lo_worksheets_iterator = mo_excel->get_worksheets_iterator( ). + + + WHILE lo_worksheets_iterator->has_next( ) = abap_true. + lo_worksheet ?= lo_worksheets_iterator->get_next( ). + APPEND lo_worksheet->get_title( ) TO mt_sheet. + ENDWHILE. + + lo_range_iterator = mo_excel->get_ranges_iterator( ). + + WHILE lo_range_iterator->has_next( ) = abap_true. + lo_range ?= lo_range_iterator->get_next( ). + validate_range( lo_range ). + ENDWHILE. + + ENDMETHOD. + + + METHOD sign_range. + + DATA: lv_tabix TYPE i. + FIELD-SYMBOLS: + TYPE ts_range, + TYPE ts_range. + + LOOP AT mt_range ASSIGNING . + -id = sy-tabix. + ENDLOOP. + + LOOP AT mt_range ASSIGNING . + lv_tabix = sy-tabix + 1. + + LOOP AT mt_range ASSIGNING + FROM lv_tabix + WHERE sheet = -sheet. + + IF -start >= -start AND -stop <= -stop. + -parent = -id. + ENDIF. + + ENDLOOP. + + ENDLOOP. + + SORT mt_range BY id DESCENDING. + ENDMETHOD. + + + METHOD validate_range. + + DATA: lv_range_name TYPE string, + lv_range_address TYPE string, + lv_range_start TYPE string, + lv_range_stop TYPE string, + lv_range_sheet TYPE string, + lv_tmp_value TYPE string, + lt_cell_coord_parts TYPE TABLE OF string, + lv_cell_coord_start TYPE string, + lv_cell_coord_stop TYPE string, + 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. + + FIELD-SYMBOLS: TYPE ts_range. + + + lv_range_name = io_range->name. + TRANSLATE lv_range_name TO UPPER CASE. + lv_range_address = io_range->get_value( ). + + SPLIT lv_range_address AT '!' INTO lv_range_sheet lv_tmp_value. + + SPLIT lv_tmp_value AT ':' INTO lv_range_start lv_range_stop. + + SPLIT lv_range_start AT '$' INTO TABLE lt_cell_coord_parts. + + IF lines( lt_cell_coord_parts ) > 2. + TRY. + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = lv_range_address + 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 + ). + CATCH zcx_excel. " + RETURN. + ENDTRY. + IF lv_column_start = 'A' AND lv_column_end = 'XFD'. + lv_cell_coord_start = |{ lv_row_start }|. + lv_cell_coord_stop = |{ lv_row_end }|. + CLEAR lt_cell_coord_parts. + CLEAR lv_range_stop. + ELSE. + RETURN. + ENDIF. + ENDIF. + + IF lines( lt_cell_coord_parts ) >= 2. + READ TABLE lt_cell_coord_parts INTO lv_cell_coord_start INDEX 2. + ENDIF. + + IF lv_cell_coord_start CO '0123456789'. + APPEND INITIAL LINE TO mt_range ASSIGNING . + -sheet = lv_range_sheet. + -name = lv_range_name. + -start = lv_cell_coord_start. + + SPLIT lv_range_stop AT '$' INTO TABLE lt_cell_coord_parts. + READ TABLE lt_cell_coord_parts INTO lv_cell_coord_stop INDEX 2. + -stop = lv_cell_coord_stop. + + -length = -stop - -start + 1. + + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_excel_fill_template.clas.xml b/src/zcl_excel_fill_template.clas.xml new file mode 100644 index 0000000..0797907 --- /dev/null +++ b/src/zcl_excel_fill_template.clas.xml @@ -0,0 +1,42 @@ + + + + + + ZCL_EXCEL_FILL_TEMPLATE + E + poopulate excell template with data + 1 + X + X + X + + + + ZCL_EXCEL_FILL_TEMPLATE + MO_EXCEL + E + Excel creator + + + ZCL_EXCEL_FILL_TEMPLATE + MT_RANGE + E + Range description + + + ZCL_EXCEL_FILL_TEMPLATE + MT_SHEET + E + table of sheet title + + + ZCL_EXCEL_FILL_TEMPLATE + MT_VAR + E + var description + + + + + diff --git a/src/zcl_excel_template_data.clas.abap b/src/zcl_excel_template_data.clas.abap new file mode 100644 index 0000000..709b778 --- /dev/null +++ b/src/zcl_excel_template_data.clas.abap @@ -0,0 +1,42 @@ +CLASS zcl_excel_template_data DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + TYPES: tt_sheet_titles TYPE STANDARD TABLE OF zexcel_sheet_title WITH DEFAULT KEY, + BEGIN OF ts_template_data_sheet, + sheet TYPE zexcel_sheet_title, + data TYPE REF TO data, + END OF ts_template_data_sheet, + tt_template_data_sheets TYPE STANDARD TABLE OF ts_template_data_sheet WITH DEFAULT KEY. + + DATA mt_data TYPE tt_template_data_sheets READ-ONLY. + + METHODS add + IMPORTING + iv_sheet TYPE zexcel_sheet_title + iv_data TYPE data . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS zcl_excel_template_data IMPLEMENTATION. + + + METHOD add. + FIELD-SYMBOLS: TYPE ts_template_data_sheet, + TYPE any. + + APPEND INITIAL LINE TO mt_data ASSIGNING . + -sheet = iv_sheet. + CREATE DATA -data LIKE iv_data. + + ASSIGN -data->* TO . + = iv_data. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_excel_template_data.clas.xml b/src/zcl_excel_template_data.clas.xml new file mode 100644 index 0000000..01a37db --- /dev/null +++ b/src/zcl_excel_template_data.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_EXCEL_TEMPLATE_DATA + E + Data for template + 1 + X + X + X + + + + diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 3d74467..b077b47 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -71,6 +71,15 @@ CLASS zcl_excel_worksheet DEFINITION TYPE HASHED TABLE OF mty_s_column_formula WITH UNIQUE KEY id . TYPES ty_doc_url TYPE c LENGTH 255. + TYPES: + BEGIN OF mty_merge, + row_from TYPE i, + row_to TYPE i, + col_from TYPE i, + col_to TYPE i, + END OF mty_merge . + TYPES: + mty_ts_merge TYPE SORTED TABLE OF mty_merge WITH UNIQUE KEY table_line . CONSTANTS c_break_column TYPE zexcel_break VALUE 2. "#EC NOTEXT CONSTANTS c_break_none TYPE zexcel_break VALUE 0. "#EC NOTEXT @@ -90,6 +99,7 @@ CLASS zcl_excel_worksheet DEFINITION formula_not_in_this_table TYPE string, formula_in_other_column TYPE string, END OF c_messages. + DATA mt_merged_cells TYPE mty_ts_merge READ-ONLY . METHODS add_comment IMPORTING @@ -636,17 +646,8 @@ CLASS zcl_excel_worksheet DEFINITION mty_th_font_cache TYPE HASHED TABLE OF mty_s_font_cache WITH UNIQUE KEY font_name font_height flag_bold flag_italic . - TYPES: * types: * mty_ts_row_dimension TYPE SORTED TABLE OF zexcel_s_worksheet_rowdimensio WITH UNIQUE KEY row . - BEGIN OF mty_merge, - row_from TYPE i, - row_to TYPE i, - col_from TYPE i, - col_to TYPE i, - END OF mty_merge . - TYPES: - mty_ts_merge TYPE SORTED TABLE OF mty_merge WITH UNIQUE KEY table_line . *"* private components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! @@ -668,7 +669,6 @@ CLASS zcl_excel_worksheet DEFINITION DATA lower_cell TYPE zexcel_s_cell_data . DATA mo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks . CLASS-DATA mth_font_cache TYPE mty_th_font_cache . - DATA mt_merged_cells TYPE mty_ts_merge . DATA mt_row_outlines TYPE mty_ts_outlines_row . DATA print_title_col_from TYPE zexcel_cell_column_alpha . DATA print_title_col_to TYPE zexcel_cell_column_alpha .