95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
import contextlib
|
|
import re
|
|
import warnings
|
|
|
|
import pytest
|
|
|
|
from pandas import DataFrame
|
|
import pandas._testing as tm
|
|
|
|
from pandas.io.excel import ExcelWriter
|
|
|
|
xlsxwriter = pytest.importorskip("xlsxwriter")
|
|
|
|
pytestmark = pytest.mark.parametrize("ext", [".xlsx"])
|
|
|
|
|
|
def test_column_format(ext):
|
|
# Test that column formats are applied to cells. Test for issue #9167.
|
|
# Applicable to xlsxwriter only.
|
|
with warnings.catch_warnings():
|
|
# Ignore the openpyxl lxml warning.
|
|
warnings.simplefilter("ignore")
|
|
openpyxl = pytest.importorskip("openpyxl")
|
|
|
|
with tm.ensure_clean(ext) as path:
|
|
frame = DataFrame({"A": [123456, 123456], "B": [123456, 123456]})
|
|
|
|
with ExcelWriter(path) as writer:
|
|
frame.to_excel(writer)
|
|
|
|
# Add a number format to col B and ensure it is applied to cells.
|
|
num_format = "#,##0"
|
|
write_workbook = writer.book
|
|
write_worksheet = write_workbook.worksheets()[0]
|
|
col_format = write_workbook.add_format({"num_format": num_format})
|
|
write_worksheet.set_column("B:B", None, col_format)
|
|
|
|
with contextlib.closing(openpyxl.load_workbook(path)) as read_workbook:
|
|
try:
|
|
read_worksheet = read_workbook["Sheet1"]
|
|
except TypeError:
|
|
# compat
|
|
read_worksheet = read_workbook.get_sheet_by_name(name="Sheet1")
|
|
|
|
# Get the number format from the cell.
|
|
try:
|
|
cell = read_worksheet["B2"]
|
|
except TypeError:
|
|
# compat
|
|
cell = read_worksheet.cell("B2")
|
|
|
|
try:
|
|
read_num_format = cell.number_format
|
|
except AttributeError:
|
|
read_num_format = cell.style.number_format._format_code
|
|
|
|
assert read_num_format == num_format
|
|
|
|
|
|
def test_write_append_mode_raises(ext):
|
|
msg = "Append mode is not supported with xlsxwriter!"
|
|
|
|
with tm.ensure_clean(ext) as f:
|
|
with pytest.raises(ValueError, match=msg):
|
|
ExcelWriter(f, engine="xlsxwriter", mode="a")
|
|
|
|
|
|
@pytest.mark.parametrize("nan_inf_to_errors", [True, False])
|
|
def test_kwargs(ext, nan_inf_to_errors):
|
|
# GH 42286
|
|
kwargs = {"options": {"nan_inf_to_errors": nan_inf_to_errors}}
|
|
with tm.ensure_clean(ext) as f:
|
|
msg = re.escape("Use of **kwargs is deprecated")
|
|
with tm.assert_produces_warning(FutureWarning, match=msg):
|
|
with ExcelWriter(f, engine="xlsxwriter", **kwargs) as writer:
|
|
assert writer.book.nan_inf_to_errors == nan_inf_to_errors
|
|
|
|
|
|
@pytest.mark.parametrize("nan_inf_to_errors", [True, False])
|
|
def test_engine_kwargs(ext, nan_inf_to_errors):
|
|
# GH 42286
|
|
engine_kwargs = {"options": {"nan_inf_to_errors": nan_inf_to_errors}}
|
|
with tm.ensure_clean(ext) as f:
|
|
with ExcelWriter(f, engine="xlsxwriter", engine_kwargs=engine_kwargs) as writer:
|
|
assert writer.book.nan_inf_to_errors == nan_inf_to_errors
|
|
|
|
|
|
def test_book_and_sheets_consistent(ext):
|
|
# GH#45687 - Ensure sheets is updated if user modifies book
|
|
with tm.ensure_clean(ext) as f:
|
|
with ExcelWriter(f, engine="xlsxwriter") as writer:
|
|
assert writer.sheets == {}
|
|
sheet = writer.book.add_worksheet("test_name")
|
|
assert writer.sheets == {"test_name": sheet}
|