Python處理excel資料
阿新 • • 發佈:2019-01-06
目錄
A Excel資料的型別及組織方式
每一個Excel資料檔案從上至下分為三個層級的物件
workbook: 每一個Excel檔案就是一個workbook
sheet: 每一個workbook中可以包含多個sheet,具體就對應Excel中我們在左下腳所看到的“sheet1”,“sheet2”等
cell: 每一個sheet就是我們通常所看到的一個表格,可以含有m行,n列,每個確定的行號,列號所對應的一個格子就是一個cell
B 從Excel中讀取資料
從一個既有的xlsx檔案中讀取資料,按照Excel檔案的三個層級,分別做以下三個步驟
- 開啟workbook:
import xlrd
book = xlrd.open_workbook("myfile.xls") #book就賦值為一個Excel檔案了
Book 類的方法、屬性等:即就可以對上面的book進行操作了
book.nsheets: 在Book物件中的檔案有多少個worksheet
book.sheet_by_index(sheetx): 根據提供的sheetx索引來獲取我們需要的sheet表,返回的是一個Sheet類的例項。
book.sheet_by_name(sheet_name): 根據提供的sheet_name來獲取對應名稱的sheet類物件,返回的也是一個Sheet類的物件
book.sheet_names(): 在Book物件中的所有sheet表的名稱列表
book.sheets(): 返回在Book物件中所有的Sheet物件例項列表
- 開啟所需的sheet:
sh = book.sheet_by_index(0) #獲得一個sheet,也可以使名字獲得
print sh.name, sh.nrows, sh.ncols
Sheet類方法、屬性等:
sh.cell(rowx, colx): 根據給出的行和列的引數獲取得到cell類,返回一個Cell類例項物件
sh.cell_type(rowx, colx): 返回對應的cell物件的Type型別
sh.cell_value(rowx, colx): 返回對應的cell物件的value值
sh.col(colx): 返回指定列的所有cell類物件序列
sh.name: 返回sheet物件的名稱
sh.ncols: 返回在sheet物件中的列的數目
sh.nrows: 返回在sheet物件中的行的數目
sh.row(rowx): 返回指定的行的所有cell物件的序列
- 獲取對應cell的值:
cell=sh.cell(rowx=29, colx=3) #根據給出的行和列的引數獲取得到cell類,返回一個Cell類例項物件
sh.cell_value(rowx=29, colx=3)
Cell類的屬性、方法如下:
Cell類物件有3種屬性:ctype, value, xf_index
如果在excel檔案開啟的時候,formatting_info未啟用的時候,xf_index是為None
下面列出了cell的型別,以及他們在python中所代表的值
type symbol type number python value
XL_CELL_EMPTY 0 空的字串''
XL_CELL_TEXT 1 unicode字串
XL_CELL_NUMBER 2 float
XL_CELL_DATE 3 float
XL_CELL_BOOLEAN 4 int;1 --- True,0 --- False
XL_CELL_ERROR 5 int代表是一個excel內部錯誤碼;
XL_CELL_BLANK 6 空的字串'', 注意:這個型別僅僅會出現,當函式open_workbook(..,formatting_info=True)這樣設定的時候
- 一個讀取Excel的例子
import xlrd
book = xlrd.open_workbook("myfile.xls")
print "The number of worksheets is", book.nsheets
print "Worksheet name(s):", book.sheet_names()
sh = book.sheet_by_index(0)
print sh.name, sh.nrows, sh.ncols
print "Cell D30 is", sh.cell_value(rowx=29, colx=3)
for rx in range(sh.nrows):
print sh.row(rx)
C Writing Excel Files
All the examples shown below can be found in the xlwt directory of the course material.讀Excel xlrd模組,寫用xlwt模組
- Creating elements within a Workbook建立一個Excel檔案
Import xlwt
wb=xlwt.Workbook(“zc.xls”) #Workbook 首字母大寫
Worksheets 新增Sheet
Worksheets are created with the add_sheet method of the Workbook class.
To retrieve an existing sheet from a Workbook, use its get_sheet method. This method is particularly useful when the Workbook has been instantiated by xlutils.copy.
Sheet1=wb.add_sheet(“sheetname”)
- Rows and Columns 行與列的表示:
row1 = sheet1.row(1)
col0=sheet2.col(0)
- Cells
Cells can be written using either the write method of either the Worksheet or Row class.
sheet1.write(0,1,'B1')
row1.write(0,'A2')
- svave 儲存檔案:
wb.save(“zc.xls”)
- Excel寫入的一個簡單的例子
from xlwt import Workbook
book = Workbook()
sheet1 = book.add_sheet('Sheet 1') #新增一個sheet
book.add_sheet('Sheet 2')
sheet1.write(0,0,'A1') #通過sheet新增cell值
sheet1.write(0,1,'B1')
row1 = sheet1.row(1)
row1.write(0,'A2') #還可以通過row屬性新增cell值
row1.write(1,'B2')
sheet1.col(0).width = 10000
sheet2 = book.get_sheet(1)
sheet2.row(0).write(0,'Sheet 2 A1') #又一種新增
sheet2.row(0).write(1,'Sheet 2 B1')
sheet2.flush_row_data()
sheet2.write(1,0,'Sheet 2 A3')
sheet2.col(0).width = 5000
sheet2.col(0).hidden = True
book.save('simple.xls')
D 稍微複雜的例子和鞏固
Ex1:
import xlrd
fname = "sample.xls" #一個檔案路徑和檔名
bk = xlrd.open_workbook(fname) #開啟一個workbook
shxrange = range(bk.nsheets) #各個sheet之間的轉換?
try: #提取sheet1?
sh = bk.sheet_by_name("Sheet1")
except:
print "no sheet in %s named Sheet1" % fname
return None
nrows = sh.nrows
ncols = sh.ncols
print "nrows %d, ncols %d" % (nrows, ncols)
cell_value = sh.cell_value(1,1)
print cell_value
row_list = []
for i in range(1, nrows):
row_data = sh.row_values(i)
row_list.append(row_data)
Ex2:
import xlrd
import xlwt
class OperExcel():
#讀取Excel表
def rExcel(self,inEfile,outfile):
rfile = xlrd.open_workbook(inEfile)
#建立索引順序獲取一個工作表
table = rfile.sheet_by_index(0)
#其他方式
#table = rfile.sheets()[0]
#table = rfile.sheet_by_name(u'Sheet1')
#獲取整行,整列的值
table.row_values(0)
table.col_values(0)
#獲取行數和列數
nrows = table.nrows - 1
ncols = table.ncols
#迴圈獲取列表的資料
#for i in range(nrows):
# print table.row_values(i)
wfile = open(outfile,'w')
#獲取第一列中的所有值
for i in range(nrows):
#table.cell(i,0).value獲取某一單元格的值
wfile.write(table.cell(i,0).value.encode('utf8') + '\n')
wfile.close()
#將資料寫入Excel表
def wExcel(self,infile,outEfile):
rfile = open(infile,'r')
buf = rfile.read().split('\n')
rfile.close()
w = xlwt.Workbook()
sheet = w.add_sheet('sheet1')
for i in range(len(buf)):
print buf[i]
sheet.write(i,0,buf[i].decode('utf8'))
w.save(outEfile)
if __name__ == '__main__':
t = OperExcel()
t.rExcel('test.xls','test')
t.wExcel('test','1.xls')
E 實戰
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 23 10:40:56 2016
@author: Dikea
"""
import xlrd
from xlwt import Workbook
#讀入excel表
book = xlrd.open_workbook("50ETF.xlsx")
sh = book.sheet_by_index(0)
#新建一個excel表
book = Workbook()
sheet1 = book.add_sheet('Sheet 1', cell_overwrite_ok=True) #新增一個sheet
row = 1
cnt = 1
i = 1
while i < sh.nrows:
#判斷是否讀到最後一行,讀入value值為空,即是最後一行
if sh.cell(i, 0).value == '':
break
#判斷左右的日期時間是否相等
while sh.cell(i, 0).value < sh.cell(row, 2).value:
i = i + 1
while sh.cell(i, 0).value > sh.cell(row, 2).value:
row = row + 1
#寫入新建的excel表
for k in range(0, 4):
if k < 2:
sheet1.write(cnt, k, sh.cell(i, k).value)
else:
sheet1.write(cnt, k, sh.cell(row, k).value)
i = i + 1
cnt = cnt + 1
#儲存新建的excel表
book.save('DataAfterDeal.xls')