Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

OWC.SpreadSheet [Delphi, Х++, Windows]


Думкин ©   (2006-09-26 08:01:00) 

C:\Program Files\Microsoft Office\Office\MSOWC.DLL

Меня интересует работа с указанным объектом.

Имеем код из Аксапты(Х++) рабочий:

static void Job15(Args _args)
{
 COM exappl;
 COM exsheet;
 COM range;
 int i;
 ;

 exappl =  new COM("OWC.SpreadSheet");
 exsheet = exappl.ActiveSheet();
 range = exsheet.range('A1');
 range.numberformat('@');
 range.value("00150");
 exsheet.export('c:\\1.xls',true);
}


Суть  данного кода - создать лист Эксель, ввести в ячейку значение "00150" как строку и выгрузить в Эксель и открыть его. При этом все работает, кроме того, что в я чейкес текстовым форматом оказывается не "00150", а "150".

Чтобы разобраться, начал марковать в Дельфи, на основе вышеуказанного кода:

procedure TForm1.Button2Click(Sender: TObject);
var exappl,exsheet, range : OleVariant;
begin

 exappl :=  CreateOleObject('OWC.SpreadSheet');
 exsheet := exappl.ActiveSheet;       //Тут вылетает
 range := exsheet.range('A1:AA10000');
 range := exsheet.range('A1');
 range.numberformat := '@';
 range.value('00150');
 exsheet.export('c:\1.xls',true);
end;


Но вылетает на второй строчке - "Член группы не найден". Кто-нибудь работал с этим объектом и может прояснить ситуацию?


Думкин   (2006-09-27 13:27:00) [1]

Так надо:

procedure TForm1.Button2Click(Sender: TObject);
var exappl,exsheet, range : OleVariant;
   a : SheetExportActionEnum;
begin

 exappl :=  CreateOleObject('OWC.SpreadSheet');
 exsheet := exappl.ActiveSheet;
 range := exsheet.range['A1'];
 range.numberformat := '@';
 range.value := ' ''00150';
 a := ssExportActionOpenInExcel;
 exsheet.export('c:\1.xls',a);
end;


Думкин   (2006-09-26 13:12:00) [2]

> Сергей М. ©   (26.09.06 12:54) [15]

Нее. :) У меня другие задачи уже. Время жалко. Если только для общего развития. У Аксапщиков девиз простой: "минимум программирования". У меня его есть - но тоже стараемся минимизировать.


Сергей М.   (2006-09-26 12:54:00) [3]


> Думкин ©   (26.09.06 12:49) [14]


> это надо будет теткам устанавливать ходить


От тебя потребуется самая малость - дать им, теткам, готовый олей-объект (с tlb и справкой, как полагается), который будет читать-писать в XLS-файл напрямую.

За базу можешь взять, к примеру, компонент TXLSReadWrite.
Общение с этим компонентом прозрачно и легко, поддерживает он все ёхельные форматы от 5-ки до ХР, демо-версия доступна для скачивания, стоит он дешево (купить - не проблема, сломать - еще меньшая проблема).


Думкин   (2006-09-26 12:49:00) [4]

> Сергей М. ©   (26.09.06 12:12) [12]

Хотя, вообще-то можно. Но это надо будет теткам устанавливать ходить. Ковыряться.... :)
Спасибо всем за внимание к вопросу. :)


Думкин   (2006-09-26 12:43:00) [5]

> Сергей М. ©   (26.09.06 12:12) [12]

Я же написал - например. Да хоть куда. Просто не катит мне это.


Сергей М.   (2006-09-26 12:12:00) [6]


> Думкин ©   (26.09.06 11:39) [11]


> Например в XML.


Зачем в XML-то ? Прямо в XLS !
Не всякий же Ёхель может работать с XML ..


Думкин   (2006-09-26 11:39:00) [7]

> umbra ©   (26.09.06 11:25) [10]

Когда проходит экспорт, то формат ячейки как и надо - текстовый. Но вот текст там "150", а не тот который нужен.

> Сергей М. ©   (26.09.06 11:19) [9]

