C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: поиск и замена текста word\excel ole  (Прочитано 12365 раз)
anton_ms
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 252


« : 26 Март 2008, 10:22:52 »

Помогите, пжл, осуществить поиск и замену текста в word\excel при помощи ole. Может кто работал и знает как? или ссылочку полезную.....
Записан
vva
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 29


« Ответ #1 : 26 Март 2008, 10:48:50 »

http://wladm.narod.ru/C_Sharp/componentbegin.html
Записан
AVC
Администратор


Сказали спасибо: +28/-6
Offline

Сообщений: 1189


« Ответ #2 : 26 Март 2008, 11:10:56 »

https://cbuilder.ru/index.php/topic,264.0.html

Ссылка на cppbuilder содержала примерно такой код
Код:
void __fastcall MSWordSubstitute
 (Variant               find
 ,const AnsiString      &oldtext
 ,const AnsiString      &newtext       
 )
{
Variant repl = find.OlePropertyGet("Replacement");
find.OleProcedure       ("ClearFormatting");
repl.OleProcedure       ("ClearFormatting");

find.OleProcedure       ("Execute",
/* FindText             */      oldtext,
/* MatchCase            */      false,
/* MatchWholeWord       */      false,
/* MatchWildcards       */      false,
/* MatchSoundsLike      */      false,
/* MatchAllWordForms    */      false,
/* Forward              */      true,
/* Wrap                 */      1,
/* Format               */      false,
/* ReplaceWith          */      newtext,
/* Replace              */      2
);
}

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

PACKAGE void __fastcall DocShowInMSWord
 (const AnsiString       &filespec
 ,bool                    readonly
 ,TAxRecord              *substrec // мое, не обращайте внимания
 )
{
if (filespec.Trim().IsEmpty())  return;
if (!FileExists(filespec))
 {  ShowMessage("Не могу найти файл <" + filespec + ">");
    return;
 }

Variant MSWord  = Null;
Variant MWODocs = Null;
Variant MWODoc  = Null;
Variant MWOSel  = Null;
Variant MWOFind = Null;

AnsiString WhereIAm;


try             {       MSWord = Variant::GetActiveObject("Word.Application");  }
catch (...)     {       MSWord = Null;                                          }

if (MSWord.IsNull())
 {      try     {       MSWord = Variant::CreateObject("Word.Application");     }
        catch (Exception &xcp)
         {      ShowMessage("Не могу запустить приложение MSWord\n" + xcp.Message);
                MSWord = Null;
                return;
         }
 }


try     {
WhereIAm = "Set Visible = false";
MSWord.OlePropertySet("Visible", false);

WhereIAm = "Get Documents collection";
MWODocs = MSWord.OlePropertyGet("Documents");

/*
Documents.Open  (FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
                                 PasswordDocument, PasswordTemplate, Revert,
                                 WritePasswordDocument, WritePasswordTemplate, Format   )
!!!!!!!!!!
        Если Word запущен командной строкой, то он не может открыть документ
!!!!!!!!!
*/
try         {       MWODoc = MWODocs.OleFunction("Open", filespec, false, readonly, false); }
catch (...) {       MSWord.OlePropertySet("Visible", true);         MWODoc = Null;          }

if (MWODoc.IsNull())            //      Попытка создать новый сервер
 {      try
         {      MSWord = Variant::CreateObject  ("Word.Application");
                MSWord.OlePropertySet           ("Visible", false);
                MWODocs = MSWord.OlePropertyGet ("Documents");
                MWODoc  = MWODocs.OleFunction   ("Open", filespec, false, readonly, false);
         }
        catch (Exception &xcp)
         {      ShowMessage (AnsiString("")                                 +
                             "Не могу запустить приложение MSWord.\n"       +
                             "Если оно у Вас уже запущено закройте его и повторите попытку."
                            );
                MSWord = Null;
                return;
         }
 }      // new Word.Application


WhereIAm = "Get Selection";
MWOSel  = MSWord. OlePropertyGet ("Selection");

WhereIAm = "Get Selection.Find";
MWOFind = MWOSel. OlePropertyGet ("Find"     );


TAxRecord *rec                    = substrec;
bool       needsubstitute = rec && (rec->Count > 0);

if (needsubstitute)
 {      AnsiString       fldname;
        AnsiString       fldvalue;
        TAxField        *fld;
        for (int i=(rec->Count-1); i >= 0; i--)
         {      fld = rec->Items[i];
                fldname  = "<#fld" + fld->Name + "#>";
                try             {       fldvalue = fld->AsString;       }
                catch (...)     {       fldvalue = "";                  }
                try     {       WhereIAm = "Substitute " + fldname;
                                MSWordSubstitute(MWOFind, fldname, fldvalue);
                        }
                catch (...)     {       ;       }
         }      // for fields
 }      // need substitute


}       // try  Documents

catch (Exception &xcp)
 {      ShowMessage("Ошибка при подготовке файла.\n" + WhereIAm + "\n" + xcp.Message);
 }

MSWord.OlePropertySet("Visible", true);
MSWord.OlePropertySet("WindowState", 1);        // 0-Normal; 1->Maximize; 2-Minimize

MWOFind = Null;
MWOSel  = Null;
MWODoc  = Null;
MWODocs = Null;
MSWord  = Null;
}

//---------------------------------------------------------------------------
Записан
anton_ms
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 252


