Взаимодествие PHP с COM+

Keepun

Guest
Взаимодествие PHP с COM+

Итак: у меня PHP 5.0 и Microsoft Office XP

PHP:
<?php
// starting word
$word = new COM("Word.Application") or die("Unable to instanciate Word");
//bring it to front
$word->Visible = 1;

//open an empty document
$word->Documents->Open("E:/Uselestest2.doc");
Документ открывается, но вопрос не в этом!
Вопрос: Как организовать замену текста в открытом документе через PHP с СОМ+?

PHP:
//free the object
$word->Release();
$word = null;
?>
 

Profic

just Profic (PHP5 BetaTeam)
использование встроенного в VBA-редактор object-browser-а
использование помощи по объектной модели этого монстрика, идущей в комплекте с офисом
использование msdn
поиск по форуму

ЗЫ. и причем здесь php?
 

Keepun

Guest
Замена текста в Word'e на PHP с COM+

Profic:
использование встроенного в VBA-редактор object-browser-а
использование помощи по объектной модели этого монстрика, идущей в комплекте с офисом
использование msdn
поиск по форуму
Искал и вот что нашел в справке VBA для Word (Vbawd10.chm):
With ActiveDocument.Content.Find
.ClearFormatting
.Font.Bold = True
With .Replacement
.ClearFormatting
.Font.Bold = False
End With
.Execute FindText:="", ReplaceWith:="", _
Format:=True, Replace:=wdReplaceAll
End With
но я с VBA никогда не имел дело :( , поэтому прошу помочь в переводе на нормальный PHP-скрипт.

Объясняю: Мне нужен скрипт, который открывает шаблон Word'a, заменяет фразы "Поле1" на "Дядя Степа" и "Поле2" на "Работник зоопарка".

Profic: ЗЫ. и причем здесь php?
Мне не нужен VBA-скрипт - Мне нужен PHP-скрипт!!!
 

Profic

just Profic (PHP5 BetaTeam)
ну так в чем проблема? если есть мозги в голове, то переписать это на php не составит никакого труда
точки заменяются на ->
with заменяется на тот же блок, только объект-параметр with пишешь перед каждым выражением в with
как получить объект ActiveDocument (типа Document) опять же написано в хелпе.
именованные параметры заменяются на вызов метода объекта с расстановкой в нужных местах нужных параметров. нужная последовательность параметров опять же узнается из хелпа

будут КОНКРЕТНЫЕ вопросы, приходи. а тут МЕХАНИЧЕСКАЯ работа
 

Keepun

Guest
Вот код моего скрипта, который должен открыть шаблон и заменить поля:
PHP:
<?php
// starting word
$word = new COM("Word.Application") or die("Unable to instanciate Word");
$word->Visible = 1;
$word->Documents->Open("E:/Uselestest2.doc");
    $word->Selection->Find->ClearFormatting(); // Помоему это лишнее
    $word->Selection->Find->Text = "Да пошел";
    $word->Selection->Find->Replacement->ClearFormatting(); // и это тоже
    $word->Selection->Find->Replacement->Text = "hello";
    $word->Selection->Find->Execute Replace="wdReplaceAll", Forward=True, Wrap="wdFindContinue";

$word->Release();
$word = null;
?>
Мне непонятна строка:
$word->Selection->Find->Execute Replace="wdReplaceAll", Forward=True, Wrap="wdFindContinue";
Как с ней быть?
 

Profic

just Profic (PHP5 BetaTeam)
Итить
1) программировать умеем?
2) читать, что написано умеем?
3)
$word->Selection->Find->Execute Replace="wdReplaceAll", Forward=True, Wrap="wdFindContinue";
Как с ней быть?
именованные параметры заменяются на вызов метода объекта с расстановкой в нужных местах нужных параметров. нужная последовательность параметров опять же узнается из хелпа
+ константы заменяются на их значения, которые опять же узнаются из Object Browser-а.
4) у объекта Word.Application нет свойства Selection. Оно есть у объекта Document. Может все же прочитаешь хелп по методу Open?
5) повторюсь еще раз. PHP тут вообщем-то никаким боком. Если есть мозги в голове, то все делается на ура
6) конструкцию With ... можно также заменить на присваивание этого объекта веременной переменной и работу с ней
 

