Merge pull request #595 from mfallen/headerfooter

Header Footer Image
This commit is contained in:
Gregor Wolf 2019-02-19 10:55:44 +01:00 committed by GitHub
commit 09b6b5f162
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 831 additions and 37 deletions

View File

@ -205,6 +205,8 @@ method ADD_NEW_DRAWING.
CASE ip_type.
WHEN 'image'.
drawings->add( eo_drawing ).
WHEN 'hd_ft'.
drawings->add( eo_drawing ).
WHEN 'chart'.
charts->add( eo_drawing ).
ENDCASE.

View File

@ -5,6 +5,12 @@ class ZCL_EXCEL_DRAWING definition
public section.
*"* public components of class ZCL_EXCEL_DRAWING
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_DRAWING
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_DRAWING
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_DRAWING
*"* do not include other source files here!!!
type-pools ABAP .
@ -12,7 +18,7 @@ public section.
constants C_GRAPH_LINE type ZEXCEL_GRAPH_TYPE value 2. "#EC NOTEXT
constants C_GRAPH_BARS type ZEXCEL_GRAPH_TYPE value 0. "#EC NOTEXT
data GRAPH_TYPE type ZEXCEL_GRAPH_TYPE .
data TITLE type STRING value 'image1.jpg'. "#EC NOTEXT . . . . . . . . . . . . " .
data TITLE type STRING value 'image1.jpg'. "#EC NOTEXT
data X_REFERENCES type CHAR1 .
data Y_REFERENCES type CHAR1 .
constants TYPE_IMAGE type ZEXCEL_DRAWING_TYPE value 'image'. "#EC NOTEXT
@ -24,6 +30,7 @@ public section.
constants C_MEDIA_TYPE_BMP type STRING value 'bmp'. "#EC NOTEXT
constants C_MEDIA_TYPE_XML type STRING value 'xml'. "#EC NOTEXT
constants C_MEDIA_TYPE_JPG type STRING value 'jpg'. "#EC NOTEXT
constants TYPE_IMAGE_HEADER_FOOTER type ZEXCEL_DRAWING_TYPE value 'hd_ft'. "#EC NOTEXT
methods CONSTRUCTOR
importing
@ -118,12 +125,6 @@ public section.
methods LOAD_CHART_ATTRIBUTES
importing
value(IP_CHART) type ref to IF_IXML_DOCUMENT .
*"* protected components of class ZCL_EXCEL_DRAWING
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_DRAWING
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_DRAWING
*"* do not include other source files here!!!
protected section.
private section.

View File

@ -571,6 +571,12 @@
<LANGU>I</LANGU>
<DESCRIPT>Excel Drawing type</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_DRAWING</CLSNAME>
<CMPNAME>TYPE_IMAGE_HEADER_FOOTER</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Excel Drawing type</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_DRAWING</CLSNAME>
<CMPNAME>X_REFERENCES</CMPNAME>

View File