Безусловно. На русскоязычном форуме по Аксапте эта тема изъезжена вдоль и поперек. Напрямую в файл самое быстрое. Например в XML.
Но тут еще проблема всплывает. Я использую это в одной штучке - формировании отчетов. Родные для Аксапты3 отчеты - экран,принтер,хтмл,ртф и текст(в 4 там иное, но ее у нас нет). А Экселя - нет. Естественно хочется.
С таблицами и прочими готовыми структурами данных - проблем нет. Хоть куда и хоть как пиши. А с отчетами возится приходится. Структура и формирование данных весьма запутано. Получить цельный массив данных не получается, да и хранить его в Аксапте - еще тот геморой.

Поэтому для меня указанное и удобно. И по качеству и по скорости. На данный момент "00000" устроит. Но в целом, конечно, хотелось бы иначе.

Хотя кому отчеты эти нужны в Эксель - поубивав бы. :) По-взрослому, аксапщики такие вещи иначе делают. Но... сказано сделано.


umbra   (2006-09-26 11:25:00) [8]

посмотрел я хелп по этой OWC (от оффиса XP) и там приведен такой пример присваивания формата

Spreadsheet1.ActiveSheet.Range("F1:F10").NumberFormat = "Currency"

Может быть, если написать Text, то и формат будет текстовый?


Сергей М.   (2006-09-26 11:19:00) [9]


> Думкин ©   (26.09.06 10:56) [8]



> Можно и напрямую


Тогда предлагаю компромисс - реализовать свой олей-объект, напрямую пишущий в xls-файл и подключить его к X++ точно так же как OWC.
Ускорение, думаю, будет ощутимым.


Думкин   (2006-09-26 10:56:00) [10]

> Сергей М. ©   (26.09.06 09:55) [3]

Можно и напрямую. Но хотелось бы так. Это Аксапта - очень ограничен выбор. По хорошему, я бы кидал через ОЛЕ напрямую в Эксель - но в Х++ нет двумерных массивов. Придуманы разные способы ускоорения выгрузки данных в Эксель - для меня оптимален приведенный способ.

> MBo ©   (26.09.06 10:34) [4]

Сенкс. С меня кружка на встрече. :)
А с чем это связано?


umbra   (2006-09-26 10:54:00) [11]

Да, погорячился :(


MBo   (2006-09-26 10:46:00) [12]

>umbra
как раз $ - денежный, а макрос изменения формата на текстовый и записи выглядит как:
Range("A1").Select
Selection.NumberFormat = "@"
ActiveCell.FormulaR1C1 = "00150"


umbra   (2006-09-26 10:36:00) [13]


>  range.numberformat := '@';

Вы устанавливаете денежный, а не строковый формат ячейки. Попробуйте $ вместо @


MBo   (2006-09-26 10:34:00) [14]

А так не подойдет?

range.numberformat := '00000';
range.Value  := '00150';


Сергей М.   (2006-09-26 09:55:00) [15]


> Думкин ©   (26.09.06 08:34) [2]


А что, использование объекта OWC.SpreadSheet для формирования xls-документа столь принципиально ?

Можно же обойтись вообще безо всяких олей-объектов для этой цели - формировать файл документа "напрямую", без посредников а-ля OWC.SpreadSheet или Excel.Application ..


Думкин   (2006-09-26 08:34:00) [16]

Все пибил. Удивительно, но прокатило дальше и такой код сработал:

procedure TForm1.Button2Click(Sender: TObject);
var exappl,exsheet, range : OleVariant;
begin

 exappl :=  CreateOleObject('OWC.SpreadSheet');
 exsheet := exappl.ActiveSheet;
 range := exsheet.range['A1'];
 range.numberformat := '@';
 range.value := '00150';
 exsheet.export('c:\\1.xls');
end;


Только в ячейке по прежнему не "00150", а "150". :(


Думкин   (2006-09-26 08:16:00) [17]

> range := exsheet.range('A1:AA10000');
>  range := exsheet.range('A1');
>  range.numberformat := '@';
>  range.value('00150');
>  exsheet.export('c:\1.xls',true);

Эти строки - уже дело пятое, хотя если есть наметки - буду благодарен.


Наверх

Титульная страница Поиск, карта сайта Написать письмо