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
相关产品推荐
相关产品推荐

