当前位置: 首页 > news >正文

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的平方。

缘由 三种思路解题&#xff1a;依据算术推导得到一个规律&#xff1a;小等于的所有奇数和等于最大奇数除以2加1的平方。将在后续发布&#xff0c;总计有十种推导出来的实现代码。 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连接测试失败问题解决

个人博客地址&#xff1a;Ranger Hive Service连接测试失败问题解决 | 一张假钞的真实世界 异常信息如下&#xff1a; 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为例&#xff0c;链路如下 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 值附近的元素 注意事项原理 背景 如果我们有需求需要存储地理坐标&#xff0c;为了满足高性能的矩形区域算法&#xff0c;数据表需要在经纬度坐标加上双向复合索引 (x, y)&#x…...

21.2.7 综合示例

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

使用Docker + Ollama在Ubuntu中部署deepseek

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

【C语言标准库函数】三角函数

目录 一、头文件 二、函数简介 2.1. 正弦函数&#xff1a;sin(double angle) 2.2. 余弦函数&#xff1a;cos(double angle) 2.3. 正切函数&#xff1a;tan(double angle) 2.4. 反正弦函数&#xff1a;asin(double value) 2.5. 反余弦函数&#xff1a;acos(double value)…...

CNN-day9-经典神经网络ResNet

day10-经典神经网络ResNet 1 梯度消失问题 深层网络有个梯度消失问题&#xff1a;模型变深时&#xff0c;其错误率反而会提升&#xff0c;该问题非过拟合引起&#xff0c;主要是因为梯度消失而导致参数难以学习和更新。 2 网络创新 2015年何凯明等人提出deep residual netw…...

淘宝分类详情数据获取:Python爬虫的高效实现

在电商领域&#xff0c;淘宝作为中国最大的电商平台之一&#xff0c;其分类详情数据对于市场分析、竞争对手研究以及电商运营优化具有不可估量的价值。通过Python爬虫技术&#xff0c;我们可以高效地获取这些数据&#xff0c;为电商从业者提供强大的数据支持。 一、为什么选择…...

机器学习 —— 深入剖析线性回归模型

一、线性回归模型简介 线性回归是机器学习中最为基础的模型之一&#xff0c;主要用于解决回归问题&#xff0c;即预测一个连续的数值。其核心思想是构建线性方程&#xff0c;描述自变量&#xff08;特征&#xff09;和因变量&#xff08;目标值&#xff09;之间的关系。简单来…...

33.日常算法

1.螺旋矩阵 题目来源 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[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. 未来研究计划 部分内容有拓展&#xff0c;部分内容有删除&#xff0c;与原文会有…...

Vision Transformer学习笔记(2020 ICLR)

摘要(Abstract):简述了ViT(Vision Transformer)模型的设计和实验结果,展示了其在大规模图像数据集上进行训练时的优越性能。该模型直接采用原始图像块作为输入,而不是传统的卷积神经网络(CNNs),并通过Transformer架构处理这些图像块以实现高效的图像识别。引言(Introdu…...

一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路

以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

25/2/8 <机器人基础> 阻抗控制

1. 什么是阻抗控制&#xff1f; 阻抗控制旨在通过调节机器人与环境的相互作用&#xff0c;控制其动态行为。阻抗可以理解为一个力和位移之间的关系&#xff0c;涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制&#xff1a;根据感测的外力调节机械手的动作。位置…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...