
Release 3.3.0 - Month XX 2025
-----------------------------

* Added the :func:`set_zoom_to_fit()` method for chartsheets. It ensures that a
  chartsheet is zoomed automatically by Excel to fit the screen even when the
  window is resized.

* Added alt text ``description`` and ``title`` options to worksheet Tables.


Release 3.2.9 - September 16 2025
---------------------------------

* Removed the `py.typed` file since it was causing a lot of downstream CI
  failures where consumers weren't handling the xlsxwriter types correctly or
  taking them into account.

  The file will be re-added once the xlsxwriter typing is more comprehensive.


Release 3.2.8 - September 14 2025
---------------------------------

* Fixed ``mypy`` implicit export error caused by the ``Workbook()`` type
  annotations changes in v3.2.7 and v3.2.6.

  :issue:`1154`.


Release 3.2.7 - September 13 2025
---------------------------------

* Fixed typing issue in ``Workbook()`` constructor.

  :issue:`1152`.


Release 3.2.6 - September 12 2025
---------------------------------

* Added an option to position custom data labels in the same way that the data
  labels can be positioned for the entire series.

  :feature:`1147`.

* Add border, fill, gradient and pattern formatting options for
  chart titles and also chart axis titles.

  :feature:`957`.

* Add additional type annotations. This is an ongoing refactoring.

  :feature:`1123`.


Release 3.2.5 - June 17 2025
----------------------------

* Fixed issue where a test function was made public incorrectly which caused
  warnings about a missing ``xlsxwriter.test`` module.

  :issue:`1138`.


Release 3.2.4 - June 17 2025
----------------------------

* Added support for a :ref:`Color() <Color>` type. This is backwards compatible
  with existing Html and named color string types but also adds support for
  theme colors. See also :ref:`colors`.

* Fixed issue where ``write_url()`` dropped implicit support for generic URL
  types due to the refactoring into a ``Url`` type in the previous release.

  :issue:`1129`.

* Fixed issue where ``max_url_length`` parameter wasn't honored.

  :issue:`1130`.


Release 3.2.3 - April 17 2025
-----------------------------

* Fix for a breaking change in v3.2.1.

  The Format class contained methods called ``set_font()``, ``set_size()`` and
  ``set_color()`` which were old internal testing alternatives for
  ``set_font_name()``, ``set_font_size()`` and ``set_font_color()``. Since they
  were intentionally internal methods they were removed as part of a general
  refactoring in v3.2.1. However, the alternative method names had leaked out
  into production code and the removal caused breaks in dependent code. These
  methods have been reinstated to prevent inadvertent breakages but may be
  removed in the future after an orderly deprecation. Users should update to the
  documented method names.

* This release drops support for Python 3.6 and 3.7, which are both EOL, in
  order to simplify the additions of type annotations. The minimum supported
  version of Python is now Python 3.8.

* This release contains code with initial type annotations as part of an overall
  effort to add type annotations to the entire code base. It also contains
  internal refactoring of some pseudo-types, based on dicts, into actual enum or
  class types to allow stronger type checking. These will be rolled out in
  upcoming releases.

  This is part of a modernization of the XlsxWriter code base, see "XlsxWriter
  Roadmap v2" :feature:`1128`.

* As part of the type annotation refactoring support was added for an explicit
  ``Url`` type in addition to the implicit string URLs used in previous
  versions. This isn't documented in this release.


Release 3.2.2 - January 28 2025
-------------------------------

* Added support for checkboxes via the :func:`insert_checkbox()` method.

  Checkboxes are a new feature added to `Excel in 2024`_. They are a way of
  displaying a boolean value as a checkbox in a cell. The underlying value is
  still an Excel ``TRUE/FALSE`` boolean value and can be used in formulas and in
  references.

  .. image:: _images/checkbox.png

  See :ref:`ex_checkbox`.

  .. _Excel in 2024: https://techcommunity.microsoft.com/blog/excelblog/introducing-checkboxes-in-excel/4173561


Release 3.2.1 - January 22 2025
--------------------------------

Added improvements to ``autofit()``.

* Added the optional ``max_width`` parameter to the :func:`autofit()` method to
  work around the issue where the autofit width is too big.

  Excel autofits very long strings up to limit of 1790 pixels/255 characters.
  This is often too wide to display on a single screen at normal zoom. As such
  the ``max_width`` parameter is provided to enable a smaller upper pixel limit
  for autofitting long strings. See :func:`autofit()`.

  :feature:`1106`.

* Added the :func:`cell_autofit_width` utility function to allow users to
  calculate the auto-fit width for a cell value. This allows the user to
  implement their own auto-fit logic. See :ref:`ex_autofit_manually`.


Release 3.2.0 - February 17 2024
--------------------------------

This is the 10th anniversary release of XlsxWriter. Version 0.0.1 was released
on February 17 2013. Since then there have been 167 releases, 25,000 lines of
code, 1600 test cases, 700 pages of documentation, 71,000 users on GitHub, 50
contributors, 1000 closed issues and 150 million yearly downloads. Thanks to
everyone who has contributed code, given feedback or just used the library.

* Add :func:`embed_image()` worksheet method to embed images in cells. This is
  equivalent to Excel's menu item to insert an image using the option to "Place
  in Cell". It scales images automatically to the dimensions of the cell.

  This has been a frequently requested feature for people creating spreadsheets
  with images for product items. See also :ref:`ex_embedded_images`.

  .. image:: _images/embedded_images.png


* Fix issue where a horizontal alignment format was ignored if indentation was
  also set.

  :issue:`1041`.


Release 3.1.9 - October 19 2023
-------------------------------

* Add fix for errant XML tag in chart leader lines for non-Pie charts.

  :issue:`1019` and :feature:`1012`.


Release 3.1.8 - October 15 2023
-------------------------------

* Add support for formatting the data label in chart trendlines.

  :feature:`750`.


Release 3.1.7 - October 9 2023
------------------------------

