Занимался как то переводом Excel файлов в HTML формат для публикации на сайте. В Delphi это можно делать, например, так:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 | var
ex :variant;
excelname, fname : string ;
begin
excelname:= extractfilepath(application . ExeName)+ 'Книга.xls' ;
Ex := CreateOleObject( 'Excel.Application' );
Ex . Visible:= true ;
Ex . WorkBooks . Open(excelname,ReadOnly:= True );
fname:= ChangeFileExt(excelname, '2.html' );
Ex . ActiveSheet . SaveAs(fname, 44 );
end ;
|
Значение 44 как раз отвечает за перевод в HTML формат. Все хорошо, но при этом получается файл с нагромождением стилей большого объема. А ведь иногда хочется управлять стилем веб-страницы, использовать Javascript. Кроме того, иногда возникает потребность объединения ячеек с сохранением всех значений. Excel же при объединении ячеек оставляет только значение левой верхней ячейки.
Поэтому родилась идея создания класса наподобие таблицы, где программист может самостоятельно управлять стилем каждой ячейки. Каждая ячека описана как Region - запись вида
Код:
1 2 3 4 5 6 7 8 9 | Region= record
main : boolean ;
colspan : integer ;
rowspan : integer ;
style : string [ 255 ];
id : string [ 255 ];
cl : string [ 255 ];
value : string ;
end ;
|
Смысл свойств colspan и rowspan думаю ясен. Ячейка является главной (main=true), если она является левой верхней внутри объединенной ячейки. Все оставшиеся ячейки считаются неглавными. Эти три свойства компонент определит автоматически, трогать их не нужно. Можно управлять стилем каждой ячейки (поле style), ид ячейки (поле id), классом ячейки (поле cl), и собственно значением ячейки (поле value).
Весь лист Excel рассматривается как совокупность таких регионов THtmlSheet. Объект THtmlSheet построен таким образом, чтобы сделать синтаксис обращения к нему максимально похожим на работу с листом ExcelSheet.
В результате появился на свет компонент ExcelToHtml.
Ниже приведу пример использования компонента. В нем переводится файл Excel в Html, при этом производятся различные манипуляции со стилями ячеек.
Добавим модуль ComObj. Кинем компонент ExcelToHtml на форму. Опишем, например, такое действие кнопки.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | procedure TForm1 . Button1Click(Sender: TObject);
var HSheet:THtmlsheet;
ex, Exsheet :variant;
header, footer, htmlcode, excelname, table, fname : string ;
ht:textfile;
i,j,k,l: integer ;
begin
excelname:= extractfilepath(application . ExeName)+ 'Книга.xls' ;
Ex := CreateOleObject( 'Excel.Application' );
Ex . Visible:= true ;
Ex . WorkBooks . Open(excelname,ReadOnly:= True );
Exsheet:=Ex . ActiveSheet;
hsheet:=ThtmlSheet . Create;
hsheet . ExcelSheetToHTMLSheet(Exsheet, 'B2:E12' );
Ex . WorkBooks . close; Ex . Quit;
header:= '<html>' +CR+ '<head>' +CR+ '<title>Мой сайт</title>' +CR;
header:=header+ '<link rel="stylesheet" type="text/css" href="style.css">' +CR;
header:=header+ '<body>' +CR;
header:=header+ '<table width=50%>' +CR;
header:=header+ '<caption>Таблица 1 - Всякие животные</caption>' +CR;
footer:= '</table>' +CR+ '</div>' +CR+ '</html>' +CR;
hsheet . Merge( 'A6:D8' , true );
for i:= 1 to Hsheet . RowsCount do
for j:= 1 to Hsheet . ColumnsCount do
BEGIN
if ansipos( 'змеи' , Hsheet . Cells[i,j].value)<> 0
then Hsheet . Cells[i,j].style:= 'bgcolor = green' ;
if ansipos( 'насекомые' , Hsheet . Cells[i,j].value)<> 0
then Hsheet . Cells[i,j].value:= '<em>' + Hsheet . Cells[i,j].value+ '</em>' ;
if ansipos( 'птицы' , Hsheet . Cells[i,j].value)<> 0
then Hsheet . Cells[i,j].cl:= 'tdptiz' ;
END ;
table:= hsheet . HTMLSheetToHTMLTable;
htmlcode:=header+table+footer;
fname:= ChangeFileExt(excelname, '.html' );
assignfile(ht,fname);
rewrite(ht);
writeln (ht,htmlcode);
closefile(ht);
showmessage( 'Перевод HTMLSheet в HTML таблицу - успешно!' );
end ;
|
Скачать компонент с исходником примера можно
здесь (215 kB).
Конечно, имеются недостатки. Компонет работает через OLE, поэтому скорость не очень большая.
Для таблиц с несколькими тысячами строк вообще не рекомендую использовать. Вот если разберусь с устройством формата EXCEL, то может смогу ускорить работу компонента. Если есть уже знаток формата excel, можно объединить усилия.
Жду отзывов и предложений.