Python對excel的基本操作

Python對excel的基本操作

[TOC]

1. 前言

本文是通過Python的第三方庫openpyxl, 該庫根據(jù)官方介紹是支持Excel 2010 的 xlsx/xlsm/xltx/xltm格式文件帚桩,哪個版本的這些格式應(yīng)該都可以支持。

作為網(wǎng)絡(luò)攻城獅的我們劲室,使用python對excel的基本操作技能就可以了镐确,當然能夠精通更好了。

那我們使用openpyxl有何作用结闸?我是想后面跟大家分享一篇批量備份網(wǎng)絡(luò)設(shè)備配置的文章佣渴,里面會涉及到對excel的操作剥险,就提前給大家分享下如何操作基本的excel透硝,順便鞏固下自己的知識狰闪。

來來來,先看下如下圖所示濒生,這是存放一張所有網(wǎng)絡(luò)設(shè)備的管理地址表埋泵,通過python的openpyxl庫就可以讀取ip地址信息、巡檢命令等信息罪治,就可以批量去備份網(wǎng)絡(luò)設(shè)備配置了秋泄,之前我都是用python結(jié)合txt文本的,覺得不太方便规阀,就改成python結(jié)合excel的方式,excel編輯起來就非常方便了瘦麸。

2. 實驗環(huán)境

  • windown 10
  • Python3.69
  • Pycharm
  • Python第三方庫openpyxl
  • excel 2013

說明:各位實驗環(huán)境請隨意組合谁撼,python版本是3.x以上。

3. 基本操作

接下來就開始一步一步教大家如何操作...

3.1 安裝openpyxl第三方庫

首先滋饲,我們得先安裝一下第三方庫`openpyxl`厉碟,使用如下命令安裝即可。
C:\>pip install openpyxl

3.2 新建工作簿

3.2.1 新創(chuàng)建工作簿

from openpyxl import Workbook

# 類實例化
wb = Workbook()

# 保存并生成文件
wb.save('simple_excel.xlsx')
說明:運行該代碼后屠缭,會生成一份excel文件:`simple_excel.xlsx`箍鼓,暫時沒內(nèi)容。

3.2.2 缺省工作表

from openpyxl import Workbook

# 類實例化
wb = Workbook()
# 激活并缺省創(chuàng)建第一個工作表:sheet
ws1 = wb.active
# 第一個工作表命名:1_sheet
ws1.title = '1_sheet'
# 保存并生成文件
wb.save('simple_excel.xlsx')
效果如下所示:

3.2.3 創(chuàng)建工作表

from openpyxl import Workbook

# 類實例化
wb = Workbook()
# 激活并缺省創(chuàng)建第一個工作表
ws1 = wb.active
# 第一個工作表命名
ws1.title = '1_sheet'
# 創(chuàng)建工作表3
ws3 = wb.create_sheet(title='3_sheet', index=2)
# 創(chuàng)建工作表2
ws2 = wb.create_sheet('2_sheet', 1)
# 創(chuàng)建工作表4
ws4 = wb.copy_worksheet(ws3)
# 保存并生成文件
wb.save('simple_excel.xlsx')
參數(shù)說明:
  • 屬性title:為工作表命名呵曹;
  • 方法create_sheet:創(chuàng)建新的工作表款咖,其中index為工作表的順序索引,如0表示第一張表...奄喂;
  • 方法copy_worksheet:復制工作表铐殃;
  • 方法save:保存并生成文件,每次運行都會覆蓋同名文件跨新;

3.2.4 刪除工作表

from openpyxl import Workbook

# 類實例化
wb = Workbook()
# 激活并缺省創(chuàng)建第一個工作表

# ...省略中間代碼...

ws4 = wb.copy_worksheet(ws3)

# 刪除工作表
wb.remove(ws4)

# 保存并生成文件
wb.save('simple_excel.xlsx')
說明:此步驟我就不運行了富腊。

3.2.5 設(shè)置工作表顏色

from openpyxl import Workbook

# 類實例化
wb = Workbook()

# ...省略中間代碼...

