我尝试使用简单的公式创建Excel文件:
import xlsxwriter
workbook = xlsxwriter.Workbook('testxlsx.xlsx', {'strings_to_numbers': True})
ws = workbook.add_worksheet()
ws.write('A2', 'Number one')
ws.write('B2', '1')
ws.write('A3', 'Number two')
ws.write('B3', "1000")
ws.write('A4', "Number three")
ws.write('B4', "1050")
ws.write('A5', "Number four")
ws.write('B5', "3")
ws.write('A6', "Result")
ws.write('B6', '=IF(B5=3,ROUND(100-(B3/B4*100),1),ROUND(100-(B3/(B4*1.502)*100),1))')
workbook.close()
生成的文件在Excel中完美运行,但在LibreOffice Calc中打开时,不会计算公式。我需要重新输入数值,然后才能工作。
我做错了什么?
答案 0 :(得分:15)
来自xlsxwriter docs:
XlsxWriter不计算公式的结果,而是将值0存储为公式结果。然后,它在XLSX文件中设置一个全局标志,表示在打开文件时应重新计算所有公式和函数。这是Excel文档中推荐的方法,通常它适用于电子表格应用程序。但是,没有计算公式的工具的应用程序(如Excel Viewer)或某些移动应用程序只会显示0结果。
至于为什么重新计算不会自动发生,来自ask.libreoffice.org answer:
LibreOffice故意不重新计算旧的电子表格,因为公式从版本更新到版本或不同的电子表格程序之间,结果可能会有所不同。转到工具 - 选项 - LibreOffice Calc,在'重新计算文件加载'下,更改两个下拉列表,' Excel 2007和更新版本'和' ODF电子表格(未由LibreOffice保存)',始终重新计算'。单击“确定”,关闭电子表格和LibreOffice。现在在LibreOffice中打开文件,您应该看到公式已重新计算。
同样转到工具 - 单元格内容并确保AutoCalculate是 地选择。
我确认设置"总是重新计算"或者"提示"为我工作。或者,你总是可以点击control-shift-F9。
答案 1 :(得分:1)
来自FAQ of the xlsxwriter website:
<块引用>注意:默认情况下,LibreOffice 不会重新计算引用其他单元格的 Excel 公式,在这种情况下,您将获得默认的 XlsxWriter 值 0。您可以通过设置“LibreOffice 首选项 -> LibreOffice Calc -> 公式”来解决此问题-> 文件加载时重新计算”选项为“始终重新计算”(请参阅 LibreOffice 文档)。 或者,您可以在公式中设置空白结果,这也会强制重新计算:
worksheet.write_formula('A1', '=Sheet1!$A$1', None, '')
我刚刚测试了这个,确实有效。