Generieren Sie eine Arbeitsmappe in Delphi, versehen Sie eine Zelle über die klassische Kommentar-API mit Anmerkungen, und Excel 365 legt Ihren Text unter "Notizen" ab: ein gelbes Feld im alten Stil ohne Antwortfeld, ohne Autoren-Avatar und ohne "Erledigt"-Schaltfläche. HotXLS schreibt echte Excel 365-Thread-Kommentare über AddThreadedComment und AddThreadedReply in der XLSX-Engine, wobei der dedizierte Teil xl/threadedComments/threadedCommentN.xml pro Blatt ausgegeben und jeder Autor im workbook-weiten Personenteil registriert wird, sodass die von Ihrem Code erstellte Konversation dasselbe Objekt darstellt, auf das ein Reviewer in Excel antwortet
Der Unterschied ist wichtig, da die beiden Funktionen nur ähnlich aussehen. Eine Notiz ist ein schwebendes Textfeld; ein Thread-Kommentar ist ein Konversationsdatensatz mit stabilen Bezeichnern, einer Antwortstruktur, einem Autorenregister und einem "Erledigt"-Flag — also genau den Elementen, auf denen ein Review-Workflow tatsächlich basiert. Dieser Artikel führt Sie zunächst durch die OOXML-Struktur, denn sobald Sie die beiden Speichermodelle nebeneinander betrachten, verliert jeder Verhaltensunterschied in Excel seinen Schrecken
Warum werden meine Kommentare in Excel 365 als Notizen angezeigt?
Die kurze Antwort: Zwei Generationen von Kommentaren teilen sich dasselbe Raster, leben jedoch in völlig unterschiedlichen Teilen des Pakets. Das Legacy-Modell — auf das AddComment abzielt — speichert Text in xl/comments1.xml (Inhaltstyp application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml) und positioniert das Textfeld über einen zugehörige VML-Zeichnungsteil, xl/drawings/vmlDrawing1.vml. Dieses Paar stammt aus der Zeit vor der Einführung des Menübands (Ribbon). Excel 365 liest es zwar weiterhin zuverlässig, rendert das Ergebnis jedoch als "Notiz" und bietet keine Threading-Benutzeroberfläche dafür an, da im Speicher keine Threading-Informationen vorhanden sind. Der Autor ist eine Anzeigezeichenkette, die Position ist eine VML-Form — das ist das gesamte Modell
Thread-Kommentare, die mit Excel 365 eingeführt wurden, ignorieren die VML-Ebene vollständig. Jedes Blatt mit einer Konversation enthält seinen eigenen xl/threadedComments/threadedCommentN.xml-Teil unter dem Inhaltstyp application/vnd.openxmlformats-officedocument.spreadsheetml.threadedComments+xml, und die Arbeitsmappe enthält einen einzelnen xl/person/person.xml-Teil (Inhaltstyp ...spreadsheetml.people+xml), in dem jeder Teilnehmer einmal aufgelistet ist. HotXLS stellt beide Modelle auf demselben Arbeitsblatt bereit: AddComment schreibt weiterhin das Legacy-Paar, während AddThreadedComment die neuen Teile schreibt. Wenn Ihre Ausgabe als Notiz erscheint, haben Sie die erste API aufgerufen, obwohl Sie die zweite benötigt hätten. Das Legacy-Modell ist für bestimmte Aufgaben immer noch das richtige Werkzeug — der frühere Artikel über Zellkommentare und Hyperlinks in Review-Workflows behandelt dies ausführlich, einschließlich der XLS-Seite —, aber nichts darin lässt sich in einen Thread umwandeln
Was HotXLS in das Paket schreibt
HotXLS modelliert jede Antwort als ein TXLSXThreadedComment-Objekt, das eine Zellverankerung (Ref), einen Identifikator im GUID-Stil (Id), eine optionale ParentId, eine über die Personenliste aufgelöste AuthorId, ein DisplayName-Spiegelbild, den Textkörper, ein Done-Flag und ein ISO-8601-DateTime enthält. Beim Speichern wird jeder Eintrag zu einem <threadedComment>-Element, dessen t-Attribut den Identifikator enthält, dessen dT-Attribut den Zeitstempel trägt und dessen parentT-Attribut — das nur bei Antworten vorhanden ist — den Identifikator des übergeordneten Elements benennt. Excel rekonstruiert die Konversationsstruktur, indem es parentT mit t abgleicht; im XML gibt es keine Verschachtelung, sondern nur eine flache Liste plus Referenzen
Der Personenteil ist das Stück, das die meisten selbstgestrickten Implementierungen vergessen. Jede authorId in einem Thread-Kommentar muss sich auf einen <person>-Eintrag in xl/person/person.xml auflösen lassen, der in die Beziehungen der Arbeitsmappe eingebunden ist und über einen eigenen Inhaltstyp-Override verfügt — andernfalls kann Excel keinen Anzeigenamen darstellen. HotXLS übernimmt die Registrierung automatisch: AddThreadedComment sucht den Autor in der Liste Persons der Arbeitsmappe anhand des Anzeigenamens und erstellt einen Eintrag mit einer neuen GUID, falls noch keiner existiert, sodass aufeinanderfolgende Kommentare desselben Autors dieselbe Identität teilen. Die Arbeitsblattbeziehungen erhalten die Beziehung threadedComments, die Arbeitsmappenbeziehungen erhalten die Personenbeziehung und das Inhaltstyp-Manifest erhält beide Overrides, ohne dass davon etwas in Ihrem Code auftaucht
Erstellen einer Antwortkette mit AddThreadedComment und AddThreadedReply
AddThreadedComment erstellt die Wurzel der Konversation: Seine ParentId bleibt leer, was ihn als Anfang des Threads kennzeichnet. AddThreadedReply übernimmt einen Parameter ParentRef — den Zellbezug, an dem sich die Wurzel befindet —, sucht die Wurzel an dieser Verankerung und stempelt die ParentId der neuen Antwort mit der Id der Wurzel ab. Beide geben das neue Objekt TXLSXThreadedComment zurück, sodass Sie den Zeitstempel oder den Erledigt-Status direkt auf dem gerade erstellten Objekt festlegen können:
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Root: TXLSXThreadedComment;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('forecast.xlsx');
Sheet := Book.Sheets[0];
// Conversation root; ParentId stays empty
Root := Sheet.AddThreadedComment(8, 3,
'Q3 figure looks low against the pipeline export', 'Maria Ortiz');
Root.DateTime := '2026-07-06T09:12:00Z';
// Replies anchor at the same cell; ParentRef names the root cell
Sheet.AddThreadedReply(8, 3, Root.Ref,
'Pipeline export missed the EMEA renewals, re-running', 'Jan Kowalski');
Sheet.AddThreadedReply(8, 3, Root.Ref,
'Confirmed, refreshed figure lands tomorrow', 'Maria Ortiz');
Book.SaveAs('forecast-reviewed.xlsx');
finally
Book.Free;
end;
end;
Zwei Details in dieser Auflistung verdienen Aufmerksamkeit. Erstens wird Root.Ref übergeben und keine manuell erstellte Zeichenkette: Es ist garantiert, dass der von der Bibliothek generierte Bezug mit dem übereinstimmt, den AddThreadedReply abfragt, wodurch eine ganze Klasse von Verankerungsfehlern um eine Zelle daneben vermieden wird. Zweitens wurden beide Autoren als einfache Anzeigenamen übergeben — das Personenregister, die GUID-Identitäten und die Verdrahtung der authorId erfolgten alle im Hintergrund der Aufrufe. Öffnen Sie die gespeicherte Datei in Excel 365, und die Zellverankerung, die Reihenfolge der Antworten sowie die beiden unterschiedlichen Teilnehmer sind sofort einsatzbereit: Klicken Sie auf Antworten, und Excel hängt die Antwort an dasselbe Thread an, den Ihr Code gestartet hat
Auslesen einer Konversation: Round-Trip-Verhalten
HotXLS unterstützt den Round-Trip von Thread-Kommentaren ab Version 2.122.0: Das erneute Öffnen eines gespeicherten Pakets rekonstruiert die Konversationsliste jedes Blatts und die Teilnehmerliste der Arbeitsmappe aus den Teilen, sodass Identifikatoren, Antwortlinks und Anzeigenamen einen vollständigen Lese-Schreib-Zyklus überstehen. Der Reader analysiert person.xml vor jeglichem Blattinhalt, was es ermöglicht, dass sich jede authorId beim Laden in einen Anzeigenamen auflöst. Analysierte Personenidentifikatoren bleiben unverändert erhalten, anstatt neu generiert zu werden, sodass eine Arbeitsmappe, die zwischen Ihrem Code und Excel hin- und herpendelt, stabile Autorenidentitäten über beliebig viele Round-Trips hinweg beibehält
var
i: Integer;
Cmt: TXLSXThreadedComment;
begin
Book.Open('forecast-reviewed.xlsx');
Sheet := Book.Sheets[0];
for i := 0 to Sheet.ThreadedComments.Count - 1 do
begin
Cmt := Sheet.ThreadedComments[i];
if Cmt.ParentId = '' then
Writeln('Root at ', Cmt.Ref, ' by ', Cmt.DisplayName, ': ', Cmt.Text)
else
Writeln(' reply by ', Cmt.DisplayName, ': ', Cmt.Text);
end;
Writeln('Participants: ', Book.Persons.Count);
end;
Die flache Liste mit Referenzen schlägt hier bewusst durch: ThreadedComments listet Antworten in der Reihenfolge ihrer Speicherung auf, und eine leere ParentId kennzeichnet jede Wurzel. Wenn Sie die Baumstruktur benötigen — beispielsweise zum Exportieren eines Review-Protokolls —, gruppieren Sie zuerst nach Ref und verknüpfen Sie dann die ParentId mit der Id innerhalb der Gruppe jeder Zelle. Dieses Verhalten, das Gelesene unverändert zu bewahren, ist ein Beispiel für ein allgemeines Prinzip in der Bibliothek; der Artikel über den verlustfreien Round-Trip von Designs (Themes), Erweiterungslisten und der Berechnungskette beschreibt, wie dasselbe Prinzip auf den Rest des Pakets angewendet wird
Erledigt-Status, Zeitstempel und Autorenidentität
Drei Attribute transportieren die Review-Semantik, und alle drei sind auf den zurückgegebenen Objekten beschreibbar. Done wird auf das done-Attribut abgebildet — Excel zeigt einen erledigten Thread minimiert mit einem Link zum erneuten Öffnen an. DateTime is der ISO-8601-UTC-Erstellungszeitstempel (dT); HotXLS ersetzt ihn durch einen festen Platzhalter, wenn Sie ihn leer lassen, damit der Teil immer validiert wird, aber ein echter Zeitstempel macht den Thread-Verlauf lesbar, also setzen Sie ihn. Auf der Identitätsseite stellt jede TXLSXPerson die ProviderId — in der Regel None für lokal erstellte Einträge — und eine UserId bereit, die Sie mit einem UPN oder einer E-Mail-Adresse füllen können, wenn Ihre Anwendung diese kennt:
var
Root: TXLSXThreadedComment;
Person: TXLSXPerson;
begin
Root := Sheet.ThreadedComments.FindAt('D9');
if Root <> nil then
Root.Done := True; // saved as done="1"; Excel shows the thread resolved
Person := Book.Persons.FindByDisplayName('Maria Ortiz');
if Person <> nil then
Person.UserId := 'maria.ortiz@example.com';
end;
Eine Grenze sei deutlich genannt: HotXLS schreibt das Element <mentions> leer. Datensätze für @-Erwähnungen — der Mechanismus, der den Namen eines Kollegen im Kommentartext hervorhebt und eine Benachrichtigung in Microsoft 365 auslöst — werden nicht modelliert, sodass Text, der ein @-Zeichen enthält, als reiner Text gespeichert wird. Für eine generierte Review-Arbeitsmappe ist dies selten ein Verlust, aber wenn Ihr Workflow von Erwähnungsbenachrichtigungen abhängt, sollten Sie einplanen, dass ein Mensch diese in Excel hinzufügt. Die Autorenidentität im Personenteil passt gut zu den herkunftsbezogenen Feldern auf Arbeitsmappenebene, die im Artikel über Arbeitsmappen-Metadaten und Dokumenteigenschaften behandelt werden. Dort befindet sich auch der Rest des Audit-Trails einer generierten Datei
Was machen ältere Excel-Versionen mit Thread-Kommentaren?
Excel 2016 und früher stammen aus der Zeit vor dem Threading-Modell und ignorieren Teile, die sie nicht verstehen, einfach. Wenn Excel 365 selbst eine Thread-Konversation speichert, schreibt es auch einen Legacy-Kommentarschatten — eine Platzhalternotiz mit dem Text "[Thread-Kommentar]…" —, damit ältere Versionen an der verankerten Zelle etwas anzeigen. HotXLS gibt nur die Thread-Teile ohne Legacy-Schatten aus, sodass eine von Ihrem Code geschriebene Datei beim Öffnen in Excel 2016 überhaupt keinen Kommentarindikator anzeigt. Wenn Ihre Zielgruppe Installationen vor 365 umfasst und die Anmerkung dort sichtbar sein muss, bleibt die Legacy-API AddComment der kompatible Kanal. Vermeiden Sie es jedoch, beide Modelle auf derselben Zelle zu stapeln, ohne jede Excel-Version zu testen, an die Sie ausliefern, da die Art und Weise, wie ein Reader eine Notiz und einen Thread auf einer Zelle zusammenführt, die Entscheidung des Readers und nicht Ihre ist
Die andere harte Grenze ist das Dateiformat selbst. Thread-Kommentare sind eine OOXML-Struktur ohne BIFF8-Gegenstück, sodass die .xls-Seite von HotXLS keine Threading-API besitzt — eine Arbeitsmappe, die im alten Binärformat verbleiben muss, ist auf klassische Notizen beschränkt. In der Praxis ist die Entscheidungstabelle kurz: Wenn Sie .xlsx für Excel 365 oder Web/Mobile-Excel-Reader schreiben, verwenden Sie AddThreadedComment und erhalten echte Konversationen; zielen Sie auf Excel 2016 oder .xls ab, verwenden Sie AddComment und akzeptieren Sie das Notizenmodell. Wenn Sie eine empfangene Datei überprüfen, prüfen Sie sowohl ThreadedComments als auch Comments, da eine Arbeitsmappe, die in beiden Welten existiert hat, legitimerweise beide enthalten kann. Die vollständige API-Oberfläche für beide Generationen ist auf der Produktseite der HotXLS Delphi Excel-Komponente dokumentiert