首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文本文件作为对象嵌入到Ms Word 2010中

将文本文件作为对象嵌入到Ms Word 2010中
EN

Stack Overflow用户
提问于 2018-03-09 17:28:15
回答 1查看 601关注 0票数 1

我正在构建一个使用PowerShell编写word文档的脚本(Windows7,PS4,.Net 4,Office 2010 )。

脚本可以工作,但它将文本嵌入到文档的顶部。我需要能够指定确切的位置,如第2页。

以下是我的最新进展:

代码语言:javascript
复制
# Opens an MsWord Doc, does a Search-and-Replace and embeds a text file as an object
# To make this work you need in the same folder as this script:
#   -A 2-page MsWord file called "Search_and_replace_Target_Template.doc" with:
#       -the string <package-name> on page ONE
#       -the string <TextFile-Placeholder> on page TWO
#   -A textfile called "TextFile.txt"
#
#The script will:
#   -replace <package-name> with something on page one
#   -embed the text file <package-name> at the top of page one (but I want it to replace <TextFile-Placeholder> on page 2)
#
# CAVEAT: Using MsWord 2010

[String]$MsWordDocTemplateName  = "Search_and_replace_Target_Template.doc"
[String]$TextFileName           = "TextFile.txt"

[Int]$wdReplaceAll      = 2
[Int]$wdFindContinue    = 1 #The find operation continues when the beginning or end of the search range is reached.
[Bool]$MatchCase        = $False 
[Bool]$MatchWholeWord   = $true
[Bool]$MatchWildcards   = $False 
[Bool]$MatchSoundsLike  = $False 
[Bool]$MatchAllWordForms = $False 
[Bool]$Forward          = $True 
[Int]$Wrap              = $wdFindContinue #The find operation continues when the beginning or end of the search range is reached.
[Bool]$Format           = $False 
[Int]$wdReplaceNone     = 0

$objWord = New-Object -ComObject Word.Application
$objWord.Visible        = $true #Makes the MsWord
[String]$ScriptDirectory = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.path)
[String]$WordDocTemplatePath = "$ScriptDirectory\$MsWordDocTemplateName"
[String]$TextFilePath   = "$ScriptDirectory\$TextFileName"
[String]$SaveAsPathNew  = Join-Path -Path $ScriptDirectory -ChildPath "${MsWordDocTemplateName}-NEW.doc"


#Open Template with MSWord
Try {
    $objDoc = $objWord.Documents.Open($WordDocTemplatePath)
} Catch {
    [string]$mainErrorMessage = "$($_.Exception.Message) $($_.ScriptStackTrace) $($_.Exception.InnerException)"
    Write-Host $mainErrorMessage -ForegroundColor Red
    Start-Sleep -Seconds 7
    $objDoc.Close()
    $objWord.Quit()
}

$objSelection               = $objWord.Selection
$objSelection.Find.Forward  = 'TRUE'
$objSelection.Find.MatchWholeWord = 'TRUE'


#Replace <package-name>
[String]$FindText = "<package-name>" 
[String]$ReplaceWith = "PackageName_v1"
write-host "replacing [$FindText] :" -NoNewline
$objSelection.Find.Execute($FindText,$MatchCase,$MatchWholeWord,$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,$Wrap,$Format,$ReplaceWith,$wdReplaceAll) 


#Embed the text file as an object 
[System.IO.FileSystemInfo]$TextFileObj = Get-item $TextFilePath
If ( $(Try {Test-Path $($TextFileObj.FullName).trim() } Catch { $false }) ) {
    write-host "Embedding [$TextFileName] :" -NoNewline
    [String]$FindText = "<TextFile-Placeholder>" 
    [String]$ReplaceWith = ""
#   $objSelection.Find.Execute($FindText,$MatchCase,$MatchWholeWord,$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,$Wrap,$Format,$ReplaceWith,$wdReplaceAll)


    #Need code to create a RANGE to the position of <TextFile-Placeholder>


    #Embed file into word doc as an object
    #$result = $objSelection.InlineShapes.AddOLEObject($null,$TextFileObj.FullName,$false,$true)
    $result = $objSelection.Range[0].InlineShapes.AddOLEObject($null,$TextFileObj.FullName,$false,$true) #works too but does the same

    Write-host "Success"
} Else {
    Write-Host "[$TextFilePath] does not exist!" -ForegroundColor Red
    Start-Sleep -Seconds 5
}



Write-Host "Saving updated word doc to [${MsWordDocTemplateName}-NEW.doc] ***"
Start-Sleep -Seconds 2
#List of formats
$AllSaveFormat = [Enum]::GetNames([microsoft.office.interop.word.WdSaveFormat])
$SaveFormat = $AllSaveFormat

$objDoc.SaveAs([ref]$SaveAsPathNew,[ref]$SaveFormat::wdFormatDocument) #Overwrite if exists
$objDoc.Close()
$objWord.Quit()

$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$objWord)
[gc]::Collect()
[gc]::WaitForPendingFinalizers()
Remove-Variable objWord

如果你有办法在Word 2016中做到这一点,我也会接受它,因为我将不得不在2016年的办公室重新做一遍。

更新:看起来解决方案是创建一个“范围”的位置。默认情况下,您似乎有一个表示整个文档的范围。

我最想做的事是:

代码语言:javascript
复制
$MyRange = $objSelection.Range[Start:= 0, End:= 7]

但是这不是PowerShell的语法,它只处理绝对字符位置,而不是搜索字符串的结果。

如果我能创造出第二个范围,也许这会奏效:

代码语言:javascript
复制
$objSelection.Range[1].InlineShapes.AddOLEObject($null,$TextFileObj.FullName,$false,$true) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-11 20:07:41

我不能为您编写powershell脚本,但我可以描述您需要的内容。事实上,你正按照Range的想法走上正轨.要获得整个Word文档的范围:

代码语言:javascript
复制
$MyRange = $objDoc.Content

请注意,您可以根据需要声明和使用任意数量的范围对象。范围不像Selection那样有限,其中只能有一个。只要你不再需要原来的范围,继续并在它上执行查找。如果您再次需要原始范围,那么声明并实例化第二个,实例化它,或者按照上面的方式实例化它,或者使用原始值作为起点:

代码语言:javascript
复制
$MyRange2 = $MyRange.Duplicate

然后在一个范围内使用Find。注意,当Find成功时,Range的内容就是找到的术语,它将“焦点”放在正确的页面上。(但不会移动所选内容!)

代码语言:javascript
复制
$MyRange.Find.Execute($FindText,$MatchCase,$MatchWholeWord,$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,$Wrap,$Format,$ReplaceWith,$wdReplaceAll) 

如果要测试Find是否成功,Execute方法将返回一个布尔值(如果查找成功,则为true)。

尽管我不确定OLEObject是否是插入文本文件的最佳方法,但请使用下面的内容来插入该文件。我更希望InsertFile更合适。OLEObject需要一个在Windows中注册的OLE服务器,该服务器支持编辑文本文件;它将速度更慢,并将字段代码放入文档中,尝试更新.

代码语言:javascript
复制
$result =$MyRange.InlineShapes.AddOLEObject($null,$TextFileObj.FullName,$false,$true)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49199089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档