2

セルに関連付けることができるメタデータの Excel の処理が壊れているようですが、他の誰かが (成功したかどうかにかかわらず) この機能を使用しようとしたかどうかを知りたいです。

Excel に対してバグを報告する方法がないように思われるため、問題を再現するためのコードを含む問題の完全な説明をここに投稿しました: http://social.technet.microsoft.com/Forums/en-US /excel/thread/c7f9747a-1d03-4415-97d4-d9aa58b4d240しかし、重要な詳細を繰り返します。

要するに、Excel が削除し、プログラムでセルに関連付けたメタデータを誤って再インデックスしているようです。

まず、仕様の関連部分の要約:

OOXML 18.9 以降: メタデータには、「セル メタデータ」と「値メタデータ」の 2 種類があります。

セルのメタデータは、セルの移動に追従します。値のメタデータは、式などを通じて値に従います。

OOXML 18.3.1.4 から: c (セル) 要素には cm 属性と vm 属性があり、どちらも「[セル|値] メタデータのゼロベースのインデックス... メタデータ部分」として文書化されています。

OOXML 18.9.17 より: valueMetadata は、「特定のセルの値のメタデータをそれぞれ定義するブロック要素のコレクション」です。「ブック内のセルは、このコレクションにインデックス付けされています」。

valueMetadata には bk 要素が含まれており、これらの要素には rc (メタデータ レコード) 要素が含まれています

OOXML 18.9.15 以降: rc 要素には t (型インデックス) および v (値インデックス) 属性があります。t は、metadataTypes への 1 から始まるインデックスであり、v は、メタデータ型の名前と一致する futureMetadata 要素への 0 から始まるインデックスです。

以下に例を示します。

...
<c vm="0">  <!-- vm points to the first bk inside valueMetadata below -->
...
<x:valueMetadata>
  <x:bk>
    <x:rc t="1" v="0" />  <!-- t points to the first metadataType below. v points to the first bk in the futureMetadata below (whose name matches the metadataType to which t points) -->
  </x:bk>
</x:valueMetadata>
...
<x:metadataTypes>
  <x:metadataType name="MyMetaType" ... />  <!-- name dictates which futureMetadata valueMetadata's v attribute indexes into -->
</x:metadataTypes>
...
<x:futureMetadata name="MyMetaType" ...>
  <x:bk>
    <x:extLst>
      <x:ext xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" uri="http://example.com/extension" p5:value="test value" xmlns:p5="http://example.com/extension" />
    </x:extLst>
  </x:bk>
</x:futureMetadata>
...

問題

私が知る限り、n > 2 の値の場合、n 個のセルをメタデータに関連付けると、Excel はメタデータの最後の部分とインデックス 1 の部分を削除し、黙って削除します。その場合、インデックスは 0..n-3 になり、最初 (0 インデックス) 以外のすべての関連付けは間違ったものになります。これにより、将来のメタデータがまったく役に立たなくなります。

n == 1 の場合、Excel はメタデータの最後の部分 (インデックス 1) を削除するだけです。c 要素の vm 属性に 1 から始まるインデックスを試すと、異なる動作が得られます。これは仕様に反しているため関係ないかもしれませんが、動作がわずかに改善されている場合は、off-by-one エラーを示している可能性があります。

n    Deleted Indices (0-based)     Deleted Indices (0-based) 
     when using 0-based indices    when using 1-based indices
1    0                             None
2    1                             1
3    1,2                           1
4    1,3                           1
5    1,4                           1
6    1,5                           1
4

1 に答える 1

1

ここからの適切な回避策。

パーティーには少し遅れましたが、OpenXML を使い始めたのはつい最近のことです。最も簡単な修正は、メタデータを避け、拡張リストのみを使用することです。これらは、セル レベルでカスタマイズして適用できます。

したがって、メタデータ部分をいじる代わりに、これを記述して問題を回避できます。

<c>
  <extLst>
    <ext uri="http://example.com/extension" p5:value="test value" xmlns:p5="http://example.com/extension">
      <p5:anotherValue>127</p:anotherValue>
    </ext>
  </extLst>
</c>
于 2016-01-06T11:02:21.247 に答える