我必须将算法从 Excel 工作表移植到 Python 代码,但我必须对 Excel 文件中的算法进行逆向工程。
Excel 工作表相当复杂,它包含许多单元格,其中有引用其他单元格的公式(也可以包含公式或常数)。
我的想法是用python脚本来分析表格,建立一个单元格之间的依赖关系表,即:
A1 depends on B4,C5,E7 formula: "=sqrt(B4)+C5*E7"
A2 depends on B5,C6 formula: "=sin(B5)*C6"
...
xlrd python 模块允许读取 XLS 工作簿,但目前我可以访问单元格的 value,而不是 formula。
例如,使用以下代码,我可以简单地获取单元格的值:
import xlrd
#open the .xls file
xlsname="test.xls"
book = xlrd.open_workbook(xlsname)
#build a dictionary of the names->sheets of the book
sd={}
for s in book.sheets():
sd[s.name]=s
#obtain Sheet "Foglio 1" from sheet names dictionary
sheet=sd["Foglio 1"]
#print value of the cell J141
print sheet.cell(142,9)
无论如何,似乎没有办法从 .cell(...) 方法返回的 Cell 对象中获取公式。 在 documentation他们说可以获得公式的字符串版本(英文是因为没有关于存储在 Excel 文件中的函数名称翻译的信息)。他们谈论 Name 和 Operand 类中的公式(表达式),无论如何我无法理解如何通过 Cell 获取这些类的实例必须包含它们的类实例。
您能否推荐一个从单元格中获取公式文本的代码片段?
最佳答案
[Dis]声明:我是 xlrd
的作者/维护者。
公式文本的文档引用是关于“名称”公式的;阅读文档开头附近的“命名引用、常量、公式和宏”部分。这些公式在工作表范围或书籍范围内与名称相关联;它们与单个细胞无关。示例:PI
映射到 =22/7
,SALES
映射到 =Mktng!$A$2:$Z$99
。名称公式反编译器旨在支持检查已定义名称的更简单和/或常见用法。
公式一般有几种:单元格、共享和数组(都与单元格直接或间接关联)、名称、数据验证和条件格式。
将一般公式从字节码反编译为文本是一项“正在进行的工作”,速度很慢。请注意,假设它可用,您将需要解析文本公式以提取单元格引用。正确解析 Excel 公式并非易事;与 HTML 一样,使用正则表达式看起来很简单,但不起作用。最好直接从公式字节码中提取引用。
另请注意,基于单元格的公式可以引用名称,而名称公式可以引用单元格和其他名称。因此,有必要从基于单元格的公式和名称公式中提取单元格和名称引用。获取有关可用共享公式的信息可能对您有用;否则解析以下内容:
B2 =A2
B3 =A3+B2
B4 =A4+B3
B5 =A5+B4
...
B60 =A60+B59
您需要自己推断 B3:B60
公式之间的相似性。
无论如何,上述任何一项都不太可能在短期内可用——xlrd
优先级在别处。
关于python - 使用 python xlrd 从 Excel 单元格中获取公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690423/