Как стать автором
Обновить

Перевод Excel в HTML на Delphi

Занимался как то переводом Excel файлов в HTML формат для публикации на сайте. В Delphi это можно делать, например, так:
 
var
ex :variant; excelname, fname : string;
begin 
       excelname:= extractfilepath(application.ExeName)+'Книга.xls';
       Ex := CreateOleObject('Excel.Application');
       Ex.Visible:= true; 
// Откроем Excel 
       Ex.WorkBooks.Open(excelname,ReadOnly:=True);
       fname:= ChangeFileExt(excelname,'2.html');
       Ex.ActiveSheet.SaveAs(fname,44);
end;

Значение 44 как раз отвечает за перевод в HTML формат. Все хорошо, но при этом получается файл с нагромождением стилей большого объема. А ведь иногда хочется самому управлять стилем веб-страницы, использовать Javascript. Кроме того, иногда возникает потребность объединения ячеек с сохранением всех значений. Excel же при объединении ячеек оставляет только значение левой верхней ячейки.

Поэтому родилась идея создания класса наподобие таблицы, где программист может самостоятельно управлять стилем каждой ячейки. Каждая ячейка описана как Region — запись вида
 
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 на форму. Опишем, например, такое действие кнопки:

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;

// Откроем Excel
 
       Ex.WorkBooks.Open(excelname,ReadOnly:=True);
       Exsheet:=Ex.ActiveSheet;

//Создадим объект
 
      hsheet:=ThtmlSheet.Create;

// Переведем лист Excel в объект HTMLSheet
 
      hsheet.ExcelSheetToHTMLSheet(Exsheet,'B2:E12');

// Закроем Excel
 
      Ex.WorkBooks.close;
      Ex.Quit;

// Опишем шапку веб-страницы. Здесь CR - перевод строки

      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;

// Объединим ячейки 'A6:D8', сохранив значений всех ячеек

      hsheet.Merge('A6:D8',true);

// Объединим ячейки 'A9:D11', сохранив значение только первой ячейки

      hsheet.Merge('A9:D11',false); 

// Тут немножко поиграем со стилями и значениями

      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>'; 

// И еще присвоим ячейкам с птицами класс tdptiz

      if ansipos('птицы', Hsheet.Cells[i,j].value)<>0
                    then Hsheet.Cells[i,j].cl:='tdptiz'; 

// И так далее, можно делать что угодно

      END; 

// переведем наш объект в HTML таблицу из тегов
table:= hsheet.HTMLSheetToHTMLTable; 

// HTML код нашей страницы
htmlcode:=header+table+footer;
      fname:= ChangeFileExt(excelname,'.html');
      assignfile(ht,fname);
         rewrite(ht);
         writeln(ht,htmlcode);
      closefile(ht);
      showmessage('Перевод HTMLSheet в HTML таблицу - успешно!'); 

end;

Скачать компонент с исходником примера можно здесь.

Конечно, имеются недостатки. Компонент работает через OLE, поэтому скорость не очень большая. Для таблиц с несколькими тысячами строк вообще не рекомендую использовать данный компонент.

Вот если разберусь с устройством формата EXCEL, то может смогу ускорить работу компонента. Если есть уже знаток формата excel, можно объединить усилия.
Жду отзывов и предложений.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.