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

Python读取Excel函数生成数据集返回空DataFrame求助

pd.read_excel读取公式生成数据的Excel返回空DataFrame的解决办法

我通过在Excel中粘贴公式生成了数据集,Excel里显示正常,但用pd.read_excel读取到Python时始终得到空DataFrame。已经尝试过这些方法:

  • 将Excel转换为CSV后读取
  • 在Excel的「公式」选项卡中将计算选项设置为「自动」
  • 导入Win32库,保存工作簿前强制Excel计算

相关代码如下:

# import libraries
import openpyxl
import win32com.client as win32
import pandas as pd

# This is not the actual query
excel_query = 'generate_my_dataset' 
workbook = openpyxl.Workbook()
worksheet = workbook.active

# Write the formula to a cell
worksheet['A1'] = excel_query
workbook.save('my_dataset_1.xlsx')

# Load the workbook
workbook = openpyxl.load_workbook('my_dataset_1.xlsx')

# Select the active sheet
sheet = workbook.active

# Force recalculation of all formulas
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open('my_dataset_1.xlsx')
excel.CalculateFull()

# Save the workbook
wb.Save()
wb.Close()
excel.Quit()

# Save the workbook
workbook.save('my_dataset_2.xlsx')

# Read the recalculated workbook into DataFrame
my_df = pd.read_excel('my_dataset_2.xlsx')

# Print the DataFrame
print(my_df)

确认my_dataset_1.xlsx和my_dataset_2.xlsx中都有数据集,但读取后的my_df仍为空,求可行解决办法。


可行解决办法

1. 修正Win32操作后的文件读取逻辑

你的代码里用win32com保存了my_dataset_1.xlsx,但之后又用openpyxl再次保存my_dataset_2.xlsx,这会覆盖win32com的计算结果。直接读取win32com处理后的文件即可,去掉多余的openpyxl保存步骤:

# 删掉这行多余的保存
# workbook.save('my_dataset_2.xlsx')

# 直接读取win32com计算并保存的文件
my_df = pd.read_excel('my_dataset_1.xlsx')
print(my_df)

2. 让openpyxl读取时强制计算公式

如果要继续用openpyxl处理,加载工作簿时开启公式计算模式,强制重新计算所有公式后再保存读取:

wb = openpyxl.load_workbook('my_dataset_1.xlsx', data_only=False)
wb.calculate_all()
wb.save('my_dataset_calculated.xlsx')
my_df = pd.read_excel('my_dataset_calculated.xlsx')

3. 明确指定数据读取范围

有时候Excel里的数据集可能存在隐藏行列,或者起始行不是第一行。读取时可以指定表头位置、列范围或跳过空行:

# 假设数据没有表头,从A1开始
my_df = pd.read_excel('my_dataset_2.xlsx', header=None)
# 或者指定读取的列范围
my_df = pd.read_excel('my_dataset_2.xlsx', usecols='A:Z', skiprows=0)

4. 直接通过Win32com获取计算后的数据

跳过保存文件的步骤,直接用win32com读取Excel中已计算的单元格值,再转换为DataFrame:

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open('my_dataset_1.xlsx')
ws = wb.ActiveSheet
# 获取所有已使用的单元格数据
used_range = ws.UsedRange
data = []
for row in used_range.Rows:
    data.append([cell.Value for cell in row])
# 转为DataFrame(如果第一行是表头就用data[0]当列名,否则去掉columns参数)
my_df = pd.DataFrame(data[1:], columns=data[0])
wb.Close()
excel.Quit()
print(my_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:00:33