Python自動(dòng)化操作Excel的多種方式(Pandas+openpyxl+xlrd)
Pandas操作Excel
安裝Pandas
pip install pandas
使用pandas操作Excel文件主要涉及讀取(read_excel)和寫入(to_excel)兩個(gè)主要操作。
讀取Excel文件(read_excel)
pandas的read_excel函數(shù)用于讀取Excel文件(.xls或.xlsx),并將其內(nèi)容加載到DataFrame對(duì)象中。
語(yǔ)法參數(shù)
io: 文件路徑或文件對(duì)象。sheet_name: 指定要讀取的工作表名稱或索引??梢允亲址⒄麛?shù)、字符串列表或None。如果是None,則返回字典,其中包含所有工作表。header: 指定作為列名的行,默認(rèn)為0(第一行)。如果文件沒(méi)有列標(biāo)題,可以設(shè)置為None。names: 用于結(jié)果的列名的列表,如果文件不包含列標(biāo)題行,應(yīng)該明確指定此參數(shù)。index_col: 用作行索引的列編號(hào)或列名,可以是整數(shù)、字符串、整數(shù)列表、字符串列表或False(默認(rèn))。usecols: 返回列的列號(hào)或列名列表。dtype: 數(shù)據(jù)或字典,用于強(qiáng)制指定某些列的數(shù)據(jù)類型。engine: 用于讀取Excel文件的引擎。None將嘗試使用io的擴(kuò)展名來(lái)選擇引擎。如果安裝了xlrd,則.xls文件將使用它;否則,將使用openpyxl或odfpy(對(duì)于.ods文件)。
案例:
import pandas as pd
# 讀取Excel文件
df = pd.read_excel('example.xlsx', sheet_name='Sheet1', header=0, index_col=None, usecols=None, dtype=None)
# 顯示前幾行數(shù)據(jù)
print(df.head())
# 如果文件沒(méi)有列標(biāo)題
df_no_header = pd.read_excel('example_no_header.xlsx', header=None, names=['Column1', 'Column2', 'Column3'])
print(df_no_header.head())
# 讀取多個(gè)工作表
xls = pd.ExcelFile('example.xlsx')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')
# 或者
dfs = pd.read_excel(xls, sheet_name=None) # 返回一個(gè)字典,鍵為工作表名,值為DataFrame進(jìn)階案例:讀取特定單元格范圍
雖然read_excel沒(méi)有直接讀取特定單元格范圍的參數(shù),但你可以通過(guò)usecols和行切片來(lái)實(shí)現(xiàn)類似的效果。
# 假設(shè)我們只想讀取'A'列和'C'列的前兩行
df = pd.read_excel('example.xlsx', usecols=['A', 'C']).head(2)寫入Excel文件(to_excel)
DataFrame的to_excel方法用于將DataFrame寫入Excel文件。
語(yǔ)法參數(shù)
excel_writer: 文件路徑或ExcelWriter對(duì)象。sheet_name: 字符串,默認(rèn)為'Sheet1'。columns: 要寫入的列名列表。header: 是否寫入列名作為Excel文件的第一行,默認(rèn)為True。index: 是否將行索引寫入Excel文件,默認(rèn)為True。startrow和startcol: 左上角單元格的行號(hào)和列號(hào),用于開始寫入,默認(rèn)為0。engine: 用于寫入Excel文件的引擎,默認(rèn)為None(將嘗試使用openpyxl或xlsxwriter)。
案例
# 創(chuàng)建一個(gè)簡(jiǎn)單的DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': ['foo', 'bar', 'baz', 'qux'],
'C': [1.0, 2.1, 3.2, 4.3]
})
# 寫入Excel文件
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False, header=True)
# 如果要寫入多個(gè)工作表
with pd.ExcelWriter('output_multiple_sheets.xlsx') as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False)
df.to_excel(writer, sheet_name='Sheet2', index=False, startrow=10) # 從第11行開始寫入進(jìn)階案例:寫入帶有樣式的Excel
為了寫入帶有樣式的Excel文件,你需要使用ExcelWriter和xlsxwriter或openpyxl引擎(取決于你的需求)。
# 使用xlsxwriter引擎寫入帶有樣式的Excel
with pd.ExcelWriter('styled_output.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# 創(chuàng)建一個(gè)格式對(duì)象
format = workbook.add_format({'bold': True, 'font_color': 'red'})
# 應(yīng)用格式到特定單元格
worksheet.write('A1', 'Styled Cell', format)注意:xlsxwriter引擎在寫入時(shí)不支持直接修改已存在的DataFrame內(nèi)容(如通過(guò)DataFrame.style),它主要用于在寫入時(shí)添加額外的樣式或格式。如果你需要復(fù)雜的樣式處理,可能需要結(jié)合使用pandas和openpyxl(或xlsxwriter)的高級(jí)功能。
openpyxl操作Excel
openpyxl 是一個(gè)用于讀寫 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 庫(kù)。它提供了豐富的接口來(lái)操作 Excel 文件,包括讀取、修改和寫入數(shù)據(jù),以及設(shè)置樣式等。下面我將詳細(xì)解釋如何使用 openpyxl 操作 Excel,并給出案例代碼和進(jìn)階案例。
安裝 openpyxl
首先,確保你已經(jīng)安裝了 openpyxl。如果還沒(méi)有安裝,可以通過(guò) pip 安裝:
pip install openpyxl
基本操作
加載工作簿
使用 openpyxl.load_workbook() 函數(shù)加載一個(gè)現(xiàn)有的 Excel 文件。
from openpyxl import load_workbook wb = load_workbook(filename='example.xlsx')
激活工作表
通過(guò)工作簿對(duì)象獲取工作表。你可以通過(guò)工作表名稱或索引來(lái)訪問(wèn)特定的工作表。
# 通過(guò)名稱 ws = wb['Sheet1'] # 或者通過(guò)索引(索引從0開始) ws = wb.worksheets[0] # 也可以使用 active 屬性獲取當(dāng)前活動(dòng)的工作表 ws = wb.active
讀取數(shù)據(jù)
你可以通過(guò)單元格的坐標(biāo)來(lái)讀取數(shù)據(jù)。
# 讀取單元格的值
cell_value = ws['A1'].value
print(cell_value)
# 遍歷行
for row in ws.iter_rows(values_only=True):
print(row)
# 遍歷列
for col in ws.iter_cols(values_only=True):
for value in col:
print(value)寫入數(shù)據(jù)
你可以直接給單元格賦值來(lái)寫入數(shù)據(jù)。
# 寫入數(shù)據(jù)
ws['B2'] = 'Hello, openpyxl!'
# 保存修改
wb.save('modified_example.xlsx')語(yǔ)法參數(shù)詳解
由于 openpyxl 的功能非常廣泛,這里只列舉一些常用函數(shù)和方法的參數(shù)。
load_workbook(filename, read_only=False, data_only=False, keep_vba=True, ...)filename: Excel 文件路徑。read_only: 是否以只讀模式打開文件。data_only: 是否只讀取單元格的值,忽略公式(默認(rèn)為 False)。keep_vba: 是否保留 VBA 內(nèi)容(默認(rèn)為 True)。
Worksheet.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False, ...)min_row,max_row,min_col,max_col: 指定迭代的行或列的范圍。values_only: 是否只迭代單元格的值(默認(rèn)為 False,迭代單元格對(duì)象)。
Worksheet.iter_cols(...)與iter_rows類似,但用于列迭代。
案例代碼
讀取并修改 Excel
from openpyxl import load_workbook
# 加載工作簿
wb = load_workbook('example.xlsx')
# 激活工作表
ws = wb.active
# 讀取單元格數(shù)據(jù)
print(ws['A1'].value)
# 修改單元格數(shù)據(jù)
ws['B2'] = 'New Value'
# 保存修改后的工作簿
wb.save('modified_example.xlsx')進(jìn)階案例
設(shè)置樣式
from openpyxl import Workbook
from openpyxl.styles import Font, Color, Alignment, Border, Side
# 創(chuàng)建一個(gè)新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 創(chuàng)建一個(gè)字體對(duì)象
font = Font(name='Calibri', size=11, bold=True, italic=False, vertAlign=None,
underline='none', strike=False, color='FF0000')
# 創(chuàng)建一個(gè)對(duì)齊對(duì)象
alignment = Alignment(horizontal='general', vertical='bottom',
text_rotation=0, wrap_text=False,
shrink_to_fit=False, indent=0)
# 創(chuàng)建一個(gè)邊框?qū)ο?
thin = Side(border_style="thin", color="000000")
border = Border(top=thin, left=thin, right=thin, bottom=thin)
# 應(yīng)用樣式到單元格
ws['A1'].font = font
ws['A1'].alignment = alignment
ws['A1'].border = border
ws['A1'] = 'Styled Cell'
# 保存工作簿
wb.save('styled_workbook.xlsx')在進(jìn)階案例中,我們展示了如何創(chuàng)建字體、對(duì)齊和邊框樣式,并將它們應(yīng)用到單元格上。openpyxl 提供了豐富的樣式選項(xiàng),可以滿足大多數(shù) Excel 樣式設(shè)置的需求。
xlrd操作Excel
xlrd 是一個(gè)用于讀取 Excel 文件(主要是 .xls 和 .xlsx 格式,盡管對(duì) .xlsx 的支持可能不如 openpyxl 全面)的 Python 庫(kù)。然而,需要注意的是,從版本 2.0.0 開始,xlrd 僅支持 .xls 格式的文件,不再支持 .xlsx。對(duì)于 .xlsx 文件,推薦使用 openpyxl 或 pandas(后者底層可以調(diào)用 openpyxl)。
安裝 xlrd
首先,確保你已經(jīng)安裝了 xlrd。如果還沒(méi)有安裝,可以通過(guò) pip 安裝:
pip install xlrd==1.2.0 # 最好選擇一個(gè)支持.xlsx的舊版本
基本操作
加載工作簿
使用 xlrd.open_workbook() 函數(shù)加載 Excel 文件。
import xlrd
# 加載工作簿
workbook = xlrd.open_workbook('example.xls')訪問(wèn)工作表
通過(guò)索引或名稱訪問(wèn)工作表。
# 通過(guò)索引訪問(wèn)(索引從0開始)
sheet = workbook.sheet_by_index(0)
# 或者通過(guò)名稱訪問(wèn)
sheet = workbook.sheet_by_name('Sheet1')讀取數(shù)據(jù)
使用行號(hào)(從0開始)和列號(hào)(也從0開始)或單元格名稱(如 'A1')來(lái)讀取數(shù)據(jù)。
# 通過(guò)行號(hào)和列號(hào)讀取 cell_value = sheet.cell_value(0, 0) # 讀取第一行第一列的數(shù)據(jù) print(cell_value) # 或者使用 cell 方法(返回單元格對(duì)象,然后可以調(diào)用 value 屬性) cell = sheet.cell(0, 0) print(cell.value) # 通過(guò)單元格名稱讀取(需要安裝xlutils或類似庫(kù)來(lái)轉(zhuǎn)換A1表示法) # 注意:xlrd本身不直接支持A1表示法,這里僅作為說(shuō)明 # 通常,你會(huì)通過(guò)計(jì)算行號(hào)和列號(hào)來(lái)訪問(wèn)單元格
語(yǔ)法參數(shù)詳解
由于 xlrd 的 API 相對(duì)簡(jiǎn)單,這里主要關(guān)注 open_workbook() 和 sheet_by_...() 方法的參數(shù)。
xlrd.open_workbook(filename=None, ...)filename: Excel 文件路徑。- 其他參數(shù)(如
on_demand、formatting_info等)在較新版本的xlrd中可能不再支持或用途有限,特別是針對(duì).xlsx文件的處理。
workbook.sheet_by_index(sheetx)和workbook.sheet_by_name(sheet_name)sheetx: 工作表的索引(整數(shù))。sheet_name: 工作表的名稱(字符串)。
案例代碼
讀取 Excel 文件中的數(shù)據(jù)
import xlrd
# 加載工作簿
workbook = xlrd.open_workbook('example.xls')
# 通過(guò)名稱訪問(wèn)工作表
sheet = workbook.sheet_by_name('Sheet1')
# 讀取并打印第一行和第一列的數(shù)據(jù)
print(sheet.cell_value(0, 0))
# 遍歷所有行和列
for row_idx in range(sheet.nrows):
for col_idx in range(sheet.ncols):
print(sheet.cell_value(row_idx, col_idx), end='\t')
print() # 換行到此這篇關(guān)于Python自動(dòng)化操作Excel的多種方式(Pandas+openpyxl+xlrd)的文章就介紹到這了,更多相關(guān)Python操作Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中對(duì)_init_的理解及實(shí)例解析
這篇文章主要介紹了python中對(duì)_init_的理解及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
教你怎么用Python操作MySql數(shù)據(jù)庫(kù)
很多小伙伴都在問(wèn)我能不能出一篇怎么用Python操作MySql數(shù)據(jù)庫(kù)的教程,今天特地整理了本篇文章,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-05-05
python學(xué)習(xí)之使用Matplotlib畫實(shí)時(shí)的動(dòng)態(tài)折線圖的示例代碼
這篇文章主要介紹了python學(xué)習(xí)之使用Matplotlib畫實(shí)時(shí)的動(dòng)態(tài)折線圖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
python 實(shí)現(xiàn)從高分辨圖像上摳取圖像塊
今天小編就為大家分享一篇python 實(shí)現(xiàn)從高分辨圖像上摳取圖像塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python利用@property優(yōu)雅實(shí)現(xiàn)控制類成員訪問(wèn)
在Python面向?qū)ο缶幊讨?類成員的訪問(wèn)控制是一個(gè)核心話題,@property裝飾器通過(guò)將方法偽裝成屬性,提供了一種優(yōu)雅的解決方案,下面小編就和大家詳細(xì)介紹一下吧2026-01-01
python對(duì)兩個(gè)列表求交集的三種實(shí)現(xiàn)方法
本文主要介紹了python對(duì)兩個(gè)列表求交集的實(shí)現(xiàn)示例,包括使用集合、列表推導(dǎo)式和itertools.filterfalse,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
pandas探索你的數(shù)據(jù)實(shí)現(xiàn)可視化示例詳解
這篇文章主要為大家介紹了pandas探索你的數(shù)據(jù)實(shí)現(xiàn)可視化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

