Generišite radnu svesku (workbook) iz Delphi-ja, dodajte belešku u ćeliju pomoću klasičnog API-ja za komentare, i Excel 365 će vaš tekst smestiti pod Notes (beleške): žuti prozor starog stila bez polja Reply (odgovori), bez avatara autora i bez dugmeta za rešavanje (resolve). HotXLS upisuje prave Excel 365 ugnježdene komentare (threaded comments) kroz metode AddThreadedComment i AddThreadedReply XLSX mehanizma, emitujući namenski deo xl/threadedComments/threadedCommentN.xml po radnom listu i registrujući svakog autora u delu person na nivou radne sveske, tako da je konverzacija koju vaš kod kreira isti onaj objekat na koji recenzent odgovara u Excel-u
Ova razlika je važna jer ove dve funkcionalnosti samo vizuelno liče jedna na drugu. Beleška (note) je plutajući okvir sa tekstom. Ugnježdeni komentar (threaded comment) je zapis o konverzaciji sa stabilnim identifikatorima, stablom odgovora, registrom autora i zastavicom o rešenom statusu — što su elementi na kojima se proces recenzije (review workflow) zapravo zasniva. Ovaj članak najpre vodi kroz OOXML strukturu, jer kada jednom vidite ova dva modela skladištenja uporedo, svaka razlika u ponašanju u Excel-u prestaje da bude misteriozna
Zašto se moji komentari prikazuju kao beleške u Excel-u 365
Kratak odgovor: dve generacije komentara dele istu mrežu tabela, a žive u potpuno različitim delovima paketa. Nasleđeni model — onaj koji cilja metoda AddComment — skladišti tekst u xl/comments1.xml (tip sadržaja application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml) i pozicionira oblačić pomoću pratećeg VML crteža, xl/drawings/vmlDrawing1.vml. Taj par datoteka je nastao pre uvođenja trake sa alatkama (ribbon). Excel 365 ga i dalje verno čita, ali rezultat prikazuje kao "belešku" (note) i ne nudi korisnički interfejs za ugnježdene odgovore jer u skladištu nema ničega što bi se moglo ugnjezditi. Autor je samo običan tekst, pozicija je VML oblik, i to je ceo model
Ugnježdeni komentari, uvedeni sa verzijom Excel 365, potpuno ignorišu VML sloj. Svaki radni list sa konverzacijom nosi sopstvenu datoteku xl/threadedComments/threadedCommentN.xml pod tipom sadržaja application/vnd.openxmlformats-officedocument.spreadsheetml.threadedComments+xml, a radna sveska nosi jedinstvenu datoteku xl/person/person.xml (tip sadržaja ...spreadsheetml.people+xml) koja jednom popisuje svakog učesnika. HotXLS izlaže oba modela na istom radnom listu: AddComment nastavlja da piše nasleđeni par, dok AddThreadedComment piše nove delove. Ako se vaš izlaz prikazuje kao beleške, pozvali ste prvi API, a želeli ste drugi. Nasleđeni model je i dalje pravi alat za neke zadatke — raniji članak o komentarima ćelija i hiperlinkovima u procesima recenzije ga detaljno pokriva, uključujući XLS stranu — ali ništa u njemu se ne može nadograditi u ugnježdeni niz
Šta HotXLS upisuje u paket
HotXLS modelira svaki odgovor kao objekat TXLSXThreadedComment koji nosi sidro ćelije (Ref), identifikator u GUID stilu (Id), opcioni ParentId, AuthorId koji se razrešava kroz listu osoba, kopiju DisplayName, telo teksta, zastavicu Done i vremensku oznaku DateTime u ISO-8601 formatu. Prilikom čuvanja, svaki unos postaje element <threadedComment> čiji atribut t nosi identifikator, atribut dT vremensku oznaku, a atribut parentT — prisutan samo na podređenim odgovorima — imenuje roditeljski identifikator. Excel rekonstruiše stablo konverzacije povezivanjem parentT sa t. U XML-u nema ugnježđivanja, već samo ravna lista plus reference
Deo person je element koji većina samostalno razvijenih implementacija zaboravi. Svaki authorId u ugnježdenom komentaru mora da se razreši u unos <person> u datoteci xl/person/person.xml, povezan u relacije radne sveske sa sopstvenim preklapanjem tipa sadržaja — inače Excel neće imati ime za prikaz. HotXLS automatski upravlja registracijom: metoda AddThreadedComment traži autora na listi Persons radne sveske po imenu za prikaz i kreira unos sa novim GUID-om kada on ne postoji, tako da uzastopni komentari istog autora dele isti identitet. Relacije radnog lista dobijaju relaciju threadedComments, relacije radne sveske dobijaju relaciju person, a manifest tipova sadržaja dobija oba preklapanja, bez potrebe da se bilo šta od toga pojavi u vašem kodu
Izgradnja lanca odgovora pomoću AddThreadedComment i AddThreadedReply
Metoda AddThreadedComment kreira koren konverzacije: njen ParentId ostaje prazan, što označava da je to vrh ugnježdenog niza. AddThreadedReply uzima parametar ParentRef — referencu ćelije gde se koren nalazi — pronalazi koren na tom sidru i upisuje ParentId novog odgovora sa Id-jem korena. Obe metode vraćaju novi objekat TXLSXThreadedComment, tako da možete podesiti vremensku oznaku ili status rešenosti na objektu koji ste upravo kreirali:
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 ovom kodu zaslužuju pažnju. Prvo, prosleđuje se Root.Ref umesto ručno napravljenog stringa: referenca koju biblioteka generiše garantovano odgovara onome što će AddThreadedReply tražiti, što eliminiše čitavu klasu grešaka u sidrenju. Drugo, oba autora su prosleđena kao obična imena za prikaz — registar osoba, GUID identiteti i povezivanje preko authorId dogodili su se iza scene. Otvorite sačuvanu datoteku u Excel-u 365 i sidrenje ćelija, redosled odgovora i dva različita učesnika su aktivni: kliknite na Reply i Excel će dodati odgovor u isti niz koji je započeo vaš kod
Čitanje konverzacije unazad: ponašanje tokom povratnog putovanja (round-trip)
HotXLS u potpunosti prenosi ugnježdene komentare u oba smera (round-trip) počevši od verzije 2.122.0: ponovno otvaranje sačuvanog paketa ponovo gradi listu konverzacija svakog lista i listu učesnika radne sveske iz delova datoteke, tako da identifikatori, veze odgovora i imena za prikaz preživljavaju pun ciklus čitanja i pisanja. Čitač parsira person.xml pre bilo kog sadržaja radnog lista, što omogućava da se svaki authorId razreši u ime za prikaz u trenutku učitavanja. Parsirani identifikatori osoba se čuvaju onakvima kakvi jesu umesto da se ponovo generišu, pa radna sveska koja ide od vašeg koda do Excel-a i nazad zadržava stabilne identitete autora tokom proizvoljno mnogo ciklusa
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;
Skladištenje u obliku ravne liste plus reference se ovde namerno vidi: ThreadedComments popisuje odgovore redosledom delova, a prazan ParentId identifikuje svaki koren. Ako vam je potreban oblik stabla — na primer, da biste izvezli dnevnik recenzije — prvo grupišite po Ref, a zatim povežite ParentId sa Id unutar grupe svake ćelije. Ovo ponašanje očuvanja onoga što ste parsirali je samo jedan primer šire politike u biblioteci. Članak o povratnom putovanju bez gubitaka (lossless round-trip) tema, listi ekstenzija i lanca proračuna pokriva kako se isti princip primenjuje na ostatak paketa
Rešeni status, vremenske oznake i identitet autora
Tri atributa nose semantiku recenzije, i sva tri se mogu upisivati na vraćenim objektima. Done se mapira u atribut done — Excel prikazuje rešeni niz skupljenim sa linkom Reopen. DateTime je ISO-8601 UTC vremenska oznaka kreiranja (dT). HotXLS postavlja fiksnu privremenu vrednost (placeholder) kada ga ostavite praznim kako bi deo uvek bio validan, ali stvarna vremenska oznaka čini istoriju niza čitljivom, pa je podesite. Sa strane identiteta, svaka TXLSXPerson izlaže ProviderId — obično None za lokalno kreirane unose — i UserId koji možete popuniti sa UPN-om ili e-poštom kada ih vaša aplikacija prepoznaje:
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 upisuje element <mentions> prazan. Zapisi sa oznakom @-mention — mehanizam koji osvetljava ime kolege unutar teksta komentara i pokreće obaveštenje u Microsoft 365 sistemu — nisu modelirani, pa se tekst koji sadrži znak @ čuva kao običan tekst. Za generisanu radnu svesku recenzije to je retko gubitak, ali ako vaš radni tok zavisi od obaveštenja o pominjanju, planirajte da čovek doda te podatke unutar Excel-a. Identitet autora u delu person prirodno se uparuje sa poljima o poreklu na nivou radne sveske pokrivenim u članku o metapodacima radne sveske i svojstvima dokumenta, gde se nalazi i ostatak revizorskog traga generisane datoteke
Šta starije verzije Excel-a rade sa ugnježdenim komentarima
Excel 2016 i starije verzije su nastale pre modela ugnježdenih komentara, pa jednostavno ignorišu delove koje ne razumeju. Kada sam Excel 365 čuva ugnježdenu konverzaciju, on takođe upisuje nasleđenu senku komentara (legacy comment shadow) — privremenu belešku koja glasi "[Threaded comment]..." — upravo da bi starije verzije prikazale nešto u sidrenoj ćeliji. HotXLS emituje samo ugnježdene delove bez nasleđene senke, tako da datoteka koju je upisao vaš kod ne prikazuje nikakav indikator komentara kada se otvori u Excel-u 2016. Ako vaša publika koristi instalacije pre verzije 365 i napomena tamo mora biti vidljiva, nasleđeni API AddComment ostaje kompatibilan kanal. Samo izbegavajte slaganje oba modela na istu ćeliju bez testiranja svake verzije Excel-a na koju isporučujete datoteke, jer je način na koji čitač usklađuje belešku i ugnježdeni niz na jednoj ćeliji odluka čitača, a ne vaša
Druga jasna granica je sam format datoteke. Ugnježdeni komentari su OOXML struktura koja nema BIFF8 pandan, tako da .xls strana u HotXLS-u nema ugnježdeni API — radna sveska koja mora ostati u nasleđenom binarnom formatu ograničena je na klasične beleške. U praksi je tabela odlučivanja kratka: ako pišete .xlsx za Excel 365 ili veb/mobilne čitače Excel-a, koristite AddThreadedComment i dobićete prave konverzacije. Ako ciljate Excel 2016 ili .xls format, koristite AddComment i prihvatite model beležaka. Ako vršite reviziju datoteke koju ste primili, proverite i ThreadedComments i Comments, jer radna sveska koja je živela u oba sveta može legitimno da nosi oba. Kompletna površina API-ja za obe generacije je dokumentovana na stranici proizvoda HotXLS Delphi Excel komponenta