我正在使用php并尝试使用COM对象来阅读Word文件。我在寻找文件时无处可去。
我想要做的是以只读方式打开一个文件,所以我没有得到"文件正在使用"在主机上弹出。
如何通过COM告诉单词以只读方式打开文件?我试图使用变体,但我收到以下错误:
Parameter 0: Type mismatch. #0 C:\xampp\htdocs\test.php(17): variant->Open('\\remote\test\test.doc', false, true, false, Object(variant), Object(variant), Object(variant), Object(variant), Object(variant), Object(variant), Object(variant), true, true, Object(variant), Object(variant), true) #1 {main}
这是我使用的代码
$word = new COM("word.application") or die("Unable to instantiate application object");
$wordDocument = new COM("word.document") or die("Unable to instantiate document object");
$MISSING = new VARIANT();
$word->Visible = 0;
$DocumentPath = "\\remote\test\test\alamo.doc";
$HTMLPath = "";
try {
$wordDocument = $word->Documents->Open("\\exit-dc\eeb\test\alamo.doc"/* FileName */, false/* ConfirmConversions */, true/* ReadOnly */,
false/* AddToRecentFiles */, $MISSING/* PasswordDocument */, $MISSING/* PasswordTemplate */,
$MISSING/* Revert */, $MISSING/* WritePasswordDocument */, $MISSING/* WritePasswordTemplate */,
$MISSING/* Format */,$MISSING/* Format */, $MISSING/* Encoding */, true/* Visible */, true/* OpenConflictDocument */,
$MISSING/* OpenAndRepair */, $MISSING/* DocumentDirection */, true/* NoEncodingDialog */);
$HTMLPath = substr_replace($DocumentPath, 'html', -3, 3);
if($wordDocument !== null) {
$wordDocument->SaveAs($HTMLPath, 3);//3 = text, I know.
}
}
catch(Exception $ex){
echo $ex->getMessage() . $ex->getTraceAsString();
}
$wordDocument = null;
$word->Quit();
$word = null;
我想要什么?使用只读标志打开文件。我只想读它。我知道我可以通过仅提供文件名来实现,但是我需要它来处理读取同一文件的多个实例。
对于所有意图和目的,这应该有效。 Php应该将字符串和布尔值转换为正确的Variant类型,空的变体类型应该填充System.Reflection.Missing.Value
我使用https://msdn.microsoft.com/en-us/library/office/ff835182(v=office.14).aspx(Word 2010)编译所需的参数列表,并阅读http://php.net/manual/en/book.com.php上的评论以找到可行的解决方案......
到目前为止,似乎唯一有效的解决方案是复制,打开,读取,删除副本。对我而言,这是最不可取的选择,因为你应该知道,工作。大量的C ++,vb,.net等...这是如何工作的例子,但PHP只是拒绝接受参数。我做错了什么?
答案 0 :(得分:0)
只有一个问题为什么使用com,不推荐在服务器上使用,特别是在php的上下文中你应该尝试阅读单词2007/2010 .docx文件,这些文件只是xml文件,并且避免所有的所有哈希
答案 1 :(得分:0)
进一步挖掘,测试了许多失败的东西后我终于找到了一个只读的解决方案,我找到了两种方式来罗马,所以我发布了它们。
通过省略剩余价值,它突然起作用。仍然留给我一个问题是什么用作" null"在这种情况下,我可以跳过该变量。但那是另一次担心的问题。我还不需要它。
通过DOTNET对象
$assembly = 'Microsoft.Office.Interop.Word, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
$class = 'Microsoft.Office.Interop.Word.ApplicationClass';
$w = new DOTNET($assembly, $class);
$w->visible = true;
$DocumentPath = "\\\\remote\\test\\alamo.doc";
$d = $w->Documents->Open($DocumentPath,false,true);
echo "Document opened.<br><hr><PRE>";
com_print_typeinfo($d);
$w->Quit();
$w=null;
通过COM对象
$DocumentPath = "\\\\remote\\test\\alamo.doc";
$word = new COM("word.application") or die("Unable to instantiate application object");
$wordDocument = new COM("word.document") or die("Unable to instantiate document object");
$MISSING = 1;
$word->Visible = true;
$HTMLPath = "";
try {
echo "<PRE>";
com_print_typeinfo($word->Documents);
echo "</PRE>";
$wordDocument = $word->Documents->Open($DocumentPath/* FileName */,
false/* ConfirmConversions */,
true/* ReadOnly */);
$HTMLPath = substr_replace($DocumentPath, 'html', -3, 3);
if($wordDocument !== null) {
$wordDocument->SaveAs($HTMLPath, 3);
}
}
catch(Exception $ex){
echo $ex->getMessage() . $ex->getTraceAsString();
}
$wordDocument = null;
$word->Quit();
$word = null;