@ -144,6 +144,12 @@ public section.
!EP_ODD_FOOTER type STRING
!EP_EVEN_HEADER type STRING
!EP_EVEN_FOOTER type STRING .
methods GET_HEADER_FOOTER
exporting
!EP_ODD_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT
!EP_ODD_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT
!EP_EVEN_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT
!EP_EVEN_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT .
protected section.
*"* protected components of class ZCL_EXCEL_SHEET_SETUP
@ -198,7 +204,34 @@ method CONSTRUCTOR.
endmethod.
method GET_HEADER_FOOTER_STRING.
METHOD get_header_footer.
* Only Basic font/text formatting possible:
* Bold (yes / no), Font Type, Font Size
*
* usefull placeholders, which can be used in header/footer value strings
* '&P' - page number
* '&N' - total number of pages
* '&D' - Date
* '&T' - Time
* '&F' - File Name
* '&Z' - Path
* '&A' - Sheet name
* new line via class constant CL_ABAP_CHAR_UTILITIES=>newline
*
* Example Value String 'page &P of &N'
*
* DO NOT USE &L , &C or &R which automatically created as position markers
ep_odd_header = me->odd_header.
ep_odd_footer = me->odd_footer.
ep_even_header = me->even_header.
ep_even_footer = me->even_footer.
ENDMETHOD.
METHOD get_header_footer_string.
* ----------------------------------------------------------------------
DATA: lc_marker_left(2) TYPE c VALUE '&L'
, lc_marker_right(2) TYPE c VALUE '&R'
@ -223,6 +256,19 @@ method GET_HEADER_FOOTER_STRING.
CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_odd_header.
ENDIF.
IF me->odd_header-left_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_left lv_value INTO ep_odd_header.
ENDIF.
IF me->odd_header-center_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_center lv_value INTO ep_odd_header.
ENDIF.
IF me->odd_header-right_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_odd_header.
ENDIF.
ENDIF.
* ----------------------------------------------------------------------
IF ep_odd_footer IS SUPPLIED.
@ -242,6 +288,19 @@ method GET_HEADER_FOOTER_STRING.
CONCATENATE ep_odd_footer lc_marker_right lv_value INTO ep_odd_footer.
ENDIF.
IF me->odd_footer-left_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_left lv_value INTO ep_odd_footer.
ENDIF.
IF me->odd_footer-center_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_center lv_value INTO ep_odd_footer.
ENDIF.
IF me->odd_footer-right_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_odd_footer.
ENDIF.
ENDIF.
* ----------------------------------------------------------------------
IF ep_even_header IS SUPPLIED.
@ -261,6 +320,19 @@ method GET_HEADER_FOOTER_STRING.
CONCATENATE ep_even_header lc_marker_right lv_value INTO ep_even_header.
ENDIF.
IF me->even_header-left_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_left lv_value INTO ep_even_header.
ENDIF.
IF me->even_header-center_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_center lv_value INTO ep_even_header.
ENDIF.
IF me->even_header-right_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_even_header.
ENDIF.
ENDIF.
* ----------------------------------------------------------------------
IF ep_even_footer IS SUPPLIED.
@ -280,12 +352,25 @@ method GET_HEADER_FOOTER_STRING.
CONCATENATE ep_even_footer lc_marker_right lv_value INTO ep_even_footer.
ENDIF.
IF me->even_footer-left_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_left lv_value INTO ep_even_footer.
ENDIF.
IF me->even_footer-center_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_center lv_value INTO ep_even_footer.
ENDIF.
IF me->even_footer-right_image IS NOT INITIAL.
lv_value = '&G'.
CONCATENATE ep_odd_header lc_marker_right lv_value INTO ep_even_footer.
ENDIF.
ENDIF.
* ----------------------------------------------------------------------
endmethod.
ENDMETHOD.
method PROCESS_HEADER_FOOTER.
METHOD process_header_footer.
* ----------------------------------------------------------------------
* Only Basic font/text formatting possible:
@ -308,6 +393,10 @@ method PROCESS_HEADER_FOOTER.
IF <ls_font> IS ASSIGNED AND <lv_value> IS ASSIGNED.
IF <lv_value> = '&G'. "image header
rv_processed_string = <lv_value>.
ELSE.
IF <ls_font>-name IS NOT INITIAL.
CONCATENATE '&"' <ls_font>-name ',' INTO rv_processed_string.
ELSE.
@ -326,11 +415,11 @@ method PROCESS_HEADER_FOOTER.
ENDIF.
CONCATENATE rv_processed_string <lv_value> INTO rv_processed_string.
ENDIF.
ENDIF.
* ----------------------------------------------------------------------
endmethod.
ENDMETHOD.
method SET_HEADER_FOOTER.

View File

