1. 概述与背景
在 Python 数据处理领域,经常需要将程序生成的数据导出为 Excel 格式以便后续分析或汇报。xlwt 是一个经典的第三方库,专门用于生成 .xls 格式的 Excel 文件(Excel 97-2003 版本)。虽然现代 Excel 版本默认使用 格式,但 在处理旧系统兼容性和轻量级写入任务时依然具有实用价值。
本文详细介绍了 Python 中使用 xlwt 库向 Excel 工作表写入数据的方法。内容涵盖库的安装、Workbook 与 Sheet 对象模型、单行与批量数据写入、字典数据处理、单元格样式设置(字体、颜色、边框)、合并单元格技巧以及常见错误处理。文章还提供了 xls 与 xlsx 格式对比分析及完整综合示例代码,帮助开发者高效完成 Excel 文件生成任务,并指出了 xlwt 的局限性及替代方案。

在 Python 数据处理领域,经常需要将程序生成的数据导出为 Excel 格式以便后续分析或汇报。xlwt 是一个经典的第三方库,专门用于生成 .xls 格式的 Excel 文件(Excel 97-2003 版本)。虽然现代 Excel 版本默认使用 格式,但 在处理旧系统兼容性和轻量级写入任务时依然具有实用价值。
.xlsxxlwtxlwt 是只写库,不支持读取 Excel 文件(读取通常配合 xlrd 库使用)。它基于二进制协议,生成的文件体积较小,但在处理大量数据时性能不如 openpyxl 或 pandas。
在使用 xlwt 前,需明确其支持的格式限制:
| 特性 | XLS (xlwt) | XLSX (openpyxl/xlsxwriter) |
|---|---|---|
| Excel 版本 | Excel 2003 及以前 | Excel 2007 及以后 |
| 最大行数 | 65,536 行 | 1,048,576 行 |
| 最大列数 | 256 列 (IV) | 16,384 列 (XFD) |
| 文件结构 | 二进制 BIFF8 | XML 压缩包 |
| 功能支持 | 基础样式、公式 | 图表、宏、高级样式 |
注意:Excel 2007 及以上版本可以打开 .xls 文件,但 Excel 2003 无法打开 .xlsx 文件。因此,若目标用户环境较老,建议优先使用 xlwt。
确保已安装 Python 环境(推荐 3.x 版本),并通过 pip 安装 xlwt。
pip install xlwt -i https://mirrors.aliyun.com/pypi/simple
如果网络不稳定,可尝试国内镜像源。安装完成后,建议在虚拟环境中运行以避免依赖冲突。
xlwt 的对象模型遵循层级结构:
(row, col) 定位。最基础的用法是创建 Workbook,添加 Sheet,然后逐格写入数据。
import xlwt
# 1. 创建工作簿对象
workbook = xlwt.Workbook(encoding='utf-8')
# 2. 创建工作表,设置名称
sheet = workbook.add_sheet('学生信息表', cell_overwrite_ok=True)
# 3. 写入表头数据 (行索引从 0 开始)
sheet.write(0, 0, '姓名')
sheet.write(0, 1, '年龄')
sheet.write(0, 2, '班级')
sheet.write(0, 3, '学号')
# 4. 保存文件
workbook.save('basic_example.xls')
print('文件保存成功')
关键点说明:
encoding='utf-8': 确保中文不乱码。cell_overwrite_ok=True: 允许覆盖已存在的单元格,避免报错。write(row, col, value): 参数顺序为行、列、值。手动调用 write 效率低下,适合批量数据场景。
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('批量数据')
# 模拟数据列表
data_list = [
['张三', 20, '一班', '001'],
['李四', 22, '二班', '002'],
['王五', 21, '三班', '003']
]
# 先写入表头
headers = ['姓名', '年龄', '班级', '学号']
for col_idx, header in enumerate(headers):
sheet.write(0, col_idx, header)
# 循环写入内容
for row_idx, row_data in enumerate(data_list):
for col_idx, value in enumerate(row_data):
sheet.write(row_idx + 1, col_idx, value)
workbook.save('batch_write.xls')
实际业务中,数据常以字典形式存在。利用 enumerate 和键值对遍历可实现灵活写入。
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('字典数据')
# 定义表头映射
header_map = {
'name': '姓名',
'age': '年龄',
'gender': '性别',
'id': '学号'
}
# 准备数据
data = [
{'name': '华仔仔', 'age': 12, 'gender': '男', 'id': '001'},
{'name': '华仔', 'age': 15, 'gender': '男', 'id': '002'}
]
# 写入表头
for col_idx, key in enumerate(header_map.keys()):
sheet.write(0, col_idx, header_map[key])
# 写入内容
for row_idx, item in enumerate(data):
for col_idx, key in enumerate(header_map.keys()):
sheet.write(row_idx + 1, col_idx, item.get(key, ''))
workbook.save('dict_data.xls')
xlwt 默认将数字识别为数值类型,字符串识别为文本。日期需要特殊处理。
from datetime import datetime
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('日期测试')
# 写入普通数字
sheet.write(0, 0, 100)
# 写入日期 (xlwt 内部使用 Excel 序列号)
# 这里简单演示,复杂日期建议使用 openpyxl
date_val = datetime.now().strftime('%Y-%m-%d')
sheet.write(1, 0, date_val)
workbook.save('date_test.xls')
美化表格是 xlwt 的核心优势之一。通过 xf_index 管理样式。
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('样式示例')
# 创建字体对象
font = xlwt.Font()
font.name = '微软雅黑'
font.height = 240 # 单位是半磅,240 约等于 12 号字
font.bold = True # 加粗
font.italic = False
# 创建样式对象
style = xlwt.XFStyle()
style.font = font
# 应用样式
sheet.write(0, 0, '标题文字', style)
workbook.save('font_style.xls')
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('对齐边框')
# 边框样式
border = xlwt.Borders()
border.left = xlwt.Borders.THIN
border.right = xlwt.Borders.THIN
border.top = xlwt.Borders.THIN
border.bottom = xlwt.Borders.THIN
# 对齐样式
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平居中
alignment.vert = xlwt.Alignment.VERT_CENTER # 垂直居中
# 组合样式
style = xlwt.XFStyle()
style.borders = border
style.alignment = alignment
sheet.write(0, 0, '合并单元格效果', style)
workbook.save('style_border.xls')
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('背景色')
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN # 纯色填充
pattern.pattern_fore_colour = 0x0A # 蓝色索引
style = xlwt.XFStyle()
style.pattern = pattern
sheet.write(0, 0, '蓝色背景', style)
workbook.save('bg_color.xls')
合并单元格能提升报表的可读性,常用于表头分组。
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('合并示例')
# 合并 A1:B1
sheet.write_merge(0, 0, 0, 1, '部门汇总', style=None)
# 写入具体数据
sheet.write(1, 0, '销售部')
sheet.write(1, 1, '100 万')
sheet.write(2, 0, '技术部')
sheet.write(2, 1, '200 万')
workbook.save('merge_cells.xls')
务必在 Workbook() 初始化时指定 encoding='utf-8',否则中文会显示为乱码。
xlwt 不适合处理超过 6 万行的数据。若数据量大,请考虑使用 pandas 导出 xlsx 或使用流式写入方案。
频繁创建 XFStyle 会增加内存开销。建议将常用样式提取为常量或在循环外创建。
| 库名 | 适用格式 | 读写能力 | 特点 |
|---|---|---|---|
| xlwt | .xls | 只写 | 经典,兼容性好,无样式限制 |
| xlrd | .xls/.xlsx | 只读 | 读取工具,配合 xlwt 使用 |
| openpyxl | .xlsx | 读写 | 支持 Excel 2007+,功能丰富 |
| pandas | .xlsx/.csv | 读写 | 数据分析首选,底层调用其他库 |
以下代码展示了创建一个包含表头、样式、边框和数据的完整 Excel 文件。
import xlwt
from datetime import datetime
def create_excel_report(filename):
workbook = xlwt.Workbook(encoding='utf-8')
sheet = workbook.add_sheet('月度报表', cell_overwrite_ok=True)
# 定义样式
title_font = xlwt.Font()
title_font.name = '黑体'
title_font.height = 280
title_font.bold = True
content_style = xlwt.XFStyle()
content_style.font = xlwt.Font()
content_style.font.name = '宋体'
border = xlwt.Borders()
border.left = xlwt.Borders.THIN
border.right = xlwt.Borders.THIN
border.top = xlwt.Borders.THIN
border.bottom = xlwt.Borders.THIN
align = xlwt.Alignment()
align.horz = xlwt.Alignment.HORZ_CENTER
align.vert = xlwt.Alignment.VERT_CENTER
table_style = xlwt.XFStyle()
table_style.borders = border
table_style.alignment = align
# 写入标题
sheet.write_merge(0, 0, 0, 3, '2023 年度销售统计', xlwt.XFStyle())
# 写入表头
headers = ['月份', '销售额', '增长率', '备注']
for i, h in enumerate(headers):
sheet.write(1, i, h, table_style)
# 写入数据
data = [
['一月', 120000, '10%', '正常'],
['二月', 150000, '25%', '春节促销'],
['三月', 180000, '20%', '新品发布']
]
for row_idx, row_data in enumerate(data):
for col_idx, val in enumerate(row_data):
sheet.write(row_idx + 2, col_idx, val, table_style)
workbook.save(filename)
print(f'{filename} 生成完毕')
if __name__ == '__main__':
create_excel_report('comprehensive_report.xls')
本文详细讲解了 xlwt 库的安装、基础用法、样式设置及合并单元格等进阶操作。通过掌握这些技能,开发者可以快速构建符合特定格式要求的 Excel 报表。尽管 xlwt 仅支持旧版 .xls 格式,但在兼容性要求高的场景中仍是可靠选择。对于新开发项目,建议评估是否采用 openpyxl 或 pandas 以获得更现代化的支持。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online