xlrd、xlwt

xlrd

xlrd是用來從Excel中讀寫數據的。用xlrd進行讀取比較方便,流程和平常手動操作Excel一樣,打開工作簿(Workbook),選擇工作表(sheets),然後操作單元格(cell)。下面舉個例子,例如要打開當前目錄下名爲”data.xlsx”的Excel文件,選擇第一張工作表,讀取第一行的全部內容並打印出來。Python代碼如下:

#打開excel文件
data=xlrd.open_workbook('data.xlsx')
#獲取第一張工作表(通過索引的方式)
table=data.sheets()[0] #data_list用來存放數據
data_list=[] #將table中第一行的數據讀取並添加到data_list中
data_list.extend(table.row_values(0))
#打印出第一行的全部數據
for item in data_list:
print item

上面的代碼中讀取一行用table.row_values(number),類似的讀取一列用table.column_values(number),其中number爲行索引,在xlrd中行和列都是從0開始索引的,因此Excel中最左上角的單元格A1是第0行第0列。

xlrd中讀取某個單元格用table.cell(row,col)即可,其中row和col分別是單元格對應的行和列。

下面簡單歸納一下xlrd的用法

xlrd用法總結

data=xlrd.open_workbook(filename)#打開Excel工作簿
data.sheet_names()#查看工作簿中所有sheet的名稱

選擇某一個工作表(通過索引或表名稱)

table=data.sheets()[0]#獲取第一個工作表
table=data.sheet_by_index(0)#通過索引獲取第一個工作表
table=data.sheet_by_name(u'哈哈')#通過表名稱選擇工作表

獲取表格的行數和列數

nrows=table.nrows
ncols=table.ncols

獲取整行和整列的值

table.row_values(number)
table.column_values(number)

通過循環讀取表格的所有行

for rownum in xrange(table.nrows):
print table.row_values(rownum)

獲取單元格的值


cell_A1=table.row(0)[0].value
#或者像下面這樣
cell_A1=table.cell(0,0).value
#或者像下面這樣通過列索引
cell_A1=table.col(0)[0].value

 

xlwt

如果說xlrd不是一個單純的Reader(如果把xlrd中的後兩個字符看成Reader,那麼xlwt後兩個字符類似看成Writer),那麼xlwt就是一個純粹的Writer了,因爲它只能對Excel進行寫操作。

xlwt常用操作

新建一個Excel文件(只能通過新建寫入)

data=xlwt.Workbook()

新建一個工作表

table=data.add_sheet('name')

寫入數據到A1單元格

table.write(0,0,u'呵呵')

注意:如果對同一個單元格重複操作,會引發overwrite Exception,想要取消該功能,需要在添加工作表時指定爲可覆蓋,像下面這樣

table=data.add_sheet('name',cell_overwrite_ok=True)
保存文件
data.save('test.xls')

這裏只能保存擴展名爲xls的,xlsx的格式不支持

xlwt支持一定的樣式,操作如下


#初始化樣式
style=xlwt.XFStyle()

#爲樣式創建字體
font=xlwt.Font()

#指定字體名字
font.name='Times New Roman'

#字體加粗
font.bold=True

#將該font設定爲style的字體
style.font=font

#寫入到文件時使用該樣式
sheet.write(0,1,'just for test',style)

openpyxl

該模塊支持最新版的Excel文件格式,對Excel文件具有響應的讀寫操作,對此有專門的Reader和Writer兩個類,便於對Excel文件的操作。雖然如此,但我一般還是用默認的workbook來進行操作。常用操作歸納如下:

openpyxl常用操作

讀取Excel文件
from openpyxl.reader.excel import load_workbook

wb=load_workbook(filename)

顯示工作表的索引範圍
wb.get_named_ranges()

顯示所有工作表的名字
wb.get_sheet_names()

取得第一張表
sheetnames = wb.get_sheet_names()
ws = wb.get_sheet_by_name(sheetnames[0])

獲取表名
ws.title

獲取表的行數
ws.get_highest_row()

獲取表的列數
ws.get_highest_column()

單元格的讀取,此處和xlrd的讀取方式很相近,都是通過行和列的索引來讀取

當然也支持通過Excel座標來讀取數據,代碼如下

ws.cell("B1").value#讀取B1單元格中的內容

寫文件,只有一種操作方式,就是通過座標。例如要向單元格C1寫數據,就要用類似ws.cell(“C1”).value=something這樣的方式。

一般推薦的方式是用openpyxl中的Writer類來實現。代碼類似下面這樣:

向某個單元格內寫文件時要先知道它對應的行數和列數,這裏注意行數是從1開始計數的,而列則是從字母A開始,因此第一行第一列是A1,這實際上是採用座標方式操作Excel。例如,想向表格的第三行第一列插入一個數值1.2,用xlwt寫就是table.write(2,0,1.2),因爲xlwt中行列索引都從0開始;而如果用openpyxl寫就是ws.cell(“A3”).value=1.2。一般對於一個較大的列數,需要通過get_column_letter函數得到相應的字符,然後再調用cell函數寫入。

下面是我之前寫的一個代碼的一部分,可以用來演示將多位數組保存到Excel文件中。爲了體現多維數組,這裏用到了numpy,另外這裏爲了簡化過程,沒有用ExcelWriter。代碼如下:
 

#coding:utf-8

from openpyxl import Workbook
from openpyxl.cell import get_column_letter

import numpy as np
#生成一個對角陣
a=np.diag([1,2,3,4,5])

#新建一個工作簿
wb=Workbook()
#使用當前激活的工作表(默認就是Excel中的第一張表)
ws=wb.active
#下面是對a的遍歷,注意cell中行和列從1開始,a中索引從0開始。
for row in xrange(1,a.shape[0]+1):
for col in xrange(1,a.shape[1]+1):
col_letter=get_column_letter(col)
ws.cell('%s%s'%(col_letter,row)).value=a[row-1,col-1] wb.save('test.xlsx')

總結

讀取Excel時,選擇openpyxl和xlrd差別不大,都能滿足要求

寫入少量數據且存爲xls格式文件時,用xlwt更方便

寫入大量數據(超過xls格式限制)或者必須存爲xlsx格式文件時,就要用openpyxl了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章