You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenPyXL中无需迭代按列子集提取工作表数据?

使用OpenPyXL按类Excel列范围提取数据的简便方法

OpenPyXL本身没有直接支持类似Excel列范围(如A,C,D,J:K,AI:AK)的API,但可以通过自定义函数实现这种便捷的列选择,避免手动迭代的繁琐。

实现思路

  • 先将Excel列名(如A、AI)转换为对应的列索引(从1开始);
  • 解析用户传入的列范围字符串,把单个列、列区间转换为完整的列索引列表;
  • 遍历工作表的行,提取对应列索引的单元格值。

代码实现

from openpyxl.utils import column_index_from_string
import openpyxl

def parse_column_ranges(range_str):
    """解析列范围字符串,返回对应的列索引列表(从1开始)"""
    columns = []
    parts = range_str.split(',')
    for part in parts:
        if ':' in part:
            # 处理列区间,如J:K、AI:AK
            start_col, end_col = part.split(':')
            start_idx = column_index_from_string(start_col.strip())
            end_idx = column_index_from_string(end_col.strip())
            columns.extend(range(start_idx, end_idx + 1))
        else:
            # 处理单个列,如A、C
            col_idx = column_index_from_string(part.strip())
            columns.append(col_idx)
    return columns

def extract_columns(ws, column_range):
    """从工作表中提取指定列范围的数据"""
    col_indices = parse_column_ranges(column_range)
    # 提取表头(多级列场景可根据实际结构调整)
    headers = [ws.cell(row=1, column=idx).value for idx in col_indices]
    # 提取数据行
    data = []
    for row in ws.iter_rows(min_row=2, values_only=True):
        row_data = [row[idx-1] for idx in col_indices]
        data.append(row_data)
    return headers, data

# 使用示例
ws = openpyxl.load_workbook("example_file.xlsx")["example_sheet"]
# 提取指定列范围的数据
headers, data = extract_columns(ws, "A,C,D,J:K,AI:AK")

关键说明

  • parse_column_ranges函数负责解析Excel风格的列范围字符串,将其转换为OpenPyXL可用的列索引,支持单个列和列区间两种格式;
  • extract_columns函数利用iter_rows批量获取行数据,再筛选目标列,比逐单元格迭代更高效;
  • 针对多级列场景,可以修改表头提取逻辑,比如遍历多级表头的所有行,将每列的多级标题组合成元组,适配复杂的表格结构。

内容的提问来源于stack exchange,提问作者Nelson A. Morais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:17:33