Excel XLSX XML操作:直接修改XLSX直觉时避免“存储为文本的编号”和非计算公式?

我正在自动化一个Excel报表批创build过程。 Excel文件用作报告模板,像^SOME_DATA^这样的占位符通过解压缩.XLSX文件的Python脚本replace,在sharedStrings.xmlsheet1.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,因为它具有标准中的特定含义,不同的ttypes和稍微复杂的结构。 这个stringt ="str"实际上是公式的string部分。 但是,这是一个方便的解决方法。