Excel XLSX XML操作:直接修改XLSX直觉时避免“存储为文本的编号”和非计算公式?
我正在自动化一个Excel报表批创build过程。 Excel文件用作报告模板,像^SOME_DATA^
这样的占位符通过解压缩.XLSX文件的Python脚本replace,在sharedStrings.xml
和sheet1.xml
文件中执行基本查找和replace,然后重新压缩完成的文件。 这部分工作(最后)。
然而,在Excel中打开新文件时,replace占位符的数字都被Excel标记为“Number Stored As Text”(当然,这会导致公式和格式在工作表中失败)。 大部分的占位符都是通过Excel存储在sharedStrings.xml
,给出了“string”部分,我并不感到惊讶,他们仍然被视为string。
至今…
-
我试着用
=VALUE(A1)
(等)转换文本数字转换为实际数字…这交互工作,但失败时编程创build文件:公式单元格显示为#VALUE!
(popup:“错误的价值”),除非你编辑它,并回车。 -
我更喜欢Python,因为它适合于其他的自动化,但可以重新发现VBA中的查找/replace/保存代码,以“自动化程度较低的状态”将其“解决”。 然而,我个人对VBA解决scheme的可靠性/稳健性还没有多less好感。
-
openpyxl
可以(合理地)适用于读取或写入Excel,但似乎不支持对现有的格式化文件进行编辑。
我不是Open XML专家,但我相信你可以通过直接写入数值到工作表的XML文件(sheet1.xml)来解决这个问题。 您将首先search工作表的xml文件以查找包含string的单元格。 那些单元格有at =“s”属性。 v节点的值是sharedStrings.xml文件中引用string的索引。
<row r="8" spans="1:6" x14ac:dyDescent="0.25"> <cr="F8" t="s"> <v>2</v> </c> </row>
您可以检查单元格是否引用占位符string(sharedStrings.xml中的^ SOME_DATA ^的索引)。 如果是这样,那么你可以用一个数字值replacestring索引,并删除t属性:
<cr="F8" t="s"> <v>2</v> </c>
变
<cr="F8"> <v>812397568</v> </c>
我希望这有帮助。
正确的构造可能是这样的:
<c ... t="inlineStr"><is>Inline text</is>
这个 …
<c ... t="str">Inline text</c>
…是为公式。
请参阅“ Office Open XML中<ct =”str“>和<c> <is>之间的区别? ”。
模板化sharedStrings表的另一种方法是模板单元格中的string/数字本身。
例如,这是由Excel创build的共享string条目:
<!-- Value 0 refers to a string in sharedStrings table --> <cr="A1" t="s"> <v>0</v> </c>
将其replace为内联string:
<!-- Replace the type with str for an inlined string --> <cr="A1" t="str"> <v>Some new text here</v> </c>
或者一个数字:
<!-- Drop the t type for numbers --> <cr="A1"> <v>12345</v> </c>
欲了解更多详细信息,请参阅在OpenXML Developer 生成电子表格时编写更简单的SpreadsheetML 。
请注意,严格地说,这不是一个内联string,因为它具有标准中的特定含义,不同的t
types和稍微复杂的结构。 这个stringt ="str"
实际上是公式的string部分。 但是,这是一个方便的解决方法。