ÐогаÑо екÑпоÑÑ Ð½Ð° 300 000 Ñеда Ð½Ð°Ð´Ñ Ð²ÑÑли лимиÑа Ñи на памеÑ, обикновено Ñе обвинÑва бÑоÑÑ Ð½Ð° ÑедовеÑе. ÐÑоÑÑ Ð½Ð° ÑедовеÑе обикновено е невинен. СкÑпиÑе ÑаÑÑи на голÑма ÑабоÑна книга Ñа Ñези, коиÑо Ñе ÑÑÐ·Ð´Ð°Ð²Ð°Ñ ÐºÐ°Ñо ÑÑÑаниÑен еÑекÑ: пÑл Ð¾Ñ ÑÑилове, койÑо наÑаÑÑва Ñ Ð¿Ð¾ един Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° клеÑка, заÑоÑо ÑоÑмаÑиÑанеÑо е добавено вÑÑÑе в ÑикÑла, XML на ÑабоÑÐ½Ð¸Ñ Ð»Ð¸ÑÑ, Ñглобен каÑо един гиганÑÑки низ по вÑеме на запиÑ, и милион иденÑиÑни ÑоÑмÑли, запиÑани една по една. HotXLS, оÑигиналнаÑа библиоÑека на losLab за Delphi за XLS и XLSX Ñайлове, ви дава конкÑеÑен лоÑÑ Ð·Ð° вÑеки Ð¾Ñ Ñези ÑÐ°Ð·Ñ Ð¾Ð´Ð¸. Ðикой Ð¾Ñ ÑÑÑ Ð½Ðµ е акÑивиÑан по подÑазбиÑане, ÑÑй каÑо вÑеки пÑÐ¾Ð¼ÐµÐ½Ñ Ð¾Ð¿Ñеделен баланÑ, Ñака Ñе познаванеÑо на Ñова кой лоÑÑ ÑÑоÑвеÑÑÑва на кой ÑимпÑом е ÑÑÑинÑкоÑо Ñмение за опÑимизиÑане на пÑоизводиÑелноÑÑÑа.
ÐÑде една голÑма ÑабоÑна книга изÑÐ°Ð·Ñ Ð¾Ð´Ð²Ð° памеÑ
Ðма два оÑделни Ñежима на памеÑÑа, вÑÑÑ
Ñ ÐºÐ¾Ð¸Ñо да ÑазÑÑждаваме. Ðо вÑеме на генеÑиÑане, моделÑÑ Ð½Ð° клеÑкиÑе в памеÑÑа наÑаÑÑва Ñ Ð²ÑÑка клеÑка, коÑÑо докоÑнеÑе: ÑÑойноÑÑи, ÑоÑмаÑи и ÑоÑмÑли ÑÑÐ°Ð²Ð°Ñ Ð¾Ð±ÐµÐºÑи или запиÑи в пÑлове. Ðо вÑеме на запиÑ, пÑÑÑÑ Ð¿Ð¾ подÑазбиÑане за XLSX допÑлниÑелно ÑендиÑа XML на вÑеки ÑабоÑен лиÑÑ Ð² ÑиÑок низ (wide string), пÑеди да го компÑеÑиÑа в zip конÑейнеÑа, Ñака Ñе пиковоÑо поÑÑебление е моделÑÑ Ð¿Ð»ÑÑ ÑеÑиализиÑанаÑа ÑоÑма на най-Ð³Ð¾Ð»ÐµÐ¼Ð¸Ñ Ð»Ð¸ÑÑ. ÐадаÑа, коÑÑо оÑелÑва в ÑикÑла на изгÑаждане и Ñлед Ñова ÑмиÑа вÑÑÑе в SaveAs, попада вÑв вÑоÑÐ¸Ñ Ñежим, а не в пÑÑвиÑ, и ÑеÑениеÑо за ÐµÐ´Ð¸Ð½Ð¸Ñ Ð½Ðµ помага за дÑÑгиÑ.
РазмеÑÑÑ Ð½Ð° Ñайла Ñледва ÑÑ
одно пÑавило: клеÑкиÑе Ñа Ñамо един Ð¾Ñ ÑÑаÑÑниÑиÑе, наÑед ÑÑÑ ÑÑиловеÑе, ÑподелениÑе низове, ÑоÑмÑлиÑе, изобÑажениÑÑа и коменÑаÑиÑе. ÐÑовеÑка Ñ ForEachCell и бÑÐ¾Ñ Ð½Ð° колекÑииÑе за вÑеки лиÑÑ Ð²Ð¸ казва кой ÑеÑÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелно доминиÑа в пÑÐ¾Ð±Ð»ÐµÐ¼Ð½Ð¸Ñ Ñайл, пÑеди да опÑимизиÑаÑе гÑеÑниÑ. Ðдна ÑÑнкоÑÑ Ð¿Ñи измеÑванеÑо: Sheet.Cells.Count Ð¾Ñ ÑÑÑана на XLSX оÑÑиÑа бÑÐ¾Ñ Ð½Ð° инÑÑанÑиÑаниÑе клеÑки в ÑазÑеденоÑо Ñ
ÑанилиÑе, а не облаÑÑÑа на Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½. ÐиÑÑ, ÑииÑо данни Ð·Ð°ÐµÐ¼Ð°Ñ Ð¿ÑавоÑгÑлник 1000 на 50 Ñ Ð½Ð°Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ð° пÑазни клеÑки, оÑÑиÑа пÑиблизиÑелно 25 000, а не 50 000. Тази Ñазлика е Ð¾Ñ Ð·Ð½Ð°Ñение, когаÑо ÑÑавнÑваÑе "огÑомен" Ñайл на ÐºÐ»Ð¸ÐµÐ½Ñ Ñ Ð²Ð°ÑиÑе ÑеÑÑови Ñаблони, ÑÑй каÑо облаÑÑÑа на Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ и ÑеалниÑÑ Ð±Ñой клеÑки Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° Ñе ÑазлиÑÐ°Ð²Ð°Ñ Ñ Ð¿Ð¾ÑÑдÑк пÑи ÑазÑедени ÑинанÑови оÑоÑмлениÑ.
StreamingWrite коÑигиÑа пÑÑÑ Ð·Ð° запиÑ, а не пÑÑÑ Ð·Ð° изгÑаждане
ÐадаванеÑо на TXLSXWorkbook.StreamingWrite := True пÑевклÑÑва SaveAs кÑм ÑÑÑийминг ÑеÑиализаÑоÑ, койÑо запиÑва XML на ÑабоÑÐ½Ð¸Ñ Ð»Ð¸ÑÑ Ð´Ð¸ÑекÑно в zip поÑока, елиминиÑайки Ð¼ÐµÐ¶Ð´Ð¸Ð½Ð½Ð¸Ñ Ð½Ð¸Ð· за вÑеки лиÑÑ. Той е False по подÑазбиÑане за ÑÑвмеÑÑимоÑÑ Ð½Ð° поведениеÑо, а акÑивиÑанеÑо Ð¼Ñ Ðµ пÑомÑна на един Ñед:
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Bulk');
for R := 1 to 100000 do
begin
Sheet.Cells[R, 1].Value := R;
Sheet.Cells[R, 2].Value := 'Row ' + IntToStr(R);
Sheet.Cells[R, 3].Value := R * 1.5;
end;
Book.StreamingWrite := True; // sheet XML streams into the zip container
Book.SaveAs('bulk.xlsx');
finally
Book.Free;
end;
ÐÑдеÑе ÑоÑни оÑноÑно Ñова какво ноÑи Ñова: моделÑÑ Ð½Ð° клеÑкиÑе, изгÑаден Ð¾Ñ ÑикÑла, заема ÑоÑно Ñолкова памеÑ, колкоÑо и пÑеди. StreamingWrite изÑавнÑва пика по вÑеме на запиÑ, коеÑо е ÑазликаÑа Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð°ÐºÐµÑно задание, коеÑо завÑÑÑва ÑÑпеÑно, и Ñакова, коеÑо Ñе пÑÐ¾Ð²Ð°Ð»Ñ Ð½Ð° 95-Ð¸Ñ Ð¿ÑоÑенÑ. Ðко ÑамиÑÑ ÑикÑл за изгÑаждане изÑеÑпи памеÑÑа, лоÑÑовеÑе, Ð¾Ñ ÐºÐ¾Ð¸Ñо Ñе нÑждаеÑе, Ñа ÑледваÑиÑе два.
ÐÑлове Ð¾Ñ ÑÑилове: добавеÑе веднÑж, използвайÑе повÑоÑно индекÑа
ФоÑмаÑиÑанеÑо на XLSX в HotXLS е базиÑано на пÑлове: Book.Fonts.Add(...), Fills.AddSolid(...) и Borders.Add(...) вÑÑÑÐ°Ñ 0-базиÑан Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° пÑл, кÑм койÑо клеÑкиÑе ÑеÑеÑиÑаÑ. ÐзвикванеÑо на Fonts.Add Ñ Ð¸Ð´ÐµÐ½ÑиÑни паÑамеÑÑи вÑÑÑе в ÑикÑл Ñе дедÑплиÑиÑа, Ñака Ñе гÑби вÑеме, а не пÑоÑÑÑанÑÑво. Alignments.Add Ñе дÑÑжи ÑазлиÑно: Ñой вÑÑÑа нов Ð¾Ð±ÐµÐºÑ Ð¿Ñи вÑÑко извикване, Ñака Ñе ÑÑздаванеÑо на подÑавнÑване за вÑÑка клеÑка каÑа пÑла да ÑаÑÑе линейно Ñ Ð±ÑÐ¾Ñ Ð½Ð° ÑедовеÑе. Ðдин навик покÑива и дваÑа ÑлÑÑаÑ. РазÑеÑеÑе вÑеки Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° пÑл веднÑж, извÑн ÑикÑла, и пÑиÑвоеÑе индекÑиÑе вÑÑÑе в него.
// hoist pool lookups out of the hot loop
HeaderFont := Book.Fonts.Add('Calibri', 11, True, False); // 0-based pool index
for C := 1 to 24 do
Sheet.Cells[1, C].FontIndex := HeaderFont + 1; // cells store 1-based; 0 = default
УвелиÑениеÑо Ñ + 1 не е пÑавопиÑна гÑеÑка и забÑавÑнеÑо Ð¼Ñ Ðµ клаÑиÑеÑкиÑÑ Ð±Ñг ÑÑк: пÑловеÑе ÑÐ°Ð·Ð´Ð°Ð²Ð°Ñ 0-базиÑани индекÑи, докаÑо ÑвойÑÑваÑа Ð¾Ñ ÑÑÑана на клеÑкиÑе ÑÑеÑиÑÐ°Ñ 0 каÑо "по подÑазбиÑане", Ñака Ñе вÑеки Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° пÑл ÑÑÑбва да бÑде измеÑÑен Ñ ÐµÐ´Ð½Ð¾ пÑи пÑиÑвоÑване. Ðко ÑгÑеÑиÑе поÑади пÑопÑÑк, ваÑиÑе Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ñ ÑиÑ
о Ñе Ñе ÑендиÑÐ°Ñ Ñ ÑÑиÑÑа по подÑазбиÑане на ÑабоÑнаÑа книга - деÑекÑ, койÑо никой не забелÑзва до пÑегледа на бÑандиÑанеÑо.
ÐаменеÑе ÑÑаÑика на Variant за вÑÑка клеÑка Ñ Ð¾Ð±ÑаÑни Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° Ñедове
ÐÑÑко Sheet.Cells[R, C].Value := X вклÑÑва ÑÑÑÑене или ÑÑздаване на клеÑка плÑÑ Ð¿ÑиÑвоÑване на Variant. ÐÑи нÑколкоÑÑоÑин Ñ
илÑди клеÑки, Ñова допÑлниÑелно наÑоваÑване пÑи вÑеки доÑÑÑп ÑÑава измеÑимо в пÑоÑилиÑе за пÑоизводиÑелноÑÑ. HotXLS пÑедоÑÑÐ°Ð²Ñ Ð³ÑÑпови callback API на двеÑе ÑаÑади (ForEachCell и ForEachRow за ÑеÑене, WriteCells и WriteRows за запиÑ), коиÑо пÑемеÑÑÐ²Ð°Ñ Ð¸ÑеÑаÑиÑÑа вÑÑÑе в двигаÑÐµÐ»Ñ Ð¸ Ð¿Ð¾Ð´Ð°Ð²Ð°Ñ Ð½Ð° ваÑÐ¸Ñ ÐºÐ¾Ð´ Ñели Ñедове наведнÑж:
procedure TLedgerExport.FillRow(Sender: TObject;
SheetIndex, Row, FirstCol, LastCol: Integer;
var Values: Variant; var Skip: Boolean; var Cancel: Boolean);
begin
if Row > FCount then
begin
Cancel := True; // stop the whole write
Exit;
end;
Values := VarArrayOf([FRows[Row - 1].Account,
FRows[Row - 1].PostedOn,
FRows[Row - 1].Amount]);
end;
// one engine call instead of hundreds of thousands of property hits
Sheet.WriteRows(1, 1, FCount, 3, FillRow);
ФлагÑÑ Skip на обÑаÑнаÑа ÑÑнкÑÐ¸Ñ Ð¾ÑÑÐ°Ð²Ñ Ñед недокоÑнаÑ, без да пÑекÑÑва пÑоÑеÑа, а Cancel пÑекÑаÑÑва опеÑаÑиÑÑа по-Ñано, коеÑо е полезно, когаÑо изÑоÑникÑÑ Ðµ ÑеÑеÑ, ÑиÑÑо дÑлжина оÑкÑиваÑе в движение. ÐомбиниÑайÑе WriteRows за изгÑажданеÑо ÑÑÑ StreamingWrite за запиÑа и в пÑÑÑ Ð½Ð° генеÑиÑане нÑма да оÑÑане кÑиÑиÑна ÑоÑка (hot spot) на ниво клеÑка.
ÐоÑÑове Ð¾Ñ ÑÑÑанаÑа на ÑеÑенеÑо вÑв ÑаÑадаÑа XLS
ÐолемиÑе оÑÑаÑели .xls Ñайлове Ð¸Ð¼Ð°Ñ Ñвой ÑобÑÑвен Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð¸Ð½ÑÑÑÑменÑи. _DisableGraphics := True пÑеди Open пÑопÑÑка изÑÑло паÑÑванеÑо на гÑаÑиÑÐ½Ð¸Ñ Ñлой, коеÑо ÑÑкоÑÑва заÑежданеÑо на ÑабоÑни книги, ÑÑдÑÑжаÑи наÑÑÑпани пÑез годиниÑе ÑигÑÑи и вгÑадени каÑÑини. ÐгÑаниÑениеÑо е ÑÑÑого: Ñогава гÑаÑиÑниÑÑ Ñлой липÑва в модела, Ñака Ñе запиÑванеÑо на Ñакава ÑабоÑна книга запиÑва Ñайл без неговиÑе ÑиÑÑнки. РезеÑвиÑайÑе Ñози Ñлаг за задаÑи за анализ, коиÑо изиÑÐºÐ²Ð°Ñ Ñамо ÑеÑене. SetTempDir пÑенаÑоÑва вÑеменниÑе Ñайлове на BIFF пиÑаÑелÑ, коеÑо е важно на ÑÑÑвÑÑи, кÑдеÑо меÑÑоположениеÑо за вÑеменни Ñайлове по подÑазбиÑане има квоÑа или Ñе намиÑа на бавно диÑково пÑоÑÑÑанÑÑво. UseSharedFormulas гÑÑпиÑа повÑаÑÑÑи Ñе ÑоÑмÑли в Ñподелени запиÑи за ÑоÑмÑли, коеÑо намалÑва ÑазмеÑа на ÑайловеÑе, пÑи коиÑо колона Ñ ÑоÑмÑла Ñе повÑаÑÑ Ð½Ð°Ð´Ð¾Ð»Ñ Ð² ÑеÑÑдеÑÐµÑ Ñ
илÑди Ñеда.
ЦиклиÑе за ÑеÑене на XLS данни Ð¸Ð¼Ð°Ñ ÐºÐ°Ð¿Ð°Ð½ Ñ Ð¸Ð½Ð´ÐµÐºÑиÑанеÑо, койÑо Ñи ÑÑÑÑва да бÑде оÑбелÑзан, ÑÑй каÑо ÑдвоÑва ÑабоÑаÑа, когаÑо Ñе обÑабоÑва деÑанзивно, и повÑежда ÑезÑлÑаÑиÑе, ако бÑде пÑопÑÑнаÑ: UsedRange оÑÑиÑа гÑаниÑиÑе Ñи FirstRow, LastRow, FirstCol и LastCol каÑо 0-базиÑани, докаÑо Cells.Item[Row, Col] е 1-базиÑан. СканиÑане, коеÑо обÑ
ожда Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, ÑÑÑбва да добави едно кÑм вÑÑка кооÑдинаÑа пÑи доÑÑÑп до клеÑкаÑа, какÑо в Cells.Item[Row + 1, Col + 1], в пÑоÑивен ÑлÑÑай ÑеÑе мÑежа, измеÑÑена диагонално Ñ ÐµÐ´Ð½Ð° клеÑка, каÑо ÑиÑ
о изпÑÑка поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ñед и колона и вклÑÑва ÑанÑомен пÑÑви ÑакÑв. ÐбÑаÑноÑо извикване ForEachCell напÑлно избÑгва Ñова неÑÑоÑвеÑÑÑвие, коеÑо е оÑе една пÑиÑина да го пÑедпоÑиÑаÑе пÑи ÑканиÑане на ÑÐµÐ»Ð¸Ñ Ð»Ð¸ÑÑ.
ÐÑоÑÑване на Ñайлове пÑеди заÑежданеÑо им
Ðай-евÑинаÑа опеÑаÑÐ¸Ñ Ñ Ð³Ð¾Ð»Ñма ÑабоÑна книга е Ñази, коÑÑо избÑгваÑе. GetSheetNames на двеÑе ÑаÑади ÑпиÑва ÑабоÑниÑе лиÑÑове на Ñайла без заÑеждане на данниÑе Ð¾Ñ ÐºÐ»ÐµÑкиÑе. РеализаÑиÑÑа на XLSX ÑеÑе Ñамо маниÑеÑÑа на ÑабоÑнаÑа книга вÑÑÑе в zip аÑÑ
ива и изÑиÑно оÑÑÐ°Ð²Ñ Ð¸Ð½ÑÑанÑиÑÑа на ÑабоÑнаÑа книга пÑазна, а XLS ÑаÑадаÑа ÑпиÑа ÑканиÑанеÑо пÑи пÑÑваÑа гÑаниÑа на подпоÑок. Това го пÑави пÑавилнаÑа пÑедваÑиÑелна пÑовеÑка за Ñова "кой лиÑÑ ÑÑÑбва да бÑде Ñел на Ñази импоÑÑна задаÑа", а CanReadEncrypted оÑговаÑÑ Ð´Ð°Ð»Ð¸ конÑейнеÑÑÑ Ðµ кÑипÑиÑан пÑеди неÑÑпеÑен Ð¾Ð¿Ð¸Ñ Ð·Ð° Open.
Names := TStringList.Create;
Book := TXLSXWorkbook.Create;
try
if Book.GetSheetNames('big-unknown.xlsx', Names) <= 0 then
raise Exception.Create('cannot enumerate sheets'); // failure clears the list
// pick the target sheet, then decide whether a full Open is worth it
// picking the target sheet, then decide whether a full Open is worth it
finally
Book.Free;
Names.Free;
end;
ÐбÑÑнеÑе внимание на конвенÑиÑÑа за кодовеÑе за вÑÑÑане: Ñези ÑÑнкÑии за пÑоÑÑване ÑигнализиÑÐ°Ñ Ð·Ð° неÑÑпеÑ
ÑÑÑ ÑÑойноÑÑи, Ñавни или по-малки Ð¾Ñ Ð½Ñла, и изпÑÐ°Ð·Ð²Ð°Ñ Ð¸Ð·Ñ
Ð¾Ð´Ð½Ð¸Ñ ÑпиÑÑк, Ñака Ñе ÑеÑÑвайÑе за <= 0, вмеÑÑо да ÑÑавнÑваÑе Ñ ÐµÐ´Ð½Ð° конкÑеÑна ÑÑойноÑÑ Ð·Ð° ÑÑпеÑ
.
ÐпÑеделÑне на Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° ÑпоÑед задаÑаÑа
Ðа авÑомаÑизиÑани пÑоÑеÑи, коиÑо генеÑиÑÐ°Ñ Ð¼Ð½Ð¾Ð³Ð¾ големи Ñайлове поÑледоваÑелно, оÑе два навика допÑÐ»Ð²Ð°Ñ ÐºÐ°ÑÑинаÑа. ÐбекÑиÑе на ÑабоÑнаÑа книга не Ñа ниÑково безопаÑни (thread-safe) за ÑподелÑне, но ниÑо не пÑеÑи да има по една незавиÑима ÑабоÑна книга на ÑабоÑен поÑок (worker thread), коеÑо паÑалелизиÑа пакеÑноÑо пÑеобÑазÑване ÑиÑÑо. РкогаÑо изÑ
одÑÑ Ð¾Ñива кÑм HTTP вмеÑÑо на диÑк, пÑеÑоваÑваниÑÑа за Ð·Ð°Ð¿Ð¸Ñ Ð² TStream Ñе комбиниÑÐ°Ñ ÑÑÑ StreamingWrite, Ñака Ñе големиÑÑ Ð¾ÑÐ³Ð¾Ð²Ð¾Ñ Ð½Ð¸ÐºÐ¾Ð³Ð° не Ñе маÑеÑиализиÑа каÑо вÑеменен Ñайл. ÐÑилага Ñе една опеÑаÑивна бележка под линиÑ: запиÑÑÑ Ð² поÑок пиÑе Ð¾Ñ ÑекÑÑаÑа позиÑÐ¸Ñ Ð±ÐµÐ· пÑевÑÑÑане назад, Ñака Ñе задайÑе Position := 0 пÑеди да пÑедадеÑе поÑока на ÑамкаÑа за оÑговоÑи. СÑаÑиÑÑа за ÑÑÑийминг Ð·Ð°Ð¿Ð¸Ñ Ð¸ пакеÑни Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñазвива Ñози модел Ð¾Ñ ÑÑÑана на ÑÑÑвÑÑа, а ÑÑаÑиÑÑа за екÑпоÑÑиÑане на бази данни показва кÑде Ñе впиÑÐ²Ð°Ñ Ñези лоÑÑове в оÑÑеÑ, базиÑан на Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸.
РнакÑаÑ, поддÑÑжайÑе по един най-Ð»Ð¾Ñ ÑеÑÑов Ñаблон за вÑÑка ÑÐ°Ð¼Ð¸Ð»Ð¸Ñ Ð¾ÑÑеÑи и измеÑвайÑе вÑемеÑо Ð¼Ñ Ð² CI. РегÑеÑииÑе в пÑоизводиÑелноÑÑÑа пÑи генеÑиÑане на докÑменÑи ÑÑдко Ñе обÑвÑÐ²Ð°Ñ Ñами. СÑил, добавен вÑÑÑе в ÑикÑл, или пÑоÑÑване, заменено Ñ Ð¿Ñлно Open, не пÑÐ¾Ð¼ÐµÐ½Ñ Ð½Ð¸Ñо ÑÑнкÑионално, а пакеÑноÑо задание пÑоÑÑо оÑнема ÑеÑиÑидеÑÐµÑ Ð¼Ð¸Ð½ÑÑи повеÑе. ÐÑемево измеÑван ÑеÑÑ Ð²ÑÑÑ
Ñ Ð¿ÑедÑÑавиÑелен Ñаблон Ñ Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½ милион клеÑки пÑевÑÑÑа Ñова оÑклонение в ÑеÑвен билд, вмеÑÑо в инÑÐ¸Ð´ÐµÐ½Ñ Ð¿Ñи поддÑÑжкаÑа.
ÐÑенÑÑни билдове, демо пÑоекÑи Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð·Ð° маÑово генеÑиÑане и пÑлниÑÑ ÑпÑавоÑник за API Ñа налиÑни на ÑÑÑаниÑаÑа за компоненÑа HotXLS.