PHP: MS Word, COM koppeling probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Halo allemaal,

Voor een project wil ik via PHP een koppeling maken met MS Word op mijn server waarmee ik een template met gegevens wil gaan vullen. Zo wil ik dus standard documenten via PHP aanmaken.

De koppeling via de COM klasse in PHP lukt mij wel en ik kan de documenten aanmaken. Alles gaat prima totdat ik het volgende aanroep:

<?php
...
$word->Quit();
$word->Release();
$word = null;
?>

Op de server is het process WINWORD.exe nog steeds actief. De PHP script sluit het proces dus niet af. Als ik vervolgens de PHP script nog een keer ga uitvoeren, dan verschijnt nog een WINWORD.exe process in het task manager van Windows.

Ik vraag me af hoe dit komt? Ligt het aan de PHP versie die ik gebruik of is het iets anders? Ik gebruik trouwens PHP 4.3.2.

Is er trouwens misschien een ander mannier om een .doc aan te maken zonder de COM koppeling met MS Word? Misschien door bijvoorbeeld een DLL? De bedoeling van mijn project is om een template in MS Word aan te maken met bladwijzers daarin. Daarna wil ik deze bladwijzers vullen met gegevens via PHP. De plaatsbepaling van de bladwijzers in MS Word maak ik zelf.


Alvast bedankt,
Met vriendelijke groet,

S. Kolic

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Hoe maak je die com aan dan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Megamind,

Ik maak de instantie met de onderstaande code. Deze code runt een WINWORD.exe op de server, maar sluit 'm niet.

<?php
$word = new COM("word.application") or die("Kan MS Word instantie niet maken.");
...
$word->Quit();
$word->Release();
$word = null;
?>

Gr,

S. Kolic

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
Heh, ditzelfde probleem heb ik ook gehad toen ik zoiets in een .net-applicatie heb ingebouwd: proces WINWORD.EXE werd inderdaad niet afgesloten.
Oplossing die ik heb gebruikt (beetje dom maar het werkt in ons geval wel): eerst alle WINWORD-processen opslaan (array van pid's) en dan aan het eind (gaat om halve seconden als het niet minder is) alle WINWORD-processen afschieten behalve die in het opgeslagen rijtje zitten.
We doen dat zo omdat er Wordvensters open kunnen staan van gebruikers op die server (via terminal server). Het is niet mooi maar het werkt wel. :)

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Vreemd als ik dit in PHP5 stop dan krijg ik wel wat fouten maar WinWord sluit wel gewoon af..

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Lijkt erop dat word zichzelf niet kan afsluiten in je code. Als je bv wijzigingen aanbrengt in een doc of onderliggend sjabloon verhindert een dialoogvenster dat word sluit. M.a.w. zorg ervoor dat je voor je de applicatie sluit eerst alle onderliggende documenten opgeslagen of gecanceld hebt.

Eventueel maak je (tijdelijk) het applicatieobject zichtbaar om na te gaan wat je code exact doet met je word instantie.

[ Voor 17% gewijzigd door Lustucru op 23-10-2006 11:34 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
Megamind schreef op maandag 23 oktober 2006 @ 11:31:
Vreemd als ik dit in PHP5 stop dan krijg ik wel wat fouten maar WinWord sluit wel gewoon af..
Dan heb je volgens mij geluk. Ik heb dat in mijn zoektocht naar de oplossing ook een paar keer gezien: bij sommige mensen doet 'ie het gewoon wel goed, en bij anderen niet. Misschien ligt het aan de versie Word ofzo. Ik weet het niet, maar bij ons weigerde 'ie pertinent iig.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • [ti]
  • Registratie: Februari 2000
  • Niet online
Probeer bij het afsluiten eens:

PHP:
1
2
3
4
$word->ActiveDocument->Close(false); // evt. Close(false, null, null);
$word->Quit(false); // evt. Quit(false, null, null);
$word->Release();
$word = null;

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heheh, ja dat zou wel kunnen jah...

Dat heb ik al ongeveer ingebouwd, alleen vind ik het niet echt mooi. Wel een creative oplossing ;)
Ik zoek toch iets dat dit probleem op een ander manier kan oplossen. Het hoeft niet per se via de COM klasse te zijn. Als iemand een DLL kent die .doc bestanden kan aanmaken en de bladwijzers met gegevens kan vullen, dan ben ik dik tevreden.

Toch bedankt voor je reactie Cyphax.

Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Cyphax schreef op maandag 23 oktober 2006 @ 11:29:
Heh, ditzelfde probleem heb ik ook gehad toen ik zoiets in een .net-applicatie heb ingebouwd: proces WINWORD.EXE werd inderdaad niet afgesloten.
Oplossing die ik heb gebruikt (beetje dom maar het werkt in ons geval wel): eerst alle WINWORD-processen opslaan (array van pid's) en dan aan het eind (gaat om halve seconden als het niet minder is) alle WINWORD-processen afschieten behalve die in het opgeslagen rijtje zitten.
We doen dat zo omdat er Wordvensters open kunnen staan van gebruikers op die server (via terminal server). Het is niet mooi maar het werkt wel. :)
Ik heb hetzelfde probleem gehad maar dan met BusinessObjects, ongeveer dezelfde oplossing gebruikt. Gelukkig had ik het voordeel dat mijn applicatie onder een apart user account draaide dus ik kon gewoon alle processen van mijn gebruiker afschieten.

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Niesje,

Dat snap ik... maar in mijn code open ik nog geen document. Het gaat puur om instantie aanmaken en instantie afsluiten. Dat moet wel werken en dat doet het ook. Alleen het sluiten wil niet.

Ik heb ook volledige code van aantal tutorials getest die volgens hun werken, maar bij mij heb ik nog steeds hetzelfde probleem. Het process sluit nog steeds niet.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
Verwijderd schreef op maandag 23 oktober 2006 @ 11:36:
Heheh, ja dat zou wel kunnen jah...

Dat heb ik al ongeveer ingebouwd, alleen vind ik het niet echt mooi
Nee ik ook niet, deze oplossing heb ik ook niet zelf verzonnen, ik kwam 'm tegen op mijn queeste dit probleem op te lossen en ik was allang blij dat het opgelost was (te weinig tijd ;)).

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • [ti]
  • Registratie: Februari 2000
  • Niet online
Als je alleen word opstart en afsluit en dat werkt zelfs al niet, zet dan eens de Visible property op true, zodat je kan zien wat word aan het uitspoken is. Waarschijnlijk zit er een of ander input dialog dat antwoord wil in de weg, waardoor het afsluiten niet werkt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmmm,

misschien dat de gebruikers account die dat process runt eerst Word handmatig moet opstarten. Ik denk dat het te maken heeft met de schermen die je krijgt als je Word voor het eerste keer opent. Ik zal dit controleren. Ik meld me als dat het probleem is ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Onder de account die het WINWORD.exe proces runt heb ik MS Word handmatig opgestart en alle dialogen die je krijgt wanneer MS Word voor het eerste keer opstart, afgesloten. Vervolgens heb ik mijn PHP script nog een keer laten draaien. Het WINWORD.EXE proces sluit nog steeds niet af.

In de Windows Event Viewer (eventvwr) onder Applicaties krijg ik een foutmelding van MS Word. De foutmelding is deze:

Rejected Safe Mode action : Microsoft Office Word.

Weet iemand waar het probleem ligt?

Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 18-09 12:47

killercow

eth0

Kun je niet beter gewoon een xml bestand in elkaar fixen welk word/openoffice lezen kan?

Dan heb je dat loodzware winword process niet nodig, en heb je ook geen licenties nodig voor op je server.

(of ondersteund word geen xml documenten?)

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Ik durf wedden dat er een popup staat met de vraag: wilt u het document opslaan

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 21-09 13:59

DexterDee

I doubt, therefore I might be

Er bestaat een property in VBA die voorgrond interactie uitschakelt:

Application.DisplayAlerts = False

Lijkt me dat zoiets met COM ook moet werken:

$word->DisplayAlerts = 0;

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • [ti]
  • Registratie: Februari 2000
  • Niet online
Rejected Safe Mode action : Microsoft Office Word.
Office starts in safe mode when one of it's startup services fails. So it gives you an error message telling you it's starting in safe mode. This is good, as now you can find out what is actually failing at startup. Open Word interactively. Go Help > About MS Word and click the Disabled Items button. You'll find the service (or services) that failed at startup. To fix the problem might be as simple as re-enabling the disabled service.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[ti], :)

Dat topic heb ik ook al gelezen, maar het ligt niet daaraan. ;) Ik zie daar trouwens helemaal niets in de lijst staan. :)

Ik heb gisteren hetzelfde in PHP 5 getest en daar werkt het goed. Dit in combinatie met Apache 2. De script die ik moet bouwen moet eigenlijk in PHP 4 draaien en in combinatie met IIS. Het is misschien een bug in PHP 4 of het ligt aan de rechten binnen Windows Server 2000. Ik zal dit nader onderzoeken. (Als ik tijd voor heb).

Een andere optie zonder MS Word is om een XML bestand aan te maken in MS Word. (Template opslaan als XML) en dan hiermee verder werken. Ik denk dat dit het beste is. Dan heb ik ook geen extra licensies nodig voor op de server en het proces WINWORD.exe is te zwaar.

Alleen ben ik nog steeds benieuwd wat het probleem is. Ik zal's wat dieper moeten graven :P

Groeten,

Sead
Pagina: 1