Conversia din Excel html în mod corect, eficient, pur și simplu

Conversia din Excel în HTML:

în mod corect, eficient, pur și simplu

Deci, sarcina noastră este de a converti corect un document din format xls în format HTML, ținând seama de formatul documentului original și încă mai face „puțin sânge“

Declarația problemei. Sau care e problema?

Multe webmasteri sunt de multe ori se confruntă cu sarcina de a converti fișiere Microsoft Excel în alte formate. Acest lucru este adesea dificil, deoarece formatul xls ca toată lumea știe, nu este documentată.

In unele cazuri, este posibil pentru a salva datele Excel formate documentate și prelucrarea ulterioară a acestora. Dar, de multe ori, această metodă nu funcționează bine. format simplu, care este ușor de manevrat, nu sunt în măsură să salveze toate informațiile privind modul de formatare a documentului, precum și punerea în aplicare a formatelor complexe de tratare în mod inutil consumatoare de timp.

De exemplu, nu departe de a căuta. O mulțime de companii care au propria lor pagina de web proprii și le actualizează periodic, face afaceri cu utilizarea de Excel. Înainte de a webmaster de fiecare dată când actualizați informațiile pe server există sarcina de conversie. Mai mult decât atât, sarcina poate fi complicată de următoarele aspecte:

În primul rând, schimbarea de proiectare. Price-list, preparat în Excel, în general, concepute pentru a imprima pe o imprimantă alb-negru. Price-list pe site-ul - nr. Chiar și așa un simplu „Salvare ca pagină web“ nu este adecvată (nu vorbesc despre genul de calitate pentru a primi HTML codul pentru o astfel de conservare).

În al doilea rând, este necesar să se țină cont de specificul Excel atunci când conversia. De exemplu, multe persoane în lista de preturi, este utilizat pe scară largă comanda „Format / Row / Ascunde“. În acest caz, înălțimea liniei devine zero, iar linia pare să dispară de pe ecran și apăsați. Este clar că pe site-ul următoarele linii de acolo nu ar trebui să fie. Cu toate acestea, ele sunt perfect stocate în alte formate și nu diferă de obicei, nu ascunde rânduri. Aceasta conduce la faptul că doctrina „Salvați ca text delimitat și procesul“ nu dă rezultate satisfăcătoare.

În al treilea rând, în lista de prețuri este adesea folosit formatare, a căror conservare este critică. De exemplu, numele unora dintre produsele pot fi tăiate sau sunt evidențiate într-un semn că aceste produse au fost și vor fi întotdeauna, dar acum ele nu sunt. Unele poziții pot fi scrise cu caractere italice, și așa mai departe. Toate aceste informații dispare dacă resalvați lista de prețuri într-un format simplu, de exemplu, ca un text delimitat prin tab-uri.

Deci, sarcina noastră este de a converti corect un document din format xls în format HTML, ținând seama de formatul documentului original și încă mai face „un pic de sânge.“

Propun să împartă sarcina în două. Primul - pentru a salva datele într-un format simplu, care cu toate acestea, va efectua toate informațiile necesare pentru a ne despre aspectul documentului. Al doilea - prelucrarea acestui format și crearea de HTML-pagini.

Prima sarcină (de export), propun să rezolve prin intermediul Excel. Aici avem practic nici o alegere, format xls poate ocupa doar o singură aplicație din lume care o înțelege. Această dialectică.

A doua problemă, eu propun să rezolve cu ajutorul Perl. De ce? Pentru că această limbă este proiectat pentru a lucra cu siruri de caractere, și pentru sarcini, cum ar fi ale noastre (Perl - Practical Extraction și Limba de documentare - ceea ce avem nevoie). Pentru că această limbă cunoaște o mulțime de programatori legate de dezvoltarea web (dacă nu fac parte din numărul lor de web și intenționează să facă, apoi din toată inima recomandăm să acorde o atenție la Perl). Deoarece limba este gratuit și disponibil pentru orice utilizator de pe orice platformă. Și pentru că codul meu Perl poate fi modificat cu ușurință, făcându-l, de exemplu, punând fiecare secțiune preț lista într-un fișier separat, în diferite moduri de a sorta o poziție de preț, urmăriți de reînnoire și de preț dinamica, furnizează fiecare câmpuri de elemente HTML-forme pe Pentru -line în magazinul web. În final, script-ul meu este ușor de transformat în CGI-aplicația pentru a administra serverul Web.

Această soluție mi se pare cel mai flexibil, funcțional și compact, pentru că fiecare parte a problemei este rezolvată printr-un instrument care este cel mai bine adaptat să-l abordeze.

