@@ -355,6 +355,11 @@ class ExcelWriter(object):
355
355
Engine to use for writing. If None, defaults to
356
356
``io.excel.<extension>.writer``. NOTE: can only be passed as a keyword
357
357
argument.
358
+ date_format : string, default None
359
+ Format string for dates written into Excel files (e.g. 'YYYY-MM-DD')
360
+ datetime_format : string, default None
361
+ Format string for datetime objects written into Excel files
362
+ (e.g. 'YYYY-MM-DD HH:MM:SS')
358
363
"""
359
364
# Defining an ExcelWriter implementation (see abstract methods for more...)
360
365
@@ -429,15 +434,25 @@ def save(self):
429
434
"""
430
435
pass
431
436
432
- def __init__ (self , path , engine = None , ** engine_kwargs ):
433
- # validate that this engine can handle the extnesion
437
+ def __init__ (self , path , engine = None ,
438
+ date_format = None , datetime_format = None , ** engine_kwargs ):
439
+ # validate that this engine can handle the extension
434
440
ext = os .path .splitext (path )[- 1 ]
435
441
self .check_extension (ext )
436
442
437
443
self .path = path
438
444
self .sheets = {}
439
445
self .cur_sheet = None
440
446
447
+ if date_format is None :
448
+ self .date_format = 'YYYY-MM-DD'
449
+ else :
450
+ self .date_format = date_format
451
+ if datetime_format is None :
452
+ self .datetime_format = 'YYYY-MM-DD HH:MM:SS'
453
+ else :
454
+ self .datetime_format = datetime_format
455
+
441
456
def _get_sheet_name (self , sheet_name ):
442
457
if sheet_name is None :
443
458
sheet_name = self .cur_sheet
@@ -518,9 +533,9 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
518
533
style .__getattribute__ (field ))
519
534
520
535
if isinstance (cell .val , datetime .datetime ):
521
- xcell .style .number_format .format_code = "YYYY-MM-DD HH:MM:SS"
536
+ xcell .style .number_format .format_code = self . datetime_format
522
537
elif isinstance (cell .val , datetime .date ):
523
- xcell .style .number_format .format_code = "YYYY-MM-DD"
538
+ xcell .style .number_format .format_code = self . date_format
524
539
525
540
if cell .mergestart is not None and cell .mergeend is not None :
526
541
cletterstart = get_column_letter (startcol + cell .col + 1 )
@@ -585,8 +600,8 @@ def __init__(self, path, engine=None, **engine_kwargs):
585
600
super (_XlwtWriter , self ).__init__ (path , ** engine_kwargs )
586
601
587
602
self .book = xlwt .Workbook ()
588
- self .fm_datetime = xlwt .easyxf (num_format_str = 'YYYY-MM-DD HH:MM:SS' )
589
- self .fm_date = xlwt .easyxf (num_format_str = 'YYYY-MM-DD' )
603
+ self .fm_datetime = xlwt .easyxf (num_format_str = self . datetime_format )
604
+ self .fm_date = xlwt .easyxf (num_format_str = self . date_format )
590
605
591
606
def save (self ):
592
607
"""
@@ -612,9 +627,9 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
612
627
613
628
num_format_str = None
614
629
if isinstance (cell .val , datetime .datetime ):
615
- num_format_str = "YYYY-MM-DD HH:MM:SS"
630
+ num_format_str = self . datetime_format
616
631
if isinstance (cell .val , datetime .date ):
617
- num_format_str = "YYYY-MM-DD"
632
+ num_format_str = self . date_format
618
633
619
634
stylekey = json .dumps (cell .style )
620
635
if num_format_str :
@@ -699,11 +714,14 @@ class _XlsxWriter(ExcelWriter):
699
714
engine = 'xlsxwriter'
700
715
supported_extensions = ('.xlsx' ,)
701
716
702
- def __init__ (self , path , engine = None , ** engine_kwargs ):
717
+ def __init__ (self , path , engine = None ,
718
+ date_format = None , datetime_format = None , ** engine_kwargs ):
703
719
# Use the xlsxwriter module as the Excel writer.
704
720
import xlsxwriter
705
721
706
- super (_XlsxWriter , self ).__init__ (path , engine = engine , ** engine_kwargs )
722
+ super (_XlsxWriter , self ).__init__ (path , engine = engine ,
723
+ date_format = date_format , datetime_format = datetime_format ,
724
+ ** engine_kwargs )
707
725
708
726
self .book = xlsxwriter .Workbook (path , ** engine_kwargs )
709
727
@@ -729,9 +747,9 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
729
747
for cell in cells :
730
748
num_format_str = None
731
749
if isinstance (cell .val , datetime .datetime ):
732
- num_format_str = "YYYY-MM-DD HH:MM:SS"
750
+ num_format_str = self . datetime_format
733
751
if isinstance (cell .val , datetime .date ):
734
- num_format_str = "YYYY-MM-DD"
752
+ num_format_str = self . date_format
735
753
736
754
stylekey = json .dumps (cell .style )
737
755
if num_format_str :
@@ -762,12 +780,16 @@ def _convert_to_style(self, style_dict, num_format_str=None):
762
780
style_dict: style dictionary to convert
763
781
num_format_str: optional number format string
764
782
"""
765
- if style_dict is None :
766
- return None
767
783
768
784
# Create a XlsxWriter format object.
769
785
xl_format = self .book .add_format ()
786
+
787
+ if num_format_str is not None :
788
+ xl_format .set_num_format (num_format_str )
770
789
790
+ if style_dict is None :
791
+ return xl_format
792
+
771
793
# Map the cell font to XlsxWriter font properties.
772
794
if style_dict .get ('font' ):
773
795
font = style_dict ['font' ]
@@ -788,9 +810,6 @@ def _convert_to_style(self, style_dict, num_format_str=None):
788
810
if style_dict .get ('borders' ):
789
811
xl_format .set_border ()
790
812
791
- if num_format_str is not None :
792
- xl_format .set_num_format (num_format_str )
793
-
794
813
return xl_format
795
814
796
815
register_writer (_XlsxWriter )
0 commit comments