这是Excel处理Office Open XML元数据的错误吗?

看来Excel处理的元数据可以与单元格相关联,但是我有兴趣知道是否有其他人尝试过(成功地或以其他方式)使用这个特性。

由于似乎没有办法将错误报告给Excel,所以我已经发布了有关代码的完整描述,以便在此处进行重现: http : //social.technet.microsoft.com/Forums/en-US / excel / thread / c7f9747a-1d03-4415-97d4-d9aa58b4d240但我会重复一下重要的细节。

总之,似乎Excel正在删除,并不正确地重新索引元数据编程方式与细胞关联。

首先,规范的相关部分的总结:

从OOXML 18.9:有两种types的元数据:“单元元数据”和“值元数据”。

单元格元数据在单元格移动之后。 价值元数据通过公式等遵循价值

从OOXML 18.3.1.4开始:c(cell)元素具有cm和vm属性,这两个属性都被logging为“元数据部分”中元数据元数据的从零开始的索引…“

从OOXML 18.9.17开始:valueMetadata是“每个定义特定单元格的值元数据的块元素的集合”。 “工作簿索引中的单元格放入此集合”。

valueMetadata包含bk元素,该元素又包含rc(元数据logging)元素

从OOXML 18.9.15开始:rc元素具有t(types索引)和v(值索引)属性。 t是元数据types的基于1的索引,v是匹配元数据types名称的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的索引,我们会得到不同的行为。 这可能不是相关的,因为它违背了规范,但稍微好一点的行为可能表明一个错误的错误:

 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 

从这里适合的解决方法。

比赛晚了,但最近才开始使用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>