2525 pd_timestamp = pd .tslib .Timestamp
2626
2727
28- class StyleFrame ( object ) :
28+ class StyleFrame :
2929 """
3030 A wrapper class that wraps a :class:`pandas.DataFrame` object and represent a stylized dataframe.
3131 Stores container objects that have values and styles that will be applied to excel
@@ -142,7 +142,6 @@ def _get_column_as_letter(self, sheet, column_to_convert, startcol=0):
142142 return column_as_letter
143143
144144 @classmethod
145- @deprecated_kwargs (('sheetname' ,))
146145 def read_excel (cls , path , sheet_name = 0 , read_style = False , use_openpyxl_styles = False ,
147146 read_comments = False , ** kwargs ):
148147 """
@@ -154,6 +153,8 @@ def read_excel(cls, path, sheet_name=0, read_style=False, use_openpyxl_styles=Fa
154153 :param sheetname:
155154 .. deprecated:: 1.6
156155 Use ``sheet_name`` instead.
156+ .. versionchanged:: 4.0
157+ Removed
157158 :param sheet_name: The sheet name to read. If an integer is provided then it be used as a zero-based
158159 sheet index. Default is 0.
159160 :type sheet_name: str or int
@@ -229,7 +230,6 @@ def _read_style():
229230
230231 sf ._columns_width [col_name ] = sheet .column_dimensions [sf ._get_column_as_letter (sheet , col_name )].width
231232
232- sheet_name = kwargs .pop ('sheetname' , sheet_name )
233233 header_arg = kwargs .get ('header' , 0 )
234234 if read_style and isinstance (header_arg , Iterable ):
235235 raise ValueError ('Not supporting multiple index columns with read style.' )
@@ -308,8 +308,14 @@ def read_excel_as_template(cls, path, df, use_df_boundaries=False, **kwargs):
308308
309309 # noinspection PyPep8Naming
310310 @classmethod
311- def ExcelWriter (cls , path ):
312- return pd .ExcelWriter (path , engine = 'openpyxl' )
311+ def ExcelWriter (cls , path , ** kwargs ):
312+ """
313+ A shortcut for :class:`pandas.ExcelWriter`, and accepts any argument it accepts except for ``engine``
314+ """
315+
316+ if 'engine' in kwargs :
317+ raise ValueError ('`engine` argument for StyleFrame.ExcelWriter can not be set' )
318+ return pd .ExcelWriter (path , engine = 'openpyxl' , ** kwargs )
313319
314320 @property
315321 def row_indexes (self ):
@@ -439,6 +445,12 @@ def get_range_of_cells(row_index=None, columns=None):
439445 index_name_cell .style = self ._index_header_style .to_openpyxl_style ()
440446 for row_index , index in enumerate (self .data_df .index ):
441447 try :
448+ date_time_types_to_formats = {pd_timestamp : index .style .date_time_format ,
449+ dt .datetime : index .style .date_time_format ,
450+ dt .date : index .style .date_format ,
451+ dt .time : index .style .time_format }
452+ index .style .number_format = date_time_types_to_formats .get (type (index .value ),
453+ index .style .number_format )
442454 style_to_apply = index .style .to_openpyxl_style ()
443455 except AttributeError :
444456 style_to_apply = index .style
@@ -460,6 +472,13 @@ def get_range_of_cells(row_index=None, columns=None):
460472 # openpyxl's rows and cols start from 1,1 while the dataframe is 0,0
461473 for col_index , column in enumerate (self .data_df .columns ):
462474 try :
475+ date_time_types_to_formats = {pd_timestamp : column .style .date_time_format ,
476+ dt .datetime : column .style .date_time_format ,
477+ dt .date : column .style .date_format ,
478+ dt .time : column .style .time_format }
479+
480+ column .style .number_format = date_time_types_to_formats .get (type (column .value ),
481+ column .style .number_format )
463482 style_to_apply = column .style .to_openpyxl_style ()
464483 except AttributeError :
465484 style_to_apply = Styler .from_openpyxl_style (column .style , [],
@@ -472,7 +491,7 @@ def get_range_of_cells(row_index=None, columns=None):
472491 if hasattr (column .style , 'comment' ) and column .style .comment is not None :
473492 column_header_cell .comment = column .style .comment
474493 for row_index , index in enumerate (self .data_df .index ):
475- current_cell = sheet .cell (row = row_index + startrow + 2 , column = col_index + startcol + 1 )
494+ current_cell = sheet .cell (row = row_index + startrow + ( 2 if header else 1 ) , column = col_index + startcol + 1 )
476495 data_df_style = self .data_df .at [index , column ].style
477496 try :
478497 if '=HYPERLINK' in str (current_cell .value ):
@@ -483,6 +502,13 @@ def get_range_of_cells(row_index=None, columns=None):
483502 data_df_style .wrap_text = False
484503 data_df_style .shrink_to_fit = False
485504 try :
505+ date_time_types_to_formats = {pd_timestamp : data_df_style .date_time_format ,
506+ dt .datetime : data_df_style .date_time_format ,
507+ dt .date : data_df_style .date_format ,
508+ dt .time : data_df_style .time_format }
509+
510+ data_df_style .number_format = date_time_types_to_formats .get (type (self .data_df .at [index ,column ].value ),
511+ data_df_style .number_format )
486512 style_to_apply = data_df_style .to_openpyxl_style ()
487513 except AttributeError :
488514 style_to_apply = Styler .from_openpyxl_style (data_df_style , [],
@@ -596,12 +622,6 @@ def apply_style_by_indexes(self, indexes_to_style, styler_obj, cols_to_style=Non
596622 elif isinstance (indexes_to_style , Container ):
597623 indexes_to_style = pd .Index ([indexes_to_style ])
598624
599- default_number_formats = {pd_timestamp : utils .number_formats .default_date_time_format ,
600- dt .date : utils .number_formats .default_date_format ,
601- dt .time : utils .number_formats .default_time_format }
602-
603- orig_number_format = styler_obj .number_format
604-
605625 if cols_to_style is not None and not isinstance (cols_to_style , (list , tuple , set )):
606626 cols_to_style = [cols_to_style ]
607627 elif cols_to_style is None :
@@ -613,18 +633,9 @@ def apply_style_by_indexes(self, indexes_to_style, styler_obj, cols_to_style=Non
613633 style_to_apply = Styler .combine (self ._default_style , styler_obj )
614634
615635 for index in indexes_to_style :
616- if orig_number_format == utils .number_formats .general :
617- style_to_apply .number_format = default_number_formats .get (type (index .value ),
618- utils .number_formats .general )
619636 index .style = style_to_apply
620-
621637 for col in cols_to_style :
622- cell = self .iloc [self .index .get_loc (index ), self .columns .get_loc (col )]
623- if orig_number_format == utils .number_formats .general :
624- style_to_apply .number_format = default_number_formats .get (type (cell .value ),
625- utils .number_formats .general )
626-
627- cell .style = style_to_apply
638+ self .iloc [self .index .get_loc (index ), self .columns .get_loc (col )].style = style_to_apply
628639
629640 if height :
630641 # Add offset 2 since rows do not include the headers and they starts from 1 (not 0).
0 commit comments