python 在excel檔案中寫入date日期資料,以及讀取excel日期資料,如何在python中正確顯示date日期。
如何通過python寫入date資料了?
寫入還是很簡單的。
import xlwt3
import datetime as dt
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('Sheet1')
worksheet.write(0, 0, dt.date.today())
workbook.save('test.xls')
檢視一下,確實寫入了,但變成了一個數字。怎麼回事了,原來excel儲存日期採用的是float型別儲存。
檢視worksheet.write:
Help on method write in module xlwt3.worksheet:
write(self, r, c, label=b'', style=<xlwt3.style.XFStyle object>) method of xlwt3
.worksheet.Worksheet instance
太簡單了,label是什麼?
只能檢視原始碼了:
def write(self, r, c, label=b"", style=style.default_style):
self.row(r).write(c, label, style)
繼續挖掘:
def write(self, col, label, style=style.default_style):
self.__adjust_height(style)
self.__adjust_bound_col_idx(col)
style_index = self.__parent_wb.add_style(style)
if isinstance(label, str):
if len(label) > 0:
self.insert_cell(col,
StrCell(self.__idx, col, style_index, self.__parent_wb.add_str(label))
)
else:
self.insert_cell(col, BlankCell(self.__idx, col, style_index))
elif isinstance(label, bool): # bool is subclass of int; test bool first
self.insert_cell(col, BooleanCell(self.__idx, col, style_index, label))
elif isinstance(label, (float, int, Decimal)):
self.insert_cell(col, NumberCell(self.__idx, col, style_index, label))
elif isinstance(label, (dt.datetime, dt.date, dt.time)):
date_number = self.__excel_date_dt(label)
self.insert_cell(col, NumberCell(self.__idx, col, style_index, date_number))
elif label is None:
self.insert_cell(col, BlankCell(self.__idx, col, style_index))
elif isinstance(label, formula.Formula):
self.__parent_wb.add_sheet_reference(label)
self.insert_cell(col, FormulaCell(self.__idx, col, style_index, label))
else:
raise Exception("Unexpected data type %r" % type(label))
原來:
elif isinstance(label, (dt.datetime, dt.date, dt.time)):
date_number = self.__excel_date_dt(label)
self.insert_cell(col, NumberCell(self.__idx, col, style_index, date_number))
label的數值,會先進行判斷,然後進行處理。
這樣,只需要設定一下style就可以了!
dateFormat = xlwt.XFStyle()
dateFormat.num_format_str = 'yyyy/mm/dd'
worksheet.write(0, 0, dt.date.today(),dateFormat)
workbook.save('test.xls')
搞定。
注意一下:
python的date 和excel的date是不一樣的。
實驗一下:
dt.date.today().toordinal()##2015/6/19
735768
讀取一下excel的數值了?
import xlrd
worksheetRead = xlrd.open_workbook('test.xls')
sheetRead=Rd.sheet_by_index(0)
sheetRead.cell(0,0).value
42174
差別真不小!!
WHY?
原來:python是從公元1年1月1日開始的天數轉換 的!
excel是從1899年12月 31號開始的。
做一個函式轉換一下即可:
__s_date = dt.date (1899, 12, 31).toordinal() - 1
def getdate(date ):
if isinstance(date , float ):
date = int(date )
d = dt.date .fromordinal(__s_date + date )
return d
ok,over!!