當前位置:首頁(yè) > 軟件 > 正文內容

python+excel=openpyxl(一)

廊坊UV印刷2年前 (2022-10-19)軟件27
印刷廠(chǎng)直印●彩頁(yè)1000張只需要69元●名片5元每盒-更多報價(jià)?聯(lián)系電話(huà):138-1621-1622(微信同號)

原計劃寫(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']

收藏0

發(fā)表評論

訪(fǎng)客

看不清,換一張

◎歡迎參與討論,請在這里發(fā)表您的看法和觀(guān)點(diǎn)。
中文字幕在线永久91_国产一级AV不卡毛片_亚洲日本中文字幕在线四区_日韩黄片在线大全