Python對excel的基本操做html
本文是經過Python的第三方庫openpyxl
, 該庫根據官方介紹是支持Excel 2010 的 xlsx/xlsm/xltx/xltm格式文件,哪一個版本的這些格式應該均可以支持。python
做爲網絡攻城獅的咱們,使用python對excel的基本操做技能就能夠了,固然可以精通更好了。ios
那咱們使用openpyxl
有何做用?我是想後面跟你們分享一篇批量備份網絡設備配置
的文章,裏面會涉及到對excel的操做,就提早給你們分享下如何操做基本的excel,順便鞏固下本身的知識。shell
來來來,先看下以下圖所示,這是存放一張全部網絡設備的管理地址表,經過python的openpyxl
庫就能夠讀取ip地址信息、巡檢命令等信息,就能夠批量去備份網絡設備配置了,以前我都是用python結合txt文本的,以爲不太方便,就改爲python結合excel的方式,excel編輯起來就很是方便了。網絡
openpyxl
說明:各位實驗環境請隨意組合,python版本是3.x以上。app
接下來就開始一步一步教你們如何操做...ide
首先,咱們得先安裝一下第三方庫`openpyxl`,使用以下命令安裝便可。
C:\>pip install openpyxl
from openpyxl import Workbook # 類實例化 wb = Workbook() # 保存並生成文件 wb.save('simple_excel.xlsx')
說明:運行該代碼後,會生成一份excel文件:simple_excel.xlsx
,暫時沒內容。字體
from openpyxl import Workbook # 類實例化 wb = Workbook() # 激活並缺省建立第一個工做表:sheet ws1 = wb.active # 第一個工做表命名:1_sheet ws1.title = '1_sheet' # 保存並生成文件 wb.save('simple_excel.xlsx')
效果以下所示:優化
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
from openpyxl import Workbook # 類實例化 wb = Workbook() # 激活並缺省建立第一個工做表 # ...省略中間代碼... ws4 = wb.copy_worksheet(ws3) # 刪除工做表 wb.remove(ws4) # 保存並生成文件 wb.save('simple_excel.xlsx')
說明:此步驟我就不運行了。
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')
參數說明:
RGB
顏色。 效果以下:
#### 寫入單個數據
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')
參數說明:
效果以下:
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
參數說明:
效果以下:
# ...省略代碼... # 合併單元格 ws1.merge_cells('A1:H1') ws1.unmerge_cells('A1:H1') # ...省略代碼...
參數說明:
效果以下:
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()
思路解讀:
先找出列全部數據的最大長度,而後按照這個長度自動調整單元格的寬度。
cell.column
整數值一、二、3...轉換爲列字符串'A'、'B'、 'C'...; 效果以下:
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')
參數說明:
col
和水平bar
兩種方式; 效果以下:
經過load_workbook
方法加載已存在的excel文件,並以read_only
只讀方式讀取內容,不能進行編輯。
load_workbook
方法參數:
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-only
和 write-only
模式使用便可,下同,故不作屢次解釋;
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
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
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
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
參數說明:
tuple
,可再次循環經過.value
獲取單元格數據;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
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
參數說明:
tuple
,可再次循環經過.value
獲取單元格數據,另外和iter_rows
不同的就是load_workbook 不能使用read_only=True
;若是喜歡的個人文章,歡迎關注個人公衆號:點滴技術,掃碼關注,不按期分享