.xls(旧版 Excel 97-2003)格式文件的方法。
1. 主要库选择
xlrd + xlwt(最常用)
# 安装
pip install xlrd xlwt
pandas(推荐,简单易用)
# 安装
pip install pandas xlrd xlwt
openpyxl(主要用于 .xlsx,但也能处理简单 .xls)
pip install openpyxl
2. 使用 pandas 读写 .xls(推荐)
读取 .xls 文件
import pandas as pd
# 读取整个文件
df = pd.read_excel('旧文件.xls', engine='xlrd')
# 读取指定工作表
df = pd.read_excel('旧文件.xls', sheet_name='Sheet1')
# 读取指定范围(跳过行/列)
df = pd.read_excel('旧文件.xls', skiprows=2) # 跳过前2行
df = pd.read_excel('旧文件.xls', usecols='A:C') # 只读取A-C列
# 查看数据
print(df.head())
写入 .xls 文件
# 创建 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
# 写入 .xls 文件
df.to_excel('输出.xls', index=False, engine='xlwt')
# 写入多个工作表
with pd.ExcelWriter('多工作表.xls', engine='xlwt') as writer:
df.to_excel(writer, sheet_name='员工信息', index=False)
df.describe().to_excel(writer, sheet_name='统计信息')
3. 使用 xlrd 读取 + xlwt 写入
详细示例:读取
import xlrd
# 打开工作簿
workbook = xlrd.open_workbook('旧文件.xls')
# 获取所有工作表名
sheet_names = workbook.sheet_names()
print(f"工作表: {sheet_names}")
# 选择工作表
sheet = workbook.sheet_by_name('Sheet1') # 按名称
# 或 sheet = workbook.sheet_by_index(0) # 按索引
# 获取基本信息
print(f"工作表名: {sheet.name}")
print(f"行数: {sheet.nrows}")
print(f"列数: {sheet.ncols}")
# 读取单元格
cell_value = sheet.cell_value(0, 0) # 第0行第0列
cell_value = sheet.row(0)[0].value # 另一种方式
# 读取整行
row_values = sheet.row_values(0) # 第0行所有值
# 读取整列
col_values = sheet.col_values(0) # 第0列所有值
# 遍历所有行
for row_idx in range(sheet.nrows):
row = sheet.row(row_idx)
for col_idx, cell in enumerate(row):
print(f"行{row_idx}, 列{col_idx}: {cell.value}")
# 处理日期类型
cell = sheet.cell(0, 0)
if cell.ctype == xlrd.XL_CELL_DATE:
date_value = xlrd.xldate_as_datetime(cell.value, workbook.datemode)
print(f"日期: {date_value}")
详细示例:写入
import xlwt
from datetime import datetime
# 创建工作簿
workbook = xlwt.Workbook(encoding='utf-8')
# 创建工作表
sheet = workbook.add_sheet('员工信息')
# 设置样式
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = '宋体'
font.bold = True
style.font = font
# 写入标题行(带样式)
headers = ['姓名', '年龄', '入职日期', '工资']
for col, header in enumerate(headers):
sheet.write(0, col, header, style)
# 写入数据
data = [
['张三', 25, datetime(2020, 1, 1), 5000],
['李四', 30, datetime(2019, 5, 15), 6000],
['王五', 28, datetime(2021, 3, 10), 5500]
]
for row, row_data in enumerate(data, start=1):
for col, value in enumerate(row_data):
if isinstance(value, datetime):
# 日期格式处理
date_style = xlwt.XFStyle()
date_style.num_format_str = 'YYYY-MM-DD'
sheet.write(row, col, value, date_style)
else:
sheet.write(row, col, value)
# 设置列宽
sheet.col(0).width = 256 * 15 # 256为1个字符宽度
# 保存文件
workbook.save('员工信息.xls')
4. 处理特殊需求
处理公式(只读)
import xlrd
workbook = xlrd.open_workbook('含公式.xls')
sheet = workbook.sheet_by_index(0)
# 查看单元格类型
cell = sheet.cell(0, 0)
if cell.ctype == xlrd.XL_CELL_FORMULA:
print(f"公式: {cell.value}")
合并单元格处理
import xlrd
workbook = xlrd.open_workbook('合并单元格.xls')
sheet = workbook.sheet_by_index(0)
# 获取所有合并单元格
merged_cells = sheet.merged_cells
# 遍历合并单元格
for merged_range in merged_cells:
rlo, rhi, clo, chi = merged_range
print(f"合并区域: 行{rlo}-{rhi}, 列{clo}-{chi}")
value = sheet.cell_value(rlo, clo)
# 将合并单元格的值填充到所有位置
for row in range(rlo, rhi):
for col in range(clo, chi):
# 实际处理...
pass
大数据量处理
import xlrd
# 设置 on_demand=True 以延迟加载
workbook = xlrd.open_workbook('大文件.xls', on_demand=True)
# 只加载需要的sheet
sheet = workbook.sheet_by_name('Sheet1')
# 逐行处理,避免内存不足
for row_idx in range(sheet.nrows):
row = sheet.row(row_idx)
# 处理逻辑
# 及时释放资源
workbook.unload_sheet('Sheet1')
5. 常见问题解决
1. 编码问题
# 指定编码
workbook = xlrd.open_workbook('文件.xls', encoding_override='gbk')
2. 文件格式错误
try:
workbook = xlrd.open_workbook('损坏文件.xls')
except xlrd.XLRDError as e:
print(f"文件格式错误: {e}")
3. .xls 与 .xlsx 兼容处理
import os
import pandas as pd
def read_excel_file(filepath):
"""智能读取Excel文件"""
ext = os.path.splitext(filepath)[1].lower()
if ext == '.xls':
return pd.read_excel(filepath, engine='xlrd')
elif ext == '.xlsx':
return pd.read_excel(filepath, engine='openpyxl')
else:
raise ValueError(f"不支持的文件格式: {ext}")
# 使用
df = read_excel_file('文件.xls')
6. 实用技巧
批量转换 .xls 为 .xlsx
import pandas as pd
import os
def convert_xls_to_xlsx(input_folder, output_folder):
"""批量转换xls为xlsx"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(input_folder):
if filename.endswith('.xls'):
input_path = os.path.join(input_folder, filename)
output_filename = os.path.splitext(filename)[0] + '.xlsx'
output_path = os.path.join(output_folder, output_filename)
# 读取xls
df = pd.read_excel(input_path, engine='xlrd')
# 保存为xlsx
df.to_excel(output_path, index=False, engine='openpyxl')
print(f"转换完成: {filename}")
提取特定信息
import xlrd
import pandas as pd
def extract_specific_data(filepath, target_text):
"""提取包含特定文本的行"""
workbook = xlrd.open_workbook(filepath)
sheet = workbook.sheet_by_index(0)
results = []
for row_idx in range(sheet.nrows):
row = sheet.row(row_idx)
row_values = [cell.value for cell in row]
# 检查是否包含目标文本
if any(target_text in str(value) for value in row_values):
results.append(row_values)
return pd.DataFrame(results)
总结建议
新手推荐使用 pandas:简单易用,功能强大
需要精细控制时使用 xlrd/xlwt:处理复杂格式和特殊需求
注意 .xls 的限制:最多65536行,256列
考虑升级到 .xlsx:如果需要处理更多数据或使用新功能
这些方法应该能帮助你有效地处理旧版 .xls 格式的 Excel 文件。