@ -31,8 +31,10 @@ protected section.
data SHARED_STRINGS type ZEXCEL_T_SHARED_STRING .
data STYLES_COND_MAPPING type ZEXCEL_T_STYLES_COND_MAPPING .
data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING .
constants C_XL_COMMENTS type STRING value 'xl/comments#.xml' ##NO_TEXT.
constants CL_XL_DRAWING_FOR_COMMENTS type STRING value 'xl/drawings/vmlDrawing#.vml' ##NO_TEXT.
constants C_XL_COMMENTS type STRING value 'xl/comments#.xml'. "#EC NOTEXT
constants CL_XL_DRAWING_FOR_COMMENTS type STRING value 'xl/drawings/vmlDrawing#.vml'. "#EC NOTEXT
constants C_XL_DRAWINGS_VML type STRING value 'xl/drawings/vmlDrawing1.vml'. "#EC NOTEXT
constants C_XL_DRAWINGS_VML_RELS type STRING value 'xl/drawings/_rels/vmlDrawing1.vml.rels'. "#EC NOTEXT
methods CREATE_XL_SHEET_SHEET_DATA
importing
@ -158,6 +160,25 @@ protected section.
!IV_IXML_ELEMENT type ref to IF_IXML_ELEMENT
returning
value(RV_XSTRING) type XSTRING .
methods CREATE_XL_DRAWINGS_VML
returning
value(EP_CONTENT) type XSTRING .
methods SET_VML_STRING
returning
value(EP_CONTENT) type STRING .
methods CREATE_XL_DRAWINGS_VML_RELS
returning
value(EP_CONTENT) type XSTRING .
methods SET_VML_SHAPE_FOOTER
importing
!IS_FOOTER type ZEXCEL_S_WORKSHEET_HEAD_FOOT
returning
value(EP_CONTENT) type STRING .
methods SET_VML_SHAPE_HEADER
importing
!IS_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT
returning
value(EP_CONTENT) type STRING .
private section.
*"* private components of class ZCL_EXCEL_WRITER_2007
@ -183,7 +204,7 @@ METHOD add_further_data_to_zip.
ENDMETHOD.
method CREATE.
METHOD create.
* Office 2007 file format is a cab of several xml files with extension .xlsx
@ -378,12 +399,14 @@ method CREATE.
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
* IF lo_drawing->get_type( ) NE zcl_excel_drawing=>type_image_header_footer.
lv_content = lo_drawing->get_media( ).
lv_value = lo_drawing->get_media_name( ).
CONCATENATE 'xl/media/' lv_value INTO lv_value.
lo_zip->add( name = lv_value
content = lv_content ).
* ENDIF.
ENDWHILE.
**********************************************************************
@ -410,6 +433,20 @@ method CREATE.
"-------------------------------------------------
ENDWHILE.
**********************************************************************
*** Header Footer Image
*** Thanks to Marios Toumanis for the hints!
lv_content = me->create_xl_drawings_vml( ).
lo_zip->add( name = me->c_xl_drawings_vml
content = lv_content ).
lv_content = me->create_xl_drawings_vml_rels( ).
lv_xl_drawing_rels = me->c_xl_drawings_vml_rels.
lo_zip->add( name = lv_xl_drawing_rels
content = lv_content ).
**********************************************************************
**********************************************************************
* Second to last step: Allow further information put into the zip archive by child classes
me->add_further_data_to_zip( lo_zip ).
@ -417,7 +454,7 @@ method CREATE.
* Last step: Create the final zip
ep_excel = lo_zip->save( ).
endmethod.
ENDMETHOD.
method CREATE_CONTENT_TYPES.
@ -2591,6 +2628,137 @@ method CREATE_XL_DRAWINGS_RELS.
endmethod.
METHOD create_xl_drawings_vml.
DATA:
lo_xml_document TYPE REF TO cl_xml_document,
ld_stream TYPE string.
* INIT_RESULT
CLEAR ep_content.
* BODY
ld_stream = set_vml_string( ).
CREATE OBJECT lo_xml_document.
CALL METHOD lo_xml_document->parse_string
EXPORTING
stream = ld_stream.
* CALL FUNCTION 'CRM_IC_XML_STRING2XSTRING'
* EXPORTING
* instring = ld_stream
* IMPORTING
* outxstring = ep_content.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = ld_stream
IMPORTING
buffer = ep_content
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR ep_content.
ENDIF.
ENDMETHOD.
METHOD create_xl_drawings_vml_rels.
** Constant node name
DATA: lc_xml_node_relationships TYPE string VALUE 'Relationships',
lc_xml_node_relationship TYPE string VALUE 'Relationship',
" Node attributes
lc_xml_attr_id TYPE string VALUE 'Id',
lc_xml_attr_type TYPE string VALUE 'Type',
lc_xml_attr_target TYPE string VALUE 'Target',
" Node namespace
lc_xml_node_rels_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/relationships',
lc_xml_node_rid_image_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
lc_xml_node_rid_chart_tp TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart'.
DATA: lo_iterator TYPE REF TO cl_object_collection_iterator,
lo_drawing TYPE REF TO zcl_excel_drawing,
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_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,
lv_value TYPE string,
lv_relation_id TYPE i.
* BODY
**********************************************************************
* STEP 1: Create [Content_Types].xml into the root of the ZIP
lo_ixml = cl_ixml=>create( ).
**********************************************************************
* STEP 2: Set document attributes
lo_encoding = lo_ixml->create_encoding( byte_order = if_ixml_encoding=>co_platform_endian
character_set = 'utf-8' ).
lo_document = lo_ixml->create_document( ).
lo_document->set_encoding( lo_encoding ).
lo_document->set_standalone( abap_true ).
**********************************************************************
* STEP 3: Create main node relationships
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_relationships
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_rels_ns ).
**********************************************************************
* STEP 4: Create subnodes
lv_relation_id = 0.
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
IF lo_drawing->get_type( ) = zcl_excel_drawing=>type_image_header_footer.
ADD 1 TO lv_relation_id.
lv_value = lv_relation_id.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_id
* value = 'LOGO' ).
value = lv_value ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_image_tp ).
lv_value = '../media/#'.
REPLACE '#' IN lv_value WITH lo_drawing->get_media_name( ).
lo_element->set_attribute_ns( name = lc_xml_attr_target
* value = '../media/LOGO.png' ).
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
ENDIF.
ENDWHILE.
**********************************************************************
* STEP 5: Create xstring stream
lo_streamfactory = lo_ixml->create_stream_factory( ).
lo_ostream = lo_streamfactory->create_ostream_xstring( string = ep_content ).
lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ).
lo_renderer->render( ).
ENDMETHOD.
method CREATE_XL_DRAWING_ANCHOR.
** Constant node name
@ -3503,6 +3671,12 @@ METHOD create_xl_sheet.
lc_xml_node_mergecells TYPE string VALUE 'mergeCells',
lc_xml_node_drawing TYPE string VALUE 'drawing',
lc_xml_node_drawing_for_cmt TYPE string VALUE 'legacyDrawing',
**********************************************************************
lc_xml_node_drawing_for_hd_ft TYPE string VALUE 'legacyDrawingHF',
**********************************************************************
lc_xml_node_headerfooter TYPE string VALUE 'headerFooter',
lc_xml_node_oddheader TYPE string VALUE 'oddHeader',
lc_xml_node_oddfooter TYPE string VALUE 'oddFooter',
@ -5068,6 +5242,30 @@ METHOD create_xl_sheet.
ENDIF.
* End - Add - Issue #180
* Header/Footer Image
DATA: lo_drawing TYPE REF TO zcl_excel_drawing.
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
IF lo_drawing->get_type( ) = zcl_excel_drawing=>type_image_header_footer.
lo_element = lo_document->create_simple_element( name = lc_xml_node_drawing_for_hd_ft
parent = lo_document ).
ADD 1 TO lv_relation_id. " +1 for legacyDrawings
lv_value = lv_relation_id.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element->set_attribute( name = 'r:id'
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
ADD 1 TO lv_relation_id. " +1 for comments (not referenced in XL sheet but let's reserve the rId)
EXIT.
ENDIF.
ENDWHILE.
*
* tables
DATA lv_table_count TYPE i.
@ -5356,6 +5554,46 @@ METHOD create_xl_sheet_rels.
ENDIF.
* End - Add - Issue #180
**********************************************************************
* header footer image
DATA: lo_drawing TYPE REF TO zcl_excel_drawing.
lo_comments = io_worksheet->get_comments( ).
IF lo_comments->is_empty( ) = abap_true.
* lv_relation_id = 0.
lv_relation_id = iv_drawing_index.
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ).
WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->if_object_collection_iterator~get_next( ).
IF lo_drawing->get_type( ) = zcl_excel_drawing=>type_image_header_footer.
ADD 1 TO lv_relation_id.
" Drawing for comment/header/footer
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ).
lv_value = lv_relation_id.
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
lo_element->set_attribute_ns( name = lc_xml_attr_id
value = lv_value ).
lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_drawing_cmt_tp ).
lv_index_str = iv_comment_index.
CONDENSE lv_index_str NO-GAPS.
MOVE me->cl_xl_drawing_for_comments TO lv_value.
REPLACE 'xl' WITH '..' INTO lv_value.
REPLACE '#' WITH lv_index_str INTO lv_value.
lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
EXIT.
ENDIF.
ENDWHILE.
ENDIF.
*** End Header Footer
**********************************************************************
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( ).
@ -7441,6 +7679,293 @@ METHOD render_ixml_element_no_header.
ENDMETHOD.
METHOD set_vml_shape_footer.
CONSTANTS: lc_shape TYPE string VALUE '<v:shape id="{ID}" o:spid="_x0000_s1025" type="#_x0000_t75" style=''position:absolute;margin-left:0;margin-top:0;width:{WIDTH}pt;height:{HEIGHT}pt; z-index:1''>',
lc_shape_image TYPE string VALUE '<v:imagedata o:relid="{RID}" o:title="Logo Title"/><o:lock v:ext="edit" rotation="t"/></v:shape>',
lc_shape_header_center TYPE string VALUE 'CH',
lc_shape_header_left TYPE string VALUE 'LH',
lc_shape_header_right TYPE string VALUE 'RH',
lc_shape_footer_center TYPE string VALUE 'CF',
lc_shape_footer_left TYPE string VALUE 'LF',
lc_shape_footer_right TYPE string VALUE 'RF'.
DATA: lv_content_left TYPE string,
lv_content_center TYPE string,
lv_content_right TYPE string,
lv_content_image_left TYPE string,
lv_content_image_center TYPE string,
lv_content_image_right TYPE string,
lv_value TYPE string,
ls_drawing_position TYPE zexcel_drawing_position.
IF is_footer-left_image IS NOT INITIAL.
lv_content_left = lc_shape.
REPLACE '{ID}' IN lv_content_left WITH lc_shape_footer_left.
ls_drawing_position = is_footer-left_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{HEIGHT}' IN lv_content_left WITH lv_value.
IF ls_drawing_position-size-width IS NOT INITIAL.
lv_value = ls_drawing_position-size-width.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{WIDTH}' IN lv_content_left WITH lv_value.
lv_content_image_left = lc_shape_image.
lv_value = is_footer-left_image->get_index( ).
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
REPLACE '{RID}' IN lv_content_image_left WITH lv_value.
ENDIF.
IF is_footer-center_image IS NOT INITIAL.
lv_content_center = lc_shape.
REPLACE '{ID}' IN lv_content_center WITH lc_shape_footer_center.
ls_drawing_position = is_footer-left_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{HEIGHT}' IN lv_content_center WITH lv_value.
IF ls_drawing_position-size-width IS NOT INITIAL.
lv_value = ls_drawing_position-size-width.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{WIDTH}' IN lv_content_center WITH lv_value.
lv_content_image_center = lc_shape_image.
lv_value = is_footer-center_image->get_index( ).
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
REPLACE '{RID}' IN lv_content_image_center WITH lv_value.
ENDIF.
IF is_footer-right_image IS NOT INITIAL.
lv_content_right = lc_shape.
REPLACE '{ID}' IN lv_content_right WITH lc_shape_footer_right.
ls_drawing_position = is_footer-left_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{HEIGHT}' IN lv_content_right WITH lv_value.
IF ls_drawing_position-size-width IS NOT INITIAL.
lv_value = ls_drawing_position-size-width.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{WIDTH}' IN lv_content_right WITH lv_value.
lv_content_image_right = lc_shape_image.
lv_value = is_footer-right_image->get_index( ).
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
REPLACE '{RID}' IN lv_content_image_right WITH lv_value.
ENDIF.
CONCATENATE lv_content_left
lv_content_image_left
lv_content_center
lv_content_image_center
lv_content_right
lv_content_image_right
INTO ep_content.
ENDMETHOD.
METHOD set_vml_shape_header.
* CONSTANTS: lc_shape TYPE string VALUE '<v:shape id="{ID}" o:spid="_x0000_s1025" type="#_x0000_t75" style=''position:absolute;margin-left:0;margin-top:0;width:198.75pt;height:48.75pt; z-index:1''>',
CONSTANTS: lc_shape TYPE string VALUE '<v:shape id="{ID}" o:spid="_x0000_s1025" type="#_x0000_t75" style=''position:absolute;margin-left:0;margin-top:0;width:{WIDTH}pt;height:{HEIGHT}pt; z-index:1''>',
lc_shape_image TYPE string VALUE '<v:imagedata o:relid="{RID}" o:title="Logo Title"/><o:lock v:ext="edit" rotation="t"/></v:shape>',
lc_shape_header_center TYPE string VALUE 'CH',
lc_shape_header_left TYPE string VALUE 'LH',
lc_shape_header_right TYPE string VALUE 'RH',
lc_shape_footer_center TYPE string VALUE 'CF',
lc_shape_footer_left TYPE string VALUE 'LF',
lc_shape_footer_right TYPE string VALUE 'RF'.
DATA: lv_content_left TYPE string,
lv_content_center TYPE string,
lv_content_right TYPE string,
lv_content_image_left TYPE string,
lv_content_image_center TYPE string,
lv_content_image_right TYPE string,
lv_value TYPE string,
ls_drawing_position TYPE zexcel_drawing_position.
CLEAR ep_content.
IF is_header-left_image IS NOT INITIAL.
lv_content_left = lc_shape.
REPLACE '{ID}' IN lv_content_left WITH lc_shape_header_left.
ls_drawing_position = is_header-left_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{HEIGHT}' IN lv_content_left WITH lv_value.
IF ls_drawing_position-size-width IS NOT INITIAL.
lv_value = ls_drawing_position-size-width.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{WIDTH}' IN lv_content_left WITH lv_value.
lv_content_image_left = lc_shape_image.
lv_value = is_header-left_image->get_index( ).
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
REPLACE '{RID}' IN lv_content_image_left WITH lv_value.
ENDIF.
IF is_header-center_image IS NOT INITIAL.
lv_content_center = lc_shape.
REPLACE '{ID}' IN lv_content_center WITH lc_shape_header_center.
ls_drawing_position = is_header-left_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{HEIGHT}' IN lv_content_center WITH lv_value.
IF ls_drawing_position-size-width IS NOT INITIAL.
lv_value = ls_drawing_position-size-width.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{WIDTH}' IN lv_content_center WITH lv_value.
lv_content_image_center = lc_shape_image.
lv_value = is_header-center_image->get_index( ).
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
REPLACE '{RID}' IN lv_content_image_center WITH lv_value.
ENDIF.
IF is_header-right_image IS NOT INITIAL.
lv_content_right = lc_shape.
REPLACE '{ID}' IN lv_content_right WITH lc_shape_header_right.
ls_drawing_position = is_header-left_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{HEIGHT}' IN lv_content_right WITH lv_value.
IF ls_drawing_position-size-width IS NOT INITIAL.
lv_value = ls_drawing_position-size-width.
ELSE.
lv_value = '100'.
ENDIF.
CONDENSE lv_value.
REPLACE '{WIDTH}' IN lv_content_right WITH lv_value.
lv_content_image_right = lc_shape_image.
lv_value = is_header-right_image->get_index( ).
CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value.
REPLACE '{RID}' IN lv_content_image_right WITH lv_value.
ENDIF.
CONCATENATE lv_content_left
lv_content_image_left
lv_content_center
lv_content_image_center
lv_content_right
lv_content_image_right
INTO ep_content.
ENDMETHOD.
METHOD set_vml_string.
DATA:
ld_1 TYPE string,
ld_2 TYPE string,
ld_3 TYPE string,
ld_4 TYPE string,
ld_5 TYPE string,
ld_6 TYPE string,
ld_7 TYPE string,
lv_value TYPE string,
lv_relation_id TYPE i,
lo_iterator TYPE REF TO cl_object_collection_iterator,
lo_drawing TYPE REF TO zcl_excel_drawing,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
ls_odd_header TYPE zexcel_s_worksheet_head_foot,
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.
* INIT_RESULT
CLEAR ep_content.
* BODY
ld_1 = '<xml xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout>'.
ld_2 = '<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/>'.
ld_3 = '<v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/>'.
ld_4 = '<v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype>'.
CONCATENATE ld_1
ld_2
ld_3
ld_4
INTO ep_content.
lv_relation_id = 0.
lo_iterator = me->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( ).
lo_worksheet->sheet_setup->get_header_footer( IMPORTING ep_odd_header = ls_odd_header
ep_odd_footer = ls_odd_footer
ep_even_header = ls_even_header
ep_even_footer = ls_even_footer ).
ld_5 = me->set_vml_shape_header( ls_odd_header ).
CONCATENATE ep_content
ld_5
INTO ep_content.
ld_5 = me->set_vml_shape_header( ls_even_header ).
CONCATENATE ep_content
ld_5
INTO ep_content.
ld_5 = me->set_vml_shape_footer( ls_odd_footer ).
CONCATENATE ep_content
ld_5
INTO ep_content.
ld_5 = me->set_vml_shape_footer( ls_even_footer ).
CONCATENATE ep_content
ld_5
INTO ep_content.
ENDWHILE.
ld_7 = '</xml>'.
CONCATENATE ep_content
ld_7
INTO ep_content.
ENDMETHOD.
method ZIF_EXCEL_WRITER~WRITE_FILE.
me->excel = io_excel.

