выгрузка в Exel из под линукса.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

выгрузка в Exel из под линукса.

Сообщение Attid »

кто-нибуть занимался таким?
если да то как подойти ?


или может я не так подхожу, мысль такая, некоторые отчеты в линуксовой программе которая отоброжает их в гриде надо чтоб пользователь мог унести домой и поработать с ними в exel
можно конечно посто выгрузить в файл с раздлителями и в эксель импортировать но это уже не то. не буду же я директора напрягать такими телодвижениями.
betatester
постоялец
Сообщения: 276
Зарегистрирован: 27.04.2007 22:21:45
Контактная информация:

Сообщение betatester »

В Delphi это делалось через OLE - механизм.
Т.е., из программы вызвался Excel как сервер, создавался новый документ и туда совались данные, документ сохранялся, сервер уничтожался.
В Linux это по определению не возможно.

Нужно, ИМХО, копать в сторону OpenOffice - если там какой-либо похожий механизм... Но мне видиться, что ничего не выйдет.

Единственный, ИМХО, метод - сохранение в каком-либо открытом формате - dot separeted или XML...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

На torry.net я видел пример выгрузки данных прямо в .xls, правда, какой-то древней версии (2.0?).
Аватара пользователя
Alexander
энтузиаст
Сообщения: 888
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

посмотри:
http://search.cpan.org/dist/Spreadsheet-WriteExcel/
http://diswww.mit.edu/bloom-picayune.mit.edu/perl/23422

http://swik.net/XLS

на стороне клиента:
http://www.nicolaottomano.it/public/csv2xls.zip

А ещё можно попробовать переименовать файл csv в xls,
Может эксель это проглотит с минимальными вопросами ?
Аватара пользователя
Михаил
новенький
Сообщения: 13
Зарегистрирован: 31.10.2006 13:27:31

Сообщение Михаил »

совсем недавно делал подобную пересылку из XML файлов либо в OpenOffice, либо в MS Offiсe.
если нужно, могу переслать на ящик (ссылок не сохранил) два файла, список OLE-функций для MS Exel и OO Calc
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

давай
мой ник собака яндекс точка ру
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Михаил писал(а):...если нужно, могу переслать на ящик (ссылок не сохранил) два файла, список OLE-функций для MS Exel и OO Calc

А мне можно?

мойник@mail.ru

Спасибо.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 888
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

