我正在尝试创建一个基于模板导出XLSX文件的函数。我目前解压缩模板文件,遍历查找工作表的所有XML文件,然后对相应的字符串进行全局查找和替换 - placeholder_1
,placeholder_2
等等。
这确实有效,但当您使用placeholder_1
等保存Excel文件时,它会将这些单元格标记为文本单元格,因此在输出中会出现“存储为字符串错误的数字”的加载。一种可能的解决方案是将它们保存为数字 - 100001
,100002
等。但这不是很好。
另一个选择是这样做然后进入工作表XML并用10000
替换placeholder_
所以我有“存储为数字的字符串”这就是我想要的。但这意味着您无法在Excel中轻松编辑模板。
那么有没有人知道在XLSX文件中存储普通数字单元格的方法,该文件实际上包含文本而不是数字?
(是的,我知道这有点hacky。如果我有更多的时间,我会做一个正确的XML解析器和一切,但我没有。)
答案 0 :(得分:3)
在与工作表对应的XML文件中, 一个单元格是这样的实体:
<c r="A2" t="n">
<v>18.999</v>
</v>
r
是工作表中单元格的地址。t
类型(n = numeric,s = string,b = boolean),'n'是默认值.. <v>
包含数字或布尔值的无格式值。
但是,如果是字符串,<v>
包含存储在文件“xl / sharedStrings.xml”中的字符串的索引值。所以你的问题是要替换如下组合:
文件“xl / worksheets / sheet1.xml”:
<c r="A2" t="s">
<v>29</v>
</c>
文件“xl / sharedStrings.xml”:
<sst>
...
<si><t>placeholder_1</t></si> // 29th entity
...
</sst>
with:
文件“xl / worksheets / sheet1.xml”:
<c r="A2" t="n">
<v>100001</v>
</c>
因此,为了更改占位符和单元格类型,您必须:
"sharedStrings.xml"
中搜索实体<si>
的索引,其中放置了占位符("sharedStrings.xml"
中的索引值不明确。)"sheet1.xml"
中搜索包含此索引的<v>
实体。<v>
实体的值替换为未格式化的数值。<c>
实体的属性替换为"n"
(或删除属性t="s"
)。好消息是:
"xl/sharedStrings.xml"
中保留未使用的共享字符串,这不会出错。placeholder_1
的单元格中应用数字格式。当您更改单元格类型时,将保留此数字格式并应用于该数字。如果您有兴趣使用PHP,那么有一个很好的库调用OpenTBS,它提供了替换Excel工作表中的文本占位符的功能,并在需要时更改单元格类型。 OpenTBS是TinyButStrong模板引擎的插件,用于与Ms Office和LibreOffice合作。