Skip to content

Commit bcb8346

Browse files
authored
DEPR: Remove xlwt (#49296)
* DEPR: Remove xlwt * Remove another ref to option * Adjust tests * Just remove xls benchmark * Fix some tests
1 parent 05fb08e commit bcb8346

31 files changed

+35
-538
lines changed

asv_bench/asv.conf.json

-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
"openpyxl": [],
5555
"xlsxwriter": [],
5656
"xlrd": [],
57-
"xlwt": [],
5857
"odfpy": [],
5958
"jinja2": [],
6059
},

asv_bench/benchmarks/io/excel.py

+4-10
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def _generate_dataframe():
3333

3434
class WriteExcel:
3535

36-
params = ["openpyxl", "xlsxwriter", "xlwt"]
36+
params = ["openpyxl", "xlsxwriter"]
3737
param_names = ["engine"]
3838

3939
def setup(self, engine):
@@ -68,10 +68,9 @@ def time_write_excel_style(self, engine):
6868

6969
class ReadExcel:
7070

71-
params = ["xlrd", "openpyxl", "odf"]
71+
params = ["openpyxl", "odf"]
7272
param_names = ["engine"]
7373
fname_excel = "spreadsheet.xlsx"
74-
fname_excel_xls = "spreadsheet.xls"
7574
fname_odf = "spreadsheet.ods"
7675

7776
def _create_odf(self):
@@ -92,13 +91,10 @@ def setup_cache(self):
9291
self.df = _generate_dataframe()
9392

9493
self.df.to_excel(self.fname_excel, sheet_name="Sheet1")
95-
self.df.to_excel(self.fname_excel_xls, sheet_name="Sheet1")
9694
self._create_odf()
9795

9896
def time_read_excel(self, engine):
99-
if engine == "xlrd":
100-
fname = self.fname_excel_xls
101-
elif engine == "odf":
97+
if engine == "odf":
10298
fname = self.fname_odf
10399
else:
104100
fname = self.fname_excel
@@ -107,9 +103,7 @@ def time_read_excel(self, engine):
107103

108104
class ReadExcelNRows(ReadExcel):
109105
def time_read_excel(self, engine):
110-
if engine == "xlrd":
111-
fname = self.fname_excel_xls
112-
elif engine == "odf":
106+
if engine == "odf":
113107
fname = self.fname_odf
114108
else:
115109
fname = self.fname_excel

ci/code_checks.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import pandas
4747
4848
blocklist = {'bs4', 'gcsfs', 'html5lib', 'http', 'ipython', 'jinja2', 'hypothesis',
4949
'lxml', 'matplotlib', 'openpyxl', 'py', 'pytest', 's3fs', 'scipy',
50-
'tables', 'urllib.request', 'xlrd', 'xlsxwriter', 'xlwt'}
50+
'tables', 'urllib.request', 'xlrd', 'xlsxwriter'}
5151
5252
# GH#28227 for some of these check for top-level modules, while others are
5353
# more specific (e.g. urllib.request)

ci/deps/actions-310.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,4 @@ dependencies:
5151
- xarray
5252
- xlrd
5353
- xlsxwriter
54-
- xlwt
5554
- zstandard

ci/deps/actions-38-downstream_compat.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ dependencies:
5151
- xarray
5252
- xlrd
5353
- xlsxwriter
54-
- xlwt
5554
- zstandard
5655

5756
# downstream packages

ci/deps/actions-38-minimum_versions.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,4 @@ dependencies:
5353
- xarray=0.19.0
5454
- xlrd=2.0.1
5555
- xlsxwriter=1.4.3
56-
- xlwt=1.3.0
5756
- zstandard=0.15.2

ci/deps/actions-38.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,4 @@ dependencies:
5050
- xarray
5151
- xlrd
5252
- xlsxwriter
53-
- xlwt
5453
- zstandard

ci/deps/actions-39.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,4 @@ dependencies:
5151
- xarray
5252
- xlrd
5353
- xlsxwriter
54-
- xlwt
5554
- zstandard

ci/deps/circle-38-arm64.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,4 @@ dependencies:
5151
- xarray
5252
- xlrd
5353
- xlsxwriter
54-
- xlwt
5554
- zstandard

doc/source/getting_started/install.rst

-1
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,6 @@ Can be managed as optional_extra with ``pandas[excel]``.
336336
Dependency Minimum Version optional_extra Notes
337337
========================= ================== =============== =============================================================
338338
xlrd 2.0.1 excel Reading Excel
339-
xlwt 1.3.0 excel Writing Excel
340339
xlsxwriter 1.4.3 excel Writing Excel
341340
openpyxl 3.0.7 excel Reading / writing for xlsx files
342341
pyxlsb 1.0.8 excel Reading for xlsb files

doc/source/user_guide/io.rst

+2-19
Original file line numberDiff line numberDiff line change
@@ -3466,8 +3466,6 @@ See the :ref:`cookbook<cookbook.excel>` for some advanced strategies.
34663466

34673467
.. warning::
34683468

3469-
The `xlwt <https://xlwt.readthedocs.io/en/latest/>`__ package for writing old-style ``.xls``
3470-
excel files is no longer maintained.
34713469
The `xlrd <https://xlrd.readthedocs.io/en/latest/>`__ package is now only for reading
34723470
old-style ``.xls`` files.
34733471

@@ -3481,12 +3479,6 @@ See the :ref:`cookbook<cookbook.excel>` for some advanced strategies.
34813479
**Please do not report issues when using ``xlrd`` to read ``.xlsx`` files.**
34823480
This is no longer supported, switch to using ``openpyxl`` instead.
34833481

3484-
Attempting to use the ``xlwt`` engine will raise a ``FutureWarning``
3485-
unless the option :attr:`io.excel.xls.writer` is set to ``"xlwt"``.
3486-
While this option is now deprecated and will also raise a ``FutureWarning``,
3487-
it can be globally set and the warning suppressed. Users are recommended to
3488-
write ``.xlsx`` files using the ``openpyxl`` engine instead.
3489-
34903482
.. _io.excel_reader:
34913483

34923484
Reading Excel files
@@ -3788,7 +3780,7 @@ written. For example:
37883780
37893781
df.to_excel("path_to_file.xlsx", sheet_name="Sheet1")
37903782
3791-
Files with a ``.xls`` extension will be written using ``xlwt`` and those with a
3783+
Files with a
37923784
``.xlsx`` extension will be written using ``xlsxwriter`` (if available) or
37933785
``openpyxl``.
37943786

@@ -3849,35 +3841,26 @@ pandas supports writing Excel files to buffer-like objects such as ``StringIO``
38493841
Excel writer engines
38503842
''''''''''''''''''''
38513843

3852-
.. deprecated:: 1.2.0
3853-
3854-
As the `xlwt <https://pypi.org/project/xlwt/>`__ package is no longer
3855-
maintained, the ``xlwt`` engine will be removed from a future version
3856-
of pandas. This is the only engine in pandas that supports writing to
3857-
``.xls`` files.
3858-
38593844
pandas chooses an Excel writer via two methods:
38603845

38613846
1. the ``engine`` keyword argument
38623847
2. the filename extension (via the default specified in config options)
38633848

38643849
By default, pandas uses the `XlsxWriter`_ for ``.xlsx``, `openpyxl`_
3865-
for ``.xlsm``, and `xlwt`_ for ``.xls`` files. If you have multiple
3850+
for ``.xlsm``. If you have multiple
38663851
engines installed, you can set the default engine through :ref:`setting the
38673852
config options <options>` ``io.excel.xlsx.writer`` and
38683853
``io.excel.xls.writer``. pandas will fall back on `openpyxl`_ for ``.xlsx``
38693854
files if `Xlsxwriter`_ is not available.
38703855

38713856
.. _XlsxWriter: https://xlsxwriter.readthedocs.io
38723857
.. _openpyxl: https://openpyxl.readthedocs.io/
3873-
.. _xlwt: http://www.python-excel.org
38743858

38753859
To specify which writer you want to use, you can pass an engine keyword
38763860
argument to ``to_excel`` and to ``ExcelWriter``. The built-in engines are:
38773861

38783862
* ``openpyxl``: version 2.4 or higher is required
38793863
* ``xlsxwriter``
3880-
* ``xlwt``
38813864

38823865
.. code-block:: python
38833866

environment.yml

-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ dependencies:
5353
- xarray
5454
- xlrd
5555
- xlsxwriter
56-
- xlwt
5756
- zstandard
5857

5958
# downstream packages

pandas/compat/_optional.py

-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
"tabulate": "0.8.9",
4444
"xarray": "0.19.0",
4545
"xlrd": "2.0.1",
46-
"xlwt": "1.3.0",
4746
"xlsxwriter": "1.4.3",
4847
"zstandard": "0.15.2",
4948
"tzdata": "2022.1",

pandas/core/config_init.py

-16
Original file line numberDiff line numberDiff line change
@@ -624,27 +624,11 @@ def use_inf_as_na_cb(key) -> None:
624624
auto, {others}.
625625
"""
626626

627-
_xls_options = ["xlwt"]
628627
_xlsm_options = ["openpyxl"]
629628
_xlsx_options = ["openpyxl", "xlsxwriter"]
630629
_ods_options = ["odf"]
631630

632631

633-
with cf.config_prefix("io.excel.xls"):
634-
cf.register_option(
635-
"writer",
636-
"auto",
637-
writer_engine_doc.format(ext="xls", others=", ".join(_xls_options)),
638-
validator=str,
639-
)
640-
cf.deprecate_option(
641-
"io.excel.xls.writer",
642-
msg="As the xlwt package is no longer maintained, the xlwt engine will be "
643-
"removed in a future version of pandas. This is the only engine in pandas that "
644-
"supports writing in the xls format. Install openpyxl and write to an "
645-
"xlsx file instead.",
646-
)
647-
648632
with cf.config_prefix("io.excel.xlsm"):
649633
cf.register_option(
650634
"writer",

pandas/core/generic.py

+1-7
Original file line numberDiff line numberDiff line change
@@ -2260,15 +2260,9 @@ def to_excel(
22602260
Upper left cell column to dump data frame.
22612261
engine : str, optional
22622262
Write engine to use, 'openpyxl' or 'xlsxwriter'. You can also set this
2263-
via the options ``io.excel.xlsx.writer``, ``io.excel.xls.writer``, and
2263+
via the options ``io.excel.xlsx.writer`` or
22642264
``io.excel.xlsm.writer``.
22652265
2266-
.. deprecated:: 1.2.0
2267-
2268-
As the `xlwt <https://pypi.org/project/xlwt/>`__ package is no longer
2269-
maintained, the ``xlwt`` engine will be removed in a future version
2270-
of pandas.
2271-
22722266
merge_cells : bool, default True
22732267
Write MultiIndex and Hierarchical Rows as merged cells.
22742268
encoding : str, optional

pandas/io/excel/__init__.py

-5
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,12 @@
77
from pandas.io.excel._openpyxl import OpenpyxlWriter as _OpenpyxlWriter
88
from pandas.io.excel._util import register_writer
99
from pandas.io.excel._xlsxwriter import XlsxWriter as _XlsxWriter
10-
from pandas.io.excel._xlwt import XlwtWriter as _XlwtWriter
1110

1211
__all__ = ["read_excel", "ExcelWriter", "ExcelFile"]
1312

1413

1514
register_writer(_OpenpyxlWriter)
1615

17-
18-
register_writer(_XlwtWriter)
19-
20-
2116
register_writer(_XlsxWriter)
2217

2318

pandas/io/excel/_base.py

-27
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,6 @@ class ExcelWriter(metaclass=abc.ABCMeta):
893893
894894
Default is to use:
895895
896-
* `xlwt <https://pypi.org/project/xlwt/>`__ for xls files
897896
* `xlsxwriter <https://pypi.org/project/XlsxWriter/>`__ for xlsx files if xlsxwriter
898897
is installed otherwise `openpyxl <https://pypi.org/project/openpyxl/>`__
899898
* `odswriter <https://pypi.org/project/odswriter/>`__ for ods files
@@ -911,13 +910,6 @@ class ExcelWriter(metaclass=abc.ABCMeta):
911910
Engine to use for writing. If None, defaults to
912911
``io.excel.<extension>.writer``. NOTE: can only be passed as a keyword
913912
argument.
914-
915-
.. deprecated:: 1.2.0
916-
917-
As the `xlwt <https://pypi.org/project/xlwt/>`__ package is no longer
918-
maintained, the ``xlwt`` engine will be removed in a future
919-
version of pandas.
920-
921913
date_format : str, default None
922914
Format string for dates written into Excel files (e.g. 'YYYY-MM-DD').
923915
datetime_format : str, default None
@@ -1127,25 +1119,6 @@ def __new__(
11271119
except KeyError as err:
11281120
raise ValueError(f"No engine for filetype: '{ext}'") from err
11291121

1130-
if engine == "xlwt":
1131-
xls_config_engine = config.get_option(
1132-
"io.excel.xls.writer", silent=True
1133-
)
1134-
# Don't warn a 2nd time if user has changed the default engine for xls
1135-
if xls_config_engine != "xlwt":
1136-
warnings.warn(
1137-
"As the xlwt package is no longer maintained, the xlwt "
1138-
"engine will be removed in a future version of pandas. "
1139-
"This is the only engine in pandas that supports writing "
1140-
"in the xls format. Install openpyxl and write to an xlsx "
1141-
"file instead. You can set the option io.excel.xls.writer "
1142-
"to 'xlwt' to silence this warning. While this option is "
1143-
"deprecated and will also raise a warning, it can "
1144-
"be globally set and the warning suppressed.",
1145-
FutureWarning,
1146-
stacklevel=find_stack_level(),
1147-
)
1148-
11491122
# for mypy
11501123
assert engine is not None
11511124
cls = get_writer(engine)

pandas/io/excel/_util.py

-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ def get_default_engine(ext: str, mode: Literal["reader", "writer"] = "reader") -
7373
"xlsx": "openpyxl",
7474
"xlsm": "openpyxl",
7575
"xlsb": "pyxlsb",
76-
"xls": "xlwt",
7776
"ods": "odf",
7877
}
7978
assert mode in ["reader", "writer"]

0 commit comments

Comments
 (0)