# 3.1.5 (2024-06-28)

- #2187 Test fails due to change in Numpy API

- #2198 Excel is very fussy about the version number

- #2200 Poor perfomance when reading workbooks with lots of named styles

# 3.1.4 (2024-06-12)

- #2189 Assigning named styles doesn’t work

- #2190 Problems caused when saving workbooks created by LibreOffice

## Changes

- Python 3.6 and 3.7 are no longer supported.

# 3.1.3 (2024-05-29)

## Bugfixes

- #1401 Column name caches are slow and use a lot of memory

- #1457 Improved handling of duplicate named styles

- #1842 Rich-text can be saved if lxml is not installed

- #1954 Documentation for sheet views is incorrect

- #1973 Timedeltas not read properly in read-only mode

- #1987 List of formulae names contains mistakes

- #1967 Filters does not handle non-numerical filters

- #2054 Type checking increases exponentially

- #2057 Loading pivot tables can be unnecessarily slow

- #2102 Improve performance when reading files with lots of custom properties

- #2106 Setting Trendline.name attribute raises exception when saving

- #2120 Timezone and Zombie formatting cannot be combined.

- #2107 Column name generation is inefficient and slow

- #2122 File handlers not always released in read-only mode

- #2149 Workbook files not properly closed on Python ≥ 3.11.8 and Windows

- #2161 Pivot cache definitions using tupleCache had serialisation issues

## Changes

- Add a __repr__ method for Row and Column dimension objects so you don’t need to check every time.

# 3.1.2 (2023-03-11)

- #1963 Cannot read worksheets in read-only mode with locally scoped definitions

- #1974 Empty custom properties cause invalid files

# 3.1.1 (2023-02-13)

## Bugfixes

- #1881 DocumentProperties times set by module import only

- #1947 Worksheet-specific definitions are missing

# 3.1.0 (2023-01-31)

## New Features

- Added support for data table formulae

- Mapped chartspace graphical properties to charts for advanced formatting

## Bugfixes

- #1156 Table filters are always overriden

- #1360 Can’t read some ScatterCharts if n

- #1724 Problem with multilevel indices in dataframes

- #1763 Make calculating worksheet sizes slightly faster

- #1772 Problem with category indices in dataframes

- #1786 NamedStyles share attributes - mutables gotcha

- #1851 Allow print area to be set to None

- #1852 Worksheet for print title and print areas can’t be found

- #1853 Custom document properties that are strings can be empty

- #1858 ConditionalFormatting lost when pivot table updated

- #1864 Better handling of defined names

- #1904 dataframe_to_rows() misalignment on multiindex

- #1908 Ditto

- #1912 Excel doesn’t like xmlns:space on nodes with only whitespace, which it treats as empty.

- #1942 Exception when print areas use table references.

## Pull Requests

- PR409 Support for Rich Text in cells

- PR411 Provide more information when workbook cannot be loaded

- PR407 Support for Custom Document Properties

## Deprecations

The following properties have been removed from worksheets: formula_attributes, page_breaks, show_summary_below, show_summary_right, page_size orientation. Client code should use the relevant objects.

## Removals

The following deprecated methods have been removed from workbooks: get_named_range, add_named_range, remove_named_range. And the get_emu_dimesions from images.

# 3.0.10 (2022-05-19)

## Bugfixes

- #1684 Image files not closed when workbooks are saved

- #1778 Problem with missing scope attribute in Pivot Table formats

- #1821 Excel unhappy when multiple sorts are defined

- #2014 Accounting format interpreted as datetime

# 3.0.9 (2021-09-22)

## Bugfixes

- #1284 Ignore blank ignored in existing Data Validations

- #1539 Add support for cell protection for merged cell ranges

- #1645 Timezone-aware datetimes raise an Exception

- #1666 Improved normalisation of chart series

- #1670 Catch OverflowError for out of range datetimes

- #1708 Alignment.relativeIndent can be negative

- #1736 Incorrect default value groupBy attribute

# 3.0.8 (brown bag)

Deleted because it contained breaking changes from 3.1

# 3.0.7 (2021-03-09)

## Bugfixes

- #1510 Problems with zero time values

- #1588 Not possible to correctly convert excel dates to timedelta

- #1589 Exception raised when merging cells which do not have borders all the way round.

- #1594 Python 2 print statement in the tutorial

## Pull Requests

- PR392 Add documentation on datetime handling

- PR393 Drop dependency on jdcal

- PR394 Datetime rounding

- PR395 Unify handling of 1900 epoch

- PR397 Add explicit support for reading datetime deltas

- PR399 Millisecond precision for datetimes

# 3.0.6 (2021-01-14)

## Bugfixes

- #1154 Borders in differential styles are incorrect

- #1287 Error when opening some pivot tables

- #1366 Resave breaks the border format in conditional formatting rules

- #1450 Read-only workbook not closed properly if generator interrupted

- #1547 Pandas.Multiindex.labels deprecated

