在Python中,操作Excel数据通常可以通过几个流行的库来实现,比如
pandas
、openpyxl
、xlrd
等。下面会分别介绍这三个流行库来实现对Excel的操作。
推荐阅读:
Python入门最全基础
Python趣味小游戏
Python疑难杂症百科-BUG编年史
目录
Pandas操作Excel
安装Pandas
读取Excel文件(read_excel)
语法参数
案例:
进阶案例:读取特定单元格范围
写入Excel文件(to_excel)
语法参数
案例
进阶案例:写入带有样式的Excel
openpyxl操作Excel
安装 openpyxl
基本操作
加载工作簿
激活工作表
读取数据
写入数据
语法参数详解
案例代码
读取并修改 Excel
进阶案例
设置样式
xlrd操作Excel
安装 xlrd
基本操作
加载工作簿
访问工作表
读取数据
语法参数详解
案例代码
读取 Excel 文件中的数据
pip install pandas
使用pandas
操作Excel文件主要涉及读取(read_excel
)和写入(to_excel
)两个主要操作。
read_excel
)pandas
的read_excel
函数用于读取Excel文件(.xls
或.xlsx
),并将其内容加载到DataFrame
对象中。
io
: 文件路径或文件对象。sheet_name
: 指定要读取的工作表名称或索引。可以是字符串、整数、字符串列表或None。如果是None,则返回字典,其中包含所有工作表。header
: 指定作为列名的行,默认为0(第一行)。如果文件没有列标题,可以设置为None。names
: 用于结果的列名的列表,如果文件不包含列标题行,应该明确指定此参数。index_col
: 用作行索引的列编号或列名,可以是整数、字符串、整数列表、字符串列表或False(默认)。usecols
: 返回列的列号或列名列表。dtype
: 数据或字典,用于强制指定某些列的数据类型。engine
: 用于读取Excel文件的引擎。None
将尝试使用io
的扩展名来选择引擎。如果安装了xlrd
,则.xls
文件将使用它;否则,将使用openpyxl
或odfpy
(对于.ods
文件)。import pandas as pd
# 读取Excel文件
df = pd.read_excel('example.xlsx', sheet_name='Sheet1', header=0, index_col=None, usecols=None, dtype=None)
# 显示前几行数据
print(df.head())
# 如果文件没有列标题
df_no_header = pd.read_excel('example_no_header.xlsx', header=None, names=['Column1', 'Column2', 'Column3'])
print(df_no_header.head())
# 读取多个工作表
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) # 返回一个字典,键为工作表名,值为DataFrame
虽然read_excel
没有直接读取特定单元格范围的参数,但你可以通过usecols
和行切片来实现类似的效果。
# 假设我们只想读取'A'列和'C'列的前两行
df = pd.read_excel('example.xlsx', usecols=['A', 'C']).head(2)
to_excel
)DataFrame
的to_excel
方法用于将DataFrame
写入Excel文件。
excel_writer
: 文件路径或ExcelWriter对象。sheet_name
: 字符串,默认为'Sheet1'。columns
: 要写入的列名列表。header
: 是否写入列名作为Excel文件的第一行,默认为True。index
: 是否将行索引写入Excel文件,默认为True。startrow
和 startcol
: 左上角单元格的行号和列号,用于开始写入,默认为0。engine
: 用于写入Excel文件的引擎,默认为None
(将尝试使用openpyxl
或xlsxwriter
)。# 创建一个简单的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)
# 如果要写入多个工作表
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行开始写入
为了写入带有样式的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']
# 创建一个格式对象
format = workbook.add_format({'bold': True, 'font_color': 'red'})
# 应用格式到特定单元格
worksheet.write('A1', 'Styled Cell', format)
注意:xlsxwriter
引擎在写入时不支持直接修改已存在的DataFrame
内容(如通过DataFrame.style
),它主要用于在写入时添加额外的样式或格式。如果你需要复杂的样式处理,可能需要结合使用pandas
和openpyxl
(或xlsxwriter
)的高级功能。
openpyxl操作Excel
openpyxl
是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。它提供了丰富的接口来操作 Excel 文件,包括读取、修改和写入数据,以及设置样式等。下面我将详细解释如何使用openpyxl
操作 Excel,并给出案例代码和进阶案例。
首先,确保你已经安装了 openpyxl
。如果还没有安装,可以通过 pip 安装:
pip install openpyxl
使用 openpyxl.load_workbook()
函数加载一个现有的 Excel 文件。
from openpyxl import load_workbook
wb = load_workbook(filename='example.xlsx')
通过工作簿对象获取工作表。你可以通过工作表名称或索引来访问特定的工作表。
# 通过名称
ws = wb['Sheet1']
# 或者通过索引(索引从0开始)
ws = wb.worksheets[0]
# 也可以使用 active 属性获取当前活动的工作表
ws = wb.active
你可以通过单元格的坐标来读取数据。
# 读取单元格的值
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)
你可以直接给单元格赋值来写入数据。
# 写入数据
ws['B2'] = 'Hello, openpyxl!'
# 保存修改
wb.save('modified_example.xlsx')
由于 openpyxl
的功能非常广泛,这里只列举一些常用函数和方法的参数。
load_workbook(filename, read_only=False, data_only=False, keep_vba=True, ...)
filename
: Excel 文件路径。read_only
: 是否以只读模式打开文件。data_only
: 是否只读取单元格的值,忽略公式(默认为 False)。keep_vba
: 是否保留 VBA 内容(默认为 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
: 是否只迭代单元格的值(默认为 False,迭代单元格对象)。Worksheet.iter_cols(...)
与 iter_rows
类似,但用于列迭代。from openpyxl import load_workbook
# 加载工作簿
wb = load_workbook('example.xlsx')
# 激活工作表
ws = wb.active
# 读取单元格数据
print(ws['A1'].value)
# 修改单元格数据
ws['B2'] = 'New Value'
# 保存修改后的工作簿
wb.save('modified_example.xlsx')
from openpyxl import Workbook
from openpyxl.styles import Font, Color, Alignment, Border, Side
# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
# 创建一个字体对象
font = Font(name='Calibri', size=11, bold=True, italic=False, vertAlign=None,
underline='none', strike=False, color='FF0000')
# 创建一个对齐对象
alignment = Alignment(horizontal='general', vertical='bottom',
text_rotation=0, wrap_text=False,
shrink_to_fit=False, indent=0)
# 创建一个边框对象
thin = Side(border_style="thin", color="000000")
border = Border(top=thin, left=thin, right=thin, bottom=thin)
# 应用样式到单元格
ws['A1'].font = font
ws['A1'].alignment = alignment
ws['A1'].border = border
ws['A1'] = 'Styled Cell'
# 保存工作簿
wb.save('styled_workbook.xlsx')
在进阶案例中,我们展示了如何创建字体、对齐和边框样式,并将它们应用到单元格上。openpyxl
提供了丰富的样式选项,可以满足大多数 Excel 样式设置的需求。
xlrd
是一个用于读取 Excel 文件(主要是.xls
和.xlsx
格式,尽管对.xlsx
的支持可能不如openpyxl
全面)的 Python 库。然而,需要注意的是,从版本 2.0.0 开始,xlrd
仅支持.xls
格式的文件,不再支持.xlsx
。对于.xlsx
文件,推荐使用openpyxl
或pandas
(后者底层可以调用openpyxl
)。
首先,确保你已经安装了 xlrd
。如果还没有安装,可以通过 pip 安装:
pip install xlrd==1.2.0 # 最好选择一个支持.xlsx的旧版本
使用 xlrd.open_workbook()
函数加载 Excel 文件。
import xlrd
# 加载工作簿
workbook = xlrd.open_workbook('example.xls')
通过索引或名称访问工作表。
# 通过索引访问(索引从0开始)
sheet = workbook.sheet_by_index(0)
# 或者通过名称访问
sheet = workbook.sheet_by_name('Sheet1')
使用行号(从0开始)和列号(也从0开始)或单元格名称(如 'A1')来读取数据。
# 通过行号和列号读取
cell_value = sheet.cell_value(0, 0) # 读取第一行第一列的数据
print(cell_value)
# 或者使用 cell 方法(返回单元格对象,然后可以调用 value 属性)
cell = sheet.cell(0, 0)
print(cell.value)
# 通过单元格名称读取(需要安装xlutils或类似库来转换A1表示法)
# 注意:xlrd本身不直接支持A1表示法,这里仅作为说明
# 通常,你会通过计算行号和列号来访问单元格
由于 xlrd
的 API 相对简单,这里主要关注 open_workbook()
和 sheet_by_...()
方法的参数。
xlrd.open_workbook(filename=None, ...)
filename
: Excel 文件路径。on_demand
、formatting_info
等)在较新版本的 xlrd
中可能不再支持或用途有限,特别是针对 .xlsx
文件的处理。workbook.sheet_by_index(sheetx)
和 workbook.sheet_by_name(sheet_name)
sheetx
: 工作表的索引(整数)。sheet_name
: 工作表的名称(字符串)。import xlrd
# 加载工作簿
workbook = xlrd.open_workbook('example.xls')
# 通过名称访问工作表
sheet = workbook.sheet_by_name('Sheet1')
# 读取并打印第一行和第一列的数据
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() # 换行