diff --git a/pandas/core/frame.py b/pandas/core/frame.py index fbebd0e6b7ebc..c81cf4e4f4ac7 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -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 @@ -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 @@ -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, diff --git a/pandas/formats/excel.py b/pandas/formats/excel.py index 6cdf53fb72008..e837d420c13e0 100644 --- a/pandas/formats/excel.py +++ b/pandas/formats/excel.py @@ -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) @@ -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__ @@ -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() diff --git a/pandas/formats/style.py b/pandas/formats/style.py index 012123e00cca4..fb34ba90f9561 100644 --- a/pandas/formats/style.py +++ b/pandas/formats/style.py @@ -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 @@ -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): """ diff --git a/pandas/io/excel.py b/pandas/io/excel.py index 6d136869fc73f..9efedfa774589 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -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 diff --git a/pandas/tests/formats/test_css.py b/pandas/tests/formats/test_css.py index cbd5e5bd3c9fa..e51735e8b4577 100644 --- a/pandas/tests/formats/test_css.py +++ b/pandas/tests/formats/test_css.py @@ -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