- #1552 Pandas.Multiinex not expanded correctly

- #1557 Cannot read rows with exponents

- #1568 numpy.float is deprecated

- #1571 Cells without coordinate attributes not always correctly handled

## Pull Requests

- PR385 Improved handling of borders for differential styles

- PR386 Support subclasses of datetime objects

- PR387 Improved handling of cells without coordinates

# 3.0.5 (2020-08-21)

## Bugfixes

- #1413 Incorrectly consider currency format as datetime

- #1490 Cannot copy worksheets with merged cells

- #1492 Empty worksheets do not return generators when looping.

- #1496 Hyperlinks duplicated on multiple saves

- #1500 Incorrectly literal format as datetime

- #1502 Links set to range of cells not preserved

- #1507 Exception when opening workbook with chartsheets and tables

# 3.0.4 (2020-06-24)

## Bugfixes

- #844 Find tables by name

- #1414 Worksheet protection missing in existing files

- #1439 Exception when reading files with external images

- #1452 Reading lots of merged cells is very slow.

- #1455 Read support for Bubble Charts.

- #1458 Preserve any indexed colours

- #1473 Reading many thousand of merged cells is really slow.

- #1474 Adding tables in write-only mode raises an exception.

## Pull Requests

- PR377 Add support for finding tables by name or range.

# 3.0.3 (2020-01-20)

## Bugfixes

- #1260 Exception when handling merged cells with hyperlinks

- #1373 Problems when both lxml and defusedxml are installed

- #1385 CFVO with incorrect values cannot be processed

# 3.0.2 (2019-11-25)

## Bug fixes

- #1267 DeprecationError if both defusedxml and lxml are installed

- #1345 ws._current_row is higher than ws.max_row

- #1365 Border bottom style is not optional when it should be

- #1367 Empty cells in read-only, values-only mode are sometimes returned as ReadOnlyCells

- #1368 Cannot add page breaks to existing worksheets if none exist already

## Pull Requests

- PR359 Improvements to the documentation

# 3.0.1 (2019-11-14)

## Bugfixes

- #1250 Cannot read empty charts.

## Pull Requests

- PR354 Fix for #1250

- PR352 TableStyleElement is a sequence

# 3.0.0 (2019-09-25)

## Python 3.6+ only release

# 2.6.4 (2019-09-25)

## Final release for Python 2.7 and 3.5

## Bugfixes

- ` #1330 <https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1330>`_ Cannot save workbooks with comments more than once.

# 2.6.3 (2019-08-19)

## Bugfixes

- #1237 Fix 3D charts.

- #1290 Minimum for holeSize in Doughnut charts too high

- #1291 Warning for MergedCells with comments

- #1296 Pagebreaks duplicated

- #1309 Workbook has no default CellStyle

- #1330 Workbooks with comments cannot be saved multiple times

## Pull Requests

- PR344 Make sure NamedStyles number formats are correctly handled

# 2.6.2 (2019-03-29)

## Bugfixes

- #1173 Workbook has no _date_formats attribute

- #1190 Cannot create charts for worksheets with quotes in the title

- #1228 MergedCells not removed when range is unmerged

- #1232 Link to pivot table lost from charts

- #1233 Chart colours change after saving

- #1236 Cannot use ws.cell in read-only mode with Python 2.7

# 2.6.1 (2019-03-04)

## Bugfixes

- #1174 ReadOnlyCell.is_date does not work properly

- #1175 Cannot read Google Docs spreadsheet with a Pivot Table

- #1180 Charts created with openpyxl cannot be styled

- #1181 Cannot handle some numpy number types

- #1182 Exception when reading unknowable number formats

- #1186 Only last formatting rule for a range loaded

- #1191 Give MergedCell a value attribute

- #1193 Cannot process worksheets with comments

- #1197 Cannot process worksheets with both row and page breaks

- #1204 Cannot reset dimensions in ReadOnlyWorksheets

- #1211 Incorrect descriptor in ParagraphProperties

- #1213 Missing hier attribute in PageField raises an exception

# 2.6.0 (2019-02-06)

## Bugfixes

- #1162 Exception on tables with names containing spaces.

- #1170 Cannot save files with existing images.

# 2.6.-b1 (2019-01-08)

## Bugfixes

- #1141 Cannot use read-only mode with stream

- #1143 Hyperlinks always set on A1

- #1151 Internal row counter not initialised when reading files

- #1152 Exception raised on out of bounds date

# 2.6-a1 (2018-11-21)

## Major changes

- Implement robust for merged cells so that these can be formatted the way Excel does without confusion. Thanks to Magnus Schieder.

## Minor changes

- Add support for worksheet scenarios

- Add read support for chartsheets

- Add method for moving ranges of cells on a worksheet

- Drop support for Python 3.4

- Last version to support Python 2.7

## Deprecations

- Type inference and coercion for cell values

# 2.5.14 (2019-01-23)

## Bugfixes

- #1150 Correct typo in LineProperties

- #1142 Exception raised for unsupported image files

- #1159 Exception raised when cannot find source for non-local cache object

## Pull Requests

- PR301 Add support for nested brackets to the tokeniser

- PR303 Improvements on handling nested brackets in the tokeniser

# 2.5.13 (brown bag)

# 2.5.12 (2018-11-29)

## Bugfixes

- #1130 Overwriting default font in Normal style affects library default

- #1133 Images not added to anchors.

- #1134 Cannot read pivot table formats without dxId

- #1138 Repeated registration of simple filter could lead to memory leaks

## Pull Requests

- PR300 Use defusedxml if available

# 2.5.11 (2018-11-21)

## Pull Requests

- PR295 Improved handling of missing rows

- PR296 Add support for defined names to tokeniser

# 2.5.10 (2018-11-13)

## Bugfixes

- #1114 Empty column dimensions should not be saved.

## Pull Requests

- PR285 Tokenizer failure for quoted sheet name in second half of range

- PR289 Improved error detection in ranges.

# 2.5.9 (2018-10-19)

## Bugfixes

- #1000 Clean AutoFilter name definitions

- #1106 Attribute missing from Shape object

- #1109 Failure to read all DrawingML means workbook can’t be read

## Pull Requests

- PR281 Allow newlines in formulae

- PR284 Fix whitespace in front of infix operator in formulae

# 2.5.8 (2018-09-25)

- #877 Cannot control how missing values are displayed in charts.

- #948 Cell references can’t be used for chart titles

- #1095 Params in iter_cols and iter_rows methods are slightly wrong.

# 2.5.7 (2018-09-13)

- #954 Sheet title containing % need quoting in references

- #1047 Cannot set quote prefix

- #1093 Pandas timestamps raise KeyError

# 2.5.6 (2018-08-30)

- #832 Read-only mode can leave find-handles open when reading dimensions

- #933 Set a worksheet directly as active

- #1086 Internal row counter not adjusted when rows are deleted or inserted

# 2.5.5 (2018-08-04)

## Bugfixes

- #1049 Files with Mac epoch are read incorrectly

- #1058 Cannot copy merged cells

- #1066 Cannot access ws.active_cell

## Pull Requests

- PR267 Introduce read-support for images

# 2.5.4 (2018-06-07)

## Bugfixes

- #1025 Cannot read files with 3D charts.

- #1030 Merged cells take a long time to parse

## Minor changes

- Improve read support for pivot tables and don’t always create a Filters child for filterColumn objects.

- Support folding rows <https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/259/fold-rows>`_

# 2.5.3 (2018-04-18)

## Bugfixes

- #983 Warning level too aggressive.

- #1015 Alignment and protection values not saved for named styles.

- #1017 Deleting elements from a legend doesn’t work.

- #1018 Index names repeated for every row in dataframe.

- #1020 Worksheet protection not being stored.

- #1023 Exception raised when reading a tooltip.

# 2.5.2 (2018-04-06)

## Bugfixes

- #949 High memory use when reading text-heavy files.

- #970 Copying merged cells copies references.

- #978 Cannot set comment size.

- #985 Exception when trying to save workbooks with no views.

- #995 Cannot delete last row or column.

- #1002 Cannot read Drawings containing embedded images.

## Minor changes

- Support for dataframes with multiple columns and multiple indices.

# 2.5.1 (2018-03-12)

## Bugfixes

- #934 Headers and footers not included in write-only mode.

- #960 Deprecation warning raised when using ad-hoc access in read-only mode.

- #964 Not all cells removed when deleting multiple rows.

- #966 Cannot read 3d bar chart correctly.

- #967 Problems reading some charts.

- #968 Worksheets with SHA protection become corrupted after saving.

- #974 Problem when deleting ragged rows or columns.

- #976 GroupTransforms and GroupShapeProperties have incorrect descriptors

- Make sure that headers and footers in chartsheets are included in the file

# 2.5.0 (2018-01-24)

## Minor changes

- Correct definition for Connection Shapes. Related to # 958

# 2.5.0-b2 (2018-01-19)

## Bugfixes

- #915 TableStyleInfo has no required attributes

- #925 Cannot read files with 3D drawings

- #926 Incorrect version check in installer

- Cell merging uses transposed parameters

- #928 ExtLst missing keyword for PivotFields

- #932 Inf causes problems for Excel

- #952 Cannot load table styles with custom names

## Major Changes

- You can now insert and delete rows and columns in worksheets

## Minor Changes

- pip now handles which Python versions can be used.

# 2.5.0-b1 (2017-10-19)

## Bugfixes

- #812 Explicitly support for multiple cell ranges in conditonal formatting

- #827 Non-contiguous cell ranges in validators get merged

- #837 Empty data validators create invalid Excel files

- #860 Large validation ranges use lots of memory

- #876 Unicode in chart axes not handled correctly in Python 2

- #882 ScatterCharts have defective axes

- #885 Charts with empty numVal elements cannot be read

- #894 Scaling options from existing files ignored

- #895 Charts with PivotSource cannot be read

- #903 Cannot read gradient fills

- #904 Quotes in number formats could be treated as datetimes

## Major Changes

worksheet.cell() no longer accepts a coordinate parameter. The syntax is now ws.cell(row, column, value=None)

## Minor Changes

Added CellRange and MultiCellRange types (thanks to Laurent LaPorte for the suggestion) as a utility type for things like data validations, conditional formatting and merged cells.

## Deprecations

ws.merged_cell_ranges has been deprecated because MultiCellRange provides sufficient functionality

# 2.5.0-a3 (2017-08-14)

## Bugfixes

- #848 Reading workbooks with Pie Charts raises an exception

- #857 Pivot Tables without Worksheet Sources raise an exception

# 2.5.0-a2 (2017-06-25)

## Major Changes

- Read support for charts

## Bugfixes

- #833 Cannot access chartsheets by title

- #834 Preserve workbook views

- #841 Incorrect classification of a datetime

# 2.5.0-a1 (2017-05-30)

## Compatibility

- Dropped support for Python 2.6 and 3.3. openpyxl will not run with Python 2.6

## Major Changes

- Read/write support for pivot tables

## Deprecations

- Dropped the anchor method from images and additional constructor arguments

## Bugfixes

- #779 Fails to recognise Chinese date format`

- #828 Include hidden cells in charts`

## Pull requests

- 163 Improved GradientFill

## Minor changes

- Remove deprecated methods from Cell

- Remove deprecated methods from Worksheet

- Added read/write support for the datetime type for cells

# 2.4.11 (2018-01-24)

- #957 https://foss.heptapod.net/openpyxl/openpyxl/-/issues/957 Relationship type for tables is borked

# 2.4.10 (2018-01-19)

## Bugfixes

- #912 https://foss.heptapod.net/openpyxl/openpyxl/-/issues/912 Copying objects uses shallow copy

- #921 https://foss.heptapod.net/openpyxl/openpyxl/-/issues/921 API documentation not generated automatically

- #927 https://foss.heptapod.net/openpyxl/openpyxl/-/issues/927 Exception raised when adding coloured borders together

- #931 https://foss.heptapod.net/openpyxl/openpyxl/-/issues/931 Number formats not correctly deduplicated

## Pull requests

- 203 https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/203/ Correction to worksheet protection description

- 210 https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/210/ Some improvements to the API docs

- 211 https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/211/ Improved deprecation decorator

- 218 https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/218/ Fix problems with deepcopy

# 2.4.9 (2017-10-19)

## Bugfixes

- #809 Incomplete documentation of copy_worksheet method

- #811 Scoped definedNames not removed when worksheet is deleted

- #824 Raise an exception if a chart is used in multiple sheets

- #842 Non-ASCII table column headings cause an exception in Python 2

- #846 Conditional formats not supported in write-only mode

- #849 Conditional formats with no sqref cause an exception

- #859 Headers that start with a number conflict with font size

- #902 TableStyleElements don’t always have a condtional format

- #908 Read-only mode sometimes returns too many cells

## Pull requests

- #179 Cells kept in a set

- #180 Support for Workbook protection

- #182 Read support for page breaks

- #183 Improve documentation of copy_worksheet method

- #198 Fix for #908

# 2.4.8 (2017-05-30)

## Bugfixes

- AutoFilter.sortState being assignd to the ws.sortState

- #766 Sheetnames with apostrophes need additional escaping

- #729 Cannot open files created by Microsoft Dynamics

- #819 Negative percents not case correctly

- #821 Runtime imports can cause deadlock

- #855 Print area containing only columns leads to corrupt file

## Minor changes

- Preserve any table styles

# 2.4.7 (2017-04-24)

## Bugfixes

- #807 Sample files being included by mistake in sdist

# 2.4.6 (2017-04-14)

## Bugfixes

- #776 Cannot apply formatting to plot area

- #780 Exception when element attributes are Python keywords

- #781 Exception raised when saving files with styled columns

- #785 Number formats for data labels are incorrect

- #788 Worksheet titles not quoted in defined names

- #800 Font underlines not read correctly

# 2.4.5 (2017-03-07)

## Bugfixes

- #750 Adding images keeps file handles open

- #772 Exception for column-only ranges

- #773 Cannot copy worksheets with non-ascii titles on Python 2

## Pull requests

- 161 Support for non-standard names for Workbook part.

- 162 Documentation correction

# 2.4.4 (2017-02-23)

## Bugfixes

- #673 Add close method to workbooks

- #762 openpyxl can create files with invalid style indices

- #729 Allow images in write-only mode

- #744 Rounded corners for charts

- #747 Use repr when handling non-convertible objects

- #764 Hashing function is incorrect

- #765 Named styles share underlying array

