NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #340 most downloaded on PyPI
Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files
Last release 1 years ago
14 Jun 2025
Release timing varies
gaps range from 2 weeks to 4.5 years
Nearly every release is documented
notes for 23 of 24 stable releases
Nothing withdrawn
no release was ever pulled
21 years old
25 releases · first in 2006
Fix bug reading sheets containing invalid formulae.
Fix bug reading sheets containing invalid formulae.
Thanks to sanshi42 for the fix!
Use the README as the long description on PyPI.
Use the README as the long description on PyPI.
Remove support for anything other than .xls files.
One column per quarter.
Remove support for anything other than .xls files.
Remove support for psyco.
Change the default encoding used when no CODEPAGE record can be found from ascii to iso-8859-1.
Add support for iterating over ~xlrd.book.Book objects.
Add support for item access from ~xlrd.book.Book objects, where integer indices and string sheet names are supported.
Non-unicode spaces are now stripped from the "last author" information.
Workbook corruption errors can now be ignored using the ignore_workbook_corruption option to ~xlrd.open_workbook.
Handle WRITEACCESS records with invalid trailing characters.
Officially support Python 3.8 and 3.9.
Thanks to the following for their contributions to this release:
Jon Dufresne
Tore Lundqvist
nayyarv
Michael Davis
skonik
Fixed time.clock() deprecation warning.
Added support for Python 3.7.
Added optional support for defusedxml to help mitigate exploits.
Automatically convert ~ in file paths to the current user's home directory.
Removed examples directory from the installed package. They are still available in the source distribution.
Fixed time.clock() deprecation warning.
Document the problem with XML vulnerabilities in xlsx files and mitigation measures.
Fix for parsing of merged cells containing a single cell reference in xlsx files.
Fix for "invalid literal for int() with base 10: 'true'" when reading some xlsx files.
Make xldate_as_datetime available to import direct from xlrd.
Build universal wheels.
Sphinx documentation.
Document the problem with XML vulnerabilities in xlsx files and mitigation measures.
Fix NameError on has_defaults is not defined.
Some whitespace and code style tweaks.
Make example in README compatible with both Python 2 and 3.
Add default value for cells containing errors that causeed parsing of some xlsx files to fail.
Add Python 3.6 to the list of supported Python versions, drop 3.3 and 2.6.
Use generator expressions to avoid unnecessary lists in memory.
Document unicode encoding used in Excel files from Excel 97 onwards.
Report hyperlink errors in R1C1 syntax.
Thanks to the following for their contributions to this release:
Daniel Rech
Ville Skyttä
Yegor Yefremov
Maxime Lorant
Alexandr N Zamaraev
Zhaorong Ma
Jon Dufresne
Chris McIntyre
Ivan Masá
Official support, such as it is, is now for 2.6, 2.7, 3.3+
Official support, such as it is, is now for 2.6, 2.7, 3.3+
Fixes a bug in looking up non-lowercase sheet filenames by ensuring that the sheet targets are transformed the same way as the component_names dict keys.
Fixes a bug for ragged_rows=False when merged cells increases the number of columns in the sheet. This requires all rows to be extended to ensure equal row lengths that match the number of columns in the sheet.
Fixes to enable reading of SAP-generated .xls files.
support BIFF4 files with missing FORMAT records.
support files with missing WINDOW2 record.
Empty cells are now always unicode strings, they were a bytestring on Python 2 and a unicode string on Python 3.
Fix for <cell> inlineStr attribute without <si> child.
Fix for a zoom of None causing problems on Python 3.
Fix parsing of bad dimensions.
Fix xlsx sheet to comments relationship.
Thanks to the following for their contributions to this release:
Lars-Erik Hannelius
Deshi Xiao
Stratos Moro
Volker Diels-Grabsch
John McNamara
Ville Skyttä
Patrick Fuller
Dragon Dave McKee
Gunnlaugur Þór Briem
Use ElementTree.iter() if available, instead of the deprecated getiterator() when parsing xlsx files.
Automated tests are now run on Python 3.4
Use ElementTree.iter() if available, instead of the deprecated getiterator() when parsing xlsx files.
Fix #106 : Exception Value: unorderable types: Name() < Name()
Create row generator expression with Sheet.get_rows()
Fix for forward slash file separator and lowercase names within xlsx internals.
Thanks to the following for their contributions to this release:
Corey Farwell
Jonathan Kamens
Deepak N
Brandon R. Stoner
John McNamara
Github issue #64 - skip meaningless chunk of 4 zero bytes between two otherwise-valid BIFF records
Github issue #49
Github issue #64 - skip meaningless chunk of 4 zero bytes between two otherwise-valid BIFF records
Github issue #61 - fix updating of escapement attribute of Font objects read from workbooks.
Implemented Sheet.visibility for xlsx files
Ignore anchors ($) in cell references
Dropped support for Python 2.5 and earlier, Python 2.6 is now the earliest Python release supported
Read xlsx merged cell elements.
Read cell comments in .xlsx files.
Added xldate_as_datetime() function to convert from Excel serial date/time to datetime.datetime object.
Thanks to the following for their contributions to this release:
John Machin
Caleb Epstein
Martin Panter
John McNamara
Gunnlaugur Þór Briem
Stephen Lewis
Fix some packaging issues that meant docs and examples were missing from the tarball.
Fix some packaging issues that meant docs and examples were missing from the tarball.
Fixed a small but serious regression that caused problems opening .xlsx files.
Many fixes bugs in Python 3 support.
Many fixes bugs in Python 3 support.
Fix bug where ragged rows needed fixing when formatting info was being parsed.
Improved handling of aberrant Excel 4.0 Worksheet files.
Various bug fixes.
Simplify a lot of the distribution packaging.
Remove unused and duplicate imports.
Thanks to the following for their contributions to this release:
Thomas Kluyver
Continuous integration tests are now run.
Support for Python 3.2+
Many new unit test added.
Continuous integration tests are now run.
Various bug fixes.
Special thanks to Thomas Kluyver and Martin Panter for their work on Python 3 compatibility.
Thanks to Manfred Moitzi for re-licensing his unit tests so we could include them.
Thanks to the following for their contributions to this release:
"holm"
Victor Safronovich
Ross Jones
More work-arounds for broken source files.
More work-arounds for broken source files.
Support for reading .xlsx files.
Drop support for Python 2.5 and older.
Nothing published for this version
Ignore superfluous zero bytes at end of xls OBJECT record.
Ignore superfluous zero bytes at end of xls OBJECT record.
Fix assertion error when reading file with xlwt-written bitmap.
More packaging changes, this time to support 2to3.
More packaging changes, this time to support 2to3.
- Fix more packaging issues.
Fix more packaging issues.
Fix packaging issue that missed version.txt from the distributions.
Fix packaging issue that missed version.txt from the distributions.
More tolerance of out-of-spec files.
More tolerance of out-of-spec files.
Fix bugs reading long text formula results.
Packaging and documentation updates.
Packaging and documentation updates.
Tolerant handling of files with extra zero bytes at end of NUMBER record. Sample provided by Jan Kraus.
Tolerant handling of files with extra zero bytes at end of NUMBER record. Sample provided by Jan Kraus.
Added access to cell notes/comments. Many cross-references added to Sheet class docs.
Added code to extract hyperlink (HLINK) records. Based on a patch supplied by John Morrisey.
Extraction of rich text formatting info based on code supplied by Nathan van Gheem.
added handling of BIFF2 WINDOW2 record.
Included modified version of page breaks patch from Sam Listopad.
Added reading of the PANE record.
Reading SCL record. New attribute Sheet.scl_mag_factor.
Lots of bug fixes.
Added ragged_rows functionality.
Backed out "slash'n'burn" of sheet resources in unload_sheet(). Fixed problem with STYLE records on some Mac Excel files.
Backed out "slash'n'burn" of sheet resources in unload_sheet(). Fixed problem with STYLE records on some Mac Excel files.
quieten warnings
Integrated on_demand patch by Armando Serrano Lombillo
colname utility function now supports more than 256 columns.
colname utility function now supports more than 256 columns.
Fix bug where BIFF record type 0x806 was being regarded as a formula opcode.
Ignore PALETTE record when formatting_info is false.
Tolerate up to 4 bytes trailing junk on PALETTE record.
Fixed bug in unused utility function xldate_from_date_tuple which affected some years after 2099.
Added code for inspecting as-yet-unused record types: FILEPASS, TXO, NOTE.
Added inspection code for add_in function calls.
Added support for unnumbered biff_dump (better for doing diffs).
ignore distutils cruft
Avoid assertion error in compdoc when -1 used instead of -2 for first_SID of empty SCSS
Make version numbers match up.
Enhanced recovery from out-of-order/missing/wrong CODEPAGE record.
Added Name.area2d convenience method.
Avoided some checking of XF info when formatting_info is false.
Minor changes in preparation for XLSX support.
remove duplicate files that were out of date.
Basic support for Excel 2.0
Decouple Book init & load.
runxlrd: minor fix for xfc.
More Excel 2.x work.
is_date_format() tweak.
Better detection of IronPython.
Better error message (including first 8 bytes of file) when file is not in a supported format.
More BIFF2 formatting: ROW, COLWIDTH, and COLUMNDEFAULT records;
finished stage 1 of XF records.
More work on supporting BIFF2 (Excel 2.x) files.
Added support for Excel 2.x (BIFF2) files. Data only, no formatting info. Alpha.
Wasn't coping with EXTERNSHEET record followed by CONTINUE record(s).
Allow for BIFF2/3-style FORMAT record in BIFF4/8 file
Avoid crash when zero-length Unicode string missing options byte.
Warning message if sector sizes are extremely large.
Work around corrupt STYLE record
Added missing entry for blank cell type to ctype_text
Added "fonts" command to runxlrd script
Warning: style XF whose parent XF index != 0xFFF
Logfile arg wasn't being passed from open_workbook to compdoc.CompDoc.
Version number updated to 0.6.1
Version number updated to 0.6.1
Documented runxlrd.py commands in its usage message. Changed commands: dump to biff_dump, count_records to biff_count.
At least one source of XLS files writes parent style XF records *after* the child cell XF records that refer to them, triggering IndexError in 0.5.2 a
At least one source of XLS files writes parent style XF records after the child cell XF records that refer to them, triggering IndexError in 0.5.2 and AssertionError in later versions. Reported with sample file by Todd O'Bryan. Fixed by changing to two-pass processing of XF records.
Formatting info in pre-BIFF8 files: Ensured appropriate defaults and lossless conversions to make the info BIFF8-compatible. Fixed bug in extracting the "used" flags.
Fixed problems discovered with opening test files from Planmaker 2006 (http://www.softmaker.com/english/ofwcomp_en.htm): (1) Four files have reduced size of PALETTE record (51 and 32 colours; Excel writes 56 always). xlrd now emits a NOTE to the logfile and continues. (2) FORMULA records use the Excel 2.x record code 0x0021 instead of 0x0221. xlrd now continues silently. (3) In two files, at the OLE2 compound document level, the internal directory says that the length of the Short-Stream Container Stream is 16384 bytes, but the actual contents are 11264 and 9728 bytes respectively. xlrd now emits a WARNING to the logfile and continues.
After discussion with Daniel Rentz, the concept of two lists of XF (eXtended Format) objects (raw_xf_list and computed_xf_list) has been abandoned. There is now a single list, called xf_list
Updated version numbers, README, HISTORY.
public release
Updated version numbers, README, HISTORY.
Your coding agent can read these notes before it upgrades. Set up the MCP server →