Преминаване от Excel към HTML правилно, ефективно, просто
Конвертиране от Excel в HTML:
правилно, ефективно, просто
Така че нашата задача е да конвертирате правилно документ от XLS формат в HTML формат, като се вземат предвид оригиналния формат на документи и все още го правя "малко кръв"
Изявление на проблема. Или какъв е проблемът?
Много уебмастъри често са изправени пред задачата да конвертиране на Microsoft Excel файлове в други формати. Това често е трудно, защото форматът на XLS, както всеки знае, не е документирано.
В някои случаи е възможно да се спаси данни на Excel документирани формати и последващото им обработка. Но често, този метод не работи добре. Обикновено формат, който е лесно да се справя, не са в състояние да спаси цялата информация за това как да форматирате документа и изпълнението на сложни формати манипулатор отнема излишно време.
Например не е далеч да търсят. Много от фирмите, които имат своя собствена уеб страница, както и периодично се актуализират, правят бизнес с използването на Excel. Преди уебмастера всеки път, когато се актуализира информацията на сървъра има задачата да конвертиране. Освен това, задачата може да бъде усложнена от следните аспекти:
Първо, промяната на дизайна. Ценоразпис, готови да Excel, обикновено са предназначени за печат на черно-бял принтер. Ценоразпис на сайта - не. Дори и така един прост "Запази като уеб страница" не е подходящо (аз не говоря за вида на качеството, за да получите HTML-код за такова запазване).
На второ място, е необходимо да се вземе предвид спецификата на Excel при конвертиране. Например, много хора редактиране ценоразпис, е широко използвана команда "Format / Row / скриване". В този случай, височината на линията става нула, а линията сякаш изчезва от екрана и натиснете. Ясно е, че на интернет страницата на следните редове не трябва да има. Въпреки това, те са напълно съхранени в други формати и не се различават от обичайните, не крия редове. Това води до факта, че доктрината за "Запиши като, която е ограничена и процес" не дава задоволителни резултати.
На трето място, в ценоразписа често се използва за форматиране, чието опазване е от решаващо значение. Така например, имената на някои от стоките могат да бъдат зачеркнати или са подчертани в знак, че тези продукти са били и винаги ще бъдат, но сега те не са. Някои позиции могат да бъдат в курсив, и така нататък. Цялата тази информация изчезва, ако запазите отново ценоразписа по прост формат, например, като текст с табулатори.
Така че нашата задача е да конвертирате правилно документ от XLS формат в HTML формат, като се вземат предвид оригиналния формат на документи и все още го правя "малко кръв."
Аз предлагам да се разделят задачата на две. Първият - да запазите данните в обикновен формат, който все пак ще носи цялата необходима информация с нас за оформлението на документа. Вторият - обработката на този формат и създаването на HTML-страници.
Първата задача (износ), предлагам да се реши с помощта на Excel. Тук имаме почти никакъв избор, XLS формат може да работи само с единна кандидатура в света, която да го разбира. Тази диалектика.
Вторият проблем, аз предлагам да се реши с помощта на Perl. Защо? Тъй като този език е предназначен за работа с низове, както и за задачи като наш (Perl - Практически добив и отчет език - това, което имаме нужда). Тъй като този език знае много програмисти, свързани с уеб разработки (ако не принадлежат към техния брой уеб и планираме да направим, а след това с цялото си сърце препоръчвам да обърнете внимание на Perl). Защото езикът е безплатна и достъпна за всеки потребител на всяка платформа. И тъй като ми Perl код лесно може да бъде модифициран, което го прави, например, поставяне на всеки раздел ценоразпис в отделен файл, по различни начини за сортиране на цената позиция, да следят динамиката на подновяване и цена, предоставят всяка позиция полета HTML форми на -Line ред в уеб магазина. В крайна сметка, ми скрипт лесно се превръща в най-CGI заявлението за администриране на уеб сървъра.
Това решение ми се струва най-гъвкавата, функционален и компактен, защото всяка част от проблема е решен чрез инструмент, който е най-добре адаптиран за разрешаването му.
Нека да се отвърне от конкретен пример. Като "морско свинче" предложи следния списък (вж. Фиг. 1).
Фигура 1. Пример ценова листа
Както можете да видите, тя обединява всички неприятни елементи споменати по-горе: и форматирането (фон, зачертаване, смели), както и скрити линии (ако се вгледате внимателно, ще забележите, че след деветия просто отива дванадесетия ред). Дайте им ще направим.
Експорт на данни от Excel
1: Под table2table ()
3: "макро, запазвайки таблицата за избор
4 "в текстов формат с форматиране марки
6: С ActiveWindow.RangeSelection
7: С1 = .Columns.Column
8: с2 = .Columns.Count - 1 + c1
10: R2 = .Rows.Count - 1 + r1
12: Ако (R1 - R2 = 0 и С1 - c2 = 0) После
14: "нещо малко изолиран (за да спаси), -)" _
15: vbCritical "макро съобщение"
17: fileSaveName = Application.GetSaveAsFilename (_
18: InitialFileName: = "файл", _
19: fileFilter: = "текстови файлове (* .txt), * .txt", _
20: Заглавие: = "Спасяването на страницата в този формат")
21: Ако fileSaveName = False След това
23: "файлът не е избран не се вземат мерки .." _
24: vbCritical "макро съобщение"
26 на: Sep = Chr (9) "разделител
27: subsep = Chr (8) "по-сепаратор
28: Open fileSaveName за производство, както # 1
29: За R = R1 до r2
30: L = CStr (редове (R) .RowHeight)
31: С = С1 до С2
32: с клетки (R, в)
33: L = L + септември + CStr (.Text) + _
34: subsep + CSTR (.MergeCells) + _
35: subsep + CStr (.Font.Bold) + _
36: subsep + CStr (.Font.Strikethrough)
Нека накратко разгледаме как работи този код.
Линии от 6 до 11, ние определяме границите на избраната част на документа (защото ние ще спестят само избраната част). Сега С1 и С2 - първата и последната колона, и R1 и R2 - първия и последния линии на избора.
Освен това, в редове 12 до 16 проверка, както и дали разпределена площ или ни макроса ще работи само с една клетка. Това, разбира се, не мога да направя, но има вероятност да стартирате тази макро няма да ви, тъй като мениджъри, цена редактирането, тяхната точност не винаги може да разчитате. Така че, ако нищо не е бил разпределен, нашата макро ще ви предупреди (вж. Фиг. 2).
Фигура 2. Внимание макро
В линии от 17 до 20, които наричаме диалог Application.GetSaveAsFilename, потребителят може да избере името на файла (вж. Фиг. 3).
Фигура 3. файла диалоговия потребителското Save
Отново можете да просто посочване на фиксиран име, но ми се струва, че е неприятно, дори и да се експлоатира този макрос.
В линии 21-42 трябва да бъде проект, ако-то-друг с проверка дали име на файла, за да запазите или потребителят е кликнал "Отказ" диалогов "Save As. ".
Ако потребителят е отказал да спаси, а след това издаде съобщение (линии 22 и 24), ако не е посочено името на файла, след което започва забавно - за съхранение на данни.
Имаме разделители полета и подполета са определени ASCII-код в линии 26 и 27, съответно. Можете да изберете по-удобни разделители. Например, ако сте сигурни, че вашите данни никога не е намерена характер ":", а след това можем да го вземе като разделител или podrazdelitelya.
Следваща (линия 28) отворите файла.
Loop чрез линии (линия 29).
За всеки ред, ние пресмятане на височината. В същото време в подготовка на линията, за да запишете файл в променлива л (линия 30 в списъка).
В цикъл (списък линия 31), съхранявани в клетките на реда от таблицата се добавя към линията L цялата информация за клетките, които се интересуват в предоставяне на своите разделители.
Какви са качествата, които поддържаме клетка?
На първо място - в текста на клетката. Имайте предвид, че ние използваме това .Text собственост, а не собственост .Value. Това не е случайно. .Value имот връща истинските съдържанието на клетката, .Text имот връща текста, който се показва на монитора и отпечатва. Тези две стойности могат да бъдат различни (и обикновено не е същото), тъй като стойностите се показва на екрана съгласно предварително определен формат клетка (например, номера са показани с предварително определен брой знака след десетичната запетая).
.MergeCells собственост показва дали клетката е част от група, обединени клетки.
.Font.Bold имот отразява съдържанието на текста в клетката мазнини.
.Font.Strikethrough собственост показва дали текстът е проектиран като задраскан.
- .Font.Name
- .Font.FontStyle
- .Font.Size
- .Font.Underline
- .Font.ColorIndex
- .Font.Italic
- .HorizontalAlignment
- .VerticalAlignment
- .ColorIndex
- .модел
Имайте предвид, че всички имоти са ясно на функцията тип линия CStr (линии 33 до 36). Това е много полезна процедура постоянно ви спестява главоболието на видовете реализации.
Тук трябва да се направи важна резервация. Факт е, че функцията CStr не е в състояние да се справят с недефинирани стойности. Ако има такива, ще се появи в документа, вместо CStr можете да използвате вашите собствени ценности трансфер функция в текстов формат. Например, safeCStr:
1: Функция safeCStr (р Като вариант) Както String
2: Ако IsNull (р) След safeCStr = "" Друго safeCStr = CStr (р)
3: End Function
Това е за всички. Той остава в готовност да се поддържа ред л във файла (линия 39 в списъка) и да затворите файла при завършване на целия цикъл на линии (линия 41).
Така че, пази зоната, която изберете (в този пример, за първите три колони от таблицата, линии 4 до 21), натиснете бутона, който е създаден, изберете името на файла и Запаметяването на заснетото изображение. Какво да правя след това?
Създаване на HTML-страници на изнесени данни
С този файл, можете да направите нищо, защото си формат, е напълно известен ни (хубаво да го знаят). Аз ще дам един пример за генериране на HTML-страници.
Както казах, аз предлагам сценария на Perl:
5: # ми ($ TRUE, FALSE $) = ( "Истината", "фалшиви");
6: ми ($ TRUE, FALSE $) = ( "True", "False");
Сценарият получава входни данни от определен като параметър на командния ред файл или стандартния вход и произвежда HTML код на стандартния изход. Това означава, че тя може да се управлява, както следва:
Perl file2html.pl file.txt> file.html
или, например, както следва:
котка file.txt | Perl file2html.pl> file.html
Ние ще разберем как този скрипт (Ще приемем, че читателят има известни познания за Perl).
qtnum дейността (8 до ред 12) се добавя към пост броя на тагове, превръщайки "3.14" на "3,14". Т.е. цента и една стотинка ще бъдат показани в по-малък шрифт. Това е чисто козметична мярка.
процедура qtstring (линии 13 до 21) е цитиран "опасни" герои: (А), "(кавички) <(больше),> (По-малко от). Това, както знаете, задължителна мярка.
Линии 23 през 50 печат "шапка» HTML-документ.
На линия, докато (редове от 52 до 88) четем ред по ред входен файл, да го превърнете в HTML-документ и да раздава на стандартния изход изход.
В съответствие 53 от нарязани символ на следващия ред на четене (и) на низа. Не използвам стандартната функции Perl котлет и Chomp, защото обработен файл е създаден под Windows, и на водача (нашия скрипт за Perl) може да работи под UNIX. Файлът може да бъде прехвърлена много екзотични начини. Например, аз съм сигурен, че много ще искат да променят само моя код и да го превърне в CGI-заявление за прилагане на дома им сървър. Така че аз не разчитат на стандартните функции и предписват ясно, че аз трябва да изтриете всички символи \ x0A и \ x0D в края на линията.
Следваща ред е разделен на полета (линия 54). Тя използва една и съща сепаратора и в изпълнение на макроса Visual Basic (макро линия 26).
Първото поле - височина линия - се съхранява в променливата $ LH на (линия 55). Всички останали области са разделени на под-полета. В резултат на това име на променлива $, $ USD, $ търкайте назначен указатели към масиви, съдържащ цялата необходима информация за съдържанието и форматирането на клетката. $ Име - името на клетката със стоките, $ USD - клетка с цената в долари, $ търкайте - клетка с цената в рубли. Това се прави в една линия 56.
Ако височината на реда не е нула, изпълни единица 58 през линия 84. В противен случай, ние даваме предупреждение към стандартен STDERR грешка, която се открива и не обърна внимание на скрит ред (ред 86).
трапезни Обработка редове само на пръв поглед може да изглежда обезсърчително.
На първо място, ние да разберете това, което ние се занимаваме с проверката за съответствие 58 валидността на имоти .MergeCells клетка с името на продукта. Ако тази клетка е включен, заглавната част на секция след това се изпълнява код генериране глава (линии 59 до 61).
Ако се окаже, че си имаме работа с един обикновен низ, тогава блок друг (линии 63 през 79). Там се образува линия HTML-таблица, в която да поставите допълнителни елементи на форматиране (за тези редове в таблицата, където ви е необходимо).
Моля, имайте предвид, че ние сме изградили в нашия документ елементарни DHTML-прием. Масата е винаги подчертано от низ, на която показалеца на мишката. Това улеснява масата за четене. Съгласен съм, че за да се постигне този ефект с помощта на Excel (от запазването на документа като уеб страница) е трудно.
Линии 90-94 изход изоставаше таговете в документа. Моля, имайте предвид, че в края на файла с програмата трябва да бъде празен низ. В противен случай, последната дума ( «ТЕКСТ») (ред 94), няма да бъдат правилно обработени от интерпретатора на Perl.
След това, което се случва на изхода, погледнете илюстрацията (стр. 82).
Съгласете се, че е за тази борба!
Бъгове. Какво друго мога да добавя?
Аз не се съмнявам, че въпреки че моите примери са напълно функционални, много малко хора ще ги използват без никакви изменения. Искам да се хвърлят няколко мисли за това какво може да се подобри в тези скриптове, така че, когато техните модификации, че не правят излишна работа, и веднага убит, тъй като много зайци.
Според сценария на Visual Basic
Ето, най-вероятно ще се наложи да промените набора от клетъчните параметри се съхраняват. Списъкът на най-полезните Нося в обсъждането на този сценарий. Ако имате нужда от някаква екзотична, обърнете се към документацията на Microsoft, на свойствата на обекта Range.
Вероятно мнозина ще намерите недостатък, който със сигурност е макроса замества съществуващите файлове (ако изберете да запишете съществуващия файл). Това, както знаете, е лесно да се определи.
Фигура 4. Крайната цена
Вероятно, за истинските документи ще бъде лесно да се формулира условията, при които самата макроса ще определят областта на цената (или друг документ), за да бъдат съхранени. След това, този процес може да бъде автоматизиран. Моето решение (запазите избрания район) по-гъвкав, отколкото удобно.
Според сценария на Perl
Разбира се, цялата HTML-кодът (което е голяма част от сценария) най-вероятно ще се промени значително. Разбира се, вие трябва да промените броя на колоните, шапки, много отстранени от HTML-кодът ми празна Онлайн сепаратор, завийте вложени таблици, променете DHTML-функцията, добавете CSS-масата. Но това не е най-важното нещо, а не фундаментална промяна.
Най-вероятно ще трябва да се "научи" сценария да се раздели на големи документи на секции и спаси тези секции в различни файлове, тъй като ценовата листа е много средна фирма във формат HTML може да тегли стотици килобайти. Не всеки уеб скитник ще изчака края на изтеглянето на този документ. Може би искате да добавите сортиране (ако положението в печатната ценова листа и ценоразпис в интернет трябва да следва в различен ред).
Това без съмнение ще бъде полезна функция сравнение на действащия ценоразпис с предишния, което ще добави информация за актуализации и движението на цените.
Списък на съвети и предложения, можете да продължава вечно, но аз мисля, че се е събудил въображението си, а след това можете да го направите без мен. Адаптиране на примерите тук, за да ви определени обстоятелства, може да изисква няколко часа. Но след това ще бъдат добре възнаградени, тъй като всички бъдещи актуализации на информация за вашия уеб сървър ще направи само с няколко докосвания на клавиатурата и мишката!