Să ne întoarcem departe de la un exemplu specific. Ca „cobai“ propune lista de mai jos (a se vedea. Fig. 1).

Figura 1. Exemplu pricelist

După cum puteți vedea, acesta combină toate elementele neplăcute menționate mai sus: și formatare (fundal, barată, bold), și liniile ascunse (dacă te uiți atent, veți observa că după al nouălea rând douăsprezecea doar merge). Dă-le să facă.

Export de date din Excel

1: Sub table2table ()

3: „conservatie tabelul de selecție macro

4 „în format text cu marcaje de formatare

6: Cu ActiveWindow.RangeSelection

7: c1 = .Columns.Column

8: c2 = .Columns.Count - 1 + c1

10: r2 = .Rows.Count - 1 + r1

12: Dacă (r1 - R2 = 0 și c1 - c2 = 0), atunci

14: "ceva un pic izolat (pentru a salva), -)" _

15: vbCritical, "mesaj macro"

17: fileSaveName = Application.GetSaveAsFilename (_

18: InitialFileName: = "file", _

19: fileFilter: = "Fișiere text (* .txt), * .txt", _

20: Titlu: = „Salvarea paginii în acest format“)

21: Dacă fileSaveName = false Apoi

23: „fișierul nu este selectat nu se iau măsuri ..“ _

24: vbCritical, "mesaj macro"

26 Sep = Cro (9) „delimitator

27: subsep = Cro (8) „sub-separator

28: Deschideți fileSaveName Pentru ieșire Ca # 1

29: Pentru r = r1 Pentru r2

30: l = CSTR (Rows (r) .RowHeight)

31: C = c1 Pentru c2

32: Cu Cells (r, c)

33: l = l + sep + CSTR (.Text) + _

34: subsep + CSTR (.MergeCells) + _

35: subsep + CSTR (.Font.Bold) + _

36: subsep + CSTR (.Font.Strikethrough)

Să ne uităm pe scurt la modul în care funcționează acest cod.

Liniile 6 prin 11, definim limitele părții selectate a documentului (pentru că vom salva numai partea selectată). Acum, și c2 c1 - prima și ultima coloană, și R1 și R2 - prima și ultimele rânduri ale selecției.

Mai mult, în rândurile 12 la 16 de verificare, și dacă zona alocata sau macrocomanda va funcționa doar cu o singură celulă. Aceasta, desigur, nu se poate face, dar sunt susceptibile de a rula acest macro nu va tine, ca manageri, prețul de editare, exactitatea lor nu poate conta întotdeauna pe. Deci, în cazul în care nimic nu a fost alocat, macro nostru va vă avertiza (vezi. Fig. 2).

Figura macro 2. Avertizare

În linii la 17 la 20 noi numim dialogul Application.GetSaveAsFilename, utilizatorul poate selecta numele de fișier (vezi. Fig. 3).

Figura 3. Fișier utilizator de dialog Salvare

Din nou, puteți specifica pur și simplu un nume fix, dar mi se pare că este incomod, chiar dacă exploatează acest macro.

În liniile 21-42 ar trebui să fie de proiectare în cazul în care-apoi-altcineva cu verificarea dacă un nume de fișier pentru a salva sau utilizatorul a făcut clic pe „Anulați“ dialog „Save As. “.

În cazul în care utilizatorul a refuzat să salveze, apoi a emis un mesaj (liniile 22 la 24), în cazul în care este specificat numele fișierului, apoi începe distracția - de stocare a datelor.

Avem câmpuri separatoare și subcâmpuri sunt definite cod ASCII în liniile 26 și 27, respectiv. Puteți alege separatoare mai convenabil. De exemplu, dacă sunteți sigur că datele dvs. nu este găsit caracterul „:“, atunci putem lua ca un separator sau podrazdelitelya.

Următoarea (linia 28) deschide fișierul.

Buclă prin linii (linia 29).

Pentru fiecare rând, vom calcula înălțimea. În același timp, începe să se pregătească linia pentru a salva un fișier într-o l variabilă (linia 30 listare).

În ciclul (linia de listare 31) stocate în celulele rândului tabel se adaugă la linia l toate informațiile despre celulele care suntem interesați în furnizarea de delimitatori sale.

Care sunt proprietățile pe care le gestionam celula?

Mai întâi de toate - textul celulei. Rețineți că le utilizăm proprietatea .Text, nu proprietatea .value. Acesta nu este un accident. proprietate .value returnează adevărat conținutul celulei, .Text proprietate returnează textul care este afișat pe monitor și imprimate. Aceste două valori pot fi diferite (și, de obicei, nu la fel), deoarece valorile sunt afișate pe ecran în funcție de o celulă de format predeterminat (de exemplu, numerele sunt afișate cu un număr predeterminat de zecimale).

