Excel XML-File mit TXMLDocument erzeugen



  • Hallo zusammen

    Ich möchte ein TStringGrid als XML Datei speichern, und diese später mit Excel weiterverarbeiten.
    Nun hab ich mal eine leere Exceltabell als XML-Tabelle abgespeichert, und will dieses XML File nun nachprogrammieren. Habe allerdings noch nicht viel Ahnung von XML.

    Das erste Problem ist schon mal, wie erstelle ich diese Zeile?

    <?mso-application progid="Excel.Sheet"?>
    

    Hier ein Ausschnitt aus meiner Funktion:

    XML->DocumentElement = XML->CreateElement(L"Workbook", "urn:schemas-microsoft-com:office:spreadsheet");
    
                    _di_IXMLNode DocumentProperties = XML->DocumentElement->AddChild(L"DocumentProperties", "urn:schemas-microsoft-com:office:office");
                            _di_IXMLNode Author = XML->CreateElement(L"Author", L"");
                            Author->NodeValue = WideString("Author");
                            DocumentProperties->ChildNodes->Add(Author);
    

    Kann mir jemand mal erklären, wofür das L vor den Anführungszeichen steht?

    Und hier der entsprechende XML Ausschnitt:

    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
      <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
        <Author xmlns="">Author</Author>
        <LastAuthor xmlns="">Last Author</LastAuthor>
    

    Allerdings möchte ich, daß der XML Ausschnitt so aussieht:

    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
     xmlns:o="urn:schemas-microsoft-com:office:office"
     xmlns:x="urn:schemas-microsoft-com:office:excel"
     xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
     xmlns:html="http://www.w3.org/TR/REC-html40">
     <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
      <Author>Author</Author>
    

    Der Unterschied, liegt darin, daß bei Author kein xmlns="" angegebene werden darf. Ich habe allerdings keinen Plan wie ich das ändern soll.
    Ich hoffe es kann mir jemand helfen.

    MfG Stephan



  • Hallo zusammen

    Kennt sich den keiner so richtig mit der XML-Komponente aus?
    Bin leider bisher nicht weiter gekommen.

    MfG Stephan



  • Stephan schrieb:

    Habe allerdings noch nicht viel Ahnung von XML.

    Ob dann das nicht ein etwas großer Brocken ist?

    Stephan schrieb:

    Das erste Problem ist schon mal, wie erstelle ich diese Zeile?

    <?mso-application progid="Excel.Sheet"?>
    

    Wenn's gar nicht anders geht, dann kannst Du immer noch die Eigenschaft XML(TStrings*)
    direkt bearbeiten und die Zeile einfach einfügen.

    Stephan schrieb:

    Kann mir jemand mal erklären, wofür das L vor den Anführungszeichen steht?

    Ja, ich könnte mir vorstellen, dass es Leute gibt, die Dir das erklären können. 😉
    Ich persönlich glaube, das L dient der Unterscheidung zwischen DOMString und WideChar (o.ä.).
    Hast Du mal ausprobiert, was passiert, wenn Du das L weglässt?

    Um den leeren Namespace wegzubekommen, könntest Du einfach mal anstatt CreateElement()
    AddChild() verwenden. Die Funktion gibt's nämlich auch mit nur einem Parameter.

    Gruß,

    Alexander



  • Hallo zusammen

    @Alexander Kempf
    Vielen Dank erstmal für deine Antwort.
    Also der Tipp mit dem AddChild() war gut. Habe das NS Problem damit lösen können.
    Zu dem L, ob ich es einfüge oder nicht macht soweit ich sehe keinen Unterschied in der erstellten XML Datei.
    Habe allerdings dies für L im MSDN gefunden, könnte hier eventuell passen:

    L
    locale
    Indicates language information. For example, a Web server may have a locale variable that indicates the default language used on that server. A server in Los Angeles will probably have a locale of EN-US (U.S. English), whereas a server in Berlin might have a locale of DE (German or Deutsch). Web browsers can also specify locale to indicate the language comprehensible to the user of that browser. In addition, documents and Web pages can specify a locale to indicate the language in which the text is written.

    Bei "meiner" speziellen Zeile bin ich allerdings mit der Eigenschaft XML(TStrings*) nicht weitergekommen. Sollte doch eigentlich so gehen:

    XML->XML->Add("<?mso-application progid=\"Excel.Sheet\"?>");
    

    Wobei das erste XML mein TXMLDocument ist. In der darauffolgenden Zeile bekomme ich immer eine EAccessViolation, unabhängig was darin steht.

    MfG Stephan



  • Stephan schrieb:

    Habe allerdings dies für L im MSDN gefunden, könnte hier eventuell passen:

    Das ist was ganz anderes und bezieht sich auf locale. Das sind Spracheinstellungen z.B. innerhalb
    Windows. Wie in dem Abschnitt beschrieben steht EN für Englisch DE für Deutsch usw. Außerdem
    gibt es dann noch regionsabhängige Codes z.B. US (in Verbindung mit EN) für amerikanisches
    Englisch.

    Ich habe das mal eben schnell ausprobiert und zumindest bei der Verwendung von Insert() wird alles
    was vorher in der XML-Stringliste stand gelöscht. Eine Möglichkeit ist eine interne (temporäre)
    Stringliste anzulegen, den kompletten Inhalt hineinzukopieren und anschließend wieder dem XML-
    Dokument zuzuweisen:

    TStrings* xmlTemp = new TStringList();
    xmlTemp->Assign(xmlDoc->XML);
    xmlTemp->Insert(0, "<?mso-application progid=\"Excel.Sheet\"?>");
    xmlDoc->XML->Assign(xmlTemp);
    

    So richtig toll gefällt mir das aber nicht.

    Du kannst natürlich auch mal danach suchen, wie man IDOMDocument verwendet. Das ist die Schnittstelle,
    die hinter der Eigenschaft DOMDocument steckt.

    Gruß,

    Alexander



  • Hallo zusammen

    @Alexander Kempf
    Vielen dank nochmals für deine Mühe.
    Nach längerem Suchen im Netz bin ich jetzt auf die richtige Lösung gekommen:

    _di_IXMLNode Node = XML->CreateNode("mso-application", ntProcessingInstr, "progid=\"Excel.Sheet\"");
                    XML->ChildNodes->Add(Node);
    

    Nun haben sich alle Probleme für meine Vorlage gelöst, und jetzt kommt erst die eigentlich arbeit, die ganzen Einträge für die Zellen zu erstellen.
    Ich werde berichten, wenn ich es geschafft habe, jedoch ich denke, dass sich hierbei auch noch ein paar Problemchen ergeben werden.

    MfG Stephan


Anmelden zum Antworten