COM('word.document')以只读方式打开,而文件由其他方式打开

时间:2015-04-01 11:40:33

标签: php com ms-word

我正在使用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只是拒绝接受参数。我做错了什么?

2 个答案:

答案 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;