我正在自动化Excel报表的批量创建过程。Excel文件用作报告模板,^SOME_DATA^
等占位符通过Python脚本进行替换,该脚本解压缩.XLSX文件,在sharedStrings.xml
和sheet1.xml
文件中执行基本查找和替换,然后重新压缩完成的文件。这部分(终于)起作用了。
然而,在Excel中打开新文件时,替换占位符的数字都会被Excel标记为"以文本形式存储的数字"(当然,这会导致工作表中的公式和格式设置都失败)。大多数占位符都是由Excel存储在sharedStrings.xml
中的,考虑到其中的"字符串"部分,我并不惊讶它们仍然被视为字符串。
到目前为止。。。
-
我尝试用
=VALUE(A1)
(等)进行强制转换,将文本数字转换为实际数字。。。这以交互方式工作,但在以编程方式创建文件时失败:公式单元格显示为#VALUE!
(弹出菜单:"Error in Value"),除非您编辑它并点击回车键。 -
我更喜欢Python,因为它适合其他自动化,但可以在VBA中重做查找/替换/保存代码,以在自动化程度较低的状态下"将其推出"。不过,就我个人而言,VBA解决方案的可靠性/健壮性并不是很好。
-
openpyxl
(相当)适用于读取或写入Excel,但似乎不支持对现有格式化文件进行编辑。
我不是Open XML方面的专家,但我相信您可以通过将数值直接写入工作表的XML文件(sheet1.XML)来解决这个问题。您首先必须搜索工作表的XML文件才能找到包含字符串的单元格。这些单元格具有t="s"属性。v节点的值是sharedStrings.xml文件中被引用字符串的索引。
<row r="8" spans="1:6" x14ac:dyDescent="0.25">
<c r="F8" t="s">
<v>2</v>
</c>
</row>
您可以检查单元格是否引用占位符字符串(sharedStrings.xml中^SOME_DATA^的索引)。如果引用了占位符字符串,则可以用数值替换字符串索引,并删除t属性:
<c r="F8" t="s">
<v>2</v>
</c>
成为
<c r="F8">
<v>812397568</v>
</c>
我希望这能有所帮助。
正确的构造可能是:
<c ... t="inlineStr"><is>Inline text</is>
这个…
<c ... t="str">Inline text</c>
…用于公式。
请参阅"Office Open XML中的<c t="str>和<c><is>之间的区别是什么?"。
例如,这里有一个由Excel创建的共享字符串条目:
<!-- Value 0 refers to a string in sharedStrings table -->
<c r="A1" t="s">
<v>0</v>
</c>
将其替换为内联字符串:
<!-- Replace the type with str for an inlined string -->
<c r="A1" t="str">
<v>Some new text here</v>
</c>
或者一个数字:
<!-- Drop the t type for numbers -->
<c r="A1">
<v>12345</v>
</c>
有关详细信息,请参阅在OpenXMLDeveloper生成电子表格时编写更简单的电子表格ML。
请注意,严格来说,这不是一个内联字符串,因为它在标准中有特定的含义,是不同的t
类型,结构稍微复杂一些。这个字符串t ="str"
实际上是一个公式的字符串部分。然而,这是一个方便的变通方法。