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

基于Excel模板解析Excel文件的Python实现方案咨询

基于Django模板语法Excel模板的数据提取方案

工具包组合推荐

  • Jinja2 + openpyxl:Jinja2与Django模板语法高度兼容,轻量且无需依赖完整Django环境,配合openpyxl的Excel读写能力,足以实现模板解析与数据提取。
  • Django模板引擎 + openpyxl:如果项目本身基于Django,直接用内置模板解析模块即可,无需额外引入Jinja2,逻辑和Jinja2方案一致。

核心实现思路

  1. 解析模板结构:读取Excel模板,定位{% for line in lines %}和{% endfor %}标记,确定循环数据块的行范围;同时提取循环块内{{ line.a }}这类变量,记录每个变量对应的列位置。
  2. 读取实际数据:加载数据Excel文件,根据模板解析出的行范围,定位到实际数据所在行(跳过表头、页脚等非数据行)。
  3. 映射组装数据:按照模板中变量与列的对应关系,逐行提取单元格值,最终组装成要求的结构化格式。

简化代码示例

from openpyxl import load_workbook
from jinja2 import Environment, BaseLoader

def parse_excel_template(template_file):
    """解析Excel模板,返回循环数据块的行范围和变量-列映射"""
    wb = load_workbook(template_file, read_only=True)
    ws = wb.active
    for_marker_row = None
    endfor_marker_row = None
    variable_column_map = {}

    for row_idx, row in enumerate(ws.iter_rows(values_only=True), start=1):
        for col_idx, cell_content in enumerate(row, start=1):
            if not cell_content:
                continue
            cell_str = str(cell_content).strip()
            if cell_str == '{% for line in lines %}':
                for_marker_row = row_idx
            elif cell_str == '{% endfor %}':
                endfor_marker_row = row_idx
            elif '{{' in cell_str and '}}' in cell_str:
                # 提取变量名,如从{{ line.a }}中取出a
                var_name = cell_str.strip('{} ').split('.')[-1]
                variable_column_map[var_name] = col_idx - 1  # 转换为0索引列

    # 循环内容的行范围是for标记下一行到endfor标记上一行
    data_start_row = for_marker_row + 1
    data_end_row = endfor_marker_row - 1
    return data_start_row, data_end_row, variable_column_map

def extract_structured_data(data_file, start_row, end_row, var_col_map):
    """从数据文件中提取结构化数据"""
    wb = load_workbook(data_file, read_only=True)
    ws = wb.active
    result_lines = []

    for row in ws.iter_rows(min_row=start_row, max_row=end_row, values_only=True):
        line_data = {}
        for var_name, col_idx in var_col_map.items():
            line_data[var_name] = row[col_idx]
        result_lines.append(line_data)
    
    return {'lines': result_lines}

# 示例调用
template_start, template_end, var_map = parse_excel_template('template.xlsx')
structured_data = extract_structured_data('data.xlsx', template_start, template_end, var_map)
print(structured_data)

反向方案参考

如果模板结构复杂(比如包含嵌套循环、条件判断),可以先将Excel模板渲染成一个带有明确占位符的Excel文件(比如把{{ line.a }}替换为__LINE_A__),再通过对比这个占位符文件和实际数据文件,识别每个占位符对应的真实数据值,最终组装成结构化格式。这种方式对复杂模板的兼容性更好,但需要额外的渲染步骤。

内容的提问来源于stack exchange,提问作者Johnny Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:38:17