セルに関連付けることができるメタデータの 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