1

テンプレートに基づいて XLSX ファイルをエクスポートする関数を作成しようとしています。現在、テンプレート ファイルを解凍し、ワークシートを探してすべての XML ファイルを調べてから、適切な文字列に対してグローバルな検索と置換を実行します -placeholder_1などplaceholder_2

これは機能しますが、Excelファイルをplaceholder_1などで保存すると、それらのセルがテキストセルとしてマークされるため、出力に「文字列エラーとして保存された数値」が大量に表示されます。100001考えられる解決策の 1 つは、それらを数字として保存すること100002です。

別のオプションは、それを実行してからワークシート XML に移動し、 「数値として格納された文字列」を10000置き換えることです。placeholder_ただし、これは、Excel でテンプレートを簡単に編集できないことを意味します。

では、数値ではなく実際にテキストを含む XLSX ファイルに通常の数値セルを格納する方法を知っている人はいますか?

(はい、これは多少ハックであることは承知しています。もっと時間があれば、適切な XML パーサーなどすべてを実行したいのですが、実行していません。)

4

1 に答える 1

3

ワークシートに対応する XML ファイルでは、セルは次のようなエンティティです。

<c r="A2" t="n">
    <v>18.999</v>
</v>
  • 属性rは、ワークシート内のセルのアドレスです。
  • セルに格納される値の属性tタイプ (n = 数値、s = 文字列、b = ブール値)。「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 を使用したい場合は、Excel ワークシートのテキスト プレースホルダーを置き換え、必要に応じてセル タイプを変更する機能を提供するOpenTBSという優れたライブラリ呼び出しがあります。OpenTBS は、Ms Office および LibreOffice を操作するための TinyButStrong テンプレート エンジンのプラグインです。

于 2013-09-18T13:28:39.017 に答える