我正在使用php和新的COM('word.application')来操作.doc文件(添加和编辑字段),我在使用apache 2.4.25 x64和php 7.0的Windows Server 2012 R2上。 17 x64。
到目前为止,我制作了一个非常简单的代码,但是在使用具有多个参数的函数时遇到了问题
$word->Documents[1]->Protect(3, false, 'mypassword', false, false);
我收到以下错误:
[Erreur] Impossible de lancer le connecteur Microsoft Office Word。 :com_exception:参数4:Le type ne Correspon pas
英文翻译:
[错误]无法使用Microsoft Office Word连接器:com_exception:参数4:类型不对应
在像这样的VBA代码中它正在工作
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
根据VBA中的文档
t.com/en-us/library/office/aa220366(V = office.11)的.aspx
参数2,4和5应该是布尔值,所以我不知道为什么我会收到这个错误。如果我删除参数4和5,我得到相同的错误,但在参数2上。
通过一些搜索,我查看了对象new VARIANT(),但它也没有用。
我还有$ this->文件1 - > SaveAs()
的问题$fileName = "D:\\test.doc";
$this->Documents[1]->SaveAs($fileName);
有效。
根据文档(https://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.document.saveas(v=vs.120).aspx),我应该可以使用第二个参数:
$fileName = "D:\\test.doc";
$fileFormat = 0;
$this->Documents[1]->SaveAs($fileName, $fileFormat);
像这样我有错误“参数0:Le type ne Correspon pas”(类型不对应)。
在VBA中它的工作方式不同,也许我做错了......
非常感谢你帮助我:)。
编辑:完整示例代码
<?php
$word = new COM("word.application") or die("Cannot create Word object");
echo "com object created<br>";
$word->Visible = false;
$word->WindowState = 2;
$word->DisplayAlerts = false;
$word->Documents->Open("D:\\test.doc");
echo "document loaded<br>";
$import = $word->Documents[1]->VBProject->VBComponents->Import("D:\\fr.mac");
$import->name = "Macrofr";
$myModule = $word->Documents[1]->VBProject->VBComponents->Import("D:\\test1.mac");
$myModule->name = "MacroInit";
$myModule2 = $word->Documents[1]->VBProject->VBComponents->Import("D:\\test2.mac");
$myModule2->name = "MacroFonction";
$myModule3 = $word->Documents[1]->VBProject->VBComponents->Import("D:\\test3.frm");
$myModule3->name = "MacroProgression";
$word->Documents[1]->Protect(3,false,'motdepasse',false,false); // (type de protection,noReset,mdp)
$word->Documents[1]->SaveAs("D:\\doc_with_macro.doc", 0);
$word->Documents[1]->Close();
echo "closing doc<br>";
$word->Quit();
$word = null;
echo "end<br>";
答案 0 :(得分:0)
我在此代码中看到的唯一问题与 protect
function
有关。第一个参数必须是 VARIANT
像这样:
$word->Documents[1]->Protect(
new VARIANT(3, VT_I4),
false,
'Your password',
false,
true
);