Редактировать и сохранять DOCX с помощью Powershell - PullRequest
0 голосов
/ 06 апреля 2020

Я слегка изменил этот сценарий PowerShell для своей работы с файлами DOCX, но хотел бы отредактировать файл DOCX на месте.

После запуска сценария терминал отображает сообщение об ошибке : «Вы не можете вызвать метод для выражения с нулевым значением» со ссылкой на строку 43, $document.Save().

Я не уверен, что причина ошибки, поскольку путь к $document уже определен ранее в скрипте. Чего мне не хватает?

Вот весь сценарий:

    Param ([string]$path = $(throw "-path is required."))

    Import-Module "C:\scripts\PSGenericMethods.psm1"
    [System.Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll") | out-null

    [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml") | out-null
    [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Packaging") | out-null
    [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Wordprocessing") | out-null
    [Reflection.Assembly]::LoadWithPartialName("OpenXmlPowerTools") | out-null

    [DocumentFormat.OpenXml.Packaging.WordprocessingDocument]$document = $null
    $document = [DocumentFormat.OpenXml.Packaging.WordprocessingDocument]::Open($path, $true)

    [DocumentFormat.OpenXml.Packaging.MainDocumentPart]$MainDocumentPart = $document.MainDocumentPart

    [DocumentFormat.OpenXml.Wordprocessing.Document]$InnerDocument = $document.Document

    [DocumentFormat.OpenXml.Wordprocessing.Body]$Body = $document.Body

    [DocumentFormat.OpenXml.Wordprocessing.Paragraph]$paragraph = $document.Paragraph

    [DocumentFormat.OpenXml.Wordprocessing.ParagraphMarkRunProperties]$ParagraphMarkRunProperties = $document.ParagraphMarkRunProperties

    [DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties]$ParagraphProperties = $document.ParagraphProperties

    [DocumentFormat.OpenXml.Wordprocessing.ParagraphStyleId]$ParagraphStyleId = $document.ParagraphStyleId

    [DocumentFormat.OpenXml.Wordprocessing.Run]$run = $document.Run

    $paragraphs = Invoke-GenericMethod -InputObject $MainDocumentPart.Document -MethodName Descendants -GenericType DocumentFormat.OpenXml.Wordprocessing.Paragraph

    $runs = Invoke-GenericMethod -InputObject $MainDocumentPart.Document -MethodName Descendants -GenericType DocumentFormat.OpenXml.Wordprocessing.Run

    foreach ($run in $runs) { 
     if ($run.RunProperties.Languages.Val) {

    <#[String]$value = $run.InnerText#>
    [String]$language = $run.RunProperties.Languages.Val

    '{{$span xml:lang="{0}"$}}{1}{{$/span}}$' -f $language, $run.InnerText
    }
    }
    $document.close()

Обновление: После изменения сценария у меня больше не возникает проблема "Вы не можете вызов метода для выражения с нулевым значением «ошибка. Проблема в том, что я не уверен, как сохранить результаты в файл.

Это может быть копия этой темы .

Может кто-нибудь предложить метод для сохранения изменения в файле?

1 Ответ

1 голос
/ 06 апреля 2020

Имена переменных в PowerShell НЕ учитывают регистр. Вы уничтожаете свой «документ» этой строкой, я думаю:

[DocumentFormat.OpenXml.Wordprocessing.Document]$Document = $document.Document

Поскольку $Document - это та же переменная, что и $document.

...