Excel XLSX XML 操作:在直接修改 XLSX 胆量时避免"number stored as text"和非计算公式?



我正在自动化Excel报表的批量创建过程。Excel文件用作报告模板,^SOME_DATA^等占位符通过Python脚本进行替换,该脚本解压缩.XLSX文件,在sharedStrings.xmlsheet1.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>之间的区别是什么?"。

模板化sharedStrings表的另一种方法是模板化单元格中的字符串/数字。

例如,这里有一个由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"实际上是一个公式的字符串部分。然而,这是一个方便的变通方法。

最新更新