python用openpyxl來操作excel表格

用openpyxl操作excel表格

openpyxl 是一個用來操作excel 2010 的xlsx/xlsm的Python庫。
官方文檔

安裝

pip3 install openpyxl
如果excel表格里面包含圖片,想處理圖片的話,需要安裝pillow
pip3 install Pillow

首先來個例子

from openpyxl import Workbook
wb = Workbook()
# 切換到活動工作表
ws = wb.active
# 數(shù)據(jù)可以直接寫到單元格中
ws['A1'] = 42
# 可以用append添加行
ws.append([1,2,3])
# Python數(shù)據(jù)可以直接轉換
import datetime
ws['A2'] = datetime.datetime.now()
#保存
wb.save('sample.xlsx')

創(chuàng)建一個excel文檔

我們沒必要創(chuàng)建一個文檔來體驗openpyxl,只需要導入Workbook類就可以開始使用openpyxl了。

from openpyxl import Workbook
wb = Workbook()

一個工作薄(workbook)創(chuàng)建之后至少含有一個工作表(worksheet),我們可以用
openpyxl.workbook.Workbook.active()來切換切換為當前使用的工作表。
ws = wb.active

如果有多個worksheet,我們一般是切換到第一個工作表
我們也可以用openpyxl.workbook.Workbook.create_sheet()來創(chuàng)建工作表。

# 創(chuàng)建一個worksheet在最后面的位置(默認創(chuàng)建的工作表會在最后面,除非你指定位置)
ws1 = wb.create_sheet("mysheet1")
#創(chuàng)建一個工作表在最前面的位置,注意編號
ws2 = wb.create_sheet("mysheet",0)

當然我們也可以更改worksheet的名字用 title 屬性
ws.title = "New Title"
默認的標簽顏色是白色的,我們也可以用tabColor屬性更改標簽顏色,顏色格式為RRGGBB
ws.sheet_properties.tabColor = "1072BA"
當然,如果你更改了工作表(worksheet)的名字,你可以用切換過去
ws = wb["New Title"]
你可以用openpyxl.workbook.Workbook.sheetnames()來查看所有工作表名。
print(wb.sheetnames)
當然,你也可以遍歷一下

for sheet in wb:
    print(sheet.title)

我們可以用openpyxl.workbook.Workbook.copy_worksheet()來復制工作表

source = wb.active
target = wb.copy_worksheet(source)

只可以復制單元格和樣式,無法在工作薄之間復制單元格。

數(shù)據(jù)操作

編輯一個單元格

我們已經(jīng)知道了如何訪問工作表(worksheet),下面我們就可以修改單元格內(nèi)容了。
我們可以直接得到單元格內(nèi)容
c = ws["A4"]
也可以直接修改單元格內(nèi)容
ws["A4"] = 4
有workbook方法,當然也有worksheet方法
openpyxl.worksheet.Worksheet.cell()
它提供了通過行和列來操作單元格的操作方式
d = ws.cell(row = 4, column = 2, value = 10)

當一個工作表在內(nèi)存中被創(chuàng)建出來的時候,實際上里面是沒有單元格的,單元格實在我們第一次訪問的時候才被創(chuàng)建的。

我們只要訪問單元格,即使不給單元格寫入具體內(nèi)容,單元格也會被創(chuàng)建,即只要訪問了,就會被創(chuàng)建。例如

for i in range(1,101):
   for j in range(1,101):
       ws.cell(row = i ,column = j)

這樣會創(chuàng)建100*100個單元格,當然,里面什么內(nèi)容都沒有

編輯多個單元格

我們可以用切片來訪問一個單元格范圍
cell_range = ws["A1":"C2"]
行和列我們也可以用類似的方法得到

colc = ws["C"]
col_range = ws["C:D"]
row10 = ws[10]
row_range = ws[5:10]

你也可以用openpyxl.worksheet.Worksheet.iter_rows()方法

>>>> for col in ws.iter_rows(min_row = 1 ,max_col = 3,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>

同樣,用openpyxk.worksheet.Worksheet.iter_cols()可以按列返回。

>>> for col in ws.iter_cols(min_row = 1,max_col = 3,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>

如果你想迭代所有的行或者列,你可以用openpyxl.worksheet.Worksheet.rows()屬性。

>>> 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.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))

或者用openpyxl.worksheet.Worksheet.cols屬性

>>> tuple(ws.cols)

((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))

數(shù)據(jù)存儲

一旦我們得到了一個openpyxl.cell.Cell,我們就可以給它分配一個值

>>> c.value = 'Hello World'
>>> print(c.value)
'Hello World'

>>> d.value = 3.14
>>> print(d.value)
3.14

你也可以啟用數(shù)據(jù)類型和格式判斷

You can also enable type and format inference

>>> wb = Workbook(guess_types = True)
>>> c.value = '12%'
>>> print(c.value)
0.12
1.
>>> import datetime
>>> d.value = datetime.datetime.now()
>>> print(d.value)
datetime.datetime.now(2010, 9, 10, 22, 25,18)

>>> c.value = '31.50'
>>> print(c.value)
31.5

保存到文件

最快速和安全的保存文件的方法是使用openpyxl.workbook.Workbook對象的openpyxl.workbook.Workbook.save()方法

>>> wb = Workbook()
>>> wb.save("balance.xlsx")

警告:
如果balance.xlsx文件已經(jīng)存在,會被直接覆蓋掉,木有任何提示的哦

考慮到你可能沒有對應的軟件來打開office文件,所以并不是強制你必須保存為xlsx或者xlsm文件。
因為OOXML文件是基于.zip文件的,所以你可以以.zip作為后綴,然后用你喜歡的壓縮文件管理器來打開。
下面還有一部分沒有翻譯,因為暫時用不到那些功能,以后用上了再說吧。

打開一個文件

你可以用openpyxl.load_workbook()來打開文件

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook("test.xlsx")
>>> print(wb2.get_sheet_names())
['Sheet2', 'New Title', 'Sheet1']
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 最近在網(wǎng)上爬取奧運項目資料,并寫入Excel中。在寫到Excel中是用到了OpenPyXL,翻譯了一部分自己用到的...
    LeeLom閱讀 201,379評論 7 78
  • 本例為設置密碼窗口 (1) If Application.InputBox(“請輸入密碼:”) = 1234 Th...
    浮浮塵塵閱讀 14,860評論 1 20
  • 使用首先需要了解他的工作原理 1.POI結構與常用類 (1)創(chuàng)建Workbook和Sheet (2)創(chuàng)建單元格 (...
    長城ol閱讀 8,755評論 2 25
  • 原文鏈接 翻譯自官方文檔 開始在內(nèi)存中使用 創(chuàng)建一個workbook 在剛開始使用openpyxl的時候,不需要直...
    TryEnough閱讀 33,333評論 1 44
  • 寫作不易,轉載請注明出處,且用且珍惜。 OpenPyXL的API文檔 1.OpenPyXL基礎操作 引入Workb...
    一只寫程序的猿閱讀 1,002評論 0 7

友情鏈接更多精彩內(nèi)容