Keepun

Guest
1 - программировать умею на PHP, Perl, Pascal и т.п.
2 - читать умею
3 - Какие "константы", на что заменять?
4 - судя по этому пункту - вы сами хелп не читали!
5 - Так мне нужно через PHP с технологией COM+ отредактировать шаблон документа!!!

Может дадите наглядный скрипт замены текста в Word'e
 

Profic

just Profic (PHP5 BetaTeam)
1. 2. Если, честно, то как то не заметно
3. То, что в Execute зачем-то взял в кавычки. Это константы. Их нужно поменять на значения, которые можно узнать введя в поиск ObjectBrowser-а их (констант) имя.
4. Да? Я же носом ткнул в описание метода, на который нужно обратить внимание. Откуда у ПРИЛОЖЕНИЯ ВЫДЕЛЕНИЕ? Оно, даже если просто логически подумать, может быть только у документа, который открыт в этом приложении.
5. PHP здесь таким же боком, как и VB. Тебе не приходило в голову, что все, что нужно это просто познакомиться с объекной моделью ворда и работать с ней? Технология COM как раз для того и предназначена, чтобы можно было использовать объекты из любого языка используя правила ООП этого языка. А то что в VB есть такое понятие как именованные параметры не должно вводить тебя в ступор, если ты программируешь аж на PHP, Perl, Pascal...

Пример наглядный, но не более того. Я его не проверял, но, по крайней мере на php5, оно должно работать (php4 я уже давно в глаза не видел)
PHP:
<?php
// starting word
$word = new COM("Word.Application") or die("Unable to instanciate Word");
$word->Visible = 1;
$doc = $word->Documents->Open('E:\\Uselestest2.doc');
$docFind = $doc->Selection->Find;
$docFind->ClearFormatting();
$docFind->Text = 'Сам пошёл';
$docFind->Replacement->ClearFormatting();
$docFind->Replacement->Text = "Куда пошел?";
/**
параметры в строке ниже записываются в правильной форме
в ObjectBrowser-е (или Help-е) узнается прототип метода, выглядеть который будет где-то так:
Execute (Param1, Param2, Param3, Param4)
ищешь среди них нужные себе и все, что не нужны между ними заменяешь на значение по умолчанию (из хелпа - там точно написано), например тебе нужны параметры Param1 и Param3, тогда пишешь
$docFind->Execute (Param1_value, Param2_default, Param3_value);
при этом не забыв про константы. Их, кстати можно легко индентифицировать, т.к. все вордовские константы начинаются на wd
*/
$docFind->Execute (/*Replace="wdReplaceAll", Forward=True, Wrap="wdFindContinue"*/); 

$word->Release();
$word = null;
?>
К тому же советую посмотреть Пример #1 на [m]class.com[/m].
 

Keepun

Guest
Profic оказывается мы оба умеем программировать, просто PHP не всегда все понимает, как на надо!!! :)

PHP:
<?php
// starting word
$word = new COM("Word.Application");
$word->Visible = 1;
$word->Documents->Open("E:/Uselestest.doc");
// $word->Options->ReplaceSelection = false;
// $word->Documents(1)->Activate();
    $word->Selection->Find->ClearFormatting();
    $word->Selection->Find->Text = "Привет";
    $word->Selection->Find->Replacement->ClearFormatting();
    $word->Selection->Find->Replacement->Text = "Прощай";
    $word->Selection->Find->Execute(false, False, False, False, False, False, True, wdFindContinue, False, false, wdReplaceAll, False, False, False, False);
