Python對excel的基本操做

Python對excel的基本操做html

1. 前言

本文是經過Python的第三方庫openpyxl, 該庫根據官方介紹是支持Excel 2010 的 xlsx/xlsm/xltx/xltm格式文件,哪一個版本的這些格式應該均可以支持。python

做爲網絡攻城獅的咱們,使用python對excel的基本操做技能就能夠了,固然可以精通更好了。ios

那咱們使用openpyxl有何做用?我是想後面跟你們分享一篇批量備份網絡設備配置的文章,裏面會涉及到對excel的操做,就提早給你們分享下如何操做基本的excel,順便鞏固下本身的知識。shell

來來來,先看下以下圖所示,這是存放一張全部網絡設備的管理地址表,經過python的openpyxl庫就能夠讀取ip地址信息、巡檢命令等信息,就能夠批量去備份網絡設備配置了,以前我都是用python結合txt文本的,以爲不太方便,就改爲python結合excel的方式,excel編輯起來就很是方便了。網絡

2. 實驗環境

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

說明:各位實驗環境請隨意組合,python版本是3.x以上。app

3. 基本操做

接下來就開始一步一步教你們如何操做...ide

3.1 安裝openpyxl第三方庫

首先,咱們得先安裝一下第三方庫`openpyxl`,使用以下命令安裝便可。
C:\>pip install openpyxl

3.2 新建工做簿

3.2.1 新建立工做簿

from openpyxl import Workbook

# 類實例化
wb = Workbook()

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

​ 說明:運行該代碼後,會生成一份excel文件:simple_excel.xlsx,暫時沒內容。字體

3.2.2 缺省工做表

from openpyxl import Workbook

# 類實例化
wb = Workbook()
# 激活並缺省建立第一個工做表:sheet
ws1 = wb.active
# 第一個工做表命名:1_sheet
ws1.title = '1_sheet'
# 保存並生成文件
wb.save('simple_excel.xlsx')

​ 效果以下所示:優化

3.2.3 建立工做表

from openpyxl import Workbook

# 類實例化
wb = Workbook()
# 激活並缺省建立第一個工做表
ws1 = wb.active
# 第一個工做表命名
ws1.title = '1_sheet'
# 建立工做表3
ws3 = wb.create_sheet(title='3_sheet', index=2)
# 建立工做表2
ws2 = wb.create_sheet('2_sheet', 1)
# 建立工做表4
ws4 = wb.copy_worksheet(ws3)
# 保存並生成文件
wb.save('simple_excel.xlsx')

​ 參數說明:ui

  • 屬性title:爲工做表命名;
  • 方法create_sheet:建立新的工做表,其中index爲工做表的順序索引,如0表示第一張表...;
  • 方法copy_worksheet:複製工做表;
  • 方法save:保存並生成文件,每次運行都會覆蓋同名文件;

3.2.4 刪除工做表

from openpyxl import Workbook

# 類實例化
wb = Workbook()
# 激活並缺省建立第一個工做表

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

ws4 = wb.copy_worksheet(ws3)

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

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

​ 說明:此步驟我就不運行了。

3.2.5 設置工做表顏色

from openpyxl import Workbook

# 類實例化
wb = Workbook()

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

# 設置工做表背景色
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')

​ 參數說明:

  • 屬性tabColor:設置工做表背景色,能夠使用RGB顏色。

​ 效果以下:

3.2.6 單元格寫入數據

#### 寫入單個數據
from openpyxl import Workbook

# 類實例化
wb = Workbook()

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

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

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

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

批量寫入數據

from openpyxl import Workbook

# 類實例化
wb = Workbook()

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

# 單元格寫入數據
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')

​ 參數說明:

  • append:傳入可迭代對象(字符串、列表、元組...),迭代寫入單元格;

​ 效果以下:

3.2.7 設置單元格背景色

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

# 類實例化
wb = Workbook()

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

# 單元格填充背景色
background_color = PatternFill(start_color='00BFFF', fill_type='solid')
# 設置邊框
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)
 # 設置字體居中
Align = Alignment(horizontal='center', vertical='center')
 # 循環迭代cell並設置樣式
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

​ 參數說明:

  • 類PatternFill:start_color、end_color爲背景色、圖案顏色、圖案樣式;
  • 類Border:設置邊框線條樣式,如線條寬度樣式、對角線等;
  • 類Font:設置字體顏色、大小、下劃線等;
  • 類Alignment:設置文本對齊方式,水平對齊、垂直對齊;

​ 效果以下:

3.2.8 合併單元格

# ...省略代碼...

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

# ...省略代碼...