« Ответ #3 : 27 Март 2008, 06:20:18 »

Посмотрел ссылки но не работает....
Пишу такой код
Код:
Variant Word,  Document;
  Word=CreateOleObject("Word.Application");
  Word.OlePropertySet("Visible", false);
  Document=Word.OlePropertyGet("Documents");
  Document.OleProcedure("Open", "D:\\test.doc");
  Word.OlePropertyGet("Selection");
  Word.OlePropertyGet("Find");//ошибка
  Document.OleProcedure      ("Execute",
  /* FindText             */      "привет",
  /* MatchCase            */      false,
  /* MatchWholeWord       */      false,
  /* MatchWildcards       */      false,
  /* MatchSoundsLike      */      false,
  /* MatchAllWordForms    */      false,
  /* Forward              */      true,
  /* Wrap                 */      1,
  /* Format               */      false,
  /* ReplaceWith          */      "пока",
  /* Replace              */      2
  );
  Word.OleProcedure("Quit");

Документ открывается, но при обработке вылетает ошибка
Записан
anton_ms
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 252


« Ответ #4 : 27 Март 2008, 07:44:41 »

получилось у меня так
Код:
Word.OlePropertyGet("Selection").OlePropertyGet("Find").OleProcedure("Execute", "привет", false, false, false, false, false, true, 1, false, "пока", 2);
Работает, но теперь спрашивает сохранять ли изменеия в документе, мне не надо чтобы это окошко выскакивало, а надо чтобы сохранялись изменения в документе сразу без вопроса....
что надо еще дописать?
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


« Ответ #5 : 27 Март 2008, 08:49:23 »

по идее Word.OlePropertyGet("Document").OleProcedure("Save", ....)
хотя я в OLE как свинья в апельсинах
Записан
anton_ms
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 252


« Ответ #6 : 27 Март 2008, 08:59:45 »

 работает!!! oxotnik можешь подскажешь как это все в excele сделать, ни как ни могу разобраться с листами и ячейками 
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


« Ответ #7 : 27 Март 2008, 10:29:15 »

работает!!! oxotnik можешь подскажешь как это все в excele сделать, ни как ни могу разобраться с листами и ячейками 
фигасе!
у экселя по идее тоже самое, только в теле документа есть еще и лист (хз как его по аглицки написать... на д...мо похоже ) и есть еще ячейки... глянь либо по форуму, либо эксель открой в его вижуал-бейсике там все свойства перечислены
Записан
anton_ms
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 252


« Ответ #8 : 27 Март 2008, 11:23:33 »

 Help!!! Не могу сделать поиск с заменой в Excel......
Записан
anton_ms
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 252


« Ответ #9 : 28 Март 2008, 08:18:37 »

Посмотрите, кто с ole работал, пишу код
Код:
Variant MSExcel, XLWBooks, XLWBook;
   int i=0;
   MSExcel = CreateOleObject("Excel.Application");
   MSExcel.OlePropertySet("DisplayAlerts", false);
   MSExcel.OlePropertySet("Visible", true);
   XLWBooks = MSExcel.OlePropertyGet("Workbooks");
   XLWBooks.OleProcedure("Open", "D:\\test.xls");
   /*ошибка*/XLWBooks.OlePropertyGet("Item", i+1).OlePropertyGet("WorkSheets").OlePropertyGet("Item", 1).OlePropertyGet("Range", "A1:H20").OlePropertyGet("Find").OleProcedure("Execute","privet",false,false,false,false,false,true,1,false, "пока",2);
   MSExcel.OleProcedure("Quit");
   MSExcel=Unassigned;

вылетает ошибка....
в чем дело не могу разобраться....... 
Записан
Mr.March
новенький


Сказали спасибо: +0/-0
Offline

Сообщений: 1

Forgiven


« Ответ #10 : 07 Май 2012, 20:43:11 »

Привет! Посмотрел твой вариант, он действительно не работает:) После того, как прочитал справку на msdn о работе функции Replace, получилось заставить изменять таким образом:
Код
Range=Excel.OlePropertyGet("Range", "A1:C50");
Range.OleProcedure("Replace","text_to_replace", WideString("replacement"));
 

Надеюсь, тем, кто еще столкнется с такой проблемой это поможет
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #11 : 09 Май 2012, 14:38:51 »

Разбей это
Код
XLWBooks.OleProcedure("Open", "D:\\test.xls");
/*ошибка*/XLWBooks.OlePropertyGet("Item", i+1).OlePropertyGet("WorkSheets").OlePropertyGet("Item", 1).OlePropertyGet("Range", "A1:H20").OlePropertyGet("Find").OleProcedure("Execute","privet",false,false,false,false,false,true,1,false, "пока",2);
 

по частям. Во-первых, открываемую книгу сразу назначай переменной:
Код
Variant wBook = NULL;
wBook = XLWBooks.OleFunction("Open", L"D:\\test.xls");
 

Теперь уже работаем с wBook:
Код
Variant wSheet = NULL, wRange = NULL, wFind = NULL;
wSheet = wBook.OlePropertyGet("WorkSheets").OlePropertyGet("Item", 1);
wRange = wSheet.OlePropertyGet("Range", L"A1:H20");
wFind = wRange.OlePropertyGet("Find");
// и так далее...
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.149 секунд. Запросов: 20.