前言
openpyxl是一個第三方庫,可以處理xlsx格式的Excel文件。
openpyxl(可讀寫excel表)專門處理Excel2007及以上版本產生的xlsx文件,xls和xlsx之間轉換容易, 注意:如果文字編碼是“gb2312” 讀取后就會顯示亂碼,請先轉成Unicode。
openpyxl模塊有三大類(首字母大寫):
Workbook 是對工作簿的抽象(工作簿,一個excel文件包含多個sheet。)
Worksheet 是對表格的抽象(工作表,一個workbook有多個,表名識別,如“sheet1”,“sheet2”等。)
Cell 是對單元格的抽象(單元格,存儲數據對象)
安裝
pip install openpyxl
基本操作
新建工作簿
workbook至少創建一個worksheet。
通過openpyxl.workbook.Workbook.active()得到worksheet。
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取worksheet對象 print(ws)
運行結果:
①
from openpyxl import Workbook #導入模塊 wb = Workbook('abc.xlsx') #新建名為abc的工作簿 wb.save('abc.xlsx') #保存工作簿,完成新工作簿的建立(將覆蓋同名文件且無警告)
運行結果:
②
from openpyxl import Workbook # 實例化 wb = Workbook() # 激活 worksheet ws = wb.active
加載已存在的工作簿
from openpyxl import load_workbook wb = load_workbook('文件名稱.xlsx') # openpyxl第三方庫只能處理.xlsx格式的Excel表格
獲取當前所處工作表的sheet表名
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') ws2 = wb.active # 激活當前sheet表 print(ws2.title)
運行結果:
①當名為'sheet1'的sheet表格處於激活狀態時,打印的當前所處工作表的表名為sheet1。
②當名為'sheet2'的sheet表格處於激活狀態時,打印的當前所處工作表的表名為sheet2。
修改當前所處工作表名稱( ws = wb.active # 獲取當前所在'激活狀態下'工作表 )
【注意】對工作簿修改后一定要記得執行保存操作! wb.save('Excel文件名.xlsx')
from openpyxl import Workbook, load_workbook wb = load_workbook('./test.xlsx') ws = wb.active print(ws.title) ws.title = 'MS' wb.save('./test.xlsx')
運行結果:
創建和刪除工作表
【注意】對工作簿修改后一定要記得執行保存操作! wb.save('Excel文件名.xlsx')
from openpyxl import load_workbook ws1 = wb.create_sheet('Mysheet') #插入到最后(默認) ws2 = wb.create_sheet('Mysheet',0) #插入到最前 ws3 = wb.create_sheet('Mysheet',-1) #插入到倒數第二 wb.remove('Mysheet') #刪除工作表(方法一) del wb('Mysheet') #刪除工作表(方法二)
指定sheet工作表:sheet表名可以作為字典的key進行索引
from openpyxl import load_workbook wb = load_workbook('./test.xlsx')
ws = wb['Sheet2'] print(ws, '指定的工作表sheet名:', ws.title, end='\n\n') ws1 = wb.active print(ws1, '處於激活狀態下的工作表sheet表名:', ws1.title)
運行結果:
【注意】三者區別:
wb.sheetnames # 獲取文檔所有工作表名稱 wb['Sheet1'] # 獲取指定的工作表 wb.active # 獲取當前活躍的工作表
獲取Excel中已存在的全部sheet表名
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb.sheetnames) # 工作簿中存在所有sheet表名(以列表格式返回) print(wb.worksheets) # 以列表形式返回所有sheet工作表對象
運行結果:
修改某一指定sheet表標簽按鈕顏色
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') ws = wb.active ws.sheet_properties.tabColor = '1072BA' # 默認為白色
判斷某一指定Excel是否以只讀方式打開(返回True或者False)
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb.read_only)
運行結果:
復制Sheet表
【注意】
①只有單元格(包括值、樣式、超鏈接、備注)和一些工作表對象(包括尺寸、格式和參數)會被復制,其他屬性不會被復制,如圖片、圖表;
②無法在兩個文檔中復制工作表。
③當文檔處於只讀或只寫狀態時也無法復制工作表。
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') source = wb.active # 獲取當前活躍的工作表 target = wb.copy_worksheet(source) # 復制當前活躍的sheet表 print(target)
運行結果:
保存工作薄
wb.save('文件名.xlsx')
Excel屬性操作
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb.encoding, end='\n\n') # 獲取文檔的字符集編碼 print(wb.properties) # 獲取文檔的元數據如標題,創建者,創建日期等
運行結果:
獲取某一指定sheet表中的最大行數以及最大列
ws.max_column
ws.max_row
選擇單個單元格:獲取指定位置的單元格對象
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws) # 選擇單個單元格(獲取指定位置的單元格對象) print(ws['A1']) print(ws.cell(1, 1)) # 先行后列,都是索引下標
運行結果:
單元格屬性
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws) cell = ws['A1'] # 獲取指定位置的單元格對象 # 單元格列索引 print(cell.col_idx) print(cell.column) # 單元格行索引 print(cell.row) # 單元格列名 print(cell.column_letter) # 單元格的坐標 print(cell.coordinate) # 單元格數字類型 # 默認是 # n:數值 # s:字符串 # d:日期時間 print(cell.data_type) # 單元格編碼格式,默認 utf-8 print(cell.encoding) # 是否有樣式 print(cell.has_style) # 默認樣式是 Normal,如果是默認樣式,返回False # 單元格樣式 print(cell.style) # 單元格樣式id print(cell.style_id)
運行結果:
單元格的樣式屬性
獲取指定單元格的值
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws) cell = ws['A1'] # 獲取指定位置的單元格對象 print(cell) # 獲取指定單元格的值 print(ws['A1'].value) print(ws.cell(1, 1).value)
運行結果:
選擇單元格
單元格賦值
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws) cell = ws['A1'] # 獲取指定位置的單元格對象 print(cell) ws['A1'] = '第一行第一列修改過后的單元格值' ws.cell(1, 2).value = '第一行第二列修改過后的單元格值' wb.save(filename='./test.xlsx')
運行結果:
【注意】
①任何對於Excel文件的修改操作都需要進行保存之后才會生效。
②當單元格賦值使用 cell() 函數語法時,只能給單元格對象的value屬性賦值,注意與 ws['A1'] = '值' 區分。 ws.cell(2,2) = 20 # 會報錯
在指定sheet表最后空白行新增行數據
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws) cell = ws['A1'] # 獲取指定位置的單元格對象 print(cell) ws.append([1, 2, 3]) wb.save(filename='./test.xlsx')
運行結果:
單元格遍歷
① ws.values 返回的是生成器,是將一行數據作為一個元組單元組成的,是由值組成的。
② ws.values 獲取的內容是從 “A1” 到 “最大行最大列”。
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb, end='\n\n') ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws, end='\n\n') cell = ws['A1'] # 獲取指定位置的單元格對象 print(cell, end='\n\n') print(ws.values, end='\n\n') # 生成器對象,將一行單元格作為元組單元--》組成的生成器 print(list(ws.values), end='\n\n') # 將生成器對象轉換為列表數據,列表中是生成器中的所有數據 for i in ws.values: print(i)
運行結果:
或者:
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb, end='\n\n') ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws, end='\n\n') cell = ws['A1'] # 獲取指定位置的單元格對象 print(cell, end='\n\n') for i in ws.iter_rows(min_col=1, max_col=3, min_row=1, max_row=10): print(i) print(ws.iter_rows()) # 將每一個單元格對象(按行數據中的單元格)作為一個元組單元--》組成的生成器 print(ws.rows, end='\n\n') # 將每一個單元格對象(按行數據中的單元格)作為一個元組單元--》組成的生成器 print(list(ws.rows), end='\n\n') # 列表中存放的是生成器中的每一個單元格對象 for i in ws.rows: # 遍歷以單元格對象為單位的元組單元組成的生成器 for j in i: # 遍歷單元格對象中的屬性 print(j, j.value)
運行結果:
或者:
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb, end='\n\n') ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws, end='\n\n') cell = ws['A1'] # 獲取指定位置的單元格對象 print(cell, end='\n\n') print(ws.columns, end='\n\n') # 將每一個單元格對象(按照列數據)作為一個元組單元--》組成的生成器 print(ws.iter_cols(), end='\n\n') # 將每一個單元格對象(按照列數據)作為一個元組單元--》組成的生成器 print(list(ws.columns), end='\n\n') for i in ws.columns: print(i)
運行結果:
指定sheet表中刪除行和刪除列
【注意】刪除行或者列后,后面的行或者列會自動往前填充,也就是說,刪除第一列,原來的第二列就會變成第一列。
①
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws, end='\n\n') print(ws.cell(1, 2).value) ws.delete_cols(1) # 刪除第一列,以此類推、n代表刪除第n列 wb.save(filename='./test.xlsx') print(ws.cell(1, 2).value)
運行結果:
②
from openpyxl import load_workbook wb = load_workbook('./test.xlsx') print(wb) ws = wb.active # 獲取當前活躍的worksheet對象(sheet表) print(ws, end='\n\n') print(ws.cell(1, 1).value) ws.delete_rows(1) # 刪除第一行,以此類推、n代表刪除第n行 wb.save(filename='./test.xlsx') print(ws.cell(1, 1).value)
運行結果:
轉pandas
合並單元格
樣式設置
顏色
Color(index=0) # 根據索引進行填充 # Color(rgb='00000000') # 根據rgb值進行填充 # index COLOR_INDEX = ( '00000000', '00FFFFFF', '00FF0000', '0000FF00', '000000FF', #0-4 '00FFFF00', '00FF00FF', '0000FFFF', '00000000', '00FFFFFF', #5-9 '00FF0000', '0000FF00', '000000FF', '00FFFF00', '00FF00FF', #10-14 '0000FFFF', '00800000', '00008000', '00000080', '00808000', #15-19 '00800080', '00008080', '00C0C0C0', '00808080', '009999FF', #20-24 '00993366', '00FFFFCC', '00CCFFFF', '00660066', '00FF8080', #25-29 '000066CC', '00CCCCFF', '00000080', '00FF00FF', '00FFFF00', #30-34 '0000FFFF', '00800080', '00800000', '00008080', '000000FF', #35-39 '0000CCFF', '00CCFFFF', '00CCFFCC', '00FFFF99', '0099CCFF', #40-44 '00FF99CC', '00CC99FF', '00FFCC99', '003366FF', '0033CCCC', #45-49 '0099CC00', '00FFCC00', '00FF9900', '00FF6600', '00666699', #50-54 '00969696', '00003366', '00339966', '00003300', '00333300', #55-59 '00993300', '00993366', '00333399', '00333333', #60-63 ) BLACK = COLOR_INDEX[0] WHITE = COLOR_INDEX[1] RED = COLOR_INDEX[2] DARKRED = COLOR_INDEX[8] BLUE = COLOR_INDEX[4] DARKBLUE = COLOR_INDEX[12] GREEN = COLOR_INDEX[3] DARKGREEN = COLOR_INDEX[9] YELLOW = COLOR_INDEX[5] DARKYELLOW = COLOR_INDEX[19]
字體
ws.cell(5,3).value='哈哈哈' ws.cell(5,3).font = Font(name='仿宋',size=12,color=Color(index=0),b=True,i=True) # size sz 字體大小 # b bold 是否粗體 # i italic 是否斜體 # name family 字體樣式
邊框
邊
Side(style='thin',color=Color(index=0)) # style可選項 style = ('dashDot','dashDotDot', 'dashed','dotted', 'double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot', 'mediumDashed', 'slantDashDot', 'thick', 'thin') # 'medium' 中粗 # 'thin' 細 # 'thick' 粗 # 'dashed' 虛線 # 'dotted' 點線
填充
PatternFill(patternType='solid',fgColor=Color(), bgColor=Color()) # fgColor 前景色 # bgColor 后景色 # 參數可選項 patternType = {'darkDown', 'darkUp', 'lightDown', 'darkGrid', 'lightVertical', 'solid', 'gray0625', 'darkHorizontal', 'lightGrid', 'lightTrellis', 'mediumGray', 'gray125', 'darkGray', 'lightGray', 'lightUp', 'lightHorizontal', 'darkTrellis', 'darkVertical'}
ws.cell(3,3).fill = PatternFill()
對齊
Alignment(horizontal='fill',vertical='center') # 參數可選項 horizontal = {'fill', 'distributed', 'centerContinuous', 'right', 'justify', 'center', 'left', 'general'} vertical = {'distributed', 'justify', 'center', 'bottom', 'top'} ws.cell(3,3).alignment= Alignment()
數字顯示樣式
鏈接
行高 列寬