Excel XLSX XML操作:直接修改XLSX内容时,避免“存储为文本的数字”和非计算公式?

时间:2012-04-03 17:41:03

标签: python excel xlsx

我正在自动执行Excel报表批量创建过程。 Excel文件用作报告模板,^SOME_DATA^等占位符通过Python脚本替换,该脚本解压缩.XLSX文件,执行基本查找并替换sharedStrings.xmlsheet1.xml文件,以及然后重新拉链完成的文件。这部分工作(最后)。

但是,在Excel中打开新文件时,替换占位符的数字全部被Excel标记为“存储为文本的数字”(当然,这会导致工作表中的公式和格式都失败)。大多数占位符都是由Excel存储在sharedStrings.xml中,并且给出了“字符串”部分,我并不感到惊讶,它们仍被视为字符串。

到目前为止......

  • 我尝试使用=VALUE(A1)(等)进行转换以将文本编号转换为实际数字...这可以交互方式工作,但在以编程方式创建文件时失败:公式单元格显示为{ {1}}(弹出:“值中的错误”)除非您编辑它并按Enter键。

  • 我更喜欢Python,因为它适合其他自动化,但可以重做VBA中的查找/替换/保存代码,以便在一个不太自动化的状态下“把它拿出门外”。然而,就个人而言,我对VBA解决方案的可靠性和稳健性并不感兴趣。

  • #VALUE!(合理地)适用于阅读或编写Excel,但似乎不支持对现有格式化文件进行编辑。

3 个答案:

答案 0 :(得分:1)

我不是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>

我希望这会有所帮助。

答案 1 :(得分:1)

正确的构造可能是这样的:

<c ... t="inlineStr"><is>Inline text</is>

这......

<c ... t="str">Inline text</c>

... 用于公式。

请参阅“What's the difference between <c t="str"> and <c><is> in Office Open XML?”。

答案 2 :(得分:0)

模板化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>

有关详细信息,请参阅OpenXML Developer的Write Simpler SpreadsheetML when Generating Spreadsheets

请注意,严格来说,这不是内联字符串,因为它在标准中具有特定含义,不同的t类型和稍微复杂的结构。此字符串t ="str"实际上是公式的字符串部分。但是,这是一个方便的解决方法。