1

我正在尝试制作一个基于模板导出 XLSX 文件的函数。我目前解压缩模板文件,浏览所有 XML 文件以查找工作表,然后在适当的字符串上执行全局查找和替换 -placeholder_1等等placeholder_2

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

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

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

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

4

1 回答 1

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>

和 :

文件“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")。

好消息是:

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

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

于 2013-09-18T13:28:39.017 回答