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

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()  # 关闭工作簿

输出结果如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现GCS bucket断点续传功能,分块上传文件

Python实现GCS bucket断点续传功能,分块上传文件 环境:Python 3.6 我有一个关于使用断点续传到Google Cloud Storage的上传速度的问题。我已经编写了一个Python客户端,用于将大文件上传到GCS(它具有一些特殊功能,这…

Spring Boot 最佳实践(一)快速入门

一、关于Spring Boot 在开始了解Spring Boot之前,我们需要先了解一下Spring,因为Spring Boot的诞生和Spring是息息相关的,Spring Boot是Spring发展到一定程度的一个产物,但并不是Spring的替代品,Spring Boot是为了让程…

Wo Cloud CentOS 挂载磁盘小计

为什么80%的码农都做不了架构师?>>> 涉及到的命令:fdisk/mkfs/mount 列出当前磁盘[rootvity ~]# fdisk -lDisk /dev/vda: 21.5 GB, 21474836480 bytes 16 heads, 63 sectors/track, 41610 cylinders Units cylinders of 1008 * 512 516096…

PC通过IE浏览器对华为S5700交换机进行WEB管理

1.PC和交换机通过网线连接,通过CONSOLE线缆连接华为S5700交换机,使用如下命令查看是否有web.7z文件 <Quidway>dir2.新建VLAN和配置VLAN的IP <Quidway>system-view [Quidway]<

最邻近插值、双线性插值、三次卷积插值最通俗入门理论解析,论文材料

如有任何问题&#xff0c;请联系VX&#xff1a;1755337994 前言 图像处理中有三种常用的插值算法&#xff1a; 最邻近插值 双线性插值 双立方&#xff08;三次卷积&#xff09;插值 其中效果最好的是双立方&#xff08;三次卷积&#xff09;插值&#xff0c;本文介绍它的原…

Spring Boot 最佳实践(二)集成Jsp与生产环境部署

一、简介 提起Java不得不说的一个开发场景就是Web开发&#xff0c;也是Java最热门的开发场景之一&#xff0c;说到Web开发绕不开的一个技术就是JSP&#xff0c;因为目前市面上仍有很多的公司在使用JSP&#xff0c;所以本文就来介绍一下Spring Boot 怎么集成JSP开发&#xff0c…

全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容

在医学图像处理中&#xff0c;我们经常使用一种NIFTI格式图像&#xff08;.nii文件&#xff09;&#xff0c;现在我们来看看 什么是.nii文件&#xff1f;该如何读取.nii文件&#xff1f; 1. NIFTI格式图像 什么是NIFTI&#xff08;Neuroimaging Informatics Technology Initia…

Spring Boot 最佳实践(三)模板引擎FreeMarker集成

一、FreeMaker介绍 FreeMarker是一款免费的Java模板引擎&#xff0c;是一种基于模板和数据生成文本&#xff08;HMLT、电子邮件、配置文件、源代码等&#xff09;的工具&#xff0c;它不是面向最终用户的&#xff0c;而是一款程序员使用的组件。 FreeMarker最初设计是用来在M…

Android开发之通过浏览器链接打开任意app页面

老套路先上图&#xff1a; 先说下上面的流程&#xff0c;第一张图是模拟浏览器的网页点击链接打开app,第二张图系统弹框提示是否打开app,第三张图已打开APP&#xff0c;弹出的吐司是打开APP携带的数据 具体实现分为两步&#xff0c;第一步配置你要打开的activity页面如下&…

DVWA下载、安装、使用(漏洞测试环境搭建)教程

DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用&#xff0c;旨在为安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;帮助web开发者更好的理解web应用安全防范的过程。 一共有十个模块&#xf…

Spring Boot 最佳实践(四)模板引擎Thymeleaf集成

## 一、Thymeleaf介绍 Thymeleaf是一种Java XML / XHTML / HTML5模板引擎&#xff0c;可以在Web和非Web环境中使用。它更适合在基于MVC的Web应用程序的视图层提供XHTML / HTML5&#xff0c;但即使在脱机环境中&#xff0c;它也可以处理任何XML文件。它提供了完整的Spring Fram…

Centos7安装Postgresql 13 详细步骤(远程连接)

版本信息 CentOS &#xff1a; 7.6 postgresql&#xff1a; 10.012 安装 可以参考官网PostgreSQL: Linux downloads (Red Hat family) &#xff03;安装存储库RPM&#xff1a; sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgd…

mysql复制: 一个master对应1个slave

2019独角兽企业重金招聘Python工程师标准>>> 复制的步骤&#xff1a;1.在主库上开启二进制日志&#xff0c;把数据更改记录到二进制日志(binary log)中. mysql会按照事物提交的顺序而非每条语句的执行顺序来记录二进制日志&#xff0c;在记录二进制日志后&#xff…

python3、sqlmap下载与安装教程

一 、前提 需要安装python3&#xff0c;可以参考其他教程 二 、下载 官网下载http://sqlmap.org/ 三 、安装 将下载的sqlmap.zip解压到文件夹sqlmap中&#xff0c;并拷贝到Python安装路径下 四、 配置 在桌面上创建一个cmd进入python的快捷方式&#xff08;这步可以不做…

Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8

## 一、Spring Data JPA 介绍 JPA&#xff08;Java Persistence API&#xff09;Java持久化API&#xff0c;是 Java 持久化的标准规范&#xff0c;Hibernate是持久化规范的技术实现&#xff0c;而Spring Data JPA是在 Hibernate 基础上封装的一款框架。 开发环境 Spring Boo…

Windows MinGW配置C、C++编译环境

写在前面的前面&#xff1a;这篇文章vscode和cpp插件版本有点老了&#xff0c;仅供大家参考&#xff0c;最新的和最详细的更新见我的另一篇文章&#xff1a;整理&#xff1a;Visual Studio Code (vscode) 配置C、C环境/编写运行C、C&#xff08;主要Windows、简要Linux&#xf…

Burpsuite超详细安装教程

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文转载于链接&#xff1a;https://blog.csdn.net/LUOBIKUN/article/details/87457545 Burpsuite的超详细安装教程 概述工具分享安装一&#xff…

使用Hexo搭建个人博客的终极资料

# 一、前言 Hexo 是一个基于 NodeJs 博客框架&#xff0c;可以快速的帮我们搭建一个博客系统&#xff0c;Hexo使用的是Markdown&#xff08;下文简称MD&#xff09;解析文章的&#xff0c;在几秒内即可利用靓丽的主体生成静态网页。 推荐使用 Hexo 有三大理由&#xff1a; 有…

Linux Ubuntu 安装编译Opencv 3.4.3 C++开发环境

在安装Autoware之前&#xff0c;需要先安装Opencv&#xff0c;之前在Windows下安装了Opencv&#xff0c;挺复杂的。不过&#xff0c;在Ubuntu 16.04环境中配置安装Opencv相对来说&#xff0c;比较简单。 Linux Ubuntu 安装编译Opencv 3.4.3 C开发环境 1.1 下载Opencv 3.4.3 …

bugku web基础$_POST

意思是通过post传入一个参数what&#xff0c;如果what的值等于flag&#xff0c;即打印出flag 这个我们有好几种办法&#xff1a; 第一种方法&#xff1a; 用FireFox的HackBar插件&#xff0c;传入参数whatflag run一下&#xff0c;爆出了flag 第二种方法&#xff1a; 写个…