Показать сообщение отдельно
  #1  
Старый 07.06.2011, 00:08
alexan0308 alexan0308 вне форума
Прохожий
 
Регистрация: 16.05.2010
Сообщения: 19
Репутация: 10
По умолчанию Компонент для перевода Excel в HTML

Занимался как то переводом 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;

      // Объединим ячейки сохранив значений всех ячеек
            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>';
             // И еще присвоим ячейкам с птицами класс 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;
Скачать компонент с исходником примера можно здесь (215 kB).
Конечно, имеются недостатки. Компонет работает через OLE, поэтому скорость не очень большая.
Для таблиц с несколькими тысячами строк вообще не рекомендую использовать. Вот если разберусь с устройством формата EXCEL, то может смогу ускорить работу компонента. Если есть уже знаток формата excel, можно объединить усилия.
Жду отзывов и предложений.
Ответить с цитированием