writeexcel 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/.gitattributes +1 -0
  2. data/README.rdoc +12 -6
  3. data/VERSION +1 -1
  4. data/charts/chartex.rb +316 -315
  5. data/charts/demo1.rb +1 -0
  6. data/charts/demo2.rb +1 -0
  7. data/charts/demo3.rb +117 -116
  8. data/charts/demo4.rb +119 -118
  9. data/charts/demo5.rb +48 -47
  10. data/examples/a_simple.rb +1 -0
  11. data/examples/autofilter.rb +1 -0
  12. data/examples/bigfile.rb +30 -29
  13. data/examples/chart_area.rb +121 -120
  14. data/examples/chart_bar.rb +120 -119
  15. data/examples/chart_column.rb +120 -119
  16. data/examples/chart_line.rb +120 -119
  17. data/examples/chart_pie.rb +108 -107
  18. data/examples/chart_scatter.rb +121 -120
  19. data/examples/chart_stock.rb +148 -147
  20. data/examples/chess.rb +1 -0
  21. data/examples/colors.rb +1 -0
  22. data/examples/comments1.rb +1 -0
  23. data/examples/comments2.rb +3 -2
  24. data/examples/copyformat.rb +1 -0
  25. data/examples/data_validate.rb +1 -0
  26. data/examples/date_time.rb +1 -0
  27. data/examples/defined_name.rb +1 -0
  28. data/examples/demo.rb +1 -0
  29. data/examples/diag_border.rb +1 -0
  30. data/examples/formats.rb +1 -0
  31. data/examples/formula_result.rb +1 -0
  32. data/examples/header.rb +1 -0
  33. data/examples/hide_sheet.rb +1 -0
  34. data/examples/hyperlink.rb +1 -0
  35. data/examples/images.rb +1 -0
  36. data/examples/indent.rb +1 -0
  37. data/examples/merge1.rb +1 -0
  38. data/examples/merge2.rb +1 -0
  39. data/examples/merge3.rb +1 -0
  40. data/examples/merge4.rb +1 -0
  41. data/examples/merge5.rb +1 -0
  42. data/examples/merge6.rb +67 -66
  43. data/examples/outline.rb +1 -0
  44. data/examples/outline_collapsed.rb +1 -0
  45. data/examples/panes.rb +1 -0
  46. data/examples/properties.rb +1 -0
  47. data/examples/properties_jp.rb +1 -0
  48. data/examples/protection.rb +1 -0
  49. data/examples/regions.rb +1 -0
  50. data/examples/repeat.rb +1 -0
  51. data/examples/right_to_left.rb +1 -0
  52. data/examples/row_wrap.rb +1 -0
  53. data/examples/stats.rb +1 -0
  54. data/examples/stocks.rb +1 -0
  55. data/examples/tab_colors.rb +1 -0
  56. data/examples/write_arrays.rb +1 -0
  57. data/lib/writeexcel.rb +6 -1
  58. data/lib/writeexcel/biffwriter.rb +21 -20
  59. data/lib/writeexcel/chart.rb +25 -12
  60. data/lib/writeexcel/charts/area.rb +153 -152
  61. data/lib/writeexcel/charts/bar.rb +178 -177
  62. data/lib/writeexcel/charts/column.rb +157 -156
  63. data/lib/writeexcel/charts/external.rb +62 -61
  64. data/lib/writeexcel/charts/line.rb +153 -152
  65. data/lib/writeexcel/charts/pie.rb +170 -169
  66. data/lib/writeexcel/charts/scatter.rb +4 -3
  67. data/lib/writeexcel/charts/stock.rb +212 -211
  68. data/lib/writeexcel/compatibility.rb +320 -0
  69. data/lib/writeexcel/excelformulaparser.rb +587 -586
  70. data/lib/writeexcel/format.rb +12 -13
  71. data/lib/writeexcel/formula.rb +30 -28
  72. data/lib/writeexcel/helper.rb +23 -0
  73. data/lib/writeexcel/olewriter.rb +5 -16
  74. data/lib/writeexcel/properties.rb +43 -54
  75. data/lib/writeexcel/storage_lite.rb +981 -968
  76. data/lib/writeexcel/workbook.rb +94 -73
  77. data/lib/writeexcel/worksheet.rb +230 -210
  78. data/test/helper.rb +19 -0
  79. data/test/test_00_IEEE_double.rb +1 -0
  80. data/test/test_01_add_worksheet.rb +1 -0
  81. data/test/test_02_merge_formats.rb +3 -5
  82. data/test/test_04_dimensions.rb +3 -5
  83. data/test/test_05_rows.rb +6 -6
  84. data/test/test_06_extsst.rb +8 -8
  85. data/test/test_11_date_time.rb +3 -5
  86. data/test/test_12_date_only.rb +3 -5
  87. data/test/test_13_date_seconds.rb +4 -6
  88. data/test/test_21_escher.rb +3 -5
  89. data/test/test_22_mso_drawing_group.rb +20 -22
  90. data/test/test_23_note.rb +5 -7
  91. data/test/test_24_txo.rb +3 -5
  92. data/test/test_25_position_object.rb +84 -79
  93. data/test/test_26_autofilter.rb +3 -13
  94. data/test/test_27_autofilter.rb +3 -13
  95. data/test/test_28_autofilter.rb +3 -13
  96. data/test/test_29_process_jpg.rb +5 -0
  97. data/test/test_30_validation_dval.rb +3 -5
  98. data/test/test_31_validation_dv_strings.rb +3 -5
  99. data/test/test_32_validation_dv_formula.rb +3 -5
  100. data/test/test_40_property_types.rb +10 -9
  101. data/test/test_41_properties.rb +1 -0
  102. data/test/test_42_set_properties.rb +14 -15
  103. data/test/test_50_name_stored.rb +299 -302
  104. data/test/test_51_name_print_area.rb +357 -360
  105. data/test/test_52_name_print_titles.rb +454 -457
  106. data/test/test_53_autofilter.rb +203 -206
  107. data/test/test_60_chart_generic.rb +5 -0
  108. data/test/test_61_chart_subclasses.rb +95 -94
  109. data/test/test_62_chart_formats.rb +272 -267
  110. data/test/test_63_chart_area_formats.rb +649 -644
  111. data/test/test_biff.rb +12 -38
  112. data/test/test_compatibility.rb +627 -0
  113. data/test/test_example_match.rb +3 -18
  114. data/test/test_format.rb +46 -105
  115. data/test/test_formula.rb +1 -0
  116. data/test/test_ole.rb +3 -4
  117. data/test/test_storage_lite.rb +125 -146
  118. data/test/test_workbook.rb +2 -23
  119. data/test/test_worksheet.rb +4 -5
  120. data/utils/add_magic_comment.rb +80 -0
  121. data/writeexcel.gemspec +8 -2
  122. metadata +10 -4
