HotXLS може да отвори XLSX работна книга и да не синтактично анализира ниту една клетка на работен лист. TXLSXWorkbook.MetadataOnly чете свойствата на работната книга, дефинираните имена, имената на листи и състоянията на видимост, стиловете, темата, връзките и външните препратки, след което спира преди клетките XML. За скенер, който трябва да знае какво има в директория с работни книги, това е разликата между минути и секунди
Три свързани превключвателя допълват картината: SelectedSheets анализира клетки за наименувано подмножество, LoadSheet материализира пропуснат лист по-късно от оригиналния архив, а PreserveRawParts копира компресираните байтове на непроменени части направо при запис. Използвани заедно те превръщат «отваряне на работна книга» от една всичко-или-нищо операция в нещо, което можете да обхватите
Какво можете да научите, без да анализирате нито една клетка?
Повече, отколкото повечето задачи за откриване се нуждаят. С MetadataOnly, зададено преди Open, работната книга се връща, носейки своите имена на листове и състояния на видимост, дефинираните си имена, свойствата на документа, стиловете и темата си, външните си препратки и връзките си. Листовете присъстват като обекти с нула клетки
Това е точно информацията, на която работи каталог, одит или решение за маршрутизиране. Кои работни книги дефинират име, наречено TaxRate? Кои от тях имат скрити листове? Кои се свързват към сървър, който е бил изведен от употреба? Отговарянето на тези чрез пълно зареждане на всеки файл е как нощна задача става задача за цяла нощ
var
Workbook: TXLSXWorkbook;
I: Integer;
begin
Workbook := TXLSXWorkbook.Create(nil);
try
Workbook.MetadataOnly := True; // set before Open
Workbook.Open(FileName);
for I := 1 to Workbook.Sheets.Count do // Sheets[] is 1-based
if not Workbook.Sheets[I].Visible then
Report.Add(FileName + ': hidden sheet ' +
Workbook.Sheets[I].Name);
finally
Workbook.Free;
end;
end;
Зареждане на два листа от четиридесет
SelectedSheets е TStringList с имена на листове. Когато е непразен, Open анализира клетките XML само за листовете, които назовава; всеки друг лист запазва правилното си име и състояние на видимост и не държи клетки. Празен списък означава предишното поведение, което е да зареди всичко
Взаимодействието с MetadataOnly си струва да се каже ясно, защото объркването му произвежда объркваща празна работна книга: MetadataOnly = True отменя селекцията и пропуска всички листове. Използвайте едно или друго. Откриването използва само метаданни; целевата работа използва селекция
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Later, when the user opens a tab you skipped.
// LoadSheet takes the 0-based position and needs the source file,
// so it does not work on a workbook opened from a stream
if Workbook.LoadSheet(ZeroBasedPosition) then
Grid.Refresh;
LoadSheet(Index) материализира пропуснат лист при заявка от оригиналния архив, което е точно това, което прави този модел използваем в интерактивно приложение, а не само в партида. Отворете с листа, който потребителят гледа, заредете другите, когато кликнат. Архивът остава отворен точно по тази причина, така че дръжте работната книга жива, докато потребителят може да поиска друг лист
Защо едно обаждане от типа round trip променя части, които не сте докосвали?
Защото наивен запис регенерира всичко. Декомпресирайте темата, изградете обектен модел, сериализирайте го обратно, рекомпресирайте — и сега байтовете се различават, въпреки че нищо по темата не се е променило. За VBA проекти и pivot кешове това е по-лошо от разхищение, защото тези части носят структура, която обектният модел не представя напълно
PreserveRawParts отговаря на това, като копира компресираното представяне на непроменени части директно от изходния архив по време на SaveAs. Тема, VBA проект, pivot таблици и pivot кешове се местят като байтове, когато не са били променяни. Без декомпресия, без рекомпресия, без риск да се загуби нещо в обиколка на сериализация
Цената е ограничение, което вече сте имали: изходният архив трябва все още да бъде достъпен по време на запис. Ако работният ви процес чете файл в паметта, затваря го и записва час по-късно, пътят за сурово копиране няма от какво да копира. Дръжте източника достижим за живота на работната книга, което е същото изискване, което LoadSheet налага
Пайплайн за откриване, който нарочно отваря повторно
Моделът, който работи в производство, има две преминавания и никаква хитрост. Първото преминаване отваря само метаданни и решава. Второто преминаване отваря повторно файловете, които имат значение, със селекция на листове и върши работата. Повторното отваряне се усеща разхищение, докато не преброите какво е избегнало първото преминаване: второто отваряне е единственото, което анализира клетки, и то анализира само листовете, които първото е избрало
// Pass 1: discovery
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;
// Pass 2: targeted load
Workbook := TXLSXWorkbook.Create(nil);
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);
Не се опитвайте да промотирате работна книга само с метаданни на място, като изчистите флага след Open. Флагът се чете по време на отваряне; изчистването му след това не променя нищо по работна книга, чиито клетки XML никога не са били посетени
Къде това се вписва с другите лостове за големи файлове
Селективното зареждане намалява това, което анализирате. То не намалява това, което струва един лист, след като е зареден, и не помага, когато наистина се нуждаете от всяка клетка на всеки лист. За този случай съответната работа е от страна на хранилището, описана в записките за съхранение на клетки в блокове от редове и наслагвания на интервалин стилове, а от страна на анализа — в паралелен XLSX анализ и алокаторът на памет. Когато задачата е чисто сканиране без редактиране изобщо, струйният директен четец прескача обектния модел изцяло и ще победи всяка стратегия за зареждане, която изгражда такъв
HotXLS отваря XLS и XLSX файлове от нативен Delphi и C++Builder код без зависимост от Excel, така че задача за откриване от страна на сървъра се изпълнява без нищо инсталирано освен вашия собствен изпълним файл — вижте страницата на HotXLS компонент за електронни таблици за поддържаните формати и лицензиране