Skip to content

Commit 6e5520f

Browse files
committed
Added 1) test 2) validate function for freeze_panes 3) versionadded tag
1 parent ab5af49 commit 6e5520f

File tree

4 files changed

+27
-17
lines changed

4 files changed

+27
-17
lines changed

pandas/core/frame.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,12 +1409,23 @@ def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
14091409
inf_rep=inf_rep)
14101410

14111411
formatted_cells = formatter.get_formatted_cells()
1412+
freeze_panes = self._validate_freeze_panes(freeze_panes)
14121413
excel_writer.write_cells(formatted_cells, sheet_name,
14131414
startrow=startrow, startcol=startcol,
14141415
freeze_panes=freeze_panes)
14151416
if need_save:
14161417
excel_writer.save()
14171418

1419+
def _validate_freeze_panes(self, freeze_panes):
1420+
if freeze_panes is not None:
1421+
if (len(freeze_panes) == 2 and
1422+
all(isinstance(item, int) for item in freeze_panes)
1423+
):
1424+
return freeze_panes
1425+
else:
1426+
raise ValueError("freeze_panes must be of form (row, column)"
1427+
" where row and column are integers")
1428+
14181429
def to_stata(self, fname, convert_dates=None, write_index=True,
14191430
encoding="latin-1", byteorder=None, time_stamp=None,
14201431
data_label=None, variable_labels=None):

pandas/core/generic.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,8 @@ def __setstate__(self, state):
10621062
Specifies the bottommost row and rightmost column that
10631063
is to be frozen
10641064
1065+
.. versionadded:: 0.20.0
1066+
10651067
Notes
10661068
-----
10671069
If passing an existing ExcelWriter object, then the sheet will be added

pandas/io/excel.py

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,11 +1328,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
13281328
wks.title = sheet_name
13291329
self.sheets[sheet_name] = wks
13301330

1331-
if (
1332-
freeze_panes is not None and
1333-
len(freeze_panes) == 2 and
1334-
all(isinstance(item, int) for item in freeze_panes)
1335-
):
1331+
if freeze_panes is not None:
13361332
wks.freeze_panes = wks.cell(row=freeze_panes[0] + 1,
13371333
column=freeze_panes[1] + 1)
13381334

@@ -1419,11 +1415,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
14191415
wks = self.book.add_sheet(sheet_name)
14201416
self.sheets[sheet_name] = wks
14211417

1422-
if (
1423-
freeze_panes is not None and
1424-
len(freeze_panes) == 2 and
1425-
all(isinstance(item, int) for item in freeze_panes)
1426-
):
1418+
if freeze_panes is not None:
14271419
wks.set_panes_frozen(True)
14281420
wks.set_horz_split_pos(freeze_panes[0])
14291421
wks.set_vert_split_pos(freeze_panes[1])
@@ -1554,11 +1546,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
15541546

15551547
style_dict = {}
15561548

1557-
if (
1558-
freeze_panes is not None and
1559-
len(freeze_panes) == 2 and
1560-
all(isinstance(item, int) for item in freeze_panes)
1561-
):
1549+
if freeze_panes is not None:
15621550
wks.freeze_panes(*(freeze_panes))
15631551

15641552
for cell in cells:

pandas/io/tests/test_excel.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,6 +1837,15 @@ def test_true_and_false_value_options(self):
18371837
tm.assert_frame_equal(read_frame, expected)
18381838

18391839

1840+
# GH15160
1841+
def test_freeze_panes(self):
1842+
expected = DataFrame([[1, 2], [3,4]], columns=['col1', 'col2'])
1843+
with ensure_clean(self.ext) as path:
1844+
expected.to_excel(path, "Sheet1", freeze_panes=(1,1))
1845+
result = read_excel(path)
1846+
tm.assert_frame_equal(expected, result)
1847+
1848+
18401849
def raise_wrapper(major_ver):
18411850
def versioned_raise_wrapper(orig_method):
18421851
@functools.wraps(orig_method)
@@ -1873,7 +1882,7 @@ class OpenpyxlTests(ExcelWriterBase, tm.TestCase):
18731882
def test_to_excel_styleconverter(self):
18741883
_skip_if_no_openpyxl()
18751884
if not openpyxl_compat.is_compat(major_ver=1):
1876-
raise nose.SkipTest('incompatiable openpyxl version')
1885+
raise nose.SkipTest('incompatible openpyxl version')
18771886

18781887
import openpyxl
18791888

@@ -2095,7 +2104,7 @@ def test_to_excel_styleconverter(self):
20952104

20962105
def test_write_cells_merge_styled(self):
20972106
if not openpyxl_compat.is_compat(major_ver=2):
2098-
raise nose.SkipTest('incompatiable openpyxl version')
2107+
raise nose.SkipTest('incompatible openpyxl version')
20992108

21002109
from pandas.formats.format import ExcelCell
21012110

0 commit comments

Comments
 (0)