@@ -0,0 +1 @@
1
+ *.rb diff=ruby
@@ -4,6 +4,12 @@ Write to a cross-platform Excel binary file.
4
4
 
5
5
  == Recent Changes
6
6
 
7
+ v0.4.0
8
+ * works also on Ruby 1.9.1.
9
+ * modify README.rdoc below.
10
+ * write source and run in utf8.
11
+ * unary minus supported. but -1 --> -1*1, -SIN() --> -1*SIN()
12
+
7
13
  v0.3.5
8
14
  * Bug fix. Worksheet#write_comment() doesn't work when value arg is numeric.
9
15
  * Bug fix. TRUE/FALSE in formula was misundarstood as :NAME.
@@ -55,6 +61,7 @@ Original description is below:
55
61
  == Usage
56
62
 
57
63
  See rdoc's WriteExcel class document.
64
+ You must save source file in UTF8 and run ruby with -Ku option or set $KCODE='u'.
58
65
 
59
66
  Example Code:
60
67
 
@@ -88,6 +95,7 @@ Example Code:
88
95
 
89
96
  * WriteExcel.new()
90
97
  * accept default format parameter such as new('foo.xls', :font => 'Roman', :size => 12)
98
+ * Unary minus is supported, but it will be stored as '-1*'. ex) '=-1' -> '=-1*1', '=-SIN(PI()/2)' => '=-1*SIN(PI()/2)'
91
99
  * Worksheet.write(row, col, token, format)
