Занимался как то переводом Excel файлов в HTML формат для публикации на сайте. В Delphi это можно делать, например, так:
Код:
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.
В результате появился на свет компонент 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; 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);
// или hsheet.Merge(6,1,8,4,true);
// Объединим ячейки 'A9:D11' сохранив значение только первой ячейки
hsheet.Merge(9,1,11,4,false);
//удалим скрытые строки и столбцы
for i:= hsheet.RowsCount downto 1 do
if hsheet.Rows[i].hidden then hsheet.RowsDelete(i);
for j:= hsheet.ColumnsCount downto 1 do
if hsheet.Columns[j].hidden then hsheet.Columnsdelete(j);
// Тут немножко поиграем со стилями и значениями
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, можно объединить усилия.
Жду отзывов и предложений.