## Minor Changes

- Add roundtrip support for worksheet tables.

## Pull requests

- 160 Don’t init mimetypes more than once.

# 2.4.3 (unreleased)

bad release

# 2.4.2 (2017-01-31)

## Bug fixes

- #727 DeprecationWarning is incorrect

- #734 Exception raised if userName is missing

- #739 Always provide a date1904 attribute

- #740 Hashes should be stored as Base64

- #743 Print titles broken on sheetnames with spaces

- #748 Workbook breaks when active sheet is removed

- #754 Incorrect descriptor for Filter values

- #756 Potential XXE vulerability

- #758 Cannot create files with page breaks and charts

- #759 Problems with worksheets with commas in their titles

## Minor Changes

- Add unicode support for sheet name incrementation.

# 2.4.1 (2016-11-23)

## Bug fixes

- #643 Make checking for duplicate sheet titles case insensitive

- #647 Trouble handling LibreOffice files with named styles

- #687 Directly assigned new named styles always refer to “Normal”

- #690 Cannot parse print titles with multiple sheet names

- #691 Cannot work with macro files created by LibreOffice

- Prevent duplicate differential styles

- #694 Allow sheet titles longer than 31 characters

- #697 Cannot unset hyperlinks

- #699 Exception raised when format objects use cell references

- #703 Copy height and width when copying comments

- #705 Incorrect content type for VBA macros

- #707 IndexError raised in read-only mode when accessing individual cells

- #711 Files with external links become corrupted

- #715 Cannot read files containing macro sheets

- #717 Details from named styles not preserved when reading files

- #722 Remove broken Print Title and Print Area definitions

## Minor changes

- Add support for Python 3.6

- Correct documentation for headers and footers

## Deprecations

Worksheet methods get_named_range() and get_sqaured_range()

## Bug fixes

# 2.4.0 (2016-09-15)

## Bug fixes

- #652 Exception raised when epoch is 1904

- #642 Cannot handle unicode in headers and footers in Python 2

- #646 Cannot handle unicode sheetnames in Python 2

- #658 Chart styles, and axis units should not be 0

- #663 Strings in external workbooks not unicode

## Major changes

- Add support for builtin styles and include one for Pandas

## Minor changes

- Add a keep_links option to load_workbook. External links contain cached copies of the external workbooks. If these are big it can be advantageous to be able to disable them.

- Provide an example for using cell ranges in DataValidation.

- PR 138 - add copy support to comments.

# 2.4.0-b1 (2016-06-08)

## Minor changes

- Add an the alias hide_drop_down to DataValidation for showDropDown because that is how Excel works.

## Bug fixes

- #625 Exception raises when inspecting EmptyCells in read-only mode

- #547 Functions for handling OOXML “escaped” ST_XStrings

- #629 Row Dimensions not supported in write-only mode

- #530 Problems when removing worksheets with charts

- #630 Cannot use SheetProtection in write-only mode

## Features

- Add write support for worksheet tables

# 2.4.0-a1 (2016-04-11)

## Minor changes

- Remove deprecated methods from DataValidation

- Remove deprecated methods from PrintPageSetup

- Convert AutoFilter to Serialisable and extend support for filters

- Add support for SortState

- Removed use_iterators keyword when loading workbooks. Use read_only instead.

- Removed optimized_write keyword for new workbooks. Use write_only instead.

- Improve print title support

- Add print area support

- New implementation of defined names

- New implementation of page headers and footers

- Add support for Python’s NaN

- Added iter_cols method for worksheets

- ws.rows and ws.columns now always return generators and start at the top of the worksheet

- Add a values property for worksheets

- Default column width changed to 8 as per the specification

## Deprecations

- Cell anchor method

- Worksheet point_pos method

- Worksheet add_print_title method

- Worksheet HeaderFooter attribute, replaced by individual ones

- Flatten function for cells

- Workbook get_named_range, add_named_range, remove_named_range, get_sheet_names, get_sheet_by_name

- Comment text attribute

- Use of range strings deprecated for ws.iter_rows()

- Use of coordinates deprecated for ws.cell()

- Deprecate .copy() method for StyleProxy objects

## Bug fixes

- #152 Hyperlinks lost when reading files

- #171 Add function for copying worksheets

- #386 Cells with inline strings considered empty

- #397 Add support for ranges of rows and columns

- #446 Workbook with definedNames corrupted by openpyxl

- #481 “safe” reserved ranges are not read from workbooks

- #501 Discarding named ranges can lead to corrupt files

- #574 Exception raised when using the class method to parse Relationships

- #579 Crashes when reading defined names with no content

- #597 Cannot read worksheets without coordinates

- #617 Customised named styles not correctly preserved

# 2.3.5 (2016-04-11)

## Bug fixes

- #618 Comments not written in write-only mode

# 2.3.4 (2016-03-16)

## Bug fixes

- #594 Content types might be missing when keeping VBA

- #599 Cells with only one cell look empty

