面临同样的问题。无论单元格是什么,都需要读取单元格值:标量、带有预计算值的公式或没有这些值的公式,优先考虑错误容忍而不是正确性。

这个策略非常简单:如果单元格不包含公式,则返回单元格的值

如果它是一个公式,试着得到它的预计算值

如果不能,请尝试使用^{}

如果失败(由于pycel对公式的有限支持或有一些错误),则发出警告并返回None。

我创建了一个类,它隐藏了所有这些机器,并提供了读取单元格值的简单接口。

如果正确性优先于容错性,则很容易修改类,以便在步骤4中引发异常。

希望它能帮助别人。from traceback import format_exc

from pathlib import Path

from openpyxl import load_workbook

from pycel.excelcompiler import ExcelCompiler

import logging

class MESSAGES:

CANT_EVALUATE_CELL = ("Couldn't evaluate cell {address}."

" Try to load and save xlsx file.")

class XLSXReader:

"""

Provides (almost) universal interface to read xlsx file cell values.

For formulae, tries to get their precomputed values or, if none,

to evaluate them.

"""

# Interface.

def __init__(self, path: Path):

self.__path = path

self.__book = load_workbook(self.__path, data_only=False)

def get_cell_value(self, address: str, sheet: str = None):

# If no sheet given, work with active one.

if sheet is None:

sheet = self.__book.active.title

# If cell doesn't contain a formula, return cell value.

if not self.__cell_contains_formula(address, sheet):

return self.__get_as_is(address, sheet)

# If cell contains formula:

# If there's precomputed value of the cell, return it.

precomputed_value = self.__get_precomputed(address, sheet)

if precomputed_value is not None:

return precomputed_value

# If not, try to compute its value from the formula and return it.

# If failed, report an error and return empty value.

try:

computed_value = self.__compute(address, sheet)

except:

logging.warning(MESSAGES.CANT_EVALUATE_CELL

.format(address=address))

logging.debug(format_exc())

return None

return computed_value

# Private part.

def __cell_contains_formula(self, address, sheet):

cell = self.__book[sheet][address]

return cell.data_type is cell.TYPE_FORMULA

def __get_as_is(self, address, sheet):

# Return cell value.

return self.__book[sheet][address].value

def __get_precomputed(self, address, sheet):

# If the sheet is not loaded yet, load it.

if not hasattr(self, '__book_with_precomputed_values'):

self.__book_with_precomputed_values = load_workbook(

self.__path, data_only=True)

# Return precomputed value.

return self.__book_with_precomputed_values[sheet][address].value

def __compute(self, address, sheet):

# If the computation engine is not created yet, create it.

if not hasattr(self, '__formulae_calculator'):

self.__formulae_calculator = ExcelCompiler(self.__path)

# Compute cell value.

computation_graph = self.__formulae_calculator.gen_graph(

address, sheet=sheet)

return computation_graph.evaluate(f"{sheet}!{address}")

python解析excel公式_读取Excel单元格值,而不是计算它的公式-openpyx相关推荐

  1. LISP 冻结excel窗格_LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段

    写在最前面: 我希望我的这些记录会在将来给同样琢磨这些内容苦于无同道者的朋友们一些帮助. 大方向上总有很多人同行,细分的需求或方向缺越来越少.当网上搜索到的资料无法回答的我问题的时候,可能是我没有接触 ...

  2. Excel | 替换特定大小的单元格值(如:小于5000的值)为指定值

    Excel | 特定单元格值的替换 一.随机数值 二.数据替换 2.1 替换条件 2.2 数值调换方法 一.随机数值 利用excel的rand()函数产生一系列的随机数,作为演示,如图1所示. 图1 ...

  3. Java POI:如何读取Excel单元格值而不是计算公式

    我正在使用Apache POI API从Excel文件中获取值. 除了含有公式的单元格外,一切都很好.实际上,cell.getStringCellValue()返回单元格中使用的公式而不是单元格的值. ...

  4. python解析java文件_读取java文件

    JAVA通信编程(二)--如何读取java的properties配置文件(插播) 如何读取java的properties配置文件本不属于java通讯编程这个系列的范畴,但是在做一些应用中编写通讯编程需 ...

  5. 怎样在单元格中插入图表_如何为Excel图表标签使用单元格值

    怎样在单元格中插入图表 Make your chart labels in Microsoft Excel dynamic by linking them to cell values. When t ...

  6. java poi 设置时间空间_java - POI - 如何将单元格值设置为Date并应用默认的Excel日期格式?...

    java - POI - 如何将单元格值设置为Date并应用默认的Excel日期格式? 我已经使用Apache POI一段时间以编程方式读取现有的Excel 2003文件. 现在我有了一个新的要求,即 ...

  7. python公式_Python读取excel文件中带公式的值的实现

    在进行excel文件读取的时候,我自己设置了部分直接从公式获取单元格的值 但是用之前的读取方法进行读取的时候,返回值为空 import os import xlrd from xlutils.copy ...

  8. excel如何去重统计户数_公式解读第三期 单元格中数字如何去重排序?

    公式解读 第三期 -单元格中数字的去重排序!本期涉及到函数较多,你可以一次性根据这个案例,学习多少很多常用 函数的用法,同时我也会讲解思路,这个很重要,思路决定了出路.直接先看一下我们的效果图: 效果 ...

  9. c# 获取excel单元格公式结果_EXCEL公式解析:单元格中数字去重排序思路及公式详解...

    公式解读 第三期 -单元格中数字的去重排序! 本期涉及到函数较多,你可以一次性根据这个案例,学习多少很多常用 函数的用法,同时我也会讲解思路,这个很重要,思路决定了出路. 直接先看一下我们的效果图: ...

  10. python自动填写excel_Python:根据前面单元格中的公式自动填充Excel中的单元格

    使用Python和win32com: 我在Excel文件中有一个公式,在单元格A5:A54.我试着用同样公式的值填充A55:A61单元格.我在网上搜索发现: http://pythonexcels.c ...

最新文章

  1. 别在 Java 代码里乱打日志了,这才是正确的日志打印姿势!
  2. CentOs7安装gitlab(转!)
  3. java jtree_Java JTree
  4. oracle 计算中位数,SQL 如何计算每个分组的中位数
  5. linux touch权限不够,Linux下的Access、Modify、Change , touch的使用以及权限问题
  6. zzulioj 1065:统计数字字符个数
  7. 处理11gR2 RAC集群资源状态异常INTERMEDIATE,CHECK TIMED OUT
  8. MASK RCNN在tensorflow 2.5中运行
  9. C/C++ Npcap包实现ARP欺骗
  10. CAD.net二次开发之图层,文字样式,标注样式,标注封装,引线的封装
  11. 文科专业考计算机专业研究生,跨专业文科生考计算机研究生的经验
  12. APP在推广之渠道为王(二 )
  13. 地下城游戏 骑士拯救公主 | leetcode 174
  14. 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据,程序输出读到的数据中的奇数和偶数的个数。(Java经典编程案例)
  15. vue3 内置组件keep-alive用法的全面介绍
  16. oss客户端工具_云享会 | 沃云公有云重点产品推荐:文件存储NASamp;对象存储OSS...
  17. AngularJS学习笔记-2
  18. 使用SDL2_mixer库播放MP3音乐
  19. 【双节快乐】十万人都在疯转的国旗中秋专属头像
  20. 视频教程-区块链基础:共识算法-区块链

热门文章

  1. 第一个Java Web的小case
  2. libvlc 裁剪及编译
  3. 怎么导出微信聊天的记录到Word
  4. 微信营销有哪些优缺点?
  5. CVPR2020|3D目标检测算法推荐论文源码大盘点
  6. 单片机一键开关机电路,多种方案可供选择,有纯硬件的也有软硬结合的
  7. 掂清自己在别人心中的分量,是人际…
  8. 车联网群雄逐鹿,通信业将如何掘金?
  9. .net core 创建桌面应用程序(极简流程)
  10. 适配iPhone XR/iPhone XS Max