1. 程式人生 > >python 在excel檔案中寫入date日期資料,以及讀取excel日期資料,如何在python中正確顯示date日期。

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!!