我必须将 算法从Excel工作表移植到python代码, 但必须对 Excel文件中的算法 进行 反向工程 。
Excel工作表非常复杂,它包含许多单元格,在这些单元格中有引用其他单元格的公式(也可以包含公式或常数)。
我的想法是使用python脚本分析工作表,以构建一种单元格之间的依存关系表,即:
A1取决于B4,C5,E7公式:“ = sqrt(B4)+ C5 * E7” A2取决于B5,C6公式:“ = sin(B5)* C6” …
所述xlrd蟒模块允许读取XLS工作簿但此刻我可以访问到 的值 的单元,而不是的 公式 。
例如,使用以下代码,我可以简单地获取单元格的值:
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对象中获取公式。他们在文档中说可以获取该公式的字符串版本(英文,因为在Excel文件中没有存储有关函数名称转换的信息)。他们谈论 Name 和 Operand 类中的公式(表达式),无论如何我都无法理解如何通过必须包含它们的 Cell 类实例来获取这些类的实例。
您能否建议一个从单元格获取公式文本的代码段?
[免责声明]:我是的作者/维护者xlrd。
xlrd
公式文本的文档参考中涉及“名称”公式。阅读文档开头附近的“命名引用,常量,公式和宏”部分。这些公式在工作表范围或全书范围与名称相关联;它们与单个单元格无关。示例:PI映射到=22/7,SALES映射到=Mktng!$A$2:$Z$99。编写名称- 公式反编译器以支持检查已定义名称的更简单和/或常见用法。
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公式之间的相似性。
B3:B60
在任何情况下,以上任何一种方法都不可能在不久的xlrd将来可用-优先事项位于其他地方。