ÐиблиоÑека за елекÑÑонни ÑаблиÑи, коÑÑо ÑÑÑ
ÑанÑва Ñамо низове Ñ ÑоÑмÑли, и библиоÑека Ñ ÑабоÑÐµÑ Ð¸Ð·ÑиÑлиÑелен двигаÑел за ÑоÑмÑли Ñа два ÑазлиÑни пÑодÑкÑа, коиÑо Ð¸Ð·Ð³Ð»ÐµÐ¶Ð´Ð°Ñ Ð¸Ð´ÐµÐ½ÑиÑни до моменÑа, вкоиÑо поиÑкаÑе ÑиÑло Ð¾Ñ Ð½Ñкой Ð¾Ñ ÑÑÑ
. ÐовеÑеÑо код за елекÑÑонни ÑаблиÑи в Delphi никога не забелÑзва Ñази Ñазлика, ÑÑй каÑо Excel Ñ Ð¼Ð°ÑкиÑа: запиÑеÑе SUM(B2:B501) в клеÑка, запазеÑе и Excel пÑеизÑиÑлÑва ÑÑмаÑа в моменÑа, в койÑо поÑÑебиÑел оÑвоÑи Ñайла. ÐÑемаÑ
неÑе ÑовеÑÐºÐ¸Ñ ÑакÑÐ¾Ñ Ð¾Ñ Ð²ÐµÑигаÑа, пÑекаÑайÑе ÑÑÑаÑа ÑабоÑна книга пÑез ÑÑÑвÑÑен пÑоÑеÑ, койÑо екÑпоÑÑиÑа диÑекÑно в CSV, и ÑазликаÑа ÑпиÑа да бÑде ÑиÑÑо академиÑна. CSV ÑайлÑÑ ÑÑдÑÑжа бÑÐºÐ²Ð°Ð»Ð½Ð¸Ñ ÑекÑÑ =SUM(B2:B501) Ñам, кÑдеÑо ÑÑÑбва да има ÑиÑло, заÑоÑо в ниÑо един Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð¸Ñо не е оÑенило Ñеално ÑоÑмÑлаÑа.
Това е гÑаниÑаÑа, Ð¾Ñ Ð¿ÑавилнаÑа ÑÑÑана на коÑÑо ÑÑои HotXLS. Той ÑÑеÑиÑа ÑоÑмÑлаÑа по наÑина, по койÑо го пÑавÑÑ ÑайловиÑе ÑоÑмаÑи - каÑо запиÑан ÑекÑÑ Ð¿Ð»ÑÑ Ð½ÐµÐ·Ð°Ð´ÑлжиÑелен кеÑиÑан ÑезÑлÑаÑ, Ñака Ñе обикновениÑÑ CSV екÑпоÑÑ Ð²ÑзпÑоизвежда ÑеÑепÑаÑа, а не гоÑовоÑо ÑÑÑие. Ðо Ñой ÑÑÑо Ñака ÑÑдÑÑжа изÑиÑлиÑелен двигаÑел, койÑо можеÑе да извикаÑе диÑекÑно, ÑÑÑиÑÑ Ð´Ð²Ð¸Ð³Ð°Ñел какÑо в XLS, Ñака и в XLSX ÑаÑадиÑе, плÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ñм за обÑабоÑка на имена на ÑÑнкÑии, за коиÑо двигаÑелÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð° не е ÑÑвал. HotXLS е оÑигинална Object Pascal библиоÑека, коÑÑо ÑеÑе и запиÑва XLS и XLSX Ð¾Ñ Delphi и C++Builder без авÑомаÑизаÑÐ¸Ñ Ð½Ð° Excel, а изÑиÑлиÑелнаÑа й ÑаÑÑ Ðµ Ñова, коеÑо пÑевÑÑÑа запиÑаниÑе ÑоÑмÑли обÑаÑно в ÑÑойноÑÑи пÑи поиÑкване.
ФоÑмÑлиÑе Ñе ÑÑÑ ÑанÑÐ²Ð°Ñ Ð°, а не Ñе оÑенÑÐ²Ð°Ñ Ð½ÐµÐ·Ð°Ð±Ð°Ð²Ð½Ð¾
ÐапиÑванеÑо на ÑоÑмÑла в клеÑка не изÑиÑлÑва ниÑо. ÐÑи Ð·Ð°Ð¿Ð¸Ñ ÑабоÑнаÑа книга ÑегиÑÑÑиÑа ÑекÑÑа на ÑоÑмÑлаÑа. ÐÑ ÑÑÑана на XLS ÑÑ ÑÑÑо Ñака запиÑва Ñлагове, ÑпÑавлÑвани Ð¾Ñ RecalcOnSave, койÑо по подÑазбиÑане е True и Ñказва на Excel да пÑеизÑиÑлÑва пÑи оÑваÑÑне. Този модел е пÑавилен за Ñайлове, пÑедназнаÑени за Excel, и гÑеÑен за пÑоÑеÑи, коиÑо конÑÑмиÑÐ°Ñ ÑÑойноÑÑиÑе на клеÑкиÑе диÑекÑно, незавиÑимо дали ÑÑава вÑпÑÐ¾Ñ Ð·Ð° CSV екÑпоÑÑ, HTML екÑпоÑÑ Ð¸Ð»Ð¸ Ð²Ð°Ñ ÑобÑÑвен код, койÑо ÑеÑе клеÑкиÑе обÑаÑно. Ðа ÑÑÑ
пÑавеÑе оÑенка изÑиÑно Ñ Calculate. Той ÑÑÑеÑÑвÑва в ÑеÑиÑи вÑ
одни ÑоÑки: TXLSWorkbook, IXLSWorksheet, TXLSXWorkbook и TXLSXWorksheet Ð¸Ð·Ð»Ð°Ð³Ð°Ñ function Calculate(const Formula: WideString): Variant.
// evaluate in-process, then ship the value rather than the recipe
Total := Book.Calculate('SUM(Sales!B2:B501)');
Sheet.Cells[502, 2].Value := Total;
Book.SaveAsCSV('sales.csv', 0, ','); // the CSV now carries the number
ÐзÑазÑÑ, подаден на Calculate, е обикновен ÑекÑÑ Ð½Ð° ÑоÑмÑла на Excel. ÐÑепÑаÑкиÑе Ð¼ÐµÐ¶Ð´Ñ Ð»Ð¸ÑÑове, деÑиниÑаниÑе имена и вложениÑе ÑÑнкÑии Ñе ÑазÑеÑÐ°Ð²Ð°Ñ ÑпÑÑмо ÑекÑÑаÑа ÑабоÑна книга в памеÑÑа, коеÑо пÑави извикванеÑо полезно Ð´Ð°Ð»ÐµÑ Ð¾ÑвÑд коÑигиÑанеÑо на CSV екÑпоÑÑи. ТÑеÑиÑайÑе го каÑо меÑ
анизÑм за пÑовеÑка (assertion). ÐенеÑаÑоÑ, койÑо ÑокÑ-Ñо е запиÑал пеÑÑÑоÑин подÑобни Ñеда, може да поиÑка Ð¾Ñ ÑабоÑнаÑа книга обÑаÑа Ñи ÑÑма и да Ñ ÑÑавни Ñ ÑиÑлоÑо, коеÑо е изÑиÑлил незавиÑимо в Pascal, ÑлавÑйки гÑеÑка Ð¾Ñ Ñип "off-by-one" в диапазона пÑеди одиÑоÑÑÑ Ð½Ð° клиенÑа да го напÑави.
Това ÑÑÑо Ñака оÑеÑÑава пÑавилнаÑа ÑÑÑаÑÐµÐ³Ð¸Ñ Ð·Ð° ÑеÑÑване пÑи изÑ
одни данни Ñ Ð³Ð¾Ð»Ñм бÑой ÑоÑмÑли. Excel Ñи оÑÑава еÑалоннаÑа имплеменÑаÑÐ¸Ñ Ð½Ð° езика за ÑоÑмÑли, Ñака Ñе за малкоÑо ÑоÑмÑли, коиÑо Ð¸Ð¼Ð°Ñ Ð±Ð¸Ð·Ð½ÐµÑ Ð¿Ð¾ÑледиÑи, поддÑÑжайÑе одобÑен ÑеÑÑов Ñайл Ñ Ð´Ð°Ð½Ð½Ð¸ (fixture), ÑииÑо оÑаквани ÑÑойноÑÑи Ñа генеÑиÑани Ð¾Ñ ÑÐ°Ð¼Ð¸Ñ Excel, и накаÑайÑе изгÑаждаÑÐ¸Ñ Ð¿ÑоÑÐµÑ (build pipeline) да оÑенÑва ÑоÑмÑлиÑе на генеÑиÑанаÑа ÑабоÑна книга Ñ Calculate ÑпÑÑмо Ñези ÑеÑÑови Ñайлове. РазликиÑе Ñогава Ñе Ñе поÑвÑÑ ÐºÐ°Ñо неÑÑпеÑни ÑеÑÑове в Delphi, а не каÑо неÑÑоÑвеÑÑÑвиÑ, оÑкÑиÑи Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñ Ð¿Ñи ÑÑавнÑване на два оÑÑеÑа.
ÐобавÑне на Ð±Ð¸Ð·Ð½ÐµÑ ÑÑнкÑии Ñ OnUserFunction
ÐогаÑо двигаÑелÑÑ ÑÑеÑне име на ÑÑнкÑиÑ, коеÑо не Ñазпознава, Ñой генеÑиÑа ÑÑбиÑие, вмеÑÑо да Ñе пÑовали напÑлно. ÐадайÑе OnUserFunction на койÑо и да е ÐºÐ»Ð°Ñ Ð½Ð° ÑабоÑна книга и можеÑе Ñами да ÑазÑеÑиÑе извикванеÑо:
procedure TReportBuilder.HandleUserFunction(Sender: TObject;
const FunctionName: WideString; const Args: Variant;
var Value: Variant; var Handled: Boolean);
begin
if SameText(FunctionName, 'DISCOUNT') then
begin
Value := Args[0] * 0.9; // Args arrives as a Variant array
Handled := True;
end;
end;
// wiring and use
Book.OnUserFunction := HandleUserFunction;
Sheet.Cells[1, 1].Value := 200;
Sheet.Cells[1, 2].Formula := 'DISCOUNT(A1)';
Net := Book.Calculate('DISCOUNT(A1) + SUM(A1:A1)');
ТÑи деÑайла заÑлÑÐ¶Ð°Ð²Ð°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ. ÐÑÑво, задайÑе Handled := True Ñамо когаÑо дейÑÑвиÑелно ÑÑе Ñазпознали имеÑо. ÐÑÑавÑнеÑо Ð¼Ñ ÐºÐ°Ñо False позволÑва на двигаÑÐµÐ»Ñ Ð´Ð° пÑодÑлжи ноÑмалнаÑа Ñи обÑабоÑка на непознаÑи ÑÑнкÑии, Ñака Ñе един и ÑÑÑ Ð¼Ð°Ð½Ð¸Ð¿ÑлаÑÐ¾Ñ Ð¼Ð¾Ð¶Ðµ да обÑлÑжва нÑколко ÑабоÑни книги, без да пÑеÑендиÑа за вÑиÑко, коеÑо пÑеминава пÑез него. ÐÑоÑо, ÑÑавнÑвайÑе именаÑа без знаÑение Ð¾Ñ ÑегиÑÑÑÑа на бÑквиÑе ÑÑез SameText, ÑÑй каÑо авÑоÑиÑе на ÑоÑмÑли пиÑÐ°Ñ discount( и DISCOUNT( взаимозаменÑемо. ТÑеÑо, аÑгÑменÑиÑе пÑиÑÑÐ¸Ð³Ð°Ñ Ð¿ÑедваÑиÑелно оÑенени: DISCOUNT(A1) ви пÑедава ÑÑойноÑÑÑа на A1, а не пÑепÑаÑкаÑа, Ñака Ñе ÑÑнкÑиÑÑа не може да опÑедели оÑкÑде Ð¸Ð´Ð²Ð°Ñ Ð½ÐµÐ¹Ð½Ð¸Ñе вÑ
одни данни. Тази поÑледна ÑоÑка поÑÑÐ°Ð²Ñ Ð¾Ð³ÑаниÑениеÑо, за коеÑо Ñе оÑнаÑÑ ÑледваÑиÑÑ Ñаздел.
ТÑеÑиÑайÑе ÑÑлоÑо на манипÑлаÑоÑа ÑÑÑ ÑÑÑаÑа заÑиÑа, какÑо вÑÑка вÑнÑна вÑ
одна ÑоÑка. ÐаÑивÑÑ Args оÑÑазÑва Ñова, коеÑо авÑоÑÑÑ Ð½Ð° ÑоÑмÑлаÑа е вÑвел, Ñака Ñе валидиÑайÑе бÑÐ¾Ñ Ð½Ð° аÑгÑменÑиÑе и ÑеÑ
ниÑе Ñипове пÑеди индекÑиÑане в него и вземеÑе ÑеÑение пÑедваÑиÑелно какво вÑÑÑа невалидно извикване - гÑеÑна Variant ÑÑойноÑÑ Ð¸Ð»Ð¸ повдигнаÑо изклÑÑение. ÐзбоÑÑÑ Ðµ важен, ÑÑй каÑо изклÑÑение, Ñ
вÑÑлено в манипÑлаÑоÑа, Ñе ÑазпÑоÑÑÑанÑва навÑн пÑез извикванеÑо на Calculate, коеÑо е задейÑÑвало оÑенкаÑа. Това е пÑиемливо в ÑÑÑого конÑÑолиÑан генеÑаÑÐ¾Ñ Ð¸ гÑÑбо в ÑÑлÑга, коÑÑо оÑенÑва ÑабоÑни книги, ÑÑздадени Ð¾Ñ Ð¿Ð¾ÑÑебиÑели, кÑдеÑо една лоÑа ÑоÑмÑла би пÑовалила ÑÑлаÑа заÑвка. Ð Ñакава ÑÑеда пÑиÑ
ваÑайÑе гÑеÑкиÑе вÑÑÑе в манипÑлаÑоÑа и вÑÑÑайÑе ÑпеÑиална ÑÑойноÑÑ (sentinel), коÑÑо обгÑаждаÑиÑÑ ÑабоÑен пÑоÑÐµÑ Ð¼Ð¾Ð¶Ðµ да Ñазпознае и запиÑе в лога.
ФÑнкÑииÑе, завиÑеÑи Ð¾Ñ Ð¿Ð¾Ð·Ð¸ÑиÑÑа, Ñе нÑждаÑÑ Ð¾Ñ Ð²Ð°ÑианÑа Ex
ÐÑкои ÑÑнкÑии легиÑимно завиÑÑÑ Ð¾Ñ Ñова кÑде Ñе оÑенÑваÑ. ÐоеÑиÑиенÑ, койÑо Ñе ÑазлиÑава за вÑеки лиÑÑ, ÑÑÑÑене ÑпÑÑмо Ñеда, множиÑел за Ñегион, койÑо Ñе пÑилага Ñамо вÑÑÑ
Ñ ÑегионалниÑе лиÑÑове: ниÑо едно Ð¾Ñ Ñези не може да бÑде ÑеÑено Ñамо ÑÑез ÑÑойноÑÑиÑе на аÑгÑменÑиÑе. ÐбикновеноÑо ÑÑбиÑие не може да изÑази Ñова, Ñака Ñе двигаÑелÑÑ Ð¿Ñедлага OnUserFunctionEx, иденÑиÑно Ñ Ð¸Ð·ÐºÐ»ÑÑение на един допÑлниÑелен паÑамеÑÑÑ:
procedure TReportBuilder.HandleUserFunctionEx(Sender: TObject;
const FunctionName: WideString; const Args: Variant;
const Context: TXLSUserFunctionContext;
var Value: Variant; var Handled: Boolean);
begin
if SameText(FunctionName, 'REGIONRATE') then
begin
// the same formula yields a different rate on each regional sheet
Value := RateForSheet(Context.SheetIndex) * Args[0];
Handled := True;
end;
end;
TXLSUserFunctionContext ÑÑдÑÑжа SheetIndex, Row и Col на клеÑкаÑа, коÑÑо Ñе оÑенÑва. Ðко ÑезÑлÑаÑÑÑ Ð½Ð° ÑÑнкÑиÑÑа завиÑи Ð¾Ñ Ð½ÐµÐ¹Ð½Ð¾Ñо меÑÑоположение доÑи минимално, ÑвÑÑжеÑе ÑÑбиÑиеÑо Ex Ð¾Ñ ÑамоÑо наÑало. ÐобавÑнеÑо на конÑекÑÑ Ð² манипÑлаÑоÑ, койÑо ÑÑидеÑÐµÑ ÑоÑмÑли веÑе извикваÑ, е много по-Ñложно Ð¾Ñ Ð¸Ð·Ð±Ð¾Ñа на пÑавилнаÑа ÑигнаÑÑÑа в пÑÑÐ²Ð¸Ñ Ð´ÐµÐ½, а двеÑе ÑÑбиÑÐ¸Ñ Ñа Ñолкова ÑÑ
одни по дÑÑг наÑин, Ñе има малко пÑиÑини да запоÑваÑе Ñ Ð¿Ð¾-ÑÑÑноÑо.
ÐоÑÑебиÑелÑкиÑе ÑÑнкÑии не Ñе пÑÐµÑ Ð²ÑÑлÑÑ Ð² Excel
ÐоÑÑебиÑелÑкаÑа ÑÑнкÑÐ¸Ñ Ð¶Ð¸Ð²ÐµÐµ изÑÑло вÑв ваÑÐ¸Ñ Ð¿ÑоÑеÑ. ÐмеÑо DISCOUNT ознаÑава неÑо Ñамо докаÑо ваÑиÑÑ Delphi код и неговиÑÑ ÑÑбиÑиен манипÑлаÑÐ¾Ñ ÑабоÑÑÑ. ÐÑвоÑеÑе запиÑÐ°Ð½Ð¸Ñ Ñайл в Excel и DISCOUNT Ñе бÑде пÑоÑÑо неÑазпознаÑо име; клеÑкаÑа Ñе покаже #NAME?, оÑвен ако на маÑинаÑа на поÑÑебиÑÐµÐ»Ñ ÑлÑÑайно не ÑÑÑеÑÑвÑва ÑÑоÑвеÑÑÑваÑа VBA ÑÑнкÑÐ¸Ñ Ð¸Ð»Ð¸ добавка. Това е пÑоекÑниÑÑ ÑакÑ, койÑо оÑлиÑава демонÑÑÑаÑиÑÑа Ð¾Ñ Ð³Ð¾Ñов за ÑазпÑоÑÑÑанение пÑодÑкÑ, и Ñой налага избоÑ, койÑо ÑÑÑбва да напÑавиÑе ÑÑзнаÑелно, вмеÑÑо да оÑкÑиеÑе впоÑледÑÑвие.
ÐземеÑе ÑеÑение за вÑÑка клеÑка кой Ð¾Ñ Ð´Ð²Ð°Ñа договоÑа доÑÑавÑÑе. ÐлеÑкиÑе, коиÑо поÑÑебиÑелÑÑ ÑÑÑбва да вижда как Ñе пÑеизÑиÑлÑÐ²Ð°Ñ Ð² Excel, ÑÑÑбва да бÑÐ´Ð°Ñ Ð¸Ð·Ð³Ñадени единÑÑвено Ð¾Ñ ÑобÑÑÐ²ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ ÑÑнкÑии на Excel. ÐлеÑкиÑе, ÑиÑÑо логика е ÑиÑмена ÑобÑÑвеноÑÑ, ÑÑÑбва да бÑÐ´Ð°Ñ Ð¾ÑенÑвани в пÑоÑеÑа Ñ Calculate и запазвани каÑо обикновени ÑÑойноÑÑи, Ñака Ñе поÑÑебиÑелÑкаÑа ÑÑнкÑÐ¸Ñ Ð´Ð° Ñе дÑÑжи каÑо вÑÑÑеÑно изÑиÑлиÑелно пÑавило, а не каÑо Ñайлово ÑÑдÑÑжание. РежимÑÑ Ð½Ð° оÑказ, койÑо надеждно генеÑиÑа ÑикеÑи за поддÑÑжка, е ÑÑедноÑо положение - запиÑване на ÑоÑмÑла Ñ Ð¿Ð¾ÑÑебиÑелÑка ÑÑнкÑÐ¸Ñ Ð¸ оÑакване Excel да Ñ Ð¿Ñиложи.
Ðма едно ÑкÑиÑо пÑедимÑÑво на договоÑа Ñамо за ÑÑойноÑÑи: Ñой заÑиÑава инÑелекÑÑалнаÑа ÑобÑÑвеноÑÑ. ÐÑавило за ÑенообÑазÑване, оÑенено вÑв ваÑÐ¸Ñ Delphi пÑоÑÐµÑ Ð¸ изпÑаÑено каÑо ÑиÑло, не може да бÑде подложено на обÑаÑно инженеÑÑÑво Ð¾Ñ ÑабоÑнаÑа книга по наÑина, по койÑо би могло Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð° ÑоÑмÑла, и поÑÑебиÑелÑÑ Ð½Ðµ може да го наÑÑÑи ÑÑез ÑедакÑиÑане на междинна клеÑка. ÐенеÑаÑоÑиÑе на ÑакÑÑÑи, оÑÑеÑиÑе за комиÑионни и ÑаÑиÑниÑе каÑÑи поÑÑи винаги ÑÐ¿Ð°Ð´Ð°Ñ ÐºÑм Ñази каÑегоÑиÑ. СлÑÑаÑÑ, койÑо наиÑÑина Ñе нÑждае Ð¾Ñ Ð°ÐºÑивни ÑоÑмÑли, е инÑеÑакÑивниÑÑ Ð¼Ð¾Ð´ÐµÐ» за анализи Ñип "какво-ако", пÑи койÑо Ñе оÑаква клиенÑÑÑ Ð´Ð° пÑÐ¾Ð¼ÐµÐ½Ñ Ð²Ñ Ð¾Ð´Ð½Ð¸Ñе данни и да наблÑдава пÑомÑнаÑа на ÑÑмиÑе, и Ñе ÑÑÑбва да бÑÐ´Ð°Ñ Ð¸Ð·Ð³Ñадени Ð¾Ñ ÑобÑÑÐ²ÐµÐ½Ð¸Ñ ÑеÑник на Excel плÑÑ Ð´ÐµÑиниÑани имена.
Режими на изÑиÑление, иÑеÑаÑÐ¸Ñ Ð¸ R1C1: конÑÑолиÑе на XLS ÑаÑадаÑа
XLS ÑаÑадаÑа излага наÑÑÑойкиÑе за изÑиÑление на ниво BIFF, коиÑо Excel ÑеÑе Ð¾Ñ Ñайла. CalculationMode пÑиема xlCalcManual, xlCalcAutomatic (по подÑазбиÑане) или xlCalcAutomaticExceptTables и опÑÐµÐ´ÐµÐ»Ñ ÐºÐ°Ðº Ñе дÑÑжи Excel Ñлед оÑваÑÑнеÑо на Ñайла. РабоÑна книга Ñ Ñ
илÑди ÑоÑмÑли ÑеÑÑо е по-Ñдобно да бÑде доÑÑавена в ÑÑÑен Ñежим, Ñака Ñе полÑÑаÑелÑÑ Ð´Ð° ÑеÑи кога да Ñе ÑлÑÑи вÑлнаÑа Ð¾Ñ Ð¿ÑеизÑиÑлениÑ. EnableIteration (по подÑазбиÑане False), заедно Ñ MaxIterations (по подÑазбиÑане 100) и MaxIterationChange (по подÑазбиÑане 0.001), оÑклÑÑва ÑÑзнаÑелниÑе кÑÑгови пÑепÑаÑки Ð¾Ñ Ñипа на иÑеÑаÑивно Ñближаване, коиÑо Ñе поÑвÑÐ²Ð°Ñ Ð² нÑкои ÑинанÑови модели. ReferenceStyle пÑевклÑÑва Ð¼ÐµÐ¶Ð´Ñ A1 и R1C1 визÑализаÑиÑ, а UseFullPrecision оÑÑазÑва опÑиÑÑа на Excel за пÑеÑизноÑÑ ÑпоÑед визÑализаÑиÑÑа.
Тези ÑвойÑÑва живеÑÑ Ð² XLS ÑаÑадаÑа, заÑоÑо Ñе ÑÑпоÑÑавÑÑ Ñ BIFF запиÑи; пÑи генеÑиÑане на .xlsx планиÑайÑе ÑоÑмÑлиÑе Ñака, Ñе да не завиÑÑÑ Ð¾Ñ Ð¸ÑеÑаÑивни наÑÑÑойки, или изÑиÑлеÑе конвеÑгиÑаниÑе ÑÑойноÑÑи в Delphi и запиÑеÑе ÑезÑлÑаÑиÑе.
ÐаÑиви Ð¾Ñ ÑоÑмÑли: пÑблиÑнаÑа Ð²Ñ Ð¾Ð´Ð½Ð° ÑоÑка е XLSX
ÐÑÑаÑелиÑе CSE маÑиви Ð¾Ñ ÑоÑмÑли Ñе ÑÑÐ·Ð´Ð°Ð²Ð°Ñ ÑÑез TXLSXRange.SetArrayFormula:
// one array formula spanning A2:A4
Sheet.RCRange[2, 1, 4, 1].SetArrayFormula('A1*{1;2;3}');
ÐквиваленÑниÑÑ Ð¼ÐµÑод ÑÑÑеÑÑвÑва в йеÑаÑÑ Ð¸ÑÑа на клаÑовеÑе XLS, но Ñе намиÑа в ÑаÑÑна (private) ÑекÑиÑ, Ñака Ñе нÑма поддÑÑжан наÑин за ÑÑздаване на нови маÑиви Ð¾Ñ ÑоÑмÑли в .xls Ñайлове. СÑÑеÑÑвÑваÑиÑе в оÑвоÑениÑе Ñайлове Ñе пÑÐµÑ Ð²ÑÑлÑÑ Ð½ÐµÐ²Ñедими двÑпоÑоÑно; Ñова, коеÑо не можеÑе да напÑавиÑе, е да ги ÑÑздаваÑе. СледваÑоÑо пÑавило е доÑÑаÑÑÑно пÑоÑÑо: когаÑо ÑеманÑикаÑа на маÑивиÑе е ÑаÑÑ Ð¾Ñ Ð¸Ð·Ð¸ÑкванеÑо, наÑоÑеÑе Ñе кÑм .xlsx. Ðко оÑÑаÑÑл .xls кÑаен пÑодÑÐºÑ Ð½Ð°Ð¸ÑÑина Ñе нÑждае Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ на маÑив, пÑагмаÑиÑниÑÑ Ð½Ð°Ñин е да изÑиÑлиÑе ÑезÑлÑаÑа Ð¾Ñ Ð¼Ð°Ñива в Delphi и да запиÑеÑе оÑделниÑе ÑÑойноÑÑи в клеÑкиÑе.
Ðве ÑвÑÑзани ÑеÑива на Ñози ÑайÑ: деÑиниÑани имена и ÑоÑмÑли Ð¼ÐµÐ¶Ð´Ñ Ð»Ð¸ÑÑове покÑива ÑазÑеÑаванеÑо на имена, коеÑо двигаÑелÑÑ Ð¸Ð·Ð²ÑÑÑва, а ÑÑаÑиÑÑа за екÑпоÑÑиÑане на CSV и TSV опиÑва подÑобно поведениеÑо пÑи екÑпоÑÑиÑане, коеÑо пÑави Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ изÑиÑноÑо изÑиÑление. ÐÑлнаÑа ÑпÑавоÑна инÑоÑмаÑÐ¸Ñ Ð·Ð° двигаÑелÑ, вклÑÑиÑелно набоÑа Ð¾Ñ Ð¿Ð¾Ð´Ð´ÑÑжани ÑÑнкÑии, Ñе доÑÑÐ°Ð²Ñ Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа HotXLS.