* Add the :func:`very_hidden()` method to hide a worksheet. This is similar to
  the :func:`hide()` method except that the worksheet cannot be unhidden in the
  the Excel user interface. The Excel worksheet "xlSheetVeryHidden" option can
  only be unset programmatically via VBA.

  :feature:`947`.

* Added fixes for column formulas in tables that were overridden by table data
  and which also didn't take future functions into account.

  :issue:`1015`.


Release 3.1.6 - October 1 2023
------------------------------

* Added support for chart leader lines for chart types other than Pie and Doughnut.

  :feature:`1012`.


Release 3.1.5 - September 24 2023
---------------------------------

* Added support for adding signed VBA macros to workbooks via the
  :func:`add_signed_vba_project` method. See `Working with VBA Macros`_.

  :feature:`1009`.

  .. _Working with VBA Macros: https://xlsxwriter.readthedocs.io/working_with_macros.html


Release 3.1.4 - September 18 2023
---------------------------------

* Added support for enabling the Excel "Show #N/A as an empty cell" chart option
  via the :func:`show_na_as_empty_cell` method.

  :feature:`1008`.


Release 3.1.3 - September 8 2023
--------------------------------

* Added support for custom total formulas to worksheet tables.

  :feature:`982`.


Release 3.1.2 - May 28 2023
---------------------------

* Added worksheet page break preview mode via :func:`set_pagebreak_view()`.


Release 3.1.1 - May 21 2023
---------------------------

* Add support for new Excel dynamic functions added in 2023.

  :issue:`984`.

* Added support for adding a color to the `invert_if_negative` chart option.

  :feature:`854`.


Release 3.1.0 - April 13 2023
-----------------------------

* Minor fix for cell color issue.


Release 3.0.9 - March 10 2023
-----------------------------

* Add documentation and examples on :ref:`ewx_polars` to demonstrate new `Polars
  <https://pola.rs/>`_ integration of XlsxWriter in `write_excel()`_.

.. _write_excel(): https://docs.pola.rs/py-polars/html/reference/api/polars.DataFrame.write_excel.html

* Add fix for rare issue with duplicate number formats.


Release 3.0.8 - February 3 2023
-------------------------------

* Fix for ``autofit()`` exception when user defined column width was ``None``.


Release 3.0.7 - January 14 2023
-------------------------------

* Improved :func:`autofit` algorithm to account for the additional width of
  autofilter and table dropdowns.

* Improved :func:`autofit` take user defined column widths into account.

  Autofit will now only update the width for an existing column if it is greater
  than the user defined value. This allows the user to pre-load a minimum column
  width.

  :feature:`936`.


Release 3.0.6 - January 5 2023
------------------------------

* Added simulated worksheet :func:`autofit` method.

  :feature:`936`.


Release 3.0.5 - January 1 2023
------------------------------

* Added ``OverlappingRange`` exception which is raised during Worksheet
  :func:`add_table()` or :func:`merge_range()` if the range overlaps an existing
  worksheet table or merge range. This is a file corruption error in Excel. See
  :ref:`exceptions`.

  :issue:`848`


Release 3.0.4 - December 28 2022
--------------------------------

* Roll up release of several minor fixes.

* Drop support for EOL Python 3.4 and 3.5.


Release 3.0.3 - February 27 2022
--------------------------------

* Added :func:`print_black_and_white` worksheet method to set "Black and
  White" print options.

  :feature:`862`.


Release 3.0.2 - October 31 2021
-------------------------------

* Added :func:`set_top_left_cell` worksheet method to position the first
  visible cell in a worksheet.

  :feature:`837`.

Release 3.0.1 - August 10 2021
------------------------------

* Add python_requires version to setup.py to help pip find the correct
  matching version for Python 2 and 3.


Release 3.0.0 - August 10 2021
------------------------------

* This is the first Python 3 only version of XlsxWriter. It is approximately
  10-15% faster than the Python2/3 version.

  Python 2 users should use XlsxWriter version 2.0.0, see below.

Release 2.0.0 - August 9 2021
-----------------------------

* This is the last XlsxWriter release to support Python 2. From now bug fixes
  and new features will only be available for Python 3. The deprecation notice
  for Python 2 support in XlsxWriter has been in place since May 2020 and the
  Python community support for Python 2 ended in January 2020. Downloads of
  XlsxWriter for Python 2 is currently less than 6% of all downloads of the
  library, and decreasing month by month.

  Python 2 users should still be able to install versions of XlsxWriter up to
  this release but not any releases afterwards.

  :feature:`720`.


Release 1.4.5 - July 29 2021
----------------------------

 * Added Description/Alt Text and Decorative accessibility options for charts,
   textboxes and buttons. These options were already available for images.


Release 1.4.4 - July 4 2021
---------------------------

* Added some performance improvements. Performance for larger files should be
  5-10% better.


Release 1.4.3 - May 12 2021
---------------------------

* Added support for background images in worksheets. See
  :func:`set_background` and :ref:`ex_background`.


Release 1.4.2 - May 7 2021
--------------------------

* Added support for GIF image files (and in Excel 365, animated GIF files).


Release 1.4.1 - May 6 2021
--------------------------

* Added support for dynamic arrays and new Excel 365 functions like UNIQUE and
  FILTER. See :func:`write_dynamic_array_formula`,
  :ref:`formula_dynamic_arrays` and :ref:`ex_dynamic_arrays`.

* Added constructor option "use_future_functions" to enable newer Excel
  "future" functions in Formulas. See :ref:`formula_future`, and the
  :func:`Workbook` constructor.


Release 1.4.0 - April 23 2021
-----------------------------

* Added fix for issue for where a y_axis font rotation of 0 was ignored.


Release 1.3.9 - April 15 2021
-----------------------------

* Added option to set row heights and column widths in pixels via the
  :func:`set_row_pixels` and :func:`set_column_pixels` methods.


Release 1.3.8 - March 29 2021
-----------------------------

* Added ability to add accessibility options "description" and "decorative" to
  images via :func:`insert_image`. :feature:`768`.

* Added fix for datetime.timedelta values that exceed the Excel 1900 leap day
  (timedeltas greater than 59 days, in hours). This is a backward incompatible
  change. :issue:`731`.

