Skip to content

Commit bb18566

Browse files
committed
ENH: Added ability to freeze panes from DataFrame.to_excel()
1 parent 8452080 commit bb18566

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

pandas/core/frame.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,7 +1390,8 @@ def to_csv(self, path_or_buf=None, sep=",", na_rep='', float_format=None,
13901390
def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
13911391
float_format=None, columns=None, header=True, index=True,
13921392
index_label=None, startrow=0, startcol=0, engine=None,
1393-
merge_cells=True, encoding=None, inf_rep='inf', verbose=True):
1393+
merge_cells=True, encoding=None, inf_rep='inf', verbose=True,
1394+
freeze_panes=None):
13941395
from pandas.io.excel import ExcelWriter
13951396
need_save = False
13961397
if encoding is None:
@@ -1406,9 +1407,11 @@ def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
14061407
index_label=index_label,
14071408
merge_cells=merge_cells,
14081409
inf_rep=inf_rep)
1410+
14091411
formatted_cells = formatter.get_formatted_cells()
14101412
excel_writer.write_cells(formatted_cells, sheet_name,
1411-
startrow=startrow, startcol=startcol)
1413+
startrow=startrow, startcol=startcol,
1414+
freeze_panes=freeze_panes)
14121415
if need_save:
14131416
excel_writer.save()
14141417

pandas/io/excel.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,8 @@ def engine(self):
693693
pass
694694

695695
@abc.abstractmethod
696-
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
696+
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
697+
freeze_panes=None):
697698
"""
698699
Write given formated cells into Excel an excel sheet
699700
@@ -705,6 +706,8 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
705706
Name of Excel sheet, if None, then use self.cur_sheet
706707
startrow: upper left cell row to dump data frame
707708
startcol: upper left cell column to dump data frame
709+
freeze_panes: integer tuple of length 2
710+
contains the bottom-most row and right-most column to freeze
708711
"""
709712
pass
710713

@@ -804,10 +807,10 @@ def save(self):
804807
"""
805808
return self.book.save(self.path)
806809

807-
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
810+
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
811+
freeze_panes=None):
808812
# Write the frame cells using openpyxl.
809813
from openpyxl.cell import get_column_letter
810-
811814
sheet_name = self._get_sheet_name(sheet_name)
812815

813816
if sheet_name in self.sheets:
@@ -902,7 +905,8 @@ class _Openpyxl20Writer(_Openpyxl1Writer):
902905
engine = 'openpyxl20'
903906
openpyxl_majorver = 2
904907

905-
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
908+
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
909+
freeze_panes=None):
906910
# Write the frame cells using openpyxl.
907911
from openpyxl.cell import get_column_letter
908912

@@ -1309,7 +1313,8 @@ class _Openpyxl22Writer(_Openpyxl20Writer):
13091313
engine = 'openpyxl22'
13101314
openpyxl_majorver = 2
13111315

1312-
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
1316+
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
1317+
freeze_panes=None):
13131318
# Write the frame cells using openpyxl.
13141319
sheet_name = self._get_sheet_name(sheet_name)
13151320

@@ -1322,6 +1327,10 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
13221327
wks.title = sheet_name
13231328
self.sheets[sheet_name] = wks
13241329

1330+
if freeze_panes is not None:
1331+
wks.freeze_panes = wks.cell(row=freeze_panes[0] + 1,
1332+
column=freeze_panes[1] + 1)
1333+
13251334
for cell in cells:
13261335
xcell = wks.cell(
13271336
row=startrow + cell.row + 1,
@@ -1393,7 +1402,8 @@ def save(self):
13931402
"""
13941403
return self.book.save(self.path)
13951404

1396-
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
1405+
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
1406+
freeze_panes=None):
13971407
# Write the frame cells using xlwt.
13981408

13991409
sheet_name = self._get_sheet_name(sheet_name)
@@ -1404,6 +1414,11 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
14041414
wks = self.book.add_sheet(sheet_name)
14051415
self.sheets[sheet_name] = wks
14061416

1417+
if freeze_panes is not None:
1418+
wks.set_panes_frozen(True)
1419+
wks.set_horz_split_pos(freeze_panes[0])
1420+
wks.set_vert_split_pos(freeze_panes[1])
1421+
14071422
style_dict = {}
14081423

14091424
for cell in cells:
@@ -1514,11 +1529,12 @@ def save(self):
15141529
"""
15151530
Save workbook to disk.
15161531
"""
1532+
15171533
return self.book.close()
15181534

1519-
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
1535+
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
1536+
freeze_panes=None):
15201537
# Write the frame cells using xlsxwriter.
1521-
15221538
sheet_name = self._get_sheet_name(sheet_name)
15231539

15241540
if sheet_name in self.sheets:
@@ -1529,6 +1545,9 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
15291545

15301546
style_dict = {}
15311547

1548+
if freeze_panes is not None:
1549+
wks.freeze_panes(*(freeze_panes))
1550+
15321551
for cell in cells:
15331552
val = _conv_value(cell.val)
15341553

0 commit comments

Comments
 (0)