Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Ваши программы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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, можно объединить усилия.
Жду отзывов и предложений.

Последний раз редактировалось alexan0308, 08.06.2011 в 09:55.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter