Skip to main content

PAD: Automate filling in Word Template with data read from CSV

31 January, 2024
In this video I demonstrate how you can automate filling in a Microsoft Word Template with data read from a CSV File. We use Power Automate Desktop along with some PowerShell scripts.

PowerShell Script:

####UN-ZIP#####
param (
    [string]$template
)

# unzip function
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip {
    param([string]$zipfile, [string]$outpath)
    [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}

$Directory = Split-Path -Path $template -Parent
$tempFolder = $Directory + "\Populate-Word-DOCX"
        
Remove-Item $tempFolder -ErrorAction SilentlyContinue -Recurse -Confirm:$false | Out-Null
mkdir $tempFolder | Out-Null
Unzip $template $tempFolder
$tempFolder +"\word\document.xml"



#####ZIP######
param (
    [string]$name
)

# unzip function
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Zip {
    param([string]$folderInclude, [string]$outZip)
    [System.IO.Compression.CompressionLevel]$compression = "Optimal"
    $ziparchive = [System.IO.Compression.ZipFile]::Open( $outZip, "Update" )

    # loop all child files
    $realtiveTempFolder = (Resolve-Path $tempFolder -Relative).TrimStart(".\")
    foreach ($file in (Get-ChildItem $folderInclude -Recurse)) {
        # skip directories
        if ($file.GetType().ToString() -ne "System.IO.DirectoryInfo") {
            # relative path
            $relpath = ""
            if ($file.FullName) {
                $relpath = (Resolve-Path $file.FullName -Relative)
            }
            if (!$relpath) {
                $relpath = $file.Name
            } else {
                $relpath = $relpath.Replace($realtiveTempFolder, "")
                $relpath = $relpath.TrimStart(".\").TrimStart("\\")
            }

            # display
            Write-Host $relpath -Fore Green
            Write-Host $file.FullName -Fore Yellow

            # add file
            [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($ziparchive, $file.FullName, $relpath, $compression) | Out-Null
        }
    }
    $ziparchive.Dispose()
}

$Directory = Split-Path -Path $name -Parent
$tempFolder = $Directory + "\Populate-Word-DOCX"   
Zip $tempFolder $name