<p>通过大量的尝试和错误,我找到了一种使用openpyxl将简单公式输入单元格的方法。为此,我检查了从Excel for Mac保存的电子表格的XML。xlsx文档只是一个zip文件。我在我的文件中找到了这些文件:</p>
<pre><code>docProps/app.xml
docProps/core.xml
xl/theme/theme1.xml
xl/worksheets/sheet1.xml
xl/styles.xml
_rels/.rels
xl/workbook.xml
xl/_rels/workbook.xml.rels
[Content_Types].xml
</code></pre>
<p>我打开“xl/worksheets/sheet1.xml”文件,查看原始xml,查找在保存之前正确显示的公式。我在相关单元格中找到了:</p>
<pre><code><f ca="1">_xlfn.DAYS(C2,TODAY())</f>
</code></pre>
<p>在<a href="https://openpyxl.readthedocs.io/en/stable/usage.html#using-formulae" rel="nofollow noreferrer">openpyxl docs</a>中提到了“xlfn.”的用法</p>
<p>因此,对于openpyxl,我使用以下代码在新创建的工作簿中正确输入所需公式:</p>
<pre><code>#!/usr/bin/env python3
import openpyxl
import csv
import os
fileCSV = os.path.expanduser('~/doc/SSL_Cert_Expiry.csv')
fileXLSX = os.path.expanduser('~/doc/SSL_Cert_Expiry.xlsx')
print(f'Using\n\tCSV {fileCSV}\n\tXLSX {fileXLSX}')
wb = openpyxl.Workbook()
ws = wb.active
with open(fileCSV, newline='') as fIn:
sslReader = csv.reader(fIn, delimiter=',')
for idx, row in enumerate(sslReader):
row.append(f'=_xlfn.DAYS(C{idx + 1},TODAY())')
ws.append(row)
wb.save(fileXLSX)
</code></pre>
<p>我在Excel for Mac中打开了它,我的公式显示正确,而不是可怕的#名字</p>
<p>注:我原以为必须为我的公式单元格设置“ca”属性,但最终没有必要。这可以用eg来完成</p>
<pre><code>ws.formula_attributes['D2'] = {'ca': '1'}
</code></pre>
<p>不显示数组公式的单元格不需要“ref”属性。这可以从<a href="https://docs.microsoft.com/en-gb/dotnet/api/documentformat.openxml.spreadsheet.cellformula?view=openxml-2.8.1" rel="nofollow noreferrer">this page</a>及其邻国那里得到</p>