diff --git a/src/zcl_excel_collection.clas.abap b/src/zcl_excel_collection.clas.abap new file mode 100644 index 0000000..868f5ed --- /dev/null +++ b/src/zcl_excel_collection.clas.abap @@ -0,0 +1,84 @@ +CLASS zcl_excel_collection DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + TYPES: + ty_collection TYPE STANDARD TABLE OF REF TO object . + + DATA collection TYPE ty_collection READ-ONLY . + + METHODS size + RETURNING + VALUE(size) TYPE i . + METHODS is_empty + RETURNING + VALUE(is_empty) TYPE abap_bool . + METHODS get + IMPORTING + !index TYPE i + RETURNING + VALUE(object) TYPE REF TO object . + METHODS get_iterator + RETURNING + VALUE(iterator) TYPE REF TO zcl_excel_collection_iterator . + METHODS add + IMPORTING + !element TYPE REF TO object . + METHODS remove + IMPORTING + !element TYPE REF TO object . + METHODS clear . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_EXCEL_COLLECTION IMPLEMENTATION. + + + METHOD add . + APPEND element TO collection. + ENDMETHOD. + + + METHOD clear . + CLEAR collection. + ENDMETHOD. + + + METHOD get . + READ TABLE collection INDEX index INTO object. + ENDMETHOD. + + + METHOD get_iterator . + CREATE OBJECT iterator + EXPORTING + collection = me. + ENDMETHOD. + + + METHOD is_empty. + is_empty = boolc( size( ) = 0 ). + ENDMETHOD. + + + METHOD remove . + DATA obj TYPE REF TO object. + LOOP AT collection INTO obj. + IF obj = element. + DELETE collection. + RETURN. + ENDIF. + ENDLOOP. + ENDMETHOD. + + + METHOD size. + size = lines( collection ). + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_excel_collection.clas.testclasses.abap b/src/zcl_excel_collection.clas.testclasses.abap new file mode 100644 index 0000000..5ef517e --- /dev/null +++ b/src/zcl_excel_collection.clas.testclasses.abap @@ -0,0 +1,37 @@ +CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL. + + PRIVATE SECTION. + METHODS test01 FOR TESTING RAISING cx_static_check. +ENDCLASS. + + +CLASS ltcl_test IMPLEMENTATION. + + METHOD test01. + + DATA lo_collection TYPE REF TO zcl_excel_collection. + + CREATE OBJECT lo_collection. + + cl_abap_unit_assert=>assert_equals( + act = lo_collection->size( ) + exp = 0 ). + + cl_abap_unit_assert=>assert_equals( + act = lo_collection->is_empty( ) + exp = abap_true ). + +* heh, yea, add the collection to itself :) + lo_collection->add( lo_collection ). + + cl_abap_unit_assert=>assert_equals( + act = lo_collection->size( ) + exp = 1 ). + + cl_abap_unit_assert=>assert_equals( + act = lo_collection->is_empty( ) + exp = abap_false ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_excel_collection.clas.xml b/src/zcl_excel_collection.clas.xml new file mode 100644 index 0000000..89f82e0 --- /dev/null +++ b/src/zcl_excel_collection.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_EXCEL_COLLECTION + E + abap2xlsx - Object Collection + 1 + X + X + X + X + + + + diff --git a/src/zcl_excel_collection_iterator.clas.abap b/src/zcl_excel_collection_iterator.clas.abap new file mode 100644 index 0000000..d104dc2 --- /dev/null +++ b/src/zcl_excel_collection_iterator.clas.abap @@ -0,0 +1,52 @@ +CLASS zcl_excel_collection_iterator DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + METHODS get_index + RETURNING + VALUE(index) TYPE i. + METHODS has_next + RETURNING + VALUE(has_next) TYPE abap_bool. + METHODS get_next + RETURNING + VALUE(object) TYPE REF TO object. + METHODS constructor + IMPORTING + collection TYPE REF TO zCL_excel_COLLECTION. + PROTECTED SECTION. + PRIVATE SECTION. + DATA index TYPE i VALUE 0. + DATA collection TYPE REF TO zcl_excel_collection. +ENDCLASS. + + + +CLASS ZCL_EXCEL_COLLECTION_ITERATOR IMPLEMENTATION. + + + METHOD constructor . + me->collection = collection. + ENDMETHOD. + + + METHOD get_index . + index = me->index. + ENDMETHOD. + + + METHOD get_next . + DATA obj TYPE REF TO object. + index = index + 1. + object = collection->get( index ). + ENDMETHOD. + + + METHOD has_next. + DATA obj TYPE REF TO object. + obj = collection->get( index + 1 ). + has_next = boolc( obj IS NOT INITIAL ). + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_excel_collection_iterator.clas.xml b/src/zcl_excel_collection_iterator.clas.xml new file mode 100644 index 0000000..09546d0 --- /dev/null +++ b/src/zcl_excel_collection_iterator.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_EXCEL_COLLECTION_ITERATOR + E + abap2xlsx - Object Iterator + 1 + X + X + X + + + + diff --git a/src/zcl_excel_common.clas.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index b978b2e..903fda0 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -68,7 +68,32 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING iv_shift_cols TYPE i iv_shift_rows TYPE i iv_expected TYPE string. - METHODS: shift_formula FOR TESTING. + METHODS: shift_formula_basic FOR TESTING, + shift_formula_rightdown FOR TESTING, + shift_formula_leftup FOR TESTING, + shift_formula_fixedcolrows FOR TESTING, + shift_formula_mixedfixedrows FOR TESTING, + shift_formula_rangename FOR TESTING, + shift_formula_stringlitconc FOR TESTING, + shift_formula_extref FOR TESTING, + shift_formula_charblanks FOR TESTING, + shift_formula_stringblanks FOR TESTING, + shift_formula_funcnoargs FOR TESTING, + shift_formula_nocellref FOR TESTING, + shift_formula_empty FOR TESTING, + shift_formula_referr_colunder FOR TESTING, + shift_formula_referr_rowunder FOR TESTING, + shift_formula_referr_rowcolund FOR TESTING, + shift_formula_sheet_nodigit FOR TESTING, + shift_formula_sheet_nodig FOR TESTING, + shift_formula_sheet_special FOR TESTING, + shift_formula_resp_blanks_1 FOR TESTING, + shift_formula_resp_blanks_2 FOR TESTING, + shift_formula_range FOR TESTING, + shift_formula_notcols FOR TESTING, + shift_formula_name FOR TESTING, + shift_formula_refcolumn1 FOR TESTING, + shift_formula_refcolumn2 FOR TESTING. METHODS is_cell_in_range_ulc_in FOR TESTING. METHODS is_cell_in_range_lrc_in FOR TESTING. METHODS is_cell_in_range_leftside_out FOR TESTING. @@ -1181,7 +1206,7 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDMETHOD. - METHOD shift_formula. + METHOD shift_formula_basic. " Very basic check macro_shift_formula( @@ -1190,6 +1215,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 0 iv_expected = 'C17' ). + ENDMETHOD. + + METHOD shift_formula_rightdown. + " Check shift right and down macro_shift_formula( iv_reference_formula = 'C17' @@ -1197,6 +1226,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 3 iv_expected = 'E20' ). + ENDMETHOD. + + METHOD shift_formula_leftup. + " Check shift left and up macro_shift_formula( iv_reference_formula = 'C17' @@ -1204,6 +1237,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = -3 iv_expected = 'A14' ). + ENDMETHOD. + + METHOD shift_formula_fixedcolrows. + " Fixed columns/rows macro_shift_formula( iv_reference_formula = '$C$17' @@ -1211,6 +1248,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = '$C$17' ). + ENDMETHOD. + + METHOD shift_formula_mixedfixedrows. + " Operators and Ranges, mixed fixed rows or columns macro_shift_formula( iv_reference_formula = 'SUM($C17:C$23)+C30' @@ -1218,6 +1259,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 11 iv_expected = 'SUM($C28:D$23)+D41' ). + ENDMETHOD. + + METHOD shift_formula_rangename. + " Operators and Rangename macro_shift_formula( iv_reference_formula = 'RNGNAME1+C7' @@ -1225,6 +1270,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = -4 iv_expected = 'RNGNAME1+B3' ). + ENDMETHOD. + + METHOD shift_formula_stringlitconc. + " String literals and string concatenation macro_shift_formula( iv_reference_formula = '"Date:"&TEXT(B2)' @@ -1232,6 +1281,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = '"Date:"&TEXT(C3)' ). + ENDMETHOD. + + METHOD shift_formula_extref. + " External sheet reference macro_shift_formula( iv_reference_formula = '[TEST6.XLSX]SHEET1!A1' @@ -1239,6 +1292,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 11 iv_expected = '[TEST6.XLSX]SHEET1!B12' ). + ENDMETHOD. + + METHOD shift_formula_charblanks. + " superflous blanks, multi-argument functions, literals in function, unknown functions macro_shift_formula( iv_reference_formula = `X(B13, "KK" ) ` @@ -1246,6 +1303,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = `X(C14, "KK" ) ` ). + ENDMETHOD. + + METHOD shift_formula_stringblanks. + " same as above - but with string input instead of Char-input macro_shift_formula( iv_reference_formula = `SIN(SIN(SIN(SIN(E22))))` @@ -1253,6 +1314,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'SIN(SIN(SIN(SIN(E23))))' ). + ENDMETHOD. + + METHOD shift_formula_funcnoargs. + " Functions w/o arguments, No cellreferences macro_shift_formula( iv_reference_formula = 'HEUTE()' @@ -1260,6 +1325,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 5 iv_expected = 'HEUTE()' ). + ENDMETHOD. + + METHOD shift_formula_nocellref. + " No cellreferences macro_shift_formula( iv_reference_formula = '"B2"' @@ -1267,6 +1336,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 5 iv_expected = '"B2"' ). + ENDMETHOD. + + METHOD shift_formula_empty. + " Empty macro_shift_formula( iv_reference_formula = '' @@ -1274,6 +1347,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 5 iv_expected = '' ). + ENDMETHOD. + + METHOD shift_formula_referr_colunder. + " Referencing error , column only , underflow macro_shift_formula( iv_reference_formula = 'A1+$A1+A$1+$A$1+B2' @@ -1281,6 +1358,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 0 iv_expected = '#REF!+$A1+#REF!+$A$1+A2' ). + ENDMETHOD. + + METHOD shift_formula_referr_rowunder. + " Referencing error , row only , underflow macro_shift_formula( iv_reference_formula = 'A1+$A1+A$1+$A$1+B2' @@ -1288,6 +1369,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = -1 iv_expected = '#REF!+#REF!+A$1+$A$1+B1' ). + ENDMETHOD. + + METHOD shift_formula_referr_rowcolund. + " Referencing error , row and column , underflow macro_shift_formula( iv_reference_formula = 'A1+$A1+A$1+$A$1+B2' @@ -1295,6 +1380,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = -1 iv_expected = '#REF!+#REF!+#REF!+$A$1+A1' ). + ENDMETHOD. + + METHOD shift_formula_sheet_nodigit. + " Sheet name not ending with digit macro_shift_formula( iv_reference_formula = 'Sheet!A1' @@ -1302,6 +1391,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'Sheet!B2' ). + ENDMETHOD. + + METHOD shift_formula_sheet_nodig. + " Sheet name ending with digit macro_shift_formula( iv_reference_formula = 'Sheet2!A1' @@ -1309,6 +1402,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'Sheet2!B2' ). + ENDMETHOD. + + METHOD shift_formula_sheet_special. + " Sheet name with special characters macro_shift_formula( iv_reference_formula = |'Sheet name'!A1| @@ -1316,6 +1413,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = |'Sheet name'!B2| ). + ENDMETHOD. + + METHOD shift_formula_resp_blanks_1. + " Respecting blanks macro_shift_formula( iv_reference_formula = 'SUBTOTAL(109,Table1[SUM 1])' @@ -1323,6 +1424,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'SUBTOTAL(109,Table1[SUM 1])' ). + ENDMETHOD. + + METHOD shift_formula_resp_blanks_2. + " Respecting blanks macro_shift_formula( iv_reference_formula = 'B4 & C4' @@ -1330,6 +1435,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'B5 & C5' ). + ENDMETHOD. + + METHOD shift_formula_range. + " F_1 is a range name, not a cell address macro_shift_formula( iv_reference_formula = 'SUM(F_1,F_2)' @@ -1337,6 +1446,9 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'SUM(F_1,F_2)' ). + ENDMETHOD. + + METHOD shift_formula_notcols. " RC are not columns macro_shift_formula( iv_reference_formula = 'INDIRECT("RC[4]",FALSE)' @@ -1344,6 +1456,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'INDIRECT("RC[4]",FALSE)' ). + ENDMETHOD. + + METHOD shift_formula_name. + " A1 is a sheet name macro_shift_formula( iv_reference_formula = |'A1'!$A$1| @@ -1351,6 +1467,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = |'A1'!$A$1| ). + ENDMETHOD. + + METHOD shift_formula_refcolumn1. + " Reference to another column in the same row of a Table, with a space in the column name macro_shift_formula( iv_reference_formula = 'Tbl[[#This Row],[Air fare]]' @@ -1358,6 +1478,10 @@ CLASS lcl_excel_common_test IMPLEMENTATION. iv_shift_rows = 1 iv_expected = 'Tbl[[#This Row],[Air fare]]' ). + ENDMETHOD. + + METHOD shift_formula_refcolumn2. + " Reference to another column in the same row of a Table, inside more complex expression macro_shift_formula( iv_reference_formula = 'Tbl[[#This Row],[Air]]+A1' diff --git a/src/zcl_excel_converter.clas.abap b/src/zcl_excel_converter.clas.abap index 43b9aa4..8e599e4 100644 --- a/src/zcl_excel_converter.clas.abap +++ b/src/zcl_excel_converter.clas.abap @@ -100,15 +100,15 @@ CLASS zcl_excel_converter DEFINITION DATA wt_colors TYPE zexcel_t_converter_col . DATA wt_filter TYPE zexcel_t_converter_fil . CLASS-DATA wt_objects TYPE tt_alv_types . - CLASS-DATA w_fcount TYPE numc3 . + CLASS-DATA w_fcount TYPE n LENGTH 3 . DATA wt_sort_values TYPE tt_sort_values . DATA wt_subtotal_rows TYPE tt_subtotal_rows . DATA wt_styles TYPE tt_styles . - CONSTANTS c_type_hdr TYPE c VALUE 'H'. "#EC NOTEXT - CONSTANTS c_type_str TYPE c VALUE 'P'. "#EC NOTEXT - CONSTANTS c_type_nor TYPE c VALUE 'N'. "#EC NOTEXT - CONSTANTS c_type_sub TYPE c VALUE 'S'. "#EC NOTEXT - CONSTANTS c_type_tot TYPE c VALUE 'T'. "#EC NOTEXT + CONSTANTS c_type_hdr TYPE c VALUE 'H'. "#EC NOTEXT + CONSTANTS c_type_str TYPE c VALUE 'P'. "#EC NOTEXT + CONSTANTS c_type_nor TYPE c VALUE 'N'. "#EC NOTEXT + CONSTANTS c_type_sub TYPE c VALUE 'S'. "#EC NOTEXT + CONSTANTS c_type_tot TYPE c VALUE 'T'. "#EC NOTEXT DATA wt_color_styles TYPE tt_color_styles . CLASS-DATA ws_option TYPE zexcel_s_converter_option . CLASS-DATA ws_indx TYPE indx . @@ -249,7 +249,7 @@ ENDCLASS. -CLASS zcl_excel_converter IMPLEMENTATION. +CLASS ZCL_EXCEL_CONVERTER IMPLEMENTATION. METHOD ask_option. diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index 4ad3139..4319c63 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -597,7 +597,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_table TYPE REF TO zcl_excel_table. DATA: lv_worksheets_num TYPE i, - lv_worksheets_numc TYPE numc3, + lv_worksheets_numc TYPE n LENGTH 3, lv_xml_node_worksheet_pn TYPE string, lv_value TYPE string, lv_comment_index TYPE i VALUE 1, " (+) GGAR @@ -1075,8 +1075,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_element TYPE REF TO if_ixml_element. DATA: lv_value TYPE string, - lv_date TYPE sydatum, - lv_time TYPE syuzeit. + lv_date TYPE d, + lv_time TYPE t. ********************************************************************** * STEP 1: Create [Content_Types].xml into the root of the ZIP diff --git a/src/zcl_excel_writer_csv.clas.abap b/src/zcl_excel_writer_csv.clas.abap index 5defa92..44f4560 100644 --- a/src/zcl_excel_writer_csv.clas.abap +++ b/src/zcl_excel_writer_csv.clas.abap @@ -32,23 +32,28 @@ CLASS zcl_excel_writer_csv DEFINITION PRIVATE SECTION. DATA excel TYPE REF TO zcl_excel . - CLASS-DATA delimiter TYPE c VALUE ';'. "#EC NOTEXT . . . . . . . . . " . - CLASS-DATA enclosure TYPE c VALUE '"'. "#EC NOTEXT . . . . . . . . . " . - CLASS-DATA eol TYPE c LENGTH 2 VALUE cl_abap_char_utilities=>cr_lf. "#EC NOTEXT . . . . . . . . . " . + CLASS-DATA delimiter TYPE c VALUE ';' ##NO_TEXT. + CLASS-DATA enclosure TYPE c VALUE '"' ##NO_TEXT. + CLASS-DATA: + eol TYPE c LENGTH 2 VALUE cl_abap_char_utilities=>cr_lf ##NO_TEXT. CLASS-DATA worksheet_name TYPE zexcel_worksheets_name . CLASS-DATA worksheet_index TYPE zexcel_active_worksheet . METHODS create RETURNING - VALUE(ep_excel) TYPE xstring . + VALUE(ep_excel) TYPE xstring + RAISING + zcx_excel. METHODS create_csv RETURNING - VALUE(ep_content) TYPE xstring . + VALUE(ep_content) TYPE xstring + RAISING + zcx_excel . ENDCLASS. -CLASS zcl_excel_writer_csv IMPLEMENTATION. +CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. METHOD create. @@ -68,7 +73,7 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION. END OF lty_format. DATA: lt_format TYPE STANDARD TABLE OF lty_format, ls_format LIKE LINE OF lt_format, - lv_date TYPE dats, + lv_date TYPE d, lv_tmp TYPE string, lv_time TYPE c LENGTH 8. diff --git a/src/zexcel_conditional_above_avg.tabl.xml b/src/zexcel_conditional_above_avg.tabl.xml index 6fac646..c932505 100644 --- a/src/zexcel_conditional_above_avg.tabl.xml +++ b/src/zexcel_conditional_above_avg.tabl.xml @@ -12,7 +12,7 @@ ABOVE_AVERAGE - FLAG + XSDBOOLEAN 0 X F @@ -20,7 +20,7 @@ EQUAL_AVERAGE - FLAG + XSDBOOLEAN 0 X F @@ -28,9 +28,12 @@ STANDARD_DEVIATION - NUM1 0 - E + N + 000002 + NUMC + 000001 + NUMC CELL_STYLE diff --git a/src/zexcel_docsecurity.dtel.xml b/src/zexcel_docsecurity.dtel.xml index 0fa7df3..20e3f22 100644 --- a/src/zexcel_docsecurity.dtel.xml +++ b/src/zexcel_docsecurity.dtel.xml @@ -5,7 +5,6 @@ ZEXCEL_DOCSECURITY E - NUMC1 55 10 15 @@ -16,7 +15,9 @@ DocSecurity DocSecurity E - D + NUMC + 000001 + 000001 diff --git a/src/zif_excel_writer.intf.abap b/src/zif_excel_writer.intf.abap index 8fbf52a..9b7dfd7 100644 --- a/src/zif_excel_writer.intf.abap +++ b/src/zif_excel_writer.intf.abap @@ -6,5 +6,7 @@ INTERFACE zif_excel_writer IMPORTING !io_excel TYPE REF TO zcl_excel RETURNING - VALUE(ep_file) TYPE xstring . + VALUE(ep_file) TYPE xstring + RAISING + zcx_excel. ENDINTERFACE.