Add ability to generate report from template (#669)

write tool to automate abap2xlsx

fix merged cells

code style

Convert keyword to UPPER case

adapt code to 702

New proposal

fix of Lint errors

Co-authored-by: sandraros <34005250+sandraros@users.noreply.github.com>
Co-authored-by: Abo <andrea@borgia.bo.it>
This commit is contained in:
AntonSikidin 2021-10-30 22:49:50 +03:00 committed by GitHub
parent 6d12c57f27
commit dc3962a402
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 1665 additions and 10 deletions

View File

@ -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: <ls_table1> TYPE t_table1,
<ls_line> TYPE t_line1,
<lt_table2> 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 <ls_table1>.
<ls_table1>-person = 'Lurch Schpellchek'.
<ls_table1>-salary = 1200.
APPEND INITIAL LINE TO gs_sheet1-table1 ASSIGNING <ls_table1>.
<ls_table1>-person = 'Russell Sprout'.
<ls_table1>-salary = 1300.
APPEND INITIAL LINE TO gs_sheet1-table1 ASSIGNING <ls_table1>.
<ls_table1>-person = 'Fergus Douchebag'.
<ls_table1>-salary = 3000.
APPEND INITIAL LINE TO gs_sheet1-table1 ASSIGNING <ls_table1>.
<ls_table1>-person = 'Bartholomew Shoe'.
<ls_table1>-salary = 100.
gs_sheet1-price = 14003.
APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING <lt_table2>.
<lt_table2>-carrid = 'AC'.
<lt_table2>-price = 1222.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'AC'.
<ls_line>-connid = '0820'.
<ls_line>-fldate = '20021220'.
<ls_line>-price = 1222.
APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING <lt_table2>.
<lt_table2>-carrid = 'AF'.
<lt_table2>-price = 2222.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'AF'.
<ls_line>-connid = '0820'.
<ls_line>-fldate = '20021223'.
<ls_line>-price = 2222.
APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING <lt_table2>.
<lt_table2>-carrid = 'LH'.
<lt_table2>-price = 9488.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'LH'.
<ls_line>-connid = '0400'.
<ls_line>-fldate = '19950228'.
<ls_line>-price = 899.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'LH'.
<ls_line>-connid = '0400'.
<ls_line>-fldate = '19951117'.
<ls_line>-price = 1499.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'LH'.
<ls_line>-connid = '0400'.
<ls_line>-fldate = '19950606'.
<ls_line>-price = 1090.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'LH'.
<ls_line>-connid = '0400'.
<ls_line>-fldate = '19950428'.
<ls_line>-price = 6000.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'LH'.
<ls_line>-connid = '0400'.
<ls_line>-fldate = '20021221'.
<ls_line>-price = 222.
APPEND INITIAL LINE TO gs_sheet1-table2 ASSIGNING <lt_table2>.
<lt_table2>-carrid = 'SQ'.
<lt_table2>-price = 849.
APPEND INITIAL LINE TO <lt_table2>-line1 ASSIGNING <ls_line>.
<ls_line>-carrid = 'SQ'.
<ls_line>-connid = '0026'.
<ls_line>-fldate = '19950228'.
<ls_line>-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.

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZDEMO_EXCEL_FILL_TEMPLATE</NAME>
<SUBC>1</SUBC>
<RSTAT>T</RSTAT>
<RLOAD>E</RLOAD>
<FIXPT>X</FIXPT>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>abap2xlsx Demo: Fill template</ENTRY>
<LENGTH>29</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_FILE</KEY>
<ENTRY>Load template from file</ENTRY>
<LENGTH>31</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_FPATH</KEY>
<ENTRY>Path to template.xlsx</ENTRY>
<LENGTH>29</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_OBJID</KEY>
<ENTRY>Object ID</ENTRY>
<LENGTH>17</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_PATH</KEY>
<ENTRY>.</ENTRY>
<LENGTH>9</LENGTH>
<SPLIT>D</SPLIT>
</item>
<item>
<ID>S</ID>
<KEY>P_SMW0</KEY>
<ENTRY>Load template from SMW0</ENTRY>
<LENGTH>31</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>RB_BACK</KEY>
<LENGTH>17</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

Binary file not shown.

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_W3MI" serializer_version="v2.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<NAME>ZDEMO_EXCEL_TEMPLATE</NAME>
<TEXT>ZDEMO_EXCEL_TEMPLATE</TEXT>
<PARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZDEMO_EXCEL_TEMPLATE</OBJID>
<NAME>fileextension</NAME>
<VALUE>.xlsx</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZDEMO_EXCEL_TEMPLATE</OBJID>
<NAME>filename</NAME>
<VALUE>ZABAP2XLSX_EXAMPLE.xlsx</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZDEMO_EXCEL_TEMPLATE</OBJID>
<NAME>mimetype</NAME>
<VALUE>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</VALUE>
</WWWPARAMS>
</PARAMS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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: <ls_sheet> LIKE LINE OF go_template_filler->mt_sheet,
<lv_res> TYPE text80.
LOOP AT go_template_filler->mt_sheet ASSIGNING <ls_sheet>.
CLEAR lv_sum.
READ TABLE go_template_filler->mt_range TRANSPORTING NO FIELDS WITH KEY sheet = <ls_sheet>.
ADD sy-subrc TO lv_sum.
READ TABLE go_template_filler->mt_var TRANSPORTING NO FIELDS WITH KEY sheet = <ls_sheet>.
ADD sy-subrc TO lv_sum.
CHECK lv_sum <= 4.
PERFORM get_type_r USING <ls_sheet> 0 CHANGING lt_buf.
APPEND LINES OF lt_buf TO lt_res.
ENDLOOP.
IF p_normal IS INITIAL.
READ TABLE lt_res ASSIGNING <lv_res> INDEX 1.
TRANSLATE <lv_res> USING ',:'.
INSERT INITIAL LINE INTO lt_res ASSIGNING <lv_res> INDEX 1.
<lv_res> = 'TYPES'.
APPEND INITIAL LINE TO lt_res ASSIGNING <lv_res>.
<lv_res> = '.'.
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 <lv_res> INDEX 1.
<lv_res> = 'TYPES:'.
lv_lines = lines( lt_res ) - 2.
READ TABLE lt_res ASSIGNING <lv_res> INDEX lv_lines.
TRANSLATE <lv_res> 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 <lv_res>.
<lv_res> = 'DATA'.
APPEND INITIAL LINE TO lt_res ASSIGNING <lv_res>.
<lv_res> = ': lo_data type ref to ZCL_EXCEL_TEMPLATE_DATA'.
APPEND INITIAL LINE TO lt_res ASSIGNING <lv_res>.
<lv_res> = '.'.
ELSE.
APPEND INITIAL LINE TO lt_res ASSIGNING <lv_res>.
<lv_res> = '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: <lv_buf> TYPE text80,
<ls_range> LIKE LINE OF go_template_filler->mt_range,
<ls_var> TYPE zcl_excel_fill_template=>ts_variable,
<ls_name_style> TYPE zcl_excel_fill_template=>ts_name_style.
CLEAR ct_result.
LOOP AT go_template_filler->mt_range ASSIGNING <ls_range> WHERE sheet = iv_sheet
AND parent = iv_parent.
PERFORM get_type_r
USING
iv_sheet
<ls_range>-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 <ls_range>
WITH KEY sheet = iv_sheet
id = iv_parent.
lv_name = <ls_range>-name.
ENDIF.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
IF p_normal IS INITIAL.
CONCATENATE ', begin of t_' lv_name INTO <lv_buf>.
ELSE.
CONCATENATE ' begin of t_' lv_name ',' INTO <lv_buf>.
ENDIF.
LOOP AT go_template_filler->mt_var ASSIGNING <ls_var> WHERE sheet = iv_sheet
AND parent = iv_parent.
READ TABLE go_template_filler->mt_name_styles
WITH KEY sheet = iv_sheet
name = <ls_var>-name
parent = iv_parent
ASSIGNING <ls_name_style>.
IF sy-subrc <> 0.
lv_type = 'string'.
ELSE.
CLEAR lt_sorted_counters.
APPEND <ls_name_style>-numeric_counter TO lt_sorted_counters.
APPEND <ls_name_style>-date_counter TO lt_sorted_counters.
APPEND <ls_name_style>-time_counter TO lt_sorted_counters.
APPEND <ls_name_style>-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 <ls_name_style>-numeric_counter.
lv_type = 't_number'.
WHEN <ls_name_style>-date_counter.
lv_type = 'd'.
WHEN <ls_name_style>-time_counter.
lv_type = 't'.
WHEN <ls_name_style>-text_counter.
lv_type = 'string'.
ENDCASE.
ENDIF.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
IF p_normal IS INITIAL.
CONCATENATE ', ' <ls_var>-name ' type ' lv_type INTO <lv_buf> RESPECTING BLANKS.
ELSE.
CONCATENATE ' ' <ls_var>-name ' type ' lv_type ',' INTO <lv_buf> RESPECTING BLANKS.
ENDIF.
ENDLOOP.
ADD sy-subrc TO lv_sum.
LOOP AT go_template_filler->mt_range ASSIGNING <ls_range> WHERE sheet = iv_sheet
AND parent = iv_parent.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
lv_string = <ls_range>-name.
IF p_normal IS INITIAL.
CONCATENATE ', ' <ls_range>-name ' type tt_' lv_string INTO <lv_buf> RESPECTING BLANKS .
ELSE.
CONCATENATE ' ' <ls_range>-name ' type tt_' lv_string ',' INTO <lv_buf> RESPECTING BLANKS .
ENDIF.
ENDLOOP.
IF lv_sum > 4.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
IF p_normal IS INITIAL.
<lv_buf> = ', xz type i'.
ELSE.
<lv_buf> = ' xz type i,'.
ENDIF.
ENDIF.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
IF p_normal IS INITIAL.
CONCATENATE ', end of t_' lv_name INTO <lv_buf>.
ELSE.
CONCATENATE ' end of t_' lv_name ',' INTO <lv_buf>.
ENDIF.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
IF iv_parent NE 0.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
IF p_normal IS INITIAL.
CONCATENATE ', tt_' lv_name ' type standard table of t_' lv_name ' with default key' INTO <lv_buf> RESPECTING BLANKS .
ELSE.
CONCATENATE ' tt_' lv_name ' type standard table of t_' lv_name ' with default key,' INTO <lv_buf> RESPECTING BLANKS .
ENDIF.
ENDIF.
APPEND INITIAL LINE TO lt_buf ASSIGNING <lv_buf>.
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.

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZEXCEL_TEMPLATE_GET_TYPES</NAME>
<SUBC>1</SUBC>
<RSTAT>T</RSTAT>
<RLOAD>E</RLOAD>
<FIXPT>X</FIXPT>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Generate ABAP code (Types) for template workbook</ENTRY>
<LENGTH>48</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_FILE</KEY>
<ENTRY>Load template from file</ENTRY>
<LENGTH>31</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_FPATH</KEY>
<ENTRY>Path to template.xlsx</ENTRY>
<LENGTH>29</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_NORMAL</KEY>
<ENTRY>Normal comma at end,</ENTRY>
<LENGTH>28</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_OBJID</KEY>
<ENTRY>Object ID</ENTRY>
<LENGTH>17</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_OTHER</KEY>
<ENTRY>, comma at begin of line</ENTRY>
<LENGTH>37</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_SMW0</KEY>
<ENTRY>Load template from SMW0</ENTRY>
<LENGTH>31</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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:
<lv_sheet> TYPE zexcel_sheet_title,
<lv_data_line> 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 <lv_sheet>.
READ TABLE iv_data->mt_data ASSIGNING <lv_data_line> WITH KEY sheet = <lv_sheet>.
CHECK sy-subrc = 0.
lo_template_filler->fill_sheet( <lv_data_line> ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -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:
<ls_range> TYPE ts_range,
<ls_range_2> TYPE ts_range.
SORT mt_range BY sheet start stop.
LOOP AT mt_range ASSIGNING <ls_range>.
LOOP AT mt_range ASSIGNING <ls_range_2> WHERE sheet = <ls_range>-sheet
AND name <> <ls_range>-name
AND stop >= <ls_range>-start
AND start < <ls_range>-start
AND stop < <ls_range>-stop.
EXIT.
ENDLOOP.
IF sy-subrc NE 0.
APPEND <ls_range> 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:
<table> TYPE ANY TABLE,
<line> TYPE any,
<ls_range> TYPE ts_range,
<ls_cell> TYPE zexcel_s_cell_data,
<ls_match> TYPE match_result,
<var_value> TYPE any.
cv_diff = cv_diff + iv_range_length .
lv_start_row = 1.
* recursive fill nested range
LOOP AT mt_range ASSIGNING <ls_range> WHERE sheet = iv_sheet
AND parent = iv_parent.
lv_stop_row = <ls_range>-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 = <ls_range>-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 >= <ls_range>-start AND cell_row <= <ls_range>-stop.
APPEND ls_cell TO lt_tmp_cells_template.
ENDLOOP.
LOOP AT ct_merged_cells INTO ls_merged_cell WHERE row_from >= <ls_range>-start AND row_to <= <ls_range>-stop.
APPEND ls_merged_cell TO lt_tmp_merged_cells_template.
ENDLOOP.
ASSIGN COMPONENT <ls_range>-name OF STRUCTURE iv_data TO <table>.
CHECK sy-subrc = 0.
cv_diff = cv_diff - <ls_range>-length.
*merge each line of data table with template
LOOP AT <table> ASSIGNING <line>.
* 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 = <ls_range>-id
iv_data = <line>
iv_range_length = <ls_range>-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 <ls_range> IS ASSIGNED.
LOOP AT ct_cells INTO ls_cell WHERE cell_row > <ls_range>-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 > <ls_range>-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 <ls_cell>.
<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.
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 <ls_cell>.
REFRESH lt_matches.
lv_cell_value = <ls_cell>-cell_value.
FIND ALL OCCURRENCES OF REGEX '\[[^\]]*\]' IN <ls_cell>-cell_value RESULTS lt_matches.
SORT lt_matches BY offset DESCENDING .
LOOP AT lt_matches ASSIGNING <ls_match>.
lv_search = <ls_cell>-cell_value+<ls_match>-offset(<ls_match>-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 <var_value>.
CHECK sy-subrc = 0.
" Use SET_CELL to format correctly
io_sheet->set_cell( ip_column = <ls_cell>-cell_column ip_row = <ls_cell>-cell_row - cv_diff ip_value = <var_value> ).
lv_cell_row = <ls_cell>-cell_row - cv_diff.
READ TABLE io_sheet->sheet_content INTO ls_cell
WITH KEY cell_column = <ls_cell>-cell_column
cell_row = lv_cell_row.
REPLACE ALL OCCURRENCES OF lv_search IN <ls_cell>-cell_value WITH ls_cell-cell_value.
ENDLOOP.
IF lines( lt_matches ) = 1.
lv_cell_row = <ls_cell>-cell_row - cv_diff.
READ TABLE io_sheet->sheet_content INTO ls_cell
WITH KEY cell_column = <ls_cell>-cell_column
cell_row = lv_cell_row.
<ls_cell>-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:
<any_data> TYPE any,
<ls_sheet_cell> TYPE zexcel_s_cell_data,
<ls_merged_cell> 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 <any_data>.
fill_range(
EXPORTING
io_sheet = lo_worksheet
iv_range_length = 0
iv_sheet = iv_data-sheet
iv_parent = 0
iv_data = <any_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 <ls_sheet_cell>.
INSERT <ls_sheet_cell> INTO TABLE lo_worksheet->sheet_content.
ENDLOOP.
lt_merged_cells_2 = lo_worksheet->mt_merged_cells.
LOOP AT lt_merged_cells_2 ASSIGNING <ls_merged_cell>.
lo_worksheet->delete_merge( ip_cell_column = <ls_merged_cell>-col_from ip_cell_row = <ls_merged_cell>-row_from ).
ENDLOOP.
LOOP AT lt_merged_cells ASSIGNING <ls_merged_cell>.
lo_worksheet->set_merge(
ip_column_start = <ls_merged_cell>-col_from
ip_column_end = <ls_merged_cell>-col_to
ip_row = <ls_merged_cell>-row_from
ip_row_to = <ls_merged_cell>-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:
<ls_match> TYPE match_result,
<ls_range> TYPE ts_range,
<lv_sheet> TYPE zexcel_sheet_title,
<ls_name_style> TYPE ts_name_style.
LOOP AT mt_sheet ASSIGNING <lv_sheet>.
lo_worksheet ?= mo_excel->get_worksheet_by_name( <lv_sheet> ).
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 <ls_match>.
lv_search = lv_value+<ls_match>-offset(<ls_match>-length).
lv_replace = lv_search.
TRANSLATE lv_replace TO UPPER CASE.
CLEAR ls_variable.
ls_variable-sheet = <lv_sheet>.
ls_variable-name = lv_replace.
TRANSLATE ls_variable-name USING '[ ] '.
CONDENSE ls_variable-name .
LOOP AT mt_range ASSIGNING <ls_range> WHERE sheet = <lv_sheet>
AND start <= lv_row
AND stop >= lv_row.
ls_variable-parent = <ls_range>-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 <ls_name_style>.
IF sy-subrc NE 0.
CLEAR ls_name_style.
ls_name_style-sheet = <lv_sheet>.
ls_name_style-name = ls_variable-name.
ls_name_style-parent = ls_variable-parent.
APPEND ls_name_style TO mt_name_styles ASSIGNING <ls_name_style>.
ENDIF.
IF lo_style IS NOT BOUND.
<ls_name_style>-text_counter = <ls_name_style>-text_counter + 1.
ELSE.
IF lo_style->number_format->format_code CA '0'
AND lo_style->number_format->format_code NS '0]'.
<ls_name_style>-numeric_counter = <ls_name_style>-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'.
<ls_name_style>-date_counter = <ls_name_style>-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'.
<ls_name_style>-time_counter = <ls_name_style>-time_counter + 1.
ELSE.
<ls_name_style>-text_counter = <ls_name_style>-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:
<ls_range> TYPE ts_range,
<ls_range_2> TYPE ts_range.
LOOP AT mt_range ASSIGNING <ls_range>.
<ls_range>-id = sy-tabix.
ENDLOOP.
LOOP AT mt_range ASSIGNING <ls_range>.
lv_tabix = sy-tabix + 1.
LOOP AT mt_range ASSIGNING <ls_range_2>
FROM lv_tabix
WHERE sheet = <ls_range>-sheet.
IF <ls_range_2>-start >= <ls_range>-start AND <ls_range_2>-stop <= <ls_range>-stop.
<ls_range_2>-parent = <ls_range>-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: <ls_range> 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 <ls_range>.
<ls_range>-sheet = lv_range_sheet.
<ls_range>-name = lv_range_name.
<ls_range>-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.
<ls_range>-stop = lv_cell_coord_stop.
<ls_range>-length = <ls_range>-stop - <ls_range>-start + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_EXCEL_FILL_TEMPLATE</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>poopulate excell template with data</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
<DESCRIPTIONS>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_FILL_TEMPLATE</CLSNAME>
<CMPNAME>MO_EXCEL</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Excel creator</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_FILL_TEMPLATE</CLSNAME>
<CMPNAME>MT_RANGE</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Range description</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_FILL_TEMPLATE</CLSNAME>
<CMPNAME>MT_SHEET</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>table of sheet title</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_FILL_TEMPLATE</CLSNAME>
<CMPNAME>MT_VAR</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>var description</DESCRIPT>
</SEOCOMPOTX>
</DESCRIPTIONS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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: <ls_data_sheet> TYPE ts_template_data_sheet,
<any> TYPE any.
APPEND INITIAL LINE TO mt_data ASSIGNING <ls_data_sheet>.
<ls_data_sheet>-sheet = iv_sheet.
CREATE DATA <ls_data_sheet>-data LIKE iv_data.
ASSIGN <ls_data_sheet>-data->* TO <any>.
<any> = iv_data.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_EXCEL_TEMPLATE_DATA</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Data for template</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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 .