python第三方庫openpyxl詳解


前言

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()

數字顯示樣式

鏈接

行高 列寬

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM