Redefinition Header Footer Image

Get errors when using header/footer in more than one sheet
This commit is contained in:
mfallen 2019-02-21 15:45:27 +01:00
parent 8e87d303a5
commit edb50701b1
7 changed files with 899 additions and 547 deletions

View File

@ -2,10 +2,16 @@ class ZCL_EXCEL_WORKSHEET definition
public public
create public . create public .
public section. public section.
*"* public components of class ZCL_EXCEL_WORKSHEET *"* public components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!!
*"* protected components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!! *"* do not include other source files here!!!
type-pools ABAP . type-pools ABAP .
type-pools SLIS .
type-pools SOI .
interfaces ZIF_EXCEL_SHEET_PRINTSETTINGS . interfaces ZIF_EXCEL_SHEET_PRINTSETTINGS .
interfaces ZIF_EXCEL_SHEET_PROPERTIES . interfaces ZIF_EXCEL_SHEET_PROPERTIES .
@ -25,11 +31,11 @@ class ZCL_EXCEL_WORKSHEET definition
constants C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT constants C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT
constants C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT constants C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT
data EXCEL type ref to ZCL_EXCEL read-only . data EXCEL type ref to ZCL_EXCEL read-only .
data PRINT_GRIDLINES type ZEXCEL_PRINT_GRIDLINES read-only value ABAP_FALSE. "#EC NOTEXT . " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . data PRINT_GRIDLINES type ZEXCEL_PRINT_GRIDLINES read-only value ABAP_FALSE. "#EC NOTEXT
data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . data SHEET_CONTENT type ZEXCEL_T_CELL_DATA .
data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP .
data SHOW_GRIDLINES type ZEXCEL_SHOW_GRIDLINES read-only value ABAP_TRUE. "#EC NOTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . data SHOW_GRIDLINES type ZEXCEL_SHOW_GRIDLINES read-only value ABAP_TRUE. "#EC NOTEXT
data SHOW_ROWCOLHEADERS type ZEXCEL_SHOW_GRIDLINES read-only value ABAP_TRUE. "#EC NOTEXT . " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . data SHOW_ROWCOLHEADERS type ZEXCEL_SHOW_GRIDLINES read-only value ABAP_TRUE. "#EC NOTEXT
data STYLES type ZEXCEL_T_SHEET_STYLE . data STYLES type ZEXCEL_T_SHEET_STYLE .
data TABCOLOR type ZEXCEL_S_TABCOLOR read-only . data TABCOLOR type ZEXCEL_S_TABCOLOR read-only .
@ -61,15 +67,13 @@ class ZCL_EXCEL_WORKSHEET definition
methods BIND_ALV methods BIND_ALV
importing importing
!IO_ALV type ref to OBJECT !IO_ALV type ref to OBJECT
!IT_TABLE type standard table !IT_TABLE type STANDARD TABLE
!I_TOP type I default 1 !I_TOP type I default 1
!I_LEFT type I default 1 !I_LEFT type I default 1
!TABLE_STYLE type ZEXCEL_TABLE_STYLE optional !TABLE_STYLE type ZEXCEL_TABLE_STYLE optional
!I_TABLE type ABAP_BOOL default ABAP_TRUE !I_TABLE type ABAP_BOOL default ABAP_TRUE
raising raising
ZCX_EXCEL . ZCX_EXCEL .
type-pools SLIS .
type-pools SOI .
methods BIND_ALV_OLE2 methods BIND_ALV_OLE2
importing importing
!I_DOCUMENT_URL type CHAR255 default SPACE !I_DOCUMENT_URL type CHAR255 default SPACE
@ -94,7 +98,7 @@ class ZCL_EXCEL_WORKSHEET definition
ERROR_IN_SEMA . ERROR_IN_SEMA .
methods BIND_TABLE methods BIND_TABLE
importing importing
!IP_TABLE type standard table !IP_TABLE type STANDARD TABLE
!IT_FIELD_CATALOG type ZEXCEL_T_FIELDCATALOG optional !IT_FIELD_CATALOG type ZEXCEL_T_FIELDCATALOG optional
!IS_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS optional !IS_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS optional
value(IV_DEFAULT_DESCR) type C optional value(IV_DEFAULT_DESCR) type C optional
@ -465,7 +469,7 @@ class ZCL_EXCEL_WORKSHEET definition
!IV_TABCOLOR type ZEXCEL_S_TABCOLOR . !IV_TABCOLOR type ZEXCEL_S_TABCOLOR .
methods SET_TABLE methods SET_TABLE
importing importing
!IP_TABLE type standard table !IP_TABLE type STANDARD TABLE
!IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional
!IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional
!IP_TABLE_TITLE type STRING !IP_TABLE_TITLE type STRING
@ -482,45 +486,41 @@ class ZCL_EXCEL_WORKSHEET definition
ZCX_EXCEL . ZCX_EXCEL .
methods GET_TABLE methods GET_TABLE
importing importing
IV_SKIPPED_ROWS type INT4 default 0 !IV_SKIPPED_ROWS type INT4 default 0
IV_SKIPPED_COLS type INT4 default 0 !IV_SKIPPED_COLS type INT4 default 0
exporting exporting
ET_TABLE type standard table !ET_TABLE type STANDARD TABLE
raising raising
ZCX_EXCEL. ZCX_EXCEL .
methods SET_MERGE_STYLE
methods SET_MERGE_STYLE
importing importing
!IP_COLUMN_START type simple optional !IP_COLUMN_START type SIMPLE optional
!IP_COLUMN_END type simple optional !IP_COLUMN_END type SIMPLE optional
!IP_ROW type ZEXCEL_CELL_ROW optional !IP_ROW type ZEXCEL_CELL_ROW optional
!IP_ROW_TO type ZEXCEL_CELL_ROW optional !IP_ROW_TO type ZEXCEL_CELL_ROW optional
!IP_STYLE type ZEXCEL_CELL_STYLE optional . !IP_STYLE type ZEXCEL_CELL_STYLE optional .
methods SET_AREA_FORMULA
methods SET_AREA_FORMULA
importing importing
!IP_COLUMN_START type simple !IP_COLUMN_START type SIMPLE
!IP_COLUMN_END type simple optional !IP_COLUMN_END type SIMPLE optional
!IP_ROW type ZEXCEL_CELL_ROW !IP_ROW type ZEXCEL_CELL_ROW
!IP_ROW_TO type ZEXCEL_CELL_ROW optional !IP_ROW_TO type ZEXCEL_CELL_ROW optional
!IP_FORMULA type ZEXCEL_CELL_FORMULA !IP_FORMULA type ZEXCEL_CELL_FORMULA
!IP_MERGE type ABAP_BOOL optional !IP_MERGE type ABAP_BOOL optional
raising raising
ZCX_EXCEL . ZCX_EXCEL .
methods SET_AREA_STYLE
methods SET_AREA_STYLE
importing importing
!IP_COLUMN_START type simple !IP_COLUMN_START type SIMPLE
!IP_COLUMN_END type simple optional !IP_COLUMN_END type SIMPLE optional
!IP_ROW type ZEXCEL_CELL_ROW !IP_ROW type ZEXCEL_CELL_ROW
!IP_ROW_TO type ZEXCEL_CELL_ROW optional !IP_ROW_TO type ZEXCEL_CELL_ROW optional
!IP_STYLE type ZEXCEL_CELL_STYLE !IP_STYLE type ZEXCEL_CELL_STYLE
!IP_MERGE type ABAP_BOOL optional . !IP_MERGE type ABAP_BOOL optional .
methods SET_AREA methods SET_AREA
importing importing
!IP_COLUMN_START type simple !IP_COLUMN_START type SIMPLE
!IP_COLUMN_END type simple optional !IP_COLUMN_END type SIMPLE optional
!IP_ROW type ZEXCEL_CELL_ROW !IP_ROW type ZEXCEL_CELL_ROW
!IP_ROW_TO type ZEXCEL_CELL_ROW optional !IP_ROW_TO type ZEXCEL_CELL_ROW optional
!IP_VALUE type SIMPLE optional !IP_VALUE type SIMPLE optional
@ -532,11 +532,9 @@ methods SET_AREA_STYLE
!IP_MERGE type ABAP_BOOL optional !IP_MERGE type ABAP_BOOL optional
raising raising
ZCX_EXCEL . ZCX_EXCEL .
methods GET_HEADER_FOOTER_DRAWINGS
*"* protected components of class ZCL_EXCEL_WORKSHEET returning
*"* do not include other source files here!!! value(RT_DRAWINGS) type ZEXCEL_T_DRAWINGS .
*"* protected components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!!
protected section. protected section.
private section. private section.
@ -4101,6 +4099,87 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
endmethod. endmethod.
METHOD get_header_footer_drawings.
DATA: 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,
ls_hd_ft TYPE zexcel_s_worksheet_head_foot.
FIELD-SYMBOLS: <fs_drawings> TYPE zexcel_s_drawings.
me->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 ).
**********************************************************************
*** Odd header
ls_hd_ft = ls_odd_header.
IF ls_hd_ft-left_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-left_image.
ENDIF.
IF ls_hd_ft-right_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-right_image.
ENDIF.
IF ls_hd_ft-center_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-center_image.
ENDIF.
**********************************************************************
*** Odd footer
ls_hd_ft = ls_odd_footer.
IF ls_hd_ft-left_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-left_image.
ENDIF.
IF ls_hd_ft-right_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-right_image.
ENDIF.
IF ls_hd_ft-center_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-center_image.
ENDIF.
**********************************************************************
*** Even header
ls_hd_ft = ls_even_header.
IF ls_hd_ft-left_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-left_image.
ENDIF.
IF ls_hd_ft-right_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-right_image.
ENDIF.
IF ls_hd_ft-center_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-center_image.
ENDIF.
**********************************************************************
*** Even footer
ls_hd_ft = ls_even_footer.
IF ls_hd_ft-left_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-left_image.
ENDIF.
IF ls_hd_ft-right_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-right_image.
ENDIF.
IF ls_hd_ft-center_image IS NOT INITIAL.
APPEND INITIAL LINE TO rt_drawings ASSIGNING <fs_drawings>.
<fs_drawings>-drawing = ls_hd_ft-center_image.
ENDIF.
ENDMETHOD.
method GET_HIGHEST_COLUMN. method GET_HIGHEST_COLUMN.
ME->UPDATE_DIMENSION_RANGE( ). ME->UPDATE_DIMENSION_RANGE( ).
R_HIGHEST_COLUMN = ME->LOWER_CELL-CELL_COLUMN. R_HIGHEST_COLUMN = ME->LOWER_CELL-CELL_COLUMN.

