使用openpyxl读取Excel部分文本单元格返回#VALUE!报错求解
问题描述
- 现有一份包含文本、常规数据、股票信息的Excel文件,当前使用
openpyxl搭配random库实现随机选取股票条目、并将对应数据写入另一文档的功能,但代码运行时出现#VALUE!报错。 - 作为openpyxl初学者,目前正在通过官方文档学习,最初误以为报错原因是openpyxl无法读取文本内容,但测试读取内容为"symbol"、"hello"的普通文本单元格时可正常运行;唯独股票相关单元格无法正常打印输出,即便在Excel顶部编辑栏查看,这些单元格的内容显示为纯文本格式。
- 核心疑问:该问题是否有简易解决方案,还是需要调整Excel文件本身的相关设置?
问题复现代码
import random from datetime import date from openpyxl import load_workbook from openpyxl import Workbook today = date.today() dateToday = today.strftime("%d/%m/%y") randomNumber = random.randint(2,749) print(randomNumber) print(dateToday) randomCell = 'A' + str(randomNumber) print('randomCell is:') print(randomCell) InfoWB = load_workbook(filename= 'ExcelSheet.xlsx') InfoWS = InfoWB.active randomStock = InfoWS[randomCell].value print(randomStock) dbWB = load_workbook(filename= 'StockPicks.xlsx') db = dbWB.active # This next bit doesn't work either but I haven't researched or tried fixing it yet # dbWB['A2'] = randomStock dbWB.save('StockPicks.xlsx')
解决方案
出现#VALUE!的核心原因不是openpyxl不支持读取文本,是那些编辑栏看起来是纯文本的股票单元格,实际存储的是失效的外部数据引用、旧版股票函数返回值,并非真正的静态文本内容,两种修复方式选其一即可:
- 代码层面快速修复:加载工作簿时传入
data_only=True参数,直接读取单元格上次保存时缓存的计算结果,跳过公式/外部链接解析逻辑
注意:该参数读取的是Excel最后一次打开保存时生成的数值缓存,如果文件下载后从未在桌面版Excel中打开并保存过,缓存值可能为NoneInfoWB = load_workbook(filename= 'ExcelSheet.xlsx', data_only=True) - 文件层面彻底修复:如果上述方法读取到空值,直接调整Excel文件设置即可
- 打开
ExcelSheet.xlsx,选中所有存放股票信息的单元格 - 按
Ctrl+C复制后右键,选择「选择性粘贴」→「数值」,将所有带动态引用、公式的单元格彻底转换为静态纯文本 - 保存文件后再运行代码即可正常读取
- 打开
- 你注释掉的写入逻辑存在对象调用错误:操作单元格需要指定工作表对象,不能直接对工作簿对象赋值,将注释行修改为以下内容即可正常写入:
原写法db['A2'] = randomStockdbWB['A2']调用的是整个工作簿对象,不存在单元格索引属性,修正后再执行保存操作即可完成写入。
补充说明:如果股票单元格是通过Excel新版内置的STOCK数据类型、STOCKHISTORY等联网函数生成的,openpyxl本身不支持解析这类动态数据结构,必须先转换为静态值才能正常读取。
内容的提问来源于stack exchange,提问作者Finn McKinley
相关产品推荐
相关产品推荐

