ÐадаÑаÑа по маÑово ноÑмализиÑане на елекÑÑонни ÑаблиÑи е ÑÑи пÑоблема под едно намеÑало. ÐмаÑе аÑÑ
ив Ð¾Ñ ÑмеÑени ÑоÑмаÑи: .xls Ð¾Ñ ÐµÑаÑа на BIFF, модеÑен .xlsx, ÑазпÑÑÑнаÑи .ods Ñайлове Ð¾Ñ Ð½Ñкой екÑпеÑÐ¸Ð¼ÐµÐ½Ñ Ñ LibreOffice и Ñепа Ñайлове, коиÑо никой не може да оÑвоÑи, заÑоÑо паÑолаÑа е Ñи оÑиÑла Ñ Ð±Ð¸Ð²Ñ ÑлÑжиÑел. ЦелÑа е вÑиÑко да Ñе конвеÑÑиÑа в XLSX и CSV. ÐеÑÑиÑÑа на Ñази задаÑа, коÑÑо повеÑеÑо Ñ
оÑа пиÑаÑ, е ÑикÑл, койÑо оÑваÑÑ Ð²Ñеки Ñайл и го запиÑва под ново ÑазÑиÑение, и Ñова ÑабоÑи ÑоÑно докаÑо нÑкой не попиÑа кои Ñайлове Ñа загÑбили ÑвоиÑе диагÑами, изпÑÑнали Ñа макÑоÑиÑе Ñи или изобÑо не Ñа Ñе оÑвоÑили. ЦикÑлÑÑ Ð½Ñма оÑговоÑ, заÑоÑо ÑамоÑо конвеÑÑиÑане не пази запиÑ. Ðдин ÑабоÑен Ð¿Ð»Ð¾Ñ Ð¾Ð±Ð°Ñе пази: Ñой пÑÑво опиÑва, вÑоÑо конвеÑÑиÑа и ÑÑеÑо пÑовеÑÑва, и ÑÑиÑе еÑапа ÑÑÑбва да ÑподелÑÑ Ð¸Ð½ÑоÑмаÑиÑ, за да бÑде вÑиÑко Ñова надеждно.
СглобÑванеÑо на Ñози ÑабоÑен Ð¿Ð»Ð¾Ñ Ð² Delphi или C++Builder ознаÑава ÑвÑÑзване на ÑеÑиÑи вÑзможноÑÑи на HotXLS, ниÑо една Ð¾Ñ ÐºÐ¾Ð¸Ñо не изиÑква инÑÑалиÑан Excel никÑде в пÑоÑеÑа. Ðма два вгÑадени двигаÑелÑ, BIFF8 инÑеÑÑÐµÐ¹Ñ Ð·Ð° .xls и OOXML инÑеÑÑÐµÐ¹Ñ Ð·Ð° .xlsx и .ods. Ðма евÑини ÑондиÑаÑи извикваниÑ, коиÑо ÑеÑÐ°Ñ Ð¼ÐµÑаданни, без да анализиÑÐ°Ñ ÑÐµÐ»Ð¸Ñ Ñайл. Ðма бÑоÑÑи за Ð¾Ð´Ð¸Ñ Ð½Ð° вÑеки лиÑÑ, коиÑо ви ÐºÐ°Ð·Ð²Ð°Ñ ÐºÐ°ÐºÐ²Ð¾ вÑÑÑноÑÑ ÑÑдÑÑжа ÑабоÑнаÑа книга. Рима маÑÑиÑа за конвеÑÑиÑане Ñ Ð´Ð¾ÐºÑменÑиÑан пÑоÑил на вÑÑноÑÑ Ð·Ð° вÑеки маÑÑÑÑÑ. РабоÑаÑа Ñе ÑÑÑÑои в Ñова да знаеÑе кÑде вÑеки Ð¾Ñ ÑÑÑ
има оÑÑÑÑ ÑÑб, заÑоÑо вÑеки Ð¾Ñ ÑÑÑ
има, и Ñези ÑÑбове Ñа ÑоÑно неÑаÑа, коиÑо пÑевÑÑÑÐ°Ñ Ð±ÐµÐ·Ð¿ÑоблемнаÑа ноÑна пакеÑна обÑабоÑка в инÑÐ¸Ð´ÐµÐ½Ñ Ð² понеделник ÑÑÑÑин.
СондиÑане пÑеди заÑеждане: имена на лиÑÑове и оÑкÑиване на ÑиÑÑиÑане
ÐÑваÑÑнеÑо на ÑабоÑна книга Ð¾Ñ 200 MB Ñамо за да оÑкÑиеÑе, Ñе е ÑиÑÑиÑана, гÑби минÑÑи за вÑеки Ñайл, а Ñмножено по голÑм аÑÑ
ив, Ñова гÑби дни. РдваÑа инÑеÑÑейÑа пÑедоÑÑавÑÑ GetSheetNames, койÑо ÑеÑе меÑаданниÑе на лиÑÑа, без да попÑлва ÑабоÑнаÑа книга. ÐнедÑÑванеÑо на BIFF ÑканиÑа Ñамо запиÑиÑе BoundSheet в пÑеднаÑа ÑаÑÑ Ð½Ð° поÑока; внедÑÑванеÑо на OOXML ÑеÑе Ñамо workbook.xml в zip аÑÑ
ива. ÐаÑед Ñ Ñова, CanReadEncrypted оÑкÑива конÑÐµÐ¹Ð½ÐµÑ Ñ ÑиÑÑиÑане, без да пÑави опиÑи за деÑиÑÑиÑане:
var
Probe: TXLSXWorkbook;
Names: TStringList;
begin
Names := TStringList.Create;
Probe := TXLSXWorkbook.Create;
try
if Probe.CanReadEncrypted(FileName) then
begin
Writeln(FileName + ': encrypted container - route to manual handling');
Exit;
end;
if Probe.GetSheetNames(FileName, Names) <= 0 then
Writeln(FileName + ': unreadable - quarantine')
else
Writeln(Format('%s: %d sheet(s), first "%s"',
[FileName, Names.Count, Names[0]]));
finally
Probe.Free;
Names.Free;
end;
end;
Ðве опеÑаÑивни подÑобноÑÑи пÑавÑÑ Ñози ÑикÑл лек. GetSheetNames не нÑлиÑа или попÑлва екземплÑÑа на ÑабоÑнаÑа книга, Ñака Ñе един обекÑ-Ñонда може да клаÑиÑиÑиÑа Ñ
илÑди Ñайлове, без да Ñе пÑеÑÑздава. РвеÑÑиÑÑа на ÑÑÑоÑо извикване за XLS инÑеÑÑейÑа ÑазбиÑа и .xlsx пакеÑи, коеÑо го пÑави Ñдобна единиÑна Ñонда, когаÑо ÑазÑиÑениÑÑа на ÑайловеÑе не Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° бÑÐ´Ð°Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð½Ð¸ â?а Ñе ÑÑдко Ñа в аÑÑ
ив на Ñакава вÑзÑаÑÑ. СоÑÑиÑанеÑо пÑеди заÑеждане заÑлÑжава ÑамоÑÑоÑÑелно Ñазглеждане; меÑ
аникаÑа на олекоÑенаÑа инÑпекÑÐ¸Ñ Ðµ опиÑана в наÑаÑа ÑÑаÑÐ¸Ñ Ð·Ð° ÑпиÑÑка Ñ Ð»Ð¸ÑÑове и олекоÑена инÑпекÑÐ¸Ñ Ð½Ð° ÑабоÑни книги.
ÐÑебÑоÑване на ÑеалноÑо ÑÑдÑÑжание на ÑабоÑнаÑа книга
След каÑо даден Ñайл пÑемине ÑоÑÑиÑанеÑо, одиÑниÑÑ Ð¿Ñеглед ÑеÑава Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ Ð¼Ð°ÑÑÑÑÑ Ð·Ð° конвеÑÑиÑане. ÐнÑеÑÑейÑÑÑ Ð½Ð° XLSX пÑедоÑÑавÑÑ Ð±ÑоÑÑ Ð·Ð° вÑÑка гÑÑпа ÑÑнкÑии, коиÑо влиÑÑÑ Ð½Ð° ÑеÑениеÑо за ÑоÑноÑÑ: обединени клеÑки, диагÑами, изобÑажениÑ, ÑÑловни ÑоÑмаÑи, валидиÑане на данни, ÑаблиÑи, Ñ Ð¸Ð¿ÐµÑвÑÑзки и коменÑаÑи, плÑÑ Ñлагове на ниво ÑабоÑна книга за макÑоÑи, заÑиÑа и Ð¸Ð·Ñ Ð¾Ð´ÐµÐ½ ÑоÑмаÑ. ÐаÑÑÑÑÑÑÑ Ð½Ð° конвеÑÑиÑане за даден Ñайл завиÑи поÑÑи изÑÑло Ð¾Ñ Ñова кои Ð¾Ñ ÑÑÑ Ñе вÑÑÑÐ°Ñ ÐºÐ°Ñо ненÑлеви ÑÑойноÑÑи.
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
I: Integer;
begin
Book := TXLSXWorkbook.Create;
try
if Book.Open(FileName) <> 1 then Exit;
for I := 0 to Book.Sheets.Count - 1 do
begin
Sheet := Book.Sheets[I];
Writeln(Format('%s: cells=%d merges=%d charts=%d cf=%d dv=%d protected=%s',
[Sheet.Name, Sheet.Cells.Count, Sheet.MergedCells.Count,
Sheet.Charts.Count, Sheet.ConditionalFormats.Count,
Sheet.DataValidations.Count, BoolToStr(Sheet.IsProtected, True)]));
end;
if Book.HasVbaProject then
Writeln(' contains VBA project - macro policy applies');
if Book.ExternalLinks.Count > 0 then
Writeln(Format(' %d external link(s)', [Book.ExternalLinks.Count]));
finally
Book.Free;
end;
end;
ЧеÑеÑе Cells.Count Ñ ÐµÐ´Ð½Ð¾ важно пÑедÑпÑеждение. Ð¥ÑанилиÑеÑо за клеÑки е ÑазÑедено (sparse), Ñака Ñе ÑиÑлоÑо оÑÑиÑа ÑÑздадениÑе клеÑки, а не пÑавоÑгÑлнаÑа облаÑÑ Ð½Ð° Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½. ÐиÑÑ Ñ ÐµÐ´Ð½Ð° ÑÑойноÑÑ Ð² A1 и дÑÑга в ZZ9999 оÑÑиÑа две клеÑки, а не милиона и неÑо, коиÑо Ð»ÐµÐ¶Ð°Ñ Ð¼ÐµÐ¶Ð´Ñ ÑÑÑ
. ÐквиваленÑноÑо ÑканиÑане Ð¾Ñ ÑÑÑанаÑа на BIFF използва гÑаниÑиÑе на UsedRange заедно Ñ ForEachCell и ноÑи гÑеÑкаÑа Ñ ÐµÐ´Ð¸Ð½Ð¸Ñа (off-by-one), коÑÑо обÑÑква поÑÑи вÑеки пÑÑÐ²Ð¸Ñ Ð¿ÑÑ: UsedRange.FirstRow и неговиÑе ÑÑодни ÑвойÑÑва Ñа базиÑани на 0, докаÑо Cells.Item[Row, Col] е базиÑан на 1. ÐбÑ
ождане, коеÑо забÑÐ°Ð²Ñ Ð´Ð° добави единиÑа кÑм вÑÑка гÑаниÑа, одиÑиÑа гÑеÑÐ½Ð¸Ñ Ð¿ÑавоÑгÑлник и никога не ÑÑобÑава за Ñова.
Ðва лоÑÑа намалÑÐ²Ð°Ñ ÑенаÑа на пÑеминаванеÑо Ñамо за Ð¾Ð´Ð¸Ñ Ð¿Ñез големи ÑÑаÑи Ñайлове. ÐаÑÑÑойванеÑо на _DisableGraphics на true пÑеди оÑваÑÑнеÑо на .xls Ñайл пÑопÑÑка напÑлно анализа на ÑеÑÑÐ¾Ð¶Ð½Ð¸Ñ Ñлой OfficeArt пÑопÑÑка напÑлно, коеÑо ÑпеÑÑÑва Ñеално вÑеме пÑи ÑабоÑни книги, наÑиÑени Ñ ÑигÑÑи. Това обаÑе е ÑÑÑого опÑимизаÑÐ¸Ñ Ñамо за ÑеÑене: запиÑванеÑо Ð¾Ñ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»ÑÑ, оÑвоÑен по Ñози наÑин, би изÑ
вÑÑлило ÑиÑÑнкиÑе, коиÑо никога не Ñа били анализиÑани, Ñака Ñе ÑлагÑÑ Ð¿Ñинадлежи Ñамо на пÑÑиÑа, коиÑо никога нÑма да запиÑÐ°Ñ Ñайла обÑаÑно. ÐогаÑо одиÑÑÑ Ñе нÑждае Ð¾Ñ ÑÑдÑÑжание за вÑÑка клеÑка, а не Ð¾Ñ Ð±Ñойки, обÑаÑнаÑа ÑÑнкÑÐ¸Ñ (callback) ForEachCell обÑ
ожда диÑекÑно попÑлнениÑе клеÑки и избÑгва ÑежийниÑе ÑазÑ
оди за Variant пÑи вÑеки доÑÑÑп, коиÑо индекÑиÑаниÑе ÑвойÑÑва на клеÑкиÑе плаÑÐ°Ñ Ð¿Ñи вÑÑко ÑеÑене, коеÑо Ñе наÑÑÑпва бÑÑзо пÑи милиони клеÑки.
ÐоÑмализиÑайÑе неÑÑоÑвеÑÑÑваÑиÑе кодове за вÑÑÑане на Ñанен еÑап
ÐзвикваниÑÑа на вÑ
ода/изÑ
ода в HotXLS ÑÑобÑÐ°Ð²Ð°Ñ Ð·Ð° гÑеÑки ÑÑез ÑелоÑиÑлени ÑезÑлÑаÑи вмеÑÑо ÑÑез изклÑÑениÑ, и конвенÑииÑе не Ñа еднакви в ÑамкиÑе на API. ÐовеÑеÑо Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° оÑваÑÑне и Ð·Ð°Ð¿Ð¸Ñ Ð²ÑÑÑÐ°Ñ 1 пÑи ÑÑпеÑ
и -1 пÑи гÑеÑка. GetSheetNames вÑÑÑа бÑÐ¾Ñ Ð½Ð° лиÑÑовеÑе или -1 Ñ Ð¸Ð·ÑиÑÑен ÑпиÑÑк. XLSX SaveAsHTML оÑново наÑÑÑава модела и вÑÑÑа 0 за ÑÑпеÑ
, -1 за Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° лиÑÑ Ð¸Ð·Ð²Ñн диапазона. РабоÑен плоÑ, койÑо ÑеÑÑва за = 1 навÑÑкÑде, ÑиÑ
о Ñе клаÑиÑиÑиÑа погÑеÑно извикваниÑÑа, коиÑо ÑигнализиÑÐ°Ñ Ð·Ð° ÑÑпеÑ
по дÑÑг наÑин, а ÑакÑв, койÑо ÑеÑÑва за <> -1, Ñе пÑопÑÑне Ñези, коиÑо Ñе пÑовалÑÑ Ñ Ð´ÑÑг код.
ÐÑавилоÑо, коеÑо издÑÑжа конÑакÑа Ñ ÑÐµÐ»Ð¸Ñ API, е по-ÑÑÑно, оÑколкоÑо изглежда: ÑÑеÑиÑайÑе <= 0 каÑо неÑÑпеÑ
за извикваниÑÑа, вÑÑÑаÑи бÑой, пÑовеÑÑвайÑе докÑменÑиÑанаÑа ÑÑойноÑÑ Ð·Ð° ÑÑпеÑ
за вÑÑка ÑÑÑина за запиÑ, коÑÑо дейÑÑвиÑелно използваÑе, и поÑÑавеÑе двеÑе зад една малка ÑÑнкÑÐ¸Ñ Ð·Ð° пÑовеÑка на ÑезÑлÑаÑа, Ñака Ñе конвенÑиÑÑа да живее на ÑоÑно едно мÑÑÑо. ÐакеÑиÑе за обÑабоÑка Ñе пÑовалÑÑ Ð¼Ð½Ð¾Ð³Ð¾ по-ÑеÑÑо Ð¾Ñ Ð±Ð°Ð²Ð½Ð¾ наÑÑÑпване на непÑовеÑени кодове за вÑÑÑане, оÑколкоÑо Ð¾Ñ Ð½ÑкакÑв екÑзоÑиÑен бÑг на паÑÑеÑа, и ÑенаÑа на Ñази гÑеÑка Ñе плаÑа ÑеÑиÑидеÑÐµÑ Ñ
илÑди Ñайла по-кÑÑно, когаÑо никой не помни кои конвеÑÑиÑÐ°Ð½Ð¸Ñ Ð²ÑÑÑноÑÑ Ñа ÑÑпели.
ÐаÑÑиÑаÑа за конвеÑÑиÑане и кÑде вÑеки пÑÑ Ð³Ñби данни
ÐваÑа инÑеÑÑейÑа ÑазделÑÑ ÑабоÑаÑа по конвеÑÑиÑанеÑо Ð¿Ð¾Ð¼ÐµÐ¶Ð´Ñ Ñи. TXLSXWorkbook оÑваÑÑ XLSX, ODS и CSV и запиÑва XLSX, ODS, CSV, HTML, RTF и AES-ÑиÑÑиÑан XLSX. TXLSWorkbook оÑваÑÑ Ð¸ запиÑва BIFF и екÑпоÑÑиÑа HTML, RTF и CSV. ÐолезноÑо е, Ñе вÑеки пÑÑ Ð¸Ð´Ð²Ð° Ñ Ð´Ð¾ÐºÑменÑиÑан пÑоÑил на вÑÑноÑÑ, а не Ñ Ð½ÐµÑÑно обеÑание за коÑекÑноÑÑ, Ñака Ñе можеÑе да ÑеÑиÑе пÑедваÑиÑелно кои маÑÑÑÑÑи Ñа безопаÑни за кои Ñайлове.
ÐкÑпоÑÑÑÑ Ð½Ð° CSV запиÑва UTF-8 Ñ BOM, CRLF кÑаиÑа на Ñедове и ÑиÑиÑане по RFC 4180. Това, коеÑо Ñой не пÑави, е да изÑиÑлÑва ÑоÑмÑли: клеÑка, ÑÑдÑÑжаÑа =SUM(...), Ñе екÑпоÑÑиÑа каÑо бÑквален ÑекÑÑ Ð½Ð° ÑоÑмÑлаÑа, Ñака Ñе лиÑÑ Ñ ÑоÑмÑли Ñе пÑевÑÑÑа в лиÑÑ Ð¾Ñ Ð½Ð¸Ð·Ð¾Ð²Ðµ, оÑвен ако пÑÑво не изÑиÑлиÑе ÑÑойноÑÑиÑе. ÐкÑпоÑÑÑÑ Ð½Ð° HTML генеÑиÑа единиÑна ÑаблиÑа, каÑо colspan и rowspan замеÑÑÐ²Ð°Ñ Ð¾Ð±ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñе клеÑки, а оÑновниÑе ÑÑилове Ñа вгÑадени (inlined). ÐкÑпоÑÑÑÑ Ð½Ð° RTF има по-ÑÑÑого огÑаниÑение: Ñой не може да ÑазпÑоÑÑиÑа обединени клеÑки пÑез колони, Ñака Ñе клеÑкиÑе-пÑодÑÐ»Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° обединÑванеÑо Ð¸Ð·Ð»Ð¸Ð·Ð°Ñ Ð¿Ñазни. ÐноÑÑÑ Ð½Ð° ODS е лек по дизайн, ÑпоÑед ÑобÑÑвенаÑа докÑменÑаÑÐ¸Ñ Ð½Ð° библиоÑекаÑа. СкалаÑниÑе ÑÑойноÑÑи и кеÑиÑаниÑе ÑезÑлÑаÑи Ð¾Ñ ÑоÑмÑли Ñе пÑенаÑÑÑ; ÑÑиловеÑе, живиÑе изÑази на ÑоÑмÑли на ODF и ÑеÑÑежиÑе не Ñе пÑенаÑÑÑ. Това е Ð¾Ñ Ð·Ð½Ð°Ñение в моменÑа, в койÑо аÑÑ
ивÑÑ ÑÑдÑÑжа Ñеални OpenDocument Ñайлове под ÑпÑавлениеÑо на OASIS ODF 1.3, кÑдеÑо вÑиÑко, коеÑо е близо до визÑално вÑÑно конвеÑÑиÑане, Ñе нÑждае Ð¾Ñ Ð¿Ð¾Ð²ÐµÑе, оÑколкоÑо Ñози пÑÑ Ð·Ð° импоÑÑиÑане е ÑÑздаден да поддÑÑжа, и одиÑниÑÑ Ð¿Ñеглед е Ñова, коеÑо ви казва, Ñе Ñези Ñайлове ÑÑÑеÑÑвÑваÑ, пÑеди пакеÑÑÑ ÑиÑ
о да ги изÑавни.
SaveXLSWorkbookAsXLSX е моÑÑ Ð·Ð° данни, а не за оÑоÑмление
ÐнÑеÑÑейÑÑÑ Ð½Ð° BIFF не може да пиÑе OOXML диÑекÑно, Ñака Ñе пÑеминаванеÑо Ð¾Ñ .xls кÑм .xlsx ÑÑава пÑез ÑÑнкÑиÑÑа SaveXLSWorkbookAsXLSX в модÑла lxXlsxExport. ТоÑноÑÑÑа на Ñози моÑÑ ÑÑÑбва да Ñе каже ÑÑно, ÑÑй каÑо имеÑо пÑедполага повеÑе, оÑколкоÑо Ñой пÑави. Той копиÑа ÑÑойноÑÑи, ÑоÑмÑли, ÑиÑлови ÑоÑмаÑи, ÑвеÑове на запÑлване, оÑновни аÑÑибÑÑи на ÑÑиÑÑа, ÑиÑини на колони и наÑÑÑойки на изгледа, каÑо напÑÐ¸Ð¼ÐµÑ Ð¼Ñежови линии (gridlines). Той не копиÑа гÑаниÑи, обединени диапазони, коменÑаÑи, диагÑами или ÑÑловни ÑоÑмаÑи. Ðа ноÑмализиÑане на ниво данни, кÑдеÑо ÑиÑÑемиÑе Ð½Ð°Ð´Ð¾Ð»Ñ Ð¿Ð¾ веÑигаÑа Ñе анализиÑÐ°Ñ ÑезÑлÑаÑа и никой нÑма да гледа ÑоÑмаÑиÑанеÑо, Ñова е напÑлно доÑÑаÑÑÑно и не Ñе гÑби ниÑо необÑ
одимо. Ðа ÑоÑмаÑиÑан оÑÑÐµÑ Ð½Ð° ÑпÑавиÑÐµÐ»Ð½Ð¸Ñ ÑÑвеÑ, пÑедназнаÑен за ÑеÑене Ð¾Ñ Ñовек, Ñова не е доÑÑаÑÑÑно и именно ÑÑк одиÑниÑе бÑоÑÑи заÑлÑÐ¶Ð°Ð²Ð°Ñ Ð¼ÑÑÑоÑо Ñи: Ñайл, койÑо одиÑÑÑ Ðµ маÑкиÑал каÑо ÑÑдÑÑÐ¶Ð°Ñ Ð´Ð¸Ð°Ð³Ñами и ÑÑловни ÑоÑмаÑи, ÑÑÑбва да Ñе наÑоÑи кÑм опаÑка за ÑÑÑна обÑабоÑка, а не пÑез моÑÑ, койÑо Ñе изÑ
вÑÑли и двеÑе без дÑма.
var
Legacy: IXLSWorkbook; // interface reference: do not Free
Modern: TXLSXWorkbook;
begin
if SameText(ExtractFileExt(FileName), '.xls') then
begin
Legacy := TXLSWorkbook.Create;
if Legacy.Open(FileName) <= 0 then Exit;
if SaveXLSWorkbookAsXLSX(Legacy,
ChangeFileExt(FileName, '.xlsx')) <= 0 then
Writeln('bridge failed: ' + FileName);
end
else
begin
Modern := TXLSXWorkbook.Create;
try
Modern.StreamingWrite := True; // stream sheet XML into the zip
if Modern.Open(FileName) = 1 then
Modern.SaveAsCSV(ChangeFileExt(FileName, '.csv'), 0, ',');
finally
Modern.Free;
end;
end;
end;
ÐоÑниÑÑ ÑикÑл показва ÑÑÑо и лоÑÑа за пÑопÑÑкаÑелна ÑпоÑобноÑÑ Ð¾Ñ ÑÑÑанаÑа на OOXML. ÐаÑÑÑойванеÑо на StreamingWrite на true пÑедава поÑоково XML на ÑабоÑÐ½Ð¸Ñ Ð»Ð¸ÑÑ Ð´Ð¸ÑекÑно в изÑ
Ð¾Ð´Ð½Ð¸Ñ Ð¿Ð°ÐºÐµÑ, вмеÑÑо да го подгоÑÐ²Ñ ÐºÐ°Ñо един гиганÑÑки низ в памеÑÑа, коеÑо е ÑазликаÑа Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð¼ÑоÑÑна ÑабоÑа и ÑÑив поÑади недоÑÑиг на памеÑ, Ñлед каÑо ÑайловеÑе доÑÑÐ¸Ð³Ð½Ð°Ñ ÑÑоÑиÑи Ñ
илÑди Ñедове. ÐÑазмеÑÑванеÑо и поведениеÑо на памеÑÑа за Ñози Ñежим Ñа Ñазгледани в наÑаÑа ÑÑаÑÐ¸Ñ Ð·Ð° поÑоково пиÑане за пакеÑни Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½Ð° ÑÑÑвÑÑа. ÐÑе едно ÑвойÑÑво е Ð¾Ñ Ð·Ð½Ð°Ñение за пакеÑ, койÑо иÑка да използва вÑÑко ÑдÑо: ниÑо един Ð¾Ñ Ð¸Ð½ÑеÑÑейÑиÑе не е ниÑково безопаÑен, но ниÑо един Ð¾Ñ ÑÑÑ
не ÑÐ¿Ð¾Ð´ÐµÐ»Ñ Ð¸ глобално ÑÑÑÑоÑние, Ñака Ñе поддÑÑжаниÑÑ Ð¼Ð¾Ð´ÐµÐ» за паÑалелно конвеÑÑиÑане е един екземплÑÑ Ð½Ð° ÑабоÑна книга за вÑÑка ÑабоÑна ниÑка, без заклÑÑване Ð¿Ð¾Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð¼.
ФайловеÑе Ñ Ð¿Ð°Ñоли и какво да пÑавим Ñ ÑÑÑ
ÐаклÑÑениÑе Ñайлове в аÑÑ
ива Ñе ÑазделÑÑ ÑÑно по ÑоÑÐ¼Ð°Ñ Ð¸ Ñова ÑазделÑне опÑÐµÐ´ÐµÐ»Ñ ÐºÑде оÑиваÑ. СÑаÑоÑо ÑиÑÑиÑане на .xls, незавиÑимо дали е RC4, RC4 над CryptoAPI или ÑÑаÑаÑа XOR обÑÑÑкаÑиÑ, е ÑеÑимо: пÑедайÑе паÑолаÑа на Open и ÑайлÑÑ Ñе конвеÑÑиÑа каÑо вÑеки дÑÑг. ШиÑÑиÑаниÑе пакеÑи .xlsx Ñа дÑÑга иÑÑоÑиÑ. HotXLS ги оÑкÑива Ñ CanReadEncrypted, но не може да ги деÑиÑÑиÑа, Ñака Ñе единÑÑвениÑÑ Ð¿Ñавилен Ñ
од е да ги наÑоÑиÑе кÑм опаÑка, кÑдеÑо Ñовек оÑваÑÑ Ð¸ запиÑва оÑново вÑеки Ð¾Ñ ÑÑÑ
в Excel, пÑеди да Ñе вÑÑне в ÑабоÑÐ½Ð¸Ñ Ð¿Ð¾Ñок. Тази аÑимеÑÑÐ¸Ñ Ñи ÑÑÑÑва да бÑде планиÑана пÑедваÑиÑелно, ÑÑй каÑо ÑиÑÑиÑаниÑе XLSX Ñайлове Ñа Ñези, коиÑо най-веÑоÑÑно Ñа запиÑиÑе, за коиÑо нÑкой наиÑÑина го е гÑижа.
ÐаÑваÑÑне на ÑикÑла Ñ Ð¿ÑовеÑка
ТÑеÑиÑÑ ÐµÑап е Ñози, койÑо Ñе пÑопÑÑка, а пÑопÑÑканеÑо Ð¼Ñ Ð¿ÑевÑÑÑа маÑовоÑо конвеÑÑиÑане в ÑиÑков паÑив. ÐиÑо един пÑÑ Ð·Ð° Ð·Ð°Ð¿Ð¸Ñ Ð² HotXLS не изÑиÑлÑва ÑоÑмÑли. Excel пÑеизÑиÑлÑва, когаÑо оÑваÑÑ Ñайл, Ñака Ñе конвеÑÑиÑанеÑо Ð¾Ñ XLSX кÑм XLSX оÑÑава пÑавилно, но ÑелÑа CSV полÑÑава ÑекÑÑа на ÑоÑмÑлаÑа бÑквално, оÑвен ако ÑÑÑбопÑоводÑÑ Ð¿ÑÑво не изпÑлни Calculate вÑÑÑ
Ñ ÐºÐ»ÐµÑкиÑе и не запиÑе ÑезÑлÑаÑиÑе обÑаÑно. ÐнаниеÑо за Ñова пÑедваÑиÑелно е ÑазликаÑа Ð¼ÐµÐ¶Ð´Ñ CSV, пÑлен Ñ ÑиÑла, и CSV, пÑлен Ñ Ð½Ð¸Ð·Ð¾Ð²Ðµ =SUM(...), коиÑо никой не забелÑзва, докаÑо поÑледваÑиÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑ Ð½Ðµ Ñе пÑовали.
СамаÑа пÑовеÑка е доÑÑаÑÑÑно лека, Ñака Ñе нÑма извинение ÑÑ Ð´Ð° бÑде пÑопÑÑнаÑа. ÐÑвоÑеÑе оÑново вÑеки конвеÑÑиÑан Ñайл ÑÑÑ ÑÑÑаÑа библиоÑека, ÑÑаÑÑиÑайÑе оÑново одиÑниÑе бÑоÑÑи и ги ÑÑавнеÑе Ñ ÑиÑлаÑа пÑеди конвеÑÑиÑанеÑо, коиÑо опиÑваÑиÑÑ Ð¿Ñеглед веÑе е запиÑал. ÐамалÑл бÑой лиÑÑове, бÑой диагÑами, койÑо е ÑÑанал нÑла, кÑдеÑо изÑоÑникÑÑ Ðµ имал ÑÑи, бÑой клеÑки, койÑо е паднал дÑаÑÑиÑно: вÑÑко Ð¾Ñ ÑÑÑ Ðµ ÑÐ¸Ñ Ð° загÑба, Ñловена на ÑенаÑа на вÑоÑо оÑваÑÑне. ÐаÑед Ñ Ñова напÑавеÑе пÑоизволна визÑална пÑовеÑка на извадка в Excel или LibreOffice, и комбинаÑиÑÑа Ñе Ñлови огÑомноÑо мнозинÑÑво Ð¾Ñ ÑеÑиÑе пÑи конвеÑÑиÑанеÑо, пÑеди Ñо да бÑде изпÑаÑено. Това е ÑÑлаÑа пÑиÑина еÑапÑÑ Ð½Ð° опиÑание да Ð·Ð°Ñ Ñанва еÑапа на пÑовеÑка. Ðез ÑÑойноÑÑиÑе âпÑедиâ? ÑÑойноÑÑиÑе âÑледâ?не Ð´Ð¾ÐºÐ°Ð·Ð²Ð°Ñ Ð½Ð¸Ñо.
РабоÑен плоÑ, оÑиенÑиÑан пÑÑво кÑм одиÑа, пÑевÑÑÑа ÑиÑковоÑо маÑово конвеÑÑиÑане в измеÑим пÑоÑÐµÑ Ñ ÐºÐ°ÑанÑинна Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° ÑайловеÑе, коиÑо не Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° пÑÐµÐ¼Ð¸Ð½Ð°Ñ Ð±ÐµÐ·Ð¿Ñоблемно. ÐÑиÑки показани ÑÑк ÑондиÑаÑи, пÑебÑоÑваÑи и конвеÑÑиÑаÑи Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ñа ÑаÑÑ Ð¾Ñ HotXLS Component, койÑо ги изпÑлнÑва вгÑадено в пÑоÑеÑа без авÑомаÑизаÑÐ¸Ñ Ð½Ð° Excel.