View File

@ -550,6 +550,12 @@
<LANGU>I</LANGU> <LANGU>I</LANGU>
<DESCRIPT>Get sheet guid</DESCRIPT> <DESCRIPT>Get sheet guid</DESCRIPT>
</SEOCOMPOTX> </SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WORKSHEET</CLSNAME>
<CMPNAME>GET_HEADER_FOOTER_DRAWINGS</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Get HD/FT Drawings</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX> <SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WORKSHEET</CLSNAME> <CLSNAME>ZCL_EXCEL_WORKSHEET</CLSNAME>
<CMPNAME>GET_HYPERLINKS_ITERATOR</CMPNAME> <CMPNAME>GET_HYPERLINKS_ITERATOR</CMPNAME>

View File

@ -33,8 +33,7 @@ protected section.
data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING . data STYLES_MAPPING type ZEXCEL_T_STYLES_MAPPING .
constants C_XL_COMMENTS type STRING value 'xl/comments#.xml'. "#EC NOTEXT 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 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/vmlDrawing#.vml.rels'. "#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 methods CREATE_XL_SHEET_SHEET_DATA
importing importing
@ -179,6 +178,16 @@ protected section.
!IS_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT !IS_HEADER type ZEXCEL_S_WORKSHEET_HEAD_FOOT
returning returning
value(EP_CONTENT) type STRING . value(EP_CONTENT) type STRING .
methods CREATE_XL_DRAWING_FOR_HDFT_IM
importing
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
returning
value(EP_CONTENT) type XSTRING .
methods CREATE_XL_DRAWINGS_HDFT_RELS
importing
!IO_WORKSHEET type ref to ZCL_EXCEL_WORKSHEET
returning
value(EP_CONTENT) type XSTRING .
private section. private section.
*"* private components of class ZCL_EXCEL_WRITER_2007 *"* private components of class ZCL_EXCEL_WRITER_2007
@ -366,6 +375,30 @@ METHOD create.
content = lv_content ). content = lv_content ).
ENDIF. ENDIF.
* Add Header/Footer image
DATA: lt_drawings TYPE zexcel_t_drawings.
lt_drawings = lo_worksheet->get_header_footer_drawings( ).
IF lines( lt_drawings ) > 0. "Header or footer image exist
lv_comment_index = lv_comment_index + 1.
lv_index_str = lv_comment_index.
CONDENSE lv_index_str NO-GAPS.
" Create vmlDrawing that will host the image
lv_content = me->create_xl_drawing_for_hdft_im( lo_worksheet ).
lv_xl_drawing_for_comment = me->cl_xl_drawing_for_comments.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_for_comment WITH lv_index_str.
lo_zip->add( name = lv_xl_drawing_for_comment
content = lv_content ).
" Create vmlDrawing REL that will host the image
lv_content = me->create_xl_drawings_hdft_rels( lo_worksheet ).
lv_xl_drawing_rels = me->c_xl_drawings_vml_rels.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_index_str.
lo_zip->add( name = lv_xl_drawing_rels
content = lv_content ).
ENDIF.
lv_xl_sheet_rels = me->c_xl_sheet_rels. lv_xl_sheet_rels = me->c_xl_sheet_rels.
lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet
@ -433,20 +466,6 @@ METHOD create.
"------------------------------------------------- "-------------------------------------------------
ENDWHILE. 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 * Second to last step: Allow further information put into the zip archive by child classes
me->add_further_data_to_zip( lo_zip ). me->add_further_data_to_zip( lo_zip ).
@ -2531,6 +2550,105 @@ method CREATE_XL_DRAWINGS.
endmethod. endmethod.
METHOD create_xl_drawings_hdft_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,
lt_temp TYPE strtable,
lt_drawings TYPE zexcel_t_drawings.
FIELD-SYMBOLS: <fs_temp> TYPE sstrtable,
<fs_drawings> TYPE zexcel_s_drawings.
* 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
**********************************************************************
lt_drawings = io_worksheet->get_header_footer_drawings( ).
LOOP AT lt_drawings ASSIGNING <fs_drawings>. "Header or footer image exist
ADD 1 TO lv_relation_id.
* lv_value = lv_relation_id.
lv_value = <fs_drawings>-drawing->get_index( ).
READ TABLE lt_temp WITH KEY str = lv_value TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
APPEND INITIAL LINE TO lt_temp ASSIGNING <fs_temp>.
<fs_temp>-row_index = sy-tabix.
<fs_temp>-str = lv_value.
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 <fs_drawings>-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.
ENDLOOP.
**********************************************************************
* 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. "create_xl_drawings_hdft_rels
method CREATE_XL_DRAWINGS_RELS. method CREATE_XL_DRAWINGS_RELS.
** Constant node name ** Constant node name
@ -3332,6 +3450,91 @@ METHOD create_xl_drawing_for_comments.
ENDMETHOD. ENDMETHOD.
METHOD create_xl_drawing_for_hdft_im.
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,
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,
lv_content TYPE string,
lo_xml_document TYPE REF TO cl_xml_document.
* 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 lv_content.
io_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 lv_content
ld_5
INTO lv_content.
ld_5 = me->set_vml_shape_header( ls_even_header ).
CONCATENATE lv_content
ld_5
INTO lv_content.
ld_5 = me->set_vml_shape_footer( ls_odd_footer ).
CONCATENATE lv_content
ld_5
INTO lv_content.
ld_5 = me->set_vml_shape_footer( ls_even_footer ).
CONCATENATE lv_content
ld_5
INTO lv_content.
ld_7 = '</xml>'.
CONCATENATE lv_content
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
IMPORTING
buffer = ep_content
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR ep_content.
ENDIF.
ENDMETHOD.
method CREATE_XL_RELATIONSHIPS. method CREATE_XL_RELATIONSHIPS.
@ -5424,7 +5627,8 @@ METHOD create_xl_sheet_rels.
DATA: lv_value TYPE string, DATA: lv_value TYPE string,
lv_relation_id TYPE i, lv_relation_id TYPE i,
lv_index_str TYPE string. lv_index_str TYPE string,
lv_comment_index TYPE i.
********************************************************************** **********************************************************************
* STEP 1: Create [Content_Types].xml into the root of the ZIP * STEP 1: Create [Content_Types].xml into the root of the ZIP
@ -5505,6 +5709,8 @@ METHOD create_xl_sheet_rels.
* Begin - Add - Issue #180 * Begin - Add - Issue #180
DATA: lo_comments TYPE REF TO zcl_excel_comments. DATA: lo_comments TYPE REF TO zcl_excel_comments.
lv_comment_index = iv_comment_index.
lo_comments = io_worksheet->get_comments( ). lo_comments = io_worksheet->get_comments( ).
IF lo_comments->is_empty( ) = abap_false. IF lo_comments->is_empty( ) = abap_false.
" Drawing for comment " Drawing for comment
@ -5512,6 +5718,7 @@ METHOD create_xl_sheet_rels.
parent = lo_document ). parent = lo_document ).
ADD 1 TO lv_relation_id. ADD 1 TO lv_relation_id.
ADD 1 TO lv_comment_index.
lv_value = lv_relation_id. lv_value = lv_relation_id.
CONDENSE lv_value. CONDENSE lv_value.
@ -5556,16 +5763,9 @@ METHOD create_xl_sheet_rels.
********************************************************************** **********************************************************************
* header footer image * header footer image
DATA: lo_drawing TYPE REF TO zcl_excel_drawing. DATA: lt_drawings TYPE zexcel_t_drawings.
lt_drawings = io_worksheet->get_header_footer_drawings( ).
lo_comments = io_worksheet->get_comments( ). IF lines( lt_drawings ) > 0. "Header or footer image exist
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. ADD 1 TO lv_relation_id.
" Drawing for comment/header/footer " Drawing for comment/header/footer
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
@ -5578,7 +5778,7 @@ METHOD create_xl_sheet_rels.
lo_element->set_attribute_ns( name = lc_xml_attr_type lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_drawing_cmt_tp ). value = lc_xml_node_rid_drawing_cmt_tp ).
lv_index_str = iv_comment_index. lv_index_str = lv_comment_index.
CONDENSE lv_index_str NO-GAPS. CONDENSE lv_index_str NO-GAPS.
MOVE me->cl_xl_drawing_for_comments TO lv_value. MOVE me->cl_xl_drawing_for_comments TO lv_value.
REPLACE 'xl' WITH '..' INTO lv_value. REPLACE 'xl' WITH '..' INTO lv_value.
@ -5586,9 +5786,6 @@ METHOD create_xl_sheet_rels.
lo_element->set_attribute_ns( name = lc_xml_attr_target lo_element->set_attribute_ns( name = lc_xml_attr_target
value = lv_value ). value = lv_value ).
lo_element_root->append_child( new_child = lo_element ). lo_element_root->append_child( new_child = lo_element ).
EXIT.
ENDIF.
ENDWHILE.
ENDIF. ENDIF.
*** End Header Footer *** End Header Footer
********************************************************************** **********************************************************************
@ -7833,7 +8030,7 @@ METHOD set_vml_shape_header.
IF is_header-center_image IS NOT INITIAL. IF is_header-center_image IS NOT INITIAL.
lv_content_center = lc_shape. lv_content_center = lc_shape.
REPLACE '{ID}' IN lv_content_center WITH lc_shape_header_center. REPLACE '{ID}' IN lv_content_center WITH lc_shape_header_center.
ls_drawing_position = is_header-left_image->get_position( ). ls_drawing_position = is_header-center_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL. IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height. lv_value = ls_drawing_position-size-height.
ELSE. ELSE.
@ -7857,7 +8054,7 @@ METHOD set_vml_shape_header.
IF is_header-right_image IS NOT INITIAL. IF is_header-right_image IS NOT INITIAL.
lv_content_right = lc_shape. lv_content_right = lc_shape.
REPLACE '{ID}' IN lv_content_right WITH lc_shape_header_right. REPLACE '{ID}' IN lv_content_right WITH lc_shape_header_right.
ls_drawing_position = is_header-left_image->get_position( ). ls_drawing_position = is_header-right_image->get_position( ).
IF ls_drawing_position-size-height IS NOT INITIAL. IF ls_drawing_position-size-height IS NOT INITIAL.
lv_value = ls_drawing_position-size-height. lv_value = ls_drawing_position-size-height.
ELSE. ELSE.

