-
Notifications
You must be signed in to change notification settings - Fork 284
/
zcl_excel_writer_2007.clas.abap
6556 lines (5699 loc) · 321 KB
/
zcl_excel_writer_2007.clas.abap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
CLASS zcl_excel_writer_2007 DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
*"* public components of class ZCL_EXCEL_WRITER_2007
*"* do not include other source files here!!!
INTERFACES zif_excel_writer .
METHODS constructor.
PROTECTED SECTION.
*"* protected components of class ZCL_EXCEL_WRITER_2007
*"* do not include other source files here!!!
TYPES: BEGIN OF mty_column_formula_used,
id TYPE zexcel_s_cell_data-column_formula_id,
si TYPE string,
"! type: shared, etc.
t TYPE string,
END OF mty_column_formula_used,
mty_column_formulas_used TYPE HASHED TABLE OF mty_column_formula_used WITH UNIQUE KEY id.
CONSTANTS c_content_types TYPE string VALUE '[Content_Types].xml'. "#EC NOTEXT
CONSTANTS c_docprops_app TYPE string VALUE 'docProps/app.xml'. "#EC NOTEXT
CONSTANTS c_docprops_core TYPE string VALUE 'docProps/core.xml'. "#EC NOTEXT
CONSTANTS c_relationships TYPE string VALUE '_rels/.rels'. "#EC NOTEXT
CONSTANTS c_xl_calcchain TYPE string VALUE 'xl/calcChain.xml'. "#EC NOTEXT
CONSTANTS c_xl_drawings TYPE string VALUE 'xl/drawings/drawing#.xml'. "#EC NOTEXT
CONSTANTS c_xl_drawings_rels TYPE string VALUE 'xl/drawings/_rels/drawing#.xml.rels'. "#EC NOTEXT
CONSTANTS c_xl_relationships TYPE string VALUE 'xl/_rels/workbook.xml.rels'. "#EC NOTEXT
CONSTANTS c_xl_sharedstrings TYPE string VALUE 'xl/sharedStrings.xml'. "#EC NOTEXT
CONSTANTS c_xl_sheet TYPE string VALUE 'xl/worksheets/sheet#.xml'. "#EC NOTEXT
CONSTANTS c_xl_sheet_rels TYPE string VALUE 'xl/worksheets/_rels/sheet#.xml.rels'. "#EC NOTEXT
CONSTANTS c_xl_styles TYPE string VALUE 'xl/styles.xml'. "#EC NOTEXT
CONSTANTS c_xl_theme TYPE string VALUE 'xl/theme/theme1.xml'. "#EC NOTEXT
CONSTANTS c_xl_workbook TYPE string VALUE 'xl/workbook.xml'. "#EC NOTEXT
DATA excel TYPE REF TO zcl_excel .
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'. "#EC NOTEXT
CONSTANTS cl_xl_drawing_for_comments TYPE string VALUE 'xl/drawings/vmlDrawing#.vml'. "#EC NOTEXT
CONSTANTS c_xl_drawings_vml_rels TYPE string VALUE 'xl/drawings/_rels/vmlDrawing#.vml.rels'. "#EC NOTEXT
DATA ixml TYPE REF TO if_ixml.
DATA control_characters TYPE string.
METHODS create_xl_sheet_sheet_data
IMPORTING
!io_document TYPE REF TO if_ixml_document
!io_worksheet TYPE REF TO zcl_excel_worksheet
RETURNING
VALUE(rv_ixml_sheet_data_root) TYPE REF TO if_ixml_element
RAISING
zcx_excel .
METHODS add_further_data_to_zip
IMPORTING
!io_zip TYPE REF TO cl_abap_zip .
METHODS create
RETURNING
VALUE(ep_excel) TYPE xstring
RAISING
zcx_excel .
METHODS create_content_types
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_docprops_app
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_docprops_core
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_dxf_style
IMPORTING
!iv_cell_style TYPE zexcel_cell_style
!io_dxf_element TYPE REF TO if_ixml_element
!io_ixml_document TYPE REF TO if_ixml_document
!it_cellxfs TYPE zexcel_t_cellxfs
!it_fonts TYPE zexcel_t_style_font
!it_fills TYPE zexcel_t_style_fill
CHANGING
!cv_dfx_count TYPE i .
METHODS create_relationships
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_charts
IMPORTING
!io_drawing TYPE REF TO zcl_excel_drawing
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_comments
IMPORTING
!io_worksheet TYPE REF TO zcl_excel_worksheet
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_drawings
IMPORTING
!io_worksheet TYPE REF TO zcl_excel_worksheet
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_drawings_rels
IMPORTING
!io_worksheet TYPE REF TO zcl_excel_worksheet
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_drawing_anchor
IMPORTING
!io_drawing TYPE REF TO zcl_excel_drawing
!io_document TYPE REF TO if_ixml_document
!ip_index TYPE i
RETURNING
VALUE(ep_anchor) TYPE REF TO if_ixml_element .
METHODS create_xl_drawing_for_comments
IMPORTING
!io_worksheet TYPE REF TO zcl_excel_worksheet
RETURNING
VALUE(ep_content) TYPE xstring
RAISING
zcx_excel .
METHODS create_xl_relationships
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_sharedstrings
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_sheet
IMPORTING
!io_worksheet TYPE REF TO zcl_excel_worksheet
!iv_active TYPE flag DEFAULT ''
RETURNING
VALUE(ep_content) TYPE xstring
RAISING
zcx_excel .
METHODS create_xl_sheet_ignored_errors
IMPORTING
io_worksheet TYPE REF TO zcl_excel_worksheet
io_document TYPE REF TO if_ixml_document
io_element_root TYPE REF TO if_ixml_element.
METHODS create_xl_sheet_pagebreaks
IMPORTING
!io_document TYPE REF TO if_ixml_document
!io_parent TYPE REF TO if_ixml_element
!io_worksheet TYPE REF TO zcl_excel_worksheet
RAISING
zcx_excel .
METHODS create_xl_sheet_rels
IMPORTING
!io_worksheet TYPE REF TO zcl_excel_worksheet
!iv_drawing_index TYPE i
!iv_comment_index TYPE i
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_styles
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_styles_color_node
IMPORTING
!io_document TYPE REF TO if_ixml_document
!io_parent TYPE REF TO if_ixml_element
!iv_color_elem_name TYPE string DEFAULT 'color'
!is_color TYPE zexcel_s_style_color .
METHODS create_xl_styles_font_node
IMPORTING
!io_document TYPE REF TO if_ixml_document
!io_parent TYPE REF TO if_ixml_element
!is_font TYPE zexcel_s_style_font
!iv_use_rtf TYPE abap_bool DEFAULT abap_false .
METHODS create_xl_table
IMPORTING
!io_table TYPE REF TO zcl_excel_table
RETURNING
VALUE(ep_content) TYPE xstring
RAISING
zcx_excel .
METHODS create_xl_theme
RETURNING
VALUE(ep_content) TYPE xstring .
METHODS create_xl_workbook
RETURNING
VALUE(ep_content) TYPE xstring
RAISING
zcx_excel .
METHODS get_shared_string_index
IMPORTING
!ip_cell_value TYPE zexcel_cell_value
!it_rtf TYPE zexcel_t_rtf OPTIONAL
RETURNING
VALUE(ep_index) TYPE int4 .
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 escape_string_value
IMPORTING
!iv_value TYPE zexcel_cell_value
RETURNING
VALUE(result) TYPE zexcel_cell_value.
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 .
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 .
METHODS create_xml_document
RETURNING
VALUE(ro_document) TYPE REF TO if_ixml_document.
METHODS render_xml_document
IMPORTING
io_document TYPE REF TO if_ixml_document
RETURNING
VALUE(ep_content) TYPE xstring.
METHODS create_xl_sheet_column_formula
IMPORTING
io_document TYPE REF TO if_ixml_document
it_column_formulas TYPE zcl_excel_worksheet=>mty_th_column_formula
is_sheet_content TYPE zexcel_s_cell_data
EXPORTING
eo_element TYPE REF TO if_ixml_element
CHANGING
ct_column_formulas_used TYPE mty_column_formulas_used
cv_si TYPE i
RAISING
zcx_excel.
METHODS is_formula_shareable
IMPORTING
ip_formula TYPE string
RETURNING
VALUE(ep_shareable) TYPE abap_bool
RAISING
zcx_excel.
PRIVATE SECTION.
*"* private components of class ZCL_EXCEL_WRITER_2007
*"* do not include other source files here!!!
CONSTANTS c_off TYPE string VALUE '0'. "#EC NOTEXT
CONSTANTS c_on TYPE string VALUE '1'. "#EC NOTEXT
CONSTANTS c_xl_printersettings TYPE string VALUE 'xl/printerSettings/printerSettings#.bin'. "#EC NOTEXT
TYPES: tv_charbool TYPE c LENGTH 5.
METHODS add_1_val_child_node
IMPORTING
io_document TYPE REF TO if_ixml_document
io_parent TYPE REF TO if_ixml_element
iv_elem_name TYPE string
iv_attr_name TYPE string
iv_attr_value TYPE string.
METHODS flag2bool
IMPORTING
!ip_flag TYPE flag
RETURNING
VALUE(ep_boolean) TYPE tv_charbool .
ENDCLASS.
CLASS zcl_excel_writer_2007 IMPLEMENTATION.
METHOD add_1_val_child_node.
DATA: lo_child TYPE REF TO if_ixml_element.
lo_child = io_document->create_simple_element( name = iv_elem_name
parent = io_document ).
IF iv_attr_name IS NOT INITIAL.
lo_child->set_attribute_ns( name = iv_attr_name
value = iv_attr_value ).
ENDIF.
io_parent->append_child( new_child = lo_child ).
ENDMETHOD.
METHOD add_further_data_to_zip.
* Can be used by child classes like xlsm-writer to write additional data to zip archive
ENDMETHOD.
METHOD constructor.
DATA: lt_unicode_point_codes TYPE TABLE OF string,
lv_unicode_point_code TYPE i.
me->ixml = cl_ixml=>create( ).
SPLIT '0,1,2,3,4,5,6,7,8,' " U+0000 to U+0008
&& '11,12,' " U+000B, U+000C
&& '14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,' " U+000E to U+001F
&& '65534,65535' " U+FFFE, U+FFFF
AT ',' INTO TABLE lt_unicode_point_codes.
control_characters = ``.
LOOP AT lt_unicode_point_codes INTO lv_unicode_point_code.
control_characters = control_characters && cl_abap_conv_in_ce=>uccpi( lv_unicode_point_code ).
ENDLOOP.
ENDMETHOD.
METHOD create.
* Office 2007 file format is a cab of several xml files with extension .xlsx
DATA: lo_zip TYPE REF TO cl_abap_zip,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_active_worksheet TYPE REF TO zcl_excel_worksheet,
lo_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_nested_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_table TYPE REF TO zcl_excel_table,
lo_drawing TYPE REF TO zcl_excel_drawing,
lo_drawings TYPE REF TO zcl_excel_drawings,
lo_comment TYPE REF TO zcl_excel_comment, " (+) Issue #180
lo_comments TYPE REF TO zcl_excel_comments. " (+) Issue #180
DATA: lv_content TYPE xstring,
lv_active TYPE flag,
lv_xl_sheet TYPE string,
lv_xl_sheet_rels TYPE string,
lv_xl_drawing_for_comment TYPE string, " (+) Issue #180
lv_xl_comment TYPE string, " (+) Issue #180
lv_xl_drawing TYPE string,
lv_xl_drawing_rels TYPE string,
lv_index_str TYPE string,
lv_value TYPE string,
lv_sheet_index TYPE i,
lv_drawing_index TYPE i,
lv_comment_index TYPE i. " (+) Issue #180
**********************************************************************
**********************************************************************
* Start of insertion # issue 139 - Dateretention of cellstyles
me->excel->add_static_styles( ).
* End of insertion # issue 139 - Dateretention of cellstyles
**********************************************************************
* STEP 1: Create archive object file (ZIP)
CREATE OBJECT lo_zip.
**********************************************************************
* STEP 2: Add [Content_Types].xml to zip
lv_content = me->create_content_types( ).
lo_zip->add( name = me->c_content_types
content = lv_content ).
**********************************************************************
* STEP 3: Add _rels/.rels to zip
lv_content = me->create_relationships( ).
lo_zip->add( name = me->c_relationships
content = lv_content ).
**********************************************************************
* STEP 4: Add docProps/app.xml to zip
lv_content = me->create_docprops_app( ).
lo_zip->add( name = me->c_docprops_app
content = lv_content ).
**********************************************************************
* STEP 5: Add docProps/core.xml to zip
lv_content = me->create_docprops_core( ).
lo_zip->add( name = me->c_docprops_core
content = lv_content ).
**********************************************************************
* STEP 6: Add xl/_rels/workbook.xml.rels to zip
lv_content = me->create_xl_relationships( ).
lo_zip->add( name = me->c_xl_relationships
content = lv_content ).
**********************************************************************
* STEP 6: Add xl/_rels/workbook.xml.rels to zip
lv_content = me->create_xl_theme( ).
lo_zip->add( name = me->c_xl_theme
content = lv_content ).
**********************************************************************
* STEP 7: Add xl/workbook.xml to zip
lv_content = me->create_xl_workbook( ).
lo_zip->add( name = me->c_xl_workbook
content = lv_content ).
**********************************************************************
* STEP 8: Add xl/workbook.xml to zip
lv_content = me->create_xl_styles( ).
lo_zip->add( name = me->c_xl_styles
content = lv_content ).
**********************************************************************
* STEP 9: Add sharedStrings.xml to zip
lv_content = me->create_xl_sharedstrings( ).
lo_zip->add( name = me->c_xl_sharedstrings
content = lv_content ).
**********************************************************************
* STEP 10: Add sheet#.xml and drawing#.xml to zip
lo_iterator = me->excel->get_worksheets_iterator( ).
lo_active_worksheet = me->excel->get_active_worksheet( ).
WHILE lo_iterator->has_next( ) EQ abap_true.
lv_sheet_index = sy-index.
lo_worksheet ?= lo_iterator->get_next( ).
IF lo_active_worksheet->get_guid( ) EQ lo_worksheet->get_guid( ).
lv_active = abap_true.
ELSE.
lv_active = abap_false.
ENDIF.
lv_content = me->create_xl_sheet( io_worksheet = lo_worksheet
iv_active = lv_active ).
lv_xl_sheet = me->c_xl_sheet.
lv_index_str = lv_sheet_index.
CONDENSE lv_index_str NO-GAPS.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet WITH lv_index_str.
lo_zip->add( name = lv_xl_sheet
content = lv_content ).
* Begin - Add - Issue #180
* Add comments **********************************
lo_comments = lo_worksheet->get_comments( ).
IF lo_comments->is_empty( ) = abap_false.
lv_comment_index = lv_comment_index + 1.
" Create comment itself
lv_content = me->create_xl_comments( lo_worksheet ).
lv_xl_comment = me->c_xl_comments.
lv_index_str = lv_comment_index.
CONDENSE lv_index_str NO-GAPS.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_comment WITH lv_index_str.
lo_zip->add( name = lv_xl_comment
content = lv_content ).
" Create vmlDrawing that will host the comment
lv_content = me->create_xl_drawing_for_comments( 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 ).
ENDIF.
* End - Add - Issue #180
* Add drawings **********************************
lo_drawings = lo_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
lv_drawing_index = lv_drawing_index + 1.
lv_content = me->create_xl_drawings( lo_worksheet ).
lv_xl_drawing = me->c_xl_drawings.
lv_index_str = lv_drawing_index.
CONDENSE lv_index_str NO-GAPS.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_index_str.
lo_zip->add( name = lv_xl_drawing
content = lv_content ).
lv_content = me->create_xl_drawings_rels( lo_worksheet ).
lv_xl_drawing_rels = me->c_xl_drawings_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.
* 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_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet
iv_drawing_index = lv_drawing_index
iv_comment_index = lv_comment_index ). " (+) Issue #180
lv_index_str = lv_sheet_index.
CONDENSE lv_index_str NO-GAPS.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_sheet_rels WITH lv_index_str.
lo_zip->add( name = lv_xl_sheet_rels
content = lv_content ).
lo_nested_iterator = lo_worksheet->get_tables_iterator( ).
WHILE lo_nested_iterator->has_next( ) EQ abap_true.
lo_table ?= lo_nested_iterator->get_next( ).
lv_content = me->create_xl_table( lo_table ).
lv_value = lo_table->get_name( ).
CONCATENATE 'xl/tables/' lv_value '.xml' INTO lv_value.
lo_zip->add( name = lv_value
content = lv_content ).
ENDWHILE.
ENDWHILE.
**********************************************************************
* STEP 11: Add media
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ).
WHILE lo_iterator->has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->get_next( ).
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 ).
ENDWHILE.
**********************************************************************
* STEP 12: Add charts
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ).
WHILE lo_iterator->has_next( ) EQ abap_true.
lo_drawing ?= lo_iterator->get_next( ).
lv_content = lo_drawing->get_media( ).
"-------------Added by Alessandro Iannacci - Only if template exist
IF lv_content IS NOT INITIAL AND me->excel->use_template EQ abap_true.
lv_value = lo_drawing->get_media_name( ).
CONCATENATE 'xl/charts/' lv_value INTO lv_value.
lo_zip->add( name = lv_value
content = lv_content ).
ELSE. "ADD CUSTOM CHART!!!!
lv_content = me->create_xl_charts( lo_drawing ).
lv_value = lo_drawing->get_media_name( ).
CONCATENATE 'xl/charts/' lv_value INTO lv_value.
lo_zip->add( name = lv_value
content = lv_content ).
ENDIF.
"-------------------------------------------------
ENDWHILE.
* Second to last step: Allow further information put into the zip archive by child classes
me->add_further_data_to_zip( lo_zip ).
**********************************************************************
* Last step: Create the final zip
ep_excel = lo_zip->save( ).
ENDMETHOD.
METHOD create_content_types.
** Constant node name
DATA: lc_xml_node_types TYPE string VALUE 'Types',
lc_xml_node_override TYPE string VALUE 'Override',
lc_xml_node_default TYPE string VALUE 'Default',
" Node attributes
lc_xml_attr_partname TYPE string VALUE 'PartName',
lc_xml_attr_extension TYPE string VALUE 'Extension',
lc_xml_attr_contenttype TYPE string VALUE 'ContentType',
" Node namespace
lc_xml_node_types_ns TYPE string VALUE 'http://schemas.openxmlformats.org/package/2006/content-types',
" Node extension
lc_xml_node_rels_ext TYPE string VALUE 'rels',
lc_xml_node_xml_ext TYPE string VALUE 'xml',
lc_xml_node_xml_vml TYPE string VALUE 'vml', " (+) GGAR
" Node partnumber
lc_xml_node_theme_pn TYPE string VALUE '/xl/theme/theme1.xml',
lc_xml_node_styles_pn TYPE string VALUE '/xl/styles.xml',
lc_xml_node_workb_pn TYPE string VALUE '/xl/workbook.xml',
lc_xml_node_props_pn TYPE string VALUE '/docProps/app.xml',
lc_xml_node_worksheet_pn TYPE string VALUE '/xl/worksheets/sheet#.xml',
lc_xml_node_strings_pn TYPE string VALUE '/xl/sharedStrings.xml',
lc_xml_node_core_pn TYPE string VALUE '/docProps/core.xml',
lc_xml_node_chart_pn TYPE string VALUE '/xl/charts/chart#.xml',
" Node contentType
lc_xml_node_theme_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.theme+xml',
lc_xml_node_styles_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',
lc_xml_node_workb_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',
lc_xml_node_rels_ct TYPE string VALUE 'application/vnd.openxmlformats-package.relationships+xml',
lc_xml_node_vml_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.vmlDrawing',
lc_xml_node_xml_ct TYPE string VALUE 'application/xml',
lc_xml_node_props_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.extended-properties+xml',
lc_xml_node_worksheet_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',
lc_xml_node_strings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',
lc_xml_node_core_ct TYPE string VALUE 'application/vnd.openxmlformats-package.core-properties+xml',
lc_xml_node_table_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml',
lc_xml_node_comments_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml', " (+) GGAR
lc_xml_node_drawings_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawing+xml',
lc_xml_node_chart_ct TYPE string VALUE 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'.
DATA: 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_worksheet TYPE REF TO zcl_excel_worksheet,
lo_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_nested_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_table TYPE REF TO zcl_excel_table.
DATA: lv_worksheets_num TYPE i,
lv_worksheets_numc TYPE n LENGTH 3,
lv_xml_node_worksheet_pn TYPE string,
lv_value TYPE string,
lv_comment_index TYPE i VALUE 1, " (+) GGAR
lv_drawing_index TYPE i VALUE 1,
lv_index_str TYPE string.
**********************************************************************
* STEP 1: Create [Content_Types].xml into the root of the ZIP
lo_document = create_xml_document( ).
**********************************************************************
* STEP 3: Create main node types
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_types
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_types_ns ).
**********************************************************************
* STEP 4: Create subnodes
" rels node
lo_element = lo_document->create_simple_element( name = lc_xml_node_default
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_extension
value = lc_xml_node_rels_ext ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_rels_ct ).
lo_element_root->append_child( new_child = lo_element ).
" extension node
lo_element = lo_document->create_simple_element( name = lc_xml_node_default
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_extension
value = lc_xml_node_xml_ext ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_xml_ct ).
lo_element_root->append_child( new_child = lo_element ).
* Begin - Add - GGAR
" VML node (for comments)
lo_element = lo_document->create_simple_element( name = lc_xml_node_default
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_extension
value = lc_xml_node_xml_vml ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_vml_ct ).
lo_element_root->append_child( new_child = lo_element ).
* End - Add - GGAR
" Theme node
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lc_xml_node_theme_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_theme_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Styles node
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lc_xml_node_styles_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_styles_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Workbook node
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lc_xml_node_workb_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_workb_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Properties node
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lc_xml_node_props_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_props_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Worksheet node
lv_worksheets_num = excel->get_worksheets_size( ).
DO lv_worksheets_num TIMES.
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lv_worksheets_numc = sy-index.
SHIFT lv_worksheets_numc LEFT DELETING LEADING '0'.
lv_xml_node_worksheet_pn = lc_xml_node_worksheet_pn.
REPLACE ALL OCCURRENCES OF '#' IN lv_xml_node_worksheet_pn WITH lv_worksheets_numc.
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lv_xml_node_worksheet_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_worksheet_ct ).
lo_element_root->append_child( new_child = lo_element ).
ENDDO.
lo_iterator = me->excel->get_worksheets_iterator( ).
WHILE lo_iterator->has_next( ) EQ abap_true.
lo_worksheet ?= lo_iterator->get_next( ).
lo_nested_iterator = lo_worksheet->get_tables_iterator( ).
WHILE lo_nested_iterator->has_next( ) EQ abap_true.
lo_table ?= lo_nested_iterator->get_next( ).
lv_value = lo_table->get_name( ).
CONCATENATE '/xl/tables/' lv_value '.xml' INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lv_value ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_table_ct ).
lo_element_root->append_child( new_child = lo_element ).
ENDWHILE.
* Begin - Add - GGAR
" Comments
DATA: lo_comments TYPE REF TO zcl_excel_comments.
lo_comments = lo_worksheet->get_comments( ).
IF lo_comments->is_empty( ) = abap_false.
lv_index_str = lv_comment_index.
CONDENSE lv_index_str NO-GAPS.
CONCATENATE '/' me->c_xl_comments INTO lv_value.
REPLACE '#' WITH lv_index_str INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lv_value ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_comments_ct ).
lo_element_root->append_child( new_child = lo_element ).
ADD 1 TO lv_comment_index.
ENDIF.
* End - Add - GGAR
" Drawings
DATA: lo_drawings TYPE REF TO zcl_excel_drawings.
lo_drawings = lo_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
lv_index_str = lv_drawing_index.
CONDENSE lv_index_str NO-GAPS.
CONCATENATE '/' me->c_xl_drawings INTO lv_value.
REPLACE '#' WITH lv_index_str INTO lv_value.
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lv_value ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_drawings_ct ).
lo_element_root->append_child( new_child = lo_element ).
ADD 1 TO lv_drawing_index.
ENDIF.
ENDWHILE.
" media mimes
DATA: lo_drawing TYPE REF TO zcl_excel_drawing,
lt_media_type TYPE TABLE OF mimetypes-extension,
lv_media_type TYPE mimetypes-extension,
lv_mime_type TYPE mimetypes-type.
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_image ).
WHILE lo_iterator->has_next( ) = abap_true.
lo_drawing ?= lo_iterator->get_next( ).
lv_media_type = lo_drawing->get_media_type( ).
COLLECT lv_media_type INTO lt_media_type.
ENDWHILE.
LOOP AT lt_media_type INTO lv_media_type.
CALL FUNCTION 'SDOK_MIMETYPE_GET'
EXPORTING
extension = lv_media_type
IMPORTING
mimetype = lv_mime_type.
lo_element = lo_document->create_simple_element( name = lc_xml_node_default
parent = lo_document ).
lv_value = lv_media_type.
lo_element->set_attribute_ns( name = lc_xml_attr_extension
value = lv_value ).
lv_value = lv_mime_type.
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
ENDLOOP.
" Charts
lo_iterator = me->excel->get_drawings_iterator( zcl_excel_drawing=>type_chart ).
WHILE lo_iterator->has_next( ) = abap_true.
lo_drawing ?= lo_iterator->get_next( ).
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lv_index_str = lo_drawing->get_index( ).
CONDENSE lv_index_str.
lv_value = lc_xml_node_chart_pn.
REPLACE ALL OCCURRENCES OF '#' IN lv_value WITH lv_index_str.
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lv_value ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_chart_ct ).
lo_element_root->append_child( new_child = lo_element ).
ENDWHILE.
" Strings node
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lc_xml_node_strings_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_strings_ct ).
lo_element_root->append_child( new_child = lo_element ).
" Strings node
lo_element = lo_document->create_simple_element( name = lc_xml_node_override
parent = lo_document ).
lo_element->set_attribute_ns( name = lc_xml_attr_partname
value = lc_xml_node_core_pn ).
lo_element->set_attribute_ns( name = lc_xml_attr_contenttype
value = lc_xml_node_core_ct ).
lo_element_root->append_child( new_child = lo_element ).
**********************************************************************
* STEP 5: Create xstring stream
ep_content = render_xml_document( lo_document ).
ENDMETHOD.
METHOD create_docprops_app.
** Constant node name
DATA: lc_xml_node_properties TYPE string VALUE 'Properties',
lc_xml_node_application TYPE string VALUE 'Application',
lc_xml_node_docsecurity TYPE string VALUE 'DocSecurity',
lc_xml_node_scalecrop TYPE string VALUE 'ScaleCrop',
lc_xml_node_headingpairs TYPE string VALUE 'HeadingPairs',
lc_xml_node_vector TYPE string VALUE 'vector',
lc_xml_node_variant TYPE string VALUE 'variant',
lc_xml_node_lpstr TYPE string VALUE 'lpstr',
lc_xml_node_i4 TYPE string VALUE 'i4',
lc_xml_node_titlesofparts TYPE string VALUE 'TitlesOfParts',
lc_xml_node_company TYPE string VALUE 'Company',
lc_xml_node_linksuptodate TYPE string VALUE 'LinksUpToDate',
lc_xml_node_shareddoc TYPE string VALUE 'SharedDoc',
lc_xml_node_hyperlinkschanged TYPE string VALUE 'HyperlinksChanged',
lc_xml_node_appversion TYPE string VALUE 'AppVersion',
" Namespace prefix
lc_vt_ns TYPE string VALUE 'vt',
lc_xml_node_props_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties',
lc_xml_node_props_vt_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',
" Node attributes
lc_xml_attr_size TYPE string VALUE 'size',
lc_xml_attr_basetype TYPE string VALUE 'baseType'.
DATA: 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_vector TYPE REF TO if_ixml_element,
lo_sub_element_variant TYPE REF TO if_ixml_element,
lo_sub_element_lpstr TYPE REF TO if_ixml_element,
lo_sub_element_i4 TYPE REF TO if_ixml_element,
lo_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_worksheet TYPE REF TO zcl_excel_worksheet.
DATA: lv_value TYPE string.
**********************************************************************
* STEP 1: Create [Content_Types].xml into the root of the ZIP
lo_document = create_xml_document( ).
**********************************************************************
* STEP 3: Create main node properties
lo_element_root = lo_document->create_simple_element( name = lc_xml_node_properties
parent = lo_document ).
lo_element_root->set_attribute_ns( name = 'xmlns'
value = lc_xml_node_props_ns ).
lo_element_root->set_attribute_ns( name = 'xmlns:vt'
value = lc_xml_node_props_vt_ns ).
**********************************************************************
* STEP 4: Create subnodes
" Application
lo_element = lo_document->create_simple_element( name = lc_xml_node_application
parent = lo_document ).
lv_value = excel->zif_excel_book_properties~application.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" DocSecurity
lo_element = lo_document->create_simple_element( name = lc_xml_node_docsecurity
parent = lo_document ).
lv_value = excel->zif_excel_book_properties~docsecurity.
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" ScaleCrop
lo_element = lo_document->create_simple_element( name = lc_xml_node_scalecrop
parent = lo_document ).
lv_value = me->flag2bool( excel->zif_excel_book_properties~scalecrop ).
lo_element->set_value( value = lv_value ).
lo_element_root->append_child( new_child = lo_element ).
" HeadingPairs
lo_element = lo_document->create_simple_element( name = lc_xml_node_headingpairs
parent = lo_document ).
" * vector node
lo_sub_element_vector = lo_document->create_simple_element_ns( name = lc_xml_node_vector
prefix = lc_vt_ns
parent = lo_document ).
lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_size
value = '2' ).
lo_sub_element_vector->set_attribute_ns( name = lc_xml_attr_basetype
value = lc_xml_node_variant ).
" ** variant node
lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant
prefix = lc_vt_ns
parent = lo_document ).
" *** lpstr node
lo_sub_element_lpstr = lo_document->create_simple_element_ns( name = lc_xml_node_lpstr
prefix = lc_vt_ns
parent = lo_document ).
lv_value = excel->get_worksheets_name( ).
lo_sub_element_lpstr->set_value( value = lv_value ).
lo_sub_element_variant->append_child( new_child = lo_sub_element_lpstr ). " lpstr node
lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node
" ** variant node
lo_sub_element_variant = lo_document->create_simple_element_ns( name = lc_xml_node_variant
prefix = lc_vt_ns
parent = lo_document ).
" *** i4 node
lo_sub_element_i4 = lo_document->create_simple_element_ns( name = lc_xml_node_i4
prefix = lc_vt_ns
parent = lo_document ).
lv_value = excel->get_worksheets_size( ).
SHIFT lv_value RIGHT DELETING TRAILING space.
SHIFT lv_value LEFT DELETING LEADING space.
lo_sub_element_i4->set_value( value = lv_value ).
lo_sub_element_variant->append_child( new_child = lo_sub_element_i4 ). " lpstr node
lo_sub_element_vector->append_child( new_child = lo_sub_element_variant ). " variant node
lo_element->append_child( new_child = lo_sub_element_vector ). " vector node
lo_element_root->append_child( new_child = lo_element ). " HeadingPairs
" TitlesOfParts
lo_element = lo_document->create_simple_element( name = lc_xml_node_titlesofparts
parent = lo_document ).