Python如何使用xlrd和xlwt库读写Excel文件

Theo
Theo
发布时间:2026-10-11| 3人浏览过
原创

本文详解如何在 Python 中使用 xlrd 与 xlwt 库读取和写入 Excel 文件。通过实例演示如何遍历工作表、提取单元格数值、动态追加统计列,并最终将处理后的数据导出为新文件。文章特别指出了库版本兼容性限制及格式注意事项,适用于传统 .xls 格式数据的批量处理。

环境安装与格式兼容性说明

在使用这两个库前,需了解它们的设计定位:xlrd 专用于读取,xlwt 专用于写入。两者均仅支持旧版 .xls 格式。

注意:xlrd 自 2.0.0 版本起移除了对 .xlsx 的支持。如果你的目标文件是新版 Excel,请卸载当前版本并回退至 1.2.0,或直接更换为支持 .xlsx 的 openpyxl 库。

执行以下命令完成安装:

pip3 install xlrd==1.2.0 xlwt

读取与写入的基础操作

xlrd 的工作流基于工作簿(Book)与工作表(Sheet)层级。读取时,系统返回包含多个 Sheet 对象的集合。通过索引或名称可定位目标表,进而获取行列数量及单元格详情。

xlwt 的操作则相反,需先实例化一个空白 WorkBook,创建对应的 Sheet,随后通过坐标逐格写入文本、数字或设定样式。

以下为读取与写入的核心 API 演示:

import xlrd, xlwt

# ----------------------
# 1. 读取操作 (xlrd)
# ----------------------
# 打开指定路径的 xls 文件
book = xlrd.open_workbook('demo.xls')

# 获取所有工作表,并通过索引定位到第一张表
sheet = book.sheet_by_index(0)

# 获取总行数与总列数
r_num, c_num = sheet.nrows, sheet.ncols

# 获取指定行列的单元格对象及其内容类型、值
print(f"单元格类型: {sheet.cell(0, 0).ctype}")
print(f"单元格数值: {sheet.cell(0, 0).value}")

# 高效方法:一次性获取某一行或某一列的数据列表
row_data = sheet.row_values(1) # 跳过表头取第一行数据
col_data = sheet.col_values(1) # 获取第二列数据

# ----------------------
# 2. 写入操作 (xlwt)
# ----------------------
# 初始化一个新的工作簿并添加工作表
w_book = xlwt.Workbook()
w_sheet = w_book.add_sheet('sheet1')

# 向指定位置写入内容,支持传入对齐样式对象
style = xlwt.easyxf('font: name Arial; align: horizontal center')
w_sheet.write(0, 0, 'Hello', style)

# 将内存中的数据持久化到硬盘
w_book.save('output.xls')

实战:遍历表格自动计算并导出总分

在实际办公场景中,常需对已有成绩表进行批处理。下面演示如何读取原始成绩,在内存中动态插入“总分”列,计算每名学生语数外三科之和,最后生成独立的新文件。

风险提示:涉及文件覆盖操作前,建议提前备份原始数据。

  1. 读取源文件与定位表结构:打开 demo.xls,获取行数 nrows 和列数 ncols。
  2. 注入表头与计算循环:利用 put_cell 在原始表的尾部强行追加“总分”列名。随后迭代数据行,使用切片 row_values(row, 1) 排除姓名列,调用内置 sum() 求和后,再次通过 put_cell 填入对应单元格的数值。
  3. 格式化重建并导出:虽然可直接读取修改后的内存表,但推荐使用 wt.Workbook() 独立生成干净的结构。遍历原表行列,配合 easyxf 统一设置水平垂直居中样式,最终调用 save() 输出。
import xlrd, xlwt

# --- 第一步:打开源文件 ---
r_book = xlrd.open_workbook('demo.xls')
r_sheet = r_book.sheet_by_index(0)
total_cols = r_sheet.ncols

# --- 第二步:内存中动态追加计算列 ---
# 在最后一列写入列名
r_sheet.put_cell(0, total_cols, xlrd.XL_CELL_TEXT, '总分', None)

# 跳过表头(第0行),逐行计算
for row_idx in range(1, r_sheet.nrows):
    # 从第1列(语文)开始取值并求和
    score_sum = sum(r_sheet.row_values(row_idx, 1))
    # 写入总分数值
    r_sheet.put_cell(row_idx, total_cols, xlrd.XL_CELL_NUMBER, score_sum, None)

# --- 第三步:新建文件并应用排版后保存 ---
w_book = xlwt.Workbook()
w_sheet = w_book.add_sheet(r_sheet.name)

# 定义居中对齐样式
style = xlwt.easyxf('align: vertical center, horizontal center')

# 遍历整表,将内容与样式复制到新书表中
for r in range(r_sheet.nrows):
    for c in range(total_cols):
        val = r_sheet.cell_value(r, c)
        w_sheet.write(r, c, val, style)

w_book.save('output_with_total.xls')

排错与优化建议

  • TypeError: 'tuple' object doesn't support item assignment:xls 工作表本身默认为只读。必须通过 put_cell() 在底层数据结构插补缺省节点,而非直接赋值修改单元格。
  • 中文乱码问题:若原始表格包含中文字符,确保脚本运行环境编码一致。通常在 Windows 下打开时需注意 ANSI 编码适配。
  • 性能瓶颈:对于上万行的超大数据集,xlwt/xlrd 速度较慢且易引发内存溢出,此时应切换到基于 XML 解析的 pandas 或 openpyxl。

总结

通过掌握上述步骤,您可以熟练运用 Python 脚本完成传统 Office 电子表格的抓取与二次加工。对于常规的小型表格自动化任务,本方案提供了轻量级且无需额外数据库支持的实现路径。以上就是Python如何使用xlrd和xlwt库读写excel文件的详细内容,更多关于Excel自动化处理与Python办公效率提升的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。