OpenXml-Tabelle Fehler "<p> - Elemente sind erforderlich, vor jeder </tk - >"

Habe ich eine Word Vorlage, die ich dann Abwicklung über das OpenXML SDK zu ersetzen einige der Inhalte des Dokuments mit Daten aus einer Datenbank-Abfrage.

Die Vorlage besteht aus einigen einfachen text mit nur-Text-Inhaltssteuerelemente injiziert, die in die Orte, die möchte ich ersetzen Sie den text. Ich bin dann mit dem text in dieser Steuerelemente wie ein Schlüssel zum suchen der Ersatz-Werte. In den meisten Fällen, dies ist in Ordnung (ich habe einfach aktualisieren Sie die Text-Eigenschaft des Text-Objekt).

In einem Fall bin ich dem ersetzen des Textes mit einer Tabelle. In diesem Fall erstelle ich eine Tabelle in der code und ich dann ersetzen Sie den Inhalt der SdtContentRun Objekt (das parent-Objekt Ausführen, die wiederum das übergeordnete Element der Text-Objekt) mit dem neuen Table-Objekt...

var sdtContentRunElements =
  from sdtContentRun in this.Document.MainDocumentPart.RootElement.Descendants<SdtContentRun>()
  select sdtContentRun;

sdtContentRunElements.ForEach(sdtContentRunElement => {

  Run firstRunElement = sdtContentRunElement.Descendants<Run>().FirstOrDefault();
  if (firstRunElement != null) {

    Text firstTextElement = firstRunElement.Descendants<Text>().FirstOrDefault();
    if (firstTextElement != null) {

      switch (firstTextElement.Text) {

        case TableBookmark:

          Table advisoryTable = new Table(...); //See below
          OpenXmlElement parent = firstRunElement.Parent;
          parent.RemoveAllChildren();
          parent.Append(advisoryTable);
          break;

        case ContractorItemAdvisoriesLetter.ContractorCodeBookmark:

          firstTextElement.Text = @"New text";
          break;

      }
    }
  }
}

}

Diese Ergebnisse in der folgenden XML-Code (entnommen aus dem Open XML SDK 2.0 Productivity Tool for Microsoft Office)...

<w:sdtContent xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tbl>
    <w:tr>
      <w:tc>
        <w:p>
          <w:r>
            <w:t>Lorem ipsum dolor sit amet</w:t>
          </w:r>
        </w:p>
      </w:tc>
    </w:tr>
  </w:tbl>
</w:sdtContent>

(Einige der Inhalt der Tabelle wurde entfernt, als ich spürte, wie wäre es einfach cloud das Problem)

Wenn ich dann versuchen, das Dokument in Word öffnen, bekomme ich eine Fehlermeldung. Die Fehlermeldung ist...

Ambuguous Zelle-Zuordnung festgestellt. Mögliche fehlende Absatz
element. <p> - Elemente sind erforderlich, vor jeder </tk - >

Es ist wohl erwähnenswert, dass, wenn ich die Dokument-explorer im Open XML SDK 2.0 Productivity Tool for Microsoft Office, die w:tbl-element (und alle darin enthaltenen Elementen) anerkannt als OpenXmlUnknownElement eher als seiend anerkannt als Table Objekte. Ich weiß nicht, ob dies relevant ist oder ob es eine Eigenart der SDK-tool.

Klar bin ich etwas fehlt. So weit wie ich kann sagen, von den Table class definition, es ist völlig legal, place w:tbl innerhalb eines w:sdtContent (es sei denn, ich lese dies falsch) so ich bin jetzt an einem Verlust, was das problem sein kann. Es gibt auch sehr wenige Ergebnisse, wenn Sie google "Tabelle" und "OpenXmlUnknownElement" mit keiner der die Ergebnisse erscheinen in Bezug auf mein problem.

Irgendwelche Vorschläge?

EDIT: Weitere Untersuchung scheint zu zeigen, dass das problem tatsächlich liegt in der Einbettung der anderen Tabelle in den Zellen der Tabelle wird oben Hinzugefügt. Die neuen Table-Objekt Hinzugefügt wird, direkt an ein TableCell-Objekt, die wiederum, laut der Dokumentation für die Tabelle oben verwiesen wird, sollte akzeptabel sein...

Table advisoryTable = new Table();

advisories.ForEach(advisory => {

    advisoryTable.Append(new TableRow(new TableCell(new Paragraph(new Run(new Text(advisory.NoteText))))));

    advisory.ItemAdvisories.ForEach(itemAdvisory => {

        Item item = itemAdvisory.Item;

        Table itemTable = new Table();
        itemTable.Append(new TableRow[] {

            new TableRow(new TableCell[] {
                new TableCell(new Paragraph(new Run(new Text(string.Format(@"Item {0}", item.Sequence)))))
            })

        });

        advisoryTable.Append(new TableRow(new TableCell(itemTable)));

    });

});

Was in...

<w:tbl xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tr>
    <w:tc>
      <w:p>
        <w:r>
          <w:t>Lorem ipsum dolor sit amet</w:t>
        </w:r>
      </w:p>
    </w:tc>
  </w:tr>
  <w:tr>
    <w:tc>
      <w:tbl>
        <w:tr>
          <w:tc>
            <w:p>
              <w:r>
                <w:t>Item 1</w:t>
              </w:r>
            </w:p>
          </w:tc>
        </w:tr>
      </w:tbl>
    </w:tc>
  </w:tr>
</w:tbl>

Habe ich versucht, indem ein Absatz zwischen den TableCell und die eingebettete Tabelle, aber diese Ergebnisse einfach in einen neuen Fehler, diesmal "unbekannter Fehler".

Schreibe einen Kommentar