ÐÑедÑÑавеÑе Ñи авÑомаÑизиÑана задаÑа, коÑÑо генеÑиÑа ÑакÑÑÑа в код и Ñ Ð·Ð°Ð¿Ð¸Ñва каÑо CSV за импоÑÑиÑане в дÑÑга ÑиÑÑема. ЧиÑлаÑа Ð¸Ð·Ð³Ð»ÐµÐ¶Ð´Ð°Ñ Ð²ÑÑно в Excel, а CSV ÑайлÑÑ Ñе оÑваÑÑ Ð±ÐµÐ· пÑоблем в ÑекÑÑов ÑедакÑоÑ. Ðо импоÑÑеÑÑÑ Ð´Ð°Ð²Ð° гÑеÑка на колонаÑа за обÑа ÑÑма, ÑÑй каÑо клеÑкаÑа ÑÑдÑÑжа =SUM(D2:D41), ÑоÑмÑлаÑа как ÑекÑÑ, а не изÑиÑленаÑа ÑÑойноÑÑ. ÐÑиÑко ÑабоÑи ÑпоÑед ÑпеÑиÑикаÑиÑÑа, Ñова е оÑакваноÑо поведение в HotXLS. ÐодÑлÑÑ Ð·Ð° екÑпоÑÑ Ð·Ð°Ð¿Ð¸Ñва модела на клеÑкиÑе в ÑоÑÐ½Ð¸Ñ Ð¼Ñ Ð²Ð¸Ð´, а клеÑка Ñ ÑоÑмÑла, коÑÑо никога не е изÑиÑлÑвана, ÑÑдÑÑжа Ñамо ÑекÑÑа на ÑамаÑа ÑоÑмÑла.
ÐаÑо ваÑиÑÑ CSV Ñайл ÑÑдÑÑжа ÑоÑмÑли вмеÑÑо ÑиÑла
HotXLS ÑÑÑ
ÑанÑва ÑекÑÑа на ÑоÑмÑлаÑа и изÑиÑленаÑа ÑÑойноÑÑ ÐºÐ°Ðº два оÑделни паÑамеÑÑÑа. ÐеÑодÑÑ SaveAsCSV не ÑÑаÑÑиÑа маÑинаÑа за изÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿Ñи запиÑ, екÑпоÑÑÑÑ Ð½Ðµ ÑÑÑбва да пÑÐ¾Ð¼ÐµÐ½Ñ ÑабоÑнаÑа книга или да ÑиÑкÑва забавÑне пÑи Ñложни веÑиги Ð¾Ñ ÑоÑмÑли. ФайловеÑе, запиÑани Ð¾Ñ ÑÐ°Ð¼Ð¸Ñ Excel, ÑÑдÑÑÐ¶Ð°Ñ ÐºÐµÑиÑани ÑезÑлÑаÑи до ÑоÑмÑлиÑе, поÑади коеÑо повÑоÑниÑÑ Ð¸Ð¼ екÑпоÑÑ ÑабоÑи ÑпоÑед оÑакваниÑÑа. ÐÑоблемÑÑ Ð·Ð°ÑÑга генеÑиÑаниÑе Ð¾Ñ Ð²Ð°Ñ Ñайлове, пÑи коиÑо ÑоÑмÑлиÑе Ñа запиÑани, но не Ñа изÑиÑлени. РеÑениеÑо е да изÑиÑлиÑе ÑÑойноÑÑиÑе пÑеди екÑпоÑÑ ÑÑез меÑода Calculate, койÑо Ñазпознава вÑÑзкиÑе Ð¼ÐµÐ¶Ð´Ñ Ð»Ð¸ÑÑовеÑе и поÑÑебиÑелÑкиÑе ÑÑнкÑии:
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
R: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('invoice-run.xlsx');
Sheet := Book.Sheets[0];
// Materialize formula results so the CSV carries numbers, not '=...' text
for R := 2 to 41 do
if Sheet.Cells[R, 4].Formula <> '' then
Sheet.Cells[R, 4].Value := Book.Calculate(Sheet.Cells[R, 4].Formula);
Book.SaveAsCSV('feed.csv', 0, ','); // sheet 0, comma
Book.SaveAsCSV('feed.tsv', 0, #9); // same sheet as TSV
finally
Book.Free;
end;
end;
ÐбÑÑнеÑе внимание на ÑикÑла: Ñой Ð·Ð°Ð¼ÐµÐ½Ñ ÑоÑмÑлиÑе в клеÑкиÑе Ñ ÑеÑ
ниÑе изÑиÑлени ÑÑойноÑÑи. Това е пÑавилно за вÑеменен екÑпоÑÑ, но не и ако планиÑаÑе да запиÑеÑе книгаÑа оÑново каÑо .xlsx по-кÑÑно, ÑÑй каÑо ÑоÑмÑлиÑе Ñе бÑÐ´Ð°Ñ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ð¸ Ð¾Ñ ÑÑаÑиÑни ÑиÑла. ÐкÑпоÑÑиÑайÑе Ð¾Ñ ÐºÐ¾Ð¿Ð¸Ðµ или огÑаниÑеÑе запиÑванеÑо Ñамо до ÑекÑÑÐ¸Ñ Ð¿ÑоÑ
од. ÐÑзможноÑÑиÑе на Calculate, вклÑÑиÑелно ÑегиÑÑÑиÑане на ÑобÑÑвени ÑÑнкÑии, Ñа Ñазгледани в маÑинаÑа за ÑоÑмÑли на HotXLS и поÑÑебиÑелÑки ÑÑнкÑии.
Ðакво гаÑанÑиÑа модÑлÑÑ Ð·Ð° ÑекÑÑови Ñайлове Ñ ÑазделиÑели
CSV екÑпоÑÑÑÑ Ð³ÐµÐ½ÐµÑиÑа UTF-8 Ñайл Ñ BOM маÑÐºÐµÑ (byte order mark), CRLF завÑÑÑеÑи на ÑедовеÑе и пÑавила за ÑиÑиÑане по ÑÑандаÑÑа RFC 4180. ÐÑÑко поле, ÑÑдÑÑжаÑо ÑазделиÑел, кавиÑка или пÑекÑÑване на Ñед, Ñе огÑажда Ñ ÐºÐ°Ð²Ð¸Ñки, а вгÑадениÑе кавиÑки Ñе ÑдвоÑваÑ. ÐаÑиÑе Ñе запиÑÐ²Ð°Ñ Ð²Ñв ÑоÑÐ¼Ð°Ñ yyyy-mm-dd hh:nn:ss незавиÑимо Ð¾Ñ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¾Ñо ÑоÑмаÑиÑане в клеÑкаÑа. Това е пÑавилноÑо ÑеÑение за маÑинна обÑабоÑка, Ð¼Ð°ÐºÐ°Ñ Ð´Ð° изненадва поÑÑебиÑели, коиÑо оÑÐ°ÐºÐ²Ð°Ñ Ð²Ð¸Ð·ÑалноÑо оÑоÑмление на екÑана да Ñе запази. ÐлеÑкиÑе Ñ ÑоÑмаÑиÑан ÑекÑÑ Ñе обединÑÐ²Ð°Ñ Ð² един ÑиÑÑ Ð½Ð¸Ð·.
Тези наÑÑÑойки ÑеÑÐ°Ð²Ð°Ñ Ð¿Ð¾Ð²ÐµÑеÑо пÑоблеми Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑанеÑо, но две Ð¾Ñ ÑÑÑ
ÑÑÑбва да пÑиÑÑÑÑÐ²Ð°Ñ Ð²Ñв ваÑиÑе ÑпеÑиÑикаÑии. ÐÑÑваÑа е BOM маÑкеÑÑÑ, Ñой позволÑва на Excel да оÑваÑÑ Ñайла Ñ Ð¿Ñавилно кодиÑани ÑпеÑиални Ñимволи, но нÑкои ÑÑÑоги паÑÑеÑи го пÑÐ¸ÐµÐ¼Ð°Ñ ÐºÐ°Ñо данни; в ÑакÑв ÑлÑÑай го пÑемаÑ
неÑе ÑÑÑно. ÐÑоÑаÑа е TSV ÑоÑмаÑÑÑ, Ñой ползва ÑÑÑÐ¸Ñ Ð¼ÐµÑ
анизÑм, извикан Ñ ÑазделиÑел ÑабÑлаÑÐ¸Ñ (#9), Ñака Ñе вÑиÑко опиÑано по-гоÑе е в Ñила. ÐиÑÑÑÑ Ð·Ð° екÑпоÑÑ Ñе избиÑа по Ð¸Ð½Ð´ÐµÐºÑ (базиÑан на 0) пÑи по-дÑлгоÑо пÑеÑоваÑване на меÑода, докаÑо кÑаÑкиÑÑ Ð²Ð°ÑÐ¸Ð°Ð½Ñ SaveAsCSV(FileName) запиÑва акÑÐ¸Ð²Ð½Ð¸Ñ Ð»Ð¸ÑÑ.
HTML екÑпоÑÑÑÑ Ðµ моменÑна Ñнимка, а не ÑоÑÐ¼Ð°Ñ Ð·Ð° обмен
ÐокаÑо CSV запазва Ñамо ÑÑойноÑÑиÑе, меÑодÑÑ SaveAsHTML Ñе опиÑва да ÑÑÑ
Ñани вÑнÑÐ½Ð¸Ñ Ð²Ð¸Ð´: една <table> на лиÑÑ, обединениÑе облаÑÑи как colspan и rowspan и оÑновни ÑÑилове, вгÑадени каÑо CSS. ЦвеÑовеÑе Ð¾Ñ ÑемиÑе Ñе пÑопÑÑкаÑ, вмеÑÑо да Ñе изÑиÑлÑваÑ, Ñака Ñе Ñаблони Ñ ÑвеÑове Ð¾Ñ Ñеми Ñе Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ñ Ð¿Ð¾-Ñемпли в HTML. ÐадавайÑе изÑиÑни RGB ÑвеÑове на вÑиÑко, коеÑо ÑÑÑбва да Ñе запази. ÐпÑииÑе Ñе ÑпÑавлÑÐ²Ð°Ñ Ð¾Ñ ÑÑоÑвеÑÐ½Ð¸Ñ Ð¾Ð±ÐµÐºÑ:
var
Opts: TXLSXHtmlExportOptions;
begin
Opts := TXLSXHtmlExportOptions.Create;
try
Opts.Title := 'Weekly settlement';
Opts.TableClass := 'report-grid'; // hook for the host page stylesheet
Opts.WriteDocument := True; // full page, not a fragment
if Book.SaveAsHTML('settlement.html', 0, Opts) <> 0 then
raise Exception.Create('Sheet index out of range');
finally
Opts.Free;
end;
end;
Ðве подÑобноÑÑи в Ñози пÑÐ¸Ð¼ÐµÑ Ð·Ð°ÑлÑÐ¶Ð°Ð²Ð°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ. ÐадайÑе WriteDocument на False и изÑ
одÑÑ Ñе бÑде ÑиÑÑ ÑаблиÑен ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð²Ð¼ÐµÑÑо ÑÑла ÑÑÑаниÑа, коеÑо е подÑ
одÑÑо пÑи вгÑаждане на пÑеглед в ÑÑÑеÑÑвÑÐ²Ð°Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½, наÑÑÑойÑе TableClass и оÑÑавеÑе ÑÑиловеÑе на Ñ
оÑÑ ÑÑÑаниÑаÑа да Ñе погÑÐ¸Ð¶Ð°Ñ Ð·Ð° оÑоÑмлениеÑо. ÐÑÑнаÑаÑа ÑÑойноÑÑ ÑÑÑо е ÑазлиÑна: SaveAsHTML вÑÑÑа 0 пÑи ÑÑпеÑ
и -1 пÑи гÑеÑен Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° лиÑÑ, Ñака Ñе обиÑайнаÑа пÑовеÑка за = 1 Ñе оÑÑеÑе ÑÑпеÑÐ½Ð¸Ñ ÐµÐºÑпоÑÑ ÐºÐ°Ñо гÑеÑка. ÐогаÑо Ñе нÑждаеÑе Ð¾Ñ Ð¾Ð¿Ñеделена облаÑÑ, меÑодÑÑ TXLSXRange.SaveAsHTML екÑпоÑÑиÑа пÑавоÑгÑлен диапазон по ÑÑÑиÑе пÑавила.
RTF Ð¸Ð·Ñ Ð¾Ð´ и кÑде вÑе оÑе Ñе използва
ЧеÑвÑÑÑиÑÑ ÑоÑÐ¼Ð°Ñ Ð³ÐµÐ½ÐµÑиÑа RTF 1.6 ÑаблиÑи за един лиÑÑ ÑÑез SaveAsRTF. ШиÑиниÑе на колониÑе Ñе изÑиÑлÑÐ²Ð°Ñ Ð¿ÑиблизиÑелно каÑо 96 twips за вÑеки знак ÑиÑина на колонаÑа. СÑÑÑкÑÑÑноÑо огÑаниÑение ÑÑк е, Ñе обединениÑе клеÑки не Ñе поддÑÑÐ¶Ð°Ñ Ð² изÑ
ода, Ñамо водеÑаÑа клеÑка ÑÑдÑÑжа инÑоÑмаÑиÑ, а покÑиÑиÑе Ñе запиÑÐ²Ð°Ñ ÐºÐ°Ñо пÑазни. Това пÑави RTF неподÑ
одÑÑ Ð·Ð° Ñложни оÑоÑмлениÑ, но Ñой оÑÑава леÑно ÑеÑение за пÑеÑ
вÑÑлÑне на ÑаблиÑни данни в ÑекÑÑообÑабоÑваÑи пÑогÑами или по-ÑÑаÑи ÑиÑÑеми за ÑпÑавление на докÑменÑи, коиÑо не поддÑÑÐ¶Ð°Ñ HTML.
ÐвÑпоÑоÑен обмен: импоÑÑиÑанеÑо на CSV изÑÑива данниÑе по дизайн
ЧеÑенеÑо на CSV има Ñвои оÑобеноÑÑи. ÐеÑодÑÑ OpenCSV изÑиÑÑва ÑÑлаÑа ÑабоÑна книга и Ñ Ð¿ÑеÑÑÑÑкÑÑÑиÑа каÑо единиÑен лиÑÑ Ñ Ð¸Ð¼Ðµ Sheet1. Той ÑабоÑи каÑо конÑÑÑÑкÑоÑ, а не каÑо обединÑване на данни, Ñака Ñе никога не го извиквайÑе за книга ÑÑÑ Ð½ÐµÐ·Ð°Ð¿Ð¸Ñано ÑÑдÑÑжание. ÐодаванеÑо на #0 каÑо ÑазделиÑел акÑивиÑа авÑомаÑиÑно оÑкÑиване. ФлагÑÑ ADetectTypes ÑпÑавлÑва ÑазпознаванеÑо на Ñипове: пÑи ÑÑойноÑÑ true ÑиÑÑовиÑе низове ÑÑÐ°Ð²Ð°Ñ ÑиÑла, ISO-8601 низовеÑе, даÑи, а ÑÑойноÑÑиÑе true/false, бÑлеви пÑоменливи. ÐзклÑÑеÑе го, когаÑо данниÑе ÑÑдÑÑÐ¶Ð°Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑи Ñ Ð²Ð¾Ð´ÐµÑи нÑли (напÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÑенÑки кодове или пÑодÑкÑови кодове), ÑÑй каÑо водеÑаÑа нÑла Ñе изÑезне пÑи авÑомаÑиÑноÑо пÑеобÑазÑване на 00123 в 123. ÐвеÑе ÑаÑади пÑÐµÐ´Ð»Ð°Ð³Ð°Ñ ÐµÐ´Ð½Ð°ÐºÑв импоÑÑ, в ÑÑÑеÑание Ñ ÐµÐºÑпоÑÑа Ñова оÑигÑÑÑва пÑеобÑазÑване без нÑжда Ð¾Ñ Excel, какÑо е опиÑано в генеÑиÑане на Excel оÑÑеÑи Ð¾Ñ Ð±Ð°Ð·Ð¸ данни Ñ HotXLS.
ÐкÑпоÑÑиÑане диÑекÑно в поÑок
ÐÑеки меÑод за Ð·Ð°Ð¿Ð¸Ñ ÑÑк има веÑÑÐ¸Ñ Ð·Ð° ÑабоÑа Ñ Ð¿Ð¾Ñок (TStream), Ñазположена до ÑайловаÑа веÑÑÐ¸Ñ (за CSV, HTML, RTF и ÑамиÑе ÑабоÑни книги). Ð ÑÑÑвÑÑен код Ñова е пÑепоÑÑÑиÑелниÑÑ Ð¿ÑÑ. Уеб ÑÑлÑга, пÑедлагаÑа ÑвалÑне на CSV, може да запиÑе данниÑе в TMemoryStream и да го пÑепÑедаде диÑекÑно кÑм обекÑа за оÑговоÑ, без вÑеменни Ñайлове, задаÑи за поÑиÑÑване или конÑликÑи Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð°Ñалелни заÑвки Ñ ÐµÐ´Ð½Ð°ÐºÐ²Ð¸ имена. СÑÑоÑо важи пÑи Ð·Ð°Ð¿Ð¸Ñ Ð² облаÑни Ñ
ÑанилиÑа или изпÑаÑане по поÑа, каÑо ÑайловаÑа ÑиÑÑема Ñе изклÑÑва напÑлно.
Този Ð¿Ð¾Ð´Ñ Ð¾Ð´ ÑÑоÑвеÑÑÑва на модела за внедÑÑване на библиоÑекаÑа. ÐвеÑе ÑаÑади Ñа ÑазÑабоÑени на ÑиÑÑ Object Pascal и не завиÑÑÑ Ð¾Ñ Excel, COM авÑомаÑизаÑÐ¸Ñ Ð¸Ð»Ð¸ ÑиÑÑемни пÑоÑеÑи на ÑÑÑвÑÑа. ÐÑÑка заÑвка може да ÑÑздаде ÑÐ²Ð¾Ñ ÑабоÑна книга, да изпÑлни изÑиÑлениÑÑа и да запиÑе Ð¸Ð·Ñ Ð¾Ð´Ð° паÑалелно. ÐÑновниÑÑ ÑеÑÑÑÑ Ð·Ð° наблÑдение е опеÑаÑивнаÑа памеÑ. ТÑй каÑо моделÑÑ Ð½Ð° книгаÑа Ñе ÑÑÑ ÑанÑва в RAM по вÑеме на екÑпоÑÑа, за много големи Ñайлове е пÑепоÑÑÑиÑелно да огÑаниÑиÑе паÑалелниÑе задаÑи или да ги опаковаÑе на опаÑка, за да избегнеÑе пикове в поÑÑеблениеÑо.
Ðалка подÑобноÑÑ: задайÑе IncludeBOM на опÑииÑе за HTML, когаÑо ÑÑагменÑÑÑ Ñе Ñе запиÑва каÑо оÑделен Ñайл, ÑиеÑо кодиÑане Ñе пÑовеÑÑва Ð¾Ñ Ð´ÑÑги инÑÑÑÑменÑи. ÐÑи диÑекÑно изпÑаÑане по HTTP оÑÑавеÑе деÑиниÑанеÑо на кодиÑовкаÑа на заглавниÑе ÑаÑÑи (response headers) на ÑÑÑвÑÑа.
ÐогаÑо байÑовеÑе Ñе Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ñ Ð³ÑеÑно
Ðай-ÑеÑÑиÑÑ Ð²ÑпÑÐ¾Ñ Ð·Ð° поддÑÑжка пÑи CSV екÑпоÑÑ Ðµ ÑвÑÑзан Ñ Ð³ÑеÑно кодиÑане, в Excel Ñе Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ñ Ð½ÐµÑеÑливи Ñимволи (mojibake) вмеÑÑо ÑпеÑиалниÑе бÑкви. ÐÑÑваÑа ÑеакÑÐ¸Ñ Ðµ да Ñе обвини модÑлÑÑ Ð·Ð° запиÑ, но Ñой генеÑиÑа UTF-8 BOM маÑÐºÐµÑ ÑоÑно за да пÑедоÑвÑаÑи Ñова, и ÑайлÑÑ Ð¾Ð±Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¾ е коÑекÑен. ÐÑоблемÑÑ Ðµ, Ñе нÑкой пÑоÑÐµÑ Ð¿Ð¾ ÑÑаÑеÑо е пÑемаÑ
нал BOM маÑкеÑа, напÑÐ¸Ð¼ÐµÑ ÑÑанÑÑÐµÑ Ð¿Ð¾ FTP в ÑекÑÑов Ñежим, копиÑане на поÑок, коеÑо пÑопÑÑка пÑÑвиÑе ÑÑи байÑа, или пÑокÑи ÑÑÑвÑÑ Ñ Ð¿ÑекодиÑане. ÐиагноÑÑиÑиÑайÑе Ñова на гÑаниÑаÑа, а не в ÑамоÑо извикване. ÐÑвоÑеÑе полÑÑÐµÐ½Ð¸Ñ Ñайл в ÑеÑÑнадеÑеÑиÑен (hex) ÑедакÑÐ¾Ñ Ð¸ поÑвÑÑдеÑе, Ñе пÑÑвиÑе ÑÑи байÑа Ñа EF BB BF.
Това е обÑоÑо пÑавило за ÑеÑиÑиÑе ÑоÑмаÑа. СамиÑÑ ÐµÐºÑпоÑÑ Ðµ леÑен, а HotXLS пÑави опÑимален Ð¸Ð·Ð±Ð¾Ñ Ð¿Ñи вÑÑко ÑеÑение на модÑла за запиÑ. ÐÑоблемиÑе вÑÐ·Ð½Ð¸ÐºÐ²Ð°Ñ Ð² ÑоÑкиÑе на ÑвÑÑзване, когаÑо ÑоÑмÑлаÑа ÑÑеÑне паÑÑеÑ, оÑÐ°ÐºÐ²Ð°Ñ ÑиÑло, когаÑо BOM маÑкеÑÑÑ ÑÑеÑне ÑÑанÑпоÑÑ, койÑо не го ÑÑÑ ÑанÑва, или когаÑо обединена клеÑка ÑÑеÑне плоÑÐºÐ¸Ñ Ð¼Ð¾Ð´ÐµÐ» на RTF. ÐÑеки Ð¾Ñ Ñези ÑакÑи ÑÑÑбва да бÑде опиÑан в договоÑа Ð¼ÐµÐ¶Ð´Ñ Ð²Ð°ÑÐ¸Ñ Ð¼Ð¾Ð´Ñл за екÑпоÑÑ Ð¸ ÑиÑÑемаÑа, коÑÑо ÑеÑе данниÑе, ÑÑй каÑо ÑÑ Ð½Ðµ може да гадае ваÑиÑе намеÑÐµÐ½Ð¸Ñ Ð¿Ð¾ байÑовеÑе. ÐÑлниÑÑ ÑпиÑÑк Ñ Ð¼ÐµÑоди е доÑÑÑпен на пÑодÑкÑоваÑа ÑÑÑаниÑа на HotXLS Component.