Python openpyxl打开有公式的表格,如果直接读取,会出现有公式的单元格为空或零的情况。
参见:
https://blog.csdn.net/weixin_45903952/article/details/105073611?utm_medium=distribute.wap_relevant.none-task-blog-title-3

wb = openpyxl.load_workbook(‘test.xlsx’, data_only=True)
当’test.xlsx’被生成并在Excel程序中打开并保存之后(这个过程Excel会把公式结果计算出来),该文件附带有两套值,一套是公式全都没有计算的(data_only=False(默认)),一套是公式计算了结果的(data_only=True)。(如果没有被Excel打开并保存,则只有一套值(data_only=False的那套,公式没有计算结果的)。
此时,以data_only=True或默认data_only=False打开会得到两种不同的结果,各自独立,即data_only=True状态下打开的,会发现公式结果为None(空值)或者一个计算好的常数,而不会看到它原本的公式是如何。而data_only=False则只会显示公式而已。因此,data_only=True状态下打开,如果最后用save()函数保存了,则原xlsx文件中,公式会被替换为常数结果或空值。而data_only=False状态下打开,最后用save()函数保存了的话,原xlsx文件也会只剩下data_only=False的那套值(即公式),另一套(data_only=True)的值会丢失,如想重新获得两套值,则仍旧需要用Excel程序打开该文件并保存。

    def justOpen(strFileName):"""模拟手工打开excel表:param strFileName: 打开的excel文件名(后缀.xlsx格式)"""try:xlApp = Dispatch("Excel.Application")xlApp.Visible = FalsexlBook = xlApp.Workbooks.Open(os.path.join(os.getcwd(), strFileName))xlBook.Save()xlBook.Close()except:print("请手工打开 %s 后,随便修改一个空值并保存" % strFileName)

**

我的完整测试代码如下:

**

"""
================================================
Python模块:Python操作excel(.xlsx)封装类MyPyExcel
================================================
"""import openpyxl
from openpyxl.worksheet.worksheet import Worksheet
import os
from win32com.client import Dispatchclass MyPyExcel:"""Python操作excel(.xlsx)封装类MyPyExcel"""def __init__(self, strOpenFilePath, data_only=True):"""初始化功能,加载excel文件: strOpenFilePath: 要打开的excel(.xlsx)文件路径"""self.strOpenFilePath = strOpenFilePath  # 工作簿路径self.workbook = None  # 工作簿对象self.worksheet = None  # 工作表对象path = os.path.join(os.getcwd() + "\\" + strOpenFilePath)# 文件存在就加载,不存在就创建工作簿。if os.path.exists(path):# 文件存在就加载,加载失败就报错。try:self.workbook = openpyxl.load_workbook(strOpenFilePath, data_only=data_only)except:print("加载excel文件失败!请检查!")raiseelse:print("加载excel文件不存在!自动创建文件!")self.workbook = openpyxl.Workbook()  # 创建工作簿def openWorkSheet(self, strSheetName) -> Worksheet:  # 表示此函数的返回值,是一个这样的类型,函数注解"""打开工作表功能:param strSheetName: 要打开的工作表名称:return: 返回打开的工作表Worksheet对象"""if strSheetName in self.workbook.sheetnames:self.worksheet = self.workbook[strSheetName]else:print("表单名称在当前excel文件中不存在,请检查表单名称!")return self.worksheetdef getDataByCell(self, nRow, nColumn):"""读取一个单元格的数据功能:param nRow: 行号1,2,...:param nColumn: 列号1,2,...:return: 指定单元格数值"""# 判断行号、列号有效if self.isCheckNumValid(nRow, self.worksheet.max_row) is True and \self.isCheckNumValid(nColumn, self.worksheet.max_column) is True:return self.worksheet.cell(nRow, nColumn).valuedef putDataByCell(self, nRow, nColumn, value):"""写入一个单元格数据功能:param nRow: 行号1,2,...:param nColumn: 列号1,2,...:param value: 写入指定单元格的数值"""self.worksheet.cell(nRow, nColumn).value = valuedef saveWorkBookData(self, strSaveFilePath):"""保存工作簿数据功能:param strSaveFilePath: 保存或另存工作簿的路径"""try:self.workbook.save(strSaveFilePath)except PermissionError:print("要操作的文件,没有写入权限,请检查权限!")raiseexcept FileNotFoundError:print("文件路径不存在,请确保路径正确!")raiseexcept:print("保存写入的数据失败!请检查异常!")raisedef closeWorkBook(self):"""关闭工作簿功能"""self.workbook.close()@staticmethoddef isCheckNumValid(cur_num, max_num):"""检测数据是否有效功能:param cur_num: 当前指定的行号或列号1,2...:param max_num: 当前工作表的最大行号或最大列号1,2...:return: True表示数据有效,否则反"""# 类型检测if type(cur_num) is not int and type(cur_num) is not str:print("cur_num 数据类型错误!请确认为整数类型,或者为字符串类型!")return False# 数字检测if type(cur_num) is str:try:cur_num = int(cur_num)except:print("cur_num参数非法!请确认是输入数据为整数数字!")return False# 数字是否出范围if cur_num in range(1, max_num + 1):return Trueelse:print("行号或者列号,超出了目前最大行号,或者最大列号!!")return False@staticmethoddef justOpen(strFileName):"""模拟手工打开excel表:param strFileName: 打开的excel文件名(后缀.xlsx格式)"""try:xlApp = Dispatch("Excel.Application")xlApp.Visible = FalsexlBook = xlApp.Workbooks.Open(os.path.join(os.getcwd(), strFileName))xlBook.Save()xlBook.Close()except:print("请手工打开 %s 后,随便修改一个空值并保存" % strFileName)"""
========================================
主函数功能测试
========================================
"""
if __name__ == '__main__':# 对自己定义的功能类进行测试# 正常功能测试myExcel = MyPyExcel("test.xlsx")  # 加载文件myExcel.openWorkSheet("Sheet")  # 选择工作表myExcel.putDataByCell(1, 1, 100)  # 写入一个单元格数据myExcel.putDataByCell(2, 1, 400)  # 写入一个单元格数据myExcel.putDataByCell(3, 1, "=SUM(A1:A2)")  # 写入一个单元格公式myExcel.saveWorkBookData("test.xlsx")  # 保存数据myExcel.closeWorkBook()  # 关闭工作簿myExcel.justOpen("test.xlsx")  # 模拟手工打开excel表"""读取单元格的数值。data_only=True"""myExcel2 = MyPyExcel("test.xlsx")  # 加载文件myExcel2.openWorkSheet("Sheet")  # 选择工作表print(myExcel2.getDataByCell(3, 1))  # 读取某一个单元格数据myExcel2.closeWorkBook()  # 关闭工作簿"""读取单元格的公式。data_only=False"""myExcel3 = MyPyExcel("test.xlsx", False)  # 加载文件myExcel3.openWorkSheet("Sheet")  # 选择工作表print(myExcel3.getDataByCell(3, 1))  # 读取某一个单元格公式myExcel3.closeWorkBook()  # 关闭工作簿

输出结果如下:

Python openpyxl打开有公式的excel表取值错误的解决办法,Python openpyxl获取excel有公式的单元格的数值错误,Python操作excel(.xlsx)封装类相关推荐

  1. Excel一键求得单元格内数值个数的操作!

    今天要和大家分享的是,Excel一键求得单元格内数值个数的操作!比如说下图中的城市内容全部集中在一个单元格,现在想要知道各自省份对应的城市数量-- (方方格子插件) ​ 1.先看动图演示吧 2.操作之 ...

  2. html怎么把excel表格合并单元格,巧用格式刷实现Excel合并后保留原单元格数据

    合并单元格是用户在制作表格时常用的命令,它可以把多个单元格显示成一个单元格,起到美化的作用. 通常情况下,如果把几个含有数据的单元格进行合并,Excel会提示"在合并单元格时,如果选择的单元 ...

  3. 如何用VBA从EXCEL表取数据?问题1:1次性整体写入,还是循环写入数组呢? 问题2:取得数据后如何定位需要的那个?

    1问题 1.1 如何用VBA从EXCEL表取数据? 有时候只是要把EXCEL表的数据读到VBA里 经常,我们需要读入EXCEL的数据,且能明确的知道每列的意义,并且根据某一列(比如 id列/ inde ...

  4. 打开excel,提示 flash play2 错误,解决办法

    打开excel,提示 flash play2 错误,解决办法,下载附件的东东,然后解压安装即可 ISScript.msi安装补丁.zip (4.8 MB) 下载次数: 0

  5. Excel只复制有公式的单元格进行批量的求和操作

    今天要和大家分享的是,Excel只复制有公式的单元格进行批量的求和操作,比如下图所示,我想用1月份的求和公式,套用到2月份,因为格式都一样吗,所以直接复制公式就可以了 (方方格子插件) ​ 1.先看动 ...

  6. php无法导出excel,PHPExcel导出Excel文件时出现错误的解决办法

    phpexcel文件是一款开源的php表格操作插件,只要用到excel数据导入导出的朋友大多数人都选择此款插件了,但在使用中也会有问题出现,下面来看问题分析研究. PHPExcel是PHP中功能最强大 ...

  7. 如何通过VB合并Excel单元格以及设置Excel行高?VB创建Excel表格,合并单元格,生成图形等操作

    如何通过VB合并Excel单元格以及设置Excel行高? 例如:我想把第一列的第4,5,6,7行合并...我在怎样让合并单元格里的字居中,怎样改变字体. 请不吝赐教... ============== ...

  8. 关于PyCharm编程中报出ImportError: Missing optional dependency ‘openpyxl‘. Use pip or conda to ins错误的解决办法

     关于PyCharm编程中报出ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to ins错误的解决办法之一 ...

  9. 【Python基础】Python3十大经典错误及解决办法

    ◆ ◆ ◆  ◆ ◆ 接触了很多Python爱好者,有初学者,亦有转行人.不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极好的.下面,严小样儿为大家罗列出Pyt ...

最新文章

  1. Objective-C代码的文件扩展名
  2. 物理服务器转虚拟服务器,物理服务器转虚拟服务器
  3. mybatis 取传进来的参数 mybatis #{ } ${ }区别是啥?
  4. .Net性能调优-垃圾回收!!!最全垃圾回收来了
  5. Linus Torvalds的安全性,Facebook的AI工具等
  6. 程序员常用的泛型机制究竟怎么玩?
  7. 文件操作之fread()和fwrite()函数
  8. Thinkphp 实现动态include
  9. PRINCE2认证10大常见问题集锦,拿走不谢
  10. 树套树【bzoj3262】陌上花开
  11. QT如何给exe添加图标
  12. 拯救红米note3砖头
  13. 测试开发—码流、单码流、双码流、多码流
  14. 充电器电压和电池电压关系
  15. java饼图_java 百分比饼图的实现代码
  16. android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)
  17. vue简单的数字滚动动画
  18. linux中ret2libc入门与实践
  19. 唯美计算机语言,唯美精辟的语句
  20. C#交错数组和参数数组

热门文章

  1. kodexplorer开源网盘php程序配置解析
  2. 不用正则表达式,用javascript从零写一个模板引擎(一)
  3. mdm.Dialogs.promptModal()使用
  4. Erlang/Elixir 社区摘要: 2016-05-21
  5. ISP QoS Lab
  6. RAC 之 RMAN 备份
  7. SpringBoot自定义Starter(自动配置类)
  8. html5链接mvc,LinkExtensions.ActionLink 方法 (System.Web.Mvc.Html) | Microsoft Docs
  9. python包路径有几个_python的搜索路径与包(package)
  10. 易语言python1.1模块_易语言之编写模块与引入模块