COM (‘word.document’) открыт только для чтения, в то время как файл открывается другим

Я использую 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

Решение

только один вопрос, зачем использовать com, который не рекомендуется для использования на сервере, особенно в контексте php, вместо этого вы должны попробовать читать файлы Word 2007/2010 .docx, которые являются ничем иным, как файлами xml, и избегать всех хэсселов вместе

0

Другие решения

Покопавшись еще раз, проверив много неудачных вещей, я наконец-то нашел решение, открывающееся только для чтения, и нашел два пути в Рим, поэтому я публикую их оба.

Оставляя лишние ценности, это внезапно работает. Тем не менее, у меня остается вопрос, что использовать в этом случае как «ноль», чтобы я мог пропустить эту переменную. Но это беспокойство в другой раз. Мне это пока не нужно.

Через объект 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;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector