-
C:\Program Files\Microsoft Office\Office\MSOWC.DLL Меня интересует работа с указанным объектом. Имеем код из Аксапты(Х++) рабочий: static void Job15(Args _args)
Суть данного кода - создать лист Эксель, ввести в ячейку значение "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; Но вылетает на второй строчке - "Член группы не найден". Кто-нибудь работал с этим объектом и может прояснить ситуацию?
-
> range := exsheet.range('A1:AA10000'); > range := exsheet.range('A1'); > range.numberformat := '@'; > range.value('00150'); > exsheet.export('c:\1.xls',true);
Эти строки - уже дело пятое, хотя если есть наметки - буду благодарен.
-
Все пибил. Удивительно, но прокатило дальше и такой код сработал: 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". :(
-
> Думкин © (26.09.06 08:34) [2]
А что, использование объекта OWC.SpreadSheet для формирования xls-документа столь принципиально ?
Можно же обойтись вообще безо всяких олей-объектов для этой цели - формировать файл документа "напрямую", без посредников а-ля OWC.SpreadSheet или Excel.Application ..
-
А так не подойдет?
range.numberformat := '00000'; range.Value := '00150';
-
> range.numberformat := '@';
Вы устанавливаете денежный, а не строковый формат ячейки. Попробуйте $ вместо @
-
>umbra как раз $ - денежный, а макрос изменения формата на текстовый и записи выглядит как: Range("A1").Select Selection.NumberFormat = "@" ActiveCell.FormulaR1C1 = "00150"
-
Да, погорячился :(
-
> Сергей М. © (26.09.06 09:55) [3]
Можно и напрямую. Но хотелось бы так. Это Аксапта - очень ограничен выбор. По хорошему, я бы кидал через ОЛЕ напрямую в Эксель - но в Х++ нет двумерных массивов. Придуманы разные способы ускоорения выгрузки данных в Эксель - для меня оптимален приведенный способ.
> MBo © (26.09.06 10:34) [4]
Сенкс. С меня кружка на встрече. :) А с чем это связано?
-
> Думкин © (26.09.06 10:56) [8]
> Можно и напрямую
Тогда предлагаю компромисс - реализовать свой олей-объект, напрямую пишущий в xls-файл и подключить его к X++ точно так же как OWC. Ускорение, думаю, будет ощутимым.
-
посмотрел я хелп по этой OWC (от оффиса XP) и там приведен такой пример присваивания формата Spreadsheet1.ActiveSheet.Range("F1:F10").NumberFormat = "Currency" Может быть, если написать Text, то и формат будет текстовый?
-
> umbra © (26.09.06 11:25) [10]
Когда проходит экспорт, то формат ячейки как и надо - текстовый. Но вот текст там "150", а не тот который нужен.
> Сергей М. © (26.09.06 11:19) [9]
Безусловно. На русскоязычном форуме по Аксапте эта тема изъезжена вдоль и поперек. Напрямую в файл самое быстрое. Например в XML. Но тут еще проблема всплывает. Я использую это в одной штучке - формировании отчетов. Родные для Аксапты3 отчеты - экран,принтер,хтмл,ртф и текст(в 4 там иное, но ее у нас нет). А Экселя - нет. Естественно хочется. С таблицами и прочими готовыми структурами данных - проблем нет. Хоть куда и хоть как пиши. А с отчетами возится приходится. Структура и формирование данных весьма запутано. Получить цельный массив данных не получается, да и хранить его в Аксапте - еще тот геморой.
Поэтому для меня указанное и удобно. И по качеству и по скорости. На данный момент "00000" устроит. Но в целом, конечно, хотелось бы иначе.
Хотя кому отчеты эти нужны в Эксель - поубивав бы. :) По-взрослому, аксапщики такие вещи иначе делают. Но... сказано сделано.
-
> Думкин © (26.09.06 11:39) [11]
> Например в XML.
Зачем в XML-то ? Прямо в XLS ! Не всякий же Ёхель может работать с XML ..
-
> Сергей М. © (26.09.06 12:12) [12]
Я же написал - например. Да хоть куда. Просто не катит мне это.
-
> Сергей М. © (26.09.06 12:12) [12]
Хотя, вообще-то можно. Но это надо будет теткам устанавливать ходить. Ковыряться.... :) Спасибо всем за внимание к вопросу. :)
-
> Думкин © (26.09.06 12:49) [14]
> это надо будет теткам устанавливать ходить
От тебя потребуется самая малость - дать им, теткам, готовый олей-объект (с tlb и справкой, как полагается), который будет читать-писать в XLS-файл напрямую.
За базу можешь взять, к примеру, компонент TXLSReadWrite. Общение с этим компонентом прозрачно и легко, поддерживает он все ёхельные форматы от 5-ки до ХР, демо-версия доступна для скачивания, стоит он дешево (купить - не проблема, сломать - еще меньшая проблема).
-
> Сергей М. © (26.09.06 12:54) [15]
Нее. :) У меня другие задачи уже. Время жалко. Если только для общего развития. У Аксапщиков девиз простой: "минимум программирования". У меня его есть - но тоже стараемся минимизировать.
-
Так надо: 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;
|