将文本存储为Excel中的数字

时间:2013-09-16 10:50:34

标签: excel export xlsx

我正在尝试创建一个基于模板导出XLSX文件的函数。我目前解压缩模板文件,遍历查找工作表的所有XML文件,然后对相应的字符串进行全局查找和替换 - placeholder_1placeholder_2等等。

这确实有效,但当您使用placeholder_1等保存Excel文件时,它会将这些单元格标记为文本单元格,因此在输出中会出现“存储为字符串错误的数字”的加载。一种可能的解决方案是将它们保存为数字 - 100001100002等。但这不是很好。

另一个选择是这样做然后进入工作表XML并用10000替换placeholder_所以我有“存储为数字的字符串”这就是我想要的。但这意味着您无法在Excel中轻松编辑模板。

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

(是的,我知道这有点hacky。如果我有更多的时间,我会做一个正确的XML解析器和一切,但我没有。)

1 个答案:

答案 0 :(得分:3)

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

<c r="A2" t="n">
    <v>18.999</v>
</v>
  • Attribut 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>

因此,为了更改占位符和单元格类型,您必须:

  1. "sharedStrings.xml"中搜索实体<si>的索引,其中放置了占位符("sharedStrings.xml"中的索引值不明确。)
  2. "sheet1.xml"中搜索包含此索引的<v>实体。
  3. 将此<v>实体的值替换为未格式化的数值。
  4. 将其父<c>实体的属性替换为"n"(或删除属性t="s")。
  5. 好消息是:

    • 您可以在"xl/sharedStrings.xml"中保留未使用的共享字符串,这不会出错。
    • 您可以在包含字符串值placeholder_1的单元格中应用数字格式。当您更改单元格类型时,将保留此数字格式并应用于该数字。

    如果您有兴趣使用PHP,那么有一个很好的库调用OpenTBS,它提供了替换Excel工作表中的文本占位符的功能,并在需要时更改单元格类型。 OpenTBS是TinyButStrong模板引擎的插件,用于与Ms Office和LibreOffice合作。