/*
Fatal error: Uncaught exception 'com_exception' with message 'Source: Unknown
Description: Unknown' in E:\WebSite\www\excel.php:21 Stack trace: #0 {main} thrown in E:\WebSite\www\excel.php on line (функция Execute)
*/
$word->Release(); // Fatal error: Uncaught exception 'com_exception' with message 'Error Член группы не найден. ' in E:\WebSite\www\excel.php:28 Stack trace: #0 {main} thrown in E:\WebSite\www\excel.php
$word = null;
?>
Из справки:
Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace, MatchKashida, MatchDiacritics, atchAlefHamza, MatchControl)

Я много вриянтов Execute() перепробовал, но все они ошибочны! :(
И что за фигня с Release()?
Объясните...
 

Profic

just Profic (PHP5 BetaTeam)
Блин ну сколько можно мусолить...
Q:
Я много вриянтов Execute() перепробовал, но все они ошибочны!
A:
Это константы. Их нужно поменять на значения, которые можно узнать введя в поиск ObjectBrowser-а их (констант) имя
+ пропускаемые параметры заменять не False-ами, а значениями по умолчанию
Q:
И что за фигня с Release()
A:
Член группы не найден
 

Keepun

Guest
1. Мусолить будем, пока не заработает!!! :)
2. К сожелению костанты расставлены правильно! Если легче будет, можно и так (разнецы нет!): Execute("Привет!", False, False, False, False, False, True, wdFindContinue, False, "Прощай!", wdReplaceAll, False, False, False, False);
 

Profic

just Profic (PHP5 BetaTeam)
Пилять, идиот (с)
Ну сколько раз можно повторять? Написано же русским языком.
Это константы. Их нужно поменять на значения, которые можно узнать введя в поиск ObjectBrowser-а их (констант) имя
т.е. все вот эти свои великолепные wdFindContinue и т.п. поменяться нужно на цифры, которые соответствуют этим именам. Блин я удивляюсь, похоже кто-то вообще не знает что такое константа.

ЗЫ. [m]error_reporting[/m] (E_ALL);
 

neko

tеam neko
кстати из ворда неплохо еще выходить
а то так повиснет процесс
 

Profic

just Profic (PHP5 BetaTeam)
neko
я ему давал ссылку на пример где как раз рассматривается запуск и завершение ворда. только похоже пациент невминяем...
 

IronHawk

Новичок
День добрый, Уважаемые.
Прочитал сию переписку... и задался вопросом,
если ошибок нет(все поправлено, права выданы, ворд от имени необходимого пользователя ходит как "дети в школу"...)
приложение просто завершается процессом по таймауту :-(
Выполняемый код, приведен Profic в 8-м посте данной темы.
Спасибо за внимание.

P.S. Конфигурация: Windows XP Prof+SP3, MS Office 2k3+SP3, IIS5.1, PHP 5.2.5.
 

vaslex

Новичок
Вот рабочий вариант:
PHP:
	$word = new COM("Word.Application");
	$word->Visible = 1;
	$word->Documents->Open("Документ.doc");

	$word->ActiveDocument->Content->Find->Execute(
		/* FindText = */ "ИЩЕМ_ТЕКСТ",
		/* MatchCase = */ FALSE,
		/* MatchWholeWord = */ FALSE,
		/* MatchWildcards = */ FALSE,
		/* MatchSoundsLike = */ FALSE,
		/* MatchAllWordForms = */ FALSE,
		/* Forward = */ TRUE,
		/* Wrap = */ 0,
		/* Format = */ FALSE,
		/* ReplaceWith = */ "ЗАМЕНЯЕМ_НА_ТЕКСТ",
		/* Replace = wdReplaceAll */ 2,
		/* MatchKashida = */ FALSE,
		/* MatchDiacritics = */ FALSE,
		/* MatchAlefHamza = */ FALSE,
		/* MatchControl = */ FALSE
	);
Документация: Find.Execute

P.S. для Profic: Вместо того, чтобы сраться друг с другом, взяли бы и проверили скрипт.
 
Сверху