1. 程式人生 > >python操作Excel的datetime資料

python操作Excel的datetime資料

背景:朋友不會Excel也不會程式語言,對Excel又有些很複雜的操作要求,問我會不會。
我當然不會EXCEL,也懶得去學vba的語法,於是我想到了用python給他來做一個小工具來解決他的問題。

這裡來討論下python處理datetime格式時,遇到的大坑,以及解決辦法。

模擬需求

我們有兩張表格,分別叫:混合資料.xlsx,固定部分,xlsx

                    混合資料.xlsx
序號 | 日期 | 金額 | 經手人| 過手人
----|------|------|------|------
1 | 2016/9/18 | 9.88 | 張三3 | A
2 | 2016/9/19 | 10.88| 張三  | B
3 | 2016/9/20 | 11.88| 張三  | A


                    基礎資料.xlsx
序號 
----
1 
3

現在我們需要根據基礎資料中的序列號,對混合資料進行篩選,得到如下表格:

                        new_混合資料.xlsx
序號 | 日期 | 金額 | 經手人| 過手人 | 是否包含
----|------|------|------|------|------
1 | 2016/9/18 | 9.88  | 張三3 | A | 是
2 | 2016/9/19  | 10.88| 張三  | B | 否
3 | 2016/9/20  | 11.88| 張三  | A | 是

新生成的表格對重合的序號進行了”標紅,加粗”,並且新生成了一列”是否包含”

程式碼部分

#!/usr/bin/env python
# -*- coding: utf-8 -*- from xlrd import open_workbook, xldate from xlutils.copy import copy import xlwt def edit_excel(filename, base_id=[]): font0 = xlwt.Font() font0.name = 'Times New Roman' font0.colour_index = 2 # 紅色 font0.bold = True style0 = xlwt.XFStyle() style0.font = font0 style1 = xlwt.XFStyle() style1.num_format_str = 'YYYY/MM/DD'
# 對日期格式的處理 rb = open_workbook(filename) # rb_cols_len = rb.sheet_by_index(0).ncols # 原表的列數 wb = copy(rb) ws = wb.get_sheet(0) table = rb.sheets()[0] for row_number in range(table.nrows): if row_number == 0: ws.write(0, 5, u"是否包含", style0) # 新增一列 else: if table.row_values(row_number)[0] in base_id: ws.write(row_number, 0, table.row_values(row_number)[0], style0) # 這個地方需要改一個顏色 ws.write(row_number, 5,u'是', style0) # 給新增的列新增內容 else: ws.write(row_number, 5,u'否') # 給新增的列新增內容 ws.write(row_number, 1, xldate.xldate_as_datetime(table.row_values(row_number)[1], 0), style1) # 這個地方需要寫成日期格式 # wb.save(filename)#覆蓋原檔案 wb.save('new_' + filename) # 可以把檔案儲存為另外的名字,原檔案不會改變 print 'ok' def get_excel_base_ids(base_filename): data = open_workbook(base_filename) # 開啟xls檔案 base_id = [] table = data.sheets()[0] # 開啟第一張表 for i in range(table.nrows): # 按行迴圈 if i: # 跳過第一行 base_id.append(table.row_values(i)[0]) return base_id # print get_base_ids(u'固定部分.xlsx') print edit_excel(u'混合資料.xlsx', get_excel_base_ids(u'固定部分.xlsx'))

datetime的解決辦法

混合資料的表中有個日期:2016/9/18

通過table.row_values(row_number)[1]讀取時,顯示的結果為:42631.0

檢視row_values方法的原始碼:

def row_values(self, rowx, start_colx=0, end_colx=None):
        if end_colx is None:
            return self._cell_values[rowx][start_colx:]
        return self._cell_values[rowx][start_colx:end_colx]

也就是說返回了self._cell_values,self._cell_values在原始碼中的定義為:self._cell_values = [],這就是問題的根源

第一種解決辦法:

xldate.xldate_as_datetime把日期轉換回來
xldate.xldate_as_datetime(table.row_values(row_number)[1], 0)

第二種解決辦法:

先用xldate.xldate_as_tuple(table.row_values(row_number)[1],0)

顯示結果為:(2016, 9, 27, 0, 0, 0)

xldate_as_tuple原始碼部分:

# @param datemode 0: 1900-based, 1: 1904-based.
    xldate_as_tuple(xldate, datemode) 

最後再用datetime.datetime(2016, 9, 27, 0, 0, 0)把日期轉回來