Замена всех вхождений строки в файле Word гиперссылкой - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно создать скрипт Powershell, который читает файл Word (.docx) и заменяет строки гиперссылками.До сих пор, основываясь на этом скрипте , я мог легко заменить все вхождения строки другой строкой.С этим скриптом я могу искать строку и заменять ее гиперссылкой.Однако заменяется только первое вхождение.

Вот мое понимание проблемы:

Первый скрипт использует параметры ReplaceWith и Replace=wdReplaceAll функции ExecuteFind Интерфейс.Проблема в том, что ReplaceWith ожидает объект String, а не объект Hyperlink.

Второй сценарий не определяет эти параметры, поэтому он использует только функцию Find.Execute() для перемещения начала объекта Range внайдена строка, а затем вставлена ​​ссылка в этой позиции.

Поскольку я не могу заменить все вхождения сразу, я бы попытался перебрать все совпадения, чтобы вставить ссылки в их местоположение.Но Find.Execute() возвращает только логическое значение ... Теперь я думаю о том, чтобы, возможно, переопределить диапазон, чтобы исключить найденное вхождение и цикл до конца документа, но это кажется сложным.

Допустим, я 'у нас есть файл Word с этим текстом:

Другими словами, каждая из статей, связанных здесь, является указателем на несколько списков по теме.Некоторые из связанных статей сами являются списками списков списков.Эта статья также является списком списков.

Вот простой сценарий, который заменяет только первое вхождение «списков» относительной ссылкой.Я пытаюсь заменить все вхождения списков на гиперссылку $ linkPath, но не могу найти как.Справка?

Add-Type -AssemblyName "Microsoft.Office.Interop.Word"
$wdunits = "Microsoft.Office.Interop.Word.wdunits" -as [type]
$objWord = New-Object -ComObject Word.Application  
$objWord.Visible = $false

# Text to find and replace by a link
$findText = "lists"
# Link to file
$linkPath = ".\Untitled.png"
# Source Word (2007+) file
$objDoc = $objWord.Documents.Open([FILE TO READ FROM])
# Resulting file
$saveAs = [FILE TO SAVE TO]
# Set Range to all document content
$range = $objDoc.Content
$range.movestart($wdunits::wdword,$range.start) | Out-Null

# Execute params
$matchCase = $false
$matchWholeWord = $true
$matchWildcards = $false
$matchSoundsLike = $false
$matchAllWordForms = $false
$forward = $true 
$wrap = 1
$format = $False
$wdReplaceNone = 0 
$wdFindContinue = 1
$wdReplaceAll = 2

# $wordFound is true is $findText is found in $range. 
# $range.find.execute modifies the start of the range 
$wordFound = $range.find.execute($findText,$matchCase,`
             $matchWholeWord,$matchWildCards,$matchSoundsLike,`
             $matchAllWordForms,$forward,$wrap)

if($wordFound){
        $objDoc.Hyperlinks.Add($range,$linkPath,$null,$null,$findText) | Out-Null
}
$objDoc.SaveAs($saveAs)
$objDoc.Close()
$objWord.Quit()
$rc = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objWord)
[gc]::Collect()
[gc]::WaitForPendingFinalizers()

Ссылка

1 Ответ

0 голосов
/ 17 ноября 2018

Как и в любом наборе данных, вам нужно выполнить цикл, чтобы поразить все элементы в наборе данных, чтобы выполнить действия с определенным набором данных. Вы не делаете это в своем коде. В MSWord вам нужно пройтись по документу. Например, я показываю код для удалений, но это также может быть вашей заменой.

Пример: VBA просто удаляет любую гиперссылку

Sub RemoveHyperlinksInDoc()
    ' You need to delete collection members starting from the end going backwards
    With ActiveDocument
        For i = .Hyperlinks.Count To 1 Step -1
            .Hyperlinks(i).Delete
        Next
    End With
End Sub

Пример PowerShell для удаления всех гиперссылок

Param
(
    [string]$Document = $Word.Documents.Open((Read-Host -Prompt 'Enter the full path to the Word document'))
)

$Word = New-Object -ComObject Word.application
$Hyperlinks = @($Document.Hyperlinks)  
$hyperlinks | ForEach { $_.Delete() }
$document.save()
$document.Close()
$word.quit()

Пример: PowerShell для удаления только гиперссылок с изображениями

Param
(
    [string]$Document = $Word.Documents.Open((Read-Host -Prompt 'Enter the full path to the Word document'))
)

$Word = New-Object -ComObject Word.application
$Hyperlinks = @($Document.Hyperlinks) 
$Hyperlinks | ForEach {
                         If ($_.Shape) {$_.Delete()}
                         Else {$_.Name;Write-Warning -Message 'Hyperlink is not a graphic and will not be removed'}
                      }
$Document.save()
$Document.Close()
$Word.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...