ÐÑеименÑвайÑе лиÑÑ Ð¾Ñ âSummaryâ?на âOverviewâ?в генеÑиÑана книга и вÑÑка вÑÑÑеÑна ÑоÑмÑла, коÑÑо ÑоÑи кÑм Summary!A1, Ñе ÑпÑе да ÑабоÑи без ÑÑобÑение пÑи Ð·Ð°Ð¿Ð¸Ñ Ð¸Ð»Ð¸ оÑваÑÑне. ФоÑмÑлаÑа пÑодÑлжава да ÑÑÑеÑÑвÑва, но пÑепÑаÑкаÑа не води до никÑде. Ðодобен пÑоблем вÑзниква и пÑи пÑеобÑазÑване на .xls/.xlsx, когаÑо оÑноÑиÑелна вÑÑзка загÑби ÑелÑа Ñи. ÐеÑиниÑаноÑо име (defined name) е еÑикеÑ, койÑо Ð·Ð°Ð¼ÐµÐ½Ñ ÐºÐ¾Ð½ÑÑанÑа, диапазон или ÑоÑмÑла, ÑÑÑ
Ñанен веднÑж и използван Ñимволно навÑÑкÑде. СвÑÑзванеÑо на деÑиниÑани имена Ñ ÑоÑмÑли Ð¼ÐµÐ¶Ð´Ñ Ð»Ð¸ÑÑове позволÑва на ÑÑмаÑÐ½Ð¸Ñ Ð»Ð¸ÑÑ Ð´Ð° изÑиÑлÑва деÑÐ°Ð¹Ð»Ð½Ð¸Ñ ÑÑез Ñимволно име без ÑвÑÑдо зададени адÑеÑи, ÑоÑно Ñова, коеÑо Ñе изиÑква за Ð¾Ð´Ð¸Ñ Ð¾Ñ ÑÑеÑоводиÑели.
HotXLS пÑедлага доÑÑÑп до ÑаблиÑаÑа Ñ Ð¸Ð¼ÐµÐ½Ð° в XLS и XLSX ÑоÑмаÑиÑе, вклÑÑиÑелно вгÑадена маÑина за изÑиÑÐ»ÐµÐ½Ð¸Ñ Ð² пÑоÑеÑа на ÑабоÑа. ÐваÑа ÑоÑмаÑа обаÑе Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ ÑазлиÑни клаÑови йеÑаÑÑ Ð¸Ð¸ и ÑазликиÑе в ÑÐµÑ Ð½Ð¸Ñе API Ñа ÑеÑÑа пÑиÑина за гÑеÑки пÑи поÑÑване на код.
Ðва ÑпиÑÑка Ñ Ð¸Ð¼ÐµÐ½Ð° без Ð¾Ð±Ñ Ð¸Ð½ÑеÑÑейÑ
ÐÑ ÑÑÑана на XLS меÑодÑÑ TXLSWorkbook.GetNames вÑÑÑа колекÑиÑÑа IXLSNames, ÑиеÑо пÑеÑоваÑване Add(Name, RefersTo, Visible) запиÑва имеÑо в ÑаблиÑаÑа на BIFF. ÐлеменÑиÑе Ñе вÑÑÑÐ°Ñ ÐºÐ°Ñо обекÑи IXLSName, ÑÑдÑÑжаÑи име, ÑеÑеÑенÑÐ¸Ñ Ð¸ меÑод за изÑÑиване. ÐÑи XLSX колекÑиÑÑа TXLSXWorkbook.DefinedNames е Ð¾Ñ Ñип TXLSXDefinedNames Ñ Ð¼ÐµÑоди Add, FindByName и DeleteByName.
РазликиÑе в ÑÑÑÑенеÑо Ñе пÑоÑвÑÐ²Ð°Ñ Ð¿Ð¾ вÑеме на изпÑлнение. XLS колекÑиÑÑа поддÑÑжа ÑÑÑÑене Ñ Variant, Ñака Ñе и Names[0], и Names['TaxRate'] ÑабоÑÑÑ. XLSX колекÑиÑÑа нÑма Ñакова ÑвойÑÑво по подÑазбиÑане и изиÑква извикване на FindByName('TaxRate'), коеÑо вÑÑÑа nil пÑи липÑа на име. Ðод, напиÑан за еднаÑа ÑаÑада, Ñе компилиÑа за дÑÑгаÑа Ñамо по ÑлÑÑайноÑÑ Ð¸ гÑеÑкаÑа Ñе пÑоÑвÑва каÑо пÑазен доÑÑÑп (nil access) по вÑеме на изпÑлнение.
ÐÐ±Ñ Ð²Ð°ÑÑÑ Ðµ пÑÑвоÑо ÑеÑение пÑи ÑÑздаване
ÐеÑиниÑаноÑо име може да има обÑ
Ð²Ð°Ñ Ð½Ð° ниво ÑабоÑна книга (видимо навÑÑкÑде) или на ниво лиÑÑ (видимо Ñамо в него). Ð XLSX API Ñова Ñе опÑÐµÐ´ÐµÐ»Ñ Ð¾Ñ Ð½ÐµÐ·Ð°Ð´ÑлжиÑелен паÑамеÑÑÑ: DefinedNames.Add(AName, AFormula) ÑÑздава име на ниво книга, а Add(AName, AFormula, ASheetIndex) го обвÑÑзва Ñ ÐºÐ¾Ð½ÐºÑеÑен лиÑÑ. СвойÑÑвоÑо TXLSXDefinedName.SheetIndex вÑÑÑа -1 за обÑ
Ð²Ð°Ñ ÐºÐ½Ð¸Ð³Ð° и индекÑа на лиÑÑа в пÑоÑивен ÑлÑÑай.
ÐбÑ
ваÑÑÑ ÑлÑжи и как полиÑика за избÑгване на конÑликÑи. Excel позволÑва локално име Total на вÑеки лиÑÑ, какÑо и глобално Total, каÑо ÑоÑмÑлаÑа на лиÑÑа Ñазпознава пÑÑво локалноÑо. ÐÐ¸Ð·Ð½ÐµÑ Ð¿ÑавилаÑа, обÑи за ÑÐµÐ»Ð¸Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ (каÑо данÑÑни или валÑÑни кÑÑÑове), ÑÑÑбва да Ñе деÑиниÑÐ°Ñ Ð³Ð»Ð¾Ð±Ð°Ð»Ð½Ð¾. ÐомоÑниÑе диапазони, нÑжни Ñамо за един лиÑÑ, Ñа по-безопаÑни Ñ Ð»Ð¾ÐºÐ°Ð»ÐµÐ½ обÑ
ваÑ, за да Ñе Ð¸Ð·Ð±ÐµÐ³Ð½Ð°Ñ ÐºÐ¾Ð½ÑликÑи.
var
Book: TXLSXWorkbook;
Data, Summary: TXLSXWorksheet;
begin
Data := Book.Sheets.Add('Data');
Summary := Book.Sheets.Add('Summary');
// ... fill Data!A2:D100 with detail rows ...
Book.DefinedNames.Add('TaxRate', '0.08'); // workbook scope, a constant
Book.DefinedNames.Add('DataBlock', 'Data!$A$2:$D$100'); // workbook scope, a range
Book.DefinedNames.Add('LocalNote', 'Summary!$B$1', 1); // scoped to sheet index 1 only
// XLSX formulas take no leading '='
Summary.Cells[2, 2].Formula := 'SUM(Data!D2:D100)*TaxRate';
Book.SaveAs('model.xlsx');
end;
ÐмеÑо не е задÑлжиÑелно да ÑоÑи кÑм диапазон. ÐÑимеÑÑÑ TaxRate по-гоÑе ÑоÑи кÑм конÑÑанÑаÑа 0.08, коеÑо е най-ÑиÑÑиÑÑ Ð½Ð°Ñин за деÑиниÑане на Ð±Ð¸Ð·Ð½ÐµÑ Ð¿Ð°ÑамеÑÑи. ÐаÑамеÑÑÑÑÑ Ñе показва веднÑж в Name Manager, ÑоÑмÑлиÑе го Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ Ñимволно, а пÑомÑнаÑа Ð¼Ñ Ñе извÑÑÑва на едно мÑÑÑо в кода на генеÑаÑоÑа, вмеÑÑо да Ñе пÑеÑÑÑÑÐ²Ð°Ñ Ð´ÐµÑеÑки ÑоÑмÑли.
ÐнакÑÑ Ð·Ð° ÑавенÑÑво, койÑо пÑинадлежи Ñамо на еднаÑа ÑÑÑана
Това е мÑÑÑоÑо, кÑдеÑо поÑÑнаÑиÑÑ ÐºÐ¾Ð´ Ñе ÑÑпи най-ÑеÑÑо. XLS клеÑкиÑе полÑÑÐ°Ð²Ð°Ñ ÑоÑмÑли пÑез ÑвойÑÑвоÑо Value Ñ Ð²Ð¾Ð´ÐµÑ Ð·Ð½Ð°Ðº =. XLSX клеÑкиÑе Ð¸Ð¼Ð°Ñ Ð¾Ñделно ÑвойÑÑво Formula, коеÑо пÑиема изÑаза без знака за ÑавенÑÑво. Ðко запиÑеÑе '=SUM(A1:A10)' в TXLSXCell.Formula, знакÑÑ Ð·Ð° ÑавенÑÑво Ñе запазва каÑо ÑаÑÑ Ð¾Ñ Ð¸Ð·Ñаза и ÑоÑмÑлаÑа нÑма да ÑабоÑи.
var
Book: IXLSWorkbook; // interface-counted: do not Free
Names: IXLSNames;
begin
Book := TXLSWorkbook.Create;
// assume a sheet named 'Data' already holds the detail rows
Names := Book.GetNames;
Names.Add('TaxRate', '0.08');
Names.Add('Helper', 'Data!$A$2:$A$100', False); // False = hidden from the Name Manager
// XLS formulas go through Value, with the '=' prefix
Book.Sheets[1].Cells.Item[2, 2].Value := '=SUM(Data!A2:A100)*TaxRate';
Book.SaveAs('model.xls');
end;
Този пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð²Ð° оÑе две оÑобеноÑÑи на XLS ÑаÑадаÑа: колекÑиÑÑа Ð¾Ñ Ð»Ð¸ÑÑове запоÑва Ð¾Ñ 1 (докаÑо пÑи XLSX запоÑва Ð¾Ñ 0), а ÑÑеÑиÑÑ Ð¿Ð°ÑамеÑÑÑ Ð½Ð° Add позволÑва ÑÑздаване на ÑкÑиÑо име (използваемо вÑв ÑоÑмÑли, но невидимо в Name Manager). СкÑиÑиÑе имена Ñа подÑ
одÑÑи за ÑлÑжебни Ñели на генеÑаÑоÑа, коиÑо поÑÑебиÑелиÑе не ÑÑÑбва да пÑоменÑÑ.
ÐÑÑзки Ð¼ÐµÐ¶Ð´Ñ Ð»Ð¸ÑÑове и пÑомени в ÑедовеÑе
ÐвеÑе маÑини за ÑоÑмÑли пÑÐ¸ÐµÐ¼Ð°Ñ ÑÑандаÑÑÐ½Ð¸Ñ ÑинÑакÑÐ¸Ñ Ð·Ð° вÑÑзки Ð¼ÐµÐ¶Ð´Ñ Ð»Ð¸ÑÑове: обикновениÑе имена Ñе запиÑÐ²Ð°Ñ ÐºÐ°Ðº Data!A1, а Ñези Ñ Ð¸Ð½ÑеÑвали Ñе огÑÐ°Ð¶Ð´Ð°Ñ Ñ ÐµÐ´Ð¸Ð½Ð¸Ñни кавиÑки (напÑÐ¸Ð¼ÐµÑ 'Sheet With Space'!A1). ÐÑи деÑиниÑане на имена винаги ползвайÑе абÑолÑÑни адÑеÑи как Data!$A$2:$D$100. ÐÑноÑиÑелниÑе адÑеÑи Ñе изÑиÑлÑÐ²Ð°Ñ ÑпÑÑмо клеÑкаÑа, коÑÑо ги ползва, коеÑо може да доведе до гÑеÑки.
ÐÑомениÑе в ÑÑÑÑкÑÑÑаÑа Ñе оÑÑазÑÐ²Ð°Ñ Ð¿Ñавилно на XLSX именаÑа. ÐеÑодиÑе InsertRows и DeleteRows измеÑÑÐ²Ð°Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¸Ñе на именаÑа заедно Ñ ÐºÐ»ÐµÑкиÑе, обединениÑе облаÑÑи и диагÑамиÑе. ФоÑмÑлиÑе Ð¸Ð¼Ð°Ñ ÐµÐ´Ð½Ð¾ огÑаниÑение: вмÑкванеÑо на Ñед пÑÐ¾Ð¼ÐµÐ½Ñ Ñамо адÑеÑиÑе, наÑоÑени кÑм ÑедакÑиÑÐ°Ð½Ð¸Ñ Ð»Ð¸ÑÑ. ÐожеÑе леÑно да пÑовеÑиÑе ÑезÑлÑаÑа Ð¾Ñ Ð¸Ð·ÑиÑлениÑÑа Ñ Ð¼ÐµÑода Calculate:
// the calculation engine resolves names and cross-sheet references in-process
V := Book.Calculate('SUM(Data!D2:D100)*TaxRate');
if VarIsNumeric(V) then
Log('net total checks out: ' + FloatToStr(V));
ÐеÑодÑÑ Calculate оÑенÑва пÑоизволен изÑаз ÑпÑÑмо ÑекÑÑоÑо ÑÑÑÑоÑние без запиÑване на Ñайла, коеÑо го пÑави идеален за авÑомаÑиÑни ÑеÑÑове. ÐзÑиÑлеÑе оÑакванаÑа ÑÑойноÑÑ Ð² Pascal кода и Ñ ÑÑавнеÑе Ñ ÑезÑлÑаÑа Ð¾Ñ ÑоÑмÑлаÑа в Excel. ÐодÑобноÑÑи за ÑазÑиÑÑванеÑо на Ñози меÑ
анизÑм Ñ Ð²Ð°Ñи ÑÑнкÑии вижÑе в маÑинаÑа за ÑоÑмÑли на HotXLS.
СлÑжебниÑе имена _xlnm
Ðко оÑвоÑиÑе генеÑиÑан Ñайл Ñ Ð½Ð¸Ñконивоем инÑÑÑÑменÑ, Ñе оÑкÑиеÑе ÑлÑжебни имена каÑо _xlnm.Print_Area и _xlnm.Print_Titles. Така ÑÑандаÑÑа OOXML ÑÑÑ
ÑанÑва облаÑÑиÑе за пеÑÐ°Ñ Ð¸ заглавниÑе Ñедове. HotXLS ги ÑпÑавлÑва авÑомаÑиÑно пÑез ÑÑоÑвеÑниÑе ÑвойÑÑва на лиÑÑа (напÑÐ¸Ð¼ÐµÑ PrintArea или PrintTitleRows).
Ðе пÑоменÑйÑе ÑÑÑно Ñези ÑлÑжебни имена в пÑоÑÑÑанÑÑвоÑо _xlnm.. ÐадаванеÑо им пÑез DefinedNames.Add паÑалелно ÑÑÑ ÑвойÑÑваÑа на лиÑÑа води до конÑликÑи, коиÑо Excel ÑазÑеÑава по непÑедÑказÑем наÑин. РазглеждайÑе Ñези имена каÑо запазени за ÑвойÑÑваÑа на библиоÑекаÑа, опиÑани в заÑиÑа и наÑÑÑойки на ÑÑÑаниÑи.
ÐгÑаниÑÐµÐ½Ð¸Ñ Ð¿Ñи пÑоекÑиÑане
ÐеÑиниÑаниÑе имена не Ñе пÑеÑ
вÑÑлÑÑ Ð¿Ñи авÑомаÑиÑно пÑеобÑазÑване на .xls кÑм .xlsx Ñ Ð¼Ð¾ÑÑа SaveXLSWorkbookAsXLSX. Ð¢Ñ ÐºÐ¾Ð¿Ð¸Ñа Ñамо ÑÑойноÑÑиÑе и базовоÑо ÑоÑмаÑиÑане, Ñака Ñе именаÑа ÑÑÑбва да бÑÐ´Ð°Ñ Ð¿ÑеÑÑздадени ÑÑÑно Ñлед пÑеобÑазÑванеÑо. Това позволÑва и пÑавилноÑо им ÑÑÑÑкÑÑÑиÑане.
ÐÑÑг пÑоблем е неÑÑоÑвеÑÑÑвиеÑо Ð¼ÐµÐ¶Ð´Ñ ÑоÑмÑлиÑе и именаÑа на лиÑÑовеÑе. Excel авÑомаÑиÑно обновÑва пÑепÑаÑкиÑе пÑи пÑеименÑване в неговаÑа ÑÑеда, но в Pascal кода пÑомÑнаÑа на имеÑо на лиÑÑа на едно мÑÑÑо без обновÑване на ÑоÑмÑлиÑе на дÑÑго води до неÑабоÑеÑи ÑеÑеÑенÑии. ÐоддÑÑжайÑе имеÑо на лиÑÑа в единна Delphi конÑÑанÑа, използвана за ÑÑздаване и вÑв ÑоÑмÑлиÑе. Това ÑÑоÑвеÑÑÑва на пÑакÑикаÑа да Ñе наименÑÐ²Ð°Ñ Ð¸Ð·Ñ Ð¾Ð´Ð½Ð¸Ñе клеÑки â?Ñаблон Ñ Ð¸Ð¼Ðµ на кÑайнаÑа клеÑка пÑодÑлжава да ÑабоÑи, доÑи ако дизайнеÑÑÑ Ð²Ð¼Ñкне нови Ñедове над неÑ, какÑо е опиÑано в генеÑиÑане на оÑÑеÑи по Ñаблони.
ÐÑлноÑо опиÑание на деÑиниÑаниÑе имена и маÑинаÑа за ÑоÑмÑли за дваÑа ÑоÑмаÑа е ÑаÑÑ Ð¾Ñ Ð¿Ð°ÐºÐµÑа на HotXLS Component.