​ 參數說明:

  • merge_cells:合併單元格;
  • unmerge_cells:取消合併單元格;

效果以下:

3.2.9 自動調整列單元格寬度

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

# 類實例化
wb = Workbook()

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

# 自動調整單元格寬度
# 篩選出每一列中cell的最大長度,並做爲調整列寬度的值。
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()

​ 思路解讀:
​ 先找出列全部數據的最大長度,而後按照這個長度自動調整單元格的寬度。

  • 先定義一個空字典dims,用來存放鍵值對,column(列):value(單元格cell長度);
  • 每一列的單元格value長度一一比較取得最大值,最後取得最最最大值,做爲每列的寬度值width;
  • 方法get_column_letter():是將cell.column整數值一、二、3...轉換爲列字符串'A'、'B'、 'C'...;
  • 方法column_dimensions:經過width設置列的寬度,建議再加大一點;

​ 效果以下:

3.2.10 圖表

from openpyxl.chart import BarChart3D, Reference

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


# 單元格先寫入數據
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軸設置數據, add_data() y軸設置數據
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')

​ 參數說明:

  • 屬性type:能夠設置列col 和水平bar兩種方式;
  • 屬性style:設置樣式,爲整數值1~48之間;
  • 屬性title:設置標題;
  • 屬性x_axis.title:x軸的標題;
  • 屬性y_axis.title:y軸的標題;
  • 類Reference:引用單元格範圍的數據;
  • 方法add_data:設置Y軸數據;
  • 方法set_categories:設置X軸數據;

​ 效果以下:

3.3 加載工做簿

經過load_workbook方法加載已存在的excel文件,並以read_only只讀方式讀取內容,不能進行編輯。

load_workbook方法參數:

  • filename:文件路徑或文件對象;
  • read_only:是否爲只讀,針對閱讀作了優化,不能編輯內容;
  • keep_vba:是否保留vba內(並不意味能夠用它),缺省保留;
  • data_only:單元格是否保留公式或結果;
  • keep_links:是否保留外部連接,缺省保留;

3.3.1 獲取工做表

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

# 獲取全部工做表
print('全部工做表: ', wb.sheetnames)

# 關閉工做簿
wb.close()


# 回顯結果以下:
全部工做表:  ['1_sheet', '2_sheet', '3_sheet', '3_sheet Copy']

​ 參數說明:

  • 參數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])
# 循環遍歷工做表
for ws in wb.sheetnames:
    print(ws)

# 關閉工做簿
wb.close()


# 回顯結果以下:
第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 獲取單元格數據

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"獲取單元格數據: {ws1['A3'].value}")

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

# 關閉工做簿
wb.close()


# 回顯結果以下:
獲取單元格數據: switch-01
    
按範圍獲取單元格數據: switch-01
按範圍獲取單元格數據: 192.168.1.1
按範圍獲取單元格數據: cisco
按範圍獲取單元格數據: WS-C3560G-24TS
按範圍獲取單元格數據: FOC00000000
按範圍獲取單元格數據: cisco_ios
按範圍獲取單元格數據: 12.2(50)SE5
按範圍獲取單元格數據: 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)
    
# 關閉工做簿
wb.close()


# 回顯結果以下:
device_name
device_ip
vendor
model
sn
os
version
update_time

指定行範圍

# ... 省略代碼...

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


# 回顯結果以下:
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]]

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


# 回顯結果以下:
單元格數據:device_name
單元格數據:device_ip
單元格數據:vendor
單元格數據:model
單元格數據:sn
單元格數據:os
單元格數據:version
單元格數據:update_time

​ 參數說明:

  • 方法iter_rows:經過該方法能夠遍歷每行數據,是一個tuple,可再次循環經過.value獲取單元格數據;

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)
    
# 關閉工做簿
wb.close()


# 回顯結果以下:
示例:
device_name
switch-01
switch-02
switch-03

指定列範圍

# ... 省略代碼...

# 指定列範圍
for col in ws1['A:B']:
    for cell in col:
        print(cell.value)
        
# ... 省略代碼...        
        
# 回顯結果以下:
示例:
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]]

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


# 回顯結果以下:
單元格數據:switch-01
單元格數據:switch-02
單元格數據:switch-03

參數說明:

  • 方法iter_cols:經過該方法能夠遍歷每列數據,是一個tuple,可再次循環經過.value獲取單元格數據,另外和iter_rows不同的就是load_workbook 不能使用read_only=True

附錄


若是喜歡的個人文章,歡迎關注個人公衆號:點滴技術,掃碼關注,不按期分享

公衆號:點滴技術

相關文章
相關標籤/搜索