Мы используем Word 2010 и имеем скрипт PowerShell, который читает таблицу в файле Word docx и использует ее для заполнения словаря автозамены. Это работает для обычных записей, которые не требуют форматирования; но это разбивает на элементы, которые должны использовать метод AddRichText. Это дает эту ошибку:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException (0x800A16DC): Reques
ted object is not available.
   --- End of inner exception stack trace ---
   at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParamet
ers)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInf
o culture, String[] namedParams)
   at System.Management.Automation.ComMethod.InvokeMethod(PSMethod method, Object[] arguments)

И код для PowerShell выглядит следующим образом; он читает из таблицы из 3 столбцов в документе Word и использует их для заполнения автозамены. Первый столбец имеет имя, следующий - значение, а последний может быть X, чтобы указать, является ли он расширенным текстом (имеет форматирование).

$objWord = New-Object -Com Word.Application

$filename = 'D:\Codes.docx'
$objDocument = $objWord.Documents.Open($filename)

$LETable = $objDocument.Tables.Item(1)
$LETableCols = $LETable.Columns.Count
$LETableRows = $LETable.Rows.Count

$word = New-Object -ComObject word.application
$word.visible = $true
$entries = $word.AutoCorrect.entries

Write-output "Starting to write... "

for($r=1; $r -le $LETableRows; $r++) {
    $replace = $LETable.Cell($r,1).Range.Text
    $replace = $replace.Substring(0,$replace.Length-2)
    $with = $LETable.Cell($r,2).Range.Text
    $withRange = $LETable.Cell($r,2).Range
    $with = $with.Substring(0,$with.Length-2)
    $format = $LETable.Cell($r,3).Range.Text
    $format = $format.Substring(0,$format.Length-2)

    Try 
        { 
            if($format -eq "X") {
                $entries.addrichtext($replace, $withRange) | out-null 
            }
            else {
                $entries.add($replace,$with) | out-null 
            }
        }
    Catch [system.exception]
        { 
          Write-Host $_.Exception.ToString()
        }
}
$objDocument.Close()
$objWord.Quit()

 $word.Quit()

 #$word = $null

 [gc]::collect()

 [gc]::WaitForPendingFinalizers()

# Stop Winword Process
$rc = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objWord)
$rc = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word)

1 ответ1

2

Код выглядит правильно, и, к сожалению, детали исключений неоднозначны и не помогают. Единственное, что я могу подумать об этом, может быть неправильно, то, что AddRichText может не понравиться пропуск диапазона ячеек вместо диапазона абзаца, чего он и ожидает. Попробуйте изменить это и посмотреть, поможет ли это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .