Skip to content

Commit c3133db

Browse files
riptusk331jreback
authored andcommitted
BUG: XlsxWriter ignoring formats on numpy types if merged cells (#27006)
1 parent de22a48 commit c3133db

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

doc/source/whatsnew/v0.25.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ I/O
785785
- Fixed bug in :func:`pandas.read_csv` where a BOM would result in incorrect parsing using engine='python' (:issue:`26545`)
786786
- :func:`read_excel` now raises a ``ValueError`` when input is of type :class:`pandas.io.excel.ExcelFile` and ``engine`` param is passed since :class:`pandas.io.excel.ExcelFile` has an engine defined (:issue:`26566`)
787787
- Bug while selecting from :class:`HDFStore` with ``where=''`` specified (:issue:`26610`).
788+
- Fixed bug in :func:`DataFrame.to_excel()` where custom objects (i.e. `PeriodIndex`) inside merged cells were not being converted into types safe for the Excel writer (:issue:`27006`)
788789

789790
Plotting
790791
^^^^^^^^

pandas/io/excel/_xlsxwriter.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
210210
startcol + cell.col,
211211
startrow + cell.mergestart,
212212
startcol + cell.mergeend,
213-
cell.val, style)
213+
val, style)
214214
else:
215215
wks.write(startrow + cell.row,
216216
startcol + cell.col,

pandas/tests/io/excel/test_writers.py

+16
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,22 @@ def test_path_local_path(self, engine, ext):
11621162
path="foo.{ext}".format(ext=ext))
11631163
tm.assert_frame_equal(result, df)
11641164

1165+
def test_merged_cell_custom_objects(self, engine, merge_cells, ext):
1166+
# see GH-27006
1167+
mi = MultiIndex.from_tuples([(pd.Period('2018'), pd.Period('2018Q1')),
1168+
(pd.Period('2018'), pd.Period('2018Q2'))])
1169+
expected = DataFrame(np.ones((2, 2)), columns=mi)
1170+
expected.to_excel(self.path)
1171+
result = pd.read_excel(self.path, header=[0, 1],
1172+
index_col=0, convert_float=False)
1173+
# need to convert PeriodIndexes to standard Indexes for assert equal
1174+
expected.columns.set_levels([[str(i) for i in mi.levels[0]],
1175+
[str(i) for i in mi.levels[1]]],
1176+
level=[0, 1],
1177+
inplace=True)
1178+
expected.index = expected.index.astype(np.float64)
1179+
tm.assert_frame_equal(expected, result)
1180+
11651181

11661182
class TestExcelWriterEngineTests:
11671183

0 commit comments

Comments
 (0)