View File

@ -109,6 +109,12 @@
<LANGU>I</LANGU> <LANGU>I</LANGU>
<DESCRIPT>Create &apos;xl/drawings/drawing1.xml&apos;</DESCRIPT> <DESCRIPT>Create &apos;xl/drawings/drawing1.xml&apos;</DESCRIPT>
</SEOCOMPOTX> </SEOCOMPOTX>
<SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>CREATE_XL_DRAWINGS_HDFT_RELS</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Create &apos;xl/drawings/_rel/vmlDrawing1.vml.rels&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX> <SEOCOMPOTX>
<CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME> <CLSNAME>ZCL_EXCEL_WRITER_2007</CLSNAME>
<CMPNAME>CREATE_XL_DRAWINGS_RELS</CMPNAME> <CMPNAME>CREATE_XL_DRAWINGS_RELS</CMPNAME>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD02V>
<TABNAME>ZEXCEL_S_DRAWINGS</TABNAME>
<TABCLASS>INTTAB</TABCLASS>
<EXCLASS>4</EXCLASS>
</DD02V>
<DD03P_TABLE>
<DD03P>
<TABNAME>ZEXCEL_S_DRAWINGS</TABNAME>
<FIELDNAME>DRAWING</FIELDNAME>
<POSITION>0001</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>
</abapGit>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TTYP" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD40V>
<TYPENAME>ZEXCEL_T_DRAWINGS</TYPENAME>
<ROWTYPE>ZEXCEL_S_DRAWINGS</ROWTYPE>
<ROWKIND>S</ROWKIND>
<DATATYPE>STRU</DATATYPE>
<ACCESSMODE>T</ACCESSMODE>
<KEYDEF>D</KEYDEF>
<KEYKIND>N</KEYKIND>
</DD40V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -76,5 +76,28 @@ START-OF-SELECTION.
" assign drawing to the worksheet " assign drawing to the worksheet
lo_worksheet->add_drawing( lo_drawing ). lo_worksheet->add_drawing( lo_drawing ).
**********************************************************************
**********************************************************************
* New sheet
lo_worksheet = lo_excel->add_new_worksheet( 'Sheet2' ).
**********************************************************************
*** 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 ).
CLEAR ls_header.
ls_header-left_image = ls_footer-left_image = lo_drawing.
lo_worksheet->sheet_setup->set_header_footer( ip_odd_header = ls_header ).
*** Create output *** Create output
lcl_output=>output( lo_excel ). lcl_output=>output( lo_excel ).