中山市葬花殡葬网

Python新手指南之如何读写旧版Excel(.xls)格式文件

2026-03-30 16:53:02 浏览次数:0
详细信息

.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 文件。

相关推荐