Python Excel操作:从xlrd读取到xlwt/openpyxl写入的全面指南118
在数据驱动的时代,Excel作为一种普遍且高效的数据存储和交换格式,广泛应用于各个领域。Python凭借其强大的数据处理能力和丰富的第三方库生态,成为自动化Excel操作的首选语言之一。然而,对于初学者来说,Python处理Excel文件时,经常会遇到一个概念上的混淆:`xlrd`库能否用于写入数据?本文将作为一名专业的程序员,深入剖析Python中处理Excel文件的不同库,特别是澄清`xlrd`的功能边界,并详细介绍如何使用`xlwt`和`openpyxl`这两个主力库来高效地写入数据,旨在为读者提供一份从读取到写入的全面操作指南。
我们将首先从`xlrd`库的视角出发,详细讲解如何读取Excel文件中的数据,这正是它的核心功能。随后,我们将明确指出`xlrd`无法写入数据的原因,并引出专门用于写入的库:`xlwt`(针对旧版`.xls`文件)和`openpyxl`(针对新版`.xlsx`文件)。最后,我们将通过丰富的代码示例,展示如何利用这些库创建新的Excel文件、写入数据、设置样式,并探讨读写结合的实际应用场景。
Python与Excel的桥梁——深入理解xlrd
`xlrd`是Python中一个非常流行的库,专门用于读取Microsoft Excel文件的数据和格式信息。它支持`.xls`格式的Excel文件(Excel 97-2003),并且在较新的版本中也对`.xlsx`格式提供了一定程度的支持,但通常推荐`openpyxl`处理`.xlsx`文件会更高效和功能更全面。
xlrd的核心功能与安装
`xlrd`库的设计哲学是“只读不写”。它的主要任务是解析Excel文件的二进制结构,提取其中的工作簿、工作表、行、列以及单元格数据和样式信息。这使得它在数据清洗、报告生成、数据分析前的预处理等场景中表现出色。
安装`xlrd`非常简单,只需使用pip命令:
pip install xlrd
使用xlrd读取Excel文件
使用`xlrd`读取Excel文件的基本步骤包括:打开工作簿、选择工作表、遍历行或列,以及读取单元格数据。
1. 打开工作簿 (Workbook)
`xlrd.open_workbook()`函数是入口点,它接受文件路径作为参数,返回一个`Workbook`对象。
import xlrd
try:
workbook = xlrd.open_workbook("示例数据.xls") # 替换为你的Excel文件路径
print("工作簿已成功打开。")
except as e:
print(f"打开Excel文件时发生错误: {e}")
except FileNotFoundError:
print("文件未找到,请检查路径。")
2. 获取工作表 (Sheet)
你可以通过索引或名称来获取工作表对象。
`()`:获取所有工作表的列表。
`workbook.sheet_by_index(index)`:通过索引获取工作表(索引从0开始)。
`workbook.sheet_by_name(name)`:通过名称获取工作表。
# 假设 workbook 已经打开
sheet_names = workbook.sheet_names()
print(f"工作表名称:{sheet_names}")
sheet = workbook.sheet_by_index(0) # 获取第一个工作表
print(f"当前工作表名称:{}")
print(f"行数:{},列数:{}")
# 也可以通过名称获取
# sheet = workbook.sheet_by_name("Sheet1")
3. 读取单元格数据
获取到工作表对象后,你可以访问其行、列和单元格。
`sheet.row_values(row_idx)`:获取指定行的所有单元格值(返回列表)。
`sheet.col_values(col_idx)`:获取指定列的所有单元格值(返回列表)。
`(row_idx, col_idx)`:获取指定行和列的单元格对象。
`sheet.cell_value(row_idx, col_idx)`:获取指定单元格的值。
# 遍历所有行和列读取数据
print("--- 读取所有单元格数据 ---")
for r_idx in range():
row_data = []
for c_idx in range():
cell_obj = (r_idx, c_idx)
cell_value =
cell_type = # 获取单元格类型
# 处理日期类型
if cell_type == xlrd.XL_CELL_DATE:
date_tuple = xlrd.xldate_as_tuple(cell_value, )
# 根据需要格式化日期,例如:
cell_value = f"{date_tuple[0]}-{date_tuple[1]:02d}-{date_tuple[2]:02d}"
(cell_value)
print(row_data)
# 读取特定单元格
print("--- 读取特定单元格数据 ---")
if > 1 and > 0:
specific_cell_value = sheet.cell_value(0, 0) # 读取第一个单元格
print(f"单元格 (0, 0) 的值为: {specific_cell_value}")
单元格类型 (ctype) 详解:
`XL_CELL_EMPTY` (0): 空单元格
`XL_CELL_TEXT` (1): 文本
`XL_CELL_NUMBER` (2): 数字
`XL_CELL_DATE` (3): 日期
`XL_CELL_BOOLEAN` (4): 布尔值
`XL_CELL_ERROR` (5): 错误
`XL_CELL_BLANK` (6): 空白(可能包含格式但无值)
通过上述示例,我们可以看到`xlrd`在读取Excel数据方面提供了强大而灵活的功能。然而,正如其名称所示("rd"通常代表"read"),它的能力止步于此。
破除误区:xlrd为何不能写入?
许多初学者在使用Python处理Excel时,会自然地认为一个库既然能读取,那么也应该能写入。但对于`xlrd`来说,这是一个误解。`xlrd`是一个纯粹的读取库,不提供任何写入Excel文件的功能。
这主要是由其设计目标和内部实现机制决定的。`xlrd`的设计初衷是高效地解析现有的Excel二进制流,提取数据。它不包含构建Excel文件结构、管理工作表、单元格属性以及保存为`.xls`或`.xlsx`格式所需的逻辑。写入Excel文件需要一套完全不同的API和文件格式生成器。
因此,当你的需求涉及修改现有Excel文件或创建全新的Excel文件时,你需要转向专门的写入库。
Python Excel写入数据的正确姿势——xlwt与openpyxl
为了实现Excel文件的写入功能,Python社区提供了两个主要的库:`xlwt`和`openpyxl`。它们各有侧重,分别服务于不同的Excel文件格式。
1. xlwt:写入旧版.xls文件
`xlwt`库是`xlrd`的兄弟库,专注于写入旧版Excel文件(`.xls`,Excel 97-2003格式)。如果你需要生成或修改的Excel文件必须兼容旧版Office,或者文件大小对性能要求不高,`xlwt`是一个不错的选择。
安装:
pip install xlwt
使用xlwt写入数据
`xlwt`的写入流程通常包括:创建一个工作簿、添加一个或多个工作表、向单元格写入数据、设置样式,最后保存工作簿。
import xlwt
# 1. 创建一个新的工作簿
workbook_write = (encoding='utf-8')
# 2. 添加一个工作表
sheet_write = workbook_write.add_sheet('新数据表')
# 3. 写入数据
# 写入标题行
(0, 0, '姓名') # (行, 列, 值)
(0, 1, '年龄')
(0, 2, '城市')
# 写入数据行
data = [
('张三', 30, '北京'),
('李四', 25, '上海'),
('王五', 35, '广州')
]
for row_idx, row_data in enumerate(data):
for col_idx, cell_value in enumerate(row_data):
(row_idx + 1, col_idx, cell_value) # 从第1行开始写入
# 4. 保存工作簿
try:
('新生成的数据.xls')
print("Excel文件 '新生成的数据.xls' 已成功创建和写入。")
except Exception as e:
print(f"保存文件时发生错误: {e}")
设置单元格样式
`xlwt`提供了强大的样式控制功能,你可以设置字体、颜色、边框、对齐方式等。
import xlwt
workbook_style = (encoding='utf-8')
sheet_style = workbook_style.add_sheet('带样式数据')
# 定义一个标题样式
header_style = () # 初始化样式
font = () # 创建字体对象
= '宋体'
= True
= 20 * 12 # 字体大小,20为字号,*12是xlwt的单位
= font
pattern = () # 创建背景模式
= .SOLID_PATTERN # 填充模式
pattern.pattern_fore_colour = .colour_map['light_blue'] # 背景色
= pattern
borders = () # 创建边框
=
=
=
=
= borders
alignment = () # 创建对齐方式
= .HORZ_CENTER # 水平居中
= .VERT_CENTER # 垂直居中
= alignment
# 定义一个普通数据样式
data_style = ()
data_font = ()
= 'Times New Roman'
= data_font
# 写入带样式的标题
headers = ['产品名称', '销售量', '单价', '总价']
for col_idx, header in enumerate(headers):
(0, col_idx, header, header_style)
# 写入带样式的数据
product_data = [
('鼠标', 150, 50.0),
('键盘', 80, 120.5),
('显示器', 30, 800.0)
]
for row_idx, item in enumerate(product_data):
(row_idx + 1, 0, item[0], data_style)
(row_idx + 1, 1, item[1], data_style)
(row_idx + 1, 2, item[2], data_style)
# 写入公式计算总价
(row_idx + 1, 3, (f'B{row_idx+2}*C{row_idx+2}'), data_style)
# 设置列宽 (单位是 256 * 字符数)
(0).width = 256 * 15 # 第一列宽15个字符
(1).width = 256 * 10
(2).width = 256 * 10
(3).width = 256 * 15
('带样式和公式的数据.xls')
print("Excel文件 '带样式和公式的数据.xls' 已成功创建和写入。")
```
2. openpyxl:写入新版.xlsx文件
`openpyxl`是一个功能更强大、更现代化的库,专门用于读写`.xlsx`、`.xlsm`、`.xltx`、`.xltm`等Office Open XML格式的Excel文件。它是处理新版Excel文件(Excel 2007及更高版本)的首选库,支持更复杂的Excel特性,如图表、图片、数据验证、条件格式等。
安装:
pip install openpyxl
使用openpyxl写入数据
`openpyxl`的写入流程与`xlwt`类似,但API设计上更符合Pythonic风格。
from openpyxl import Workbook
from import Font, PatternFill, Border, Side, Alignment
# 1. 创建一个新的工作簿
workbook_xlsx = Workbook()
# 2. 获取默认的活动工作表 (或创建一个新的)
sheet_xlsx =
= "销售数据" # 设置工作表名称
# 3. 写入标题行
headers_xlsx = ['订单ID', '商品', '数量', '价格', '总金额']
(headers_xlsx) # 使用append方法写入一行数据
# 4. 写入数据行
sales_data = [
(1001, '笔记本电脑', 2, 6000.0, None),
(1002, '外接硬盘', 5, 450.0, None),
(1003, '无线鼠标', 10, 80.0, None)
]
for row_data in sales_data:
(row_data) # 再次使用append,它会自动找到下一行
# 5. 设置单元格值和公式
# 对总金额列设置公式 (例如:总金额 = 数量 * 价格)
# 由于append会写入None,我们需要更新这些单元格
for row_idx in range(2, sheet_xlsx.max_row + 1): # 从第二行开始(第一行是标题)
sheet_xlsx[f'E{row_idx}'] = f'=C{row_idx}*D{row_idx}' # 写入公式
# 6. 设置样式 (以标题行为例)
header_font = Font(name='微软雅黑', size=12, bold=True, color='FFFFFF')
header_fill = PatternFill(start_color='4F81BD', end_color='4F81BD', fill_type='solid')
thin_border = Border(left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin'))
center_alignment = Alignment(horizontal='center', vertical='center')
for cell in sheet_xlsx[1]: # 遍历第一行的所有单元格
= header_font
= header_fill
= thin_border
= center_alignment
# 7. 调整列宽
for col in :
max_length = 0
column = col[0].column_letter # Get the column name (e.g., 'A')
for cell in col:
try:
if len(str()) > max_length:
max_length = len(str())
except:
pass
adjusted_width = (max_length + 2) * 1.2 # 加一些缓冲
sheet_xlsx.column_dimensions[column].width = adjusted_width
# 8. 保存工作簿
try:
('新生成的数据')
print("Excel文件 '新生成的数据' 已成功创建和写入。")
except Exception as e:
print(f"保存文件时发生错误: {e}")
```
`openpyxl`的`append()`方法非常方便,它会自动将列表或元组作为一行数据添加到工作表的下一行。对于更精细的控制,你可以直接通过单元格坐标(如`sheet['A1']`或`(row=1, column=1)`)来赋值。
读写结合的实际应用场景
在实际工作中,我们经常需要将读取和写入操作结合起来,实现更复杂的数据处理流程。
数据清洗与转换: 从一个或多个Excel文件中读取原始数据,进行清洗(去除重复、处理缺失值)、转换(格式化、计算新字段),然后将处理后的数据写入新的Excel文件。
报告自动化: 从数据库或现有Excel文件中读取基础数据,根据业务规则生成复杂的报表(可能包含图表、透视表),并将报表输出为新的Excel文件。
数据集成: 从不同来源(例如,一个`.xls`文件和一个`.xlsx`文件)读取数据,将它们合并、匹配,然后统一写入到一个新的`.xlsx`文件中。
批量数据更新: 读取一个包含更新指令的Excel文件,根据指令去更新另一个大的Excel数据表中的特定记录。
例如,我们可以结合`xlrd`读取一个旧版Excel文件,然后用`openpyxl`将数据写入一个新版Excel文件,同时增加一些新的列和样式:
import xlrd
from openpyxl import Workbook
from import Font, PatternFill, Border, Side, Alignment
from datetime import datetime
# --- 第一阶段:使用xlrd读取旧版Excel数据 ---
input_file = "旧版数据.xls" # 假设存在一个旧版xls文件
# 创建一个示例旧版数据文件用于读取
try:
temp_wb_xls = (encoding='utf-8')
temp_sheet_xls = temp_wb_xls.add_sheet('原始数据')
(0, 0, 'ID')
(0, 1, '商品名')
(0, 2, '销售额')
(1, 0, 1)
(1, 1, '产品A')
(1, 2, 120.50)
(2, 0, 2)
(2, 1, '产品B')
(2, 2, 250.75)
(input_file)
print(f"临时文件 '{input_file}' 已创建用于读取。")
except Exception as e:
print(f"创建临时文件 '{input_file}' 失败: {e}")
exit()
try:
read_workbook = xlrd.open_workbook(input_file)
read_sheet = read_workbook.sheet_by_index(0)
processed_data = []
headers = [read_sheet.cell_value(0, col_idx) for col_idx in range()]
for r_idx in range(1, ): # 从第二行开始读取数据
row_values = [read_sheet.cell_value(r_idx, c_idx) for c_idx in range()]
# 假设这里进行一些数据处理,例如添加一个“处理时间”
(().strftime("%Y-%m-%d %H:%M:%S"))
(row_values)
print("数据已从旧版Excel文件读取并处理。")
except as e:
print(f"读取旧版Excel文件时发生错误: {e}")
exit()
except FileNotFoundError:
print(f"文件 '{input_file}' 未找到。")
exit()
# --- 第二阶段:使用openpyxl写入新版Excel文件 ---
output_file = "处理后的新版数据.xlsx"
write_workbook = Workbook()
write_sheet =
= "处理结果"
# 定义新标题(包含新增列)
new_headers = headers + ['处理时间']
(new_headers)
# 定义标题样式
header_font_op = Font(bold=True, color="FF0000", size=14)
header_fill_op = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
for cell in write_sheet[1]:
= header_font_op
= header_fill_op
= Alignment(horizontal='center', vertical='center')
= Border(left=Side(style='thin'), right=Side(style='thin'),
top=Side(style='thin'), bottom=Side(style='thin'))
# 写入处理后的数据
for row_data in processed_data:
(row_data)
# 调整列宽
for col_idx, column in enumerate():
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str()) > max_length:
max_length = len(str())
except:
pass
adjusted_width = (max_length + 2) * 1.2
write_sheet.column_dimensions[column_letter].width = adjusted_width
try:
(output_file)
print(f"处理后的数据已成功写入新版Excel文件 '{output_file}'。")
except Exception as e:
print(f"保存新版Excel文件时发生错误: {e}")
```
这个例子清晰地展示了如何结合使用`xlrd`和`openpyxl`来完成一个常见的数据处理任务。`xlrd`负责从旧格式文件中提取数据,而`openpyxl`则负责将处理后的数据以新格式写入,并应用现代Excel的样式特性。
总结与最佳实践
通过本文的详细介绍,我们已经清楚地了解了Python处理Excel文件时不同库的定位和用法:
`xlrd`: 专门用于读取旧版(.xls)Excel文件。它高效稳定,但在功能上仅限于读取。
`xlwt`: 专门用于写入旧版(.xls)Excel文件。它提供了创建文件、写入数据和设置基本样式的功能。
`openpyxl`: 针对新版(.xlsx)Excel文件,既能读取也能写入。它是处理现代Excel文件的首选,功能全面,支持多种高级特性。
最佳实践建议:
根据文件格式选择工具: 如果你主要处理`.xls`文件,`xlrd`和`xlwt`是合适的组合。如果你处理`.xlsx`文件,`openpyxl`是你的不二之选,它能同时处理读写。
异常处理: 在打开或保存文件时,务必使用`try-except`块来捕获可能发生的`FileNotFoundError`、``或其他`IOError`。
内存管理: 对于非常大的Excel文件,直接将所有数据一次性加载到内存可能会导致内存溢出。`openpyxl`提供了只读/只写模式(`read_only=True`, `write_only=True`),可以有效减少内存占用。`xlrd`在读取大文件时也相对高效。
样式与性能: 过多的复杂样式可能会影响写入性能。在不需要精细控制时,使用默认样式或简单样式。
版本兼容性: `xlrd`的最新版本已经停止支持`.xlsx`文件,这意味着如果你同时需要读取旧版和新版Excel,最好的做法是`xlrd`负责`.xls`,`openpyxl`负责`.xlsx`。
掌握了这些Python库,你就能够轻松应对各种Excel自动化任务,无论是数据提取、报告生成还是数据迁移,Python都能提供强大的支持,极大地提升你的工作效率。
```
2025-10-14

Python数据属性值:从基础到高级管理与优化实践
https://www.shuihudhg.cn/129363.html

PHP与Redis协作:高效存储与管理复杂数组数据的实践指南
https://www.shuihudhg.cn/129362.html

Python子字符串提取与操作:从切片到正则的全面指南
https://www.shuihudhg.cn/129361.html

PHP字符串与二进制互转:从基础函数到高级实践全攻略
https://www.shuihudhg.cn/129360.html

C语言中灵活输出空格的艺术:从基础到高级格式化与对齐技巧解析
https://www.shuihudhg.cn/129359.html
热门文章

Python 格式化字符串
https://www.shuihudhg.cn/1272.html

Python 函数库:强大的工具箱,提升编程效率
https://www.shuihudhg.cn/3366.html

Python向CSV文件写入数据
https://www.shuihudhg.cn/372.html

Python 静态代码分析:提升代码质量的利器
https://www.shuihudhg.cn/4753.html

Python 文件名命名规范:最佳实践
https://www.shuihudhg.cn/5836.html