python+excel=openpyxl(一)
原計劃寫(xiě)一個(gè)openpyxl的操作文檔,普及下python如何來(lái)操作excel,結果人家官方的文檔已經(jīng)寫(xiě)的非常完美了,就臨時(shí)改主意把人家的文檔翻譯了一遍??梢蚤喿x英文文檔的同學(xué),建議大家直接去看官方的API操作文檔
官網(wǎng)地址:Openpyxl
創(chuàng )建一個(gè)excel文件
使用openpyxl模塊工作時(shí),我們并需要在系統文件中創(chuàng )建一個(gè)excel文件。只需要導入Workbook類(lèi)就可以了:
from openpyxl import Workbook
wb = Workbook()
一個(gè)excel文件總是會(huì )自動(dòng)創(chuàng )建至少一張表,也就是所謂的sheet
你可以通過(guò)使用命令Workbook對象名.active來(lái)獲取這張sheet
ws = wb.active
注意:active默認獲取下標0的表。除非你自行指定了下標,否則你將永遠都只能獲取到第一張表。
你可以使用命令Workbook對象.create_sheet()來(lái)創(chuàng )建sheet表單:
ws1 = wb.create_sheet("Mysheet") # insert at the end (default)
# or
ws2 = wb.create_sheet("Mysheet", 0) # insert at first position
# or
ws* = wb.create_sheet("Mysheet", -1) # insert at the penultimate position
自行創(chuàng )建的sheet表單都會(huì )自動(dòng)的生成一個(gè)名字。類(lèi)似與sheet、sheet1、sheet2…你隨時(shí)都可以修改這個(gè)名字,只要通過(guò)屬性title:
wb.title = ‘new title’
默認情況下,改標題表單下的表格是白色的。你可以通過(guò)屬性:表單對象.sheet_properties.tabColor來(lái)設置
ws.sheet_properties.tabColor = "1072BA"
一旦你定義了sheet表單的標題之后,你就可以將其作為workbook對象的key來(lái)進(jìn)行調用:
ws* = wb["New Title"]
通過(guò)sheetname屬性你可以瀏覽workbook對象下所有sheet表單的標題
print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
你也可以循環(huán)遍歷所有的sheet表單
for sheet in wb:
... print(sheet.title)
你可以在當前文件中,創(chuàng )建sheet表單的副本
source = wb.active
target = wb.copy_worksheet(source)
注意:
只有單元格(包括值、樣式、超鏈接和注釋?zhuān)┖湍承┍砀窆ぷ鲗傩裕òǔ叽?、格式和屬性)。不能復制所有其他文?表單的屬性,比如:圖像、圖表
也不能在工作簿之間賦值sheet表。如果工作簿是只讀或者只寫(xiě)的模式,那么你也不能賦值它。
操作數據
訪(fǎng)問(wèn)一個(gè)單元格
現在我們已經(jīng)知道了如何取獲取一個(gè)sheet表單,現在可以開(kāi)始修改表單中單元格的內容了。單元格可以作為表單的key來(lái)直接訪(fǎng)問(wèn)
c = ws['A*']
上面命令將會(huì )返回A*單元格,如果A*不存在的話(huà),那命令執行完成之后會(huì )自動(dòng)創(chuàng )建一個(gè)??梢灾苯舆M(jìn)行賦值操作
ws['A*'] = *
openpyxl也提供了cell()函數。
這個(gè)函數可以通過(guò)行和列更精確的訪(fǎng)問(wèn)單元格
d = ws.cell(row=*, column=2, value=10)
注意:
內存中的sheet表不存在任何的單元格。所有你操作的單元格都是在訪(fǎng)問(wèn)的同時(shí)創(chuàng )建的正是由于此特性,所以即使你沒(méi)有給他們分配值,也可以通過(guò)滾動(dòng)的瀏覽的方式在內存中創(chuàng )建單元格
類(lèi)似于下列方法
for x in range(1,101):
... for y in range(1,101):
... ws.cell(row=x, column=y)
這個(gè)代碼塊將會(huì )創(chuàng )建一個(gè)100*100的單元格,但沒(méi)有什么實(shí)際意義
訪(fǎng)問(wèn)多個(gè)單元格
可以通過(guò)切片來(lái)訪(fǎng)問(wèn)多個(gè)單元格
cell_range = ws['A1':'C2']
也可以使用類(lèi)似的方法來(lái)獲取行或者列的范圍
colC = ws['C']
col_range = ws['C:D']
row10 = ws[10]
row_range = ws[*:10]
你也可以使用iter_row()方法:
for row in ws.iter_rows(min_row=1, max_col=*, max_row=2):
... for cell in row:
... print(cell)
Cell Sheet1.A1
Cell Sheet1.B1
Cell Sheet1.C1
Cell Sheet1.A2
Cell Sheet1.B2
Cell Sheet1.C2
同樣使用iter_cols()方法可以返回列:
for col in ws.iter_cols(min_row=1, max_col=*, max_row=2):
... for cell in col:
... print(cell)
Cell Sheet1.A1
Cell Sheet1.A2
Cell Sheet1.B1
Cell Sheet1.B2
Cell Sheet1.C1
Cell Sheet1.C2
注意:
出于性能原因,Worksheet.iter_cols()方法在只讀模式下不可用。
如果你需要遍歷所有的行或者列的話(huà),你可以使用row屬性或者columns屬性
ws = wb.active
ws['C9'] = 'hello world'
tuple(ws.rows)
((Cell Sheet.A1, Cell Sheet.B1, Cell Sheet.C1),
(Cell Sheet.A2, Cell Sheet.B2, Cell Sheet.C2),
(Cell Sheet.A*, Cell Sheet.B*, Cell Sheet.C*),
(Cell Sheet.A*, Cell Sheet.B*, Cell Sheet.C*),
(Cell Sheet.A*, Cell Sheet.B*, Cell Sheet.C*),
(Cell Sheet.A*, Cell Sheet.B*, Cell Sheet.C*),
(Cell Sheet.A7, Cell Sheet.B7, Cell Sheet.C7),
(Cell Sheet.A*, Cell Sheet.B*, Cell Sheet.C*),
(Cell Sheet.A9, Cell Sheet.B9, Cell Sheet.C9))
tuple(ws.columns)
((Cell Sheet.A1,
Cell Sheet.A2,
Cell Sheet.A*,
Cell Sheet.A*,
Cell Sheet.A*,
Cell Sheet.A*,
Cell Sheet.B7,
Cell Sheet.B*,
Cell Sheet.B9),
(Cell Sheet.C1,
Cell Sheet.C2,
Cell Sheet.C*,
Cell Sheet.C*,
Cell Sheet.C*,
Cell Sheet.C*,
Cell Sheet.C7,
Cell Sheet.C*,
Cell Sheet.C9))
注意:
處于性能原因的考慮,columns屬性在只讀模式下不可以用
僅獲取單元格的值
如果你只是想獲取sheet表單中的值的話(huà),可以使用屬性valus。這將遍歷工作表中所有的行,但僅返回單元格的值
for row in ws.values:
for value in row:
print(value)
iter_rows()和iter_cols()函數通過(guò)參數 values_only也都可以之返回值
for row in ws.iter_rows(min_row=1, max_col=*, max_row=2, values_only=True):
... print(row)
(None, None, None)
(None, None, None)
數據存儲
一旦我們有了一個(gè)單元格之后,我們可以指定它的值
c.value = 'hello, world'
print(c.value)
'hello, world'
d.value = *.1*
print(d.value)
*.1*
保存到文件
最簡(jiǎn)單以及最安全的用來(lái)保存workbook的方法,是通過(guò)使用workbook類(lèi)對象的save()方法
wb = Workbook()
wb.save('balances.xlsx')
注意:
此操作將會(huì )重寫(xiě)已存在的文件內容,并且不會(huì )給出警告
文件名擴展名不是強制為xlsx或xlsm,如果你不使用官方擴展名,那你可能無(wú)法通過(guò)其他應用程序直接打開(kāi)此文件。
由于OOXML文件基本上是ZIP文件,因此您也可以使用自己喜歡的ZIP存檔管理器將其打開(kāi)。
存儲為流
如果你想將文件保存到流對象中,比如,在你使用一些像Pyramid、Flask或者Django這樣的web框架時(shí),你只需要通過(guò)一個(gè)NameTemporaryFile()對象
from tempfile import NamedTemporaryFile
from openpyxl import Workbook
wb = Workbook()
with NamedTemporaryFile() as tmp:
wb.save(tmp.name)
tmp.seek(0)
stream = tmp.read()
你可以設置屬性template=True,將workbook對象保存為一個(gè)模板
wb = load_workbook('document.xlsx')
wb.template = True
wb.save('document_template.xltx')
或者將屬性設置為False(默認值),將workbook對象保存為一個(gè)文件
wb = load_workbook('document_template.xltx')
wb.template = False
wb.save('document.xlsx', as_template=False)
加載已有的文件
與創(chuàng )建文件相同,通過(guò)openpyxl.load_workbook()可以打開(kāi)一個(gè)現有的文件
from openpyxl import load_workbook
wb2 = load_workbook('test.xlsx')
print wb2.sheetnames
['Sheet2', 'New Title', 'Sheet1']