1

我正面临 xlrd 和 xlwt 的问题。粘贴下面的示例代码。

from xlwt import Workbook, Formula, XFStyle
import xlrd

book = Workbook()
sheet1 = book.add_sheet('Sheet 1')
myFontStyle = XFStyle()
myFontStyle.num_format_str = '0.00'
sheet1.write(0,0,10, myFontStyle)
sheet1.write(0,1,20, myFontStyle)
sheet1.write(1,0,Formula('AVERAGE(A1:B1)'), myFontStyle)
book.save('formula.xls')

wb = xlrd.open_workbook('formula.xls')
sh = wb.sheet_by_index(0)
for rownum in range(sh.nrows):
    print sh.row_values(rownum)

这个想法是将一些值写入 Excel 文件,具有一些特定于 Excel 的函数,如 LogNormal、StdDev 等,并使用 XLRD 读取计算值。

通过运行上面的代码,我得到了以下不受欢迎的结果:-

[10.0, 20.0]
[u'', '']

理想情况下,我应该在第二排得到 15 个。当我打开它时它会完美地写入 Excel,但 XLRD 不返回结果。对于一个非常关键的项目,我坚持这一点。请您尽快回复。

感谢和问候塔伦帕斯里加

4

2 回答 2

8

这是我昨天在 python-excel google-group 上对同一问题给出的答案。

[背景:我是xlrd的作者/维护者和xlwt的维护者]

xlrd 和 xlwt 都不包含公式评估引擎。这与其他免费的(在任何意义上)并以解释语言编写的软件包是共同的。这记录在教程中,您可以通过http://www.python-excel.org下载...参见第 17 页和第 36 页。

如果你把你的脚本分成两部分,执行第一个,用 Excel/OOo calc/Gnumeric 打开结果 XLS 文件,[可能需要在这里按 F9 重新计算],再次保存,执行第二个脚本:xlrd 将显示结果。

其他可能性:

(1) 在 gnumeric 邮件列表上询问是否可以以编程方式驱动 gnumeric 到:打开命名的 XLS 文件,[重新]计算所有公式,保存为命名的 XLS 文件(包括重新计算的公式结果 - 它有必要强调这一点,因为我上次询问时,本机 gnumeric 文件格式不包括计算公式结果)。

(2) 您可以在新闻:comp.lang.python 和/或 www.stackoverflow.com 上询问有关 Openoffice.org 的 calc 程序的相同问题……它有一组名为“PyUNO”的 API;上次我看的时候,大多数人都放弃了尝试去理解大量的文档。我肯定会在 Python+电子表格世界中收到任何更好的消息。

(3) “LogNormal”(我想你的意思是 LOGNORMDIST 和/或 LOGINV)和“StdDev”几乎不是 Excel 特有的。您可以在 Python 中计算自己的结果;需要扩充 xlwt 以允许调用者为公式单元格提供结果值,而不是像您注意到的那样插入不变的零长度字符串。

(4) 告诉我们您的更高层次的目标……然后我们可能会提出其他建议。

这个“非常关键的项目”是学术/慈善/商业企业吗?您是否考虑过 Resolver One ( http://www.resolversystems.com/products/resolver-one/ )?AFAIK,他们提供折扣,而且他们的产品非常便宜,每个许可证大约 100 美元。

于 2010-11-18T11:33:13.867 回答
2

您需要在 Excel 中打开它并在运行第二个位之前重新保存它。xlwt/xlrd 实际上并没有自己计算公式,所以你需要 Excel 来做到这一点。我刚刚使用 OpenOffice 进行了测试,并且在重新保存文件后它可以工作。

另外,请告诉我您使用此方法不只是为了计算平均值吗?你可以很容易地在 Python 中做到这一点:

average = float(sum(mynumbers))/len(mynumbers)

(在 Python 3 中,您可以省略 float())

于 2010-11-16T20:19:52.533 回答