Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Экспорт данных их BC++B в MS Office

11K
18 октября 2005 года
ivad
9 / / 18.10.2005
Houston we have a problem!
Никто не может поделиться руководством, можно на англ. работы из Borland C++ 6/0 Builder с MS Word
через OLE Automation? Ответ можно на email [email]vadiv@mail.ru[/email]
Заранее спасибо
Вадим
294
19 октября 2005 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by ivad
Houston we have a problem!
Никто не может поделиться руководством, можно на англ. работы из Borland C++ 6/0 Builder с MS Word
через OLE Automation? Ответ можно на email [email]vadiv@mail.ru[/email]
Заранее спасибо
Вадим



Маленький примерчик: выдираем из Word-овского бланка некоего установленного образца фамилии, имена и отчества людей.

Код:
//
    Variant vWordApp;
    Variant vWordDocs;
    Variant vWordDoc;
    Variant vWordTables;
    Variant vWordTable;
    Variant vWordCells;
    Variant vWordCell;

    int         TablesCount;
    int         i, j, l;
    bool        IsFam, isNam, isPtr;
    String      sItem("Item");
    String      sRange("Range");
    String      sText("Text");
    String      sCount("Count");
    String      sCell("Cell");
    int         ColCount;
    int         RowCount;
    AnsiString  sFam;
    AnsiString  sNam;
    AnsiString  sPtr;
    AnsiString  sBrd;
    AnsiString  sNps;
    TListItem  *it;
    AnsiString  sNNps;
    AnsiString  sNBrd;


    vWordApp    = Variant::CreateObject("Word.Application");
    vWordDocs   = vWordApp.OlePropertyGet("Documents");
    vWordDoc    = vWordDocs.OleFunction("Open", fe1->Text.c_str()); // fe1 — контрол типа Edit, в котором имя файла .doc
    vWordTables = vWordDoc.OlePropertyGet("Tables");
    TablesCount = vWordTables.OlePropertyGet(sCount);

    for(i =  1; i <= TablesCount; i++)
    {  // ищем таблицы (коих там несколько) в документе…
        vWordTable  = vWordTables.OleFunction(sItem, i);
        ColCount    = vWordTable.OlePropertyGet("Columns").OlePropertyGet(sCount);
        RowCount    = vWordTable.OlePropertyGet("Rows").OlePropertyGet(sCount);
        if(ColCount == 6 && RowCount >= 2) // и из них берём ту, которая нужной геометрии
        {
            vWordCell   = vWordTable.OleFunction(sCell, 1, 1);
            sFam        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
            vWordCell   = vWordTable.OleFunction(sCell, 1, 2);
            sNam        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
            vWordCell   = vWordTable.OleFunction(sCell, 1, 3);
            sPtr        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
            if( sFam.UpperCase().Pos("ФАМИЛИЯ") &&
                sNam.UpperCase().Pos("ИМЯ") &&
                sPtr.UpperCase().Pos("ОТЧЕСТВО"))
            {
                for(j = 2; j <= RowCount; j++)
                {
                    vWordCell   = vWordTable.OleFunction(sCell, j, 1);
                    sFam        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
                    vWordCell   = vWordTable.OleFunction(sCell, j, 2);
                    sNam        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
                    vWordCell   = vWordTable.OleFunction(sCell, j, 3);
                    sPtr        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
                    vWordCell   = vWordTable.OleFunction(sCell, j, 4);
                    sBrd        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
                    vWordCell   = vWordTable.OleFunction(sCell, j, 6);
                    sNps        = vWordCell.OlePropertyGet(sRange).OlePropertyGet(sText);
                    sNNps       =         sNps.SubString(1, 3)
                                  + "-" + sNps.SubString(5, 3)
                                  + "-" + sNps.SubString(9, 3)
                                  + " " + sNps.SubString(13, 2);
                    l           = sBrd.UpperCase().Pos("Г.");
                    if(l)
                    {
                        sNBrd = sBrd.SubString(l - 11, 10).Trim();
                        sNBrd =         sBrd.SubString(1, 2)
                                + "." + sBrd.SubString(4, 2)
                                + "." + sBrd.SubString(7, 4);
                    }
                    else
                        sNBrd.SetLength(0);

                    it          = lv1->Items->Add();  // Найденное пихаем в ListView…
                    it->Caption = sNNps;
                    it->SubItems->Add(sFam.Trim());
                    it->SubItems->Add(sNam.Trim());
                    it->SubItems->Add(sPtr.Trim());
                    it->SubItems->Add(sNBrd);

                }
            }
        }
    }
    vWordApp.OleProcedure("Quit"); // Нефиг Word в памяти оставлять!


Прошу не пинать за некузявый и некрасивый код — прога была одноразовая, оптимизировать было бессмысленно.

Да, ещё хотел сказать: это на примитивном уровне работа с Word; если надо пример через Disp-межмордия или средствами OLE API, тады это тема долгого разговора, и проще действительно взять книгу...

Вдогонку:
Interfacing C++Builder With The World Using OLE Automation
Создание контроллеров автоматизации с помощью C++Builder
317
19 октября 2005 года
Relax
573 / / 20.09.2000
есть у меня набор доков по этому вопросу... погляди.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог