{
    "mode": "perldoc",
    "parameter": "Spreadsheet::ParseExcel",
    "section": "",
    "url": "https://www.chedong.com/phpMan.php/perldoc/Spreadsheet%3A%3AParseExcel/json",
    "generated": "2026-06-14T00:19:16Z",
    "synopsis": "#!/usr/bin/perl -w\nuse strict;\nuse Spreadsheet::ParseExcel;\nmy $parser   = Spreadsheet::ParseExcel->new();\nmy $workbook = $parser->parse('Book1.xls');\nif ( !defined $workbook ) {\ndie $parser->error(), \".\\n\";\n}\nfor my $worksheet ( $workbook->worksheets() ) {\nmy ( $rowmin, $rowmax ) = $worksheet->rowrange();\nmy ( $colmin, $colmax ) = $worksheet->colrange();\nfor my $row ( $rowmin .. $rowmax ) {\nfor my $col ( $colmin .. $colmax ) {\nmy $cell = $worksheet->getcell( $row, $col );\nnext unless $cell;\nprint \"Row, Col    = ($row, $col)\\n\";\nprint \"Value       = \", $cell->value(),       \"\\n\";\nprint \"Unformatted = \", $cell->unformatted(), \"\\n\";\nprint \"\\n\";\n}\n}\n}",
    "sections": {
        "NAME": {
            "content": "Spreadsheet::ParseExcel - Read information from an Excel file.\n",
            "subsections": []
        },
        "SYNOPSIS": {
            "content": "#!/usr/bin/perl -w\n\nuse strict;\nuse Spreadsheet::ParseExcel;\n\nmy $parser   = Spreadsheet::ParseExcel->new();\nmy $workbook = $parser->parse('Book1.xls');\n\nif ( !defined $workbook ) {\ndie $parser->error(), \".\\n\";\n}\n\nfor my $worksheet ( $workbook->worksheets() ) {\n\nmy ( $rowmin, $rowmax ) = $worksheet->rowrange();\nmy ( $colmin, $colmax ) = $worksheet->colrange();\n\nfor my $row ( $rowmin .. $rowmax ) {\nfor my $col ( $colmin .. $colmax ) {\n\nmy $cell = $worksheet->getcell( $row, $col );\nnext unless $cell;\n\nprint \"Row, Col    = ($row, $col)\\n\";\nprint \"Value       = \", $cell->value(),       \"\\n\";\nprint \"Unformatted = \", $cell->unformatted(), \"\\n\";\nprint \"\\n\";\n}\n}\n}\n",
            "subsections": []
        },
        "DESCRIPTION": {
            "content": "The Spreadsheet::ParseExcel module can be used to read information from Excel 95-2003 binary\nfiles.\n\nThe module cannot read files in the Excel 2007 Open XML XLSX format. See the Spreadsheet::XLSX\nmodule instead.\n",
            "subsections": []
        },
        "Parser": {
            "content": "new()\nThe \"new()\" method is used to create a new \"Spreadsheet::ParseExcel\" parser object.\n\nmy $parser = Spreadsheet::ParseExcel->new();\n\nIt is possible to pass a password to decrypt an encrypted file:\n\n$parser = Spreadsheet::ParseExcel->new( Password => 'secret' );\n\nOnly the default Excel encryption scheme is currently supported. See \"Decryption\".\n\nAs an advanced feature it is also possible to pass a call-back handler to the parser to control\nthe parsing of the spreadsheet.\n\n$parser = Spreadsheet::ParseExcel->new(\nCellHandler => \\&cellhandler,\nNotSetCell  => 1,\n);\n\nThe call-back can be used to ignore certain cells or to reduce memory usage. See the section\n\"Reducing the memory usage of Spreadsheet::ParseExcel\" for more information.\n\nparse($filename, $formatter)\nThe Parser \"parse()\" method returns a \"Workbook\" object.\n\nmy $parser   = Spreadsheet::ParseExcel->new();\nmy $workbook = $parser->parse('Book1.xls');\n\nIf an error occurs \"parse()\" returns \"undef\". In general, programs should contain a test for\nfailed parsing as follows:\n\nmy $parser   = Spreadsheet::ParseExcel->new();\nmy $workbook = $parser->parse('Book1.xls');\n\nif ( !defined $workbook ) {\ndie $parser->error(), \".\\n\";\n}\n\nThe $filename parameter is generally the file to be parsed. However, it can also be a filehandle\nor a scalar reference.\n\nThe optional $formatter parameter can be an reference to a \"Formatter Class\" to format the value\nof cells. This is useful for parsing workbooks with Unicode or Asian characters:\n\nmy $parser    = Spreadsheet::ParseExcel->new();\nmy $formatter = Spreadsheet::ParseExcel::FmtJapan->new();\nmy $workbook  = $parser->parse( 'Book1.xls', $formatter );\n\nThe Spreadsheet::ParseExcel::FmtJapan formatter also supports Unicode. If you encounter any\nencoding problems with the default formatter try that instead.\n\nerror()\nThe Parser \"error()\" method returns an error string if a \"parse()\" fails:\n\nmy $parser   = Spreadsheet::ParseExcel->new();\nmy $workbook = $parser->parse('Book1.xls');\n\nif ( !defined $workbook ) {\ndie $parser->error(), \".\\n\";\n}\n\nIf you wish to generate you own error string you can use the \"errorcode()\" method instead (see\nbelow). The \"error()\" and \"errorcode()\" values are as follows:\n\nerror()                         errorcode()\n=======                         ============\n''                              0\n'File not found'                1\n'No Excel data found in file'   2\n'File is encrypted'             3\n\nThe \"errorcode()\" method is explained below.\n\nSpreadsheet::ParseExcel will try to decrypt an encrypted Excel file using the default password\nor a user supplied password passed to \"new()\", see above. If these fail the module will return\nthe 'File is encrypted' error. Only the default Excel encryption scheme is currently supported,\nsee \"Decryption\".\n\nerrorcode()\nThe Parser \"errorcode()\" method returns an error code if a \"parse()\" fails:\n\nmy $parser   = Spreadsheet::ParseExcel->new();\nmy $workbook = $parser->parse('Book1.xls');\n\nif ( !defined $workbook ) {\ndie \"Got error code \", $parser->errorcode, \".\\n\";\n}\n\nThis can be useful if you wish to employ you own error strings or error handling methods.\n",
            "subsections": []
        },
        "Workbook": {
            "content": "A \"Spreadsheet::ParseExcel::Workbook\" is created via the \"Spreadsheet::ParseExcel\" \"parse()\"\nmethod:\n\nmy $parser   = Spreadsheet::ParseExcel->new();\nmy $workbook = $parser->parse('Book1.xls');\n\nThe main methods of the Workbook class are:\n\n$workbook->worksheets()\n$workbook->worksheet()\n$workbook->worksheetcount()\n$workbook->getfilename()\n\nThese more commonly used methods of the Workbook class are outlined below. The other, less\ncommonly used, methods are documented in Spreadsheet::ParseExcel::Worksheet.\n\nworksheets()\nReturns an array of \"Worksheet\" objects. This was most commonly used to iterate over the\nworksheets in a workbook:\n\nfor my $worksheet ( $workbook->worksheets() ) {\n...\n}\n\nworksheet()\nThe \"worksheet()\" method returns a single \"Worksheet\" object using either its name or index:\n\n$worksheet = $workbook->worksheet('Sheet1');\n$worksheet = $workbook->worksheet(0);\n\nReturns \"undef\" if the sheet name or index doesn't exist.\n\nworksheetcount()\nThe \"worksheetcount()\" method returns the number of Worksheet objects in the Workbook.\n\nmy $worksheetcount = $workbook->worksheetcount();\n\ngetfilename()\nThe \"getfilename()\" method returns the name of the Excel file of \"undef\" if the data was read\nfrom a filehandle rather than a file.\n\nmy $filename = $workbook->getfilename();\n",
            "subsections": [
                {
                    "name": "Other Workbook Methods",
                    "content": "For full documentation of the methods available via a Workbook object see\nSpreadsheet::ParseExcel::Workbook.\n"
                }
            ]
        },
        "Worksheet": {
            "content": "The \"Spreadsheet::ParseExcel::Worksheet\" class encapsulates the properties of an Excel\nworksheet.\n\nA Worksheet object is obtained via the \"worksheets()\" or \"worksheet()\" methods.\n\nfor my $worksheet ( $workbook->worksheets() ) {\n...\n}\n\n# Or:\n\n$worksheet = $workbook->worksheet('Sheet1');\n$worksheet = $workbook->worksheet(0);\n\nThe most commonly used methods of the Worksheet class are:\n\n$worksheet->getcell()\n$worksheet->rowrange()\n$worksheet->colrange()\n$worksheet->getname()\n\nThe Spreadsheet::ParseExcel::Worksheet class exposes a lot of methods but in general very few\nare required unless you are writing an advanced filter.\n\nThe most commonly used methods are detailed below. The others are documented in\nSpreadsheet::ParseExcel::Worksheet.\n\ngetcell($row, $col)\nReturn the \"Cell\" object at row $row and column $col if it is defined. Otherwise returns undef.\n\nmy $cell = $worksheet->getcell($row, $col);\n\nrowrange()\nReturns a two-element list \"($min, $max)\" containing the minimum and maximum defined rows in the\nworksheet. If there is no row defined $max is smaller than $min.\n\nmy ( $rowmin, $rowmax ) = $worksheet->rowrange();\n\ncolrange()\nReturns a two-element list \"($min, $max)\" containing the minimum and maximum of defined columns\nin the worksheet. If there is no column defined $max is smaller than $min.\n\nmy ( $colmin, $colmax ) = $worksheet->colrange();\n\ngetname()\nThe \"getname()\" method returns the name of the worksheet, such as 'Sheet1'.\n\nmy $name = $worksheet->getname();\n",
            "subsections": [
                {
                    "name": "Other Worksheet Methods",
                    "content": "For other, less commonly used, Worksheet methods see Spreadsheet::ParseExcel::Worksheet.\n"
                }
            ]
        },
        "Cell": {
            "content": "The \"Spreadsheet::ParseExcel::Cell\" class has the following main methods.\n\n$cell->value()\n$cell->unformatted()\n\nvalue()\nThe \"value()\" method returns the formatted value of the cell.\n\nmy $value = $cell->value();\n\nFormatted in this sense refers to the numeric format of the cell value. For example a number\nsuch as 40177 might be formatted as 40,117, 40117.000 or even as the date 2009/12/30.\n\nIf the cell doesn't contain a numeric format then the formatted and unformatted cell values are\nthe same, see the \"unformatted()\" method below.\n\nFor a defined $cell the \"value()\" method will always return a value.\n\nIn the case of a cell with formatting but no numeric or string contents the method will return\nthe empty string ''.\n\nunformatted()\nThe \"unformatted()\" method returns the unformatted value of the cell.\n\nmy $unformatted = $cell->unformatted();\n\nReturns the cell value without a numeric format. See the \"value()\" method above.\n",
            "subsections": [
                {
                    "name": "Other Cell Methods",
                    "content": "For other, less commonly used, Worksheet methods see Spreadsheet::ParseExcel::Cell.\n"
                }
            ]
        },
        "Format": {
            "content": "The \"Spreadsheet::ParseExcel::Format\" class has the following properties:\n",
            "subsections": [
                {
                    "name": "Format properties",
                    "content": "$format->{Font}\n$format->{AlignH}\n$format->{AlignV}\n$format->{Indent}\n$format->{Wrap}\n$format->{Shrink}\n$format->{Rotate}\n$format->{JustLast}\n$format->{ReadDir}\n$format->{BdrStyle}\n$format->{BdrColor}\n$format->{BdrDiag}\n$format->{Fill}\n$format->{Lock}\n$format->{Hidden}\n$format->{Style}\n\nThese properties are generally only of interest to advanced users. Casual users can skip this\nsection.\n\n$format->{Font}\nReturns the \"Font\" object for the Format.\n\n$format->{AlignH}\nReturns the horizontal alignment of the format where the value has the following meaning:\n\n0 => No alignment\n1 => Left\n2 => Center\n3 => Right\n4 => Fill\n5 => Justify\n6 => Center across\n7 => Distributed/Equal spaced\n\n$format->{AlignV}\nReturns the vertical alignment of the format where the value has the following meaning:\n\n0 => Top\n1 => Center\n2 => Bottom\n3 => Justify\n4 => Distributed/Equal spaced\n\n$format->{Indent}\nReturns the indent level of the \"Left\" horizontal alignment.\n\n$format->{Wrap}\nReturns true if textwrap is on.\n\n$format->{Shrink}\nReturns true if \"Shrink to fit\" is set for the format.\n\n$format->{Rotate}\nReturns the text rotation. In Excel97+, it returns the angle in degrees of the text rotation.\n\nIn Excel95 or earlier it returns a value as follows:\n\n0 => No rotation\n1 => Top down\n2 => 90 degrees anti-clockwise,\n3 => 90 clockwise\n\n$format->{JustLast}\nReturn true if the \"justify last\" property is set for the format.\n\n$format->{ReadDir}\nReturns the direction that the text is read from.\n\n$format->{BdrStyle}\nReturns an array ref of border styles as follows:\n\n[ $left, $right, $top, $bottom ]\n\n$format->{BdrColor}\nReturns an array ref of border color indexes as follows:\n\n[ $left, $right, $top, $bottom ]\n\n$format->{BdrDiag}\nReturns an array ref of diagonal border kind, style and color index as follows:\n\n[$kind, $style, $color ]\n\nWhere kind is:\n\n0 => None\n1 => Right-Down\n2 => Right-Up\n3 => Both\n\n$format->{Fill}\nReturns an array ref of fill pattern and color indexes as follows:\n\n[ $pattern, $frontcolor, $backcolor ]\n\n$format->{Lock}\nReturns true if the cell is locked.\n\n$format->{Hidden}\nReturns true if the cell is Hidden.\n\n$format->{Style}\nReturns true if the format is a Style format.\n"
                }
            ]
        },
        "Font": {
            "content": "*Spreadsheet::ParseExcel::Font*\n\nFormat class has these properties:\n",
            "subsections": []
        },
        "Font Properties": {
            "content": "$font->{Name}\n$font->{Bold}\n$font->{Italic}\n$font->{Height}\n$font->{Underline}\n$font->{UnderlineStyle}\n$font->{Color}\n$font->{Strikeout}\n$font->{Super}\n\n$font->{Name}\nReturns the name of the font, for example 'Arial'.\n\n$font->{Bold}\nReturns true if the font is bold.\n\n$font->{Italic}\nReturns true if the font is italic.\n\n$font->{Height}\nReturns the size (height) of the font.\n\n$font->{Underline}\nReturns true if the font in underlined.\n\n$font->{UnderlineStyle}\nReturns the style of an underlined font where the value has the following meaning:\n\n0 => None\n1 => Single\n2 => Double\n33 => Single accounting\n34 => Double accounting\n\n$font->{Color}\nReturns the color index for the font. The mapping to an RGB color is defined by each workbook.\n\nThe index can be converted to a RGB string using the \"$workbook-\"ColorIdxToRGB()> Parser method.\n\n(Older versions of \"Spreadsheet::ParseExcel\" provided the \"ColorIdxToRGB\" class method, which is\ndeprecated.)\n\n$font->{Strikeout}\nReturns true if the font has the strikeout property set.\n\n$font->{Super}\nReturns one of the following values if the superscript or subscript property of the font is set:\n\n0 => None\n1 => Superscript\n2 => Subscript\n",
            "subsections": []
        },
        "Formatter Class": {
            "content": "Formatters can be passed to the \"parse()\" method to deal with Unicode or Asian formatting.\n\nSpreadsheet::ParseExcel includes 2 formatter classes. \"FmtDefault\" and \"FmtJapanese\". It is also\npossible to create a user defined formatting class.\n\nThe formatter class \"Spreadsheet::ParseExcel::Fmt*\" should provide the following functions:\n\nChkType($self, $isnumeric, $formatindex)\nMethod to check the type of data in the cell. Should return \"Date\", \"Numeric\" or \"Text\". It is\npassed the following parameters:\n\n$self\nA scalar reference to the Formatter object.\n\n$isnumeric\nIf true, the value seems to be number.\n\n$formatindex\nThe index number for the cell Format object.\n\nTextFmt($self, $stringdata, $stringencoding)\nConverts the string data in the cell into the correct encoding. It is passed the following\nparameters:\n\n$self\nA scalar reference to the Formatter object.\n\n$stringdata\nThe original string/text data.\n\n$stringencoding\nThe character encoding of original string/text.\n\nValFmt($self, $cell, $workbook)\nConvert the original unformatted cell value into the appropriate formatted value. For instance\nturn a number into a formatted date. It is passed the following parameters:\n\n$self\nA scalar reference to the Formatter object.\n\n$cell\nA scalar reference to the Cell object.\n\n$workbook\nA scalar reference to the Workbook object.\n\nFmtString($self, $cell, $workbook)\nGet the format string for the Cell. It is passed the following parameters:\n\n$self\nA scalar reference to the Formatter object.\n\n$cell\nA scalar reference to the Cell object.\n\n$workbook\nA scalar reference to the Workbook object.\n",
            "subsections": []
        },
        "Reducing the memory usage of Spreadsheet::ParseExcel": {
            "content": "In some cases a \"Spreadsheet::ParseExcel\" application may consume a lot of memory when\nprocessing a large Excel file and, as a result, may fail to complete. The following explains why\nthis can occur and how to resolve it.\n\n\"Spreadsheet::ParseExcel\" processes an Excel file in two stages. In the first stage it extracts\nthe Excel binary stream from the OLE container file using \"OLE::StorageLite\". In the second\nstage it parses the binary stream to read workbook, worksheet and cell data which it then stores\nin memory. The majority of the memory usage is required for storing cell data.\n\nThe reason for this is that as the Excel file is parsed and each cell is encountered a cell\nhandling function creates a relatively large nested cell object that contains the cell value and\nall of the data that relates to the cell formatting. For large files (a 10MB Excel file on a\n256MB system) this overhead can cause the system to grind to a halt.\n\nHowever, in a lot of cases when an Excel file is being processed the only information that is\nrequired are the cell values. In these cases it is possible to avoid most of the memory overhead\nby specifying your own cell handling function and by telling Spreadsheet::ParseExcel not to\nstore the parsed cell data. This is achieved by passing a cell handler function to \"new()\" when\ncreating the parse object. Here is an example.\n\n#!/usr/bin/perl -w\n\nuse strict;\nuse Spreadsheet::ParseExcel;\n\nmy $parser = Spreadsheet::ParseExcel->new(\nCellHandler => \\&cellhandler,\nNotSetCell  => 1\n);\n\nmy $workbook = $parser->parse('file.xls');\n\nsub cellhandler {\n\nmy $workbook    = $[0];\nmy $sheetindex = $[1];\nmy $row         = $[2];\nmy $col         = $[3];\nmy $cell        = $[4];\n\n# Do something useful with the formatted cell value\nprint $cell->value(), \"\\n\";\n\n}\n\nThe user specified cell handler is passed as a code reference to \"new()\" along with the\nparameter \"NotSetCell\" which tells Spreadsheet::ParseExcel not to store the parsed cell. Note,\nyou don't have to iterate over the rows and columns, this happens automatically as part of the\nparsing.\n\nThe cell handler is passed 5 arguments. The first, $workbook, is a reference to the\n\"Spreadsheet::ParseExcel::Workbook\" object that represent the parsed workbook. This can be used\nto access any of the \"Spreadsheet::ParseExcel::Workbook\" methods, see \"Workbook\". The second\n$sheetindex is the zero-based index of the worksheet being parsed. The third and fourth, $row\nand $col, are the zero-based row and column number of the cell. The fifth, $cell, is a reference\nto the \"Spreadsheet::ParseExcel::Cell\" object. This is used to extract the data from the cell.\nSee \"Cell\" for more information.\n\nThis technique can be useful if you are writing an Excel to database filter since you can put\nyour DB calls in the cell handler.\n\nIf you don't want all of the data in the spreadsheet you can add some control logic to the cell\nhandler. For example we can extend the previous example so that it only prints the first 10 rows\nof the first two worksheets in the parsed workbook by adding some \"if()\" statements to the cell\nhandler:\n\n#!/usr/bin/perl -w\n\nuse strict;\nuse Spreadsheet::ParseExcel;\n\nmy $parser = Spreadsheet::ParseExcel->new(\nCellHandler => \\&cellhandler,\nNotSetCell  => 1\n);\n\nmy $workbook = $parser->parse('file.xls');\n\nsub cellhandler {\n\nmy $workbook    = $[0];\nmy $sheetindex = $[1];\nmy $row         = $[2];\nmy $col         = $[3];\nmy $cell        = $[4];\n\n# Skip some worksheets and rows (inefficiently).\nreturn if $sheetindex >= 3;\nreturn if $row >= 10;\n\n# Do something with the formatted cell value\nprint $cell->value(), \"\\n\";\n\n}\n\nHowever, this still processes the entire workbook. If you wish to save some additional\nprocessing time you can abort the parsing after you have read the data that you want, using the\nworkbook \"ParseAbort\" method:\n\n#!/usr/bin/perl -w\n\nuse strict;\nuse Spreadsheet::ParseExcel;\n\nmy $parser = Spreadsheet::ParseExcel->new(\nCellHandler => \\&cellhandler,\nNotSetCell  => 1\n);\n\nmy $workbook = $parser->parse('file.xls');\n\nsub cellhandler {\n\nmy $workbook    = $[0];\nmy $sheetindex = $[1];\nmy $row         = $[2];\nmy $col         = $[3];\nmy $cell        = $[4];\n\n# Skip some worksheets and rows (more efficiently).\nif ( $sheetindex >= 1 and $row >= 10 ) {\n$workbook->ParseAbort(1);\nreturn;\n}\n\n# Do something with the formatted cell value\nprint $cell->value(), \"\\n\";\n\n}\n",
            "subsections": []
        },
        "Decryption": {
            "content": "If a workbook is \"protected\" then Excel will encrypt the file whether a password is supplied or\nnot. As of version 0.59 Spreadsheet::ParseExcel supports decrypting Excel workbooks using a\ndefault or user supplied password. However, only the following encryption scheme is supported:\n\nOffice 97/2000 Compatible encryption\n\nThe following encryption methods are not supported:\n\nWeak Encryption (XOR)\nRC4, Microsoft Base Cryptographic Provider v1.0\nRC4, Microsoft Base DSS and Diffie-Hellman Cryptographic Provider\nRC4, Microsoft DH SChannel Cryptographic Provider\nRC4, Microsoft Enhanced Cryptographic Provider v1.0\nRC4, Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider\nRC4, Microsoft Enhanced RSA and AES Cryptographic Provider\nRC4, Microsoft RSA SChannel Cryptographic Provider\nRC4, Microsoft Strong Cryptographic Provider\n\nSee the following for more information on Excel encryption:\n<http://office.microsoft.com/en-us/office-2003-resource-kit/important-aspects-of-password-and-en\ncryption-protection-HA001140311.aspx>.\n",
            "subsections": []
        },
        "KNOWN PROBLEMS": {
            "content": "*   Issues reported by users:\n<http://rt.cpan.org/Public/Dist/Display.html?Name=Spreadsheet-ParseExcel>\n\n*   This module cannot read the values of formulas from files created with\nSpreadsheet::WriteExcel unless the user specified the values when creating the file (which\nis generally not the case). The reason for this is that Spreadsheet::WriteExcel writes the\nformula but not the formula result since it isn't in a position to calculate arbitrary Excel\nformulas without access to Excel's formula engine.\n\n*   If Excel has date fields where the specified format is equal to the system-default for the\nshort-date locale, Excel does not store the format, but defaults to an internal format which\nis system dependent. In these cases ParseExcel uses the date format 'yyyy-mm-dd'.\n",
            "subsections": []
        },
        "REPORTING A BUG": {
            "content": "Bugs can be reported via rt.cpan.org. See the following for instructions on bug reporting for\nSpreadsheet::ParseExcel\n\n<http://rt.cpan.org/Public/Dist/Display.html?Name=Spreadsheet-ParseExcel>\n",
            "subsections": []
        },
        "SEE ALSO": {
            "content": "*   xls2csv by Ken Prows <http://search.cpan.org/~ken/xls2csv-1.06/script/xls2csv>.\n\n*   xls2csv and xlscat by H.Merijn Brand (these utilities are part of Spreadsheet::Read, see\nbelow).\n\n*   excel2txt by Ken Youens-Clark, <http://search.cpan.org/~kclark/excel2txt/excel2txt>. This is\nan excellent example of an Excel filter using Spreadsheet::ParseExcel. It can produce CSV,\nTab delimited, Html, XML and Yaml.\n\n*   XLSperl by Jon Allen <http://search.cpan.org/~jonallen/XLSperl/bin/XLSperl>. This\napplication allows you to use Perl \"one-liners\" with Microsoft Excel files.\n\n*   Spreadsheet::XLSX <http://search.cpan.org/~dmow/Spreadsheet-XLSX/lib/Spreadsheet/XLSX.pm> by\nDmitry Ovsyanko. A module with a similar interface to Spreadsheet::ParseExcel for parsing\nExcel 2007 XLSX OpenXML files.\n\n*   Spreadsheet::Read <http://search.cpan.org/~hmbrand/Spreadsheet-Read/Read.pm> by H.Merijn\nBrand. A single interface for reading several different spreadsheet formats.\n\n*   Spreadsheet::WriteExcel\n<http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm>. A\nperl module for creating new Excel files.\n\n*   Spreadsheet::ParseExcel::SaveParser\n<http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel/lib/Spreadsheet/ParseExcel/SavePar\nser.pm>. This is a combination of Spreadsheet::ParseExcel and Spreadsheet::WriteExcel and it\nallows you to \"rewrite\" an Excel file. See the following example\n<http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm#MODI\nFYINGANDREWRITINGEXCELFILES>. It is part of the Spreadsheet::ParseExcel distro.\n\n*   Text::CSVXS <http://search.cpan.org/~hmbrand/Text-CSVXS/CSVXS.pm> by H.Merijn Brand. A\nfast and rigorous module for reading and writing CSV data. Don't consider rolling your own\nCSV handling, use this module instead.\n",
            "subsections": []
        },
        "MAILING LIST": {
            "content": "There is a Google group for discussing and asking questions about Spreadsheet::ParseExcel. This\nis a good place to search to see if your question has been asked before:\n<http://groups-beta.google.com/group/spreadsheet-parseexcel/>\n",
            "subsections": []
        },
        "DONATIONS": {
            "content": "If you'd care to donate to the Spreadsheet::ParseExcel project, you can do so via PayPal:\n<http://tinyurl.com/7ayes>\n",
            "subsections": []
        },
        "TODO": {
            "content": "*   The current maintenance work is directed towards making the documentation more useful,\nimproving and simplifying the API, and improving the maintainability of the code base. After\nthat new features will be added.\n\n*   Fix open bugs and documentation for SaveParser.\n\n*   Add Formula support, Hyperlink support, Named Range support.\n\n*   Improve Spreadsheet::ParseExcel::SaveParser compatibility with Spreadsheet::WriteExcel.\n\n*   Improve Unicode and other encoding support. This will probably require dropping support for\nperls prior to 5.8+.\n",
            "subsections": []
        },
        "ACKNOWLEDGEMENTS": {
            "content": "From Kawai Takanori:\n\nFirst of all, I would like to acknowledge the following valuable programs and modules: XHTML,\nOLE::Storage and Spreadsheet::WriteExcel.\n\nIn no particular order: Yamaji Haruna, Simamoto Takesi, Noguchi Harumi, Ikezawa Kazuhiro,\nSuwazono Shugo, Hirofumi Morisada, Michael Edwards, Kim Namusk, Slaven Rezic, Grant Stevens,\nH.Merijn Brand and many many people + Kawai Mikako.\n\nAlexey Mazurin added the decryption facility.\n",
            "subsections": []
        },
        "DISCLAIMER OF WARRANTY": {
            "content": "Because this software is licensed free of charge, there is no warranty for the software, to the\nextent permitted by applicable law. Except when otherwise stated in writing the copyright\nholders and/or other parties provide the software \"as is\" without warranty of any kind, either\nexpressed or implied, including, but not limited to, the implied warranties of merchantability\nand fitness for a particular purpose. The entire risk as to the quality and performance of the\nsoftware is with you. Should the software prove defective, you assume the cost of all necessary\nservicing, repair, or correction.\n\nIn no event unless required by applicable law or agreed to in writing will any copyright holder,\nor any other party who may modify and/or redistribute the software as permitted by the above\nlicence, be liable to you for damages, including any general, special, incidental, or\nconsequential damages arising out of the use or inability to use the software (including but not\nlimited to loss of data or data being rendered inaccurate or losses sustained by you or third\nparties or a failure of the software to operate with any other software), even if such holder or\nother party has been advised of the possibility of such damages.\n",
            "subsections": []
        },
        "LICENSE": {
            "content": "Either the Perl Artistic Licence <http://dev.perl.org/licenses/artistic.html> or the GPL\n<http://www.opensource.org/licenses/gpl-license.php>\n",
            "subsections": []
        },
        "AUTHOR": {
            "content": "Current maintainer 0.60+: Douglas Wilson dougw@cpan.org\n\nMaintainer 0.40-0.59: John McNamara jmcnamara@cpan.org\n\nMaintainer 0.27-0.33: Gabor Szabo szabgab@cpan.org\n\nOriginal author: Kawai Takanori (Hippo2000) kwitknr@cpan.org\n",
            "subsections": []
        },
        "COPYRIGHT": {
            "content": "Copyright (c) 2014 Douglas Wilson\n\nCopyright (c) 2009-2013 John McNamara\n\nCopyright (c) 2006-2008 Gabor Szabo\n\nCopyright (c) 2000-2006 Kawai Takanori\n\nAll rights reserved. This is free software. You may distribute under the terms of either the GNU\nGeneral Public License or the Artistic License.\n",
            "subsections": []
        }
    },
    "summary": "Spreadsheet::ParseExcel - Read information from an Excel file.",
    "flags": [],
    "examples": [],
    "see_also": []
}