- #607 Serialise NaN as ‘’

## Minor changes

- Preserve the order of external references because formualae use numerical indices.

- Typo corrected in cell unit tests (PR 118)

# 2.3.3 (2016-01-18)

## Bug fixes

- #540 Cannot read merged cells in read-only mode

- #565 Empty styled text blocks cannot be parsed

- #569 Issue warning rather than raise Exception raised for unparsable definedNames

- #575 Cannot open workbooks with embdedded OLE files

- #584 Exception when saving borders with attributes

## Minor changes

- PR 103 Documentation about chart scaling and axis limits

- Raise an exception when trying to copy cells from other workbooks.

# 2.3.2 (2015-12-07)

## Bug fixes

- #554 Cannot add comments to a worksheet when preserving VBA

- #561 Exception when reading phonetic text

- #562 DARKBLUE is the same as RED

- #563 Minimum for row and column indexes not enforced

## Minor changes

- PR 97 One VML file per worksheet.

- PR 96 Correct descriptor for CharacterProperties.rtl

- #498 Metadata is not essential to use the package.

# 2.3.1 (2015-11-20)

## Bug fixes

- #534 Exception when using columns property in read-only mode.

- #536 Incorrectly handle comments from Google Docs files.

- #539 Flexible value types for conditional formatting.

- #542 Missing content types for images.

- #543 Make sure images fit containers on all OSes.

- #544 Gracefully handle missing cell styles.

- #546 ExternalLink duplicated when editing a file with macros.

- #548 Exception with non-ASCII worksheet titles

- #551 Combine multiple LineCharts

## Minor changes

- PR 88 Fix page margins in parser.

# 2.3.0 (2015-10-20)

## Major changes

- Support the creation of chartsheets

## Bug fixes

- #532 Problems when cells have no style in read-only mode.

## Minor changes

- PR 79 Make PlotArea editable in charts

- Use graphicalProperties as the alias for spPr

# 2.3.0-b2 (2015-09-04)

## Bug fixes

- #488 Support hashValue attribute for sheetProtection

- #493 Warn that unsupported extensions will be dropped

- #494 Cells with exponentials causes a ValueError

- #497 Scatter charts are broken

- #499 Inconsistent conversion of localised datetimes

- #500 Adding images leads to unreadable files

- #509 Improve handling of sheet names

- #515 Non-ascii titles have bad repr

- #516 Ignore unassigned worksheets

## Minor changes

- Worksheets are now iterable by row.

- Assign individual cell styles only if they are explicitly set.

# 2.3.0-b1 (2015-06-29)

## Major changes

- Shift to using (row, column) indexing for cells. Cells will at some point lose coordinates.

- New implementation of conditional formatting. Databars now partially preserved.

- et_xmlfile is now a standalone library.

- Complete rewrite of chart package

- Include a tokenizer for fomulae to be able to adjust cell references in them. PR 63

## Minor changes

- Read-only and write-only worksheets renamed.

- Write-only workbooks support charts and images.

- PR76 Prevent comment images from conflicting with VBA

## Bug fixes

- #81 Support stacked bar charts

- #88 Charts break hyperlinks

- #97 Pie and combination charts

- #99 Quote worksheet names in chart references

- #150 Support additional chart options

- #172 Support surface charts

- #381 Preserve named styles

- #470 Adding more than 10 worksheets with the same name leads to duplicates sheet names and an invalid file

# 2.2.6 (unreleased)

## Bug fixes

- #502 Unexpected keyword “mergeCell”

- #503 tostring missing in dump_worksheet

- #506 Non-ASCII formulae cannot be parsed

- #508 Cannot save files with coloured tabs

- Regex for ignoring named ranges is wrong (character class instead of prefix)

# 2.2.5 (2015-06-29)

## Bug fixes

- #463 Unexpected keyword “mergeCell”

- #484 Unusual dimensions breaks read-only mode

- #485 Move return out of loop

# 2.2.4 (2015-06-17)

## Bug fixes

- #464 Cannot use images when preserving macros

- #465 ws.cell() returns an empty cell on read-only workbooks

- #467 Cannot edit a file with ActiveX components

- #471 Sheet properties elements must be in order

- #475 Do not redefine class __slots__ in subclasses

- #477 Write-only support for SheetProtection

- #478 Write-only support for DataValidation

- Improved regex when checking for datetime formats

# 2.2.3 (2015-05-26)

## Bug fixes

- #451 fitToPage setting ignored

- #458 Trailing spaces lost when saving files.

- #459 setup.py install fails with Python 3

- #462 Vestigial rId conflicts when adding charts, images or comments

- #455 Enable Zip64 extensions for all versions of Python

# 2.2.2 (2015-04-28)

## Bug fixes

- #447 Uppercase datetime number formats not recognised.

- #453 Borders broken in shared_styles.

# 2.2.1 (2015-03-31)

## Minor changes

- PR54 Improved precision on times near midnight.