* Added the worksheet :func:`read_only_recommended` method to set the Excel
  "Read-only Recommended" option that is available when saving a file.
  :feature:`784`.

* Fixed issue where temp files used in `constant_memory` mode weren't
  closed/deleted if the workbook object was garbage collected. :issue:`764`.

* Fixed issue where pattern formats without colors were given a default black
  fill color. :issue:`790`.

* Added option to set a chart crossing to 'min' as well as the existing 'max'
  option. The 'min' option isn't available in the Excel interface but can be
  enabled via VBA. :feature:`773`.


Release 1.3.7 - October 13 2020
-------------------------------

* Fixed issue where custom chart data labels didn't inherit the position of
  the data labels in the series. :issue:`754`.

* Added text alignment for textboxes. The existing options allowed the text
  area to be aligned but didn't offer control over the text within that area.

* Added Python 3.9 to the test matrix.


Release 1.3.6 - September 23 2020
---------------------------------

* Added the worksheet :func:`unprotect_range()` method to allow ranges within
  a protected worksheet to be unprotected. :feature:`507`.

* There are now over 1500 test cases in the test suite, including 900 tests
  that compare the output from XlsxWriter, byte for byte, against test files
  created in Excel. This is to ensure the maximum possible compatibility with
  Excel.


Release 1.3.5 - September 21 2020
---------------------------------

* Fixed issue where relative url links in images didn't work. :issue:`751`.

* Added ``use_zip64`` as a constructor option. :issue:`745`.


* Added check, and warning, for worksheet tables with no data row. Either
  with or without a header row. :issue:`715` and :issue:`679`.

* Add a warning when the string length in :func:`write_rich_string()` exceeds
  Excel's limit. :issue:`372`.


Release 1.3.4 - September 16 2020
---------------------------------

* Replaced internal MD5 digest used to check for duplicate images with a
  SHA256 digest to avoid issues on operating systems such as Red Hat in FIPS
  mode which don't support MD5 for security reasons. :issue:`749`.


Release 1.3.3 - August 13 2020
------------------------------

* Added :func:`ignore_errors()` worksheet method to to allow Excel worksheet
  errors/warnings to be ignored in user defined ranges. See also
  :ref:`ex_ignore_errors`. :feature:`678`.

* Added warning when closing a file more than once via :func:`close()` to help
  avoid errors where a file is closed within a loop or at the wrong scope
  level.


Release 1.3.2 - August 6 2020
-----------------------------

* Added Border, Fill, Pattern and Gradient formatting to chart data labels and
  chart custom data labels. See :ref:`chart_series_option_data_labels` and
  :ref:`chart_series_option_custom_data_labels`.


Release 1.3.1 - August 3 2020
-----------------------------

* Fix for issue where array formulas weren't included in the output file for
  certain ranges/conditions. :issue:`735`.


Release 1.3.0 - July 30 2020
----------------------------

* Added support for chart :ref:`custom data labels
  <chart_series_option_custom_data_labels>`. :feature:`343`.


Release 1.2.9 - May 29 2020
---------------------------

* Added support for ``stacked`` and ``percent_stacked`` Line charts.


Release 1.2.8 - February 22 2020
--------------------------------

* Fix for issue where duplicate images with hyperlinks weren't handled
  correctly. :issue:`686`.

* Removed ``ReservedWorksheetName`` exception which was used with the reserved
  worksheet name "History" since this name is allowed in some Excel variants.
  :issue:`688`.

* Fix for worksheet objects (charts, images and textboxes) that are inserted
  with an offset that starts in a hidden cell. :issue:`676`.

* Fix to allow handling of NoneType in :func:`add_write_handler`.
  :issue:`677`.


Release 1.2.7 - December 23 2019
--------------------------------

* Fix for duplicate images being copied to an XlsxWriter file. Excel uses an
  optimization where it only stores one copy of a repeated/duplicate image in
  a workbook. XlsxWriter didn't do this which meant that the file size would
  increase when then was a large number of repeated images. This release fixes
  that issue and replicates Excel's behavior. :issue:`615`.

* Added documentation on :ref:`num_format_categories` and
  :ref:`num_format_locale`.

* Added note to :func:`protect()` about how it is possible to encrypt an
  XlsxWriter file using a third party, cross platform, open source tool called
  `msoffice-crypt <https://github.com/herumi/msoffice>`_.


Release 1.2.6 - November 15 2019
--------------------------------

* Added option to remove style from worksheet tables. :feature:`670`.


Release 1.2.5 - November 10 2019
--------------------------------

* Added option to add hyperlinks to textboxes. See :ref:`textbox_hyperlink`.
  :feature:`419`.


Release 1.2.4 - November 9 2019
-------------------------------

* Added option to link textbox text from a cell. See :ref:`textbox_textlink`.
  :feature:`516`.

* Added option to rotate text in a textbox. See
  :ref:`textbox_formatting_rotation`. :feature:`638`.


Release 1.2.3 - November 7 2019
-------------------------------

* Increased allowable worksheet url length from 255 to 2079 characters, as
  supported in more recent versions of Excel. A lower or user defined limit
  can be set via the ``max_url_length`` property in the :func:`Workbook`
  constructor.

* Fixed several issues with hyperlinks in worksheet images.


Release 1.2.2 - October 16 2019
-------------------------------

* Fixed Python 3.8.0 warnings. :issue:`660`.


Release 1.2.1 - September 14 2019
---------------------------------

* Added the :func:`add_write_handler` method to allow user defined types to be
  handled by the :func:`write` method. See :ref:`writing_user_types` for more
  information. :feature:`631`.

* Add support for East Asian vertical fonts in charts. :feature:`648`.


Release 1.2.0 - August 26 2019
------------------------------

* Refactored exception handling around the workbook file :func:`close()`
  method to allow exceptions to be caught and handled. See
  :ref:`ex_check_close`. Also refactored the code to clean up temp files in
  the event of an exception. :issue`471` and :issue:`647`.

* Added the option to allow chart fonts to be rotated to 270 degrees to give a
  stacked orientation. See :ref:`chart_fonts`. :issue:`648`.


Release 1.1.9 - August 19 2019
------------------------------

* Another fix for issues where zipfile.py raises "ZIP does not support
  timestamps before 1980" exception. :issue:`651`.


Release 1.1.8 - May 5 2019
--------------------------

* Added ability to combine Doughnut and Pie charts.

* Added gauge chart example which is a combination of a Doughnut and a Pie
  chart. See :ref:`ex_chart_gauge`.


Release 1.1.7 - April 20 2019
-----------------------------

* Added docs on :ref:`object_position`.

* Added fix for sizing of cell comment boxes when they cross columns/rows that
  have size changes that occur after the comment is written. :issue:`403` and
  :issue:`312`.

* Added fix for the sizing of worksheet objects (images, charts, textboxes)
  when the underlying cell sizes have changed and the "object_position"
  parameter has been set to 1 "Move and size with cells". An additional mode 4
  has been added to simulate inserting the object in hidden rows.
  :issue:`618`.

* Added object positioning for charts and textboxes, it was already supported
  for images. Note, the parameter is now called ``object_position``. The
  previous parameter name ``positioning`` is deprecated but still supported
  for images. :issue:`568`.


Release 1.1.6 - April 7 2019
----------------------------

* Fixed issue where images that started in hidden rows/columns weren't placed
  correctly in the worksheet. :issue:`613`.

* Fixed the mime-type reported by system ``file(1)``. The mime-type reported
  by "file --mime-type"/magic was incorrect for XlsxWriter files since it
  expected the ``[Content_types]`` to be the first file in the zip container.
  :issue:`614`.


Release 1.1.5 - February 22 2019
--------------------------------

* This version removes support for end of life Pythons 2.5, 2.6, 3.1, 3.2 and
  3.3. For older, unsupported versions of Python use version 1.1.4 of
  XlsxWriter.


Release 1.1.4 - February 10 2019
--------------------------------

* Fix for issues where zipfile.py raises "ZIP does not support timestamps
  before 1980" exception. :issue:`535`.


Release 1.1.3 - February 9 2019
-------------------------------

* Fix handling of ``'num_format': '0'`` in duplicate formats. :issue:`584`.


Release 1.1.2 - October 20 2018
-------------------------------

* Fix for issue where ``in_memory`` files weren't compressed. :issue:`573`.

* Fix ``write()`` so that it handles array formulas as documented.
  :issue:`418`.

* Fix for issue with special characters in worksheet table functions.
  :issue:`442`.

* Added warnings for input issues in :func:`write_rich_string()` such as blank
  strings, double formats or insufficient parameters. :issue:`425`.


Release 1.1.1 - September 22 2018
---------------------------------

* Added comment font name and size options. :issue:`201`.

* Fix for issue when using text boxes in the same workbook as a chartsheet.
  :issue:`420`.


Release 1.1.0 - September 2 2018
--------------------------------

* Added functionality to align chart category axis labels. See the
  ``label_align`` property of the :func:`set_x_axis()` method.

* Added worksheet :func:`hide_row_col_headers()` method to turn off worksheet
  row and column headings. :issue:`480`.

* Added the :func:`set_tab_ratio()` method to set the ratio between the
  worksheet tabs and the horizontal slider. :issue:`481`.

* Fixed issue with icon conditional formats when the values were zero.
  :issue:`565`.

Release 1.0.9 - August 27 2018
------------------------------

* Fix for issue with formulas quoted as strings in conditional formats,
  introduced in version 1.0.7. :issue:`564`.


Release 1.0.8 - August 27 2018
------------------------------

* Added named exceptions to XlsxWriter. See :ref:`exceptions`.

* Removed the implicit :func:`close()` in the destructor since it wasn't
  guaranteed to work correctly and raised a confusing exception when any other
  exception was triggered. **Note that this is a backward incompatible
  change.** The ``with`` context manager is a better way to close
  automatically, see :func:`close()`.

* Added border, fill, pattern and gradient formatting options to
  :func:`set_legend()`. :issue:`545`.

* Added ``top_right`` position to :func:`set_legend()`. :issue:`537`.


Release 1.0.7 - August 16 2018
------------------------------

* Fix for unicode type error in Python 3. :issue:`554`.


Release 1.0.6 - August 15 2018
------------------------------

* Added some performance improvements. :pull:`551`.


Release 1.0.5 - May 19 2018
---------------------------

* Added example of how to subclass the Workbook and Worksheet objects. See
  :ref:`ex_inheritance1` and :ref:`ex_inheritance2`.

* Added support for WMF and EMF image formats to the Worksheet
  :func:`add_image` method.


Release 1.0.4 - April 14 2018
-----------------------------

* Set the xlsx internal file member datetimes to 1980-01-01 00:00:00 like
  Excel so that apps can produce a consistent binary file once the workbook
  :func:`set_properties` ``created`` date is set. :pull:`495`.

* Fix for jpeg images that reported unknown height/width due to unusual SOF
  markers. :issue:`506`.

* Added support for blanks in list autofilter. :issue:`505`.


Release 1.0.3 - April 10 2018
-----------------------------

* Added Excel 2010 data bar features such as solid fills and control over the
  display of negative values. See :ref:`working_with_conditional_formats` and
  :ref:`ex_cond_format`. :feature:`502`.

* Fixed :func:`set_column` parameter names to match docs and other methods.
  Note, this is a backward incompatible change. :issue:`504`.

* Fixed missing plotarea formatting in pie/doughnut charts.


Release 1.0.2 - October 14 2017
-------------------------------

* Fix for cases where the hyperlink style added in the previous release didn't
  work. :feature:`455`.


Release 1.0.1 - October 14 2017
-------------------------------

* Changed default :func:`write_url` format to the Excel hyperlink style so
  that it changes when the theme is changed and also so that it indicates that
  the link has been clicked. :feature:`455`.


Release 1.0.0 - September 16 2017
---------------------------------

* Added icon sets to conditional formatting. See
  :ref:`working_with_conditional_formats` and :ref:`ex_cond_format`.
  :feature:`387`.


Release 0.9.9 - September 5 2017
--------------------------------

* Added ``stop_if_true`` parameter to conditional formatting. :feature:`386`.


Release 0.9.8 - July 1 2017
---------------------------

* Fixed issue where spurious deprecation warning was raised in ``-Werror``
  mode. :issue:`451`.


Release 0.9.7 - June 25 2017
----------------------------

* Minor bug and doc fixes.


Release 0.9.6 - Dec 26 2016
---------------------------

* Fix for table with data but without a header. :issue:`405`.

* Add a warning when the number of series in a chart exceeds Excel's limit of
  1.   :issue:`399`.


Release 0.9.5 - Dec 24 2016
---------------------------

* Fix for missing `remove_timezone` option in Chart class. :pull:`404` from
  Thomas Arnhold.


Release 0.9.4 - Dec 2 2016
--------------------------

* Added user definable removal of timezones in datetimes. See the
  :func:`Workbook` constructor option ``remove_timezone`` and :ref:`Timezone
  Handling in XlsxWriter <timezone_handling>`. :issue:`257`.

* Fix duplicate header warning in :func:`add_table` when there is only one
  user defined header. :issue:`380`.

* Fix for `center_across` property in :func:`add_format`. :issue:`381`.


Release 0.9.3 - July 8 2016
---------------------------

* Added check to :func:`add_table` to prevent duplicate header names which
  leads to a corrupt Excel file. :issue:`362`.


Release 0.9.2 - June 13 2016
----------------------------

* Added workbook :func:`set_size` method to set the workbook window size.


Release 0.9.1 - June 8 2016
---------------------------

* Added font support to chart :func:`set_table`.

* Documented used of font rotation in chart :ref:`data labels
  <chart_series_option_data_labels>`. :issue:`337`.


Release 0.9.0 - June 7 2016
---------------------------

* Added :ref:`trendline properties <chart_series_option_trendline>`:
  ``intercept``, ``display_equation`` and ``display_r_squared``.
  :feature:`357`.


Release 0.8.9 - June 1 2016
---------------------------

* Fix for :func:`insert_image` issue when handling images with zero dpi.
  :issue:`356`.


Release 0.8.8 - May 31 2016
---------------------------

* Added workbook :func:`set_custom_property` method to set custom document
  properties. :feature:`355`.


Release 0.8.7 - May 13 2016
---------------------------

* Fix for issue when inserting read-only images on Windows.
  :issue:`352`.

* Added :func:`get_worksheet_by_name()` method to allow the retrieval of a
  worksheet from a workbook via its name.

* Fixed issue where internal file creation and modification dates were in the
  local timezone instead of UTC.

Release 0.8.6 - April 27 2016
-----------------------------

* Fix for ``external:`` urls where the target/anchor contains spaces.
  :issue:`350`.


Release 0.8.5 - April 17 2016
-----------------------------

* Added additional documentation on :ref:`ewx_pandas` and
  :ref:`pandas_examples`.

* Added fix for :func:`set_center_across` format method.


Release 0.8.4 - January 16 2016
-------------------------------

* Fix for :func:`write_url` exception when the URL contains two ``#``
  location/anchors. Note, URLs like this aren't strictly valid and cannot be
  entered manually in Excel.
  :issue:`330`.


Release 0.8.3 - January 14 2016
-------------------------------

* Added options to configure chart axis tick placement. See :func:`set_x_axis()`.


Release 0.8.2 - January 13 2016
-------------------------------

* Added transparency option to solid fill colors in chart areas
  (:ref:`chart_formatting_fill`).
  :feature:`298`.


Release 0.8.1 - January 12 2016
-------------------------------

* Added option to set chart tick interval.
  :feature:`251`.


Release 0.8.0 - January 10 2016
-------------------------------

* Added additional documentation on :ref:`working_with_formulas`.


Release 0.7.9 - January 9 2016
------------------------------

* Added chart pattern fills, see :ref:`chart_formatting_pattern` and
  :ref:`ex_chart_pattern`.
  :feature:`268`.


Release 0.7.8 - January 6 2016
------------------------------

* Add checks for valid and non-duplicate worksheet table names.
  :issue:`319`.


Release 0.7.7 - October 19 2015
-------------------------------

* Added support for table header formatting and a fix for wrapped lines in the
  header.
  :feature:`287`.


Release 0.7.6 - October 7 2015
------------------------------

* Fix for images with negative offsets.
  :issue:`273`.


Release 0.7.5 - October 4 2015
------------------------------

* Allow hyperlinks longer than 255 characters when the link and anchor are
  each less than or equal to 255 characters.

* Added ``hyperlink_base`` document property.
  :feature:`306`.


Release 0.7.4 - September 29 2015
---------------------------------

* Added option to allow data validation input messages with the 'any' validate
  parameter.

* Fixed url encoding of links to external files and directories.
  :issue:`278`.


Release 0.7.3 - May 7 2015
--------------------------

* Added documentation on :ref:`ewx_pandas` and :ref:`pandas_examples`.

* Added support for ``with`` context manager.
  :PR`239`.


Release 0.7.2 - March 29 2015
-----------------------------

* Added support for textboxes in worksheets. See :func:`insert_textbox()` and
  :ref:`working_with_textboxes` for more details.
  :feature:`107`.


Release 0.7.1 - March 23 2015
-----------------------------

* Added gradient fills to chart objects such as the plot area of columns. See
  :ref:`chart_formatting_gradient` and :ref:`ex_chart_gradient`.
  :feature:`228`.


Release 0.7.0 - March 21 2015
-----------------------------

* Added support for display units in chart axes. See :func:`set_x_axis()`.
  :feature:`185`.

* Added ``nan_inf_to_errors`` :func:`Workbook` constructor option to allow
  mapping of Python `nan/inf` value to Excel error formulas in ``write()`` and
  ``write_number()``.
  :feature:`150`.


Release 0.6.9 - March 19 2015
-----------------------------

