python读取Excel表格内公式的值
- 背景:在做业务周报的时候,有一个Excel模板,表里面包含了一些公式,dataframe写入到Excel的时候,有公式的部分通过python读出来的结果是None,需要进行优化
- 参考链接:
-
- 如何使用openpyxl读取Excel单元格的值而不是计算它的公式? python - Dev59
- Openpyxl 1.8.5:使用openpyxl读取单元格中输入的公式的结果 python - Dev59
- stackoverflow:calculating-excel-sheets-without-opening-them-openpyxl-or-xlwt
- pycel/src/pycel/excelcompiler.py at master · dgorissen/pycel
- Calculation (evaluating Excel formulas in Python) — Python tools for Excel 0.0.2b0 documentation
- 实现方案:最终通过openpyxl+pycel的组合,实现了Excel公式内容的计算,并获取公式的计算结果
from datetime import datetime
# import xlwt
import os
import pandas as pd
import xlrd
from openpyxl import load_workbook
import numpy as np
from collections import defaultdict
from collections import Counter
import xlwings as xw
from pycel import ExcelCompiler
from pycel.excelformula import ExcelFormulafrom openpyxl.utils import get_column_letterfile_name = r'周报_20250206.xlsx'
folder_path = os.getcwd()
file_path = os.path.join(folder_path,file_name)
os.path.exists(file_path)# Open Excel workbook and worksheet in openpyxl, data-only.
wb = load_workbook(filename = file_name,data_only=False)
ws = wb.active
sheet_name = ws.title# 获取工作表的行数和列数
max_row = sheet.max_row
max_column = sheet.max_column# 使用 pycel 编译和计算公式
compiler = ExcelCompiler(filename=file_name)# 逐行逐列读取数据
data = []
for row in range(1, max_row + 1):row_data = []for col in range(1, max_column + 1): cell_value =sheet.cell(row=row, column=col) col_letter = get_column_letter(col) # get_column_letter把1列变成A列result = compiler.evaluate(f'{sheet_name}!{col_letter}{row}') # 计算 Sheet1!C1或者Sheet1!C1:D10 单元格的公式row_data.append(result)data.append(row_data)
df = pd.DataFrame(data)
# df.loc[:369]
# df
- 难点:xlrd 不支持xlsx文件
-
- 在解决整个问题的过程中,用了kimi和deepseek
- 解决公式未计算的问题的方案:
-
- ① 手动打开并保存文件:在 Excel 中打开文件并保存,这样公式会被计算并存储在文件中
- ② 自动化保存文件:使用
win32com
自动打开 Excel 文件并保存,win32com
仅适用于 Windows 系统。如果你在 macOS 上工作,建议使用xlwings
,因为它支持 macOS 和 Windows。 - ③ 使用
xlwings
实时计算公式,允许与 Excel 进行交互,包括打开文件、激活窗口等操作,可以直接调用 Excel 来处理公式计算。这里面会有一个问题,在MacOS环境下使用xlwings
会出现权限的问题,要修改MacOS的系统权限才能进行操作,比较麻烦。 - ④ 使用subprocess.Popen激活Excel窗口,打开新的电子表格(相当于手动刷新),并让 Excel 评估电子表格公式,pynput.keyboard 保存更新的电子表格并退出 Excel,使用 data_only=True 的 openpyxl 打开更新的电子表格并获取公式的值。
- ⑤
openpyxl
读取Excel的公式内容,注意openpyxl
不会自动计算公式的结果。如果需要实时计算公式,可以使用xlwings
等库,它能够启动 Excel 并实时计算公式。如果需要读取公式的结果,确保在保存文件时公式已经被计算过,否则data_only=True
无法生效。
import openpyxl# 创建新工作簿
workbook = openpyxl.Workbook()# 获取默认工作表
sheet = workbook.active# 写入数据到单元格
sheet['A1'] = 'Hello'
sheet['B1'] = 'World'# 保存工作簿
workbook.save('new_example.xlsx')
cell_value = sheet['A1'].value
print(cell_value)
for row in sheet.iter_rows(min_row=1, max_row=5, min_col=1, max_col=3):for cell in row:print(cell.value)
sheet['A1'] = 'Hello World'
data = [[1, 2, 3],[4, 5, 6],[7, 8, 9],
]
for row in data:sheet.append(row)
from openpyxl.styles import Fontfont = Font(name='Arial', size=14, bold=True, italic=True, color='FF0000')
sheet['A1'].font = font
sheet['A1'].value = 'Hello, World!'
from openpyxl.styles import Border, Sidethin = Side(border_style="thin", color="000000")
thick = Side(border_style="thick", color="FF0000")
border = Border(left=thin, right=thick, top=thin, bottom=thick)
sheet['A1'].border = border
from openpyxl.styles import PatternFillfill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
sheet['A1'].fill = fill
from openpyxl import Workbook# 创建一个新的工作簿
wb = Workbook()
ws = wb.active# 在单元格中写入公式
ws['A1'] = 10
ws['B1'] = 20
ws['C1'] = '=SUM(A1:B1)' # 写入公式# 保存工作簿
wb.save('example.xlsx')
from openpyxl import load_workbook# 加载工作簿并设置 data_only=True
wb = load_workbook('example.xlsx', data_only=True)
ws = wb.active# 读取公式的结果
result = ws['C1'].value
print(result) # 输出公式计算后的结果
在 openpyxl 中,cell.data_type 属性会返回单元格的数据类型,具体类型如下:
'n':数值
's':字符串
'b':布尔值
'd':日期
'e':错误
import openpyxl# 加载 Excel 文件
file_path = 'example.xlsx'
workbook = openpyxl.load_workbook(file_path)
sheet = workbook.active# 遍历单元格并查看类型
for row in sheet.iter_rows(min_row=1, max_row=sheet.max_row, min_col=1, max_col=sheet.max_column):for cell in row:print(f"Cell {cell.coordinate} is of type {cell.data_type}")
相关文章:

python读取Excel表格内公式的值
背景:在做业务周报的时候,有一个Excel模板,表里面包含了一些公式,dataframe写入到Excel的时候,有公式的部分通过python读出来的结果是None,需要进行优化参考链接: 如何使用openpyxl读取Excel单元…...
第三十八章:阳江自驾之旅:挖蟹与品鲜
经历了惠州海边那趟温馨又欢乐的自驾之旅后,小冷和小颖心中对旅行的热情愈发高涨。闲暇时,两人总会坐在客厅里,翻看着旅行杂志,或是在网上搜索各地的美景,那些充满魅力的地方不断吸引着他们,也让他们对下一…...

C++小等于的所有奇数和=最大奇数除2加1的平方。
缘由 三种思路解题:依据算术推导得到一个规律:小等于的所有奇数和等于最大奇数除以2加1的平方。将在后续发布,总计有十种推导出来的实现代码。 int a 0,aa 1,aaa 0;cin >> a; while (aa<a) aaa aa, aa 2;cout << aaa;i…...

设置IDEA的内存大小,让IDEA更流畅: 建议设置在 2048 MB 及以上
文章目录 引言I 更改内存设置基于窗口界面进行内存设置修改内存配置文件II IDEA中的一些常见问题及其解决方案引言 方式一:基于窗口界面进行内存设置方式二:修改内存配置文件I 更改内存设置 基于窗口界面进行内存设置 打开IDEA,上方菜单栏 Help > Change Memory Settin…...
Ranger Hive Service连接测试失败问题解决
个人博客地址:Ranger Hive Service连接测试失败问题解决 | 一张假钞的真实世界 异常信息如下: org.apache.ranger.plugin.client.HadoopException: Unable to connect to Hive Thrift Server instance.. Unable to connect to Hive Thrift Server inst…...
车机音频参数下发流程
比如以audioControlWrapper.setParametersToAmp(keyPairValues); 下发banlance为例,链路如下 hal层 1. AudioControl.cpp hardware\interfaces\automotive\audiocontrol\aidl\default\AudioControl.cpp ndk::ScopedAStatus AudioControl::setParametersToAmp(co…...

大模型推理——MLA实现方案
1.整体流程 先上一张图来整体理解下MLA的计算过程 2.实现代码 import math import torch import torch.nn as nn# rms归一化 class RMSNorm(nn.Module):""""""def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Pa…...
redis之GEO 模块
文章目录 背景GeoHash 算法redis中的GeoHash 算法基本使用增加距离获取元素位置获取元素的 hash 值附近的元素 注意事项原理 背景 如果我们有需求需要存储地理坐标,为了满足高性能的矩形区域算法,数据表需要在经纬度坐标加上双向复合索引 (x, y)&#x…...

21.2.7 综合示例
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 【例 21.7】【项目:code21-007】填充职员表并打印。 本例使用到的Excel文件为:职员信息登记表.xlsx&#x…...

使用Docker + Ollama在Ubuntu中部署deepseek
1、安装docker 这里建议用docker来部署,方便简单 安装教程需要自己找详细的,会用到跳过 如果你没有安装 Docker,可以按照以下步骤安装: sudo apt update sudo apt install apt-transport-https ca-certificates curl software-p…...

【C语言标准库函数】三角函数
目录 一、头文件 二、函数简介 2.1. 正弦函数:sin(double angle) 2.2. 余弦函数:cos(double angle) 2.3. 正切函数:tan(double angle) 2.4. 反正弦函数:asin(double value) 2.5. 反余弦函数:acos(double value)…...
CNN-day9-经典神经网络ResNet
day10-经典神经网络ResNet 1 梯度消失问题 深层网络有个梯度消失问题:模型变深时,其错误率反而会提升,该问题非过拟合引起,主要是因为梯度消失而导致参数难以学习和更新。 2 网络创新 2015年何凯明等人提出deep residual netw…...
淘宝分类详情数据获取:Python爬虫的高效实现
在电商领域,淘宝作为中国最大的电商平台之一,其分类详情数据对于市场分析、竞争对手研究以及电商运营优化具有不可估量的价值。通过Python爬虫技术,我们可以高效地获取这些数据,为电商从业者提供强大的数据支持。 一、为什么选择…...
机器学习 —— 深入剖析线性回归模型
一、线性回归模型简介 线性回归是机器学习中最为基础的模型之一,主要用于解决回归问题,即预测一个连续的数值。其核心思想是构建线性方程,描述自变量(特征)和因变量(目标值)之间的关系。简单来…...
33.日常算法
1.螺旋矩阵 题目来源 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] class Solution { public:vec…...

#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概述 二、漏洞复现步骤 三、技术…...

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命
目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…...

Vision Transformer学习笔记(2020 ICLR)
摘要(Abstract):简述了ViT(Vision Transformer)模型的设计和实验结果,展示了其在大规模图像数据集上进行训练时的优越性能。该模型直接采用原始图像块作为输入,而不是传统的卷积神经网络(CNNs),并通过Transformer架构处理这些图像块以实现高效的图像识别。引言(Introdu…...
一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路
以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

25/2/8 <机器人基础> 阻抗控制
1. 什么是阻抗控制? 阻抗控制旨在通过调节机器人与环境的相互作用,控制其动态行为。阻抗可以理解为一个力和位移之间的关系,涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制:根据感测的外力调节机械手的动作。位置…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...