diff --git a/LICENSE b/LICENSE index e06d208..083d277 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -186,7 +186,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright 2010 abap2xlsx Contributors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 3b577d0..c130620 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2262,6 +2262,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. workbookviewid TYPE string, showrowcolheaders TYPE string, righttoleft TYPE string, + topleftcell TYPE string, END OF lty_sheetview. TYPES: BEGIN OF lty_mergecell, @@ -2812,6 +2813,9 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. io_worksheet->zif_excel_sheet_properties~zoomscale_normal = ls_sheetview-zoomscalenormal. io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = ls_sheetview-zoomscalepagelayoutview. io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = ls_sheetview-zoomscalesheetlayoutview. + IF ls_sheetview-topleftcell IS NOT INITIAL. + io_worksheet->set_sheetview_top_left_cell( ls_sheetview-topleftcell ). + ENDIF. "Add merge cell information lo_ixml_mergecells = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'mergeCell' uri = namespace-main ). @@ -2928,21 +2932,12 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ENDIF. - " Start fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 " Read pane lo_ixml_pane_elem = lo_ixml_sheetview_elem->find_from_name_ns( name = 'pane' uri = namespace-main ). IF lo_ixml_pane_elem IS BOUND. fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_pane_elem CHANGING cp_structure = ls_excel_pane ). - " Issue #194 - " Replace REGEX with method from the common class - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_excel_pane-topleftcell - IMPORTING - e_column = lv_pane_cell_col_a " Cell Column - e_row = lv_pane_cell_row ). " Natural number - lv_pane_cell_col = zcl_excel_common=>convert_column2int( lv_pane_cell_col_a ). - SUBTRACT 1 FROM: lv_pane_cell_col, - lv_pane_cell_row. + lv_pane_cell_col = ls_excel_pane-xsplit. + lv_pane_cell_row = ls_excel_pane-ysplit. IF lv_pane_cell_col > 0 AND lv_pane_cell_row > 0. io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row @@ -2952,8 +2947,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ELSE. io_worksheet->freeze_panes( ip_num_columns = lv_pane_cell_col ). ENDIF. + IF ls_excel_pane-topleftcell IS NOT INITIAL. + io_worksheet->set_pane_top_left_cell( ls_excel_pane-topleftcell ). + ENDIF. ENDIF. - " End fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 " Start fix 276 Read data validations lo_ixml_datavalidations = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'dataValidation' uri = namespace-main ). diff --git a/src/zcl_excel_theme.clas.abap b/src/zcl_excel_theme.clas.abap index 75c3323..931c7a0 100644 --- a/src/zcl_excel_theme.clas.abap +++ b/src/zcl_excel_theme.clas.abap @@ -71,10 +71,7 @@ CLASS zcl_excel_theme DEFINITION DATA extlst TYPE REF TO zcl_excel_theme_extlst . PRIVATE SECTION. - DATA theme_changed TYPE abap_bool . - DATA theme_read TYPE abap_bool . DATA name TYPE string . - DATA xmls_a TYPE string . ENDCLASS. @@ -100,7 +97,6 @@ CLASS zcl_excel_theme IMPLEMENTATION. lo_node_theme = io_theme_xml->get_root_element( )." find_from_name( name = c_theme ). IF lo_node_theme IS BOUND. name = lo_node_theme->get_attribute( name = c_theme_name ). - xmls_a = lo_node_theme->get_attribute( name = c_theme_xmlns ). lo_theme_children = lo_node_theme->get_children( ). lo_theme_iterator = lo_theme_children->create_iterator( ). lo_theme_element ?= lo_theme_iterator->get_next( ). @@ -208,7 +204,6 @@ CLASS zcl_excel_theme IMPLEMENTATION. lo_document = lo_ixml->create_document( ). lo_document->set_encoding( lo_encoding ). lo_document->set_standalone( abap_true ). - lo_document->set_namespace_prefix( prefix = 'a' ). lo_element_root = lo_document->create_simple_element_ns( prefix = c_theme_prefix name = c_theme diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 9e54535..6d935ac 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -102,6 +102,8 @@ CLASS zcl_excel_worksheet DEFINITION formula_in_other_column TYPE string, END OF c_messages . DATA mt_merged_cells TYPE mty_ts_merge READ-ONLY . + DATA pane_top_left_cell TYPE string READ-ONLY. + DATA sheetview_top_left_cell TYPE string READ-ONLY. METHODS add_comment IMPORTING @@ -549,6 +551,11 @@ CLASS zcl_excel_worksheet DEFINITION !ip_formula TYPE zexcel_cell_formula OPTIONAL "added parameter RAISING zcx_excel . + METHODS set_pane_top_left_cell + IMPORTING + !iv_columnrow TYPE csequence + RAISING + zcx_excel. METHODS set_print_gridlines IMPORTING !i_print_gridlines TYPE zexcel_print_gridlines . @@ -565,6 +572,11 @@ CLASS zcl_excel_worksheet DEFINITION !iv_collapsed TYPE abap_bool RAISING zcx_excel . + METHODS set_sheetview_top_left_cell + IMPORTING + !iv_columnrow TYPE csequence + RAISING + zcx_excel. METHODS set_show_gridlines IMPORTING !i_show_gridlines TYPE zexcel_show_gridlines . @@ -4301,6 +4313,25 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. "set_merge_style + METHOD set_pane_top_left_cell. + DATA lv_column_int TYPE zexcel_cell_column. + DATA lv_row TYPE zexcel_cell_row. + + " Validate input value + zcl_excel_common=>convert_columnrow2column_a_row( + EXPORTING + i_columnrow = iv_columnrow + IMPORTING + e_column_int = lv_column_int + e_row = lv_row ). + IF lv_column_int NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_col AND zcl_excel_common=>c_excel_sheet_max_col + OR lv_row NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_row AND zcl_excel_common=>c_excel_sheet_max_row. + RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Invalid column/row coordinates (valid values: A1 to XFD1048576)'. + ENDIF. + pane_top_left_cell = iv_columnrow. + ENDMETHOD. + + METHOD set_print_gridlines. me->print_gridlines = i_print_gridlines. ENDMETHOD. "SET_PRINT_GRIDLINES @@ -4357,6 +4388,25 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. "SET_ROW_OUTLINE + METHOD set_sheetview_top_left_cell. + DATA lv_column_int TYPE zexcel_cell_column. + DATA lv_row TYPE zexcel_cell_row. + + " Validate input value + zcl_excel_common=>convert_columnrow2column_a_row( + EXPORTING + i_columnrow = iv_columnrow + IMPORTING + e_column_int = lv_column_int + e_row = lv_row ). + IF lv_column_int NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_col AND zcl_excel_common=>c_excel_sheet_max_col + OR lv_row NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_row AND zcl_excel_common=>c_excel_sheet_max_row. + RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Invalid column/row coordinates (valid values: A1 to XFD1048576)'. + ENDIF. + sheetview_top_left_cell = iv_columnrow. + ENDMETHOD. + + METHOD set_show_gridlines. me->show_gridlines = i_show_gridlines. ENDMETHOD. "SET_SHOW_GRIDLINES diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index 6b9434e..c08567b 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -2666,7 +2666,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. METHOD create_xl_drawings_vml. DATA: - lo_xml_document TYPE REF TO cl_xml_document, ld_stream TYPE string. @@ -2677,11 +2676,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. * BODY ld_stream = set_vml_string( ). - CREATE OBJECT lo_xml_document. - CALL METHOD lo_xml_document->parse_string - EXPORTING - stream = ld_stream. - CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = ld_stream @@ -3334,8 +3328,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ls_odd_footer TYPE zexcel_s_worksheet_head_foot, ls_even_header TYPE zexcel_s_worksheet_head_foot, ls_even_footer TYPE zexcel_s_worksheet_head_foot, - lv_content TYPE string, - lo_xml_document TYPE REF TO cl_xml_document. + lv_content TYPE string. * INIT_RESULT @@ -3383,11 +3376,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ld_7 INTO lv_content. - CREATE OBJECT lo_xml_document. - CALL METHOD lo_xml_document->parse_string - EXPORTING - stream = lv_content. - CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = lv_content diff --git a/src/zcl_excel_writer_2007.clas.locals_imp.abap b/src/zcl_excel_writer_2007.clas.locals_imp.abap index 7e01e73..0ae8e20 100644 --- a/src/zcl_excel_writer_2007.clas.locals_imp.abap +++ b/src/zcl_excel_writer_2007.clas.locals_imp.abap @@ -395,6 +395,11 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION. value = '0' ). ENDIF. + IF o_worksheet->sheetview_top_left_cell IS NOT INITIAL. + lo_element_2->set_attribute_ns( name = 'topLeftCell' + value = o_worksheet->sheetview_top_left_cell ). + ENDIF. + " freeze panes o_worksheet->get_freeze_cell( IMPORTING ep_row = lv_freeze_cell_row ep_column = lv_freeze_cell_column ). @@ -417,11 +422,15 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION. value = lv_value ). ENDIF. - lv_freeze_cell_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_freeze_cell_column ). - lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_freeze_cell_row ). - CONCATENATE lv_freeze_cell_column_alpha lv_value INTO lv_value. - lo_element_3->set_attribute_ns( name = 'topLeftCell' - value = lv_value ). + IF o_worksheet->pane_top_left_cell IS NOT INITIAL. + lo_element_3->set_attribute_ns( name = 'topLeftCell' + value = o_worksheet->pane_top_left_cell ). + ELSE. + lv_value = zcl_excel_common=>convert_column_a_row2columnrow( i_column = lv_freeze_cell_column + i_row = lv_freeze_cell_row ). + lo_element_3->set_attribute_ns( name = 'topLeftCell' + value = lv_value ). + ENDIF. lo_element_3->set_attribute_ns( name = 'activePane' value = 'bottomRight' ). diff --git a/src/zcl_excel_writer_csv.clas.abap b/src/zcl_excel_writer_csv.clas.abap index 23f6853..7aa976b 100644 --- a/src/zcl_excel_writer_csv.clas.abap +++ b/src/zcl_excel_writer_csv.clas.abap @@ -9,6 +9,9 @@ CLASS zcl_excel_writer_csv DEFINITION INTERFACES zif_excel_writer . + "! Default value for initial dates e.g. user's format (DD.MM.YYYY, MM.DD.YYYY, etc.) + CONSTANTS c_default TYPE c LENGTH 10 VALUE 'DEFAULT' ##NO_TEXT. + CLASS-METHODS set_delimiter IMPORTING VALUE(ip_value) TYPE c DEFAULT ';' . @@ -24,7 +27,10 @@ CLASS zcl_excel_writer_csv DEFINITION CLASS-METHODS set_active_sheet_index_by_name IMPORTING !i_worksheet_name TYPE zexcel_worksheets_name . -*"* protected components of class ZCL_EXCEL_WRITER_2007 + CLASS-METHODS set_initial_ext_date + IMPORTING + !ip_value TYPE char10 DEFAULT c_default . +*"* protected components of class ZCL_EXCEL_WRITER_CSV *"* do not include other source files here!!! PROTECTED SECTION. *"* private components of class ZCL_EXCEL_WRITER_CSV @@ -38,6 +44,7 @@ CLASS zcl_excel_writer_csv DEFINITION 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 . + CLASS-DATA initial_ext_date TYPE char10 VALUE c_default. METHODS create RETURNING @@ -53,7 +60,7 @@ ENDCLASS. -CLASS zcl_excel_writer_csv IMPLEMENTATION. +CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. METHOD create. @@ -220,24 +227,28 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION. CASE -data_type. WHEN 'd' OR 'D'. - lc_value = zcl_excel_common=>excel_string_to_date( ip_value = -cell_value ). - TRY. - lv_date = lc_value. - CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL' - EXPORTING - date_internal = lv_date - IMPORTING - date_external = lv_tmp - EXCEPTIONS - date_internal_is_invalid = 1 - OTHERS = 2. - IF sy-subrc = 0. - lc_value = lv_tmp. - ENDIF. + IF -cell_value IS INITIAL AND initial_ext_date <> c_default. + lc_value = initial_ext_date. + ELSE. + lc_value = zcl_excel_common=>excel_string_to_date( ip_value = -cell_value ). + TRY. + lv_date = lc_value. + CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL' + EXPORTING + date_internal = lv_date + IMPORTING + date_external = lv_tmp + EXCEPTIONS + date_internal_is_invalid = 1 + OTHERS = 2. + IF sy-subrc = 0. + lc_value = lv_tmp. + ENDIF. - CATCH cx_sy_conversion_no_number. + CATCH cx_sy_conversion_no_number. - ENDTRY. + ENDTRY. + ENDIF. WHEN 't' OR 'T'. lc_value = zcl_excel_common=>excel_string_to_time( ip_value = -cell_value ). @@ -302,6 +313,11 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION. ENDMETHOD. + METHOD set_initial_ext_date. + initial_ext_date = ip_value. + ENDMETHOD. + + METHOD zif_excel_writer~write_file. me->excel = io_excel. ep_file = me->create( ). diff --git a/src/zcl_excel_writer_csv.clas.xml b/src/zcl_excel_writer_csv.clas.xml index 2a13c78..7b1d8ad 100644 --- a/src/zcl_excel_writer_csv.clas.xml +++ b/src/zcl_excel_writer_csv.clas.xml @@ -32,6 +32,11 @@ I Create CSV ; Delimited format + + C_DEFAULT + E + Constant for string 'DEFAULT' + DELIMITER E @@ -72,6 +77,11 @@ I Excel creator + + INITIAL_EXT_DATE + E + Initial External Date + SET_ACTIVE_SHEET_INDEX E @@ -122,6 +132,11 @@ I Set End Of Line character + + SET_INITIAL_EXT_DATE + E + Set Initial External Date (replacing default '00.00.0000') + WORKSHEET_INDEX E @@ -143,6 +158,14 @@ Worksheets name + + + SET_INITIAL_EXT_DATE + IP_VALUE + E + Input Value + + diff --git a/src/zcl_excel_writer_xlsm.clas.abap b/src/zcl_excel_writer_xlsm.clas.abap index bb7835c..aa6ce92 100644 --- a/src/zcl_excel_writer_xlsm.clas.abap +++ b/src/zcl_excel_writer_xlsm.clas.abap @@ -262,8 +262,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. lo_ostream TYPE REF TO if_ixml_ostream, lo_renderer TYPE REF TO if_ixml_renderer. - DATA: lv_subrc TYPE sysubrc, - lv_contenttype TYPE string. + DATA: lv_contenttype TYPE string. ********************************************************************** * STEP 3: Create standard contentType @@ -273,7 +272,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the extension bin definition CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ). @@ -342,7 +341,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. DATA: lv_xml_node_ridx_id TYPE string, lv_size TYPE i, - lv_subrc TYPE sysubrc, lv_syindex(2) TYPE c. ********************************************************************** @@ -353,7 +351,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the vbaProject relation CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ). @@ -406,8 +404,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. lo_ostream TYPE REF TO if_ixml_ostream, lo_renderer TYPE REF TO if_ixml_renderer. - DATA: lv_subrc TYPE sysubrc. - ********************************************************************** * STEP 3: Create standard relationship ep_content = super->create_xl_sheet( io_worksheet = io_worksheet @@ -417,7 +413,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the vbaProject relation CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ). @@ -458,8 +454,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. lo_ostream TYPE REF TO if_ixml_ostream, lo_renderer TYPE REF TO if_ixml_renderer. - DATA: lv_subrc TYPE sysubrc. - ********************************************************************** * STEP 3: Create standard relationship ep_content = super->create_xl_workbook( ). @@ -468,7 +462,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the vbaProject relation CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ).