File Coverage

blib/lib/Excel/Writer/XLSX/Package/App.pm
Criterion Covered Total %
statement 117 117 100.0
branch 10 10 100.0
condition 2 2 100.0
subroutine 25 25 100.0
pod 0 1 0.0
total 154 155 99.3


line stmt bran cond sub pod time code
1              
2             ###############################################################################
3             #
4             # App - A class for writing the Excel XLSX app.xml file.
5             #
6             # Used in conjunction with Excel::Writer::XLSX
7             #
8             # Copyright 2000-2021, John McNamara, jmcnamara@cpan.org
9             #
10             # Documentation after __END__
11             #
12              
13             # perltidy with the following options: -mbl=2 -pt=0 -nola
14              
15             use 5.008002;
16 1124     1124   15011 use strict;
  1124         3221  
17 1124     1124   4772 use warnings;
  1124         1843  
  1124         17073  
18 1124     1124   4344 use Carp;
  1124         1936  
  1124         19870  
19 1124     1124   4548 use Excel::Writer::XLSX::Package::XMLwriter;
  1124         1945  
  1124         48613  
20 1124     1124   6253  
  1124         2178  
  1124         1005120  
21             our @ISA = qw(Excel::Writer::XLSX::Package::XMLwriter);
22             our $VERSION = '1.09';
23              
24              
25             ###############################################################################
26             #
27             # Public and private API methods.
28             #
29             ###############################################################################
30              
31              
32             ###############################################################################
33             #
34             # new()
35             #
36             # Constructor.
37             #
38              
39             my $class = shift;
40             my $fh = shift;
41 896     896 0 5009 my $self = Excel::Writer::XLSX::Package::XMLwriter->new( $fh );
42 896         1841  
43 896         2980 $self->{_part_names} = [];
44             $self->{_heading_pairs} = [];
45 896         2884 $self->{_properties} = {};
46 896         2413 $self->{_doc_security} = 0;
47 896         2405  
48 896         2007 bless $self, $class;
49              
50 896         2172 return $self;
51             }
52 896         2435  
53              
54             ###############################################################################
55             #
56             # _assemble_xml_file()
57             #
58             # Assemble and write the XML file.
59             #
60              
61             my $self = shift;
62              
63             $self->xml_declaration;
64 895     895   2153 $self->_write_properties();
65             $self->_write_application();
66 895         7186 $self->_write_doc_security();
67 895         4235 $self->_write_scale_crop();
68 895         3492 $self->_write_heading_pairs();
69 895         3384 $self->_write_titles_of_parts();
70 895         3373 $self->_write_manager();
71 895         3450 $self->_write_company();
72 895         3623 $self->_write_links_up_to_date();
73 895         3698 $self->_write_shared_doc();
74 895         3417 $self->_write_hyperlink_base();
75 895         3610 $self->_write_hyperlinks_changed();
76 895         3365 $self->_write_app_version();
77 895         4215  
78 895         3910 $self->xml_end_tag( 'Properties' );
79 895         3346  
80             # Close the XML writer filehandle.
81 895         3250 $self->xml_get_fh()->close();
82             }
83              
84 895         6657  
85             ###############################################################################
86             #
87             # _add_part_name()
88             #
89             # Add the name of a workbook Part such as 'Sheet1' or 'Print_Titles'.
90             #
91              
92             my $self = shift;
93             my $part_name = shift;
94              
95             push @{ $self->{_part_names} }, $part_name;
96 1084     1084   2464 }
97 1084         2079  
98              
99 1084         2080 ###############################################################################
  1084         4161  
100             #
101             # _add_heading_pair()
102             #
103             # Add the name of a workbook Heading Pair such as 'Worksheets', 'Charts' or
104             # 'Named Ranges'.
105             #
106              
107             my $self = shift;
108             my $heading_pair = shift;
109              
110             return unless $heading_pair->[1]; # Ignore empty pairs such as chartsheets.
111              
112 1806     1806   3400 my @vector = (
113 1806         2719 [ 'lpstr', $heading_pair->[0] ], # Data name
114             [ 'i4', $heading_pair->[1] ], # Data size
115 1806 100       6607 );
116              
117 932         5076 push @{ $self->{_heading_pairs} }, @vector;
118             }
119              
120              
121             ###############################################################################
122 932         2283 #
  932         7280  
123             # _set_properties()
124             #
125             # Set the document properties.
126             #
127              
128             my $self = shift;
129             my $properties = shift;
130              
131             $self->{_properties} = $properties;
132             }
133              
134 892     892   2044  
135 892         1779 ###############################################################################
136             #
137 892         2568 # Internal methods.
138             #
139             ###############################################################################
140              
141              
142             ###############################################################################
143             #
144             # XML writing methods.
145             #
146             ###############################################################################
147              
148              
149             ###############################################################################
150             #
151             # _write_properties()
152             #
153             # Write the <Properties> element.
154             #
155              
156             my $self = shift;
157             my $schema = 'http://schemas.openxmlformats.org/officeDocument/2006/';
158             my $xmlns = $schema . 'extended-properties';
159             my $xmlns_vt = $schema . 'docPropsVTypes';
160              
161             my @attributes = (
162             'xmlns' => $xmlns,
163 895     895   2397 'xmlns:vt' => $xmlns_vt,
164 895         2125 );
165 895         3186  
166 895         2482 $self->xml_start_tag( 'Properties', @attributes );
167             }
168 895         3456  
169             ###############################################################################
170             #
171             # _write_application()
172             #
173 895         5309 # Write the <Application> element.
174             #
175              
176             my $self = shift;
177             my $data = 'Microsoft Excel';
178              
179             $self->xml_data_element( 'Application', $data );
180             }
181              
182              
183             ###############################################################################
184 895     895   1901 #
185 895         1783 # _write_doc_security()
186             #
187 895         7592 # Write the <DocSecurity> element.
188             #
189              
190             my $self = shift;
191              
192             $self->xml_data_element( 'DocSecurity', $self->{_doc_security} );
193             }
194              
195              
196             ###############################################################################
197             #
198             # _write_scale_crop()
199 895     895   1859 #
200             # Write the <ScaleCrop> element.
201 895         3143 #
202              
203             my $self = shift;
204             my $data = 'false';
205              
206             $self->xml_data_element( 'ScaleCrop', $data );
207             }
208              
209              
210             ###############################################################################
211             #
212             # _write_heading_pairs()
213 895     895   1961 #
214 895         1983 # Write the <HeadingPairs> element.
215             #
216 895         2967  
217             my $self = shift;
218              
219             $self->xml_start_tag( 'HeadingPairs' );
220              
221             $self->_write_vt_vector( 'variant', $self->{_heading_pairs} );
222              
223             $self->xml_end_tag( 'HeadingPairs' );
224             }
225              
226              
227             ###############################################################################
228 895     895   1923 #
229             # _write_titles_of_parts()
230 895         3405 #
231             # Write the <TitlesOfParts> element.
232 895         3907 #
233              
234 895         2792 my $self = shift;
235              
236             $self->xml_start_tag( 'TitlesOfParts' );
237              
238             my @parts_data;
239              
240             for my $part_name ( @{ $self->{_part_names} } ) {
241             push @parts_data, [ 'lpstr', $part_name ];
242             }
243              
244             $self->_write_vt_vector( 'lpstr', \@parts_data );
245              
246 895     895   2176 $self->xml_end_tag( 'TitlesOfParts' );
247             }
248 895         3517  
249              
250 895         1729 ###############################################################################
251             #
252 895         2060 # _write_vt_vector()
  895         2958  
253 1084         3772 #
254             # Write the <vt:vector> element.
255             #
256 895         3543  
257             my $self = shift;
258 895         2826 my $base_type = shift;
259             my $data = shift;
260             my $size = @$data;
261              
262             my @attributes = (
263             'size' => $size,
264             'baseType' => $base_type,
265             );
266              
267             $self->xml_start_tag( 'vt:vector', @attributes );
268              
269             for my $aref ( @$data ) {
270 1790     1790   3222 $self->xml_start_tag( 'vt:variant' ) if $base_type eq 'variant';
271 1790         2988 $self->_write_vt_data( @$aref );
272 1790         2722 $self->xml_end_tag( 'vt:variant' ) if $base_type eq 'variant';
273 1790         3193 }
274              
275 1790         5071 $self->xml_end_tag( 'vt:vector' );
276             }
277              
278              
279             ##############################################################################
280 1790         5615 #
281             # _write_vt_data()
282 1790         4088 #
283 2948 100       9844 # Write the <vt:*> elements such as <vt:lpstr> and <vt:if>.
284 2948         7777 #
285 2948 100       11115  
286             my $self = shift;
287             my $type = shift;
288 1790         4610 my $data = shift;
289              
290             $self->xml_data_element( "vt:$type", $data );
291             }
292              
293              
294             ###############################################################################
295             #
296             # _write_company()
297             #
298             # Write the <Company> element.
299             #
300 2948     2948   4309  
301 2948         4321 my $self = shift;
302 2948         4335 my $data = $self->{_properties}->{company} || '';
303              
304 2948         8266 $self->xml_data_element( 'Company', $data );
305             }
306              
307              
308             ###############################################################################
309             #
310             # _write_manager()
311             #
312             # Write the <Manager> element.
313             #
314              
315             my $self = shift;
316 895     895   1979 my $data = $self->{_properties}->{manager};
317 895   100     6121  
318             return unless $data;
319 895         3722  
320             $self->xml_data_element( 'Manager', $data );
321             }
322              
323              
324             ###############################################################################
325             #
326             # _write_links_up_to_date()
327             #
328             # Write the <LinksUpToDate> element.
329             #
330              
331 895     895   1921 my $self = shift;
332 895         2170 my $data = 'false';
333              
334 895 100       3486 $self->xml_data_element( 'LinksUpToDate', $data );
335             }
336 1         8  
337              
338             ###############################################################################
339             #
340             # _write_shared_doc()
341             #
342             # Write the <SharedDoc> element.
343             #
344              
345             my $self = shift;
346             my $data = 'false';
347              
348 895     895   2398 $self->xml_data_element( 'SharedDoc', $data );
349 895         2109 }
350              
351 895         3136  
352             ###############################################################################
353             #
354             # _write_hyperlink_base()
355             #
356             # Write the <HyperlinkBase> element.
357             #
358              
359             my $self = shift;
360             my $data = $self->{_properties}->{hyperlink_base};
361              
362             return unless $data;
363 895     895   2347  
364 895         2539 $self->xml_data_element( 'HyperlinkBase', $data );
365             }
366 895         3274  
367              
368             ###############################################################################
369             #
370             # _write_hyperlinks_changed()
371             #
372             # Write the <HyperlinksChanged> element.
373             #
374              
375             my $self = shift;
376             my $data = 'false';
377              
378 895     895   2046 $self->xml_data_element( 'HyperlinksChanged', $data );
379 895         2726 }
380              
381 895 100       3661  
382             ###############################################################################
383 1         3 #
384             # _write_app_version()
385             #
386             # Write the <AppVersion> element.
387             #
388              
389             my $self = shift;
390             my $data = '12.0000';
391              
392             $self->xml_data_element( 'AppVersion', $data );
393             }
394              
395 895     895   2318  
396 895         2158 1;
397              
398 895         3298  
399              
400             =pod
401              
402             =head1 NAME
403              
404             App - A class for writing the Excel XLSX app.xml file.
405              
406             =head1 SYNOPSIS
407              
408             See the documentation for L<Excel::Writer::XLSX>.
409              
410 895     895   2185 =head1 DESCRIPTION
411 895         2133  
412             This module is used in conjunction with L<Excel::Writer::XLSX>.
413 895         3183  
414             =head1 AUTHOR
415              
416             John McNamara jmcnamara@cpan.org
417              
418             =head1 COPYRIGHT
419              
420             (c) MM-MMXXI, John McNamara.
421              
422             All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
423              
424             =head1 LICENSE
425              
426             Either the Perl Artistic Licence L<http://dev.perl.org/licenses/artistic.html> or the GPL L<http://www.opensource.org/licenses/gpl-license.php>.
427              
428             =head1 DISCLAIMER OF WARRANTY
429              
430             See the documentation for L<Excel::Writer::XLSX>.
431              
432             =cut