Skip to content

Commit

Permalink
ENH: Allow passing read_only, data_only and keep_links argument…
Browse files Browse the repository at this point in the history
…s to openpyxl using `engine_kwargs`

Previously it was not possible to override the default values for
`openpyxl.reader.excel.load_workbook`'s `read_only`, `data_only` and `keep_links`
arguments (see #55027).

Now these options can be changed via `engine_kwargs`.

Closes #55027
  • Loading branch information
dweindl committed Nov 3, 2023
1 parent 0cdb37c commit bb9e2e9
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 3 deletions.
1 change: 1 addition & 0 deletions doc/source/whatsnew/v2.2.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ Other enhancements
- :func:`tseries.api.guess_datetime_format` is now part of the public API (:issue:`54727`)
- :meth:`ExtensionArray._explode` interface method added to allow extension type implementations of the ``explode`` method (:issue:`54833`)
- :meth:`ExtensionArray.duplicated` added to allow extension type implementations of the ``duplicated`` method (:issue:`55255`)
- Allow passing ``read_only``, ``data_only`` and ``keep_links`` arguments to openpyxl using ``engine_kwargs`` of :func:`read_excel` (:issue:`55027`)
- DataFrame.apply now allows the usage of numba (via ``engine="numba"``) to JIT compile the passed function, allowing for potential speedups (:issue:`54666`)
- Implement masked algorithms for :meth:`Series.value_counts` (:issue:`54984`)

Expand Down
10 changes: 7 additions & 3 deletions pandas/io/excel/_openpyxl.py
Original file line number Diff line number Diff line change
Expand Up @@ -567,11 +567,15 @@ def load_workbook(
) -> Workbook:
from openpyxl import load_workbook

if engine_kwargs is None:
engine_kwargs = {}

engine_kwargs.setdefault("read_only", True)
engine_kwargs.setdefault("data_only", True)
engine_kwargs.setdefault("keep_links", False)

return load_workbook(
filepath_or_buffer,
read_only=True,
data_only=True,
keep_links=False,
**engine_kwargs,
)

Expand Down
15 changes: 15 additions & 0 deletions pandas/tests/io/excel/test_openpyxl.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,21 @@ def test_engine_kwargs_append_data_only(ext, data_only, expected):
DataFrame().to_excel(writer, sheet_name="Sheet2")


@pytest.mark.parametrize("kwarg_name", ["read_only", "data_only"])
@pytest.mark.parametrize("kwarg_value", [True, False])
def test_engine_kwargs_append_reader(datapath, ext, kwarg_name, kwarg_value):
# GH 55027
# test that `read_only` and `data_only` can be passed to
# `openpyxl.reader.excel.load_workbook` via `engine_kwargs`
from pandas.io.excel._openpyxl import OpenpyxlReader

filename = datapath("io", "data", "excel", "test1" + ext)
with contextlib.closing(
OpenpyxlReader(filename, engine_kwargs={kwarg_name: kwarg_value})
) as reader:
assert getattr(reader.book, kwarg_name) == kwarg_value


@pytest.mark.parametrize(
"mode,expected", [("w", ["baz"]), ("a", ["foo", "bar", "baz"])]
)
Expand Down

0 comments on commit bb9e2e9

Please sign in to comment.