From 020637fa12dccd7587d4a4b3106704ed8ef00306 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 12 Feb 2015 22:28:29 +0100 Subject: [PATCH] Corrected issue #355 ( writer not writing strings with leading blanks ) Added Marcus von Cube's addition that allows to write very large files by using a transformation instead of ixml-handling in the string --- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 65 +- ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk | 817 ++++++++++++++++++++++ ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk | 24 + ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk | 309 ++++++++ 4 files changed, 1183 insertions(+), 32 deletions(-) create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk create mode 100644 ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk create mode 100644 ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index eb50abe..825543a 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -1,5 +1,5 @@ - + *"* local class implementation for public class *"* use this source file for the implementation part of @@ -27,7 +27,7 @@ - + @@ -2522,39 +2522,39 @@ ENDMETHOD. - method CREATE_XL_SHAREDSTRINGS. + METHOD create_xl_sharedstrings. ** Constant node name - DATA: lc_xml_node_sst TYPE string VALUE 'sst', - lc_xml_node_si TYPE string VALUE 'si', - lc_xml_node_t TYPE string VALUE 't', + DATA: lc_xml_node_sst TYPE string VALUE 'sst', + lc_xml_node_si TYPE string VALUE 'si', + lc_xml_node_t TYPE string VALUE 't', " Node attributes - lc_xml_attr_count TYPE string VALUE 'count', - lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', + lc_xml_attr_count TYPE string VALUE 'count', + lc_xml_attr_uniquecount TYPE string VALUE 'uniqueCount', " Node namespace - lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'. - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_sub_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet. + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. - DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, - ls_shared_string TYPE zexcel_s_shared_string, - lv_value TYPE string, - lv_count_str TYPE string, - lv_uniquecount_str TYPE string, - lv_sytabix TYPE sytabix, - lv_count TYPE i, - lv_uniquecount TYPE i. + DATA: lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_value TYPE string, + lv_count_str TYPE string, + lv_uniquecount_str TYPE string, + lv_sytabix TYPE sytabix, + lv_count TYPE i, + lv_uniquecount TYPE i. FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data, <fs_sheet_string> TYPE zexcel_s_shared_string. @@ -2624,9 +2624,10 @@ ENDMETHOD. parent = lo_document ). lo_sub_element = lo_document->create_simple_element( name = lc_xml_node_t parent = lo_document ). - if <fs_sheet_string>-string_type EQ 's_leading_blanks'. - lo_sub_element->set_attribute( name = 'space' namespace = 'xml' value = 'preserve' ). - endif. +* if <fs_sheet_string>-string_type EQ 's_leading_blanks'. + IF <fs_sheet_string>-string_value IS NOT INITIAL AND <fs_sheet_string>-string_value(1) EQ ` `. + lo_sub_element->set_attribute( name = 'space' namespace = 'xml' value = 'preserve' ). + ENDIF. lo_sub_element->set_value( value = <fs_sheet_string>-string_value ). lo_element->append_child( new_child = lo_sub_element ). lo_element_root->append_child( new_child = lo_element ). @@ -2639,7 +2640,7 @@ ENDMETHOD. lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). lo_renderer->render( ). - endmethod. +ENDMETHOD. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk new file mode 100644 index 0000000..759ea0b --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_HUGE_FILE.slnk @@ -0,0 +1,817 @@ + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + + + METHOD create_xl_sharedstrings. +* +* Redefinition using simple transformation instead of CL_IXML +* +** Constant node name + + TYPES: + BEGIN OF ts_root, + count TYPE string, + unique_count TYPE string, + END OF ts_root. + + DATA: + lv_last_allowed_char TYPE char1, + lv_invalid TYPE string. + + DATA: + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet. + + DATA: + ls_root TYPE ts_root, + lt_cell_data TYPE zexcel_t_cell_data_unsorted, + ls_shared_string TYPE zexcel_s_shared_string, + lv_sytabix TYPE sytabix. + + FIELD-SYMBOLS: + <sheet_content> TYPE zexcel_s_cell_data. + +********************************************************************** +* STEP 0: Build Regex for invalid characters + CASE cl_abap_char_utilities=>charsize. + WHEN 1.lv_last_allowed_char = cl_abap_conv_in_ce=>uccpi( 255 ). " FF in non-Unicode + WHEN 2.lv_last_allowed_char = cl_abap_conv_in_ce=>uccpi( 65533 )." FFFD in Unicode + ENDCASE. + CONCATENATE '[^\n\t\r -' lv_last_allowed_char ']' INTO lv_invalid. + +********************************************************************** +* STEP 1: Collect strings from each worksheet + + lo_iterator = excel->get_worksheets_iterator( ). + + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_worksheet ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND LINES OF lo_worksheet->sheet_content TO lt_cell_data. + ENDWHILE. + + DELETE lt_cell_data WHERE cell_formula IS NOT INITIAL " delete formula content + OR data_type NE 's'. " MvC: Only shared strings + + ls_root-count = lines( lt_cell_data ). + CONDENSE ls_root-count. + + SORT lt_cell_data BY cell_value. + DELETE ADJACENT DUPLICATES FROM lt_cell_data COMPARING cell_value. + + ls_root-unique_count = lines( lt_cell_data ). + CONDENSE ls_root-unique_count. + + LOOP AT lt_cell_data ASSIGNING <sheet_content>. + + lv_sytabix = sy-tabix - 1. + MOVE lv_sytabix TO ls_shared_string-string_no. + MOVE <sheet_content>-cell_value TO ls_shared_string-string_value. + REPLACE ALL OCCURRENCES OF REGEX lv_invalid + IN ls_shared_string-string_value WITH ` `. + APPEND ls_shared_string TO shared_strings. + + ENDLOOP. + +********************************************************************** +* STEP 2: Create XML + + CALL TRANSFORMATION zexcel_tr_shared_strings + SOURCE root = ls_root + shared_strings = shared_strings + OPTIONS xml_header = 'full' + RESULT XML ep_content. + + +ENDMETHOD. + + + METHOD create_xl_sheet. +* +* Build Sheet#.xml with Simple Transformation ZEXCEL_TR_SHEET +* +* This is an adaption of ZCL_EXCEL_WRITER_2007. +* Not all features are supported, notably the autofilter settings, +* conditional formatting and sheet protection. +* +* Bug reports to marcus.voncube AT deutschebahn.com +* + TYPES: + lty_bool TYPE c LENGTH 5. + + CONSTANTS: + lc_false TYPE lty_bool VALUE 'false', "#EC NEEDED + lc_true TYPE lty_bool VALUE 'true', + lc_zero TYPE c LENGTH 1 VALUE '0', + lc_one TYPE c LENGTH 1 VALUE '1', + lc_default_col_width TYPE float VALUE '9.10'. + + TYPES: + BEGIN OF lty_column, + min TYPE i, + max TYPE i, + width TYPE float, + hidden TYPE lty_bool, + customwidth TYPE lty_bool, + bestfit TYPE lty_bool, + collapsed TYPE lty_bool, + outlinelevel TYPE i, + style TYPE i, + END OF lty_column, + + BEGIN OF lty_row, + row TYPE i, + index TYPE i, + spans TYPE c LENGTH 11, "12345:12345" + hidden TYPE lty_bool, + customheight TYPE lty_bool, + height TYPE float, + collapsed TYPE lty_bool, + outlinelevel TYPE i, + customformat TYPE lty_bool, + style TYPE i, + END OF lty_row, + + BEGIN OF lty_mergecell, + ref TYPE c LENGTH 21, "AAA1234567:BBB1234567" + END OF lty_mergecell, + + BEGIN OF lty_hyperlink, + ref TYPE string, + location TYPE string, + r_id TYPE string, + END OF lty_hyperlink, + + BEGIN OF lty_table, + r_id TYPE string, + END OF lty_table, + + BEGIN OF lty_table_area, + left TYPE i, + right TYPE i, + top TYPE i, + bottom TYPE i, + END OF lty_table_area, + + BEGIN OF ty_missing_columns, + first_column TYPE zexcel_cell_column, + last_column TYPE zexcel_cell_column, + END OF ty_missing_columns. + +* +* Root node for transformation +* + DATA: + BEGIN OF l_worksheet, + dimension TYPE string, + tabcolor TYPE string, + summarybelow TYPE c, + summaryright TYPE c, + fittopage TYPE c, + showzeros TYPE c, + tabselected TYPE c, + zoomscale TYPE i, + zoomscalenormal TYPE i, + zoomscalepageview TYPE i, + zoomscalesheetview TYPE i, + workbookviewid TYPE c, + showgridlines TYPE c, + showrowcolheaders TYPE c, + activepane TYPE string, + state TYPE string, + ysplit TYPE i, + xsplit TYPE i, + topleftcell TYPE c LENGTH 10, + activecell TYPE c LENGTH 10, + customheight TYPE lty_bool, + defaultrowheight TYPE float, + defaultcolwidth TYPE float, + outlinelevelrow TYPE i, + outlinelevelcol TYPE i, + cols TYPE STANDARD TABLE OF lty_column, + rows TYPE STANDARD TABLE OF lty_row, + mergecells_count TYPE i, + mergecells TYPE STANDARD TABLE OF lty_mergecell, + hyperlinks_count TYPE i, + hyperlinks TYPE STANDARD TABLE OF lty_hyperlink, + BEGIN OF printoptions, + gridlines TYPE lty_bool, + horizontalcentered TYPE lty_bool, + verticalcentered TYPE lty_bool, + END OF printoptions, + BEGIN OF pagemargins, + left TYPE zexcel_dec_8_2, + right TYPE zexcel_dec_8_2, + top TYPE zexcel_dec_8_2, + bottom TYPE zexcel_dec_8_2, + header TYPE zexcel_dec_8_2, + footer TYPE zexcel_dec_8_2, + END OF pagemargins, + BEGIN OF pagesetup, + blackandwhite TYPE c, + cellcomments TYPE string, + copies TYPE i, + draft TYPE c, + errors TYPE string, + firstpagenumber TYPE i, + fittopage TYPE c, + fittoheight TYPE i, + fittowidth TYPE i, + horizontaldpi TYPE i, + orientation TYPE string, + pageorder TYPE string, + paperheight TYPE string, + papersize TYPE i, + paperwidth TYPE string, + scale TYPE i, + usefirstpagenumber TYPE c, + useprinterdefaults TYPE c, + verticaldpi TYPE i, + END OF pagesetup, + BEGIN OF headerfooter, + differentoddeven TYPE c, + oddheader TYPE string, + oddfooter TYPE string, + evenheader TYPE string, + evenfooter TYPE string, + END OF headerfooter, + drawings TYPE string, + tables_count TYPE i, + tables TYPE STANDARD TABLE OF lty_table, + END OF l_worksheet. + +* +* Local data +* + DATA: + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_table TYPE REF TO zcl_excel_table, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, + default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, + default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, + lv_value TYPE string, + lv_index TYPE i, + lv_spans TYPE string, + lt_range_merge TYPE string_table, + lv_column TYPE zexcel_cell_column, + lv_style_guid TYPE zexcel_cell_style, + ls_last_row TYPE zexcel_s_cell_data, + lv_freeze_cell_row TYPE zexcel_cell_row, + lv_freeze_cell_column TYPE zexcel_cell_column, + lv_freeze_cell_column_alpha TYPE zexcel_cell_column_alpha, + column_dimensions TYPE zexcel_t_worksheet_columndime, + row_dimensions TYPE zexcel_t_worksheet_rowdimensio, + lv_relation_id TYPE i VALUE 0, + outline_level_row TYPE i VALUE 0, + outline_level_col TYPE i VALUE 0, + col_count TYPE int4, + lt_table_areas TYPE SORTED TABLE OF lty_table_area + WITH NON-UNIQUE KEY left right top bottom, + ls_table_area LIKE LINE OF lt_table_areas, + lts_sorted_columns TYPE SORTED TABLE OF zexcel_cell_column + WITH UNIQUE KEY table_line, + t_missing_columns TYPE STANDARD TABLE OF ty_missing_columns + WITH NON-UNIQUE DEFAULT KEY, + missing_column LIKE LINE OF t_missing_columns, + lo_link TYPE REF TO zcl_excel_hyperlink, + lo_drawings TYPE REF TO zcl_excel_drawings. + + FIELD-SYMBOLS: + <sheet_content> TYPE zexcel_s_cell_data, + <range_merge> LIKE LINE OF lt_range_merge, + <column_dimension> TYPE zexcel_s_worksheet_columndime, + <row_dimension> TYPE zexcel_s_worksheet_rowdimensio, + <col> TYPE lty_column, + <row> TYPE lty_row, + <hyperlink> TYPE lty_hyperlink, + <mergecell> TYPE lty_mergecell, + <table> TYPE lty_table. + +********************************************************************** +* STEP 1: Fill root node +* + l_worksheet-tabcolor = io_worksheet->tabcolor-rgb. + l_worksheet-summarybelow = io_worksheet->zif_excel_sheet_properties~summarybelow. + l_worksheet-summaryright = io_worksheet->zif_excel_sheet_properties~summaryright. + + IF io_worksheet->sheet_setup->fit_to_page IS NOT INITIAL. + l_worksheet-fittopage = lc_one. + ENDIF. + + l_worksheet-dimension = io_worksheet->get_dimension_range( ). + + IF io_worksheet->zif_excel_sheet_properties~show_zeros EQ abap_true. + l_worksheet-showzeros = lc_one. + ELSE. + l_worksheet-showzeros = lc_zero. + ENDIF. + + IF iv_active = abap_true + OR io_worksheet->zif_excel_sheet_properties~selected EQ abap_true. + l_worksheet-tabselected = lc_one. + ELSE. + l_worksheet-tabselected = lc_zero. + ENDIF. + + IF io_worksheet->zif_excel_sheet_properties~zoomscale GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale = 10. + ENDIF. + l_worksheet-zoomscale = io_worksheet->zif_excel_sheet_properties~zoomscale. + + IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_normal LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_normal = 10. + ENDIF. + l_worksheet-zoomscalenormal = io_worksheet->zif_excel_sheet_properties~zoomscale_normal. + ENDIF. + + IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 10. + ENDIF. + l_worksheet-zoomscalepageview = io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview. + ENDIF. + + IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview NE 0. + IF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview GT 400. + io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 400. + ELSEIF io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview LT 10. + io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 10. + ENDIF. + l_worksheet-zoomscalesheetview = io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview. + ENDIF. + + l_worksheet-workbookviewid = lc_zero. + + IF io_worksheet->show_gridlines = abap_true. + l_worksheet-showgridlines = lc_one. + ELSE. + l_worksheet-showgridlines = lc_zero. + ENDIF. + + IF io_worksheet->show_rowcolheaders = abap_true. + l_worksheet-showrowcolheaders = lc_one. + ELSE. + l_worksheet-showrowcolheaders = lc_zero. + ENDIF. + +* +* Freeze +* + io_worksheet->get_freeze_cell( + IMPORTING ep_row = lv_freeze_cell_row + ep_column = lv_freeze_cell_column ). + + IF lv_freeze_cell_row IS NOT INITIAL AND lv_freeze_cell_column IS NOT INITIAL. + IF lv_freeze_cell_row > 1. + l_worksheet-ysplit = lv_freeze_cell_row - 1. + ENDIF. + + IF lv_freeze_cell_column > 1. + lv_value = lv_freeze_cell_column - 1. + l_worksheet-xsplit = lv_freeze_cell_row - 1. + 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. + l_worksheet-topleftcell = lv_value. + + l_worksheet-activepane = 'bottomRight'. + l_worksheet-state = 'frozen'. + ENDIF. + + l_worksheet-activecell = io_worksheet->get_active_cell( ). + +* +* Row and column info +* + column_dimensions[] = io_worksheet->get_column_dimensions( ). + row_dimensions[] = io_worksheet->get_row_dimensions( ). + + IF NOT column_dimensions IS INITIAL. + io_worksheet->calculate_column_widths( ). + column_dimensions[] = io_worksheet->get_column_dimensions( ). + ENDIF. + + default_row_dimension = io_worksheet->get_default_row_dimension( ). + IF default_row_dimension IS BOUND. + IF default_row_dimension->get_row_height( ) >= 0. + l_worksheet-customheight = lc_true. + lv_value = default_row_dimension->get_row_height( ). + ELSE. + lv_value = '12.75'. + ENDIF. + ELSE. + lv_value = '12.75'. + ENDIF. + CONDENSE lv_value. + l_worksheet-defaultrowheight = lv_value. + + default_col_dimension = io_worksheet->get_default_column_dimension( ). + IF default_col_dimension IS BOUND. + IF default_col_dimension->get_width( ) >= 0. + l_worksheet-defaultcolwidth = default_col_dimension->get_width( ). + ENDIF. + ENDIF. + + LOOP AT row_dimensions ASSIGNING <row_dimension>. + IF <row_dimension>-row_dimension->get_outline_level( ) > outline_level_row. + l_worksheet-outlinelevelrow = <row_dimension>-row_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + + LOOP AT column_dimensions ASSIGNING <column_dimension>. + IF <column_dimension>-column_dimension->get_outline_level( ) > outline_level_col. + l_worksheet-outlinelevelcol = <column_dimension>-column_dimension->get_outline_level( ). + ENDIF. + ENDLOOP. + +* +* Set column information (width, style, ...) +* + LOOP AT column_dimensions ASSIGNING <column_dimension>. + APPEND INITIAL LINE TO l_worksheet-cols ASSIGNING <col>. + <col>-min = <col>-max = <column_dimension>-column_dimension->get_column_index( ). + <col>-width = <column_dimension>-column_dimension->get_width( ). + IF <col>-width < 0. + <col>-width = lc_default_col_width. + ENDIF. + IF <column_dimension>-column_dimension->get_visible( ) = abap_false. + <col>-hidden = lc_true. + ENDIF. + IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. + <col>-bestfit = lc_true. + ENDIF. + IF default_col_dimension IS BOUND. + IF <column_dimension>-column_dimension->get_width( ) + <> default_col_dimension->get_width( ). + <col>-customwidth = lc_true. + ENDIF. + ELSE. + <col>-customwidth = lc_true. + ENDIF. + IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. + <col>-collapsed = lc_true. + ENDIF. + <col>-outlinelevel = <column_dimension>-column_dimension->get_outline_level( ). + lv_style_guid = <column_dimension>-column_dimension->get_column_style_guid( ). + <col>-style = me->excel->get_style_index_in_styles( lv_style_guid ) - 1. + ENDLOOP. + +* +* Missing columns +* +* First collect columns that were already handled before. +* The rest has to be inserted now. +* + LOOP AT column_dimensions ASSIGNING <column_dimension>. + lv_column = zcl_excel_common=>convert_column2int( <column_dimension>-column ). + INSERT lv_column INTO TABLE lts_sorted_columns. + ENDLOOP. + +* +* Now find all columns that were missing so far +* + missing_column-first_column = 1. + + LOOP AT lts_sorted_columns INTO lv_column. + IF lv_column > missing_column-first_column. + missing_column-last_column = lv_column - 1. + APPEND missing_column TO t_missing_columns. + ENDIF. + missing_column-first_column = lv_column + 1. + ENDLOOP. + + missing_column-last_column = zcl_excel_common=>c_excel_sheet_max_col. + APPEND missing_column TO t_missing_columns. + +* +* Now apply stylesetting and other defaults +* + LOOP AT t_missing_columns INTO missing_column. + APPEND INITIAL LINE TO l_worksheet-cols ASSIGNING <col>. + <col>-min = missing_column-first_column. + <col>-max = missing_column-last_column. + IF default_col_dimension IS BOUND AND default_col_dimension->get_width( ) >= 0. + <col>-width = default_col_dimension->get_width( ). + ELSE. + <col>-width = lc_default_col_width. + ENDIF. + lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). + <col>-style = me->excel->get_style_index_in_styles( lv_style_guid ) - 1. + ENDLOOP. + +* +* Build table to hold all table-areas attached to this sheet +* + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). + ls_table_area-left = zcl_excel_common=>convert_column2int( lo_table->settings-top_left_column ). + ls_table_area-right = lo_table->get_right_column_integer( ). + ls_table_area-top = lo_table->settings-top_left_row. + ls_table_area-bottom = lo_table->get_bottom_row_integer( ). + INSERT ls_table_area INTO TABLE lt_table_areas. + ENDWHILE. + +* +* Build sheet data node +* +* Spans is constant amongst all rows +* + col_count = io_worksheet->get_highest_column( ). + lv_spans = col_count. + CONCATENATE '1:' lv_spans INTO lv_spans. + CONDENSE lv_spans. + + LOOP AT io_worksheet->sheet_content ASSIGNING <sheet_content>. + + IF ls_last_row-cell_row NE <sheet_content>-cell_row. +* +* Fill row information. +* Cell data is filled in by callback GET_CELLS called from transformation +* + lv_index = sy-tabix. + APPEND INITIAL LINE TO l_worksheet-rows ASSIGNING <row>. + <row>-row = <sheet_content>-cell_row. + <row>-index = lv_index. + <row>-spans = lv_spans. + +* +* Row dimension attributes +* + row_dimension = io_worksheet->get_row_dimension( <sheet_content>-cell_row ). + IF row_dimension->get_visible( ) = abap_false. + <row>-hidden = lc_true. + ENDIF. + + IF row_dimension->get_row_height( ) >= 0. + <row>-customheight = lc_one. + <row>-height = row_dimension->get_row_height( ). + ENDIF. + +* +* Collapsed +* + IF row_dimension->get_collapsed( ) = abap_true. + <row>-collapsed = lc_true. + ENDIF. + +* +* Outline level +* + <row>-outlinelevel = row_dimension->get_outline_level( ). + +* +* Style +* + <row>-style = row_dimension->get_xf_index( ). + IF <row>-style <> 0. + <row>-customformat = lc_one. + ENDIF. + ENDIF. + + ls_last_row = <sheet_content>. + ENDLOOP. + +* +* Merged cells +* + lt_range_merge = io_worksheet->get_merge( ). + IF lt_range_merge IS NOT INITIAL. + l_worksheet-mergecells_count = lines( lt_range_merge ). + + LOOP AT lt_range_merge ASSIGNING <range_merge>. + APPEND INITIAL LINE TO l_worksheet-mergecells ASSIGNING <mergecell>. + <mergecell>-ref = <range_merge>. + io_worksheet->delete_merge( ). + ENDLOOP. + ENDIF. + +* +* Hyperlinks +* + l_worksheet-hyperlinks_count = io_worksheet->get_hyperlinks_size( ). + IF l_worksheet-hyperlinks_count > 0. + lo_iterator = io_worksheet->get_hyperlinks_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_link ?= lo_iterator->if_object_collection_iterator~get_next( ). + + APPEND INITIAL LINE TO l_worksheet-hyperlinks ASSIGNING <hyperlink>. + <hyperlink>-ref = lo_link->get_ref( ). + IF lo_link->is_internal( ) = abap_true. + <hyperlink>-location = lo_link->get_url( ). + ELSE. + ADD 1 TO lv_relation_id. + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO lv_value. + <hyperlink>-r_id = lv_value. + ENDIF. + ENDWHILE. + ENDIF. + +* +* Print options +* + IF io_worksheet->print_gridlines = abap_true. + l_worksheet-printoptions-gridlines = lc_true. + ENDIF. + + IF io_worksheet->sheet_setup->horizontal_centered = abap_true. + l_worksheet-printoptions-horizontalcentered = lc_true. + ENDIF. + + IF io_worksheet->sheet_setup->vertical_centered = abap_true. + l_worksheet-printoptions-verticalcentered = lc_true. + ENDIF. + +* +* Page margins +* + l_worksheet-pagemargins-left = io_worksheet->sheet_setup->margin_left. + l_worksheet-pagemargins-right = io_worksheet->sheet_setup->margin_right. + l_worksheet-pagemargins-top = io_worksheet->sheet_setup->margin_top. + l_worksheet-pagemargins-bottom = io_worksheet->sheet_setup->margin_bottom. + l_worksheet-pagemargins-header = io_worksheet->sheet_setup->margin_header. + l_worksheet-pagemargins-footer = io_worksheet->sheet_setup->margin_footer. + +* +* Page setup +* + l_worksheet-pagesetup-cellcomments = io_worksheet->sheet_setup->cell_comments. + l_worksheet-pagesetup-copies = io_worksheet->sheet_setup->copies. + l_worksheet-pagesetup-firstpagenumber = io_worksheet->sheet_setup->first_page_number. + l_worksheet-pagesetup-fittopage = io_worksheet->sheet_setup->fit_to_page. + l_worksheet-pagesetup-fittoheight = io_worksheet->sheet_setup->fit_to_height. + l_worksheet-pagesetup-fittowidth = io_worksheet->sheet_setup->fit_to_width. + l_worksheet-pagesetup-horizontaldpi = io_worksheet->sheet_setup->horizontal_dpi. + l_worksheet-pagesetup-orientation = io_worksheet->sheet_setup->orientation. + l_worksheet-pagesetup-pageorder = io_worksheet->sheet_setup->page_order. + l_worksheet-pagesetup-paperheight = io_worksheet->sheet_setup->paper_height. + l_worksheet-pagesetup-papersize = io_worksheet->sheet_setup->paper_size. + l_worksheet-pagesetup-paperwidth = io_worksheet->sheet_setup->paper_width. + l_worksheet-pagesetup-scale = io_worksheet->sheet_setup->scale. + l_worksheet-pagesetup-usefirstpagenumber = io_worksheet->sheet_setup->use_first_page_num. + l_worksheet-pagesetup-verticaldpi = io_worksheet->sheet_setup->vertical_dpi. + + IF io_worksheet->sheet_setup->black_and_white IS NOT INITIAL. + l_worksheet-pagesetup-blackandwhite = lc_one. + ENDIF. + + IF io_worksheet->sheet_setup->draft IS NOT INITIAL. + l_worksheet-pagesetup-draft = lc_one. + ENDIF. + + IF io_worksheet->sheet_setup->errors IS NOT INITIAL. + l_worksheet-pagesetup-errors = io_worksheet->sheet_setup->errors. + ENDIF. + + IF io_worksheet->sheet_setup->use_printer_defaults IS NOT INITIAL. + l_worksheet-pagesetup-useprinterdefaults = lc_one. + ENDIF. + +* +* Header and footer +* + IF io_worksheet->sheet_setup->diff_oddeven_headerfooter = abap_true. + l_worksheet-headerfooter-differentoddeven = lc_one. + ENDIF. + + io_worksheet->sheet_setup->get_header_footer_string( + IMPORTING + ep_odd_header = l_worksheet-headerfooter-oddheader + ep_odd_footer = l_worksheet-headerfooter-oddfooter + ep_even_header = l_worksheet-headerfooter-evenheader + ep_even_footer = l_worksheet-headerfooter-evenfooter ). + +* +* Drawings +* + lo_drawings = io_worksheet->get_drawings( ). + IF lo_drawings->is_empty( ) = abap_false. + ADD 1 TO lv_relation_id. + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO l_worksheet-drawings. + ENDIF. + +* +* Tables +* + l_worksheet-tables_count = io_worksheet->get_tables_size( ). + IF l_worksheet-tables_count > 0. + lo_iterator = io_worksheet->get_tables_iterator( ). + WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. + lo_table ?= lo_iterator->if_object_collection_iterator~get_next( ). + APPEND INITIAL LINE TO l_worksheet-tables ASSIGNING <table>. + ADD 1 TO lv_relation_id. + lv_value = lv_relation_id. + CONDENSE lv_value. + CONCATENATE 'rId' lv_value INTO <table>-r_id. + ENDWHILE. + ENDIF. + +********************************************************************** +* STEP 2: Create XML + + me->worksheet = io_worksheet. "Neccessary for callback GET_CELL + + CALL TRANSFORMATION zexcel_tr_sheet + SOURCE worksheet = l_worksheet + cells = me->cells + writer = me + OPTIONS xml_header = 'full' + RESULT XML ep_content. + +ENDMETHOD. "CREATE_XL_SHEET + + + + + METHOD get_cells. +* +* Callback method from transformation ZEXCEL_TR_SHEET +* +* The method fills the data cells for each row. +* This saves memory if there are many rows. +* + DATA: + lv_cell_style TYPE zexcel_cell_style. + + FIELD-SYMBOLS: + <cell> TYPE ty_cell, + <content> TYPE zexcel_s_cell_data, + <style> TYPE zexcel_s_styles_mapping. + + CLEAR cells. + + LOOP AT worksheet->sheet_content FROM i_index ASSIGNING <content>. + IF <content>-cell_row <> i_row. +* +* End of row +* + EXIT. + ENDIF. + +* +* Determine style index +* + IF lv_cell_style <> <content>-cell_style. + lv_cell_style = <content>-cell_style. + UNASSIGN <style>. + IF lv_cell_style IS NOT INITIAL. + READ TABLE styles_mapping ASSIGNING <style> WITH KEY guid = lv_cell_style. + ENDIF. + ENDIF. +* +* Add a new cell +* + APPEND INITIAL LINE TO cells ASSIGNING <cell>. + <cell>-name = <content>-cell_coords. + <cell>-formula = <content>-cell_formula. + <cell>-type = <content>-data_type. + IF <cell>-type = 's'. + <cell>-value = me->get_shared_string_index( <content>-cell_value ). + ELSE. + <cell>-value = <content>-cell_value. + ENDIF. + IF <style> IS ASSIGNED. + <cell>-style = <style>-style. + ELSE. + <cell>-style = -1. + ENDIF. + + ENDLOOP. + +ENDMETHOD. + + diff --git a/ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk b/ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk new file mode 100644 index 0000000..4fb6d8e --- /dev/null +++ b/ZA2X/XSLT/ZEXCEL_TR_SHARED_STRINGS.slnk @@ -0,0 +1,24 @@ + + + <?sap.transform simple?> +<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"> + + <tt:root name="ROOT"/> + <tt:root name="SHARED_STRINGS"/> + + <tt:template> + <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> + <tt:attribute name="count" value-ref="ROOT.COUNT"/> + <tt:attribute name="uniqueCount" value-ref="ROOT.UNIQUE_COUNT"/> + <tt:loop ref="SHARED_STRINGS"> + <si> + <t> + <tt:value ref="STRING_VALUE"/> + </t> + </si> + </tt:loop> + </sst> + </tt:template> + +</tt:transform> + diff --git a/ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk b/ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk new file mode 100644 index 0000000..e575d35 --- /dev/null +++ b/ZA2X/XSLT/ZEXCEL_TR_SHEET.slnk @@ -0,0 +1,309 @@ + + + <?sap.transform simple?> +<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> + + <tt:root name="WORKSHEET"/> + <tt:root name="CELLS"/> + <tt:root name="WRITER"/> + <tt:variable name="owriter" ref-type="ZCL_EXCEL_WRITER_HUGE_FILE"/> + + <tt:template> + <tt:assign ref="WRITER" to-var="owriter"/> + <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" + mc:Ignorable="x14ac"> + <tt:namespace name="r" /> + <tt:namespace name="mc" /> + <tt:namespace name="x14ac" /> + <sheetPr> + <tt:cond check="not-initial(WORKSHEET.TABCOLOR)"> + <tabColor> + <tt:attribute name="rgb" value-ref="WORKSHEET.TABCOLOR" /> + </tabColor> + </tt:cond> + <outlinePr> + <tt:attribute name="summaryRight" value-ref="WORKSHEET.SUMMARYRIGHT" /> + <tt:attribute name="summaryBelow" value-ref="WORKSHEET.SUMMARYBELOW" /> + </outlinePr> + </sheetPr> + <tt:cond check="not-initial(WORKSHEET.FITTOPAGE)"> + <pageSetupPr> + <tt:attribute name="fitToPage" value-ref="WORKSHEET.FITTOPAGE" /> + </pageSetupPr> + </tt:cond> + <dimension> + <tt:attribute name="ref" value-ref="WORKSHEET.DIMENSION" /> + </dimension> + <sheetViews> + <sheetView> + <tt:attribute name="showZeros" value-ref="WORKSHEET.SHOWZEROS" /> + <tt:attribute name="tabSelected" value-ref="WORKSHEET.TABSELECTED" /> + <tt:attribute name="zoomScale" value-ref="WORKSHEET.ZOOMSCALE" /> + <tt:cond check="WORKSHEET.ZOOMSCALENORMAL != 0"> + <tt:attribute name="zoomScaleNormal" value-ref="WORKSHEET.ZOOMSCALENORMAL" /> + </tt:cond> + <tt:cond check="WORKSHEET.ZOOMSCALEPAGEVIEW != 0"> + <tt:attribute name="zoomScalePageLayoutView" value-ref="WORKSHEET.ZOOMSCALEPAGEVIEW" /> + </tt:cond> + <tt:attribute name="zoomScaleSheetLayoutView" value-ref="WORKSHEET.ZOOMSCALESHEETVIEW" /> + <tt:attribute name="workbookViewId" value-ref="WORKSHEET.WORKBOOKVIEWID" /> + <tt:attribute name="showGridLines" value-ref="WORKSHEET.SHOWGRIDLINES" /> + <tt:attribute name="showRowColHeaders" value-ref="WORKSHEET.SHOWROWCOLHEADERS" /> + <tt:cond check="WORKSHEET.YSPLIT != 0 or WORKSHEET.XSPLIT != 0"> + <pane activePane="bottomRight" state="frozen"> + <tt:cond check="WORKSHEET.YSPLIT != 0"> + <tt:attribute name="ySplit" value-ref="WORKSHEET.YSPLIT" /> + </tt:cond> + <tt:cond check="WORKSHEET.XSPLIT != 0"> + <tt:attribute name="xSplit" value-ref="WORKSHEET.XSPLIT" /> + </tt:cond> + <tt:attribute name="topLeftCell" value-ref="WORKSHEET.TOPLEFTCELL" /> + </pane> + </tt:cond> + <selection> + <tt:attribute name="activeCell" value-ref="WORKSHEET.ACTIVECELL" /> + <tt:attribute name="sqref" value-ref="WORKSHEET.ACTIVECELL" /> + </selection> + </sheetView> + </sheetViews> + <sheetFormatPr> + <tt:attribute name="defaultRowHeight" value-ref="WORKSHEET.DEFAULTROWHEIGHT" /> + <tt:cond check="WORKSHEET.DEFAULTCOLWIDTH != 0"> + <tt:attribute name="defaultColWidth" value-ref="WORKSHEET.DEFAULTCOLWIDTH" /> + </tt:cond> + <tt:attribute name="x14ac:outlineLevelRow" value-ref="WORKSHEET.OUTLINELEVELROW" /> + <tt:attribute name="x14ac:outlineLevelCol" value-ref="WORKSHEET.OUTLINELEVELCOL" /> + </sheetFormatPr> + <cols> + <tt:loop ref="WORKSHEET.COLS"> + <col> + <tt:attribute name="min" value-ref="MIN" /> + <tt:attribute name="max" value-ref="MAX" /> + <tt:attribute name="width" value-ref="WIDTH" /> + <tt:cond check="not-initial(HIDDEN)"> + <tt:attribute name="hidden" value-ref="HIDDEN" /> + </tt:cond> + <tt:cond check="not-initial(CUSTOMWIDTH)"> + <tt:attribute name="customWidth" value-ref="CUSTOMWIDTH" /> + </tt:cond> + <tt:cond check="not-initial(BESTFIT)"> + <tt:attribute name="bestFit" value-ref="BESTFIT" /> + </tt:cond> + <tt:cond check="not-initial(COLLAPSED)"> + <tt:attribute name="collapsed" value-ref="COLLAPSED" /> + </tt:cond> + <tt:cond check="OUTLINELEVEL != 0"> + <tt:attribute name="outlineLevel" value-ref="OUTLINELEVEL" /> + </tt:cond> + <tt:cond check="STYLE >= 0"> + <tt:attribute name="style" value-ref="STYLE" /> + </tt:cond> + </col> + </tt:loop> + </cols> + <sheetData> + <tt:loop ref="WORKSHEET.ROWS"> + <row> + <tt:attribute name="r" value-ref="ROW" /> + <tt:attribute name="spans" value-ref="SPANS" /> + <tt:cond check="not-initial(HIDDEN)"> + <tt:attribute name="hidden" value-ref="HIDDEN" /> + </tt:cond> + <tt:cond check="not-initial(CUSTOMHEIGHT)"> + <tt:attribute name="customHeight" value-ref="CUSTOMHIGHT" /> + <tt:attribute name="ht" value-ref="HIGHT" /> + </tt:cond> + <tt:cond check="not-initial(COLLAPSED)"> + <tt:attribute name="collapsed" value-ref="COLLAPSED" /> + </tt:cond> + <tt:cond check="OUTLINELEVEL != 0"> + <tt:attribute name="outlineLevel" value-ref="OUTLINELEVEL" /> + </tt:cond> + <tt:cond check="STYLE != 0"> + <tt:attribute name="customFormat" value-ref="CUSTOMFORMAT" /> + <tt:attribute name="s" value-ref="STYLE" /> + </tt:cond> + <!-- Aufruf get_cells --> + <tt:call-method s-name="GET_CELLS" var="owriter"> + <tt:with-parameter name="I_ROW" ref="ROW" /> + <tt:with-parameter name="I_INDEX" ref="INDEX" /> + </tt:call-method> + <tt:loop ref=".CELLS"> + <c> + <tt:attribute name="r" value-ref="NAME" /> + <tt:cond check="STYLE >= 0"> + <tt:attribute name="s" value-ref="STYLE" /> + </tt:cond> + <tt:cond check="not-initial(FORMULA)"> + <tt:attribute name="f" value-ref="FORMULA" /> + </tt:cond> + <tt:cond check="not-initial(VALUE) and initial(FORMULA)"> + <tt:attribute name="t" value-ref="TYPE" /> + <tt:cond check="TYPE = 'inlineStr'"> + <is> + <t> + <tt:value ref="VALUE" /> + </t> + </is> + </tt:cond> + <tt:cond check="TYPE != 'inlineStr'"> + <v> + <tt:value ref="VALUE" /> + </v> + </tt:cond> + </tt:cond> + </c> + </tt:loop> + </row> + </tt:loop> + </sheetData> + <tt:cond check="WORKSHEET.MERGECELLS_COUNT != 0"> + <mergeCells> + <tt:attribute name="count" value-ref="WORKSHEET.MERGECELLS_COUNT" /> + <tt:loop ref="WORKSHEET.MERGECELLS"> + <mergeCell> + <tt:attribute name="ref" value-ref="REF" /> + </mergeCell> + </tt:loop> + </mergeCells> + </tt:cond> + <tt:cond check="WORKSHEET.HYPERLINKS_COUNT != 0"> + <hyperlinks> + <tt:loop ref="WORKSHEET.HYPERLINKS"> + <hyperlink> + <tt:attribute name="ref" value-ref="REF" /> + <tt:cond check="not-initial(LOCATION)"> + <tt:attribute name="location" value-ref="LOCATION" /> + </tt:cond> + <tt:cond check="not-initial(R_ID)"> + <tt:attribute name="r:id" value-ref="R_ID" /> + </tt:cond> + </hyperlink> + </tt:loop> + </hyperlinks> + </tt:cond> + <tt:cond check="not-initial(WORKSHEET.PRINTOPTIONS)"> + <printOptions> + <tt:ref name="WORKSHEET.PRINTOPTIONS"> + <tt:cond check="not-initial(GRIDLINES)"> + <tt:attribute name="gridLines" value-ref="GRIDLINES" /> + </tt:cond> + <tt:cond check="not-initial(HORIZONTALCENTERED)"> + <tt:attribute name="horizontalCentered" value-ref="HORIZONTALCENTERED" /> + </tt:cond> + <tt:cond check="not-initial(VERTICALCENTERED)"> + <tt:attribute name="verticalCentered" value-ref="VERTICALCENTERED" /> + </tt:cond> + </tt:ref> + </printOptions> + </tt:cond> + <pageMargins> + <tt:ref name="WORKSHEET.PAGEMARGINS"> + <tt:attribute name="left" value-ref="LEFT" /> + <tt:attribute name="right" value-ref="RIGHT" /> + <tt:attribute name="top" value-ref="TOP" /> + <tt:attribute name="bottom" value-ref="BOTTOM" /> + <tt:attribute name="header" value-ref="HEADER" /> + <tt:attribute name="footer" value-ref="FOOTER" /> + </tt:ref> + </pageMargins> + <pageSetup> + <tt:ref name="WORKSHEET.PAGESETUP"> + <tt:cond check="not-initial(BLACKANDWHITE)"> + <tt:attribute name="blackAndWhite" value-ref="BLACKANDWHITE" /> + </tt:cond> + <tt:cond check="not-initial(CELLCOMMENTS)"> + <tt:attribute name="cellComments" value-ref="CELLCOMMENTS" /> + </tt:cond> + <tt:cond check="COPIES != 0"> + <tt:attribute name="copies" value-ref="COPIES" /> + </tt:cond> + <tt:cond check="not-initial(DRAFT)"> + <tt:attribute name="draft" value-ref="DRAFT" /> + </tt:cond> + <tt:cond check="not-initial(ERRORS)"> + <tt:attribute name="errors" value-ref="ERRORS" /> + </tt:cond> + <tt:cond check="FIRSTPAGENUMBER != 0"> + <tt:attribute name="firstPageNumber" value-ref="FIRSTPAGENUMBER" /> + </tt:cond> + <tt:cond check="not-initial(FITTOPAGE)"> + <tt:attribute name="fitToHeight" value-ref="FITTOHIGHT" /> + <tt:attribute name="fitToWidth" value-ref="FITTOWIDTH" /> + </tt:cond> + <tt:cond check="HORIZONTALDPI != 0"> + <tt:attribute name="horizontalDpi" value-ref="HORIZONTALDPI" /> + </tt:cond> + <tt:cond check="not-initial(ORIENTATION)"> + <tt:attribute name="orientation" value-ref="ORIENTATION" /> + </tt:cond> + <tt:cond check="not-initial(PAGEORDER)"> + <tt:attribute name="pageOrder" value-ref="PAGEORDER" /> + </tt:cond> + <tt:cond check="not-initial(PAPERHEIGHT)"> + <tt:attribute name="paperHeight" value-ref="PAPERHEIGHT" /> + </tt:cond> + <tt:cond check="PAPERSIZE != 0"> + <tt:attribute name="paperSize" value-ref="PAPERSIZE" /> + </tt:cond> + <tt:cond check="not-initial(PAPERWIDTH)"> + <tt:attribute name="paperWidth" value-ref="PAPERWIDTH" /> + </tt:cond> + <tt:cond check="SCALE != 0"> + <tt:attribute name="scale" value-ref="SCALE" /> + </tt:cond> + <tt:cond check="not-initial(USEFIRSTPAGENUMBER)"> + <tt:attribute name="useFirstPageNumber" value-ref="USEFIRSTPAGENUMBER" /> + </tt:cond> + <tt:cond check="not-initial(USEPRINTERDEFAULTS)"> + <tt:attribute name="usePrinterDefaults" value-ref="USEPRINTERDEFAULTS" /> + </tt:cond> + <tt:cond check="VERTICALDPI != 0"> + <tt:attribute name="verticalDpi" value-ref="VERTICALDPI" /> + </tt:cond> + </tt:ref> + </pageSetup> + <tt:cond check="not-initial(WORKSHEET.HEADERFOOTER)"> + <headerFooter> + <tt:ref name="WORKSHEET.HEADERFOOTER"> + <tt:cond check="not-initial(WORKSHEET.HEADERFOOTER)"> + <tt:attribute name="differentOddEven" value-ref="DIFFERENTODDEVEN" /> + </tt:cond> + <oddHeader> + <tt:value ref="ODDHEADER" /> + </oddHeader> + <oddFooter> + <tt:value ref="ODDFOOTER" /> + </oddFooter> + <evenHeader> + <tt:value ref="EVENHEADER" /> + </evenHeader> + <evenFooter> + <tt:value ref="EVENFOOTER" /> + </evenFooter> + </tt:ref> + </headerFooter> + </tt:cond> + <tt:cond check="not-initial(WORKSHEET.DRAWINGS)"> + <drawing> + <tt:attribute name="r:id" value-ref="WORKSHEET.DRAWINGS" /> + </drawing> + </tt:cond> + <tt:cond check="WORKSHEET.TABLES_COUNT != 0"> + <mergeCells> + <tt:attribute name="count" value-ref="WORKSHEET.TABLES_COUNT" /> + <tt:loop ref="WORKSHEET.TABLES"> + <tablePart> + <tt:attribute name="r:id" value-ref="R_ID" /> + </tablePart> + </tt:loop> + </mergeCells> + </tt:cond> + </worksheet> + </tt:template> +</tt:transform> +