А эта штука бесполезна ? (http://search.cpan.org/dist/Spreadsheet-WriteExcel/)
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Ну, раз пошла такая пьянка...

1. Михаил, за пример спасибо!

2. Если расковыривать пример который к OpenOffice, то вот какой вопрос возникает:

если так

Код: Выделить всё

Cell := Sheet.getCellByPosition(0, 0);
Cell.setString:= 'Типа занесли что-то';

то все нормально, вот если диапазон ячеек выделять

Код: Выделить всё

Cell := Sheet.getCellRangeByPosition(0, RecCount, 0, FldCount);


то как сразу этому диапазону значение задать?

Код: Выделить всё

Cell.set??????:= TableVals; // заранее сформированный вариантный массив 


В Excell работало без проблем. В OpenOffice реально задать значения сразу диапазону? Ну, чтобы по таблице в цикле не бегать...
andal
незнакомец
Сообщения: 9
Зарегистрирован: 21.03.2007 10:00:47

Сообщение andal »

Attid писал(а):кто-нибуть занимался таким?
если да то как подойти ?


или может я не так подхожу, мысль такая, некоторые отчеты в линуксовой программе которая отоброжает их в гриде надо чтоб пользователь мог унести домой и поработать с ними в exel
можно конечно посто выгрузить в файл с раздлителями и в эксель импортировать но это уже не то. не буду же я директора напрягать такими телодвижениями.


А я выгружаю в html формате и расширение ставлю xls - нормально смотрится.
voltron
новенький
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

Сообщение voltron »

Копался в своих архивах, и нашел код для выгрузки данных в Excel, наличие самого Excel'я не требуется. Код не мой, ссылка на оригинал тоже утеряна :( ... Может, кому-то пригодится

Код: Выделить всё

unit xlfunct;

interface
 uses Classes, SysUtils;

 procedure XlsBeginStream(XlsStream:TStream; const BuildNumber:Word);
 procedure XlsEndStream(XlsStream:TStream);
 procedure XlsWriteCellRk(XlsStream:TStream; const ACol,ARow:Word; const AValue:Integer);
 procedure XlsWriteCellNumber(XlsStream:TStream; const ACol,ARow:Word; const AValue:Double);
 procedure XlsWriteCellLabel(XlsStream:TStream; const ACol,ARow:Word; const AValue:string);

implementation

const
 CXlsBof:array[0..5] of word = ($809, 8, 00, $10, 0, 0);
 CXlsEof:array[0..1] of word = ($0A, 00);
 CXlsLabel:array[0..5] of word = ($204, 0, 0, 0, 0, 0);
 CXlsNumber:array[0..4] of word = ($203, 14, 0, 0, 0);
 CXlsRk:array[0..4] of word = ($27E, 10, 0, 0, 0);

procedure XlsBeginStream(XlsStream:TStream; const BuildNumber:Word);
begin
 CXlsBof[4]:=BuildNumber;
 XlsStream.WriteBuffer(CXlsBof,SizeOf(CXlsBof));
end;

procedure XlsEndStream(XlsStream:TStream);
begin
 XlsStream.WriteBuffer(CXlsEof,SizeOf(CXlsEof));
end;
//целое число
procedure XlsWriteCellRk(XlsStream:TStream; const ACol,ARow:Word; const AValue:Integer);
 var V:Integer;
begin
 CXlsRk[2]:=ARow;
 CXlsRk[3]:=ACol;
 XlsStream.WriteBuffer(CXlsRk,SizeOf(CXlsRk));
 V:=(AValue shl 2) or 2;
 XlsStream.WriteBuffer(V,4);
end;
//число с плавающей точкой
procedure XlsWriteCellNumber(XlsStream:TStream; const ACol,ARow:Word; const AValue:Double);
begin
 CXlsNumber[2]:=ARow;
 CXlsNumber[3]:=ACol;
 XlsStream.WriteBuffer(CXlsNumber,SizeOf(CXlsNumber));
 XlsStream.WriteBuffer(AValue,8);
end;
//строка
procedure XlsWriteCellLabel(XlsStream:TStream; const ACol,ARow:Word; const AValue:string);
 var L:Word;
begin
 L:=Length(AValue);
 CXlsLabel[1]:=8+L;
 CXlsLabel[2]:=ARow;
 CXlsLabel[3]:=ACol;
 CXlsLabel[5]:=L;
 XlsStream.WriteBuffer(CXlsLabel,SizeOf(CXlsLabel));
 XlsStream.WriteBuffer(Pointer(AValue)^,L);
end;

end.
AMD
постоялец
Сообщения: 189
Зарегистрирован: 23.01.2008 21:25:25
Откуда: Кишинев

Сообщение AMD »

Ктото испытал это?

Сообщение укорочено, предупреждение за избыточное цитирование
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

Я под виндой пользуюсь такой штукой:
SM Software (C), 2000-2004
TXLSFile library v.3.1 and XLSExport components v.1.1
http://sm-software.com
У меня осталась их демо-версия, в которой нет ограничений на число ячеек.
На Делфи скомпилил ДЛЛ, через которую из Лазаря делаю выгрузку.
Пытался пообщаться с разработчиком на предмет перевода на Лазарус, предлагал свои услуги бесплатно - ответили, что это невозможно. Если кто обладает исходным кодом - было бы хорошо узнать, правда ли это.
Когда дойдут у меня руки до Линукса, планирую купить у них исходники и сделать ДЛЛ и SO, если это возможно.
Обидно будет купить и узнать, что таки это невозможно :)
voltron
новенький
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

Сообщение voltron »

AMD писал(а):Ктото испытал это?

У меня работает, иначе бы не выкладывал. Конечно не без шероховатостей - все что не подходит под определение целого, строки или вещественного числа, этим модулем не выводится. Но это решаемо, можно выводить в качестве строки, а потом уже в экселе корректировать тип данных ячеек.
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

Attid писал(а):поищи исходники на руборде =) чтоб зря не покупать =)

Искал, не нашел.
Мож искун из меня хреновый?:)
Ответить