Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.02;
Скачать: CL | DM;

Вниз

OWC.SpreadSheet   Найти похожие ветки 

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

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-26 08:16) [1]

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

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


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

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

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 09:55) [3]


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


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

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


 
MBo ©   (2006-09-26 10:34) [4]

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

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


 
umbra ©   (2006-09-26 10:36) [5]


>  range.numberformat := "@";

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


 
MBo ©   (2006-09-26 10:46) [6]

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


 
umbra ©   (2006-09-26 10:54) [7]

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


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

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

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

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

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


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


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



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


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


 
umbra ©   (2006-09-26 11:25) [10]

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

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

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


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

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

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

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

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

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

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


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


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


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


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


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

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

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


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

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

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


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


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


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


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

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


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

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

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


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

Так надо:

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;



Страницы: 1 вся ветка

Текущий архив: 2009.08.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
2-1244388650
zdm
2009-06-07 19:30
2009.08.02
DBLookupCombobox , отоброзить текст без нажатия выпадения меню


2-1244386325
demon
2009-06-07 18:52
2009.08.02
Прилипоние чужих окон


15-1243743525
Filer
2009-05-31 08:18
2009.08.02
Отловить момент открытия файла


2-1244228392
dumb
2009-06-05 22:59
2009.08.02
Заполнить поле, нажать кнопку


4-1213304094
ply
2008-06-13 00:54
2009.08.02
Сделать фото с веб-камеры