выгрузка в Exel из под линукса.
Модератор: Модераторы
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
выгрузка в Exel из под линукса.
кто-нибуть занимался таким?
если да то как подойти ?
или может я не так подхожу, мысль такая, некоторые отчеты в линуксовой программе которая отоброжает их в гриде надо чтоб пользователь мог унести домой и поработать с ними в exel
можно конечно посто выгрузить в файл с раздлителями и в эксель импортировать но это уже не то. не буду же я директора напрягать такими телодвижениями.
если да то как подойти ?
или может я не так подхожу, мысль такая, некоторые отчеты в линуксовой программе которая отоброжает их в гриде надо чтоб пользователь мог унести домой и поработать с ними в exel
можно конечно посто выгрузить в файл с раздлителями и в эксель импортировать но это уже не то. не буду же я директора напрягать такими телодвижениями.
-
betatester
- постоялец
- Сообщения: 276
- Зарегистрирован: 27.04.2007 22:21:45
- Контактная информация:
В Delphi это делалось через OLE - механизм.
Т.е., из программы вызвался Excel как сервер, создавался новый документ и туда совались данные, документ сохранялся, сервер уничтожался.
В Linux это по определению не возможно.
Нужно, ИМХО, копать в сторону OpenOffice - если там какой-либо похожий механизм... Но мне видиться, что ничего не выйдет.
Единственный, ИМХО, метод - сохранение в каком-либо открытом формате - dot separeted или XML...
Т.е., из программы вызвался Excel как сервер, создавался новый документ и туда совались данные, документ сохранялся, сервер уничтожался.
В Linux это по определению не возможно.
Нужно, ИМХО, копать в сторону OpenOffice - если там какой-либо похожий механизм... Но мне видиться, что ничего не выйдет.
Единственный, ИМХО, метод - сохранение в каком-либо открытом формате - dot separeted или XML...
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
- Alexander
- энтузиаст
- Сообщения: 888
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
посмотри:
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,
Может эксель это проглотит с минимальными вопросами ?
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,
Может эксель это проглотит с минимальными вопросами ?
- Alexander
- энтузиаст
- Сообщения: 888
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
А эта штука бесполезна ? (http://search.cpan.org/dist/Spreadsheet-WriteExcel/)
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Ну, раз пошла такая пьянка...
1. Михаил, за пример спасибо!
2. Если расковыривать пример который к OpenOffice, то вот какой вопрос возникает:
если так
то все нормально, вот если диапазон ячеек выделять
то как сразу этому диапазону значение задать?
В Excell работало без проблем. В OpenOffice реально задать значения сразу диапазону? Ну, чтобы по таблице в цикле не бегать...
1. Михаил, за пример спасибо!
2. Если расковыривать пример который к OpenOffice, то вот какой вопрос возникает:
если так
Код: Выделить всё
Cell := Sheet.getCellByPosition(0, 0);
Cell.setString:= 'Типа занесли что-то';
то все нормально, вот если диапазон ячеек выделять
Код: Выделить всё
Cell := Sheet.getCellRangeByPosition(0, RecCount, 0, FldCount);то как сразу этому диапазону значение задать?
Код: Выделить всё
Cell.set??????:= TableVals; // заранее сформированный вариантный массив В Excell работало без проблем. В OpenOffice реально задать значения сразу диапазону? Ну, чтобы по таблице в цикле не бегать...
Attid писал(а):кто-нибуть занимался таким?
если да то как подойти ?
или может я не так подхожу, мысль такая, некоторые отчеты в линуксовой программе которая отоброжает их в гриде надо чтоб пользователь мог унести домой и поработать с ними в exel
можно конечно посто выгрузить в файл с раздлителями и в эксель импортировать но это уже не то. не буду же я директора напрягать такими телодвижениями.
А я выгружаю в html формате и расширение ставлю xls - нормально смотрится.
Копался в своих архивах, и нашел код для выгрузки данных в 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.
Я под виндой пользуюсь такой штукой:
SM Software (C), 2000-2004
TXLSFile library v.3.1 and XLSExport components v.1.1
http://sm-software.com
У меня осталась их демо-версия, в которой нет ограничений на число ячеек.
На Делфи скомпилил ДЛЛ, через которую из Лазаря делаю выгрузку.
Пытался пообщаться с разработчиком на предмет перевода на Лазарус, предлагал свои услуги бесплатно - ответили, что это невозможно. Если кто обладает исходным кодом - было бы хорошо узнать, правда ли это.
Когда дойдут у меня руки до Линукса, планирую купить у них исходники и сделать ДЛЛ и SO, если это возможно.
Обидно будет купить и узнать, что таки это невозможно
SM Software (C), 2000-2004
TXLSFile library v.3.1 and XLSExport components v.1.1
http://sm-software.com
У меня осталась их демо-версия, в которой нет ограничений на число ячеек.
На Делфи скомпилил ДЛЛ, через которую из Лазаря делаю выгрузку.
Пытался пообщаться с разработчиком на предмет перевода на Лазарус, предлагал свои услуги бесплатно - ответили, что это невозможно. Если кто обладает исходным кодом - было бы хорошо узнать, правда ли это.
Когда дойдут у меня руки до Линукса, планирую купить у них исходники и сделать ДЛЛ и SO, если это возможно.
Обидно будет купить и узнать, что таки это невозможно
AMD писал(а):Ктото испытал это?
У меня работает, иначе бы не выкладывал. Конечно не без шероховатостей - все что не подходит под определение целого, строки или вещественного числа, этим модулем не выводится. Но это решаемо, можно выводить в качестве строки, а потом уже в экселе корректировать тип данных ячеек.