* Added support for clustered category charts. See :ref:`ex_chart_clustered`
  for details.
  :feature:`180`.

* Refactored the :ref:`format` and formatting documentation.

Release 0.6.8 - March 17 2015
-----------------------------

* Added option to combine two different chart types. See the
  :ref:`chart_combined_charts` section and :ref:`ex_chart_combined` and
  :ref:`ex_chart_pareto` for more details.
  :feature:`72`.


Release 0.6.7 - March 1 2015
----------------------------

* Added option to add function value in worksheet :func:`add_table`.
  :feature:`216`.

* Fix for A1 row/col numbers below lower bound.
  :issue:`212`.


Release 0.6.6 - January 16 2015
-------------------------------

* Fix for incorrect shebang line in `vba_extract.py` packaged in wheel.
  :issue:`211`.

* Added docs and example for diagonal cell border.
  See :ref:`ex_diagonal_border`.


Release 0.6.5 - December 31 2014
--------------------------------

* Added worksheet quoting for chart names in lists.
  :issue:`205`.

* Added docs on how to find and set VBA codenames.
  :issue:`202`.

* Fix Python3 issue with unused charts.
  :issue:`200`.

* Enabled warning for missing category is scatter chart.
  :issue:`197`.

* Fix for upper chart style limit. Increased the chart style limit from
  42 to the correct 48.
  :issue:`192`.

* Raise warning if a chart is inserted more than once.
  :issue:`184`.


Release 0.6.4 - November 15 2014
--------------------------------

* Fix for issue where fonts applied to data labels raised exception.
  :issue:`179`.

* Added option to allow explicit text axis types for charts, similar to date
  axes.
  :feature:`178`.

* Fix for issue where the bar/column chart gap and overlap weren't
  applied to the secondary axis.
  :issue:`177`.


Release 0.6.3 - November 6 2014
-------------------------------

* Added support for adding VBA macros to workbooks. See :ref:`macros`.
  :feature:`126`.


Release 0.6.2 - November 1 2014
-------------------------------

* Added chart axis line and fill properties.
  :feature:`88`.


Release 0.6.1 - October 29 2014
-------------------------------

* Added chart specific handling of data label positions since not all positions
  are available for all chart types.
  :issue:`170`.

* Added number formatting
  (:issue:`130`),
  font handling, separator and legend key for data labels.
  See :ref:`chart_series_option_data_labels`

* Fix for non-quoted worksheet names containing spaces and non-alphanumeric
  characters.
  :issue:`167`.


Release 0.6.0 - October 15 2014
-------------------------------

* Added option to add images to headers and footers. See
  :ref:`ex_headers_footers`.
  :feature:`133`.

* Fixed issue where non 96dpi images weren't scaled properly in Excel.
  :issue:`164`.

* Added option to not scale header/footer with page. See :func:`set_header`.
  :feature:`134`.


Release 0.5.9 - October 11 2014
-------------------------------

* Removed ``egg_base`` requirement from ``setup.cfg`` which was preventing
  installation on Windows.
  :issue:`162`.

* Fix for issue where X axis title formula was overwritten by the Y axis
  title.
  :issue:`161`.


Release 0.5.8 - September 28 2014
---------------------------------

* Added support for Doughnut charts.
  :feature:`157`.

* Added support for wheel packages.
  :feature:`156`.

* Made the exception handling in ``write()`` clearer for unsupported types so
  that it raises a more accurate TypeError instead of a ValueError.
  :issue:`153`.


Release 0.5.7 - August 13 2014
------------------------------

* Added support for :func:`insert_image` images from byte streams to allow
  images from URLs and other sources.
  :feature:`118`.

* Added :func:`write_datetime` support for datetime.timedelta.
  :feature:`128`.


Release 0.5.6 - July 22 2014
----------------------------

* Fix for spurious exception message when :func:`close()` isn't used.
  :issue:`131`.

* Fix for formula string values that look like numbers.
  :issue:`122`.

* Clarify :func:`print_area()` documentation for complete row/column ranges.
  :issue:`139`.

* Fix for unicode strings in data validation lists.
  :issue:`135`.


Release 0.5.5 - May 6 2014
--------------------------

* Fix for incorrect chart offsets in :func:`insert_chart()` and
  :func:`set_size()`.

Release 0.5.4 - May 4 2014
--------------------------

* Added image positioning option to :func:`insert_image` to control how
  images are moved in relation to surrounding cells.
  :feature:`117`.

* Fix for chart ``error_bar`` exceptions.
  :issue:`115`.

* Added clearer reporting of nested exceptions in ``write()`` methods.
  :pull:`108`.

* Added support for ``inside_base`` data label position in charts.

Release 0.5.3 - February 20 2014
--------------------------------

* Added checks and warnings for data validation limits.
  :issue:`89`.

* Added option to add hyperlinks to images. Thanks to Paul Tax.

* Added Python 3 Http server example. Thanks to Krystian Rosinski.

* Added :func:`set_calc_mode` method to control automatic calculation of
  formulas when worksheet is opened. Thanks to Chris Tompkinson.

* Added :func:`use_zip64` method to allow ZIP64 extensions when writing
  very large files.

* Fix to handle '0' and other number like strings as number formats.
  :issue:`103`.

* Fix for missing images in ``in_memory`` mode.
  :issue:`102`.


Release 0.5.2 - December 31 2013
--------------------------------

* Added date axis handling to charts. See :ref:`ex_chart_date_axis`.
  :feature:`73`.

* Added support for non-contiguous chart ranges.
  :feature:`44`.

* Fix for low byte and control characters in strings.
  :issue:`86`.

* Fix for chart titles with exclamation mark.
  :issue:`83`.

* Fix to remove duplicate :func:`set_column` entries.
  :issue:`82`.


Release 0.5.1 - December 2 2013
-------------------------------

* Added interval unit option for category axes.
  :feature:`69`.

* Fix for axis name font rotation.

* Fix for several minor issues with Pie chart legends.


Release 0.5.0 - November 17 2013
--------------------------------