# 設(shè)置工作表背景色
ws1.sheet_properties.tabColor = '90EE90'
ws2.sheet_properties.tabColor = '1E90FF'
ws3.sheet_properties.tabColor = '90EE90'
ws4.sheet_properties.tabColor = '1E90FF'

# 保存并生成文件
wb.save('simple_excel.xlsx')
參數(shù)說明:
  • 屬性tabColor:設(shè)置工作表背景色,可以使用RGB顏色域帐。

    效果如下:

3.2.6 單元格寫入數(shù)據(jù)

#### 寫入單個數(shù)據(jù)
from openpyxl import Workbook

# 類實例化
wb = Workbook()

# ...省略中間代碼...

# 單元格寫入數(shù)據(jù)
# 方法1:
ws1['A1'] = '示例:'

# 方法2:
ws1.cell(row=1, column=1, value='示例:')

# 保存并生成文件
wb.save('simple_excel.xlsx')    

批量寫入數(shù)據(jù)

from openpyxl import Workbook

# 類實例化
wb = Workbook()

# ...省略中間代碼...

# 單元格寫入數(shù)據(jù)
data = [
    ["device_name", "device_ip", "vendor", "model", "sn", "os", "version", "update_time"],
    ['switch-01', "192.168.1.1", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
    ['switch-02', "192.168.1.2", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
    ['switch-03', "192.168.1.3", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
        ]
for row in data:
    ws1.append(row)

# 保存并生成文件
wb.save('simple_excel.xlsx')    
參數(shù)說明:
  • append:傳入可迭代對象(字符串赘被、列表是整、元組...),迭代寫入單元格民假;

    效果如下:

3.2.7 設(shè)置單元格背景色

from openpyxl import Workbook
from openpyxl.styles import PatternFill, Border, Side, Font, colors

# 類實例化
wb = Workbook()

# ...省略中間代碼...

# 單元格填充背景色
background_color = PatternFill(start_color='00BFFF', fill_type='solid')
# 設(shè)置邊框
border = Border(left=Side(style='thin'),
                right=Side(style='thin'),
                top=Side(style='thin'),
                bottom=Side(style='thin'))
font_type = Font(color=colors.WHITE,
                 size=12,
                 b=True,
                 bold=True)
 # 設(shè)置字體居中
Align = Alignment(horizontal='center', vertical='center')
 # 循環(huán)迭代cell并設(shè)置樣式
for row in ws1.iter_rows(min_row=2,max_row=2):
    for cell in row:
        cell.fill, cell.font, cell.alignment = background_color, font_type, Align
參數(shù)說明:
  • 類PatternFill:start_color浮入、end_color為背景色、圖案顏色阳欲、圖案樣式舵盈;

  • 類Border:設(shè)置邊框線條樣式,如線條寬度樣式球化、對角線等秽晚;

  • 類Font:設(shè)置字體顏色、大小筒愚、下劃線等赴蝇;

  • 類Alignment:設(shè)置文本對齊方式,水平對齊巢掺、垂直對齊句伶;

    效果如下:

3.2.8 合并單元格

# ...省略代碼...

# 合并單元格
ws1.merge_cells('A1:H1')
ws1.unmerge_cells('A1:H1')

# ...省略代碼...

參數(shù)說明:
  • merge_cells:合并單元格;
  • unmerge_cells:取消合并單元格陆淀;

效果如下:

3.2.9 自動調(diào)整列單元格寬度

from openpyxl import Workbook
from openpyxl.styles import PatternFill, Border, Side, Font, colors,Alignment
from openpyxl.utils import get_column_letter

# 類實例化
wb = Workbook()

# ...省略中間代碼...

# 自動調(diào)整單元格寬度
# 篩選出每一列中cell的最大長度考余,并作為調(diào)整列寬度的值。
all_ws = wb.sheetnames
for ws in all_ws:
    dims = {}
    ws = wb[ws]
    for row in ws.rows:
        for cell in row:
            if cell.value:
                dims[cell.column] = max(dims.get(cell.column, 0), len(str(cell.value)))
                
    for col, value in dims.items():
        ws.column_dimensions[get_column_letter(col)].width = value + 3
    dims.clear()
思路解讀:
  先找出列所有數(shù)據(jù)的最大長度轧苫,然后按照這個長度自動調(diào)整單元格的寬度楚堤。
  • 先定義一個空字典dims,用來存放鍵值對含懊,column(列):value(單元格cell長度)身冬;

  • 每一列的單元格value長度一一比較取得最大值,最后取得最最最大值岔乔,作為每列的寬度值width酥筝;

  • 方法get_column_letter():是將cell.column整數(shù)值1、2雏门、3...轉(zhuǎn)換為列字符串'A'嘿歌、'B'、 'C'...;

  • 方法column_dimensions:通過width設(shè)置列的寬度剿配,建議再加大一點搅幅;

    效果如下:

3.2.10 圖表

from openpyxl.chart import BarChart3D, Reference

# ...省略中間代碼...


# 單元格先寫入數(shù)據(jù)
data = [
    ["Fruit", "2017", "2018", "2019", "2020"],
    ['Apples', 10000, 5000, 8000, 6000],
    ['Pears', 2000, 3000, 4000, 5000],
    ['Bananas', 6000, 6000, 6500, 6000],
    ['Oranges', 500, 300, 200, 700],
]
for row in data:
    ws2.append(row)
    
# 開始繪3D柱狀圖
chart = BarChart3D()
chart.type = 'col'
chart.style = 10
chart.title = '銷量柱狀圖'
chart.x_axis.title = '水果'
chart.y_axis.title = '銷量'

# set_categories() X軸設(shè)置數(shù)據(jù), add_data() y軸設(shè)置數(shù)據(jù)
data = Reference(ws2, min_col=2, min_row=1, max_col=5, max_row=5)
series = Reference(ws2, min_col=1, min_row=2, max_row=5)
chart.add_data(data=data, titles_from_data=True)
chart.set_categories(series)
ws2.add_chart(chart, 'A7')
參數(shù)說明:
  • 屬性type:可以設(shè)置列col 和水平bar兩種方式;

  • 屬性style:設(shè)置樣式呼胚,為整數(shù)值1~48之間茄唐;

  • 屬性title:設(shè)置標題;

  • 屬性x_axis.title:x軸的標題;

  • 屬性y_axis.title:y軸的標題沪编;

  • 類Reference:引用單元格范圍的數(shù)據(jù);

  • 方法add_data:設(shè)置Y軸數(shù)據(jù)呼盆;

  • 方法set_categories:設(shè)置X軸數(shù)據(jù);

    效果如下:

3.3 加載工作簿

通過load_workbook方法加載已存在的excel文件蚁廓,并以read_only只讀方式讀取內(nèi)容访圃,不能進行編輯。

load_workbook方法參數(shù):

  • filename:文件路徑或文件對象相嵌;
  • read_only:是否為只讀腿时,針對閱讀做了優(yōu)化,不能編輯內(nèi)容饭宾;
  • keep_vba:是否保留vba內(nèi)(并不意味可以用它)批糟,缺省保留;
  • data_only:單元格是否保留公式或結(jié)果看铆;
  • keep_links:是否保留外部鏈接徽鼎,缺省保留;

3.3.1 獲取工作表

from openpyxl import load_workbook as open
# 類示例化
wb = open('simple_excel.xlsx', read_only=True)

# 獲取所有工作表
print('所有工作表: ', wb.sheetnames)

# 關(guān)閉工作簿
wb.close()


# 回顯結(jié)果如下:
所有工作表:  ['1_sheet', '2_sheet', '3_sheet', '3_sheet Copy']
參數(shù)說明:
  • 參數(shù)read_only=True:表示以只讀模式打開工作簿弹惦;

  • 方法sheetnames:返回的是一個列表形式的工作表名稱否淤;

  • 方法close():僅在read-onlywrite-only 模式使用即可,下同棠隐,故不做多次解釋石抡;

    3.3.2 遍歷工作表

from openpyxl import load_workbook as open
# 類示例化
wb = open('simple_excel.xlsx', read_only=True)

# 獲取單個工作表
print('第1個工作表:', wb.sheetnames[0])
print('第2個工作表:', wb.sheetnames[1])
print('第3個工作表:', wb.sheetnames[2])
print('第4個工作表:', wb.sheetnames[3])
# 循環(huán)遍歷工作表
for ws in wb.sheetnames:
    print(ws)

# 關(guān)閉工作簿
wb.close()


# 回顯結(jié)果如下:
第1個工作表: 1_sheet
第2個工作表: 2_sheet
第3個工作表: 3_sheet
第4個工作表: 3_sheet Copy
1_sheet
2_sheet
3_sheet
3_sheet Copy

3.3.3 獲取單元格數(shù)據(jù)

from openpyxl import load_workbook as open
# 類示例化
wb = open('simple_excel.xlsx', read_only=True)

# 第一個工作表對象
ws1 = wb[wb.sheetnames[0]]
# 或者
# ws1 = wb['1_sheet']

# 獲取某個單元格
print(f"獲取單元格數(shù)據(jù): {ws1['A3'].value}")

# 選取范圍獲取單元格數(shù)據(jù)
for row in ws1['A3:H3']:
    for cell in row:
        print(f"按范圍獲取單元格數(shù)據(jù): {cell.value}")

# 關(guān)閉工作簿
wb.close()


# 回顯結(jié)果如下:
獲取單元格數(shù)據(jù): switch-01
    
按范圍獲取單元格數(shù)據(jù): switch-01
按范圍獲取單元格數(shù)據(jù): 192.168.1.1
按范圍獲取單元格數(shù)據(jù): cisco
按范圍獲取單元格數(shù)據(jù): WS-C3560G-24TS
按范圍獲取單元格數(shù)據(jù): FOC00000000
按范圍獲取單元格數(shù)據(jù): cisco_ios
按范圍獲取單元格數(shù)據(jù): 12.2(50)SE5
按范圍獲取單元格數(shù)據(jù): 1 weeks, 1 minutes    

3.3.4 遍歷行

指定行

from openpyxl import load_workbook as open
# 類示例化
wb = open('simple_excel.xlsx', read_only=True)

# 第一個工作表對象
ws1 = wb[wb.sheetnames[0]]

# 指定第二行
for cell in ws1['2']:
    print(cell.value)
    
# 關(guān)閉工作簿
wb.close()


# 回顯結(jié)果如下:
device_name
device_ip
vendor
model
sn
os
version
update_time

指定行范圍

# ... 省略代碼...

# 指定行范圍
for row in ws1['2:3']:
    for cell in row:
        print(cell.value)
    
# ... 省略代碼...


# 回顯結(jié)果如下:
device_name
device_ip
vendor
model
sn
os
version
update_time
switch-01
192.168.1.1
cisco
WS-C3560G-24TS
FOC00000000
cisco_ios
12.2(50)SE5
1 weeks, 1 minutes

方法iter_rows,遍歷行

from openpyxl import load_workbook as open
# 類示例化
wb = open('simple_excel.xlsx', read_only=True)

# 第一個工作表對象
ws1 = wb[wb.sheetnames[0]]

# 循環(huán)遍歷行
for row in ws1.iter_rows(min_row=2, max_row=2, min_col=1, max_col=8):
    for cell in row:
        print(f"單元格數(shù)據(jù):{cell.value}")
        
# 關(guān)閉工作簿
wb.close()


# 回顯結(jié)果如下:
單元格數(shù)據(jù):device_name
單元格數(shù)據(jù):device_ip
單元格數(shù)據(jù):vendor
單元格數(shù)據(jù):model
單元格數(shù)據(jù):sn
單元格數(shù)據(jù):os
單元格數(shù)據(jù):version
單元格數(shù)據(jù):update_time
參數(shù)說明:
  • 方法iter_rows:通過該方法可以遍歷每行數(shù)據(jù)助泽,是一個tuple汁雷,可再次循環(huán)通過.value獲取單元格數(shù)據(jù);

3.3.5 遍歷列

指定列

from openpyxl import load_workbook as open
# 類示例化
wb = open('simple_excel.xlsx', read_only=True)

# 第一個工作表對象
ws1 = wb[wb.sheetnames[0]]

# 指定第一列
for cell in ws1['A']:
    print(cell.value)
    
# 關(guān)閉工作簿
wb.close()


# 回顯結(jié)果如下:
示例:
device_name
switch-01
switch-02
switch-03

指定列范圍

# ... 省略代碼...

# 指定列范圍
for col in ws1['A:B']:
    for cell in col:
        print(cell.value)
        
# ... 省略代碼...        
        
# 回顯結(jié)果如下:
示例:
device_name
switch-01
switch-02
switch-03
None
device_ip
192.168.1.1
192.168.1.2
192.168.1.3

方法iter_cols报咳,遍歷列

from openpyxl import load_workbook as open
# 類示例化
wb = open('simple_excel.xlsx')

# 第一個工作表對象
ws1 = wb[wb.sheetnames[0]]

# 循環(huán)遍歷列
for col in ws1.iter_cols(min_row=3, max_row=5, min_col=1, max_col=1):
    for cell in col:
        print(f"單元格數(shù)據(jù):{cell.value}")
        
# 關(guān)閉工作簿
wb.close()


# 回顯結(jié)果如下:
單元格數(shù)據(jù):switch-01
單元格數(shù)據(jù):switch-02
單元格數(shù)據(jù):switch-03

參數(shù)說明:

  • 方法iter_cols:通過該方法可以遍歷每列數(shù)據(jù),是一個tuple挖藏,可再次循環(huán)通過.value獲取單元格數(shù)據(jù)暑刃,另外和iter_rows不一樣的就是load_workbook 不能使用read_only=True

附錄


如果喜歡的我的文章膜眠,歡迎關(guān)注我的公號:點滴技術(shù)岩臣,掃碼關(guān)注,不定期分享

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宵膨,一起剝皮案震驚了整個濱河市架谎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辟躏,老刑警劉巖谷扣,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡会涎,警方通過查閱死者的電腦和手機裹匙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來末秃,“玉大人概页,你說我怎么就攤上這事×纺剑” “怎么了惰匙?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铃将。 經(jīng)常有香客問我项鬼,道長,這世上最難降的妖魔是什么麸塞? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任秃臣,我火速辦了婚禮,結(jié)果婚禮上哪工,老公的妹妹穿的比我還像新娘奥此。我一直安慰自己,他們只是感情好雁比,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布稚虎。 她就那樣靜靜地躺著,像睡著了一般偎捎。 火紅的嫁衣襯著肌膚如雪蠢终。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天茴她,我揣著相機與錄音寻拂,去河邊找鬼。 笑死丈牢,一個胖子當著我的面吹牛祭钉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播己沛,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慌核,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了申尼?” 一聲冷哼從身側(cè)響起垮卓,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎师幕,沒想到半個月后粟按,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年钾怔,在試婚紗的時候發(fā)現(xiàn)自己被綠了碱呼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宗侦,死狀恐怖愚臀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矾利,我是刑警寧澤姑裂,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站男旗,受9級特大地震影響舶斧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜察皇,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一茴厉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧什荣,春花似錦矾缓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桅锄,卻和暖如春琉雳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背友瘤。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工翠肘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辫秧。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓锯茄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茶没。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • xcel電子表格是您有時必須處理的事情之一晚碾。要么是因為您的老板喜歡它們抓半,要么是因為市場營銷需要它們,您可能必須學習...
    KangSmit的算法那些事兒閱讀 2,003評論 0 3
  • openpyxl 的用法實例 1.1 Openpyxl 庫的安裝使用 openpyxl 模塊是一個讀寫 Excel...
    f5423d3134f0閱讀 12,185評論 0 3
  • 在這一小節(jié)格嘁,我們將會學習如何使用Python來操作Excel文檔以及如何利用Python語言的函數(shù)和表達式操縱Ex...
    11的霧閱讀 3,106評論 0 19
  • python處理數(shù)據(jù)時笛求,可以將數(shù)據(jù)保存至excel文件中,此處安利一個python利器,openpyxl探入,可以自動...
    八戒無戒閱讀 207評論 0 0
  • 今天感恩節(jié)哎狡孔,感謝一直在我身邊的親朋好友。感恩相遇蜂嗽!感恩不離不棄苗膝。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,562評論 0 11