Generirajte radnu knjigu iz Delphija, označite ćeliju klasičnim API-jem za komentare, i Excel 365 svrstava vaš tekst pod Bilješke (Notes): žuti okvir starog stila bez polja Odgovori (Reply), bez avatara autora i bez gumba za rješavanje. HotXLS piše prave Excel 365 hijerarhijske komentare (threaded comments) putem funkcija AddThreadedComment i AddThreadedReply na XLSX mehanizmu, emitirajući namjenski dio xl/threadedComments/threadedCommentN.xml po listu i registrirajući svakog autora u dijelu person na razini radne knjige, tako da je razgovor koji vaš kôd piše isti objekt na koji recenzent odgovara u Excelu
Razlika je važna jer ove dvije značajke samo izgledaju slično. Bilješka (note) je plutajući okvir za tekst; hijerarhijski komentar je zapis razgovora sa stabilnim identifikatorima, stablom odgovora, registrom autora i zastavicom rješenja — stvarima na kojima se zapravo temelji tijek rada recenzije. Ovaj članak najprije prolazi kroz strukturu OOXML-a, jer kada jednom vidite ova dva modela pohrane jedan pored drugog, svaka razlika u ponašanju u Excelu prestaje biti zagonetna
Zašto se moji komentari prikazuju kao bilješke u Excelu 365?
Kratak odgovor: dvije generacije komentara dijele istu mrežu, a žive u potpuno različitim dijelovima paketa. Naslijeđeni model — onaj koji cilja AddComment — pohranjuje tekst u xl/comments1.xml (vrsta sadržaja application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml) i pozicionira oblačić kroz prateći VML dio crteža, xl/drawings/vmlDrawing1.vml. Taj par prethodi vrpci (ribbonu); Excel 365 ga i dalje vjerno čita, ali rezultat prikazuje kao 'bilješku' i ne nudi korisničko sučelje za hijerarhiju na njemu, jer u pohrani nema ničega za grananje. Autor je niz za prikaz, pozicija je VML oblik, i to je cijeli model
Hijerarhijski komentari, uvedeni s Excelom 365, u potpunosti ignoriraju VML sloj. Svaki list s razgovorom nosi svoj dio xl/threadedComments/threadedCommentN.xml pod vrstom sadržaja application/vnd.openxmlformats-officedocument.spreadsheetml.threadedComments+xml, a radna knjiga nosi jedan dio xl/person/person.xml (vrsta sadržaja ...spreadsheetml.people+xml) koji jednom navodi svakog sudionika. HotXLS izlaže oba modela na istom radnom listu: AddComment nastavlja pisati naslijeđeni par, dok AddThreadedComment piše nove dijelove. Ako se vaš izlaz prikazuje kao bilješke, pozvali ste prvi API, a željeli ste drugi. Naslijeđeni model i dalje je pravi alat za neke poslove — prethodni članak o komentarima ćelija i hipervezama u tijekovima rada recenzije pokriva ga detaljno, uključujući XLS stranu — ali ništa se u njemu ne nadograđuje u hijerarhijski niz
Što HotXLS zapisuje u paket
HotXLS modelira svaki odgovor kao objekt TXLSXThreadedComment koji nosi sidro ćelije (Ref), identifikator u stilu GUID-a (Id), opcionalni ParentId, AuthorId koji se razrješava kroz popis osoba, zrcalo DisplayName, tijelo teksta, zastavicu Done te ISO-8601 DateTime. Pri spremanju, svaki unos postaje element <threadedComment> čiji atribut t drži identifikator, atribut dT drži vremensku oznaku (timestamp), a atribut parentT — prisutan samo na podređenim odgovorima — imenuje roditeljski identifikator. Excel rekonstruira stablo razgovora spajanjem parentT s t; u XML-u nema ugniježđenosti, već samo ravna lista plus reference
Dio s osobama (person part) je komad koji većina ručno izrađenih implementacija zaboravi. Svaki authorId u hijerarhijskom komentaru mora se razriješiti u unos <person> u xl/person/person.xml, povezan u relacije radne knjige, sa svojim vlastitim premošćivanjem vrste sadržaja (content-type override) — inače Excel nema ime za prikaz. HotXLS automatski rješava registraciju: AddThreadedComment traži autora na popisu Persons radne knjige prema nazivu za prikaz i stvara unos s novim GUID-om kada on ne postoji, tako da uzastopni komentari istog autora dijele jedan identitet. Relacije radnog lista dobivaju relaciju threadedComments, relacije radne knjige dobivaju relaciju person, a manifest vrsta sadržaja dobiva oba premošćivanja, a da se ništa od toga ne pojavljuje u vašem kodu
Izgradnja lanca odgovora pomoću AddThreadedComment i AddThreadedReply
AddThreadedComment stvara korijen razgovora: njegov ParentId ostaje prazan, što ga označava kao vrh niza. AddThreadedReply prima parametar ParentRef — referencu ćelije u kojoj korijen živi — pronalazi korijen na tom sidru i označava ParentId novog odgovora s Id-om korijena. Obje funkcije vraćaju novi TXLSXThreadedComment, tako da možete postaviti vremensku oznaku ili stanje rješenja na objektu koji ste upravo stvorili:
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;
Dva detalja u tom popisu zaslužuju pozornost. Prvo, prosljeđuje se Root.Ref umjesto ručno izrađenog niza znakova: zajamčeno je da referenca koju je knjižnica generirala odgovara onoj koju će AddThreadedReply tražiti, što uklanja cijelu klasu off-by-one pogrešaka sidrenja. Drugo, oba su autora proslijeđena kao obični nazivi za prikaz — registar osoba, GUID identiteti i povezivanje authorId-a, sve se to dogodilo iza poziva. Otvorite spremljenu datoteku u Excelu 365 i sidrenje ćelija, redoslijed odgovora i dva različita sudionika su aktivni: kliknite Odgovori i Excel dodaje novu stavku u isti niz koji je započeo vaš kôd
Čitanje razgovora natrag: ponašanje povratnog putovanja
HotXLS omogućuje povratno putovanje hijerarhijskih komentara od verzije 2.122.0: ponovno otvaranje spremljenog paketa ponovno gradi popis razgovora svakog lista i popis sudionika radne knjige iz dijelova, tako da identifikatori, poveznice odgovora i nazivi za prikaz preživljavaju puni ciklus čitaj→piši. Čitač analizira person.xml prije bilo kojeg sadržaja lista, što omogućuje da se svaki authorId razriješi u naziv za prikaz u vrijeme učitavanja; analizirani identifikatori osoba čuvaju se onakvima kakvi jesu umjesto da se ponovno generiraju, tako da radna knjiga koja putuje između vašeg koda i Excela zadržava stabilne identitete autora kroz proizvoljno mnogo povratnih putovanja
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;
Pohrana u obliku ravne liste plus reference ovdje se namjerno očituje: ThreadedComments nabraja odgovore redoslijedom dijelova, a prazan ParentId identificira svaki korijen. Ako trebate oblik stabla — recimo, za izvoz dnevnika recenzije — grupirajte najprije po Ref-u, a zatim lančano povežite ParentId s Id-om unutar grupe svake ćelije. Ovo ponašanje očuvanja-onoga-što-je-analizirano jedan je primjer šire politike u knjižnici; članak o povratnom putovanju tema, popisa proširenja i lanca izračuna bez gubitaka pokriva kako se isto načelo primjenjuje na ostatak paketa
Stanje rješenja, vremenske oznake i identitet autora
Tri atributa nose semantiku recenzije, a sva tri se mogu pisati na vraćenim objektima. Done se preslikava na atribut done — Excel prikazuje riješeni niz skupljen s poveznicom Reopen. DateTime is the ISO-8601 UTC vremenska oznaka stvaranja (dT); HotXLS umeće fiksni rezervirani položaj kada ga ostavite praznim kako bi se dio uvijek mogao validirati, no stvarna vremenska oznaka je ono što povijest niza čini čitljivom, stoga je postavite. Na strani identiteta, svaka osoba TXLSXPerson izlaže ProviderId — obično None za lokalno stvorene unose — i UserId koji možete popuniti s UPN-om ili e-poštom kada ih vaša aplikacija zna:
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;
Jednu granicu treba jasno navesti: HotXLS piše element <mentions> praznim. @-spominjanja (@-mention) — mehanizam koji osvjetljava ime kolege unutar teksta komentara i pokreće obavijest u Microsoftu 365 — nisu modelirani, pa se tekst koji sadrži znak @ pohranjuje kao običan tekst. Za generiranu radnu knjigu recenzije to je rijetko gubitak, ali ako vaš tijek rada ovisi o obavijestima o spominjanju, planirajte da ih čovjek doda unutar Excela. Identitet autora u dijelu s osobama prirodno se uparuje s poljima podrijetla (provenance fields) na razini radne knjige koja su pokrivena u metapodacima radne knjige i svojstvima dokumenta, gdje živi ostatak revizijskog traga generirane datoteke
Što starije verzije Excela čine s hijerarhijskim komentarima?
Excel 2016 i ranije verzije prethode hijerarhijskom modelu i jednostavno zanemaruju dijelove koje ne razumiju. Kada sam Excel 365 sprema hijerarhijski razgovor, on također zapisuje sjenu naslijeđenog komentara — rezervnu bilješku koja glasi '[Threaded comment]…' — upravo zato da bi starije verzije prikazale nešto na sidrenoj ćeliji. HotXLS emitira samo hijerarhijske dijelove, bez naslijeđene sjene, pa datoteka koju je napisao vaš kôd uopće ne prikazuje indikator komentara kada se otvori u Excelu 2016. Ako vaša publika uključuje instalacije starije od 365 verzije i anotacija tamo mora biti vidljiva, naslijeđeni API AddComment ostaje kompatibilan kanal; samo izbjegavajte slaganje oba modela na istoj ćeliji bez testiranja svake verzije Excela kojoj isporučujete datoteke, jer je način na koji čitač usklađuje bilješku i hijerarhijski komentar na jednoj ćeliji odluka čitača, a ne vaša
Druga čvrsta granica je sam format datoteke. Hijerarhijski komentari su OOXML struktura bez pandana u BIFF8 formatu, pa .xls strana HotXLS-a nema hijerarhijski API — radna knjiga koja mora ostati u naslijeđenom binarnom formatu ograničena je na klasične bilješke. U praksi je tablica odlučivanja kratka: ako pišete .xlsx za Excel 365 ili web/mobilne čitače Excela, koristite AddThreadedComment i dobit ćete stvarne razgovore; ako ciljate Excel 2016 ili .xls, koristite AddComment i prihvatite model bilješke; ako revidirate datoteku koju ste primili, provjerite i ThreadedComments i Comments, jer radna knjiga koja je živjela u oba svijeta može legitimno nositi oba. Cijela površina API-ja za obje generacije dokumentirana je na stranici proizvoda HotXLS Delphi Excel Component