python 在excel文件中写入date日期数据,以及读取excel日期数据,如何在python中正确显示date日期。

来源:互联网 发布:linux查看所有进程命令 编辑:程序博客网 时间:2024/05/17 04:31

如何通过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!!

 

 

 

 

0 0
原创粉丝点击