2 Stimmen

Ist dies ein Fehler in der Handhabung von Office Open XML-Metadaten durch Excel?

Es scheint, dass Excel die Metadaten, die Sie mit Zellen verknüpfen können, nicht richtig handhabt, aber es würde mich interessieren, ob jemand anderes (erfolgreich oder nicht) versucht hat, diese Funktion zu nutzen.

Da es anscheinend keine Möglichkeit gibt, Fehler in Excel zu melden, habe ich hier eine vollständige Beschreibung des Problems mit Code zur Reproduktion des Problems veröffentlicht: http://social.technet.microsoft.com/Forums/en-US/excel/thread/c7f9747a-1d03-4415-97d4-d9aa58b4d240 aber ich werde die wichtigsten Details wiederholen.

Kurz gesagt, es scheint, dass Excel die Metadaten, die ich programmatisch mit den Zellen verknüpfe, entfernt und fälschlicherweise neu indiziert.

Zunächst eine Zusammenfassung der relevanten Teile der Spezifikation:

Aus OOXML 18.9: Es gibt zwei Arten von Metadaten: "Zell-Metadaten" und "Wert-Metadaten".

Die Metadaten der Zelle folgen der Zelle, während sie sich bewegt. Wert-Metadaten folgen dem Wert durch Formeln usw.

Aus OOXML 18.3.1.4: Das c (cell)-Element hat die Attribute cm und vm, die beide als "The zero-based index of the [cell|value] metadata...in the Metadata Part" dokumentiert sind.

Aus OOXML 18.9.17: Die valueMetadata sind "eine Sammlung von Blockelementen, die jeweils die Wertmetadaten für eine bestimmte Zelle definieren". "Zellen in der Arbeitsmappe indexieren in diese Sammlung".

valueMetadata enthält bk-Elemente, die ihrerseits rc-Elemente (Metadatensätze) enthalten

Aus OOXML 18.9.15: rc-Elemente haben die Attribute t (type index) und v (value index). t ist ein 1-basierter Index in metadataTypes und v ist ein 0-basierter Index in das futureMetadata-Element, das dem Namen des Metadatentyps entspricht.

Hier ist ein Beispiel dafür, wie das aussehen könnte:

...
<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>
...

Das Problem

Soweit ich weiß, lässt Excel bei Werten von n > 2, wenn Sie n Zellen mit Metadaten verknüpfen, das letzte Stück Metadaten und das bei Index 1 fallen, und zwar lautlos. Die Indizes sind dann 0..n-3, und die Zuordnung für alle außer dem ersten (Index 0) ist falsch. Dies macht die zukünftigen Metadaten völlig unbrauchbar.

Bei n == 1 entfernt Excel nur den letzten Teil der Metadaten (Index 1). Wenn wir 1-basierte Indizes für das vm-Attribut auf dem c-Element ausprobieren, erhalten wir ein anderes Verhalten. Dies ist vielleicht nicht relevant, da es der Spezifikation widerspricht, aber das etwas bessere Verhalten könnte auf einen Off-by-One-Fehler hinweisen:

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

1voto

whY Punkte 179

Ein geeigneter Workaround von aquí .

Ich bin ein bisschen spät dran, aber ich habe erst vor kurzem angefangen, OpenXML zu benutzen. Die einfachste Lösung ist, Metadaten zu vermeiden und nur Erweiterungslisten zu verwenden. Sie können angepasst und auf Zellebene angewendet werden.

Anstatt sich also mit dem Metadatenteil herumzuschlagen, können Sie einfach dies schreiben, um das von Ihnen erwähnte Problem zu vermeiden:

<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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X