本文的標題是《Python讀取與寫入Excel模塊:openpyxl》來源于:由作者:陳海珍采編而成,主要講述了之前我們介紹過幾個模塊:xlrd、xlwt、XLsxWriter等,但是這些模塊要門只能
之前我們介紹過幾個模塊:xlrd、xlwt、XLsxWriter等,但是這些模塊要門只能只讀,要么只能只寫,那么有沒有即可讀,也可寫的模塊,**是肯定的,如pandas、openpyxl、文2com等,在此介紹其中一個:openpyxl。
openpyxl 是一個用于讀寫Excel的模塊,支持xlsx、xl**、xltx、xltm等文件的讀寫,不支持xls格式,如果讀取大的Excel文件,可以使用read_only(只讀模式),如果寫入大的Excel文件,可以使用write_only(只寫模式)。
一、openpysx模塊創建Excel文件4步法
1.1、Workbook():創建Excel文件
此函數是用來創建Excel文件的一個對象,返回的是一個對象,可以用此對象,創建工作表,保存文件等,如:
import openpyxl # 導入模塊
wb = Workbook() # 生成 Excel 文件對象
print(wb)
執行結果:
1.2、create_sheet("sheet_name"):創建工作表
openpyxl 在創建 Excel 文件對象時,會默認創建一個名叫“sheet”的工作表,如果想生成工作表,則需要使用 create_sheet() 函數,可用 wb.sheetnames 屬性查看所有工作表的名稱,如:
import openpyxl # 導入模塊
wb = Workbook() # 生成 Excel 文件對象
print(wb.sheetnames) # 默認生成的工作表 sheet
wb.create_sheet("new_sheet")
print(wb.sheetnames) # 增加了工作表 new_sheet
執行結果:
備注:openpyxl 在只寫模式下,不會生成默認工作表,此時只能使用 create_sheet() 函數創建。
1.3、向工作表中添加內容
openpyxl 添加內容比較接近 Python 語法,可以使用賦值語句 "=",也可以使用 append()語句(按行加入),如:
import openpyxl # 導入模塊
wb = Workbook() # 生成 Excel 文件對象
ws = wb.active # 默認工作表 sheet
# 添加內容(賦值語句)
ws["A1"] = 3
ws["A2"] = "hello world"
print(ws["A1"].value)
print(ws["A2"].value)
# 添加內容(append語句),按行添加
ws.append(["hello python","hello java","hello php"])
print(ws["A3"].value)
print(ws["B3"].value)
print(ws["C3"].value)
執行結果:
1.4、save("filename"):保存文件
當我們完成所有的**作后,就可以使用 save() 函數來保存我們創建的 Excel 文件,filename 是文件名稱及文件所保存的位置,如:
save("file/op/添加數據.xlsx") # 保存文件
執行結果:
以上就是 openpyxl 創建 Excel 文件的4個步驟,相比于 XLsxWriter 模塊,openpyxl 在數據添加這塊簡單,方便,與 python 語法接近。
二、openpyxl 讀取 Excel 文件
openpyxl 模塊可以使用 load_workbook("filename") 方法來加載本地 Excel 文件,filename 為文件路徑,如:
import openpyxl # 導入模塊
wb = load_workbook("file/op/編程語言排名榜單.xlsx") # 加載本地 Excel 文件
ws = wb["2019年"]
print("修改前 B3 的值:",ws["B3"].value) # 打印單元格 B3 的值
ws["B3"].value = "HTML" # 修改單元格 B3 的值
print("修改后 B3 的值:",ws["B3"].value) # 打印單元格 B3 的值
執行結果:
備注:openpyxl 不能完全讀取所有的內容,因此,如果本地Excel表格含有圖片或者圖表之類的,openpyxl 是不能讀取的,且在打開或者保存相同名稱的Excel表格時,原先表格的圖片或者圖表將會丟失。
三、openpyxl 進階用法
3.1、合并和拆分單元格
3.1.1、merge_cells(*args):合并單元格
在 openpyxl 模塊中,我們可以用 merge_cells(start_row, start_column, end_row, end_column) 方法來合并單元格,其中:
start_row:開始行
start_column:開始列
end_row:結束行
end_column:結束列
import openpyxl # 導入模塊
from openpyxl.styles import Alignment # 導入格式模塊
wb = Workbook() # 創建Excel文件對象
ws = wb.active # 選取當前sheet工作表
ws.merge_cells(start_row = 2,start_column = 1,end_row = 4,end_column = 4) # 合并單元格
# 也可以用 ws.merge_cells("A2:D2")
ws["A2"].alignment = Alignment(horizontal = "center",vertical = "center") # 添加樣式
ws["A2"].value = "合并單元格" # 添加內容
wb.save("file/op/合并單元格.xlsx") # 保存文件
執行結果:
3.1.2、unmerge_cells():拆分單元格
與 merge_cells() 相反,在 openpyxl 模塊中,我們可以用 unmerge_cells(start_row, start_column, end_row, end_column) 方法來拆分單元格,其中:
start_row:開始行
start_column:開始列
end_row:結束行
end_column:結束列
import openpyxl # 導入模塊
wb = load_workbook("file/op/合并單元格.xlsx") # 加載本地 Excel 文件
ws = wb.active # 選取工作表格
ws.unmerge_cells("A2:D4") # 拆分單元格
ws["A2"].value = "拆分單元格" # 添加內容
wb.save("file/op/合并單元格.xlsx") # 保存文件
執行結果:
3.2、行高和列寬
在 openpyxl 中,ws.row_dimensions["row_index"].height 用于設置行高,ws.column_dimensions["col_index"].width 用于設置列寬,如:
import openpyxl # 導入模塊
wb = Workbook() # 創建 Excel 文件對象
ws = wb.active # 選取工作表
ws.row_dimensions[1].height = 40 # 設置行高為 40 字符
ws.column_dimensions["D"].width = 40 # 設置列寬為 40 字符
ws["A1"] = "行高為20個字符" # 添加內容
ws["D1"] = "列寬為40個字符" # 添加內容
wb.save("file/op/設置行高和列寬.xlsx")
執行結果:
3.3、add_image(Image("image_path"),"cell"):插入圖片
在 openpyxl 模塊中,可以使用 add_image() 方法來向單元格添加圖片,如:
import openpyxl # 導入模塊
from openpyxl.drawing.image import Image # 導入圖片模塊
wb = Workbook() # 創建 Excel 文件對象
ws = wb.active # 選取工作表
ws.add_image(Image("file/test.jpg"),"C3") # 在 C3 單元格插入圖片
wb.save("file/op/插入圖片.xlsx")
執行結果:
3.4、HYPERLINK("url","name"):添加鏈接
在 openpyxl 中,添加超鏈接很簡單,使用 HYPERLINK() 即可向單元格里添加超鏈接,如:
import openpyxl # 導入模塊
from openpyxl.styles import Font
wb = Workbook() # 創建 Excel 文件對象
ws = wb.active # 選取工作表
ws["C3"].font = Font(color = '000000FF', i = True, underline = 'single') # 超鏈接文字樣式
ws["C3"].value = '=HYPERLINK("http://www.baidu.com","百度")' # 添加超鏈接
wb.save("file/op/添加鏈接.xlsx") #保存文件
執行結果:
3.4、樣式設置
openpyxl 樣式設置主要有 字體、填充、邊框、對齊、數字格式、保護等,具體用法如下:
下面我們介紹幾個:
import openpyxl # 導入模塊
from openpyxl.styles import Font, Border, Alignment, PatternFill, Side
wb = Workbook() # 創建 Excel 文件對象
ws = wb.active # 選取工作表
# 字體樣式設置
font = Font(name="黑體",
size=20,
bold=True,
italic=True,
color = '00CC99FF'
)
# 填充樣式設置
fill = PatternFill(fill_type = None,
start_color = 'FFFFFFFF',
end_color = 'FF000000'
)
# 邊框樣式設置
border = Border(left = Side(border_style = 'dotted',color = 'FF000000'),
right = Side(border_style = 'dotted',color = 'FF000000'),
top = Side(border_style = None,color = 'FF000000'),
bottom = Side(border_style = None,color = 'FF000000'),
vertical = Side(border_style = None,color = 'FF000000'),
horizontal = Side(border_style = None,color = 'FF000000')
)
# 對齊方式設置
align = Alignment(horizontal = 'center',
vertical = 'center'
)
C3 = ws["C3"] # 獲取 C3 單元格
C3.value = "I Love Python" # 添加內容
C3.font = font # 設置字體樣式
C3.fill = fill # 設置填充樣式
C3.border = border # 設置邊框樣式
C3.alignment = align # 設置對齊方式
wb.save("file/op/樣式設置.xlsx") #保存文件
執行結果:
3.5、單元格屬性獲取
單元格的屬性比較多,下面列舉幾個比較常用的,如下:
from openpyxl import load_workbook # 導入模塊
wb = load_workbook("file/op/編程語言排名榜單.xlsx") # 打開本地文件
ws = wb.active # 選擇工作表
b5 = ws["B5"] # 獲取單元格 B5
print("單元格 B5 的值:",b5.value) # 獲取 B5 的值
print("單元格 B5 的行索引:",b5.row) # 獲取 B5 的行索引
print("單元格 B5 的列索引:",b5.col_idx) # 獲取 B5 的列索引
print("單元格 B5 的列名稱:",b5.column_letter) # 獲取 B5 的列名稱
print("單元格 B5 的坐標:",b5.coordinate) # 獲取 B5 的坐標
print("單元格 B5 的數據類型:",b5.data_type) # 獲取 B5 的數據類型
print("單元格 B5 的默認編碼:",b5.encoding) # 獲取 B5 的默認編碼
print("單元格 B5 的樣式:",b5.style) # 獲取 B5 的樣式
print("單元格 B5 的樣式id:",b5.style_id) # 獲取 B5 的樣式id
執行結果:
3.6、單元格數據獲取
單元格的數據獲取可以使用 value 屬性獲取,如:
from openpyxl import load_workbook # 導入模塊
wb = load_workbook("file/op/編程語言排名榜單.xlsx") # 打開本地文件
ws = wb.active # 選擇工作表
# 單個數據獲取
print("單個數據獲取:",ws["B5"],ws["B6"])
# 按行獲取數據
print("按行獲取數據:")
for i in ws.values:
print(i)
# 范圍獲取數據
print("范圍獲取數據:")
for i in ws["A3:E6"]:
for j in i:
print(j,j.value)
執行結果:
以上為 openpyxl 的一些簡單介紹,還有很多用法,在此就不一一介紹了,感興趣的朋友,可以參考官方文檔。
本文原作者為陳海珍,轉載請注明:出處!如該文有不妥之處,請聯系站長刪除,謝謝合作~
原創文章,作者:陳海珍,如若轉載,請注明出處:http://www.uuuxu.com/20220516328138.html