我正在自动执行Excel报表批量创建过程。 Excel文件用作报告模板,^SOME_DATA^
等占位符通过Python脚本替换,该脚本解压缩.XLSX文件,执行基本查找并替换sharedStrings.xml
和sheet1.xml
文件,以及然后重新拉链完成的文件。这部分工作(最后)。
但是,在Excel中打开新文件时,替换占位符的数字全部被Excel标记为“存储为文本的数字”(当然,这会导致工作表中的公式和格式都失败)。大多数占位符都是由Excel存储在sharedStrings.xml
中,并且给出了“字符串”部分,我并不感到惊讶,它们仍被视为字符串。
到目前为止......
我尝试使用=VALUE(A1)
(等)进行转换以将文本编号转换为实际数字...这可以交互方式工作,但在以编程方式创建文件时失败:公式单元格显示为{ {1}}(弹出:“值中的错误”)除非您编辑它并按Enter键。
我更喜欢Python,因为它适合其他自动化,但可以重做VBA中的查找/替换/保存代码,以便在一个不太自动化的状态下“把它拿出门外”。然而,就个人而言,我对VBA解决方案的可靠性和稳健性并不感兴趣。
#VALUE!
(合理地)适用于阅读或编写Excel,但似乎不支持对现有格式化文件进行编辑。
答案 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"
实际上是公式的字符串部分。但是,这是一个方便的解决方法。