From 18d9eab603e723cc532251013d47f9ec49fca927 Mon Sep 17 00:00:00 2001 From: Joeperdefloep Date: Thu, 24 Jun 2021 23:13:32 +0200 Subject: [PATCH 1/3] BUG: excelwriter engine_kwargs fix --- pandas/io/excel/_base.py | 13 +++++++++++++ pandas/io/excel/_xlsxwriter.py | 2 +- pandas/tests/io/excel/test_xlsxwriter.py | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index 719a4472fb9e3..c074c3aa86494 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -754,6 +754,19 @@ class ExcelWriter(metaclass=abc.ABCMeta): >>> with ExcelWriter("path_to_file.xlsx", mode="a", engine="openpyxl") as writer: ... df.to_excel(writer, sheet_name="Sheet3") + Here, the `if_sheet_exists` parameter can be set to replace a sheet if it + already exists: + + >>> with ExcelWriter("path_to_file.xlsx", mode="a", engine="openpyxl", if_sheet_exists="replace") as writer: + ... df.to_excel(writer, sheet_name="Sheet1") + + You can specify arguments to the underlying engine. For example to not + calculate the result of a formula: + + >>> df = pd.DataFrame(["=1+1"]) + ... with ExcelWriter("path_to_file.xlsx", engine_kwargs={"strings_to_formulas":False}) + ... df.to_excel(writer) + You can store Excel file in RAM: >>> import io diff --git a/pandas/io/excel/_xlsxwriter.py b/pandas/io/excel/_xlsxwriter.py index 7500a33b1f097..765aae5f975e6 100644 --- a/pandas/io/excel/_xlsxwriter.py +++ b/pandas/io/excel/_xlsxwriter.py @@ -195,7 +195,7 @@ def __init__( engine_kwargs=engine_kwargs, ) - self.book = Workbook(self.handles.handle, **engine_kwargs) + self.book = Workbook(self.handles.handle, engine_kwargs) def save(self): """ diff --git a/pandas/tests/io/excel/test_xlsxwriter.py b/pandas/tests/io/excel/test_xlsxwriter.py index 6de378f6a3d3e..7b1a376a62e89 100644 --- a/pandas/tests/io/excel/test_xlsxwriter.py +++ b/pandas/tests/io/excel/test_xlsxwriter.py @@ -61,3 +61,7 @@ def test_write_append_mode_raises(ext): with tm.ensure_clean(ext) as f: with pytest.raises(ValueError, match=msg): ExcelWriter(f, engine="xlsxwriter", mode="a") + +def test_engine_kwargs(ext): + with tm.ensure_clean(ext) as f: + ExcelWriter(f,engine="xlsxwriter",engine_kwargs={"strings_to_formulas":False}) \ No newline at end of file From 6865f2a64c7efd7fe97f37a494b51fcdaf01a758 Mon Sep 17 00:00:00 2001 From: Joeperdefloep Date: Fri, 25 Jun 2021 09:14:35 +0200 Subject: [PATCH 2/3] Pep8 --- pandas/io/excel/_base.py | 12 ++++++++++-- pandas/tests/io/excel/test_xlsxwriter.py | 6 +++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index c074c3aa86494..8d849fa567c4a 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -757,14 +757,22 @@ class ExcelWriter(metaclass=abc.ABCMeta): Here, the `if_sheet_exists` parameter can be set to replace a sheet if it already exists: - >>> with ExcelWriter("path_to_file.xlsx", mode="a", engine="openpyxl", if_sheet_exists="replace") as writer: + >>> with ExcelWriter( + ... "path_to_file.xlsx", + ... mode="a", + ... engine="openpyxl", + ... if_sheet_exists="replace" + ... ) as writer: ... df.to_excel(writer, sheet_name="Sheet1") You can specify arguments to the underlying engine. For example to not calculate the result of a formula: >>> df = pd.DataFrame(["=1+1"]) - ... with ExcelWriter("path_to_file.xlsx", engine_kwargs={"strings_to_formulas":False}) + ... with ExcelWriter( + ... "path_to_file.xlsx", + ... engine_kwargs={"strings_to_formulas":False} + ... ) as writer: ... df.to_excel(writer) You can store Excel file in RAM: diff --git a/pandas/tests/io/excel/test_xlsxwriter.py b/pandas/tests/io/excel/test_xlsxwriter.py index 7b1a376a62e89..ac8d53028195c 100644 --- a/pandas/tests/io/excel/test_xlsxwriter.py +++ b/pandas/tests/io/excel/test_xlsxwriter.py @@ -62,6 +62,10 @@ def test_write_append_mode_raises(ext): with pytest.raises(ValueError, match=msg): ExcelWriter(f, engine="xlsxwriter", mode="a") + def test_engine_kwargs(ext): + # to test that kwargs are accurately passed on to the engine. with tm.ensure_clean(ext) as f: - ExcelWriter(f,engine="xlsxwriter",engine_kwargs={"strings_to_formulas":False}) \ No newline at end of file + ExcelWriter( + f, engine="xlsxwriter", engine_kwargs={"strings_to_formulas": False} + ) From d226ae57bf06caa4afb77ff5506c1a7340d002a8 Mon Sep 17 00:00:00 2001 From: Joeperdefloep Date: Sat, 26 Jun 2021 14:17:31 +0200 Subject: [PATCH 3/3] moved if_sheet_exists docs to #42222 --- pandas/io/excel/_base.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index 8d849fa567c4a..7d78c9f9e4249 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -754,17 +754,6 @@ class ExcelWriter(metaclass=abc.ABCMeta): >>> with ExcelWriter("path_to_file.xlsx", mode="a", engine="openpyxl") as writer: ... df.to_excel(writer, sheet_name="Sheet3") - Here, the `if_sheet_exists` parameter can be set to replace a sheet if it - already exists: - - >>> with ExcelWriter( - ... "path_to_file.xlsx", - ... mode="a", - ... engine="openpyxl", - ... if_sheet_exists="replace" - ... ) as writer: - ... df.to_excel(writer, sheet_name="Sheet1") - You can specify arguments to the underlying engine. For example to not calculate the result of a formula: