Занимался как то переводом Excel файлов в HTML формат для публикации на сайте. В Delphi это можно делать, например, так:
Значение 44 как раз отвечает за перевод в HTML формат. Все хорошо, но при этом получается файл с нагромождением стилей большого объема. А ведь иногда хочется самому управлять стилем веб-страницы, использовать Javascript. Кроме того, иногда возникает потребность объединения ячеек с сохранением всех значений. Excel же при объединении ячеек оставляет только значение левой верхней ячейки.
Поэтому родилась идея создания класса наподобие таблицы, где программист может самостоятельно управлять стилем каждой ячейки. Каждая ячейка описана как Region — запись вида
Смысл свойств colspan и rowspan думаю ясен. Ячейка является главной (main=true), если она является левой верхней внутри объединенной ячейки. Все оставшиеся ячейки считаются неглавными. Эти три свойства компонент определит автоматически, трогать их не нужно. Можно управлять стилем каждой ячейки (поле style), ид ячейки (поле id), классом ячейки (поле cl), и собственно значением ячейки (поле value). Можно объединять ячейки, сохранив все значения.
Весь лист Excel рассматривается как совокупность таких регионов THtmlSheet. Объект THtmlSheet построен таким образом, чтобы сделать синтаксис обращения к нему максимально похожим на работу с листом ExcelSheet.
В результате появился на свет компонент ExcelToHtml. Ниже приведу пример использования компонента. В нем переводится файл Excel в Html, при этом производятся различные манипуляции со стилями ячеек.
Добавим модуль ComObj. Кинем компонент ExcelToHtml на форму. Опишем, например, такое действие кнопки:
Скачать компонент с исходником примера можно здесь.
Конечно, имеются недостатки. Компонент работает через OLE, поэтому скорость не очень большая. Для таблиц с несколькими тысячами строк вообще не рекомендую использовать данный компонент.
Вот если разберусь с устройством формата EXCEL, то может смогу ускорить работу компонента. Если есть уже знаток формата excel, можно объединить усилия.
Жду отзывов и предложений.
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, можно объединить усилия.
Жду отзывов и предложений.