You need to enable JavaScript to run this app. 如何使用Openpyxl创建包含工作表名与特定单元格值的DataFrame
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Openpyxl创建包含工作表名与特定单元格值的DataFrame

具体实现方案

代码优化与补充

首先修正现有初始化代码的冗余重复赋值问题,同时优化工作簿加载参数:

# 导入依赖
import pandas as pd
from openpyxl import load_workbook
from pathlib import Path

# 配置文件路径(原代码重复赋值冗余,已简化)
src_file = Path.cwd() / 'lm_balance.xlsx'
# 加载工作簿时开启data_only=True,直接读取单元格的实际计算值,而非公式本身
wb = load_workbook(filename=src_file, data_only=True)

注意:加载时必须开启data_only=True参数,否则会读入Excel单元格内的公式字符串,而非公式计算出的最终余额数值。

核心提取逻辑

按照需求,每个工作表的目标值固定为「最后一行的G列」,无需逐行扫描文本匹配,直接定位坐标即可,整体效率远高于全表遍历:

# 初始化结果存储容器
name_res = []
balance_res = []

# 逐个遍历所有工作表
for sheet_name in wb.sheetnames:
    # 获取当前工作表对象
    current_ws = wb[sheet_name]
    # 获取当前工作表的最后一行行号(openpyxl行号从1开始计数)
    last_row_num = current_ws.max_row
    # G列对应第7列,直接定位最后一行G列的单元格值
    target_balance = current_ws.cell(row=last_row_num, column=7).value
    
    # 跳过无有效值的工作表
    if target_balance is None:
        continue
    
    # 兼容带千分位分隔符的字符串格式(如"45,408.83")
    target_balance = float(str(target_balance).replace(',', ''))
    
    # 存入结果列表
    name_res.append(sheet_name)
    balance_res.append(target_balance)

# 组装为要求的两列DataFrame
balance_df = pd.DataFrame({
    'name': name_res,
    'balance': balance_res
})

常见异常场景处理

  • 不需要重复调用pandas的Excel读取接口打开文件,仅通过当前已加载的openpyxl工作簿对象即可完成所有值提取,避免重复IO开销。
  • 如果工作表末尾存在空白行导致max_row定位偏差,可通过倒序查找从最后一行往上扫描,取第一个非空的G列单元格作为目标值,对应代码片段可替换为:
    # 倒序查找跳过末尾空白行
    for row_idx in range(current_ws.max_row, 1, -1):
        cell_val = current_ws.cell(row=row_idx, column=7).value
        if cell_val is not None:
            target_balance = cell_val
            break
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 13:36:11