在Excel中将文本存储为数字

我试图做一个函数,导出基于模板的XLSX文件。 我目前解压缩模板文件,浏览所有查找工作表的XML文件,然后对相应的string( placeholder_1placeholder_2等)进行全局查找和replace。

这可以,但是当您使用placeholder_1保存Excel文件时,它会将这些单元格标记为文本单元格,因此在输出中会出现“数字存储为string错误”的负载。 一个可能的解决scheme是将它们保存为数字 – 100001等,但这不是很好。

另一个select是做到这一点,然后进入工作表的XML,并用placeholder_replace10000 ,所以我有“string存储为数字”,这是我想要的。 但是这意味着您不能在Excel中轻松编辑模板。

那么有没有人知道在一个XLSX文件中存储一个正常数字单元格的方法,该文件实际上包含文本而不是数字?

(是的,我知道这有点不好意思,如果我有更多的时间,我会做一个适当的XMLparsing器和一切,但我没有。)

在与工作表相对应的XML文件中,单元格就是这样一个实体:

 <cr="A2" t="n"> <v>18.999</v> </v> 
  • Attribut r是工作表中单元格的地址。
  • 单元格存储的值的属性types(n = numeric,s = string,b = boolean),'n'是默认值。
  • 在数字或布尔值的情况下,实体<v>包含未格式化的值。 但是,对于string, <v>包含存储在文件“xl / sharedStrings.xml”中的string的索引值。

所以你的问题是要取代一个组合,如:

文件“xl / worksheets / sheet1.xml”:

 <cr="A2" t="s"> <v>29</v> </c> 

文件“xl / sharedStrings.xml”:

 <sst> ... <si><t>placeholder_1</t></si> // 29th entity ... </sst> 

与:

文件“xl / worksheets / sheet1.xml”:

 <cr="A2" t="n"> <v>100001</v> </c> 

所以为了改变占位符和单元格types,你必须:

  1. "sharedStrings.xml"search实体<si>的索引,放置占位符的位置(索引的值在"sharedStrings.xml"不明确)。
  2. "sheet1.xml"search包含此索引的<v>实体。
  3. 将此<v>实体的值replace为未格式化的数值。
  4. 将其父<c>实体的属性replace为"n" (或删除属性t="s" )。

好消息是:

  • 您可以在"xl/sharedStrings.xml"保留未使用的共享string,这不会产生错误。
  • 您可以将数字格式应用于您的单元格,同时包含string值placeholder_1 。 这个数字格式将被保留并应用到您更改单元格types的编号上。

如果您有兴趣使用PHP,那么有一个很好的库调用OpenTBS ,它提供了在Excel工作表中replace文本占位符的function,并根据需要更改单元types。 OpenTBS是TinyButStrong模板引擎的插件,用于处理Ms和LibreOffice。