* Added :ref:`Chartsheets <Chartsheet>` to allow single worksheet charts.
  :feature:`10`.


Release 0.4.9 - November 17 2013
--------------------------------

* Added :ref:`chart object positioning and sizing <chart_layout>` to allow
  positioning of plotarea, legend, title and axis names.
  :feature:`66`.

* Added :func:`set_title()` ``none`` option to turn off automatic titles.

* Improved :func:`define_name()` name validation.

* Fix to prevent modification of user parameters in
  :func:`conditional_format()`.


Release 0.4.8 - November 13 2013
--------------------------------

* Added ``in_memory`` :func:`Workbook` constructor option to allow XlsxWriter
  to work on Google App Engine.
  :feature:`28`.


Release 0.4.7 - November 9 2013
-------------------------------

* Added fix for markers on non-marker scatter charts.
  :issue:`62`.

* Added custom error bar option. Thanks to input from Alex Birmingham.

* Changed Html docs to Bootstrap theme.

* Added :ref:`ex_merge_rich`.


Release 0.4.6 - October 23 2013
-------------------------------

* Added font formatting to chart legends.


Release 0.4.5 - October 21 2013
-------------------------------

* Added ``position_axis`` chart axis option.

* Added optional list handling for chart names.


Release 0.4.4 - October 16 2013
-------------------------------

* Documented use of :ref:`cell utility <cell_utility>` functions.

* Fix for tables added in non-sequential order. Closes
  :issue:`51` reported by calfzhou.


Release 0.4.3 - September 12 2013
---------------------------------

* Fix for comments overlying columns with non-default width.
  :issue:`45`.


Release 0.4.2 - August 30 2013
------------------------------

* Added a default blue underline hyperlink format for :func:`write_url()`.

* Added :func:`Workbook` constructor options ``strings_to_formulas`` and
  ``strings_to_urls`` to override default conversion of strings in write().


Release 0.4.1 - August 28 2013
------------------------------

* Fix for charts and images that cross rows and columns that are hidden or
  formatted but which don't have size changes. :issue:`42` reported by
  Kristian Stobbe.


Release 0.4.0 - August 26 2013
------------------------------

* Added more generic support for JPEG files. :issue:`40` reported by Simon
  Breuss.

* Fix for harmless Python 3 installation warning. :issue:`41` reported by James
  Reeves.


Release 0.3.9 - August 24 2013
------------------------------

* Added fix for minor issue with :func:`insert_image` for images that extend
  over several cells.

* Added fix to ensure formula calculation on load regardless of Excel version.


Release 0.3.8 - August 23 2013
------------------------------

* Added handling for Decimal(), Fraction() and other float types to the
  :func:`write()` function.

* Added Python 2.5 and Jython support. Thanks to Jonas Diemer for the patch.


Release 0.3.7 - August 16 2013
------------------------------

* Added :func:`write_boolean()` function to write Excel boolean values.
  :feature:`37`. Also added explicit handling of Python bool values to the
  :func:`write()` function.

* Changed :func:`Workbook` constructor option
  ``strings_to_numbers`` default option to False so that there is no implicit
  conversion of numbers in strings to numbers. The previous behavior can be
  obtained by setting the constructor option to True.
  **Note** This is a backward incompatibility.


Release 0.3.6 - July 26 2013
-----------------------------

* Simplified import based on a suggestion from John Yeung.
  :feature:`26`.

* Fix for NAN/INF converted to invalid numbers in write(). :issue:`30`.

* Added :func:`Workbook` constructor option ``strings_to_numbers`` to
  override default conversion of number strings to numbers in write().

* Added :func:`Workbook` constructor option ``default_date_format`` to
  allow a default date format string to be set.
  :feature:`5`.


Release 0.3.5 - June 28 2013
-----------------------------

* Reverted back to using codecs for file encoding (versions <= 0.3.1) to avoid
  numerous UTF-8 issues in Python2/3.


Release 0.3.4 - June 27 2013
-----------------------------

* Added Chart line smoothing option. Thanks to Dieter Vandenbussche.

* Added Http Server example (:ref:`ex_http_server`). Thanks to
  Alexander Afanasiev.

* Fixed inaccurate column width calculation. Closes :issue:`27` Thanks to John Yeung.

* Added chart axis font rotation.


Release 0.3.3 - June 10 2013
-----------------------------

* Minor packaging fixes.
  :issue:`14` and :issue:`19`.


* Fixed explicit UTF-8 file encoding for Python 3.
  :pull:`15` from Alexandr Shadchin.

* Fixed invalid string formatting resulted in misleading stack trace.
  :pull:`21` from Andrei Korostelev.


Release 0.3.2 - May 1 2013
-----------------------------

* Speed optimizations. The module is now 10-15% faster on average.


Release 0.3.1 - April 27 2013
-----------------------------

* Added chart support. See the :ref:`chart_class`, :ref:`working_with_charts`
  and :ref:`chart_examples`.


Release 0.3.0 - April 7 2013
-----------------------------

* Added worksheet sparklines. See :ref:`sparklines`, :ref:`ex_sparklines1` and
  :ref:`ex_sparklines2`


Release 0.2.9 - April 7 2013
-----------------------------

* Added worksheet tables. See :ref:`tables` and :ref:`ex_tables`.

* Tested with the new Python stable releases 2.7.4 and 3.3.1. All tests now
  pass in the following versions:

    * Python 2.6
    * Python 2.7.2
    * Python 2.7.3
    * Python 2.7.4
    * Python 3.1
    * Python 3.2
    * Python 3.3.0
    * Python 3.3.1

* There are now over 700 unit tests including more than 170 tests that
  compare against the output of Excel.


Release 0.2.8 - April 4 2013
-----------------------------

* Added worksheet outlines and grouping. See :ref:`outlines`.


Release 0.2.7 - April 3 2013
-----------------------------

* Added :func:`set_default_row` method. See :ref:`ex_hide_row_col`.

* Added hide_row_col.py, hide_sheet.py and text_indent.py examples.


Release 0.2.6 - April 1 2013
-----------------------------