- PR55 Preserve macro buttons

## Bug fixes

- #429 Workbook fails to load because header and footers cannot be parsed.

- #433 File-like object with encoding=None

- #434 SyntaxError when writing page breaks.

- #436 Read-only mode duplicates empty rows.

- #437 Cell.offset raises an exception

- #438 Cells with pivotButton and quotePrefix styles cannot be read

- #440 Error when customised versions of builtin formats

- #442 Exception raised when a fill element contains no children

- #444 Styles cannot be copied

# 2.2.0 (2015-03-11)

## Bug fixes

- #415 Improved exception when passing in invalid in memory files.

# 2.2.0-b1 (2015-02-18)

## Major changes

- Cell styles deprecated, use formatting objects (fonts, fills, borders, etc.) directly instead

- Charts will no longer try and calculate axes by default

- Support for template file types - PR21

- Moved ancillary functions and classes into utils package - single place of reference

- PR 34 Fully support page setup

- Removed SAX-based XML Generator. Special thanks to Elias Rabel for implementing xmlfile for xml.etree

- Preserve sheet view definitions in existing files (frozen panes, zoom, etc.)

## Bug fixes

- #103 Set the zoom of a sheet

- #199 Hide gridlines

- #215 Preserve sheet view setings

- #262 Set the zoom of a sheet

- #392 Worksheet header not read

- #387 Cannot read files without styles.xml

- #410 Exception when preserving whitespace in strings

- #417 Cannot create print titles

- #420 Rename confusing constants

- #422 Preserve color index in a workbook if it differs from the standard

## Minor changes

- Use a 2-way cache for column index lookups

- Clean up tests in cells

- PR 40 Support frozen panes and autofilter in write-only mode

- Use ws.calculate_dimension(force=True) in read-only mode for unsized worksheets

# 2.1.5 (2015-02-18)

## Bug fixes

- #403 Cannot add comments in write-only mode

- #401 Creating cells in an empty row raises an exception

- #408 from_excel adjustment for Julian dates 1 < x < 60

- #409 refersTo is an optional attribute

## Minor changes

- Allow cells to be appended to standard worksheets for code compatibility with write-only mode.

# 2.1.4 (2014-12-16)

## Bug fixes

- #393 IterableWorksheet skips empty cells in rows

- #394 Date format is applied to all columns (while only first column contains dates)

- #395 temporary files not cleaned properly

- #396 Cannot write “=” in Excel file

- #398 Cannot write empty rows in write-only mode with LXML installed

## Minor changes

- Add relation namespace to root element for compatibility with iWork

- Serialize comments relation in LXML-backend

# 2.1.3 (2014-12-09)

## Minor changes

- PR 31 Correct tutorial

- PR 32 See #380

- PR 37 Bind worksheet to ColumnDimension objects

## Bug fixes

- #379 ws.append() doesn’t set RowDimension Correctly

- #380 empty cells formatted as datetimes raise exceptions

# 2.1.2 (2014-10-23)

## Minor changes

- PR 30 Fix regex for positive exponentials

- PR 28 Fix for #328

## Bug fixes

- #120, #168 defined names with formulae raise exceptions, #292

- #328 ValueError when reading cells with hyperlinks

- #369 IndexError when reading definedNames

- #372 number_format not consistently applied from styles

# 2.1.1 (2014-10-08)

## Minor changes

- PR 20 Support different workbook code names

- Allow auto_axis keyword for ScatterCharts

## Bug fixes

- #332 Fills lost in ConditionalFormatting

- #360 Support value=”none” in attributes

- #363 Support undocumented value for textRotation

- #364 Preserve integers in read-only mode

- #366 Complete read support for DataValidation

- #367 Iterate over unsized worksheets

# 2.1.0 (2014-09-21)

## Major changes

- “read_only” and “write_only” new flags for workbooks

- Support for reading and writing worksheet protection

- Support for reading hidden rows

- Cells now manage their styles directly

- ColumnDimension and RowDimension object manage their styles directly

- Use xmlfile for writing worksheets if available - around 3 times faster

- Datavalidation now part of the worksheet package

## Minor changes

- Number formats are now just strings

- Strings can be used for RGB and aRGB colours for Fonts, Fills and Borders

- Create all style tags in a single pass

- Performance improvement when appending rows

- Cleaner conversion of Python to Excel values

- PR6 reserve formatting for empty rows

- standard worksheets can append from ranges and generators

## Bug fixes

- #153 Cannot read visibility of sheets and rows

- #181 No content type for worksheets

- 241 Cannot read sheets with inline strings

- 322 1-indexing for merged cells

- 339 Correctly handle removal of cell protection

- 341 Cells with formulae do not round-trip

- 347 Read DataValidations

- 353 Support Defined Named Ranges to external workbooks

# 2.0.5 (2014-08-08)

## Bug fixes

- #348 incorrect casting of boolean strings

- #349 roundtripping cells with formulae

