107 lines
3.2 KiB
Python
107 lines
3.2 KiB
Python
|
from datetime import (
|
||
|
date,
|
||
|
datetime,
|
||
|
)
|
||
|
import re
|
||
|
|
||
|
import pytest
|
||
|
|
||
|
from pandas.compat import is_platform_windows
|
||
|
|
||
|
import pandas as pd
|
||
|
import pandas._testing as tm
|
||
|
|
||
|
from pandas.io.excel import ExcelWriter
|
||
|
|
||
|
odf = pytest.importorskip("odf")
|
||
|
|
||
|
if is_platform_windows():
|
||
|
pytestmark = pytest.mark.single_cpu
|
||
|
|
||
|
|
||
|
@pytest.fixture
|
||
|
def ext():
|
||
|
return ".ods"
|
||
|
|
||
|
|
||
|
def test_write_append_mode_raises(ext):
|
||
|
msg = "Append mode is not supported with odf!"
|
||
|
|
||
|
with tm.ensure_clean(ext) as f:
|
||
|
with pytest.raises(ValueError, match=msg):
|
||
|
ExcelWriter(f, engine="odf", mode="a")
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize("engine_kwargs", [None, {"kwarg": 1}])
|
||
|
def test_engine_kwargs(ext, engine_kwargs):
|
||
|
# GH 42286
|
||
|
# GH 43445
|
||
|
# test for error: OpenDocumentSpreadsheet does not accept any arguments
|
||
|
with tm.ensure_clean(ext) as f:
|
||
|
if engine_kwargs is not None:
|
||
|
error = re.escape(
|
||
|
"OpenDocumentSpreadsheet() got an unexpected keyword argument 'kwarg'"
|
||
|
)
|
||
|
with pytest.raises(
|
||
|
TypeError,
|
||
|
match=error,
|
||
|
):
|
||
|
ExcelWriter(f, engine="odf", engine_kwargs=engine_kwargs)
|
||
|
else:
|
||
|
with ExcelWriter(f, engine="odf", engine_kwargs=engine_kwargs) as _:
|
||
|
pass
|
||
|
|
||
|
|
||
|
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) as writer:
|
||
|
assert writer.sheets == {}
|
||
|
table = odf.table.Table(name="test_name")
|
||
|
writer.book.spreadsheet.addElement(table)
|
||
|
assert writer.sheets == {"test_name": table}
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize(
|
||
|
["value", "cell_value_type", "cell_value_attribute", "cell_value"],
|
||
|
argvalues=[
|
||
|
(True, "boolean", "boolean-value", "true"),
|
||
|
("test string", "string", "string-value", "test string"),
|
||
|
(1, "float", "value", "1"),
|
||
|
(1.5, "float", "value", "1.5"),
|
||
|
(
|
||
|
datetime(2010, 10, 10, 10, 10, 10),
|
||
|
"date",
|
||
|
"date-value",
|
||
|
"2010-10-10T10:10:10",
|
||
|
),
|
||
|
(date(2010, 10, 10), "date", "date-value", "2010-10-10"),
|
||
|
],
|
||
|
)
|
||
|
def test_cell_value_type(ext, value, cell_value_type, cell_value_attribute, cell_value):
|
||
|
# GH#54994 ODS: cell attributes should follow specification
|
||
|
# http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#refTable13
|
||
|
from odf.namespaces import OFFICENS
|
||
|
from odf.table import (
|
||
|
TableCell,
|
||
|
TableRow,
|
||
|
)
|
||
|
|
||
|
table_cell_name = TableCell().qname
|
||
|
|
||
|
with tm.ensure_clean(ext) as f:
|
||
|
pd.DataFrame([[value]]).to_excel(f, header=False, index=False)
|
||
|
|
||
|
with pd.ExcelFile(f) as wb:
|
||
|
sheet = wb._reader.get_sheet_by_index(0)
|
||
|
sheet_rows = sheet.getElementsByType(TableRow)
|
||
|
sheet_cells = [
|
||
|
x
|
||
|
for x in sheet_rows[0].childNodes
|
||
|
if hasattr(x, "qname") and x.qname == table_cell_name
|
||
|
]
|
||
|
|
||
|
cell = sheet_cells[0]
|
||
|
assert cell.attributes.get((OFFICENS, "value-type")) == cell_value_type
|
||
|
assert cell.attributes.get((OFFICENS, cell_value_attribute)) == cell_value
|