proprietate .MergeCells indică dacă celula face parte dintr-un grup unit celule.

proprietate .Font.Bold reflectă conținutul de grăsime al textului în celulă.

.Font.Strikethrough proprietate indică dacă textul este conceput ca un ratari.

  • .Font.Name
  • .Font.FontStyle
  • .Font.Size
  • .Font.Underline
  • .Font.ColorIndex
  • .Font.Italic
  • .HorizontalAlignment
  • .VerticalAlignment
  • .ColorIndex
  • .model

Rețineți că toate proprietățile sunt în mod clar la funcția CSTR de tip linie (liniile 33 la 36). Aceasta este o procedură foarte utilă în permanență vă scutește de dureri de cap a tipurilor de conversii.

Aici trebuie sa facem o rezervă importantă. Faptul este că funcția CSTR nu este capabil să se ocupe de valori nedefinite. Dacă este cazul, va apărea în documentul dvs., în loc de CSTR puteți utiliza propriile valori ale funcției de transfer de la un format de text. De exemplu, safeCStr:

1: Funcția safeCStr (p Ca variantă) ca șir
2: Dacă isnull (p) Apoi safeCStr = "" Else safeCStr = CSTR (p)
3: End Function

Atâta tot. Rămâne gata să mențină o linie de l în fișierul (linia 39 pe listă) și pentru a închide dosarul privind finalizarea întregului ciclu în linii (linia 41).

Deci, păstrați zona selectată (în acest exemplu, primele trei coloane din tabel, linii de 4 până la 21), apăsați pe butonul l-ați creat, selectați numele fișierului și a salva imaginea capturată. Ce să faci în continuare?

Creați HTML-pagini pe datele exportate

Cu acest fișier, puteți face nimic, pentru că formatul său este pe deplin cunoscut la noi (frumos să-l cunosc). Voi da un exemplu de generare de HTML-pagini.

Așa cum am spus, eu sugerez script-ul Perl:

5: # mea ($ TRUE, $ FALSE) = ( 'Adevărul', 'fals');

6: meu ($ TRUE, $ FALSE) = ( 'adevărat', 'fals');

Script-ul primește date de intrare din fișierul specificat ca parametru de linie de comandă sau de intrare standard si produce HTML-cod pe o ieșire standard de. Adică, poate fi rulat după cum urmează:

perl file2html.pl fisier.txt> file.html

sau, de exemplu, după cum urmează:

pisică file.txt | perl file2html.pl> file.html

Vom intelege cum acest scenariu (voi presupune că cititorul are unele familiaritate cu Perl).

qtnum Procedura (8 la linia 12) a adăugat la numărul post tag-uri, de cotitură „3.14“ la „3,14“. cenți IE și un ban va fi afișat într-un font mai mic. Aceasta este o măsură pur cosmetic.

Procedura qtstring (liniile 13 și 21) este citat caractere „nesigure“: (Și), „(ghilimele duble) <(больше),> (Mai puțin). Acest lucru, după cum știți, o măsură obligatorie.

Liniile 23, prin 50 de imprimare „cap» document HTML.

While (liniile 52 la 88), am citit linie de fișier de intrare linie, converti în document HTML și să dea la ieșire stdout.

În linia 53 a simbolului tăiat linia următoare citire (e) din șir. Eu nu folosesc functiile standard Perl cotlet și chomp, deoarece fișierul procesat este creat sub Windows, iar handler (scriptul nostru pentru Perl) poate rula sub UNIX. Fișierul poate fi, de asemenea, transferat moduri foarte exotice. De exemplu, eu sunt sigur că mulți vor dori să modifice doar codul meu și să-l într-un CGI-cerere de administrare a serverului lor de origine. Așa că nu se bazează pe funcții standard și prescrie în mod clar că am nevoie pentru a șterge toate caracterele \ X0A și \ x0D la capătul liniei.

Rândul următor este împărțit în câmpuri (linia 54). Acesta utilizează același separator ca și în macro Visual Basic (linia macro 26).

Primul câmp - înălțimea liniei - este stocată în variabila $ lh (linia 55). Toate celelalte câmpuri sunt împărțite în sub-domenii. Ca rezultat, numele $ variabila, $ usd, $ frecați atribuite indicii pentru matricele care conține toate informațiile necesare cu privire la conținutul și formatarea celulei. $ Nume - numele celulei cu bunuri, $ USD - celula cu prețul în dolari, $ freca - celula cu prețul în ruble. Acest lucru se face într-o singură linie 56.

