python讀寫excel檔案簡單應用

戴上聖誕帽我還是一條好漢發表於2020-11-20

本文主要技術要點:

  • 使用xlrd讀取excel檔案
  • 使用xlwd寫入excel檔案
  • excel檔案中時間元素的簡單計算

1.題目要求

根據如下名為時刻表.xlsx的檔案計算每種路線需要的時間,並將結果寫入新檔案:
在這裡插入圖片描述

2.環境配置

安裝需要用到的xlrd和xlwd庫:

$ pip install xlrd xlwt

3.讀取excel檔案

讀取檔案首先需要開啟檔案物件,使用xlrd.open_workbook()函式開啟檔案,該函式返回獲取的檔案物件。因為excel檔案由表組成,我們還需要找到對應的表格才能對錶中的元素進行操作,所以需要通過剛才獲得的檔案物件用成員函式sheet_by_index()找到對應的表,因為檔案中只有一個表,所以下標是0,程式碼如下:

workbook=xlrd.open_workbook('./時刻表.xlsx')
booksheet=workbook.sheet_by_index(0)

根據所需要的“出發時間”和“到達時間”兩列的列號是3和5,我們可以這樣獲得由這兩列元素組成的列表:

col_leave=booksheet.col_values(3)
col_arrive=booksheet.col_values(5)

我們也可以根據“出發時間”和“到達時間”兩個欄位自動找到兩列的列號。具體做法是通過讀取第二行元素,獲得一個包含這兩個欄位的列表,但是如果通過遍歷一次列表找到兩個下標的方法並不優雅,我們就想到可以建立一個列表元素到列表下標的對映,然後再通過兩個欄位直接找到下標:

row_dict=dict(map(reversed,enumerate(booksheet.row_values(1))))
col_leave=booksheet.col_values(row_dict["出發時間"])
col_arrive=booksheet.col_values(row_dict["到達時間"])

4.計算時間差並列印

因為這裡時間元素的格式是excel中自定義的時間格式,我們需要通過xlrd.xldate.xldate_as_datetime函式返回時間物件,通過seconds成員返回該時間以秒為單位的值,通過步驟3中兩個列表對應元素的差生成列表:

col_result=[(xlrd.xldate.xldate_as_datetime(col_arrive[i],0)-\
        xlrd.xldate.xldate_as_datetime(col_leave[i],0)).seconds/3600 for i in range(2,colNumber)]

注意列表中前兩個元素是表頭,不是時間值。

5.將結果寫入excel新檔案

類似之前讀取檔案,我們用下面的程式碼獲得檔案物件進行寫入:

new_workbook=xlwt.Workbook()
sheet1=new_workbook.add_sheet('result',cell_overwrite_ok=True)

這裡cell_overwrite_ok引數相當於open函式裡面的開啟方式是否是’w’,我們選擇True,也就是覆蓋寫的方式,每次開啟檔案的寫入操作都會覆蓋之前的結果。
接下來通過兩層迴圈和sheet.write()函式向表格寫入元素:

for i in range(2):
    for j in range(colNumber-1):
        sheet1.write(j,i,write_result[i][j])

sheet.write函式用到的三個函式分別是寫入單元格行號,寫入單元格列號,用於寫入單元格的元素值,因為我們的列表是2*n的矩陣,所以要成豎排格式需要i和j下標互換。

6.完整程式碼及結果

#pip install xlrd xlwt

import xlrd
import xlwt
from datetime import datetime
 
workbook=xlrd.open_workbook('./時刻表.xlsx')
booksheet=workbook.sheet_by_index(0)

row_dict=dict(map(reversed,enumerate(booksheet.row_values(1))))
col_leave_index=row_dict["出發時間"]
col_arrive_index=row_dict["到達時間"]

col_leave=booksheet.col_values(col_leave_index)
col_arrive=booksheet.col_values(col_arrive_index)
colNumber=len(col_leave)
col_result=[(xlrd.xldate.xldate_as_datetime(col_arrive[i],0)-\
        xlrd.xldate.xldate_as_datetime(col_leave[i],0)).seconds/3600 for i in range(2,colNumber)]

#print time needed
print("各條線路需要時間\n"+"-"*32)
for i in range(0,len(col_result)):
    print("線路序號"+str(i+1)+"需要"+"{}".format(col_result[i])+"小時")

#write a new xls file
new_workbook=xlwt.Workbook()
sheet1=new_workbook.add_sheet('result',cell_overwrite_ok=True)
write_result=[["線路序號"]+[str(i) for i in range(1,colNumber-1)],["所需時間"]+[str(i) for i in col_result]]

for i in range(2):
    for j in range(colNumber-1):
        sheet1.write(j,i,write_result[i][j])

new_workbook.save('result.xls')

寫入的新xls檔案截圖:
在這裡插入圖片描述
命令列列印截圖:
在這裡插入圖片描述

相關文章