* Added :func:`freeze_panes` and :func:`split_panes` methods.
  See :ref:`ex_panes` .

* Added :func:`set_selection` method to select worksheet cell or range of
  cells.


Release 0.2.5 - April 1 2013
-----------------------------

* Added additional :func:`Workbook` parameters ``'tmpdir'`` and
  ``'date_1904'``.


Release 0.2.4 - March 31 2013
-----------------------------

* Added :func:`Workbook` ``'constant_memory'`` constructor property to
  minimize memory usage when writing large files. See :ref:`memory_perf`
  for more details.

* Fixed bug with handling of UTF-8 strings in worksheet names (and probably
  some other places as well). Reported by Josh English.

* Fixed bug where temporary directory used to create xlsx files wasn't
  cleaned up after program close.


Release 0.2.3 - March 27 2013
-----------------------------

* Fixed bug that was killing performance for medium sized files. The module
  is now 10x faster than previous versions. Reported by John Yeung.


Release 0.2.2 - March 27 2013
-----------------------------

* Added worksheet data validation options. See the :func:`data_validation`
  method, :ref:`working_with_data_validation` and :ref:`ex_data_valid`.

* There are now over 600 unit tests including more than 130 tests that
  compare against the output of Excel.


Release 0.2.1 - March 25 2013
-----------------------------

* Added support for datetime.datetime, datetime.date and datetime.time
  to the :func:`write_datetime` method. :issue:`3`.
  Thanks to Eduardo (eazb) and Josh English for the prompt.


Release 0.2.0 - March 24 2013
-----------------------------

* Added conditional formatting. See the :func:`conditional_format` method,
  :ref:`working_with_conditional_formats` and :ref:`ex_cond_format`.


Release 0.1.9 - March 19 2013
-----------------------------

* Added Python 2.6 support. All tests now pass in the following versions:

    * Python 2.6
    * Python 2.7.2
    * Python 2.7.3
    * Python 3.1
    * Python 3.2
    * Python 3.3.0


Release 0.1.8 - March 18 2013
-----------------------------

* Fixed Python 3 support.


Release 0.1.7 - March 18 2013
-----------------------------

* Added the option to write cell comments to a worksheet. See
  :func:`write_comment` and :ref:`cell_comments`.


Release 0.1.6 - March 17 2013
-----------------------------

* Added :func:`insert_image` worksheet method to support inserting PNG and
  JPEG images into a worksheet. See also the example program
  :ref:`ex_insert_image`.

* There are now over 500 unit tests including more than 100 tests that
  compare against the output of Excel.


Release 0.1.5 - March 10 2013
-----------------------------

* Added the :func:`write_rich_string` worksheet method to allow writing of
  text with multiple formats to a cell. Also added example program:
  :ref:`ex_rich_strings`.

* Added the :func:`hide` worksheet method to hide worksheets.

* Added the :func:`set_first_sheet()` worksheet method.


Release 0.1.4 - March 8 2013
----------------------------

* Added the :func:`protect` worksheet method to allow protection of cells
  from editing. Also added example program: :ref:`ex_protection`.


Release 0.1.3 - March 7 2013
----------------------------

* Added worksheet methods:

    * :func:`set_zoom` for setting worksheet zoom levels.
    * :func:`right_to_left` for middle eastern versions of Excel.
    * :func:`hide_zero` for hiding zero values in cells.
    * :func:`set_tab_color` for setting the worksheet tab color.


Release 0.1.2 - March 6 2013
----------------------------

* Added autofilters. See :ref:`working_with_autofilters` for more details.

* Added the :func:`write_row` and :func:`write_column` worksheet methods.


Release 0.1.1 - March 3 2013
----------------------------

* Added the :func:`write_url` worksheet method for writing hyperlinks to
  a worksheet.


Release 0.1.0 - February 28 2013
--------------------------------

* Added the :func:`set_properties` workbook method for setting document
  properties.

* Added several new examples programs with documentation. The examples now
  include:

    * array_formula.py
    * cell_indentation.py
    * datetimes.py
    * defined_name.py
    * demo.py
    * doc_properties.py
    * headers_footers.py
    * hello_world.py
    * merge1.py
    * tutorial1.py
    * tutorial2.py
    * tutorial3.py
    * unicode_polish_utf8.py
    * unicode_shift_jis.py

Release 0.0.9 - February 27 2013
--------------------------------

* Added the :func:`define_name` method to create defined names and ranges
  in a workbook or worksheet.

* Added the :func:`worksheets` method as an accessor for the worksheets in a
  workbook.


Release 0.0.8 - February 26 2013
--------------------------------

* Added the :func:`merge_range` method to merge worksheet cells.


Release 0.0.7 - February 25 2013
--------------------------------

* Added final page setup methods to complete the page setup section.

    * :func:`print_area`
    * :func:`fit_to_pages`
    * :func:`set_start_page`
    * :func:`set_print_scale`
    * :func:`set_h_pagebreaks`
    * :func:`set_v_pagebreaks`


Release 0.0.6 - February 22 2013
--------------------------------

* Added page setup method.

    * :func:`print_row_col_headers`


Release 0.0.5 - February 21 2013
--------------------------------

* Added page setup methods.

    * :func:`repeat_rows`
    * :func:`repeat_columns`


Release 0.0.4 - February 20 2013
--------------------------------

* Added Python 3 support with help from John Evans. Tested with:

    * Python-2.7.2
    * Python-2.7.3
    * Python-3.2
    * Python-3.3.0

* Added page setup methods.

    * :func:`center_horizontally`
    * :func:`center_vertically`
    * :func:`set_header`
    * :func:`set_footer`
    * :func:`hide_gridlines`


Release 0.0.3 - February 19 2013
--------------------------------

* Added page setup method.

    * :func:`set_margins`


Release 0.0.2 - February 18 2013
--------------------------------

* Added page setup methods.

    * :func:`set_landscape`
    * :func:`set_portrait`
    * :func:`set_page_view`
    * :func:`set_paper`
    * :func:`print_across`


Release 0.0.1 - February 17 2013
--------------------------------

* First public release.
