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() # 换行