View File

@ -121,6 +121,18 @@
<LANGU>I</LANGU>
<DESCRIPT>Create &apos;xl/drawings/_rels/drawing1.xml.rels&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>CREATE_XL_DRAWINGS_VML</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create &apos;xl/drawings/vmlDrawing1.vml&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>CREATE_XL_DRAWINGS_VML_RELS</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create &apos;xl/drawings/_rel/vmlDrawing1.vml.rels&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>CREATE_XL_DRAWING_ANCHOR</CMPNAME>
@ -511,6 +523,24 @@
<LANGU>E</LANGU>
<DESCRIPT>Render ixml element - no header</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>SET_VML_SHAPE_FOOTER</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create Shape VML Footer</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>SET_VML_SHAPE_HEADER</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create Shape VML Header</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>SET_VML_STRING</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create VML String</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>SHARED_STRINGS</CMPNAME>

View File

@ -64,6 +64,39 @@
<MASK> STRUS</MASK>
<COMPTYPE>S</COMPTYPE>
</DD03P>
<DD03P>
<TABNAME>ZEXCEL_S_WORKSHEET_HEAD_FOOT</TABNAME>
<FIELDNAME>LEFT_IMAGE</FIELDNAME>
<POSITION>0049</POSITION>
<ROLLNAME>ZCL_EXCEL_DRAWING</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<DATATYPE>REF</DATATYPE>
<MASK> REF RC</MASK>
<COMPTYPE>R</COMPTYPE>
<REFTYPE>C</REFTYPE>
</DD03P>
<DD03P>
<TABNAME>ZEXCEL_S_WORKSHEET_HEAD_FOOT</TABNAME>
<FIELDNAME>RIGHT_IMAGE</FIELDNAME>
<POSITION>0050</POSITION>
<ROLLNAME>ZCL_EXCEL_DRAWING</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<DATATYPE>REF</DATATYPE>
<MASK> REF RC</MASK>
<COMPTYPE>R</COMPTYPE>
<REFTYPE>C</REFTYPE>
</DD03P>
<DD03P>
<TABNAME>ZEXCEL_S_WORKSHEET_HEAD_FOOT</TABNAME>
<FIELDNAME>CENTER_IMAGE</FIELDNAME>
<POSITION>0051</POSITION>
<ROLLNAME>ZCL_EXCEL_DRAWING</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<DATATYPE>REF</DATATYPE>
<MASK> REF RC</MASK>
<COMPTYPE>R</COMPTYPE>
<REFTYPE>C</REFTYPE>
</DD03P>
</DD03P_TABLE>
</asx:values>
</asx:abap>

View File

@ -0,0 +1,80 @@
*&---------------------------------------------------------------------*
*& Report ZTEST_EXCEL_IMAGE_HEADER
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ztest_excel_image_header.
DATA: lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_drawing TYPE REF TO zcl_excel_drawing,
ls_key TYPE wwwdatatab,
ls_header TYPE zexcel_s_worksheet_head_foot,
ls_footer TYPE zexcel_s_worksheet_head_foot,
lv_content TYPE xstring.
DATA: ls_io TYPE skwf_io.
CONSTANTS: gc_save_file_name TYPE string VALUE 'Image_Header_Footer.xlsx'.
INCLUDE zdemo_excel_outputopt_incl.
START-OF-SELECTION.
" Creates active sheet
CREATE OBJECT lo_excel.
**********************************************************************
*** Header Center
" create global drawing, set position and media from web repository
lo_drawing = lo_excel->add_new_drawing( ip_type = zcl_excel_drawing=>type_image_header_footer ).
ls_key-relid = 'MI'.
ls_key-objid = 'SAPLOGO.GIF'.
lo_drawing->set_media_www( ip_key = ls_key
ip_width = 166
ip_height = 75 ).
**********************************************************************
ls_header-center_image = lo_drawing.
**********************************************************************
*** Header Left
" create global drawing, set position and media from web repository
lo_drawing = lo_excel->add_new_drawing( ip_type = zcl_excel_drawing=>type_image_header_footer ).
ls_key-relid = 'MI'.
ls_key-objid = 'SAPLOGO.GIF'.
lo_drawing->set_media_www( ip_key = ls_key
ip_width = 166
ip_height = 75 ).
ls_header-left_image = ls_footer-left_image = lo_drawing.
ls_header-left_value = 'Hallo'.
lo_worksheet = lo_excel->get_active_worksheet( ).
lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header
ip_odd_footer = ls_footer ).
**********************************************************************
*** Normal Image
" create global drawing, set position and media from web repository
lo_drawing = lo_excel->add_new_drawing( ).
lo_drawing->set_position( ip_from_row = 3
ip_from_col = 'B' ).
ls_key-relid = 'MI'.
ls_key-objid = 'SAPLOGO.GIF'.
lo_drawing->set_media_www( ip_key = ls_key
ip_width = 166
ip_height = 75 ).
" assign drawing to the worksheet
lo_worksheet->add_drawing( lo_drawing ).
*** Create output
lcl_output=>output( lo_excel ).

View File

@ -0,0 +1,28 @@
<?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>ZTEST_EXCEL_IMAGE_HEADER</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>1</SUBC>
<RLOAD>D</RLOAD>
<FIXPT>X</FIXPT>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<I18N_TPOOL>
<item>
<LANGUAGE>D</LANGUAGE>
<TEXTPOOL>
<item>
<ID>R</ID>
<ENTRY>Image Excel header</ENTRY>
<LENGTH>18</LENGTH>
</item>
</TEXTPOOL>
</item>
</I18N_TPOOL>
</asx:values>
</asx:abap>
</abapGit>