1Spreadsheet::ParseExcelU(s3e)r Contributed Perl DocumentaStpiroenadsheet::ParseExcel(3)
2
3
4
6 Spreadsheet::ParseExcel - Read information from an Excel file.
7
9 #!/usr/bin/perl -w
10
11 use strict;
12 use Spreadsheet::ParseExcel;
13
14 my $parser = Spreadsheet::ParseExcel->new();
15 my $workbook = $parser->parse('Book1.xls');
16
17 if ( !defined $workbook ) {
18 die $parser->error(), ".\n";
19 }
20
21 for my $worksheet ( $workbook->worksheets() ) {
22
23 my ( $row_min, $row_max ) = $worksheet->row_range();
24 my ( $col_min, $col_max ) = $worksheet->col_range();
25
26 for my $row ( $row_min .. $row_max ) {
27 for my $col ( $col_min .. $col_max ) {
28
29 my $cell = $worksheet->get_cell( $row, $col );
30 next unless $cell;
31
32 print "Row, Col = ($row, $col)\n";
33 print "Value = ", $cell->value(), "\n";
34 print "Unformatted = ", $cell->unformatted(), "\n";
35 print "\n";
36 }
37 }
38 }
39
41 The Spreadsheet::ParseExcel module can be used to read information from
42 Excel 95-2003 binary files.
43
44 The module cannot read files in the Excel 2007 Open XML XLSX format.
45 See the Spreadsheet::XLSX module instead.
46
48 new()
49 The new() method is used to create a new "Spreadsheet::ParseExcel"
50 parser object.
51
52 my $parser = Spreadsheet::ParseExcel->new();
53
54 It is possible to pass a password to decrypt an encrypted file:
55
56 $parser = Spreadsheet::ParseExcel->new( Password => 'secret' );
57
58 Only the default Excel encryption scheme is currently supported. See
59 "Decryption".
60
61 As an advanced feature it is also possible to pass a call-back handler
62 to the parser to control the parsing of the spreadsheet.
63
64 $parser = Spreadsheet::ParseExcel->new(
65 CellHandler => \&cell_handler,
66 NotSetCell => 1,
67 );
68
69 The call-back can be used to ignore certain cells or to reduce memory
70 usage. See the section "Reducing the memory usage of
71 Spreadsheet::ParseExcel" for more information.
72
73 parse($filename, $formatter)
74 The Parser parse() method returns a "Workbook" object.
75
76 my $parser = Spreadsheet::ParseExcel->new();
77 my $workbook = $parser->parse('Book1.xls');
78
79 If an error occurs parse() returns "undef". In general, programs should
80 contain a test for failed parsing as follows:
81
82 my $parser = Spreadsheet::ParseExcel->new();
83 my $workbook = $parser->parse('Book1.xls');
84
85 if ( !defined $workbook ) {
86 die $parser->error(), ".\n";
87 }
88
89 The $filename parameter is generally the file to be parsed. However, it
90 can also be a filehandle or a scalar reference.
91
92 The optional $formatter parameter can be an reference to a "Formatter
93 Class" to format the value of cells. This is useful for parsing
94 workbooks with Unicode or Asian characters:
95
96 my $parser = Spreadsheet::ParseExcel->new();
97 my $formatter = Spreadsheet::ParseExcel::FmtJapan->new();
98 my $workbook = $parser->parse( 'Book1.xls', $formatter );
99
100 The Spreadsheet::ParseExcel::FmtJapan formatter also supports Unicode.
101 If you encounter any encoding problems with the default formatter try
102 that instead.
103
104 error()
105 The Parser error() method returns an error string if a parse() fails:
106
107 my $parser = Spreadsheet::ParseExcel->new();
108 my $workbook = $parser->parse('Book1.xls');
109
110 if ( !defined $workbook ) {
111 die $parser->error(), ".\n";
112 }
113
114 If you wish to generate you own error string you can use the
115 error_code() method instead (see below). The error() and error_code()
116 values are as follows:
117
118 error() error_code()
119 ======= ============
120 '' 0
121 'File not found' 1
122 'No Excel data found in file' 2
123 'File is encrypted' 3
124
125 The error_code() method is explained below.
126
127 Spreadsheet::ParseExcel will try to decrypt an encrypted Excel file
128 using the default password or a user supplied password passed to new(),
129 see above. If these fail the module will return the 'File is encrypted'
130 error. Only the default Excel encryption scheme is currently supported,
131 see "Decryption".
132
133 error_code()
134 The Parser error_code() method returns an error code if a parse()
135 fails:
136
137 my $parser = Spreadsheet::ParseExcel->new();
138 my $workbook = $parser->parse('Book1.xls');
139
140 if ( !defined $workbook ) {
141 die "Got error code ", $parser->error_code, ".\n";
142 }
143
144 This can be useful if you wish to employ you own error strings or error
145 handling methods.
146
148 A "Spreadsheet::ParseExcel::Workbook" is created via the
149 "Spreadsheet::ParseExcel" parse() method:
150
151 my $parser = Spreadsheet::ParseExcel->new();
152 my $workbook = $parser->parse('Book1.xls');
153
154 The main methods of the Workbook class are:
155
156 $workbook->worksheets()
157 $workbook->worksheet()
158 $workbook->worksheet_count()
159 $workbook->get_filename()
160
161 These more commonly used methods of the Workbook class are outlined
162 below. The other, less commonly used, methods are documented in
163 Spreadsheet::ParseExcel::Worksheet.
164
165 worksheets()
166 Returns an array of "Worksheet" objects. This was most commonly used to
167 iterate over the worksheets in a workbook:
168
169 for my $worksheet ( $workbook->worksheets() ) {
170 ...
171 }
172
173 worksheet()
174 The worksheet() method returns a single "Worksheet" object using either
175 its name or index:
176
177 $worksheet = $workbook->worksheet('Sheet1');
178 $worksheet = $workbook->worksheet(0);
179
180 Returns "undef" if the sheet name or index doesn't exist.
181
182 worksheet_count()
183 The worksheet_count() method returns the number of Worksheet objects in
184 the Workbook.
185
186 my $worksheet_count = $workbook->worksheet_count();
187
188 get_filename()
189 The get_filename() method returns the name of the Excel file of "undef"
190 if the data was read from a filehandle rather than a file.
191
192 my $filename = $workbook->get_filename();
193
194 Other Workbook Methods
195 For full documentation of the methods available via a Workbook object
196 see Spreadsheet::ParseExcel::Workbook.
197
199 The "Spreadsheet::ParseExcel::Worksheet" class encapsulates the
200 properties of an Excel worksheet.
201
202 A Worksheet object is obtained via the "worksheets()" or "worksheet()"
203 methods.
204
205 for my $worksheet ( $workbook->worksheets() ) {
206 ...
207 }
208
209 # Or:
210
211 $worksheet = $workbook->worksheet('Sheet1');
212 $worksheet = $workbook->worksheet(0);
213
214 The most commonly used methods of the Worksheet class are:
215
216 $worksheet->get_cell()
217 $worksheet->row_range()
218 $worksheet->col_range()
219 $worksheet->get_name()
220
221 The Spreadsheet::ParseExcel::Worksheet class exposes a lot of methods
222 but in general very few are required unless you are writing an advanced
223 filter.
224
225 The most commonly used methods are detailed below. The others are
226 documented in Spreadsheet::ParseExcel::Worksheet.
227
228 get_cell($row, $col)
229 Return the "Cell" object at row $row and column $col if it is defined.
230 Otherwise returns undef.
231
232 my $cell = $worksheet->get_cell($row, $col);
233
234 row_range()
235 Returns a two-element list "($min, $max)" containing the minimum and
236 maximum defined rows in the worksheet. If there is no row defined $max
237 is smaller than $min.
238
239 my ( $row_min, $row_max ) = $worksheet->row_range();
240
241 col_range()
242 Returns a two-element list "($min, $max)" containing the minimum and
243 maximum of defined columns in the worksheet. If there is no column
244 defined $max is smaller than $min.
245
246 my ( $col_min, $col_max ) = $worksheet->col_range();
247
248 get_name()
249 The get_name() method returns the name of the worksheet, such as
250 'Sheet1'.
251
252 my $name = $worksheet->get_name();
253
254 Other Worksheet Methods
255 For other, less commonly used, Worksheet methods see
256 Spreadsheet::ParseExcel::Worksheet.
257
259 The "Spreadsheet::ParseExcel::Cell" class has the following main
260 methods.
261
262 $cell->value()
263 $cell->unformatted()
264
265 value()
266 The value() method returns the formatted value of the cell.
267
268 my $value = $cell->value();
269
270 Formatted in this sense refers to the numeric format of the cell value.
271 For example a number such as 40177 might be formatted as 40,117,
272 40117.000 or even as the date 2009/12/30.
273
274 If the cell doesn't contain a numeric format then the formatted and
275 unformatted cell values are the same, see the unformatted() method
276 below.
277
278 For a defined $cell the value() method will always return a value.
279
280 In the case of a cell with formatting but no numeric or string contents
281 the method will return the empty string ''.
282
283 unformatted()
284 The unformatted() method returns the unformatted value of the cell.
285
286 my $unformatted = $cell->unformatted();
287
288 Returns the cell value without a numeric format. See the value() method
289 above.
290
291 Other Cell Methods
292 For other, less commonly used, Worksheet methods see
293 Spreadsheet::ParseExcel::Cell.
294
296 The "Spreadsheet::ParseExcel::Format" class has the following
297 properties:
298
299 Format properties
300 $format->{Font}
301 $format->{AlignH}
302 $format->{AlignV}
303 $format->{Indent}
304 $format->{Wrap}
305 $format->{Shrink}
306 $format->{Rotate}
307 $format->{JustLast}
308 $format->{ReadDir}
309 $format->{BdrStyle}
310 $format->{BdrColor}
311 $format->{BdrDiag}
312 $format->{Fill}
313 $format->{Lock}
314 $format->{Hidden}
315 $format->{Style}
316
317 These properties are generally only of interest to advanced users.
318 Casual users can skip this section.
319
320 $format->{Font}
321 Returns the "Font" object for the Format.
322
323 $format->{AlignH}
324 Returns the horizontal alignment of the format where the value has the
325 following meaning:
326
327 0 => No alignment
328 1 => Left
329 2 => Center
330 3 => Right
331 4 => Fill
332 5 => Justify
333 6 => Center across
334 7 => Distributed/Equal spaced
335
336 $format->{AlignV}
337 Returns the vertical alignment of the format where the value has the
338 following meaning:
339
340 0 => Top
341 1 => Center
342 2 => Bottom
343 3 => Justify
344 4 => Distributed/Equal spaced
345
346 $format->{Indent}
347 Returns the indent level of the "Left" horizontal alignment.
348
349 $format->{Wrap}
350 Returns true if textwrap is on.
351
352 $format->{Shrink}
353 Returns true if "Shrink to fit" is set for the format.
354
355 $format->{Rotate}
356 Returns the text rotation. In Excel97+, it returns the angle in degrees
357 of the text rotation.
358
359 In Excel95 or earlier it returns a value as follows:
360
361 0 => No rotation
362 1 => Top down
363 2 => 90 degrees anti-clockwise,
364 3 => 90 clockwise
365
366 $format->{JustLast}
367 Return true if the "justify last" property is set for the format.
368
369 $format->{ReadDir}
370 Returns the direction that the text is read from.
371
372 $format->{BdrStyle}
373 Returns an array ref of border styles as follows:
374
375 [ $left, $right, $top, $bottom ]
376
377 $format->{BdrColor}
378 Returns an array ref of border color indexes as follows:
379
380 [ $left, $right, $top, $bottom ]
381
382 $format->{BdrDiag}
383 Returns an array ref of diagonal border kind, style and color index as
384 follows:
385
386 [$kind, $style, $color ]
387
388 Where kind is:
389
390 0 => None
391 1 => Right-Down
392 2 => Right-Up
393 3 => Both
394
395 $format->{Fill}
396 Returns an array ref of fill pattern and color indexes as follows:
397
398 [ $pattern, $front_color, $back_color ]
399
400 $format->{Lock}
401 Returns true if the cell is locked.
402
403 $format->{Hidden}
404 Returns true if the cell is Hidden.
405
406 $format->{Style}
407 Returns true if the format is a Style format.
408
410 Spreadsheet::ParseExcel::Font
411
412 Format class has these properties:
413
415 $font->{Name}
416 $font->{Bold}
417 $font->{Italic}
418 $font->{Height}
419 $font->{Underline}
420 $font->{UnderlineStyle}
421 $font->{Color}
422 $font->{Strikeout}
423 $font->{Super}
424
425 $font->{Name}
426 Returns the name of the font, for example 'Arial'.
427
428 $font->{Bold}
429 Returns true if the font is bold.
430
431 $font->{Italic}
432 Returns true if the font is italic.
433
434 $font->{Height}
435 Returns the size (height) of the font.
436
437 $font->{Underline}
438 Returns true if the font in underlined.
439
440 $font->{UnderlineStyle}
441 Returns the style of an underlined font where the value has the
442 following meaning:
443
444 0 => None
445 1 => Single
446 2 => Double
447 33 => Single accounting
448 34 => Double accounting
449
450 $font->{Color}
451 Returns the color index for the font. The mapping to an RGB color is
452 defined by each workbook.
453
454 The index can be converted to a RGB string using the
455 "$workbook-"ColorIdxToRGB()> Parser method.
456
457 (Older versions of "Spreadsheet::ParseExcel" provided the
458 "ColorIdxToRGB" class method, which is deprecated.)
459
460 $font->{Strikeout}
461 Returns true if the font has the strikeout property set.
462
463 $font->{Super}
464 Returns one of the following values if the superscript or subscript
465 property of the font is set:
466
467 0 => None
468 1 => Superscript
469 2 => Subscript
470
472 Formatters can be passed to the parse() method to deal with Unicode or
473 Asian formatting.
474
475 Spreadsheet::ParseExcel includes 2 formatter classes. "FmtDefault" and
476 "FmtJapanese". It is also possible to create a user defined formatting
477 class.
478
479 The formatter class "Spreadsheet::ParseExcel::Fmt*" should provide the
480 following functions:
481
482 ChkType($self, $is_numeric, $format_index)
483 Method to check the type of data in the cell. Should return "Date",
484 "Numeric" or "Text". It is passed the following parameters:
485
486 $self
487 A scalar reference to the Formatter object.
488
489 $is_numeric
490 If true, the value seems to be number.
491
492 $format_index
493 The index number for the cell Format object.
494
495 TextFmt($self, $string_data, $string_encoding)
496 Converts the string data in the cell into the correct encoding. It is
497 passed the following parameters:
498
499 $self
500 A scalar reference to the Formatter object.
501
502 $string_data
503 The original string/text data.
504
505 $string_encoding
506 The character encoding of original string/text.
507
508 ValFmt($self, $cell, $workbook)
509 Convert the original unformatted cell value into the appropriate
510 formatted value. For instance turn a number into a formatted date. It
511 is passed the following parameters:
512
513 $self
514 A scalar reference to the Formatter object.
515
516 $cell
517 A scalar reference to the Cell object.
518
519 $workbook
520 A scalar reference to the Workbook object.
521
522 FmtString($self, $cell, $workbook)
523 Get the format string for the Cell. It is passed the following
524 parameters:
525
526 $self
527 A scalar reference to the Formatter object.
528
529 $cell
530 A scalar reference to the Cell object.
531
532 $workbook
533 A scalar reference to the Workbook object.
534
536 In some cases a "Spreadsheet::ParseExcel" application may consume a lot
537 of memory when processing a large Excel file and, as a result, may fail
538 to complete. The following explains why this can occur and how to
539 resolve it.
540
541 "Spreadsheet::ParseExcel" processes an Excel file in two stages. In the
542 first stage it extracts the Excel binary stream from the OLE container
543 file using "OLE::Storage_Lite". In the second stage it parses the
544 binary stream to read workbook, worksheet and cell data which it then
545 stores in memory. The majority of the memory usage is required for
546 storing cell data.
547
548 The reason for this is that as the Excel file is parsed and each cell
549 is encountered a cell handling function creates a relatively large
550 nested cell object that contains the cell value and all of the data
551 that relates to the cell formatting. For large files (a 10MB Excel file
552 on a 256MB system) this overhead can cause the system to grind to a
553 halt.
554
555 However, in a lot of cases when an Excel file is being processed the
556 only information that is required are the cell values. In these cases
557 it is possible to avoid most of the memory overhead by specifying your
558 own cell handling function and by telling Spreadsheet::ParseExcel not
559 to store the parsed cell data. This is achieved by passing a cell
560 handler function to new() when creating the parse object. Here is an
561 example.
562
563 #!/usr/bin/perl -w
564
565 use strict;
566 use Spreadsheet::ParseExcel;
567
568 my $parser = Spreadsheet::ParseExcel->new(
569 CellHandler => \&cell_handler,
570 NotSetCell => 1
571 );
572
573 my $workbook = $parser->parse('file.xls');
574
575 sub cell_handler {
576
577 my $workbook = $_[0];
578 my $sheet_index = $_[1];
579 my $row = $_[2];
580 my $col = $_[3];
581 my $cell = $_[4];
582
583 # Do something useful with the formatted cell value
584 print $cell->value(), "\n";
585
586 }
587
588 The user specified cell handler is passed as a code reference to new()
589 along with the parameter "NotSetCell" which tells
590 Spreadsheet::ParseExcel not to store the parsed cell. Note, you don't
591 have to iterate over the rows and columns, this happens automatically
592 as part of the parsing.
593
594 The cell handler is passed 5 arguments. The first, $workbook, is a
595 reference to the "Spreadsheet::ParseExcel::Workbook" object that
596 represent the parsed workbook. This can be used to access any of the
597 "Spreadsheet::ParseExcel::Workbook" methods, see "Workbook". The second
598 $sheet_index is the zero-based index of the worksheet being parsed. The
599 third and fourth, $row and $col, are the zero-based row and column
600 number of the cell. The fifth, $cell, is a reference to the
601 "Spreadsheet::ParseExcel::Cell" object. This is used to extract the
602 data from the cell. See "Cell" for more information.
603
604 This technique can be useful if you are writing an Excel to database
605 filter since you can put your DB calls in the cell handler.
606
607 If you don't want all of the data in the spreadsheet you can add some
608 control logic to the cell handler. For example we can extend the
609 previous example so that it only prints the first 10 rows of the first
610 two worksheets in the parsed workbook by adding some if() statements to
611 the cell handler:
612
613 #!/usr/bin/perl -w
614
615 use strict;
616 use Spreadsheet::ParseExcel;
617
618 my $parser = Spreadsheet::ParseExcel->new(
619 CellHandler => \&cell_handler,
620 NotSetCell => 1
621 );
622
623 my $workbook = $parser->parse('file.xls');
624
625 sub cell_handler {
626
627 my $workbook = $_[0];
628 my $sheet_index = $_[1];
629 my $row = $_[2];
630 my $col = $_[3];
631 my $cell = $_[4];
632
633 # Skip some worksheets and rows (inefficiently).
634 return if $sheet_index >= 3;
635 return if $row >= 10;
636
637 # Do something with the formatted cell value
638 print $cell->value(), "\n";
639
640 }
641
642 However, this still processes the entire workbook. If you wish to save
643 some additional processing time you can abort the parsing after you
644 have read the data that you want, using the workbook "ParseAbort"
645 method:
646
647 #!/usr/bin/perl -w
648
649 use strict;
650 use Spreadsheet::ParseExcel;
651
652 my $parser = Spreadsheet::ParseExcel->new(
653 CellHandler => \&cell_handler,
654 NotSetCell => 1
655 );
656
657 my $workbook = $parser->parse('file.xls');
658
659 sub cell_handler {
660
661 my $workbook = $_[0];
662 my $sheet_index = $_[1];
663 my $row = $_[2];
664 my $col = $_[3];
665 my $cell = $_[4];
666
667 # Skip some worksheets and rows (more efficiently).
668 if ( $sheet_index >= 1 and $row >= 10 ) {
669 $workbook->ParseAbort(1);
670 return;
671 }
672
673 # Do something with the formatted cell value
674 print $cell->value(), "\n";
675
676 }
677
679 If a workbook is "protected" then Excel will encrypt the file whether a
680 password is supplied or not. As of version 0.59 Spreadsheet::ParseExcel
681 supports decrypting Excel workbooks using a default or user supplied
682 password. However, only the following encryption scheme is supported:
683
684 Office 97/2000 Compatible encryption
685
686 The following encryption methods are not supported:
687
688 Weak Encryption (XOR)
689 RC4, Microsoft Base Cryptographic Provider v1.0
690 RC4, Microsoft Base DSS and Diffie-Hellman Cryptographic Provider
691 RC4, Microsoft DH SChannel Cryptographic Provider
692 RC4, Microsoft Enhanced Cryptographic Provider v1.0
693 RC4, Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider
694 RC4, Microsoft Enhanced RSA and AES Cryptographic Provider
695 RC4, Microsoft RSA SChannel Cryptographic Provider
696 RC4, Microsoft Strong Cryptographic Provider
697
698 See the following for more information on Excel encryption:
699 <http://office.microsoft.com/en-us/office-2003-resource-kit/important-aspects-of-password-and-encryption-protection-HA001140311.aspx>.
700
702 • Issues reported by users:
703 <http://rt.cpan.org/Public/Dist/Display.html?Name=Spreadsheet-ParseExcel>
704
705 • This module cannot read the values of formulas from files created
706 with Spreadsheet::WriteExcel unless the user specified the values
707 when creating the file (which is generally not the case). The
708 reason for this is that Spreadsheet::WriteExcel writes the formula
709 but not the formula result since it isn't in a position to
710 calculate arbitrary Excel formulas without access to Excel's
711 formula engine.
712
713 • If Excel has date fields where the specified format is equal to the
714 system-default for the short-date locale, Excel does not store the
715 format, but defaults to an internal format which is system
716 dependent. In these cases ParseExcel uses the date format
717 'yyyy-mm-dd'.
718
720 Bugs can be reported via rt.cpan.org. See the following for
721 instructions on bug reporting for Spreadsheet::ParseExcel
722
723 <http://rt.cpan.org/Public/Dist/Display.html?Name=Spreadsheet-ParseExcel>
724
726 • xls2csv by Ken Prows
727 <http://search.cpan.org/~ken/xls2csv-1.06/script/xls2csv>.
728
729 • xls2csv and xlscat by H.Merijn Brand (these utilities are part of
730 Spreadsheet::Read, see below).
731
732 • excel2txt by Ken Youens-Clark,
733 <http://search.cpan.org/~kclark/excel2txt/excel2txt>. This is an
734 excellent example of an Excel filter using Spreadsheet::ParseExcel.
735 It can produce CSV, Tab delimited, Html, XML and Yaml.
736
737 • XLSperl by Jon Allen
738 <http://search.cpan.org/~jonallen/XLSperl/bin/XLSperl>. This
739 application allows you to use Perl "one-liners" with Microsoft
740 Excel files.
741
742 • Spreadsheet::XLSX
743 <http://search.cpan.org/~dmow/Spreadsheet-XLSX/lib/Spreadsheet/XLSX.pm>
744 by Dmitry Ovsyanko. A module with a similar interface to
745 Spreadsheet::ParseExcel for parsing Excel 2007 XLSX OpenXML files.
746
747 • Spreadsheet::Read
748 <http://search.cpan.org/~hmbrand/Spreadsheet-Read/Read.pm> by
749 H.Merijn Brand. A single interface for reading several different
750 spreadsheet formats.
751
752 • Spreadsheet::WriteExcel
753 <http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm>.
754 A perl module for creating new Excel files.
755
756 • Spreadsheet::ParseExcel::SaveParser
757 <http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel/lib/Spreadsheet/ParseExcel/SaveParser.pm>.
758 This is a combination of Spreadsheet::ParseExcel and
759 Spreadsheet::WriteExcel and it allows you to "rewrite" an Excel
760 file. See the following example
761 <http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm#MODIFYING_AND_REWRITING_EXCEL_FILES>.
762 It is part of the Spreadsheet::ParseExcel distro.
763
764 • Text::CSV_XS
765 <http://search.cpan.org/~hmbrand/Text-CSV_XS/CSV_XS.pm> by H.Merijn
766 Brand. A fast and rigorous module for reading and writing CSV data.
767 Don't consider rolling your own CSV handling, use this module
768 instead.
769
771 There is a Google group for discussing and asking questions about
772 Spreadsheet::ParseExcel. This is a good place to search to see if your
773 question has been asked before:
774 <http://groups-beta.google.com/group/spreadsheet-parseexcel/>
775
777 If you'd care to donate to the Spreadsheet::ParseExcel project, you can
778 do so via PayPal: <http://tinyurl.com/7ayes>
779
781 • The current maintenance work is directed towards making the
782 documentation more useful, improving and simplifying the API, and
783 improving the maintainability of the code base. After that new
784 features will be added.
785
786 • Fix open bugs and documentation for SaveParser.
787
788 • Add Formula support, Hyperlink support, Named Range support.
789
790 • Improve Spreadsheet::ParseExcel::SaveParser compatibility with
791 Spreadsheet::WriteExcel.
792
793 • Improve Unicode and other encoding support. This will probably
794 require dropping support for perls prior to 5.8+.
795
797 From Kawai Takanori:
798
799 First of all, I would like to acknowledge the following valuable
800 programs and modules: XHTML, OLE::Storage and Spreadsheet::WriteExcel.
801
802 In no particular order: Yamaji Haruna, Simamoto Takesi, Noguchi Harumi,
803 Ikezawa Kazuhiro, Suwazono Shugo, Hirofumi Morisada, Michael Edwards,
804 Kim Namusk, Slaven Rezic, Grant Stevens, H.Merijn Brand and many many
805 people + Kawai Mikako.
806
807 Alexey Mazurin added the decryption facility.
808
810 Because this software is licensed free of charge, there is no warranty
811 for the software, to the extent permitted by applicable law. Except
812 when otherwise stated in writing the copyright holders and/or other
813 parties provide the software "as is" without warranty of any kind,
814 either expressed or implied, including, but not limited to, the implied
815 warranties of merchantability and fitness for a particular purpose. The
816 entire risk as to the quality and performance of the software is with
817 you. Should the software prove defective, you assume the cost of all
818 necessary servicing, repair, or correction.
819
820 In no event unless required by applicable law or agreed to in writing
821 will any copyright holder, or any other party who may modify and/or
822 redistribute the software as permitted by the above licence, be liable
823 to you for damages, including any general, special, incidental, or
824 consequential damages arising out of the use or inability to use the
825 software (including but not limited to loss of data or data being
826 rendered inaccurate or losses sustained by you or third parties or a
827 failure of the software to operate with any other software), even if
828 such holder or other party has been advised of the possibility of such
829 damages.
830
832 Either the Perl Artistic Licence
833 <http://dev.perl.org/licenses/artistic.html> or the GPL
834 <http://www.opensource.org/licenses/gpl-license.php>
835
837 Current maintainer 0.60+: Douglas Wilson dougw@cpan.org
838
839 Maintainer 0.40-0.59: John McNamara jmcnamara@cpan.org
840
841 Maintainer 0.27-0.33: Gabor Szabo szabgab@cpan.org
842
843 Original author: Kawai Takanori (Hippo2000) kwitknr@cpan.org
844
846 Copyright (c) 2014 Douglas Wilson
847
848 Copyright (c) 2009-2013 John McNamara
849
850 Copyright (c) 2006-2008 Gabor Szabo
851
852 Copyright (c) 2000-2006 Kawai Takanori
853
854 All rights reserved. This is free software. You may distribute under
855 the terms of either the GNU General Public License or the Artistic
856 License.
857
858
859
860perl v5.38.0 2023-07-21 Spreadsheet::ParseExcel(3)