Конференция "Corba" » OWC.SpreadSheet [Delphi, Х++, Windows]
 
  • Думкин © (26.09.06 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;



    Но вылетает на второй строчке - "Член группы не найден". Кто-нибудь работал с этим объектом и может прояснить ситуацию?
  • Думкин © (26.09.06 08:16) [1]
    > range := exsheet.range('A1:AA10000');
    >  range := exsheet.range('A1');
    >  range.numberformat := '@';
    >  range.value('00150');
    >  exsheet.export('c:\1.xls',true);

    Эти строки - уже дело пятое, хотя если есть наметки - буду благодарен.
  • Думкин © (26.09.06 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". :(
  • Сергей М. © (26.09.06 09:55) [3]

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


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

    Можно же обойтись вообще безо всяких олей-объектов для этой цели - формировать файл документа "напрямую", без посредников а-ля OWC.SpreadSheet или Excel.Application ..
  • MBo © (26.09.06 10:34) [4]
    А так не подойдет?

    range.numberformat := '00000';
    range.Value  := '00150';
  • umbra © (26.09.06 10:36) [5]

    >  range.numberformat := '@';

    Вы устанавливаете денежный, а не строковый формат ячейки. Попробуйте $ вместо @
  • MBo © (26.09.06 10:46) [6]
    >umbra
    как раз $ - денежный, а макрос изменения формата на текстовый и записи выглядит как:
    Range("A1").Select
    Selection.NumberFormat = "@"
    ActiveCell.FormulaR1C1 = "00150"
  • umbra © (26.09.06 10:54) [7]
    Да, погорячился :(
  • Думкин © (26.09.06 10:56) [8]
    > Сергей М. ©   (26.09.06 09:55) [3]

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

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

    Сенкс. С меня кружка на встрече. :)
    А с чем это связано?
  • Сергей М. © (26.09.06 11:19) [9]

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



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


    Тогда предлагаю компромисс - реализовать свой олей-объект, напрямую пишущий в xls-файл и подключить его к X++ точно так же как OWC.
    Ускорение, думаю, будет ощутимым.
  • umbra © (26.09.06 11:25) [10]
    посмотрел я хелп по этой OWC (от оффиса XP) и там приведен такой пример присваивания формата

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



    Может быть, если написать Text, то и формат будет текстовый?
  • Думкин © (26.09.06 11:39) [11]
    > umbra ©   (26.09.06 11:25) [10]

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

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

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

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

    Хотя кому отчеты эти нужны в Эксель - поубивав бы. :) По-взрослому, аксапщики такие вещи иначе делают. Но... сказано сделано.
  • Сергей М. © (26.09.06 12:12) [12]

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


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


    Зачем в XML-то ? Прямо в XLS !
    Не всякий же Ёхель может работать с XML ..
  • Думкин © (26.09.06 12:43) [13]
    > Сергей М. ©   (26.09.06 12:12) [12]

    Я же написал - например. Да хоть куда. Просто не катит мне это.
  • Думкин © (26.09.06 12:49) [14]
    > Сергей М. ©   (26.09.06 12:12) [12]

    Хотя, вообще-то можно. Но это надо будет теткам устанавливать ходить. Ковыряться.... :)
    Спасибо всем за внимание к вопросу. :)
  • Сергей М. © (26.09.06 12:54) [15]

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


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


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

    За базу можешь взять, к примеру, компонент TXLSReadWrite.
    Общение с этим компонентом прозрачно и легко, поддерживает он все ёхельные форматы от 5-ки до ХР, демо-версия доступна для скачивания, стоит он дешево (купить - не проблема, сломать - еще меньшая проблема).
  • Думкин © (26.09.06 13:12) [16]
    > Сергей М. ©   (26.09.06 12:54) [15]

    Нее. :) У меня другие задачи уже. Время жалко. Если только для общего развития. У Аксапщиков девиз простой: "минимум программирования". У меня его есть - но тоже стараемся минимизировать.
  • Думкин © (27.09.06 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;

 
Конференция "Corba" » OWC.SpreadSheet [Delphi, Х++, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]