Skip to content

Commit efce9b6

Browse files
committed
More CSS to Excel testing; define ExcelFormatter.write
1 parent f17a0f4 commit efce9b6

File tree

5 files changed

+65
-49
lines changed

5 files changed

+65
-49
lines changed

pandas/core/frame.py

+17-31
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
import pandas.core.nanops as nanops
9090
import pandas.core.ops as ops
9191
import pandas.formats.format as fmt
92+
from pandas.formats.excel import ExcelFormatter
9293
from pandas.formats.printing import pprint_thing
9394
import pandas.tools.plotting as gfx
9495

@@ -203,35 +204,6 @@
203204
"""
204205

205206

206-
def _to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
207-
float_format=None, columns=None, header=True, index=True,
208-
index_label=None, startrow=0, startcol=0, engine=None,
209-
merge_cells=True, encoding=None, inf_rep='inf', verbose=True,
210-
freeze_panes=None):
211-
# This implementation is shared by Styler.to_excel
212-
from pandas.io.excel import ExcelWriter
213-
need_save = False
214-
if encoding is None:
215-
encoding = 'ascii'
216-
217-
if isinstance(excel_writer, compat.string_types):
218-
excel_writer = ExcelWriter(excel_writer, engine=engine)
219-
need_save = True
220-
221-
formatter = fmt.ExcelFormatter(self, na_rep=na_rep, cols=columns,
222-
header=header,
223-
float_format=float_format, index=index,
224-
index_label=index_label,
225-
merge_cells=merge_cells,
226-
inf_rep=inf_rep)
227-
228-
formatted_cells = formatter.get_formatted_cells()
229-
excel_writer.write_cells(formatted_cells, sheet_name,
230-
startrow=startrow, startcol=startcol,
231-
freeze_panes=freeze_panes)
232-
if need_save:
233-
excel_writer.save()
234-
235207
# -----------------------------------------------------------------------
236208
# DataFrame class
237209

@@ -1441,8 +1413,22 @@ def to_csv(self, path_or_buf=None, sep=",", na_rep='', float_format=None,
14411413
if path_or_buf is None:
14421414
return formatter.path_or_buf.getvalue()
14431415

1444-
to_excel = Appender(_shared_docs['to_excel']
1445-
% _shared_doc_kwargs)(_to_excel)
1416+
@Appender(_shared_docs['to_excel'] % _shared_doc_kwargs)
1417+
def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
1418+
float_format=None, columns=None, header=True, index=True,
1419+
index_label=None, startrow=0, startcol=0, engine=None,
1420+
merge_cells=True, encoding=None, inf_rep='inf', verbose=True,
1421+
freeze_panes=None):
1422+
1423+
formatter = ExcelFormatter(self, na_rep=na_rep, cols=columns,
1424+
header=header,
1425+
float_format=float_format, index=index,
1426+
index_label=index_label,
1427+
merge_cells=merge_cells,
1428+
inf_rep=inf_rep)
1429+
formatter.write(excel_writer, sheet_name=sheet_name, startrow=startrow,
1430+
startcol=startcol, freeze_panes=freeze_panes,
1431+
engine=engine)
14461432

14471433
def to_stata(self, fname, convert_dates=None, write_index=True,
14481434
encoding="latin-1", byteorder=None, time_stamp=None,

pandas/formats/excel.py

+33-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import numpy as np
99

10-
from pandas.compat import reduce
10+
from pandas.compat import reduce, string_types
1111
from pandas.formats.css import CSSResolver, CSSWarning
1212
from pandas.formats.printing import pprint_thing
1313
from pandas.types.common import (is_float)
@@ -17,11 +17,6 @@
1717
from pandas.formats.common import get_level_lengths
1818

1919

20-
# from collections import namedtuple
21-
# ExcelCell = namedtuple("ExcelCell",
22-
# 'row, col, val, style, mergestart, mergeend')
23-
24-
2520
class ExcelCell(object):
2621
__fields__ = ('row', 'col', 'val', 'style', 'mergestart', 'mergeend')
2722
__slots__ = __fields__
@@ -584,3 +579,35 @@ def get_formatted_cells(self):
584579
self._format_body()):
585580
cell.val = self._format_value(cell.val)
586581
yield cell
582+
583+
def write(self, writer, sheet_name='Sheet1', startrow=0,
584+
startcol=0, freeze_panes=None, engine=None):
585+
"""
586+
writer : string or ExcelWriter object
587+
File path or existing ExcelWriter
588+
sheet_name : string, default 'Sheet1'
589+
Name of sheet which will contain DataFrame
590+
startrow :
591+
upper left cell row to dump data frame
592+
startcol :
593+
upper left cell column to dump data frame
594+
freeze_panes : tuple of integer (length 2), default None
595+
Specifies the one-based bottommost row and rightmost column that
596+
is to be frozen
597+
engine : string, default None
598+
write engine to use if writer is a path - you can also set this
599+
via the options ``io.excel.xlsx.writer``, ``io.excel.xls.writer``,
600+
and ``io.excel.xlsm.writer``.
601+
"""
602+
from pandas.io.excel import ExcelWriter
603+
need_save = False
604+
if isinstance(writer, string_types):
605+
writer = ExcelWriter(writer, engine=engine)
606+
need_save = True
607+
608+
formatted_cells = self.get_formatted_cells()
609+
writer.write_cells(formatted_cells, sheet_name,
610+
startrow=startrow, startcol=startcol,
611+
freeze_panes=freeze_panes)
612+
if need_save:
613+
writer.save()

pandas/formats/style.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import pandas.core.common as com
2828
from pandas.core.indexing import _maybe_numeric_slice, _non_reducing_slice
2929
from pandas.util.decorators import Appender
30+
from pandas.formats.excel import ExcelFormatter
3031
try:
3132
import matplotlib.pyplot as plt
3233
from matplotlib import colors
@@ -206,15 +207,16 @@ def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
206207
merge_cells=True, encoding=None, inf_rep='inf', verbose=True,
207208
freeze_panes=None):
208209

209-
from pandas.core.frame import _to_excel
210-
return _to_excel(self, excel_writer, sheet_name=sheet_name,
211-
na_rep=na_rep, float_format=float_format,
212-
columns=columns, header=header, index=index,
213-
index_label=index_label, startrow=startrow,
214-
startcol=startcol, engine=engine,
215-
merge_cells=merge_cells, encoding=encoding,
216-
inf_rep=inf_rep, verbose=verbose,
217-
freeze_panes=freeze_panes)
210+
formatter = ExcelFormatter(self, na_rep=na_rep, cols=columns,
211+
header=header,
212+
float_format=float_format, index=index,
213+
index_label=index_label,
214+
merge_cells=merge_cells,
215+
inf_rep=inf_rep)
216+
formatter.write(excel_writer, sheet_name=sheet_name, startrow=startrow,
217+
startcol=startcol, freeze_panes=freeze_panes,
218+
engine=engine)
219+
218220

219221
def _translate(self):
220222
"""

pandas/io/excel.py

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
string_types, OrderedDict)
2525
from pandas.core import config
2626
from pandas.formats.printing import pprint_thing
27+
from pandas.formats.excel import ExcelFormatter
2728
import pandas.compat as compat
2829
import pandas.compat.openpyxl_compat as openpyxl_compat
2930
from warnings import warn

pandas/tests/formats/test_css.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ def test_css_parse_comments():
3434
'hello/* foo */:/* bar \n */ world /*;not:here*/')
3535

3636

37-
@pytest.mark.xfail
37+
@pytest.mark.xfail(reason='''we don't need to handle specificity
38+
markers like !important, but we should
39+
ignore them in the future''')
3840
def test_css_parse_specificity():
39-
# we don't need to handle specificity markers like !important,
40-
# but we should ignore them
4141
pass
4242

4343

0 commit comments

Comments
 (0)