在Excel中将文本存储为数字
我试图做一个函数,导出基于模板的XLSX文件。 我目前解压缩模板文件,浏览所有查找工作表的XML文件,然后对相应的string( placeholder_1
, placeholder_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,你必须:
- 在
"sharedStrings.xml"
search实体<si>
的索引,放置占位符的位置(索引的值在"sharedStrings.xml"
不明确)。 - 在
"sheet1.xml"
search包含此索引的<v>
实体。 - 将此
<v>
实体的值replace为未格式化的数值。 - 将其父
<c>
实体的属性replace为"n"
(或删除属性t="s"
)。
好消息是:
- 您可以在
"xl/sharedStrings.xml"
保留未使用的共享string,这不会产生错误。 - 您可以将数字格式应用于您的单元格,同时包含string值
placeholder_1
。 这个数字格式将被保留并应用到您更改单元格types的编号上。
如果您有兴趣使用PHP,那么有一个很好的库调用OpenTBS ,它提供了在Excel工作表中replace文本占位符的function,并根据需要更改单元types。 OpenTBS是TinyButStrong模板引擎的插件,用于处理Ms和LibreOffice。