Skip to content

Commit

Permalink
More CSS to Excel testing; define ExcelFormatter.write
Browse files Browse the repository at this point in the history
  • Loading branch information
jnothman committed Apr 7, 2017
1 parent f17a0f4 commit efce9b6
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 49 deletions.
48 changes: 17 additions & 31 deletions pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
import pandas.core.nanops as nanops
import pandas.core.ops as ops
import pandas.formats.format as fmt
from pandas.formats.excel import ExcelFormatter
from pandas.formats.printing import pprint_thing
import pandas.tools.plotting as gfx

Expand Down Expand Up @@ -203,35 +204,6 @@
"""


def _to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
float_format=None, columns=None, header=True, index=True,
index_label=None, startrow=0, startcol=0, engine=None,
merge_cells=True, encoding=None, inf_rep='inf', verbose=True,
freeze_panes=None):
# This implementation is shared by Styler.to_excel
from pandas.io.excel import ExcelWriter
need_save = False
if encoding is None:
encoding = 'ascii'

if isinstance(excel_writer, compat.string_types):
excel_writer = ExcelWriter(excel_writer, engine=engine)
need_save = True

formatter = fmt.ExcelFormatter(self, na_rep=na_rep, cols=columns,
header=header,
float_format=float_format, index=index,
index_label=index_label,
merge_cells=merge_cells,
inf_rep=inf_rep)

formatted_cells = formatter.get_formatted_cells()
excel_writer.write_cells(formatted_cells, sheet_name,
startrow=startrow, startcol=startcol,
freeze_panes=freeze_panes)
if need_save:
excel_writer.save()

# -----------------------------------------------------------------------
# DataFrame class

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

to_excel = Appender(_shared_docs['to_excel']
% _shared_doc_kwargs)(_to_excel)
@Appender(_shared_docs['to_excel'] % _shared_doc_kwargs)
def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
float_format=None, columns=None, header=True, index=True,
index_label=None, startrow=0, startcol=0, engine=None,
merge_cells=True, encoding=None, inf_rep='inf', verbose=True,
freeze_panes=None):

formatter = ExcelFormatter(self, na_rep=na_rep, cols=columns,
header=header,
float_format=float_format, index=index,
index_label=index_label,
merge_cells=merge_cells,
inf_rep=inf_rep)
formatter.write(excel_writer, sheet_name=sheet_name, startrow=startrow,
startcol=startcol, freeze_panes=freeze_panes,
engine=engine)

def to_stata(self, fname, convert_dates=None, write_index=True,
encoding="latin-1", byteorder=None, time_stamp=None,
Expand Down
39 changes: 33 additions & 6 deletions pandas/formats/excel.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import numpy as np

from pandas.compat import reduce
from pandas.compat import reduce, string_types
from pandas.formats.css import CSSResolver, CSSWarning
from pandas.formats.printing import pprint_thing
from pandas.types.common import (is_float)
Expand All @@ -17,11 +17,6 @@
from pandas.formats.common import get_level_lengths


# from collections import namedtuple
# ExcelCell = namedtuple("ExcelCell",
# 'row, col, val, style, mergestart, mergeend')


class ExcelCell(object):
__fields__ = ('row', 'col', 'val', 'style', 'mergestart', 'mergeend')
__slots__ = __fields__
Expand Down Expand Up @@ -584,3 +579,35 @@ def get_formatted_cells(self):
self._format_body()):
cell.val = self._format_value(cell.val)
yield cell

def write(self, writer, sheet_name='Sheet1', startrow=0,
startcol=0, freeze_panes=None, engine=None):
"""
writer : string or ExcelWriter object
File path or existing ExcelWriter
sheet_name : string, default 'Sheet1'
Name of sheet which will contain DataFrame
startrow :
upper left cell row to dump data frame
startcol :
upper left cell column to dump data frame
freeze_panes : tuple of integer (length 2), default None
Specifies the one-based bottommost row and rightmost column that
is to be frozen
engine : string, default None
write engine to use if writer is a path - you can also set this
via the options ``io.excel.xlsx.writer``, ``io.excel.xls.writer``,
and ``io.excel.xlsm.writer``.
"""
from pandas.io.excel import ExcelWriter
need_save = False
if isinstance(writer, string_types):
writer = ExcelWriter(writer, engine=engine)
need_save = True

formatted_cells = self.get_formatted_cells()
writer.write_cells(formatted_cells, sheet_name,
startrow=startrow, startcol=startcol,
freeze_panes=freeze_panes)
if need_save:
writer.save()
20 changes: 11 additions & 9 deletions pandas/formats/style.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import pandas.core.common as com
from pandas.core.indexing import _maybe_numeric_slice, _non_reducing_slice
from pandas.util.decorators import Appender
from pandas.formats.excel import ExcelFormatter
try:
import matplotlib.pyplot as plt
from matplotlib import colors
Expand Down Expand Up @@ -206,15 +207,16 @@ def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='',
merge_cells=True, encoding=None, inf_rep='inf', verbose=True,
freeze_panes=None):

from pandas.core.frame import _to_excel
return _to_excel(self, excel_writer, sheet_name=sheet_name,
na_rep=na_rep, float_format=float_format,
columns=columns, header=header, index=index,
index_label=index_label, startrow=startrow,
startcol=startcol, engine=engine,
merge_cells=merge_cells, encoding=encoding,
inf_rep=inf_rep, verbose=verbose,
freeze_panes=freeze_panes)
formatter = ExcelFormatter(self, na_rep=na_rep, cols=columns,
header=header,
float_format=float_format, index=index,
index_label=index_label,
merge_cells=merge_cells,
inf_rep=inf_rep)
formatter.write(excel_writer, sheet_name=sheet_name, startrow=startrow,
startcol=startcol, freeze_panes=freeze_panes,
engine=engine)


def _translate(self):
"""
Expand Down
1 change: 1 addition & 0 deletions pandas/io/excel.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
string_types, OrderedDict)
from pandas.core import config
from pandas.formats.printing import pprint_thing
from pandas.formats.excel import ExcelFormatter
import pandas.compat as compat
import pandas.compat.openpyxl_compat as openpyxl_compat
from warnings import warn
Expand Down
6 changes: 3 additions & 3 deletions pandas/tests/formats/test_css.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ def test_css_parse_comments():
'hello/* foo */:/* bar \n */ world /*;not:here*/')


@pytest.mark.xfail
@pytest.mark.xfail(reason='''we don't need to handle specificity
markers like !important, but we should
ignore them in the future''')
def test_css_parse_specificity():
# we don't need to handle specificity markers like !important,
# but we should ignore them
pass


Expand Down

0 comments on commit efce9b6

Please sign in to comment.