92
100
  * if token.kind_of?(Numeric) then call write_number, if token.kind_of?(String) then not call write_number().
93
101
  * Worksheet.keep_leading_zeros()
@@ -96,14 +104,12 @@ Example Code:
96
104
 
97
105
  == Caution
98
106
 
99
- This library can handle multibyte character written in utf8. I tested in Japanese,
100
- and it looks work well. But, in this version, utf8 or not is recognized
101
- by matching non-ascii characters because ruby 1.8 can not recognize character code
102
- correctly.
107
+ You must save source file in UTF8 and run ruby with -Ku option or set $KCODE='u'
108
+ when use urf8 string data.
103
109
 
104
110
  == Dependencies
105
111
 
106
- * ruby 1.8
112
+ * ruby 1.8, ruby 1.9.1
107
113
 
108
114
  == Author
109
115
 
@@ -117,7 +123,7 @@ Copyright (c) 2009-2010 Hideo NAKAMURA. See LICENSE for details.
117
123
  same as Ruby.
118
124
 
119
125
  == Note on Patches/Pull Requests
120
-
126
+
121
127
  * Fork the project.
122
128
  * Make your feature addition or bug fix.
123
129
  * Add tests for it. This is important so I don't break it in a
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.5
1
+ 0.4.0
@@ -1,315 +1,316 @@
1
- #!/usr/bin/ruby -w
2
-
3
- #######################################################################
4
- #
5
- # chartex - A utility to extract charts from an Excel file for
6
- # insertion into a Spreadsheet::WriteExcel file.
7
- #
8
- # reverse('ゥ'), September 2007, John McNamara, jmcnamara@cpan.org
9
- #
10
- # original written in Perl by John McNamara
11
- # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
12
- #
13
- # Documentation after __END__
14
- #
15
-
16
- require 'writeexcel'
17
-
18
- class Chartex
19
- attr_reader :file
20
-
21
- def initialize(file = nil)
22
- @file = file
23
- @sheetnames = Array.new
24
- @exrefs = Array.new
25
- @buf = StringIO.new
26
- end
27
-
28
- def set_file(file)
29
- @file = file
30
- end
31
-
32
- def get_workbook(file = nil)
33
- file ||= @file
34
- ole = OLEStorageLite.new(file)
35
- book97 = 'Workbook'.unpack('C*').pack('v*')
36
- workbook = ole.getPpsSearch([book97], 1, 1)[0]
37
- @buf.write(workbook.data)
38
- @buf.rewind
39
- workbook
40
- end
41
- end
42
-
43
- # main
44
-
45
- if $0 == __FILE__
46
-
47
- end
48
-
49
- =begin
50
- my $man = 0;
51
- my $help = 0;
52
- my $in_chart = 0;
53
- my $chart_name = 'chart';
54
- my $chart_index = 1;
55
- my $sheet_index = -1;
56
- my @sheetnames;
57
- my @exrefs;
58
- my $depth_count = 0;
59
- my $max_font = 0;
60
-
61
- #
62
- # Do the Getopt and Pod::Usage routines.
63
- #
64
- GetOptions(
65
- 'help|?' => \$help,
66
- 'man' => \$man,
67
- 'chart=s' => \$chart_name,
68
- ) or pod2usage(2);
69
-
70
- pod2usage(1) if $help;
71
- pod2usage(-verbose => 2) if $man;
72
-
73
-
74
- # From the Pod::Usage pod:
75
- # If no arguments were given, then allow STDIN to be used only
76
- # if it's not connected to a terminal (otherwise print usage)
77
- pod2usage() if @ARGV == 0 && -t STDIN;
78
-
79
-
80
-
81
-
82
- # Check that the file can be opened because OLE::Storage_Lite won't tell us.
83
- # Possible race condition here. Could fix with latest OLE::Storage_Lite. TODO.
84
- #
85
- my $file = $ARGV[0];
86
-
87
- open TMP, $file or die "Couldn't open $file. $!\n";
88
- close TMP;
89
-
90
- my $ole = OLE::Storage_Lite->new($file);
91
- my $book97 = pack 'v*', unpack 'C*', 'Workbook';
92
- my $workbook = ($ole->getPpsSearch([$book97], 1, 1))[0];
93
-
94
- die "Couldn't find Excel97 data in file $file.\n" unless $workbook;
95
-
96
-
97
- # Write the data to a file so that we can access it with read().
98
- my $tmpfile = IO::File->new_tmpfile();
99
- binmode $tmpfile;
100
-
101
- my $biff = $workbook->{Data};
102
- print {$tmpfile} $biff;
103
- seek $tmpfile, 0, 0;
104
-
105
-
106
-
107
- my $header;
108
- my $data;
109
-
110
- # Read the file record by record and look for a chart BOF record.
111
- #
112
- while (read $tmpfile, $header, 4) {
113
-
114
- my ($record, $length) = unpack "vv", $header;
115
- next unless $record;
116
-
117
- read $tmpfile, $data, $length;
118
-
119
- # BOUNDSHEET
120
- if ($record == 0x0085) {
121
- push @sheetnames, substr $data, 8;
122
- }
123
-
124
- # EXTERNSHEET
125
- if ($record == 0x0017) {
126
- my $count = unpack 'v', $data;
127
-
128
- for my $i (1 .. $count) {
129
- my @tmp = unpack 'vvv', substr($data, 2 +6*($i-1));
130
- push @exrefs, [@tmp];
131
- }
132
-
133
- }
134
-
135
- # BOF
136
- if ($record == 0x0809) {
137
- my $type = unpack 'xx v', $data;
138
-
139
- if ($type == 0x0020) {
140
- my $filename = sprintf "%s%02d.bin", $chart_name, $chart_index;
141
- open CHART, ">$filename" or die "Couldn't open $filename: $!";
142
- binmode CHART;
143
-
144
- my $sheet_name = $sheetnames[$sheet_index];
145
- $sheet_name .= ' embedded' if $depth_count;
146
-
147
- printf "\nExtracting \%s\ to %s", $sheet_name, $filename;
148
- $in_chart = 1;
149
- $chart_index++;
150
- }
151
- $depth_count++;
152
- }
153
-
154
-
155
- # FBI, Chart fonts
156
- if ($record == 0x1060) {
157
-
158
- my $index = substr $data, 8, 2, '';
159
- $index = unpack 'v', $index;
160
-
161
- # Ignore the inbuilt fonts.
162
- if ($index >= 5) {
163
- $max_font = $index if $index > $max_font;
164
-
165
- # Shift index past S::WE fonts
166
- $index += 2;
167
- }
168
-
169
- $data .= pack 'v', $index;
170
- }
171
-
172
- # FONTX, Chart fonts
173
- if ($record == 0x1026) {
174
-
175
- my $index = unpack 'v', $data;
176
-
177
- # Ignore the inbuilt fonts.
178
- if ($index >= 5) {
179
- $max_font = $index if $index > $max_font;
180
-
181
- # Shift index past S::WE fonts
182
- $index += 2;
183
- }
184
-
185
- $data = pack 'v', $index;
186
- }
187
-
188
-
189
-
190
- if ($in_chart) {
191
- print CHART $header, $data;
192
- }
193
-
194
-
195
- # EOF
196
- if ($record == 0x000A) {
197
- $in_chart = 0;
198
- $depth_count--;
199
- $sheet_index++ if $depth_count == 0;
200
- ;
201
- }
202
- }
203
-
204
-
205
- if ($chart_index > 1) {
206
- print "\n\n";
207
- print "Add the following near the start of your program\n";
208
- print "and change the variable names if required.\n\n";
209
- }
210
- else {
211
- print "\nNo charts found in workbook\n";
212
- }
213
-
214
- for my $aref (@exrefs) {
215
- my $sheet1 = $sheetnames[$aref->[1]];
216
- my $sheet2 = $sheetnames[$aref->[2]];
217
-
218
- my $range;
219
-
220
- if ($sheet1 ne $sheet2) {
221
- $range = $sheet1 . ":" . $sheet2;
222
- }
223
- else {
224
- $range = $sheet1;
225
- }
226
-
227
- $range = "'$range'" if $range =~ /[^\w:]/;
228
-
229
- print " \$worksheet->store_formula('=$range!A1');\n";
230
- }
231
-
232
- print "\n";
233
-
234
- for my $i (5 .. $max_font) {
235
-
236
- printf " my \$chart_font_%d = \$workbook->add_format(font_only => 1);\n",
237
- $i -4;
238
-
239
- }
240
-
241
-
242
-
243
-
244
-
245
- __END__
246
-
247
-
248
- =head1 NAME
249
-
250
- chartex - A utility to extract charts from an Excel file for insertion into a Spreadsheet::WriteExcel file.
251
-
252
- =head1 DESCRIPTION
253
-
254
- This program is used for extracting one or more charts from an Excel file in binary format. The charts can then be included in a C<Spreadsheet::WriteExcel> file.
255
-
256
- See the C<add_chart_ext()> section of the Spreadsheet::WriteExcel documentation for more details.
257
-
258
-
259
- =head1 SYNOPSIS
260
-
261
- chartex [--chartname --help --man] file.xls
262
-
263
- Options:
264
- --chartname -c The root name for the extracted charts,
265
- defaults to "chart".
266
-
267
-
268
- =head1 OPTIONS
269
-
270
- =over 4
271
-
272
- =item B<--chartname or -c>
273
-
274
- This sets the root name for the extracted charts, defaults to "chart". For example:
275
-
276
- $ chartex file.xls
277
-
278
- Extracting "Chart1" to chart01.bin
279
-
280
-
281
- $ chartex -c mychart file.xls
282
-
283
- Extracting "Chart1" to mychart01.bin
284
-
285
- =item B<--help or -h>
286
-
287
- Print a brief help message and exits.
288
-
289
-
290
- =item B<--man or -m>
291
-
292
- Prints the manual page and exits.
293
-
294
- =back
295
-
296
-
297
- =head1 AUTHOR
298
-
299
- John McNamara jmcnamara@cpan.org
300
-
301
-
302
- =head1 VERSION
303
-
304
- Version 0.02.
305
-
306
-
307
- =head1 COPYRIGHT
308
-
309
- ゥ MMV, John McNamara.
310
-
311
- All Rights Reserved. This program is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
312
-
313
-
314
- =cut
315
- =end
1
+ #!/usr/bin/ruby -w
2
+ # -*- coding: utf-8 -*-
3
+
4
+ #######################################################################
5
+ #
6
+ # chartex - A utility to extract charts from an Excel file for
7
+ # insertion into a Spreadsheet::WriteExcel file.
8
+ #
9
+ # reverse('ゥ'), September 2007, John McNamara, jmcnamara@cpan.org
10
+ #
11
+ # original written in Perl by John McNamara
12
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
13
+ #
14
+ # Documentation after __END__
15
+ #
16
+
17
+ require 'writeexcel'
18
+
19
+ class Chartex
20
+ attr_reader :file
21
+
22
+ def initialize(file = nil)
23
+ @file = file
24
+ @sheetnames = Array.new
25
+ @exrefs = Array.new
26
+ @buf = StringIO.new
27
+ end
28
+
29
+ def set_file(file)
30
+ @file = file
31
+ end
32
+
33
+ def get_workbook(file = nil)
34
+ file ||= @file
35
+ ole = OLEStorageLite.new(file)
36
+ book97 = 'Workbook'.unpack('C*').pack('v*')
37
+ workbook = ole.getPpsSearch([book97], 1, 1)[0]
38
+ @buf.write(workbook.data)
39
+ @buf.rewind
40
+ workbook
41
+ end
42
+ end
43
+
44
+ # main
45
+
46
+ if $0 == __FILE__
47
+
48
+ end
49
+
50
+ =begin
51
+ my $man = 0;
52
+ my $help = 0;
53
+ my $in_chart = 0;
54
+ my $chart_name = 'chart';
55
+ my $chart_index = 1;
56
+ my $sheet_index = -1;
57
+ my @sheetnames;
58
+ my @exrefs;
59
+ my $depth_count = 0;
60
+ my $max_font = 0;
61
+
62
+ #
63
+ # Do the Getopt and Pod::Usage routines.
64
+ #
65
+ GetOptions(
66
+ 'help|?' => \$help,
67
+ 'man' => \$man,
68
+ 'chart=s' => \$chart_name,
69
+ ) or pod2usage(2);
70
+
71
+ pod2usage(1) if $help;
72
+ pod2usage(-verbose => 2) if $man;
73
+
74
+
75
+ # From the Pod::Usage pod:
76
+ # If no arguments were given, then allow STDIN to be used only
77
+ # if it's not connected to a terminal (otherwise print usage)
78
+ pod2usage() if @ARGV == 0 && -t STDIN;
79
+
80
+
81
+
82
+
83
+ # Check that the file can be opened because OLE::Storage_Lite won't tell us.
84
+ # Possible race condition here. Could fix with latest OLE::Storage_Lite. TODO.
85
+ #
86
+ my $file = $ARGV[0];
87
+
88
+ open TMP, $file or die "Couldn't open $file. $!\n";
89
+ close TMP;
90
+
91
+ my $ole = OLE::Storage_Lite->new($file);
92
+ my $book97 = pack 'v*', unpack 'C*', 'Workbook';
93
+ my $workbook = ($ole->getPpsSearch([$book97], 1, 1))[0];
94
+
95
+ die "Couldn't find Excel97 data in file $file.\n" unless $workbook;
96
+
97
+
98
+ # Write the data to a file so that we can access it with read().
99
+ my $tmpfile = IO::File->new_tmpfile();
100
+ binmode $tmpfile;
101
+
102
+ my $biff = $workbook->{Data};
103
+ print {$tmpfile} $biff;
104
+ seek $tmpfile, 0, 0;
105
+
106
+
107
+
108
+ my $header;
109
+ my $data;
110
+
111
+ # Read the file record by record and look for a chart BOF record.
112
+ #
113
+ while (read $tmpfile, $header, 4) {
114
+
115
+ my ($record, $length) = unpack "vv", $header;
116
+ next unless $record;
117
+
118
+ read $tmpfile, $data, $length;
119
+
120
+ # BOUNDSHEET
121
+ if ($record == 0x0085) {
122
+ push @sheetnames, substr $data, 8;
123
+ }
124
+
125
+ # EXTERNSHEET
126
+ if ($record == 0x0017) {
127
+ my $count = unpack 'v', $data;
128
+
129
+ for my $i (1 .. $count) {
130
+ my @tmp = unpack 'vvv', substr($data, 2 +6*($i-1));
131
+ push @exrefs, [@tmp];
132
+ }
133
+
134
+ }
135
+
136
+ # BOF
137
+ if ($record == 0x0809) {
138
+ my $type = unpack 'xx v', $data;
139
+
140
+ if ($type == 0x0020) {
141
+ my $filename = sprintf "%s%02d.bin", $chart_name, $chart_index;
142
+ open CHART, ">$filename" or die "Couldn't open $filename: $!";
143
+ binmode CHART;
144
+
145
+ my $sheet_name = $sheetnames[$sheet_index];
146
+ $sheet_name .= ' embedded' if $depth_count;
147
+
148
+ printf "\nExtracting \%s\ to %s", $sheet_name, $filename;
149
+ $in_chart = 1;
150
+ $chart_index++;
151
+ }
152
+ $depth_count++;
153
+ }
154
+
155
+
156
+ # FBI, Chart fonts
157
+ if ($record == 0x1060) {
158
+
159
+ my $index = substr $data, 8, 2, '';
160
+ $index = unpack 'v', $index;
161
+
162
+ # Ignore the inbuilt fonts.
163
+ if ($index >= 5) {
164
+ $max_font = $index if $index > $max_font;
165
+
166
+ # Shift index past S::WE fonts
167
+ $index += 2;
168
+ }
169
+
170
+ $data .= pack 'v', $index;
171
+ }
172
+
173
+ # FONTX, Chart fonts
174
+ if ($record == 0x1026) {
175
+
176
+ my $index = unpack 'v', $data;
177
+
178
+ # Ignore the inbuilt fonts.
179
+ if ($index >= 5) {
180
+ $max_font = $index if $index > $max_font;
181
+
182
+ # Shift index past S::WE fonts
183
+ $index += 2;
184
+ }
185
+
186
+ $data = pack 'v', $index;
187
+ }
188
+
189
+
190
+
191
+ if ($in_chart) {
192
+ print CHART $header, $data;
193
+ }
194
+
195
+
196
+ # EOF
197
+ if ($record == 0x000A) {
198
+ $in_chart = 0;
199
+ $depth_count--;
200
+ $sheet_index++ if $depth_count == 0;
201
+ ;
202
+ }
203
+ }
204
+
205
+
206
+ if ($chart_index > 1) {
207
+ print "\n\n";
208
+ print "Add the following near the start of your program\n";
209
+ print "and change the variable names if required.\n\n";
210
+ }
211
+ else {
212
+ print "\nNo charts found in workbook\n";
213
+ }
214
+
215
+ for my $aref (@exrefs) {
216
+ my $sheet1 = $sheetnames[$aref->[1]];
217
+ my $sheet2 = $sheetnames[$aref->[2]];
218
+
219
+ my $range;
220
+
221
+ if ($sheet1 ne $sheet2) {
222
+ $range = $sheet1 . ":" . $sheet2;
223
+ }
224
+ else {
225
+ $range = $sheet1;
226
+ }
227
+
228
+ $range = "'$range'" if $range =~ /[^\w:]/;
229
+
230
+ print " \$worksheet->store_formula('=$range!A1');\n";
231
+ }
232
+
233
+ print "\n";
234
+
235
+ for my $i (5 .. $max_font) {
236
+
237
+ printf " my \$chart_font_%d = \$workbook->add_format(font_only => 1);\n",
238
+ $i -4;
239
+
240
+ }
241
+
242
+
243
+
244
+
245
+
246
+ __END__
247
+
248
+
249
+ =head1 NAME
250
+
251
+ chartex - A utility to extract charts from an Excel file for insertion into a Spreadsheet::WriteExcel file.
252
+
253
+ =head1 DESCRIPTION
254
+
255
+ This program is used for extracting one or more charts from an Excel file in binary format. The charts can then be included in a C<Spreadsheet::WriteExcel> file.
256
+
257
+ See the C<add_chart_ext()> section of the Spreadsheet::WriteExcel documentation for more details.
258
+
259
+
260
+ =head1 SYNOPSIS
261
+
262
+ chartex [--chartname --help --man] file.xls
263
+
264
+ Options:
265
+ --chartname -c The root name for the extracted charts,
266
+ defaults to "chart".
267
+
268
+
269
+ =head1 OPTIONS
270
+
271
+ =over 4
272
+
273
+ =item B<--chartname or -c>
274
+
275
+ This sets the root name for the extracted charts, defaults to "chart". For example:
276
+
277
+ $ chartex file.xls
278
+
279
+ Extracting "Chart1" to chart01.bin
280
+
281
+
282
+ $ chartex -c mychart file.xls
283
+
284
+ Extracting "Chart1" to mychart01.bin
285
+
286
+ =item B<--help or -h>
287
+
288
+ Print a brief help message and exits.
289
+
290
+
291
+ =item B<--man or -m>
292
+
293
+ Prints the manual page and exits.
294
+
295
+ =back
296
+
297
+
298
+ =head1 AUTHOR
299
+
300
+ John McNamara jmcnamara@cpan.org
301
+
302
+
303
+ =head1 VERSION
304
+
305
+ Version 0.02.
306
+
307
+
308
+ =head1 COPYRIGHT
309
+
310
+ ゥ MMV, John McNamara.
311
+
312
+ All Rights Reserved. This program is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
313
+
314
+
315
+ =cut
316
+ =end