# 2.0.4 (2014-06-25)

## Minor changes

- Add a sample file illustrating colours

## Bug fixes

- #331 DARKYELLOW was incorrect

- Correctly handle extend attribute for fonts

# 2.0.3 (2014-05-22)

## Minor changes

- Updated docs

## Bug fixes

- #319 Cannot load Workbooks with vertAlign styling for fonts

# 2.0.2 (2014-05-13)

# 2.0.1 (2014-05-13) brown bag

# 2.0.0 (2014-05-13) brown bag

## Major changes

- This is last release that will support Python 3.2

- Cells are referenced with 1-indexing: A1 == cell(row=1, column=1)

- Use jdcal for more efficient and reliable conversion of datetimes

- Significant speed up when reading files

- Merged immutable styles

- Type inference is disabled by default

- RawCell renamed ReadOnlyCell

- ReadOnlyCell.internal_value and ReadOnlyCell.value now behave the same as Cell

- Provide no size information on unsized worksheets

- Lower memory footprint when reading files

## Minor changes

- All tests converted to pytest

- Pyflakes used for static code analysis

- Sample code in the documentation is automatically run

- Support GradientFills

- BaseColWidth set

## Pull requests

- #70 Add filterColumn, sortCondition support to AutoFilter

- #80 Reorder worksheets parts

- #82 Update API for conditional formatting

- #87 Add support for writing Protection styles, others

- #89 Better handling of content types when preserving macros

## Bug fixes

- #46 ColumnDimension style error

- #86 reader.worksheet.fast_parse sets booleans to integers

- #98 Auto sizing column widths does not work

- #137 Workbooks with chartsheets

- #185 Invalid PageMargins

- #230 Using v in cells creates invalid files

- #243 - IndexError when loading workbook

- #263 - Forded conversion of line breaks

- #267 - Raise exceptions when passed invalid types

- #270 - Cannot open files which use non-standard sheet names or reference Ids

- #269 - Handling unsized worksheets in IterableWorksheet

- #270 - Handling Workbooks with non-standard references

- #275 - Handling auto filters where there are only custom filters

- #277 - Harmonise chart and cell coordinates

- #280- Explicit exception raising for invalid characters

- #286 - Optimized writer can not handle a datetime.time value

- #296 - Cell coordinates not consistent with documentation

- #300 - Missing column width causes load_workbook() exception

- #304 - Handling Workbooks with absolute paths for worksheets (from Sharepoint)

# 1.8.6 (2014-05-05)

## Minor changes

Fixed typo for import Elementtree

## Bugfixes

- #279 Incorrect path for comments files on Windows

# 1.8.5 (2014-03-25)

## Minor changes

- The ‘=’ string is no longer interpreted as a formula

- When a client writes empty xml tags for cells (e.g. <c r=’A1’></c>), reader will not crash

# 1.8.4 (2014-02-25)

## Bugfixes

- #260 better handling of undimensioned worksheets

- #268 non-ascii in formualae

- #282 correct implementation of register_namepsace for Python 2.6

# 1.8.3 (2014-02-09)

## Major changes

Always parse using cElementTree

## Minor changes

Slight improvements in memory use when parsing

- #256 - error when trying to read comments with optimised reader

- #260 - unsized worksheets

- #264 - only numeric cells can be dates

# 1.8.2 (2014-01-17)

- #247 - iterable worksheets open too many files

- #252 - improved handling of lxml

- #253 - better handling of unique sheetnames

# 1.8.1 (2014-01-14)

- #246

# 1.8.0 (2014-01-08)

## Compatibility

Support for Python 2.5 dropped.

## Major changes

- Support conditional formatting

- Support lxml as backend

- Support reading and writing comments

- pytest as testrunner now required

- Improvements in charts: new types, more reliable

## Minor changes

- load_workbook now accepts data_only to allow extracting values only from formulae. Default is false.

- Images can now be anchored to cells

- Docs updated

- Provisional benchmarking

- Added convenience methods for accessing worksheets and cells by key

# 1.7.0 (2013-10-31)

## Major changes

Drops support for Python < 2.5 and last version to support Python 2.5

## Compatibility

Tests run on Python 2.5, 2.6, 2.7, 3.2, 3.3

## Merged pull requests

- 27 Include more metadata

- 41 Able to read files with chart sheets

- 45 Configurable Worksheet classes

- 3 Correct serialisation of Decimal

- 36 Preserve VBA macros when reading files

- 44 Handle empty oddheader and oddFooter tags

- 43 Fixed issue that the reader never set the active sheet

- 33 Reader set value and type explicitly and TYPE_ERROR checking

- 22 added page breaks, fixed formula serialization

- 39 Fix Python 2.6 compatibility

- 47 Improvements in styling

## Known bugfixes

- #109

- #165

- #209

- #112

- #166

- #109

- #223

- #124

- #157

## Miscellaneous

Performance improvements in optimised writer

Docs updated