Dacă înălțimea rândului nu este zero, unitatea 58 prin linia 84 execuție. În caz contrar, vom da un avertisment pentru stderr eroare standard, care este detectat și ignorat rândul ascuns (rândul 86).

Rânduri de tabel de prelucrare numai la prima vedere poate părea descurajantă.

În primul rând, vom afla ce avem de-a face în verificarea liniei 58 validitatea celulei proprietăți .MergeCells cu numele produsului. Dacă această celulă este încorporată, antetul secțiunii este apoi executat cod generare antet (liniile 59 la 61).

Dacă se dovedește că avem de-a face cu un șir obișnuit, atunci else bloc (liniile 63 prin 79). Se formează o linie HTML tabel în care pentru a insera elemente suplimentare de formatare (pentru acele rânduri într-un tabel, în cazul în care aveți nevoie de ea).

Vă rugăm să rețineți că ne-am construit în documentul nostru elementar DHTML-recepție. Tabelul este întotdeauna evidențiată printr-un șir de caractere pe care cursorul mouse-ului. Acest lucru simplifică tabelul de citire. Sunt de acord că, pentru a obține acest efect prin intermediul Excel (prin salvarea documentului ca o pagină Web) este dificil.

Liniile 90-94 de ieșire adulmecarea etichetele documentului. Vă rugăm să rețineți că sfârșitul fișierului cu programul trebuie să fie un șir gol. În caz contrar, ultimul cuvânt ( «TEXT») (linia 94) nu vor fi procesate corect de către interpret Perl.

Atunci ce se întâmplă la ieșire, uita-te la ilustrația (pag. 82).

Sunt de acord, a fost pentru că lupta!

ERORI. Ce altceva pot să adaug?

Nu am nici o îndoială că, deși exemplele mele sunt pe deplin funcționale, foarte puțini oameni le vor folosi fără nici o modificare. Vreau să arunc câteva gânduri despre ceea ce ar putea fi îmbunătățite în aceste script-uri, astfel încât atunci când modificările lor nu au făcut de lucru inutile, și imediat a ucis cat mai multe iepurilor de câmp.

Potrivit script-ul în Visual Basic

Aici, va trebui probabil să se schimbe setul de parametri de celule stocate. Lista de cele mai utile am adus în discuție acestui scenariu. Dacă aveți nevoie de un fel de exotice, consultați documentația Microsoft, proprietățile obiectului Range.

Poate că mulți vor găsi un defect care este cu siguranță macro înlocuiește fișierele existente (dacă selectați pentru a salva fișierul existent). Acest lucru, după cum știți, este ușor să se stabilească.

Figura 4. Prețul final

Probabil, documentele reale vor fi ușor de a formula condițiile în care macro se va determina zona unui preț (sau alt document) care urmează să fie stocate. Apoi, acest proces poate fi automatizat. Soluția mea (a salva zona selectată) mai versatil decât convenabil.

Conform script-ul în Perl

Desigur, întregul codul HTML (care este o mare parte din script-ul) pe care sunt susceptibile de a schimba în mod semnificativ. Desigur, trebuie să modificați numărul de coloane, capace, multe eliminate din HTML codul meu gol-line separator, șurub tabele imbricate, modificați DHTML-funcția, adăugați CSS-tabel. Dar acest lucru nu este cel mai important lucru și nu o schimbare fundamentală.

Cel mai probabil, va trebui să „învețe“ script-ul pentru a împărți documente mari în secțiuni și de a salva aceste secțiuni în fișiere diferite, deoarece lista de prețuri este foarte fermă medie în format HTML poate trage sute de kilobytes. Nu orice Wanderer web va aștepta sfârșitul descărcării acestui document. S-ar putea dori să adăugați sortare (în cazul în care poziția în lista de prețuri tipărite și lista de prețuri în web ar trebui să urmeze într-o ordine diferită).

Acesta va fi, fără îndoială, utilă compararea caracteristică a listei curente de preț cu cel anterior, care se va adăuga informații despre actualizările și mișcările de preț.

O listă de sfaturi și sugestii, puteți merge la infinit, dar cred că a trezit imaginația ta, și apoi o poți face fără mine. Adaptarea exemple aici pentru circumstanțele particulare, ar putea necesita mai multe ore. Dar atunci vei fi bine răsplătit, ca toate actualizările viitoare ale informațiilor de pe serverul dvs. de web vă va face doar câteva atingeri ale tastaturii și mouse-ul!