使用Python怎么對(duì)excel進(jìn)行操作?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
成都創(chuàng)新互聯(lián)公司是專業(yè)的李滄網(wǎng)站建設(shè)公司,李滄接單;提供成都網(wǎng)站建設(shè)、做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行李滄網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!C:\>pip install openpyxl
3.2.1 新創(chuàng)建工作簿
from openpyxl import Workbook # 類實(shí)例化 wb = Workbook() # 保存并生成文件 wb.save('simple_excel.xlsx')
說(shuō)明:運(yùn)行該代碼后,會(huì)生成一份excel文件:simple_excel.xlsx
,暫時(shí)沒內(nèi)容。
3.2.2 缺省工作表
from openpyxl import Workbook # 類實(shí)例化 wb = Workbook() # 激活并缺省創(chuàng)建第一個(gè)工作表:sheet ws1 = wb.active # 第一個(gè)工作表命名:1_sheet ws1.title = '1_sheet' # 保存并生成文件 wb.save('simple_excel.xlsx')
效果如下所示:
3.2.3 創(chuàng)建工作表
from openpyxl import Workbook # 類實(shí)例化 wb = Workbook() # 激活并缺省創(chuàng)建第一個(gè)工作表 ws1 = wb.active # 第一個(gè)工作表命名 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ù)說(shuō)明:
屬性title:為工作表命名;
方法create_sheet:創(chuàng)建新的工作表,其中index為工作表的順序索引,如0表示第一張表...;
方法copy_worksheet:復(fù)制工作表;
方法save:保存并生成文件,每次運(yùn)行都會(huì)覆蓋同名文件;
3.2.4 刪除工作表
from openpyxl import Workbook # 類實(shí)例化 wb = Workbook() # 激活并缺省創(chuàng)建第一個(gè)工作表 # ...省略中間代碼... ws4 = wb.copy_worksheet(ws3) # 刪除工作表 wb.remove(ws4) # 保存并生成文件 wb.save('simple_excel.xlsx')
說(shuō)明:此步驟我就不運(yùn)行了。
3.2.5 設(shè)置工作表顏色
from openpyxl import Workbook # 類實(shí)例化 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ù)說(shuō)明:
屬性tabColor:設(shè)置工作表背景色,可以使用RGB
顏色。
效果如下:
3.2.6 單元格寫入數(shù)據(jù)
#### 寫入單個(gè)數(shù)據(jù)
from openpyxl import Workbook # 類實(shí)例化 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 # 類實(shí)例化 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ù)說(shuō)明:
append:傳入可迭代對(duì)象(字符串、列表、元組...),迭代寫入單元格;
效果如下:
3.2.7 設(shè)置單元格背景色
from openpyxl import Workbook from openpyxl.styles import PatternFill, Border, Side, Font, colors # 類實(shí)例化 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ù)說(shuō)明:
類PatternFill:start_color、end_color為背景色、圖案顏色、圖案樣式;
類Border:設(shè)置邊框線條樣式,如線條寬度樣式、對(duì)角線等;
類Font:設(shè)置字體顏色、大小、下劃線等;
類Alignment:設(shè)置文本對(duì)齊方式,水平對(duì)齊、垂直對(duì)齊;
效果如下:
3.2.8 合并單元格
# ...省略代碼... # 合并單元格 ws1.merge_cells('A1:H1') ws1.unmerge_cells('A1:H1') # ...省略代碼...
參數(shù)說(shuō)明:
merge_cells:合并單元格;
unmerge_cells:取消合并單元格;
效果如下:
3.2.9 自動(dòng)調(diào)整列單元格寬度
from openpyxl import Workbook from openpyxl.styles import PatternFill, Border, Side, Font, colors,Alignment from openpyxl.utils import get_column_letter # 類實(shí)例化 wb = Workbook() # ...省略中間代碼... # 自動(dòng)調(diào)整單元格寬度 # 篩選出每一列中cell的較大長(zhǎng)度,并作為調(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ù)的較大長(zhǎng)度,然后按照這個(gè)長(zhǎng)度自動(dòng)調(diào)整單元格的寬度。
先定義一個(gè)空字典dims,用來(lái)存放鍵值對(duì),column(列):value(單元格cell長(zhǎng)度);
每一列的單元格value長(zhǎng)度一一比較取得較大值,最后取得最最較大值,作為每列的寬度值width;
方法get_column_letter():是將cell.column整數(shù)值1、2、3...轉(zhuǎn)換為列字符串'A'、'B'、 'C'...;
方法column_dimensions:通過(guò)width設(shè)置列的寬度,建議再加大一點(diǎn);
效果如下:
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ù)說(shuō)明:
屬性type:可以設(shè)置列col 和水平bar兩種方式;
屬性style:設(shè)置樣式,為整數(shù)值1~48之間;
屬性title:設(shè)置標(biāo)題;
屬性x_axis.title:x軸的標(biāo)題;
屬性y_axis.title:y軸的標(biāo)題;
類Reference:引用單元格范圍的數(shù)據(jù);
方法add_data:設(shè)置Y軸數(shù)據(jù);
方法set_categories:設(shè)置X軸數(shù)據(jù);
效果如下:
通過(guò)load_workbook
方法加載已存在的excel文件,并以read_only
只讀方式讀取內(nèi)容,不能進(jìn)行編輯。
load_workbook
方法參數(shù):
filename:文件路徑或文件對(duì)象;
read_only:是否為只讀,針對(duì)閱讀做了優(yōu)化,不能編輯內(nèi)容;
keep_vba:是否保留vba內(nèi)(并不意味可以用它),缺省保留;
data_only:?jiǎn)卧袷欠癖A艄交蚪Y(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ù)說(shuō)明:
參數(shù)read_only=True:表示以只讀
模式打開工作簿;
方法sheetnames:返回的是一個(gè)列表形式的工作表名稱;
方法close():僅在read-only
和write-only
模式使用即可,下同,故不做多次解釋;
3.3.2 遍歷工作表
from openpyxl import load_workbook as open # 類示例化 wb = open('simple_excel.xlsx', read_only=True) # 獲取單個(gè)工作表 print('第1個(gè)工作表:', wb.sheetnames[0]) print('第2個(gè)工作表:', wb.sheetnames[1]) print('第3個(gè)工作表:', wb.sheetnames[2]) print('第4個(gè)工作表:', wb.sheetnames[3]) # 循環(huán)遍歷工作表 for ws in wb.sheetnames: print(ws) # 關(guān)閉工作簿 wb.close() # 回顯結(jié)果如下: 第1個(gè)工作表: 1_sheet 第2個(gè)工作表: 2_sheet 第3個(gè)工作表: 3_sheet 第4個(gè)工作表: 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) # 第一個(gè)工作表對(duì)象 ws1 = wb[wb.sheetnames[0]] # 或者 # ws1 = wb['1_sheet'] # 獲取某個(gè)單元格 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) # 第一個(gè)工作表對(duì)象 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) # 第一個(gè)工作表對(duì)象 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ù)說(shuō)明:
方法iter_rows:通過(guò)該方法可以遍歷每行數(shù)據(jù),是一個(gè)tuple
,可再次循環(huán)通過(guò).value
獲取單元格數(shù)據(jù);
3.3.5 遍歷列
指定列
from openpyxl import load_workbook as open # 類示例化 wb = open('simple_excel.xlsx', read_only=True) # 第一個(gè)工作表對(duì)象 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') # 第一個(gè)工作表對(duì)象 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
看完上述內(nèi)容,你們掌握使用Python怎么對(duì)excel進(jìn)行操作的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!