同时读写XLWT和XLRD的问题

1 投票
2 回答
5440 浏览
提问于 2025-04-16 07:10

我在使用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却没有返回这些结果。我在一个非常重要的项目上卡住了。希望您能尽快回复。

谢谢,祝好 Tarun Pasrija

2 个回答

2

你需要先在Excel中打开这个文件,然后重新保存一下,才能运行第二部分的代码。因为xlwt/xlrd这些库实际上并不会自己计算公式,所以你需要用Excel来处理这个。刚才我用OpenOffice测试了一下,重新保存文件后也能正常工作。

另外,请告诉我你不是仅仅为了计算平均值才用这个方法吧?在Python中计算平均值其实非常简单:

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

(在Python 3中,你可以不写float())

8

这是我昨天在python-excel谷歌小组上对同样问题的回答。

[背景:我是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) 你也可以在news: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/) 据我所知,他们提供折扣,而且他们的产品价格也很便宜,大约每个许可证100美元。

撰写回答