操作excel
在Python中,处理Excel文件的常用模块有xlrd
、xlwt
和openpyxl
。以下是对这些模块的简要介绍:
-
xlrd:
xlrd
是一个用于读取Excel(.xls
和.xlsx
)文件数据的库。- 它提供了方便的API来访问Excel文件中的工作表、行、列和单元格。
xlrd
支持旧版Excel格式(.xls
, 即Excel 97-2003)。
-
xlwt:
xlwt
是一个用于写入数据到旧版Excel(.xls
, 即Excel 97-2003)文件格式的库。- 它允许用户创建新的Excel文件并对其进行编辑,如添加样式、字体等。
-
openpyxl:
openpyxl
是一个专门用于读取和写入最新版本的Excel文件(.xlsx
, 即从Office 2007开始使用的格式)。- 它支持更复杂操作,例如修改现有工作簿或创建新工作簿、插入公式、图表等。
使用 xlrd 读取 Excel 文件
import xlrd# 打开一个Workbook,只能打开旧的excel文件,不支持.xlsx文件
workbook = xlrd.open_workbook('./data/30/example.xls')# 获取所有sheet名称
sheets = workbook.sheet_names()
print(sheets)# 根据索引获取第一个sheet
sheet = workbook.sheet_by_index(0)# 获取行数和列数
rows = sheet.nrows
cols = sheet.ncols# 遍历所有行,并打印每一列值
for row_idx in range(rows):for col_idx in range(cols):cell_value = sheet.cell_value(row_idx, col_idx)print(cell_value, end='\t')print()
使用 xlwt 写入 Excel 文件
import xlwt# 创建Workbook对象
workbook = xlwt.Workbook()# 添加Sheet页,默认名为"testXLWTSheet"
worksheet = workbook.add_sheet('testXLWTSheet')# 写入数据到单元格(行号, 列号, 值)
worksheet.write(0, 0, 'Hello')
worksheet.write(1, 0, 'World')# 最后保存为.xls文件
workbook.save('./data/31/example.xlsx')
workbook.save('./data/31/example.xls')
使用 openpyxl 操作 Excel 文件
读取 .xlsx
from openpyxl import load_workbookfrom openpyxl.cell.cell import Cellwb = load_workbook('./data/32/example.xlsx')# 获取当前活跃的sheet,默认就是第一个sheet
sheet = wb.active
# 或者 wb.get_sheet_by_name('test_title测试标题') 【官方说过时!!】
# 或者 wb['test_title测试标题'] 【推荐方案】print(sheet.title)# 使用Type Hints:
# 为了提高代码清晰度和后续维护性,在编写函数或处理复杂数据结构时,推荐使用Type Hints(Python 3.5+ 引入)。
def process_cell(cell: Cell):# 现在你可以享受自动补全和类型检查print(cell.value)# print(type(cell)) # 打印 <class 'openpyxl.cell.cell.Cell'># print(dir(cell)) # 列出所有属性和方法# 将sheet结果转成list(list())
result = []# values_only参数为True时,只获取单元格的值,否则获取单元格对象Cell
for row in sheet.iter_rows(values_only=False):# print(row) # 打印每一行的单元格对象row_result = list()for cell in row:process_cell(cell)row_result.append(cell.value)result.append(row_result)print(result)# 将sheet结果转成list(tuple())
print([tuple(row) for row in sheet.iter_rows(values_only=True)])
写入 .xlsx
from openpyxl import Workbook
# from openpyxl.worksheet.worksheet import Worksheetwb = Workbook()
ws = wb.active # 默认创建了名为'Sheet' 的sheet页.# 通过指定行列写入一格数据
ws['A1'] = "Hello"
ws['B1'] = "World!"
ws['A2'] = "test_new_line"# 通过append写入一行数据,注意append的参数是一个list
# 同时是在没有数据的行开始写入
ws.append([1, 2, 3])
ws.append(['中文', 'aaaa', 11111])# 通过行写入多行数据
rows = [['Number', 'Batch 1', 'Batch 2'],[2, 40, 30],[3, 40, 25],[4, 50, 30],[5, 30, 10],[6, 25, 5],[7, 50, 10],
]
for row in rows:ws.append(row)print(type(ws))# 保存
wb.save("./data/32/example2.xlsx")
安装
pip install xlrd xlwt openpyxl
openpyxl
目前,openpyxl
是处理Excel文件(尤其是.xlsx
格式)的最常用Python库。这是因为它提供了对最新Excel文件格式的完整支持,并且可以很容易地读取和写入这些文件。与此同时,它也支持许多高级功能,如样式、过滤、图表、公式等。
虽然xlrd
和xlwt
在以前非常流行,但由于以下原因,它们的使用已经减少:
xlrd
自版本2.0起不再支持.xlsx
文件格式。xlwt
只能用来创建.xls
(Excel 97-2003)格式的文件,并不能创建或编辑.xlsx
(Excel 2007及以后版本)格式。
如果你需要处理旧版的.xls
文件,则可能还需要使用到这些库。但对于大多数现代应用程序而言,推荐使用如下库:
- openpyxl:适合读写
.xlsx
文件。 - pandas:一个强大的数据分析工具包,在内部也可以利用
openpyxl
,xlrd
, 或其他引擎来读写Excel文件。
在选择合适工具时,请考虑你所需处理的特定任务和数据类型。如果你正在开发新项目并且不受限于旧版Office软件,则建议优先选择 openpyxl
或者通过 pandas
, 这两者都能更好地兼容现代 .xlsx
格式并提供更多功能。
1. 单元格样式
openpyxl
允许你为单元格设置字体、边框、填充色、对齐方式等样式。
from openpyxl import Workbook
from openpyxl.styles import Font, Color, Alignment, Border, Sidewb = Workbook()
ws = wb.active# 设置字体样式
a1 = ws['A1']
a1.font = Font(name='Calibri', size=11, bold=True, italic=True, color='FF0000')
ws['A1'] = 'test_font'# 设置填充颜色
from openpyxl.styles import PatternFilla2 = ws['A2']
a2.fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
ws['A2'] = 'test_font'# 设置对齐方式
a3 = ws['A3']
a3.alignment = Alignment(horizontal='center', vertical='center')
ws['A3'] = 'test_font'# 批量设置
for row in ws["A4:F4"]:for cell in row:cell.font = Font(name='Calibri', size=11, bold=True, italic=True, color='FF0000')cell.value = 'test_font'wb.save('./data/openpyxl_export/styled.xlsx')
2. 公式
可以直接在单元格中输入公式,就像在Excel中一样。
# 公式
ws['B1'] = 10
ws['B2'] = 20# 在B3中使用公式求和B1和B2的值。
ws['B3'] = '=SUM(B1:B2)'# 在B4中使用公式求积B1和B2的值。
ws['B4'] = '=PRODUCT(B1:B2)'# 在B5中使用公式求平均值B1和B2的值。
ws['B5'] = '=AVERAGE(B1:B2)'# 在B6中使用公式求最大值B1和B2的值。
ws['B6'] = '=MAX(B1:B2)'# 在B7中使用公式求最小值B1和B2的值。
ws['B7'] = '=MIN(B1:B2)'wb.save('./data/openpyxl_export/styled.xlsx')
3. 合并与拆分单元格
# 合并A4到D4区域的单元格。
ws.merge_cells('A4:D4')
ws.merge_cells('A5:D5') # 合并后,单元格的值会显示在合并区域的第一个单元格中。# 拆分之前合并过的单元格。
ws.unmerge_cells('A4:D4') # 拆分后,合并区域的值会显示在第一个单元格中。wb.save('./data/openpyxl_export/styled2.xlsx')
4. 插入与删除行/列
# 插入行和列。
ws.insert_rows(5) # 在第5行之前插入一行。
ws.insert_cols(2) # 在第2列之前插入一列。
wb.save('./data/openpyxl_export/styled4.xlsx')# 删除行和列。
ws.delete_rows(4) # 删除第4行,删除后,往下的行会自动上移。
ws.delete_cols(2) # 删除第1列,删除后,往右的列会自动左移。wb.save('./data/openpyxl_export/styled5.xlsx')
5. 调整行高与列宽
# 设置第一行的高度。
ws.row_dimensions[1].height = 200# 设置C列的宽度。
ws.column_dimensions['C'].width = 300wb.save('./data/openpyxl_export/styled6.xlsx')
6. 图表创建
可以创建各种图表(如柱状图、折线图等)并添加到工作簿中。
# 图表创建
from openpyxl.chart import BarChart, Referencevalues = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10)
chart = BarChart()
chart.add_data(values)ws.add_chart(chart, "E5") # 将图表添加到E5位置wb.save('./data/openpyxl_export/styled7.xlsx')
7. 使用Pandas DataFrame读写数据
如果你正在处理大量数据,使用Pandas DataFrame进行读写可能更加方便。
# 使用pandas导出数据
import pandas as pd# 创建一个DataFrame
# Name和Age是列名
df = pd.DataFrame({'Name': ['John', 'Smith', 'Yirui'], 'Age': [30, 25, 15]})from openpyxl.utils.dataframe import dataframe_to_rows# 将DataFrame写入到ws中,index=False表示不写入索引列(在第一列,列名为空,索引数据从0开始),header=True表示写入列名。
for r in dataframe_to_rows(df, index=True, header=True):ws.append(r)wb.save('./data/openpyxl_export/styled8.xlsx')
以上只是openpyxl
库提供功能的一部分。通过这些高级特性,你可以实现几乎所有常见的Excel操作,并能够创建非常复杂和动态化定制化程度很高的报告或数据集。为了深入学习更多细节及最佳实践,请参考openpyxl
官方文档。