Merge pull request #668 from ili101/TestsRebase

Tests improvments and Linux support
This commit is contained in:
Doug Finke
2019-08-29 18:43:14 -04:00
committed by GitHub
42 changed files with 989 additions and 448 deletions

1
.gitignore vendored
View File

@@ -60,7 +60,6 @@ test.xlsx
testCCFMT.ps1 testCCFMT.ps1
testHide.ps1 testHide.ps1
ImportExcel.zip ImportExcel.zip
.vscode/launch.json
.vscode/settings.json .vscode/settings.json
~$* ~$*

56
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,56 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Pester Tests",
"script": "Import-Module -Name '.\\' -Force ; Invoke-Pester", // Change to '.\\ModuleName.psd1' if Git name different
"args": [""],
"cwd": "${workspaceFolder}"
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Launch Current File",
"script": "${file}",
"args": [],
"cwd": "${file}"
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Launch Current File in Temporary Console",
"script": "${file}",
"args": [],
"cwd": "${file}",
"createTemporaryIntegratedConsole": true
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Launch Current File w/Args Prompt",
"script": "${file}",
"args": [
"${command:SpecifyScriptArgs}"
],
"cwd": "${file}"
},
{
"type": "PowerShell",
"request": "attach",
"name": "PowerShell Attach to Host Process",
"processId": "${command:PickPSHostProcess}",
"runspaceId": 1
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Interactive Session",
"cwd": ""
}
]
}

View File

@@ -1,28 +0,0 @@
param(
[Switch]$DontCreateZip
)
##
# Used in Appveyor.yml
##
$PSVersionTable.PSVersion
## Create the zip before the tests run
## Otherwise the EPPlus.dll is in use after the Pester run
$ModuleVersion = (Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content -Raw .\ImportExcel.psd1)))).moduleVersion
if (!$DontCreateZip) {
$dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss")
Compress-Archive -Path . -DestinationPath .\$dest
}
if ($null -eq (Get-Module -ListAvailable pester)) {
Install-Module -Name Pester -Repository PSGallery -Force -Scope CurrentUser
}
$result = Invoke-Pester -Script $PSScriptRoot\__tests__ -Verbose -PassThru
if ($result.FailedCount -gt 0) {
throw "$($result.FailedCount) tests failed."
}

View File

@@ -1,4 +1,4 @@
Import-Module ..\ImportExcel.psd1 -Force try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$file = "C:\Temp\test.xlsx" $file = "C:\Temp\test.xlsx"

View File

@@ -5,7 +5,7 @@
$measure = "Open" $measure = "Open"
) )
$xl = "$env:TEMP\Stocks.xlsx" $xl = Join-Path ([IO.Path]::GetTempPath()) 'Stocks.xlsx'
Remove-Item $xl -ErrorAction SilentlyContinue Remove-Item $xl -ErrorAction SilentlyContinue

View File

@@ -4,8 +4,8 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll"
. $PSScriptRoot\AddDataValidation.ps1 . $PSScriptRoot\AddDataValidation.ps1
. $PSScriptRoot\Charting.ps1 . $PSScriptRoot\Charting.ps1
. $PSScriptRoot\ColorCompletion.ps1 . $PSScriptRoot\ColorCompletion.ps1
. $PSScriptRoot\Compare-WorkSheet.ps1
. $PSScriptRoot\ConvertExcelToImageFile.ps1 . $PSScriptRoot\ConvertExcelToImageFile.ps1
. $PSScriptRoot\compare-workSheet.ps1
. $PSScriptRoot\ConvertFromExcelData.ps1 . $PSScriptRoot\ConvertFromExcelData.ps1
. $PSScriptRoot\ConvertFromExcelToSQLInsert.ps1 . $PSScriptRoot\ConvertFromExcelToSQLInsert.ps1
. $PSScriptRoot\ConvertToExcelXlsx.ps1 . $PSScriptRoot\ConvertToExcelXlsx.ps1
@@ -23,7 +23,7 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll"
. $PSScriptRoot\InferData.ps1 . $PSScriptRoot\InferData.ps1
. $PSScriptRoot\Invoke-Sum.ps1 . $PSScriptRoot\Invoke-Sum.ps1
. $PSScriptRoot\Join-Worksheet.ps1 . $PSScriptRoot\Join-Worksheet.ps1
. $PSScriptRoot\Merge-worksheet.ps1 . $PSScriptRoot\Merge-Worksheet.ps1
. $PSScriptRoot\New-ConditionalFormattingIconSet.ps1 . $PSScriptRoot\New-ConditionalFormattingIconSet.ps1
. $PSScriptRoot\New-ConditionalText.ps1 . $PSScriptRoot\New-ConditionalText.ps1
. $PSScriptRoot\New-ExcelChart.ps1 . $PSScriptRoot\New-ExcelChart.ps1
@@ -31,8 +31,9 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll"
. $PSScriptRoot\Open-ExcelPackage.ps1 . $PSScriptRoot\Open-ExcelPackage.ps1
. $PSScriptRoot\Pivot.ps1 . $PSScriptRoot\Pivot.ps1
. $PSScriptRoot\PivotTable.ps1 . $PSScriptRoot\PivotTable.ps1
#. $PSScriptRoot\Plot.ps1
. $PSScriptRoot\RemoveWorksheet.ps1 . $PSScriptRoot\RemoveWorksheet.ps1
. $PSScriptRoot\Send-SqlDataToExcel.ps1 . $PSScriptRoot\Send-SQLDataToExcel.ps1
. $PSScriptRoot\Set-CellStyle.ps1 . $PSScriptRoot\Set-CellStyle.ps1
. $PSScriptRoot\Set-Column.ps1 . $PSScriptRoot\Set-Column.ps1
. $PSScriptRoot\Set-Row.ps1 . $PSScriptRoot\Set-Row.ps1
@@ -45,7 +46,7 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll"
New-Alias -Name Use-ExcelData -Value "ConvertFrom-ExcelData" -Force New-Alias -Name Use-ExcelData -Value "ConvertFrom-ExcelData" -Force
if ($PSVersionTable.PSVersion.Major -ge 5) { if ($PSVersionTable.PSVersion.Major -ge 5) {
. $PSScriptRoot\plot.ps1 . $PSScriptRoot\Plot.ps1
Function New-Plot { Function New-Plot {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'New-Plot does not change system state')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'New-Plot does not change system state')]
@@ -59,6 +60,25 @@ else {
Write-Warning 'PowerShell 5 is required for plot.ps1' Write-Warning 'PowerShell 5 is required for plot.ps1'
Write-Warning 'PowerShell Excel is ready, except for that functionality' Write-Warning 'PowerShell Excel is ready, except for that functionality'
} }
if ($IsLinux -or $IsMacOS) {
$ExcelPackage = [OfficeOpenXml.ExcelPackage]::new()
$Cells = ($ExcelPackage | Add-WorkSheet).Cells['A1']
$Cells.Value = 'Test'
try {
$Cells.AutoFitColumns()
}
catch {
if ($IsLinux) {
Write-Warning -Message 'ImportExcel Module Cannot Autosize. Please run the following command to install dependencies: "sudo apt-get install -y --no-install-recommends libgdiplus libc6-dev"'
}
if ($IsMacOS) {
Write-Warning -Message 'ImportExcel Module Cannot Autosize. Please run the following command to install dependencies: "brew install mono-libgdiplus"'
}
}
finally {
$ExcelPackage | Close-ExcelPackage -NoSave
}
}
#endregion #endregion
function Import-Excel { function Import-Excel {
<# <#

View File

@@ -1,104 +1,213 @@
<# <#
.SYNOPSIS .SYNOPSIS
Download the module files from GitHub. Installs module from Git clone or directly from GitHub.
File must not have BOM for GitHub deploy to work.
.DESCRIPTION
Download the module files from GitHub to the local client in the module folder.
#> #>
[CmdletBinding(DefaultParameterSetName = 'Default')]
[CmdLetBinding()]
Param ( Param (
# Path to install the module to, if not provided -Scope used.
[Parameter(Mandatory, ParameterSetName = 'ModulePath')]
[ValidateNotNullOrEmpty()] [ValidateNotNullOrEmpty()]
[String]$ModuleName = 'ImportExcel', [String]$ModulePath,
[String]$InstallDirectory,
# Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used.
[Parameter(Mandatory, ParameterSetName = 'Scope')]
[ValidateSet('CurrentUser', 'AllUsers')]
[string]
$Scope = 'CurrentUser',
# Get module from GitHub instead of local Git clone, for example "https://raw.githubusercontent.com/ili101/Module.Template/master/Install.ps1"
[ValidateNotNullOrEmpty()] [ValidateNotNullOrEmpty()]
[String]$GitPath = 'https://raw.github.com/dfinke/ImportExcel/master' [Uri]$FromGitHub
)
# Set Files and Folders patterns to Include/Exclude.
$IncludeFiles = @(
'*.dll',
'*.psd1',
'*.psm1',
'AddConditionalFormatting.ps1',
'AddDataValidation.ps1',
'Charting.ps1',
'ColorCompletion.ps1',
'Compare-WorkSheet.ps1',
'ConvertExcelToImageFile.ps1',
'ConvertFromExcelData.ps1',
'ConvertFromExcelToSQLInsert.ps1',
'ConvertToExcelXlsx.ps1',
'Copy-ExcelWorkSheet.ps1',
'Export-Excel.ps1',
'Export-ExcelSheet.ps1',
'Export-StocksToExcel.ps1',
'Get-ExcelColumnName.ps1',
'Get-ExcelSheetInfo.ps1',
'Get-ExcelWorkbookInfo.ps1',
'Get-HtmlTable.ps1',
'Get-Range.ps1',
'Get-XYRange.ps1',
'Import-Html.ps1',
'InferData.ps1',
'Invoke-Sum.ps1',
'Join-Worksheet.ps1',
'Merge-Worksheet.ps1',
'New-ConditionalFormattingIconSet.ps1',
'New-ConditionalText.ps1',
'New-ExcelChart.ps1',
'New-PSItem.ps1',
'Open-ExcelPackage.ps1',
'Pivot.ps1',
'PivotTable.ps1',
'Plot.ps1',
'RemoveWorksheet.ps1',
'Send-SQLDataToExcel.ps1',
'Set-CellStyle.ps1',
'Set-Column.ps1',
'Set-Row.ps1',
'Set-WorkSheetProtection.ps1',
'SetFormat.ps1',
'TrackingUtils.ps1',
'Update-FirstObjectProperties.ps1'
)
$ExcludeFiles = @(
'Install.ps1'
) )
Begin {
Try {
Write-Verbose "$ModuleName module installation started"
$Files = @( function Invoke-MultiLike {
'AddConditionalFormatting.ps1', [alias("LikeAny")]
'Charting.ps1', [CmdletBinding()]
'ColorCompletion.ps1', param
'ConvertFromExcelData.ps1', (
'ConvertFromExcelToSQLInsert.ps1', $InputObject,
'ConvertExcelToImageFile.ps1', [Parameter(Mandatory)]
'ConvertToExcelXlsx.ps1', [String[]]$Filters,
'Copy-ExcelWorkSheet.ps1', [Switch]$Not
'EPPlus.dll', )
'Export-charts.ps1', $FiltersRegex = foreach ($Filter In $Filters) {
'Export-Excel.ps1', $Filter = [regex]::Escape($Filter)
'Export-ExcelSheet.ps1', if ($Filter -match "^\\\*") {
'formatting.ps1', $Filter = $Filter.Remove(0, 2)
'Get-ExcelColumnName.ps1', }
'Get-ExcelSheetInfo.ps1', else {
'Get-ExcelWorkbookInfo.ps1', $Filter = '^' + $Filter
'Get-HtmlTable.ps1', }
'Get-Range.ps1', if ($Filter -match "\\\*$") {
'Get-XYRange.ps1', $Filter = $Filter.Substring(0, $Filter.Length - 2)
'Import-Html.ps1', }
'ImportExcel.psd1', else {
'ImportExcel.psm1', $Filter = $Filter + '$'
'InferData.ps1', }
'Invoke-Sum.ps1', $Filter
'New-ConditionalFormattingIconSet.ps1',
'New-ConditionalText.ps1',
'New-ExcelChart.ps1',
'New-PSItem.ps1',
'Open-ExcelPackage.ps1',
'Pivot.ps1',
'plot.ps1',
'Send-SqlDataToExcel.ps1',
'Set-CellStyle.ps1',
'Set-Column.ps1',
'Set-Row.ps1',
'SetFormat.ps1',
'TrackingUtils.ps1',
'Update-FirstObjectProperties.ps1'
)
} }
Catch { if ($Not) {
throw "Failed installing the module in the install directory '$InstallDirectory': $_" $InputObject -notmatch ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.')
}
else {
$InputObject -match ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.')
} }
} }
Process { Try {
Try { Write-Verbose -Message 'Module installation started'
if (-not $InstallDirectory) {
Write-Verbose "$ModuleName no installation directory provided"
$PersonalModules = Join-Path -Path ([Environment]::GetFolderPath('MyDocuments')) -ChildPath WindowsPowerShell\Modules if (!$ModulePath) {
if ($Scope -eq 'CurrentUser') {
if (($env:PSModulePath -split ';') -notcontains $PersonalModules) { $ModulePathIndex = 0
Write-Warning "$ModuleName personal module path '$PersonalModules' not found in '`$env:PSModulePath'"
}
if (-not (Test-Path $PersonalModules)) {
Write-Error "$ModuleName path '$PersonalModules' does not exist"
}
$InstallDirectory = Join-Path -Path $PersonalModules -ChildPath $ModuleName
Write-Verbose "$ModuleName default installation directory is '$InstallDirectory'"
} }
else {
if (-not (Test-Path $InstallDirectory)) { $ModulePathIndex = 1
$null = New-Item -Path $InstallDirectory -ItemType Directory -EA Stop
Write-Verbose "$ModuleName created module folder '$InstallDirectory'"
} }
if ($IsLinux -or $IsMacOS) {
$WebClient = New-Object System.Net.WebClient $ModulePathSeparator = ':'
$Files | ForEach-Object {
$WebClient.DownloadFile("$GitPath/$_","$installDirectory\$_")
Write-Verbose "$ModuleName installed module file '$_'"
} }
else {
Write-Verbose "$ModuleName module installation successful" $ModulePathSeparator = ';'
}
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator)[$ModulePathIndex]
} }
Catch {
throw "Failed installing the module in the install directory '$InstallDirectory': $_" # Get $ModuleName, $TargetPath, [$Links]
if ($FromGitHub) {
# Fix Could not create SSL/TLS secure channel
#$SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol
#[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$WebClient = [System.Net.WebClient]::new()
$GitUri = $FromGitHub.AbsolutePath.Split('/')[1, 2] -join '/'
$GitBranch = $FromGitHub.AbsolutePath.Split('/')[3]
$Links = (Invoke-RestMethod -Uri "https://api.github.com/repos/$GitUri/contents" -Body @{ref = $GitBranch }) | Where-Object { (LikeAny $_.name $IncludeFiles) -and (LikeAny $_.name $ExcludeFiles -Not) }
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension(($Links | Where-Object { $_.name -like '*.psm1' }).name)
$ModuleVersion = (. ([Scriptblock]::Create((Invoke-WebRequest -Uri ($Links | Where-Object { $_.name -eq "$ModuleName.psd1" }).download_url)))).ModuleVersion
} }
else {
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path $PSScriptRoot))
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path (Join-Path $PSScriptRoot "$ModuleName.psd1") | Out-String)))).ModuleVersion
}
$TargetPath = Join-Path -Path $ModulePath -ChildPath $ModuleName
$TargetPath = Join-Path -Path $TargetPath -ChildPath $ModuleVersion
# Create Directory
if (-not (Test-Path -Path $TargetPath)) {
$null = New-Item -Path $TargetPath -ItemType Directory -ErrorAction Stop
Write-Verbose -Message ('Created module folder: "{0}"' -f $TargetPath)
}
# Copy Files
if ($FromGitHub) {
foreach ($Link in $Links) {
$TargetPathItem = Join-Path -Path $TargetPath -ChildPath $Link.name
if ($Link.type -ne 'dir') {
$WebClient.DownloadFile($Link.download_url, $TargetPathItem)
Write-Verbose -Message ('Installed module file: "{0}"' -f $Link.name)
}
else {
if (-not (Test-Path -Path $TargetPathItem)) {
$null = New-Item -Path $TargetPathItem -ItemType Directory -ErrorAction Stop
Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathItem
}
$SubLinks = (Invoke-RestMethod -Uri $Link.git_url -Body @{recursive = '1' }).tree
foreach ($SubLink in $SubLinks) {
$TargetPathSub = Join-Path -Path $TargetPathItem -ChildPath $SubLink.path
if ($SubLink.'type' -EQ 'tree') {
if (-not (Test-Path -Path $TargetPathSub)) {
$null = New-Item -Path $TargetPathSub -ItemType Directory -ErrorAction Stop
Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathSub
}
}
else {
$WebClient.DownloadFile(
('https://raw.githubusercontent.com/{0}/{1}/{2}/{3}' -f $GitUri, $GitBranch, $Link.name, $SubLink.path),
$TargetPathSub
)
}
}
}
}
}
else {
Get-ChildItem -Path $PSScriptRoot -Exclude $ExcludeFiles | Where-Object { LikeAny $_.Name $IncludeFiles } | ForEach-Object {
if ($_.Attributes -ne 'Directory') {
Copy-Item -Path $_ -Destination $TargetPath
Write-Verbose -Message ('Installed module file "{0}"' -f $_)
}
else {
Copy-Item -Path $_ -Destination $TargetPath -Recurse -Force
Write-Verbose -Message ('Installed module folder "{0}"' -f $_)
}
}
}
# Import Module
Write-Verbose -Message "$ModuleName module installation successful to $TargetPath"
Import-Module -Name $ModuleName -Force
Write-Verbose -Message "Module installed"
}
Catch {
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
}
finally {
#if ($FromGitHub) {
# [Net.ServicePointManager]::SecurityProtocol = $SecurityProtocol
#}
Write-Verbose -Message 'Module installation end'
} }

View File

@@ -1,3 +0,0 @@
$fullPath = 'C:\Program Files\WindowsPowerShell\Modules\ImportExcel'
Robocopy . $fullPath /mir /XD .vscode .git examples testimonials images spikes /XF appveyor.yml .gitattributes .gitignore

View File

View File

@@ -1,7 +0,0 @@
$p = @{
Name = "ImportExcel"
NuGetApiKey = $NuGetApiKey
ReleaseNote = "Add NumberFormat parameter"
}
Publish-Module @p

View File

@@ -15,11 +15,13 @@ If this project helped you reduce the time to get your job done, let me know.
<a href="./LICENSE.txt"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a> <a href="./LICENSE.txt"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a>
</p> </p>
|CI System |OS|Status| | CI System | Environment | Status |
|---|---|---| |--------------|-------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|Azure DevOps|Windows|[![Build status](https://dougfinke.visualstudio.com/ImportExcel/_apis/build/status/ImportExcel-CI)](https://dougfinke.visualstudio.com/ImportExcel/_build/latest?definitionId=10)| | AppVeyor | Windows, Core preview, Ubuntu | [![Build status](https://ci.appveyor.com/api/projects/status/7c0s1g5rgdx1bbts/branch/Tests?svg=true)](https://ci.appveyor.com/project/ili101/Module-Template) |
|Azure DevOps|Windows, Linux, Mac|[![Build Status](https://dougfinke.visualstudio.com/ImportExcel/_apis/build/status/dfinke.ImportExcel?branchName=master)](https://dougfinke.visualstudio.com/ImportExcel/_build/latest?definitionId=20&branchName=master)| | Azure DevOps | Windows | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=Windows)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) |
|Appveyor|Windows|[![Build Status](https://ci.appveyor.com/api/projects/status/21hko6eqtpccrkba/branch/master?svg=true)](https://ci.appveyor.com/project/dfinke/importexcel/branch/master)| | Azure DevOps | Windows (Core) | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=WindowsPSCore)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) |
| Azure DevOps | Ubuntu | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=Ubuntu)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) |
| Azure DevOps | macOS | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=macOS)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) |
<!-- /BADGES --> <!-- /BADGES -->

View File

@@ -1,7 +1,4 @@
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force Describe "Test adding trendlines to charts" {
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' )
Describe "Test adding trendlines to charts" {
BeforeAll { BeforeAll {
$script:data = ConvertFrom-Csv @" $script:data = ConvertFrom-Csv @"
Region,Item,TotalSold Region,Item,TotalSold
@@ -20,7 +17,7 @@ South,avocado,73
} }
BeforeEach { BeforeEach {
$xlfile = "$env:TEMP\trendLine.xlsx" $xlfile = "TestDrive:\trendLine.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
} }

132
__tests__/CI.ps1 Normal file
View File

@@ -0,0 +1,132 @@
<#
.SYNOPSIS
Handel Continuous Integration Testing in AppVeyor and Azure DevOps Pipelines.
#>
param
(
# AppVeyor Only - Update AppVeyor build name.
[Switch]$Initialize,
# Installs the module and invoke the Pester tests with the current version of PowerShell.
[Switch]$Test,
# AppVeyor Only - Upload results to AppVeyor "Tests" tab.
[Switch]$Finalize,
# AppVeyor and Azure - Upload module as AppVeyor Artifact.
[Switch]$Artifact
)
$ErrorActionPreference = 'Stop'
if ($Initialize) {
$Psd1 = (Get-ChildItem -File -Filter *.psd1 -Name -Path (Split-Path $PSScriptRoot)).PSPath
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion
Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH"
}
if ($Test) {
function Get-EnvironmentInfo {
if ($null -eq $IsWindows -or $IsWindows) {
# Get Windows Version
try {
$WinRelease, $WinVer = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR
$WindowsVersion = "$($WinVer -join '.') ($WinRelease)"
}
catch {
$WindowsVersion = [System.Environment]::OSVersion.Version
}
# Get .Net Version
# https://stackoverflow.com/questions/3487265/powershell-script-to-return-versions-of-net-framework-on-a-machine
$Lookup = @{
378389 = [version]'4.5'
378675 = [version]'4.5.1'
378758 = [version]'4.5.1'
379893 = [version]'4.5.2'
393295 = [version]'4.6'
393297 = [version]'4.6'
394254 = [version]'4.6.1'
394271 = [version]'4.6.1'
394802 = [version]'4.6.2'
394806 = [version]'4.6.2'
460798 = [version]'4.7'
460805 = [version]'4.7'
461308 = [version]'4.7.1'
461310 = [version]'4.7.1'
461808 = [version]'4.7.2'
461814 = [version]'4.7.2'
528040 = [version]'4.8'
528049 = [version]'4.8'
}
# For One True framework (latest .NET 4x), change the Where-Object match
# to PSChildName -eq "Full":
$DotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
Get-ItemProperty -name Version, Release -EA 0 |
Where-Object { $_.PSChildName -eq "Full" } |
Select-Object @{name = ".NET Framework"; expression = { $_.PSChildName } },
@{name = "Product"; expression = { $Lookup[$_.Release] } },
Version, Release
# Output
[PSCustomObject]($PSVersionTable + @{
ComputerName = $env:Computername
WindowsVersion = $WindowsVersion
'.Net Version' = '{0} (Version: {1}, Release: {2})' -f $DotNetVersion.Product, $DotNetVersion.Version, $DotNetVersion.Release
#EnvironmentPath = $env:Path
})
}
else {
# Output
[PSCustomObject]($PSVersionTable + @{
ComputerName = $env:Computername
#EnvironmentPath = $env:Path
})
}
}
'[Info] Testing On:'
Get-EnvironmentInfo
'[Progress] Installing Module.'
. .\Install.ps1
'[Progress] Invoking Pester.'
Invoke-Pester -OutputFile ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
}
if ($Finalize) {
'[Progress] Finalizing.'
$Failure = $false
$AppVeyorResultsUri = 'https://ci.appveyor.com/api/testresults/nunit/{0}' -f $env:APPVEYOR_JOB_ID
foreach ($TestResultsFile in Get-ChildItem -Path 'TestResultsPS*.xml') {
$TestResultsFilePath = $TestResultsFile.FullName
"[Info] Uploading Files: $AppVeyorResultsUri, $TestResultsFilePath."
# Add PowerShell version to test results
$PSVersion = $TestResultsFile.Name.Replace('TestResults', '').Replace('.xml', '')
[Xml]$Xml = Get-Content -Path $TestResultsFilePath
Select-Xml -Xml $Xml -XPath '//test-case' | ForEach-Object { $_.Node.name = "$PSVersion " + $_.Node.name }
$Xml.OuterXml | Out-File -FilePath $TestResultsFilePath
#Invoke-RestMethod -Method Post -Uri $AppVeyorResultsUri -Body $Xml
[Net.WebClient]::new().UploadFile($AppVeyorResultsUri, $TestResultsFilePath)
if ($Xml.'test-results'.failures -ne '0') {
$Failure = $true
}
}
if ($Failure) {
throw 'Tests failed.'
}
}
if ($Artifact) {
# Get Module Info
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $PSScriptRoot)))
$ModulePath = (Get-Module -Name $ModuleName -ListAvailable).ModuleBase | Split-Path
$VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum
"[Progress] Artifact Start for Module: $ModuleName, Version: $VersionLocal."
if ($env:APPVEYOR) {
$ZipFileName = "{0} {1} {2} {3:yyyy-MM-dd HH-mm-ss}.zip" -f $ModuleName, $VersionLocal, $env:APPVEYOR_REPO_BRANCH, (Get-Date)
$ZipFileFullPath = Join-Path -Path $PSScriptRoot -ChildPath $ZipFileName
"[Info] Artifact. $ModuleName, ZipFileName: $ZipFileName."
#Compress-Archive -Path $ModulePath -DestinationPath $ZipFileFullPath
[System.IO.Compression.ZipFile]::CreateFromDirectory($ModulePath, $ZipFileFullPath, [System.IO.Compression.CompressionLevel]::Optimal, $true)
Push-AppveyorArtifact $ZipFileFullPath -DeploymentName $ModuleName
}
elseif ($env:AGENT_NAME) {
#Write-Host "##vso[task.setvariable variable=ModuleName]$ModuleName"
Copy-Item -Path $ModulePath -Destination $env:Build_ArtifactStagingDirectory -Recurse
}
}

View File

@@ -1,28 +1,32 @@
#Requires -Modules Pester #Requires -Modules Pester
if ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) {return} #Currently this test outputs windows services so only run on Windows. #Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() }
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if ($PSVersionTable.PSVersion.Major -gt 5) { Write-Warning "Can't test grid view on V6 and later" }
else {Add-Type -AssemblyName System.Windows.Forms }
Describe "Compare Worksheet" { Describe "Compare Worksheet" {
Context "Simple comparison output" { BeforeAll {
BeforeAll { if ($PSVersionTable.PSVersion.Major -gt 5) {
Remove-Item -Path "$env:temp\server*.xlsx" It "GridView Support" {
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name, RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName Set-ItResult -Pending -Because "Can't test grid view on V6 and later"
$s | Export-Excel -Path $env:temp\server1.xlsx }
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s
$row4Displayname = $s[2].DisplayName
$s[2].DisplayName = "Changed from the orginal"
$d = $s[-1] | Select-Object -Property *
$d.DisplayName = "Dummy Service"
$d.Name = "Dummy"
$s.Insert(3,$d)
$row6Name = $s[5].name
$s.RemoveAt(5)
$s | Export-Excel -Path $env:temp\server2.xlsx
#Assume default worksheet name, (sheet1) and column header for key ("name")
$comp = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" | Sort-Object -Property _row, _file
} }
else { Add-Type -AssemblyName System.Windows.Forms }
. "$PSScriptRoot\Samples\Samples.ps1"
Remove-Item -Path "TestDrive:\server*.xlsx"
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name, RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName
$s | Export-Excel -Path TestDrive:\server1.xlsx
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s
$row4Displayname = $s[2].DisplayName
$s[2].DisplayName = "Changed from the orginal"
$d = $s[-1] | Select-Object -Property *
$d.DisplayName = "Dummy Service"
$d.Name = "Dummy"
$s.Insert(3,$d)
$row6Name = $s[5].name
$s.RemoveAt(5)
$s | Export-Excel -Path TestDrive:\server2.xlsx
#Assume default worksheet name, (sheet1) and column header for key ("name")
$comp = compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" | Sort-Object -Property _row, _file
}
Context "Simple comparison output" {
it "Found the right number of differences " { it "Found the right number of differences " {
$comp | should not beNullOrEmpty $comp | should not beNullOrEmpty
$comp.Count | should be 4 $comp.Count | should be 4
@@ -57,13 +61,13 @@ Describe "Compare Worksheet" {
$ModulePath = (Get-Command -Name 'Compare-WorkSheet').Module.Path $ModulePath = (Get-Command -Name 'Compare-WorkSheet').Module.Path
$PowerShellExec = if ($PSEdition -eq 'Core') {'pwsh.exe'} else {'powershell.exe'} $PowerShellExec = if ($PSEdition -eq 'Core') {'pwsh.exe'} else {'powershell.exe'}
$PowerShellPath = Join-Path -Path $PSHOME -ChildPath $PowerShellExec $PowerShellPath = Join-Path -Path $PSHOME -ChildPath $PowerShellExec
. $PowerShellPath -Command ("Import-Module $ModulePath; " + '$null = Compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView; Start-Sleep -sec 5') . $PowerShellPath -Command ('Import-Module {0}; $null = Compare-WorkSheet "{1}server1.xlsx" "{1}server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView; Start-Sleep -sec 5' -f $ModulePath, (Resolve-Path 'TestDrive:').ProviderPath)
} }
else { else {
$null = Compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView:$useGrid $null = Compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView:$useGrid
} }
$xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx" $xl1 = Open-ExcelPackage -Path "TestDrive:\server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx" $xl2 = Open-ExcelPackage -Path "TestDrive:\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets[1] $s1Sheet = $xl1.Workbook.Worksheets[1]
$s2Sheet = $xl2.Workbook.Worksheets[1] $s2Sheet = $xl2.Workbook.Worksheets[1]
} }
@@ -87,9 +91,9 @@ Describe "Compare Worksheet" {
Context "Setting the forgound to highlight changed properties" { Context "Setting the forgound to highlight changed properties" {
BeforeAll { BeforeAll {
$null = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -AllDataBackgroundColor([System.Drawing.Color]::white) -BackgroundColor ([System.Drawing.Color]::LightGreen) -FontColor ([System.Drawing.Color]::DarkRed) $null = compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" -AllDataBackgroundColor([System.Drawing.Color]::white) -BackgroundColor ([System.Drawing.Color]::LightGreen) -FontColor ([System.Drawing.Color]::DarkRed)
$xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx" $xl1 = Open-ExcelPackage -Path "TestDrive:\server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx" $xl2 = Open-ExcelPackage -Path "TestDrive:\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets[1] $s1Sheet = $xl1.Workbook.Worksheets[1]
$s2Sheet = $xl2.Workbook.Worksheets[1] $s2Sheet = $xl2.Workbook.Worksheets[1]
} }
@@ -118,7 +122,7 @@ Describe "Compare Worksheet" {
BeforeAll { BeforeAll {
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property RequiredServices, CanPauseAndContinue, CanShutdown, CanStop,
DisplayName, DependentServices, MachineName, ServiceName, ServicesDependedOn, ServiceHandle, Status, ServiceType, StartType -ExcludeProperty Name DisplayName, DependentServices, MachineName, ServiceName, ServicesDependedOn, ServiceHandle, Status, ServiceType, StartType -ExcludeProperty Name
$s | Export-Excel -Path $env:temp\server1.xlsx -WorkSheetname Server1 $s | Export-Excel -Path TestDrive:\server1.xlsx -WorkSheetname server1
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s
$row4Displayname = $s[2].DisplayName $row4Displayname = $s[2].DisplayName
$s[2].DisplayName = "Changed from the orginal" $s[2].DisplayName = "Changed from the orginal"
@@ -130,11 +134,11 @@ Describe "Compare Worksheet" {
$s.RemoveAt(5) $s.RemoveAt(5)
$s[10].ServiceType = "Changed should not matter" $s[10].ServiceType = "Changed should not matter"
$s | Select-Object -Property ServiceName, DisplayName, StartType, ServiceType | Export-Excel -Path $env:temp\server2.xlsx -WorkSheetname server2 $s | Select-Object -Property ServiceName, DisplayName, StartType, ServiceType | Export-Excel -Path TestDrive:\server2.xlsx -WorkSheetname server2
#Assume default worksheet name, (sheet1) and column header for key ("name") #Assume default worksheet name, (sheet1) and column header for key ("name")
$comp = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -WorkSheetName Server1,Server2 -Key ServiceName -Property DisplayName,StartType -AllDataBackgroundColor ([System.Drawing.Color]::AliceBlue) -BackgroundColor ([System.Drawing.Color]::White) -FontColor ([System.Drawing.Color]::Red) | Sort-Object _row,_file $comp = compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" -WorkSheetName server1,server2 -Key ServiceName -Property DisplayName,StartType -AllDataBackgroundColor ([System.Drawing.Color]::AliceBlue) -BackgroundColor ([System.Drawing.Color]::White) -FontColor ([System.Drawing.Color]::Red) | Sort-Object _row,_file
$xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx" $xl1 = Open-ExcelPackage -Path "TestDrive:\server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx" $xl2 = Open-ExcelPackage -Path "TestDrive:\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets["server1"] $s1Sheet = $xl1.Workbook.Worksheets["server1"]
$s2Sheet = $xl2.Workbook.Worksheets["server2"] $s2Sheet = $xl2.Workbook.Worksheets["server2"]
} }
@@ -188,36 +192,36 @@ Describe "Compare Worksheet" {
} }
Describe "Merge Worksheet" { Describe "Merge Worksheet" {
BeforeAll {
Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property *
$s | Export-Excel -Path TestDrive:\server1.xlsx
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s
$s[2].DisplayName = "Changed from the orginal"
$d = $s[-1] | Select-Object -Property *
$d.DisplayName = "Dummy Service"
$d.Name = "Dummy"
$s.Insert(3,$d)
$s.RemoveAt(5)
$s | Export-Excel -Path TestDrive:\server2.xlsx
#Assume default worksheet name, (sheet1) and column header for key ("name")
Merge-Worksheet -Referencefile "TestDrive:\server1.xlsx" -Differencefile "TestDrive:\server2.xlsx" -OutputFile "TestDrive:\combined1.xlsx" -Property name,displayname,startType -Key name
$excel = Open-ExcelPackage -Path "TestDrive:\combined1.xlsx"
$ws = $excel.Workbook.Worksheets["sheet1"]
}
Context "Merge with 3 properties" { Context "Merge with 3 properties" {
BeforeAll {
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\combined*.xlsx" -ErrorAction SilentlyContinue
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property *
$s | Export-Excel -Path $env:temp\server1.xlsx
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s
$s[2].DisplayName = "Changed from the orginal"
$d = $s[-1] | Select-Object -Property *
$d.DisplayName = "Dummy Service"
$d.Name = "Dummy"
$s.Insert(3,$d)
$s.RemoveAt(5)
$s | Export-Excel -Path $env:temp\server2.xlsx
#Assume default worksheet name, (sheet1) and column header for key ("name")
Merge-Worksheet -Referencefile "$env:temp\server1.xlsx" -Differencefile "$env:temp\server2.xlsx" -OutputFile "$env:temp\combined1.xlsx" -Property name,displayname,startType -Key name
$excel = Open-ExcelPackage -Path "$env:temp\combined1.xlsx"
$ws = $excel.Workbook.Worksheets["sheet1"]
}
it "Created a worksheet with the correct headings " { it "Created a worksheet with the correct headings " {
$ws | should not beNullOrEmpty $ws | should not beNullOrEmpty
$ws.Cells[ 1,1].Value | Should be "name" $ws.Cells[ 1,1].Value | Should be "name"
$ws.Cells[ 1,2].Value | Should be "DisplayName" $ws.Cells[ 1,2].Value | Should be "DisplayName"
$ws.Cells[ 1,3].Value | Should be "StartType" $ws.Cells[ 1,3].Value | Should be "StartType"
$ws.Cells[ 1,4].Value | Should be "Server2 DisplayName" $ws.Cells[ 1,4].Value | Should be "server2 DisplayName"
$ws.Cells[ 1,5].Value | Should be "Server2 StartType" $ws.Cells[ 1,5].Value | Should be "server2 StartType"
} }
it "Joined the two sheets correctly " { it "Joined the two sheets correctly " {
$ws.Cells[ 2,2].Value | Should be $ws.Cells[ 2,4].Value $ws.Cells[ 2,2].Value | Should be $ws.Cells[ 2,4].Value
@@ -249,16 +253,16 @@ Describe "Merge Worksheet" {
} }
Context "Wider data set" { Context "Wider data set" {
it "Coped with columns beyond Z in the Output sheet " { it "Coped with columns beyond Z in the Output sheet " {
{ Merge-Worksheet -Referencefile "$env:temp\server1.xlsx" -Differencefile "$env:temp\server2.xlsx" -OutputFile "$env:temp\combined2.xlsx" } | Should not throw { Merge-Worksheet -Referencefile "TestDrive:\server1.xlsx" -Differencefile "TestDrive:\server2.xlsx" -OutputFile "TestDrive:\combined2.xlsx" } | Should not throw
} }
} }
} }
Describe "Merge Multiple sheets" { Describe "Merge Multiple sheets" {
Context "Merge 3 sheets with 3 properties" { Context "Merge 3 sheets with 3 properties" {
BeforeAll { BeforeAll {
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\combined*.xlsx" -ErrorAction SilentlyContinue Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name,DisplayName,StartType [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name,DisplayName,StartType
$s | Export-Excel -Path $env:temp\server1.xlsx $s | Export-Excel -Path TestDrive:\server1.xlsx
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s
$row4Displayname = $s[2].DisplayName $row4Displayname = $s[2].DisplayName
@@ -271,7 +275,7 @@ Describe "Merge Multiple sheets" {
$s.RemoveAt(5) $s.RemoveAt(5)
$s | Export-Excel -Path $env:temp\server2.xlsx $s | Export-Excel -Path TestDrive:\server2.xlsx
$s[2].displayname = $row4Displayname $s[2].displayname = $row4Displayname
@@ -281,22 +285,22 @@ Describe "Merge Multiple sheets" {
$s.Insert(6,$d) $s.Insert(6,$d)
$s.RemoveAt(8) $s.RemoveAt(8)
$s | Export-Excel -Path $env:temp\server3.xlsx $s | Export-Excel -Path TestDrive:\server3.xlsx
Merge-MultipleSheets -Path "$env:temp\server1.xlsx", "$env:temp\server2.xlsx","$env:temp\server3.xlsx" -OutputFile "$env:temp\combined3.xlsx" -Property name,displayname,startType -Key name Merge-MultipleSheets -Path "TestDrive:\server1.xlsx", "TestDrive:\server2.xlsx","TestDrive:\server3.xlsx" -OutputFile "TestDrive:\combined3.xlsx" -Property name,displayname,startType -Key name
$excel = Open-ExcelPackage -Path "$env:temp\combined3.xlsx" $excel = Open-ExcelPackage -Path "TestDrive:\combined3.xlsx"
$ws = $excel.Workbook.Worksheets["sheet1"] $ws = $excel.Workbook.Worksheets["sheet1"]
} }
it "Created a worksheet with the correct headings " { it "Created a worksheet with the correct headings " {
$ws | Should not beNullOrEmpty $ws | Should not beNullOrEmpty
$ws.Cells[ 1,2 ].Value | Should be "name" $ws.Cells[ 1,2 ].Value | Should be "name"
$ws.Cells[ 1,3 ].Value | Should be "Server1 DisplayName" $ws.Cells[ 1,3 ].Value | Should be "server1 DisplayName"
$ws.Cells[ 1,4 ].Value | Should be "Server1 StartType" $ws.Cells[ 1,4 ].Value | Should be "server1 StartType"
$ws.Cells[ 1,5 ].Value | Should be "Server2 DisplayName" $ws.Cells[ 1,5 ].Value | Should be "server2 DisplayName"
$ws.Cells[ 1,6 ].Value | Should be "Server2 StartType" $ws.Cells[ 1,6 ].Value | Should be "server2 StartType"
$ws.Column(7).hidden | Should be $true $ws.Column(7).hidden | Should be $true
$ws.Cells[ 1,8].Value | Should be "Server2 Row" $ws.Cells[ 1,8].Value | Should be "server2 Row"
$ws.Cells[ 1,9 ].Value | Should be "server3 DisplayName" $ws.Cells[ 1,9 ].Value | Should be "server3 DisplayName"
$ws.Cells[ 1,10].Value | Should be "server3 StartType" $ws.Cells[ 1,10].Value | Should be "server3 StartType"
$ws.Column(11).hidden | Should be $true $ws.Column(11).hidden | Should be $true

View File

@@ -1,6 +1,6 @@
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force #Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$xlFile = "$env:TEMP\testSQL.xlsx" $xlFile = "TestDrive:\testSQL.xlsx"
Describe "ConvertFrom-ExcelToSQLInsert" { Describe "ConvertFrom-ExcelToSQLInsert" {

View File

@@ -1,39 +1,36 @@
if ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) {return} #Currently this test outputs windows services so only run on Windows.
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$path1 = "$env:TEMP\Test1.xlsx"
$path2 = "$env:TEMP\Test2.xlsx"
Remove-item -Path $path1, $path2 -ErrorAction SilentlyContinue
$ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"}
else {$OtherCurrencySymbol = "£"}
[PSCustOmobject][Ordered]@{
Date = Get-Date
Formula1 = '=SUM(F2:G2)'
String1 = 'My String'
Float = [math]::pi
IPAddress = '10.10.25.5'
StrLeadZero = '07670'
StrComma = '0,26'
StrEngThousand = '1,234.56'
StrEuroThousand = '1.555,83'
StrDot = '1.2'
StrNegInt = '-31'
StrTrailingNeg = '31-'
StrParens = '(123)'
strLocalCurrency = ('{0}123.45' -f (Get-Culture).NumberFormat.CurrencySymbol )
strOtherCurrency = ('{0}123.45' -f $OtherCurrencySymbol )
StrE164Phone = '+32 (444) 444 4444'
StrAltPhone1 = '+32 4 4444 444'
StrAltPhone2 = '+3244444444'
StrLeadSpace = ' 123'
StrTrailSpace = '123 '
Link1 = [uri]"https://github.com/dfinke/ImportExcel"
Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2
Describe "Copy-Worksheet" { Describe "Copy-Worksheet" {
$path1 = "TestDrive:\Test1.xlsx"
$path2 = "TestDrive:\Test2.xlsx"
Remove-Item -Path $path1, $path2 -ErrorAction SilentlyContinue
$ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") { $OtherCurrencySymbol = "$" }
else { $OtherCurrencySymbol = "£" }
[PSCustOmobject][Ordered]@{
Date = Get-Date
Formula1 = '=SUM(F2:G2)'
String1 = 'My String'
Float = [math]::pi
IPAddress = '10.10.25.5'
StrLeadZero = '07670'
StrComma = '0,26'
StrEngThousand = '1,234.56'
StrEuroThousand = '1.555,83'
StrDot = '1.2'
StrNegInt = '-31'
StrTrailingNeg = '31-'
StrParens = '(123)'
strLocalCurrency = ('{0}123.45' -f (Get-Culture).NumberFormat.CurrencySymbol )
strOtherCurrency = ('{0}123.45' -f $OtherCurrencySymbol )
StrE164Phone = '+32 (444) 444 4444'
StrAltPhone1 = '+32 4 4444 444'
StrAltPhone2 = '+3244444444'
StrLeadSpace = ' 123'
StrTrailSpace = '123 '
Link1 = [uri]"https://github.com/dfinke/ImportExcel"
Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2
Context "Simplest copy" { Context "Simplest copy" {
BeforeAll { BeforeAll {
Copy-ExcelWorkSheet -SourceWorkbook $path1 -DestinationWorkbook $path2 Copy-ExcelWorkSheet -SourceWorkbook $path1 -DestinationWorkbook $path2
@@ -91,8 +88,8 @@ Describe "Copy-Worksheet" {
Context "Copy worksheet should close all files" { Context "Copy worksheet should close all files" {
BeforeAll { BeforeAll {
$xlfile = "$env:TEMP\reports.xlsx" $xlfile = "TestDrive:\reports.xlsx"
$xlfileArchive = "$env:TEMP\reportsArchive.xlsx" $xlfileArchive = "TestDrive:\reportsArchive.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
Remove-Item $xlfileArchive -ErrorAction SilentlyContinue Remove-Item $xlfileArchive -ErrorAction SilentlyContinue
@@ -119,8 +116,8 @@ Describe "Copy-Worksheet" {
Context "Copy worksheet should support piped input" { Context "Copy worksheet should support piped input" {
BeforeAll { BeforeAll {
$xlfile = "$env:TEMP\reports.xlsx" $xlfile = "TestDrive:\reports.xlsx"
$xlfileArchive = "$env:TEMP\reportsArchive.xlsx" $xlfileArchive = "TestDrive:\reportsArchive.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
Remove-Item $xlfileArchive -ErrorAction SilentlyContinue Remove-Item $xlfileArchive -ErrorAction SilentlyContinue

View File

@@ -1,14 +1,20 @@
#Requires -Modules Pester #Requires -Modules Pester
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force #Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' )
if (Get-process -Name Excel,xlim -ErrorAction SilentlyContinue) { Write-Warning -Message "You need to close Excel before running the tests." ; return}
Describe ExportExcel { Describe ExportExcel {
. "$PSScriptRoot\Samples\Samples.ps1"
if (Get-process -Name Excel,xlim -ErrorAction SilentlyContinue) {
It "Excel is open" {
$Warning = "You need to close Excel before running the tests."
Write-Warning -Message $Warning
Set-ItResult -Inconclusive -Because $Warning
}
return
}
Context "#Example 1 # Creates and opens a file with the right number of rows and columns" { Context "#Example 1 # Creates and opens a file with the right number of rows and columns" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Test with a maximum of 100 processes for speed; export all properties, then export smaller subsets. #Test with a maximum of 100 processes for speed; export all properties, then export smaller subsets.
$processes = Get-Process | where {$_.StartTime} | Select-Object -first 100 -Property * -excludeProperty Parent $processes = Get-Process | where {$_.StartTime} | Select-Object -first 100 -Property * -excludeProperty Parent
@@ -70,7 +76,7 @@ Describe ExportExcel {
} }
Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" { Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
$processes = Get-Process | Select-Object -First 100 $processes = Get-Process | Select-Object -First 100
$propertyNames = $Processes[0].psobject.properties.where( {$_.MemberType -eq 'Property'}).name $propertyNames = $Processes[0].psobject.properties.where( {$_.MemberType -eq 'Property'}).name
@@ -119,7 +125,7 @@ Describe ExportExcel {
Context "#Example 2 # Exports a list of numbers and applies number format " { Context "#Example 2 # Exports a list of numbers and applies number format " {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#testing -ReturnRange switch and applying number format to Formulas as well as values. #testing -ReturnRange switch and applying number format to Formulas as well as values.
$returnedRange = @($null, -1, 0, 34, 777, "", -0.5, 119, -0.1, 234, 788,"=A9+A10") | Export-Excel -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00' -Path $path -ReturnRange $returnedRange = @($null, -1, 0, 34, 777, "", -0.5, 119, -0.1, 234, 788,"=A9+A10") | Export-Excel -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00' -Path $path -ReturnRange
@@ -158,7 +164,7 @@ Describe ExportExcel {
Context " # Number format parameter" { Context " # Number format parameter" {
BeforeAll { BeforeAll {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
1..10 | Export-Excel -Path $path -Numberformat 'Number' 1..10 | Export-Excel -Path $path -Numberformat 'Number'
1..10 | Export-Excel -Path $path -Numberformat 'Percentage' -Append 1..10 | Export-Excel -Path $path -Numberformat 'Percentage' -Append
@@ -181,7 +187,7 @@ Describe ExportExcel {
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"} if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"}
else {$OtherCurrencySymbol = "£"} else {$OtherCurrencySymbol = "£"}
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
$warnVar = $null $warnVar = $null
#Test correct export of different data types and number formats; test hyperlinks, test -NoNumberConversion test object is converted to a string with no warnings, test calcuation of formula #Test correct export of different data types and number formats; test hyperlinks, test -NoNumberConversion test object is converted to a string with no warnings, test calcuation of formula
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
@@ -298,7 +304,7 @@ Describe ExportExcel {
Context "# # Setting cells for different data types with -noHeader" { Context "# # Setting cells for different data types with -noHeader" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Test -NoHeader & -NoNumberConversion #Test -NoHeader & -NoNumberConversion
[PSCustOmobject][Ordered]@{ [PSCustOmobject][Ordered]@{
@@ -359,7 +365,7 @@ Describe ExportExcel {
#Test New-ConditionalText builds correctly #Test New-ConditionalText builds correctly
$ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor ([System.Drawing.Color]::DarkRed) -BackgroundColor ([System.Drawing.Color]::LightPink) $ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor ([System.Drawing.Color]::DarkRed) -BackgroundColor ([System.Drawing.Color]::LightPink)
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Test -ConditionalText with a single conditional spec. #Test -ConditionalText with a single conditional spec.
Write-Output 489 668 299 777 860 151 119 497 234 788 | Export-Excel -Path $path -ConditionalText $ct Write-Output 489 668 299 777 860 151 119 497 234 788 | Export-Excel -Path $path -ConditionalText $ct
@@ -386,19 +392,19 @@ Describe ExportExcel {
} }
} }
Context "#Example 6 # Adding multiple conditional formats using short form syntax. " { #Test adding mutliple conditional blocks and using the minimal syntax for new-ConditionalText
if ($notwindows) {Write-warning "Test only runs on Windows" ; return} $path = "TestDrive:\test.xlsx"
#Test adding mutliple conditional blocks and using the minimal syntax for new-ConditionalText Remove-item -Path $path -ErrorAction SilentlyContinue
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue
#Testing -Passthrough #Testing -Passthrough
$Excel = Get-Service | Select-Object Name, Status, DisplayName, ServiceName | $Excel = Get-Service | Select-Object Name, Status, DisplayName, ServiceName |
Export-Excel $path -PassThru -ConditionalText $( Export-Excel $path -PassThru -ConditionalText $(
New-ConditionalText Stop ([System.Drawing.Color]::DarkRed) ([System.Drawing.Color]::LightPink) New-ConditionalText Stop ([System.Drawing.Color]::DarkRed) ([System.Drawing.Color]::LightPink)
New-ConditionalText Running ([System.Drawing.Color]::Blue) ([System.Drawing.Color]::Cyan) New-ConditionalText Running ([System.Drawing.Color]::Blue) ([System.Drawing.Color]::Cyan)
) )
$ws = $Excel.Workbook.Worksheets[1] $ws = $Excel.Workbook.Worksheets[1]
Context "#Example 6 # Adding multiple conditional formats using short form syntax. " {
it "Added two blocks of conditional formating for the data range " { it "Added two blocks of conditional formating for the data range " {
$ws.ConditionalFormatting.Count | Should be 2 $ws.ConditionalFormatting.Count | Should be 2
$ws.ConditionalFormatting[0].Address | Should be ($ws.Dimension.Address) $ws.ConditionalFormatting[0].Address | Should be ($ws.Dimension.Address)
@@ -411,8 +417,8 @@ Describe ExportExcel {
$ws.ConditionalFormatting[1].Type | Should be "ContainsText" $ws.ConditionalFormatting[1].Type | Should be "ContainsText"
#Add RGB Comparison #Add RGB Comparison
} }
Close-ExcelPackage -ExcelPackage $Excel
} }
Close-ExcelPackage -ExcelPackage $Excel
Context "#Example 7 # Update-FirstObjectProperties works " { Context "#Example 7 # Update-FirstObjectProperties works " {
$Array = @() $Array = @()
@@ -451,11 +457,9 @@ Describe ExportExcel {
} }
Context "#Examples 8 & 9 # Adding Pivot tables and charts from parameters" { Context "#Examples 8 & 9 # Adding Pivot tables and charts from parameters" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
#Test -passthru and -worksheetName creating a new, named, sheet in an existing file. #Test -passthru and -worksheetName creating a new, named, sheet in an existing file.
$Script:Procs= Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company $Excel = Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company | Export-Excel $path -WorkSheetname Processes -PassThru
if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return}
$Excel = $Script:Procs| Export-Excel $path -WorkSheetname Processes -PassThru
#Testing -Excel Pacakage and adding a Pivot-table as a second step. Want to save and re-open it ... #Testing -Excel Pacakage and adding a Pivot-table as a second step. Want to save and re-open it ...
Export-Excel -ExcelPackage $Excel -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -NoTotalsInPivot -PivotDataToColumn -Activate Export-Excel -ExcelPackage $Excel -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -NoTotalsInPivot -PivotDataToColumn -Activate
@@ -471,8 +475,9 @@ Describe ExportExcel {
$excel.Workbook.Worksheets["Processes"].Dimension.rows | Should be 21 #20 data + 1 header $excel.Workbook.Worksheets["Processes"].Dimension.rows | Should be 21 #20 data + 1 header
} }
it "Selected the Pivottable page " { it "Selected the Pivottable page " {
Set-ItResult -Pending -Because "Bug in EPPLus 4.5"
$PTws.View.TabSelected | Should be $true $PTws.View.TabSelected | Should be $true
} -Skip # << Bug in EPPLus 4.5 }
$pt = $PTws.PivotTables[0] $pt = $PTws.PivotTables[0]
it "Built the expected Pivot table " { it "Built the expected Pivot table " {
$pt.RowFields.Count | Should be 1 $pt.RowFields.Count | Should be 1
@@ -512,7 +517,7 @@ Describe ExportExcel {
} }
Context " # Add-Worksheet inserted sheets, moved them correctly, and copied a sheet" { Context " # Add-Worksheet inserted sheets, moved them correctly, and copied a sheet" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
#Test the -CopySource and -Movexxxx parameters for Add-WorkSheet #Test the -CopySource and -Movexxxx parameters for Add-WorkSheet
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
#At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable #At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable
@@ -534,7 +539,7 @@ Describe ExportExcel {
$excel.Workbook.Worksheets[5].Name | Should be "Processes" $excel.Workbook.Worksheets[5].Name | Should be "Processes"
$excel.Workbook.Worksheets[6].Name | Should be "NearDone" $excel.Workbook.Worksheets[6].Name | Should be "NearDone"
$excel.Workbook.Worksheets[7].Name | Should be "Sheet1" $excel.Workbook.Worksheets[7].Name | Should be "Sheet1"
} -skip:($Procs.count -lt 20) }
it "Cloned 'Sheet1' to 'NewSheet' " { it "Cloned 'Sheet1' to 'NewSheet' " {
$newWs = $excel.Workbook.Worksheets["NewSheet"] $newWs = $excel.Workbook.Worksheets["NewSheet"]
@@ -547,15 +552,13 @@ Describe ExportExcel {
} }
Context " # Create and append with Start row and Start Column, inc ranges and Pivot table. " { Context " # Create and append with Start row and Start Column, inc ranges and Pivot table. " {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
remove-item -Path $path -ErrorAction SilentlyContinue remove-item -Path $path -ErrorAction SilentlyContinue
#Catch warning #Catch warning
$warnVar = $null $warnVar = $null
#Test -Append with no existing sheet. Test adding a named pivot table from command line parameters and extending ranges when they're not specified explictly #Test -Append with no existing sheet. Test adding a named pivot table from command line parameters and extending ranges when they're not specified explictly
$Script:Procs= Get-Process Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -PivotFilter Name -NoTotalsInPivot -RangeName procs -AutoFilter -AutoNameRange
if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return} Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -WarningAction SilentlyContinue -WarningVariable warnvar
$Script:Procs| Select-Object -First 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -PivotFilter Name -NoTotalsInPivot -RangeName procs -AutoFilter -AutoNameRange
$Script:Procs| Select-Object -Last 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -WarningAction SilentlyContinue -WarningVariable warnvar
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
$dataWs = $Excel.Workbook.Worksheets["withOffset"] $dataWs = $Excel.Workbook.Worksheets["withOffset"]
$pt = $Excel.Workbook.Worksheets["PTOffset"].PivotTables[0] $pt = $Excel.Workbook.Worksheets["PTOffset"].PivotTables[0]
@@ -599,14 +602,11 @@ Describe ExportExcel {
} }
Context " # Create and append explicit and auto table and range extension" { Context " # Create and append explicit and auto table and range extension" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
#Test -Append automatically extends a table, even when it is not specified in the append command; #Test -Append automatically extends a table, even when it is not specified in the append command;
$Script:Procs= Get-process Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -TableName ProcTab -AutoNameRange -WorkSheetname NoOffset -ClearSheet
if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return}
$Script:Procs| Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -TableName ProcTab -AutoNameRange -WorkSheetname NoOffset -ClearSheet
#Test number format applying to new data #Test number format applying to new data
$Script:Procs| Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -AutoNameRange -WorkSheetname NoOffset -Append -Numberformat 'Number' Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -AutoNameRange -WorkSheetname NoOffset -Append -Numberformat 'Number'
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
$dataWs = $Excel.Workbook.Worksheets["NoOffset"] $dataWs = $Excel.Workbook.Worksheets["NoOffset"]
@@ -635,8 +635,7 @@ Describe ExportExcel {
} }
Context "#Example 11 # Create and append with title, inc ranges and Pivot table" { Context "#Example 11 # Create and append with title, inc ranges and Pivot table" {
if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return} $path = "TestDrive:\test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
#Test New-PivotTableDefinition builds definition using -Pivotfilter and -PivotTotals options. #Test New-PivotTableDefinition builds definition using -Pivotfilter and -PivotTotals options.
$ptDef = [ordered]@{} $ptDef = [ordered]@{}
$ptDef += New-PivotTableDefinition -PivotTableName "PT1" -SourceWorkSheet 'Sheet1' -PivotRows "Status" -PivotData @{'Status' = 'Count'} -PivotTotals Columns -PivotFilter "StartType" -IncludePivotChart -ChartType BarClustered3D -ChartTitle "Services by status" -ChartHeight 512 -ChartWidth 768 -ChartRow 10 -ChartColumn 0 -NoLegend -PivotColumns CanPauseAndContinue $ptDef += New-PivotTableDefinition -PivotTableName "PT1" -SourceWorkSheet 'Sheet1' -PivotRows "Status" -PivotData @{'Status' = 'Count'} -PivotTotals Columns -PivotFilter "StartType" -IncludePivotChart -ChartType BarClustered3D -ChartTitle "Services by status" -ChartHeight 512 -ChartWidth 768 -ChartRow 10 -ChartColumn 0 -NoLegend -PivotColumns CanPauseAndContinue
@@ -718,8 +717,8 @@ Describe ExportExcel {
} }
Context "#Example 13 # Formatting and another way to do a pivot. " { Context "#Example 13 # Formatting and another way to do a pivot. " {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-Item $path -ErrorAction SilentlyContinue Remove-Item $path
#Test freezing top row/first column, adding formats and a pivot table - from Add-Pivot table not a specification variable - after the export #Test freezing top row/first column, adding formats and a pivot table - from Add-Pivot table not a specification variable - after the export
$excel = Get-Process | Select-Object -Property Name, Company, Handles, CPU, PM, NPM, WS | Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -FreezeTopRowFirstColumn -PassThru $excel = Get-Process | Select-Object -Property Name, Company, Handles, CPU, PM, NPM, WS | Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -FreezeTopRowFirstColumn -PassThru
$sheet = $excel.Workbook.Worksheets["Processes"] $sheet = $excel.Workbook.Worksheets["Processes"]
@@ -747,6 +746,8 @@ Describe ExportExcel {
} }
it "Applied the formating " { it "Applied the formating " {
$sheet | Should not beNullOrEmpty $sheet | Should not beNullOrEmpty
$sheet.Column(1).wdith | Should not be $sheet.DefaultColWidth
$sheet.Column(7).wdith | Should not be $sheet.DefaultColWidth
$sheet.Column(1).style.font.bold | Should be $true $sheet.Column(1).style.font.bold | Should be $true
$sheet.Column(2).style.wraptext | Should be $true $sheet.Column(2).style.wraptext | Should be $true
$sheet.Column(2).width | Should be 29 $sheet.Column(2).width | Should be 29
@@ -769,10 +770,6 @@ Describe ExportExcel {
$sheet.ConditionalFormatting[2].Formula | Should be '104857600' $sheet.ConditionalFormatting[2].Formula | Should be '104857600'
$sheet.ConditionalFormatting[2].Style.Font.Color.Color.Name | Should be 'ffff0000' $sheet.ConditionalFormatting[2].Style.Font.Color.Color.Name | Should be 'ffff0000'
} }
it "Applied autowidth " {
$sheet.Column(1).wdith | Should not be $sheet.DefaultColWidth
$sheet.Column(7).wdith | Should not be $sheet.DefaultColWidth
} -skip:$notwindows
it "Created the named ranges " { it "Created the named ranges " {
$sheet.Names.Count | Should be 7 $sheet.Names.Count | Should be 7
$sheet.Names[0].Start.Column | Should be 1 $sheet.Names[0].Start.Column | Should be 1
@@ -800,7 +797,7 @@ Describe ExportExcel {
} }
Context " # Chart from MultiSeries.ps1 in the Examples\charts Directory" { Context " # Chart from MultiSeries.ps1 in the Examples\charts Directory" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
#Test we haven't missed any parameters on New-ChartDefinition which are on add chart or vice versa. #Test we haven't missed any parameters on New-ChartDefinition which are on add chart or vice versa.
@@ -823,7 +820,7 @@ Describe ExportExcel {
$data[1].Handles | Should not beNullOrEmpty $data[1].Handles | Should not beNullOrEmpty
$data[1].PM | Should not beNullOrEmpty $data[1].PM | Should not beNullOrEmpty
$data[1].VirtualMemorySize | Should not beNullOrEmpty $data[1].VirtualMemorySize | Should not beNullOrEmpty
} -skip:($procs.count -lt 20) }
$c = New-ExcelChartDefinition -Title Stats -ChartType LineMarkersStacked -XRange "Processes[Name]" -YRange "Processes[PM]", "Processes[VirtualMemorySize]" -SeriesHeader 'PM', 'VMSize' $c = New-ExcelChartDefinition -Title Stats -ChartType LineMarkersStacked -XRange "Processes[Name]" -YRange "Processes[PM]", "Processes[VirtualMemorySize]" -SeriesHeader 'PM', 'VMSize'
it "Created the Excel chart definition " { it "Created the Excel chart definition " {
@@ -858,7 +855,7 @@ Describe ExportExcel {
} }
Context " # variation of plot.ps1 from Examples Directory using Add chart outside ExportExcel" { Context " # variation of plot.ps1 from Examples Directory using Add chart outside ExportExcel" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
#Test inserting a fomual #Test inserting a fomual
$excel = 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -WorkSheetname SinX -ClearSheet -FreezeFirstColumn -PassThru $excel = 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -WorkSheetname SinX -ClearSheet -FreezeFirstColumn -PassThru
#Test-Add Excel Chart to existing data. Test add Conditional formatting with a formula #Test-Add Excel Chart to existing data. Test add Conditional formatting with a formula
@@ -900,7 +897,7 @@ Describe ExportExcel {
} }
Context " # Quick line chart" { Context " # Quick line chart" {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
#test drawing a chart when data doesn't have a string #test drawing a chart when data doesn't have a string
0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -LineChart 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -LineChart
@@ -918,10 +915,8 @@ Describe ExportExcel {
} }
Context " # Quick Pie chart and three icon conditional formating" { Context " # Quick Pie chart and three icon conditional formating" {
$path = Join-Path $Env:TEMP "Pie.xlsx" $path = "TestDrive:\Pie.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
$Script:Procs= Get-Process
if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return}
$range = Get-Process| Group-Object -Property company | Where-Object -Property name | $range = Get-Process| Group-Object -Property company | Where-Object -Property name |
Select-Object -Property Name, @{n="TotalPm";e={($_.group | Measure-Object -sum -Property pm).sum }} | Select-Object -Property Name, @{n="TotalPm";e={($_.group | Measure-Object -sum -Property pm).sum }} |
Export-Excel -NoHeader -AutoNameRange -path $path -ReturnRange -PieChart -ShowPercent Export-Excel -NoHeader -AutoNameRange -path $path -ReturnRange -PieChart -ShowPercent
@@ -957,11 +952,16 @@ Describe ExportExcel {
} }
Context " # Awkward multiple tables" { Context " # Awkward multiple tables" {
if ($notWindows) {Write-warning "Test only runs on Windows" ; return} $path = "TestDrive:\test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
#Test creating 3 on overlapping tables on the same page. Create rightmost the left most then middle. #Test creating 3 on overlapping tables on the same page. Create rightmost the left most then middle.
remove-item -Path $path -ErrorAction SilentlyContinue remove-item -Path $path -ErrorAction SilentlyContinue
$r = Get-ChildItem -path C:\WINDOWS\system32 -File if ($IsLinux -or $IsMacOS) {
$SystemFolder = '/etc'
}
else {
$SystemFolder = 'C:\WINDOWS\system32'
}
$r = Get-ChildItem -path $SystemFolder -File
"Biggest files" | Export-Excel -Path $path -StartRow 1 -StartColumn 7 "Biggest files" | Export-Excel -Path $path -StartRow 1 -StartColumn 7
$r | Sort-Object length -Descending | Select-Object -First 14 Name, @{n="Size";e={$_.Length}} | $r | Sort-Object length -Descending | Select-Object -First 14 Name, @{n="Size";e={$_.Length}} |
@@ -993,7 +993,7 @@ Describe ExportExcel {
} }
Context " # Parameters and ParameterSets" { Context " # Parameters and ParameterSets" {
$Path = join-path $env:TEMP "temp.xlsx" $Path = Join-Path (Resolve-Path 'TestDrive:').ProviderPath "test.xlsx"
Remove-Item -Path $Path -ErrorAction SilentlyContinue Remove-Item -Path $Path -ErrorAction SilentlyContinue
$Processes = Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company $Processes = Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company
@@ -1028,26 +1028,24 @@ Describe ExportExcel {
$ExcelPackage.File | Should Be $Path $ExcelPackage.File | Should Be $Path
$Worksheet.Tables[0].Name | Should Be 'Table1' $Worksheet.Tables[0].Name | Should Be 'Table1'
} }
it "Now will use temp Path, set TableName with generated name".PadRight(87) { it "Now will use temp Path, set TableName with generated name and AutoSize".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru $ExcelPackage = $Processes | Export-Excel -Now -PassThru
$Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1] $Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should BeLike ([IO.Path]::GetTempPath() + '*') $ExcelPackage.File | Should BeLike ([IO.Path]::GetTempPath() + '*')
$Script:Worksheet.Tables[0].Name | Should Be 'Table1' $Worksheet.Tables[0].Name | Should Be 'Table1'
$Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty} $Worksheet.AutoFilterAddress | Should BeNullOrEmpty
it "Applies AutoSize with these".PadRight(87) { $Worksheet.Column(5).Width | Should BeGreaterThan 9.5
$Script:Worksheet.Column(5).Width | Should BeGreaterThan 9.5 }
} -skip:$notwindows
it "Now allows override of Path and TableName".PadRight(87) { it "Now allows override of Path and TableName".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru -Path $Path -TableName:$false $ExcelPackage = $Processes | Export-Excel -Now -PassThru -Path $Path -TableName:$false
$Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1] $Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should Be $Path $ExcelPackage.File | Should Be $Path
$Script:Worksheet.Tables | Should BeNullOrEmpty $Worksheet.Tables | Should BeNullOrEmpty
$Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty $Worksheet.AutoFilterAddress | Should BeNullOrEmpty
$Worksheet.Column(5).Width | Should BeGreaterThan 9.5
} }
it "Allows AutoSize with the override".PadRight(87) {
$Script:Worksheet.Column(5).Width | Should BeGreaterThan 9.5
} -skip:$notwindows
<# Mock looks unreliable need to check <# Mock looks unreliable need to check
Mock -CommandName 'Invoke-Item' Mock -CommandName 'Invoke-Item'
it "Now will Show".PadRight(87) { it "Now will Show".PadRight(87) {
@@ -1069,14 +1067,11 @@ Describe ExportExcel {
} }
it "Now allows to set TableName".PadRight(87) { it "Now allows to set TableName".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru -TableName 'Data' $ExcelPackage = $Processes | Export-Excel -Now -PassThru -TableName 'Data'
$Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1] $Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$Script:Worksheet.Tables[0].Name | Should Be 'Data' $Worksheet.Tables[0].Name | Should Be 'Data'
$Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty $Worksheet.AutoFilterAddress | Should BeNullOrEmpty
$Worksheet.Column(5).Width | Should BeGreaterThan 9.5
} }
it "Allows to set TableName with AutoSize".PadRight(87) {
$Script:Worksheet.Column(5).Width | Should BeGreaterThan 9.5
} -skip:$notwindows
} }
} }

View File

@@ -1,9 +1,9 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$path = Join-Path $Env:TEMP "test.xlsx" Describe "Creating workbook with a single line" {
remove-item -path $path -ErrorAction SilentlyContinue $path = "TestDrive:\test.xlsx"
ConvertFrom-Csv @" remove-item -path $path -ErrorAction SilentlyContinue
ConvertFrom-Csv @"
Product, City, Gross, Net Product, City, Gross, Net
Apple, London , 300, 250 Apple, London , 300, 250
Orange, London , 400, 350 Orange, London , 400, 350
@@ -17,10 +17,9 @@ Apple, New York, 1200,700
PivotChartDefinition=@{Title="Gross and net by city and product"; ChartType="ColumnClustered"; Column=6; Width=600; Height=360; YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"; LegendPosition="Bottom"}}} PivotChartDefinition=@{Title="Gross and net by city and product"; ChartType="ColumnClustered"; Column=6; Width=600; Height=360; YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"; LegendPosition="Bottom"}}}
$excel = Open-ExcelPackage $path $excel = Open-ExcelPackage $path
$ws1 = $excel.Workbook.Worksheets[1] $ws1 = $excel.Workbook.Worksheets[1]
$ws2 = $excel.Workbook.Worksheets[2] $ws2 = $excel.Workbook.Worksheets[2]
Describe "Creating workbook with a single line" {
Context "Data Page" { Context "Data Page" {
It "Inserted the data and created the table " { It "Inserted the data and created the table " {
$ws1.Tables[0] | Should not beNullOrEmpty $ws1.Tables[0] | Should not beNullOrEmpty
@@ -52,8 +51,9 @@ Describe "Creating workbook with a single line" {
$ws2.PivotTables[0].ColumGrandTotals | Should be $true #Epplus's mis-spelling of column not mine $ws2.PivotTables[0].ColumGrandTotals | Should be $true #Epplus's mis-spelling of column not mine
} }
it "Made the PivotTable page active " { it "Made the PivotTable page active " {
Set-ItResult -Pending -Because "Bug in EPPLus 4.5"
$ws2.View.TabSelected | Should be $true $ws2.View.TabSelected | Should be $true
} -Skip # << Bug in EPPLus 4.5 }
it "Created the Pivot Chart " { it "Created the Pivot Chart " {
$ws2.Drawings[0] | Should not beNullOrEmpty $ws2.Drawings[0] | Should not beNullOrEmpty
$ws2.Drawings[0].ChartType.ToString() | Should be ColumnClustered $ws2.Drawings[0].ChartType.ToString() | Should be ColumnClustered

View File

@@ -1,11 +1,9 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } $scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv" $dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv"
Describe "Creating small named ranges with hyperlinks" { Describe "Creating small named ranges with hyperlinks" {
BeforeAll { BeforeAll {
$path = Join-Path $Env:TEMP "results.xlsx" $path = "TestDrive:\Results.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
#Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race #Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race
$results = Import-Csv -Path $dataPath | $results = Import-Csv -Path $dataPath |
@@ -94,11 +92,12 @@ Describe "Creating small named ranges with hyperlinks" {
$sheet.ConditionalFormatting[1].StopIfTrue | Should be $true $sheet.ConditionalFormatting[1].StopIfTrue | Should be $true
} }
It "Applied ConditionalFormatting, including Reverse " { It "Applied ConditionalFormatting, including Reverse " {
Set-ItResult -Pending -Because "Bug in EPPLus 4.5"
$sheet.ConditionalFormatting[3].LowValue.Color.R | Should begreaterThan 180 $sheet.ConditionalFormatting[3].LowValue.Color.R | Should begreaterThan 180
$sheet.ConditionalFormatting[3].LowValue.Color.G | Should beLessThan 128 $sheet.ConditionalFormatting[3].LowValue.Color.G | Should beLessThan 128
$sheet.ConditionalFormatting[3].HighValue.Color.R | Should beLessThan 128 $sheet.ConditionalFormatting[3].HighValue.Color.R | Should beLessThan 128
$sheet.ConditionalFormatting[3].HighValue.Color.G | Should begreaterThan 180 $sheet.ConditionalFormatting[3].HighValue.Color.G | Should begreaterThan 180
} -Skip # << Bug in EPPLus 4.5 }
} }
Context "Adding a table" { Context "Adding a table" {
it "Created a table " { it "Created a table " {

View File

@@ -1,6 +1,6 @@
#Requires -Modules Pester #Requires -Modules Pester
remove-module importExcel -erroraction silentlyContinue #remove-module importExcel -erroraction silentlyContinue
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force #Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
Describe "Check if Function aliases exist" { Describe "Check if Function aliases exist" {

View File

@@ -1,4 +1,4 @@
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 #Import-Module $PSScriptRoot\..\..\ImportExcel.psd1
Describe "Tests" { Describe "Tests" {
BeforeAll { BeforeAll {

View File

@@ -1,8 +1,6 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
Describe "Exporting with -Inputobject" { Describe "Exporting with -Inputobject" {
BeforeAll { BeforeAll {
$path = Join-Path $Env:TEMP "results.xlsx" $path = "TestDrive:\Results.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
#Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race #Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race
$results = ((Get-Process) + (Get-Process -id $PID)) | Select-Object -last 10 -Property Name, cpu, pm, handles, StartTime $results = ((Get-Process) + (Get-Process -id $PID)) | Select-Object -last 10 -Property Name, cpu, pm, handles, StartTime

View File

@@ -0,0 +1,26 @@
<#
.SYNOPSIS
Installs PowerShell Core on Windows.
#>
[CmdLetBinding()]
Param
(
# Version to install in the format from the .msi, for example "7.0.0-preview.1"
[Parameter(Mandatory)]
[String]$Version
)
$ErrorActionPreference = 'Stop'
'[Progress] Downloading PowerShell Core.'
$MsiPath = Join-Path $env:TEMP "PowerShell-$Version-win-x64.msi"
[System.Net.WebClient]::new().DownloadFile("https://github.com/PowerShell/PowerShell/releases/download/v$Version/PowerShell-$Version-win-x64.msi", $MsiPath)
'[Progress] Installing PowerShell Core.'
Start-Process 'msiexec.exe' -Wait -ArgumentList "/i $MsiPath /quiet"
Remove-Item -Path $MsiPath
$PowerShellFolder = $Version[0]
if ($Version -like "*preview*") {
$PowerShellFolder += '-preview'
}
$env:Path = "$env:ProgramFiles\PowerShell\$PowerShellFolder;$env:Path"
'[Progress] PowerShell Core Installed.'

View File

@@ -1,7 +1,4 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } $data1 = ConvertFrom-Csv -InputObject @"
$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' )
$data1 = ConvertFrom-Csv -InputObject @"
ID,Product,Quantity,Price,Total ID,Product,Quantity,Price,Total
12001,Nails,37,3.99,147.63 12001,Nails,37,3.99,147.63
12002,Hammer,5,12.10,60.5 12002,Hammer,5,12.10,60.5
@@ -27,7 +24,8 @@ ID,Product,Quantity,Price,Total
Describe "Join Worksheet part 1" { Describe "Join Worksheet part 1" {
BeforeAll { BeforeAll {
$path = Join-Path $Env:TEMP "test.xlsx" . "$PSScriptRoot\Samples\Samples.ps1"
$path = "TestDrive:\test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
$data1 | Export-Excel -Path $path -WorkSheetname Oxford $data1 | Export-Excel -Path $path -WorkSheetname Oxford
$data2 | Export-Excel -Path $path -WorkSheetname Abingdon $data2 | Export-Excel -Path $path -WorkSheetname Abingdon
@@ -53,9 +51,10 @@ Describe "Join Worksheet part 1" {
$excel.Workbook.Worksheets["SummaryPivot"].Hidden | Should be 'Visible' $excel.Workbook.Worksheets["SummaryPivot"].Hidden | Should be 'Visible'
} }
it "Activated the correct worksheet " { it "Activated the correct worksheet " {
Set-ItResult -Pending -Because "Bug in EPPLus 4.5"
$excel.Workbook.worksheets["SummaryPivot"].View.TabSelected | Should be $true $excel.Workbook.worksheets["SummaryPivot"].View.TabSelected | Should be $true
$excel.Workbook.worksheets["Total"].View.TabSelected | Should be $false $excel.Workbook.worksheets["Total"].View.TabSelected | Should be $false
} -Skip # << Bug in EPPLus 4.5 }
} }
Context "Merging 3 blocks" { Context "Merging 3 blocks" {
@@ -92,11 +91,10 @@ Describe "Join Worksheet part 1" {
} }
} }
} }
$path = Join-Path $Env:TEMP "Test.xlsx" $path = "TestDrive:\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#switched to CIM objects so test runs on V6 #switched to CIM objects so test runs on V6
Describe "Join Worksheet part 2" { Describe "Join Worksheet part 2" {
if ($notWindows) {Write-warning -message "Test only runs on Windows" ; return}
Get-CimInstance -ClassName win32_logicaldisk | Get-CimInstance -ClassName win32_logicaldisk |
Select-Object -Property DeviceId,VolumeName, Size,Freespace | Select-Object -Property DeviceId,VolumeName, Size,Freespace |
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000" Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"

View File

@@ -2,13 +2,15 @@
Describe "Password Support" { Describe "Password Support" {
if ($PSVersionTable.PSVersion.Major -GT 5) { if ($PSVersionTable.PSVersion.Major -GT 5) {
Write-Warning "Can't test passwords on V6 and later" It "Password Supported" {
Set-ItResult -Pending -Because "Can't test passwords on V6 and later"
}
return return
} }
Context "Password protected sheet" { Context "Password protected sheet" {
BeforeAll { BeforeAll {
$password = "YouMustRememberThis" $password = "YouMustRememberThis"
$path = "$env:TEMP\Test.xlsx" $path = "TestDrive:\Test.xlsx"
Remove-Item $path -ErrorAction SilentlyContinue Remove-Item $path -ErrorAction SilentlyContinue
Get-Service | Select-Object -First 10 | Export-excel -password $password -Path $Path -DisplayPropertySet Get-Service | Select-Object -First 10 | Export-excel -password $password -Path $Path -DisplayPropertySet
} }

View File

@@ -1,8 +1,8 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } Describe "Setting worksheet protection " {
BeforeAll {
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
Remove-Item -path $path -ErrorAction SilentlyContinue Remove-Item -path $path -ErrorAction SilentlyContinue
$excel = ConvertFrom-Csv @" $excel = ConvertFrom-Csv @"
Product, City, Gross, Net Product, City, Gross, Net
Apple, London , 300, 250 Apple, London , 300, 250
Orange, London , 400, 350 Orange, London , 400, 350
@@ -13,14 +13,11 @@ Apple, New York, 1200,700
"@ | Export-Excel -Path $path -WorksheetName Sheet1 -PassThru "@ | Export-Excel -Path $path -WorksheetName Sheet1 -PassThru
$ws = $excel.sheet1 $ws = $excel.sheet1
Set-WorkSheetProtection -WorkSheet $ws -IsProtected -BlockEditObject -AllowFormatRows -UnLockAddress "1:1" Set-WorkSheetProtection -WorkSheet $ws -IsProtected -BlockEditObject -AllowFormatRows -UnLockAddress "1:1"
Close-ExcelPackage -ExcelPackage $excel Close-ExcelPackage -ExcelPackage $excel
Describe "Setting worksheet protection " {
BeforeAll {
$excel = Open-ExcelPackage -Path $path $excel = Open-ExcelPackage -Path $path
$ws = $ws = $excel.sheet1 $ws = $ws = $excel.sheet1
} }

105
__tests__/Publish.ps1 Normal file
View File

@@ -0,0 +1,105 @@
<#
.SYNOPSIS
Deploy module to PowerShellGallery.
#>
[CmdletBinding(DefaultParameterSetName = 'ModuleName')]
Param
(
# The name of the installed module to be deployed, if not provided the name of the .psm1 file in the parent folder is used.
[Parameter(ParameterSetName = 'ModuleName')]
[ValidateNotNullOrEmpty()]
[String]$ModuleName,
# Publish module from path (module folder), if not provided -ModuleName is used.
[Parameter(Mandatory, ParameterSetName = 'Path')]
[ValidateNotNullOrEmpty()]
[String]$Path,
# Key for PowerShellGallery deployment, if not provided $env:NugetApiKey is used.
[ValidateNotNullOrEmpty()]
[String]$NugetApiKey,
# Skip Version verification for PowerShellGallery deployment, can be used for first release.
[Switch]$Force
)
$ErrorActionPreference = 'Stop'
if ($Path) {
$Path = Resolve-Path -Path $Path
if ($Path.Count -ne 1) {
throw ('Invalid Path, $Path.Count: {0}.' -f $Path.Count)
}
$Psd1Path = (Get-ChildItem -File -Filter *.psd1 -Path $Path -Recurse)[0].FullName
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension($Psd1Path)
$VersionLocal = (. ([Scriptblock]::Create((Get-Content -Path $Psd1Path | Out-String)))).ModuleVersion
}
else {
# Get Script Root
if ($PSScriptRoot) {
$ScriptRoot = $PSScriptRoot
}
elseif ($psISE.CurrentFile.IsUntitled -eq $false) {
$ScriptRoot = Split-Path -Path $psISE.CurrentFile.FullPath
}
elseif ($null -ne $psEditor.GetEditorContext().CurrentFile.Path -and $psEditor.GetEditorContext().CurrentFile.Path -notlike 'untitled:*') {
$ScriptRoot = Split-Path -Path $psEditor.GetEditorContext().CurrentFile.Path
}
else {
$ScriptRoot = '.'
}
# Get Module Info
if (!$ModuleName) {
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $ScriptRoot)))
}
$VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum
}
"[Progress] Deploy Script Start for Module: $ModuleName, Version: $VersionLocal."
# Deploy to PowerShell Gallery if run locally OR from AppVeyor & GitHub master
if (!$env:APPVEYOR -or $env:APPVEYOR_REPO_BRANCH -eq 'master') {
if ($env:APPVEYOR) {
$Success = $true
$AppVeyorProject = Invoke-RestMethod -Uri "https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG"
$AppVeyorProject.build.jobs | ForEach-Object {
'[Info] AppVeyor job name: "{0}", Id: {1}, Status: {2}.' -f $_.name, $_.jobId, $_.status
if ($_.jobId -ne $env:APPVEYOR_JOB_ID -and $_.status -ne "success") {
$Success = $false
}
}
if (!$Success) {
'[Info] There are filed jobs skipping PowerShell Gallery deploy.'
break
}
}
try {
$VersionGallery = (Find-Module -Name $ModuleName -ErrorAction Stop).Version
}
catch {
if ($_.Exception.Message -notlike 'No match was found for the specified search criteria*' -or !$Force) {
throw $_
}
}
"[Info] PowerShellGallery. $ModuleName, VersionGallery: $VersionGallery, VersionLocal: $VersionLocal."
if ($VersionGallery -lt $VersionLocal -or $Force) {
if (!$NugetApiKey) {
$NugetApiKey = $env:NugetApiKey
}
"[Info] PowerShellGallery. Deploying $ModuleName version $VersionLocal."
if ($Path) {
Publish-Module -NuGetApiKey $NugetApiKey -Path $Path
}
else {
Publish-Module -NuGetApiKey $NugetApiKey -Name $ModuleName -RequiredVersion $VersionLocal
}
}
else {
'[Info] PowerShellGallery Deploy Skipped (Version Check).'
}
}
else {
'[Info] PowerShellGallery Deploy Skipped.'
}
'[Progress] Deploy Ended.'

View File

@@ -1,10 +1,5 @@
$path = "TestDrive:\test.xlsx"
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' )
$path = Join-Path $Env:TEMP "test.xlsx"
describe "Consistent passing of ranges." { describe "Consistent passing of ranges." {
if ($notWindows) {Write-warning -message "Test uses get-service so only works on Windows" ; return}
Context "Conditional Formatting" { Context "Conditional Formatting" {
Remove-Item -path $path -ErrorAction SilentlyContinue Remove-Item -path $path -ErrorAction SilentlyContinue
$excel = Get-Service | Export-Excel -Path $path -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -AutoNameRange -Title "Services on $Env:COMPUTERNAME" $excel = Get-Service | Export-Excel -Path $path -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -AutoNameRange -Title "Services on $Env:COMPUTERNAME"

View File

@@ -1,6 +1,5 @@
#Requires -Modules Pester #Requires -Modules Pester
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force #Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
Describe "Remove Worksheet" { Describe "Remove Worksheet" {
Context "Remove a worksheet output" { Context "Remove a worksheet output" {
@@ -11,7 +10,7 @@ Name,Age
Jane,10 Jane,10
John,20 John,20
"@ "@
$xlFile1 = Join-Path $Env:TEMP "removeWorsheet1.xlsx" $xlFile1 = "TestDrive:\RemoveWorsheet1.xlsx"
Remove-Item $xlFile1 -ErrorAction SilentlyContinue Remove-Item $xlFile1 -ErrorAction SilentlyContinue
$data | Export-Excel -Path $xlFile1 -WorksheetName Target1 $data | Export-Excel -Path $xlFile1 -WorksheetName Target1
@@ -19,7 +18,7 @@ John,20
$data | Export-Excel -Path $xlFile1 -WorksheetName Target3 $data | Export-Excel -Path $xlFile1 -WorksheetName Target3
$data | Export-Excel -Path $xlFile1 -WorksheetName Sheet1 $data | Export-Excel -Path $xlFile1 -WorksheetName Sheet1
$xlFile2 = Join-Path $Env:TEMP "removeWorsheet2.xlsx" $xlFile2 = "TestDrive:\RemoveWorsheet2.xlsx"
Remove-Item $xlFile2 -ErrorAction SilentlyContinue Remove-Item $xlFile2 -ErrorAction SilentlyContinue
$data | Export-Excel -Path $xlFile2 -WorksheetName Target1 $data | Export-Excel -Path $xlFile2 -WorksheetName Target1
@@ -66,7 +65,7 @@ John,20
it "Should delete sheet from multiple workbooks".PadRight(87) { it "Should delete sheet from multiple workbooks".PadRight(87) {
Get-ChildItem (Join-Path $Env:TEMP "removeWorsheet*.xlsx") | Remove-WorkSheet Get-ChildItem "TestDrive:\RemoveWorsheet*.xlsx" | Remove-WorkSheet
$actual = Get-ExcelSheetInfo -Path $xlFile1 $actual = Get-ExcelSheetInfo -Path $xlFile1

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,53 @@
if ($IsLinux -or $IsMacOS) {
if (-not (Get-Command 'Get-Service' -ErrorAction SilentlyContinue)) {
function Get-Service {
Import-Clixml -Path (Join-Path $PSScriptRoot Get-Service.xml)
}
}
if (-not (Get-Command 'Get-CimInstance' -ErrorAction SilentlyContinue)) {
function Get-CimInstance {
param (
$ClassName,
$Namespace,
$class
)
if ($ClassName -eq 'win32_logicaldisk') {
Import-Clixml -Path (Join-Path $PSScriptRoot Get-CimInstanceDisk.xml)
}
elseif ($class -eq 'MSFT_NetAdapter') {
Import-Clixml -Path (Join-Path $PSScriptRoot Get-CimInstanceNetAdapter.xml)
}
}
}
function Get-Process {
param (
$Name,
$Id
)
if (-not $Name) {
if ($Id) {
(Import-Clixml -Path (Join-Path $PSScriptRoot Get-Process.xml))[0]
}
else {
Import-Clixml -Path (Join-Path $PSScriptRoot Get-Process.xml)
}
}
}
}
<# Creating the samples
Get-Service | Select-Object -First 30 | Export-Clixml -Path Get-Service.xml
$Disk = Get-CimInstance -ClassName win32_logicaldisk | Select-Object -Property DeviceId,VolumeName, Size,Freespace
$Disk | Export-Clixml -Path Get-CimInstanceDisk.xml
$NetAdapter = Get-CimInstance -Namespace root/StandardCimv2 -class MSFT_NetAdapter | Select-Object -Property Name, InterfaceDescription, MacAddress, LinkSpeed
$NetAdapter | Export-Clixml -Path Get-CimInstanceNetAdapter.xml
$Process = Get-Process | Where-Object { $_.StartTime -and $_.StartInfo -and $_.Modules -and $_.Company -notlike '*Microsoft*' } | Select-Object -first 20
$Process | Export-Clixml -Path $Path
$Process = Import-Clixml -Path $Path
$Process | foreach {$_.Threads = 'System.Diagnostics.ProcessThreadCollection'}
$Process | foreach {$_.Modules = 'System.Diagnostics.ProcessThreadCollection'}
$Process | Export-Clixml -Path $Path
#>

View File

@@ -1,6 +1,4 @@
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force $path = "TestDrive:\test.xlsx"
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$path = Join-Path $Env:TEMP "test.xlsx"
$data = ConvertFrom-Csv -InputObject @" $data = ConvertFrom-Csv -InputObject @"
ID,Product,Quantity,Price ID,Product,Quantity,Price
@@ -284,7 +282,7 @@ Describe "Set-ExcelColumn, Set-ExcelRow and Set-ExcelRange" {
Describe "Conditional Formatting" { Describe "Conditional Formatting" {
BeforeAll { BeforeAll {
Remove-Item $path #Remove-Item $path
$data = Get-Process | Where-Object company | Select-Object company, name, pm, handles, *mem* $data = Get-Process | Where-Object company | Select-Object company, name, pm, handles, *mem*
$cfmt = New-ConditionalFormattingIconSet -Range "c:c" -ConditionalFormat ThreeIconSet -IconType Arrows $cfmt = New-ConditionalFormattingIconSet -Range "c:c" -ConditionalFormat ThreeIconSet -IconType Arrows
$data | Export-Excel -path $Path -AutoSize -ConditionalFormat $cfmt $data | Export-Excel -path $Path -AutoSize -ConditionalFormat $cfmt
@@ -300,7 +298,7 @@ Describe "Conditional Formatting" {
} }
} }
$path = Join-Path $Env:TEMP "test.xlsx" $path = "TestDrive:\test.xlsx"
$data2 = ConvertFrom-Csv -InputObject @" $data2 = ConvertFrom-Csv -InputObject @"
ID,Product,Quantity,Price,Total ID,Product,Quantity,Price,Total
12001,Nails,37,3.99,147.63 12001,Nails,37,3.99,147.63
@@ -321,7 +319,7 @@ ID,Product,Quantity,Price,Total
Describe "AutoNameRange data with a single property name" { Describe "AutoNameRange data with a single property name" {
BeforeEach { BeforeEach {
$xlfile = Join-Path $Env:TEMP "testNamedRange.xlsx" $xlfile = "TestDrive:\testNamedRange.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
} }
@@ -359,7 +357,7 @@ Sold,ID
Describe "Table Formatting" { Describe "Table Formatting" {
BeforeAll { BeforeAll {
Remove-Item $path #Remove-Item $path
$excel = $data2 | Export-excel -path $path -WorksheetName Hardware -AutoNameRange -AutoSize -BoldTopRow -FreezeTopRow -PassThru $excel = $data2 | Export-excel -path $path -WorksheetName Hardware -AutoNameRange -AutoSize -BoldTopRow -FreezeTopRow -PassThru
$ws = $excel.Workbook.Worksheets[1] $ws = $excel.Workbook.Worksheets[1]
#test showfilter & TotalSettings #test showfilter & TotalSettings

View File

@@ -1,7 +1,3 @@
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' )
$data = ConvertFrom-Csv -InputObject @" $data = ConvertFrom-Csv -InputObject @"
ID,Product,Quantity,Price ID,Product,Quantity,Price
12001,Nails,37,3.99 12001,Nails,37,3.99
@@ -11,7 +7,7 @@ ID,Product,Quantity,Price
12011,Crowbar,7,23.48 12011,Crowbar,7,23.48
"@ "@
$path = Join-Path $Env:TEMP "DataValidation.xlsx" $path = "TestDrive:\DataValidation.xlsx"
Describe "Data validation and protection" { Describe "Data validation and protection" {
Context "Data Validation rules" { Context "Data Validation rules" {

View File

@@ -1,17 +1,67 @@
image: # Version format
- Visual Studio 2015 version: '({build})'
# - Ubuntu
# Build worker image (VM templates)
image:
- Ubuntu1804
- 'Visual Studio 2019'
# Fix CRLF on Windows
init:
- cmd: 'git config --global --unset core.autocrlf'
# To disable automatic builds
build: off build: off
test_script: # Skipping commits with particular message or from specific user
- ps: .\DoTests.ps1
- pwsh: .\DoTests.ps1 -DontCreateZip
skip_commits: skip_commits:
message: '/\[skip av\]/'
files: files:
- README.md - '*.md'
artifacts: # Including commits with particular message or from specific user
- path: ImportExcel*.zip #only_commits:
name: ImportExcel # message: '/\[build\]/' # Start a new build if message contains 'build'
# Scripts that run after cloning repository
install:
- ps: 'Install-Module -Name Pester -Force -SkipPublisherCheck'
- ps: 'Install-Module -Name Assert -Force'
# PowerShell Core
- ps: '& .\__tests__\InstallPowerShell.ps1 -Version "7.0.0-preview.3"' # Install other PowerShell Core version (Optional)
- pwsh: 'Install-Module -Name Pester -Force'
- pwsh: 'Install-Module -Name Assert -Force'
# To run your custom scripts instead of automatic tests
test_script:
- ps: '& .\__tests__\CI.ps1 -Test'
- pwsh: '& .\__tests__\CI.ps1 -Test'
- ps: '& .\__tests__\CI.ps1 -Finalize' # Collect and upload results
# Deploy
deploy_script:
- ps: '& .\__tests__\CI.ps1 -Artifact'
#- ps: '$null = Install-PackageProvider -Name NuGet -Force ; & .\__tests__\Publish.ps1'
# Linux setup
for:
-
matrix:
only:
- image: Ubuntu1804
# Install other PowerShell Core version (Optional)
init:
- sh: 'sudo apt-get -qq update && sudo apt-get -qq install powershell-preview && sudo rm /usr/bin/pwsh && sudo ln -s /opt/microsoft/powershell/7-preview/pwsh /usr/bin/pwsh'
- sh: 'export LANG=en_US.UTF-8' # Fix for PowerShell 7.0.0-preview.2, Remove if using other version.
# Scripts that run after cloning repository
install:
- pwsh: '& .\__tests__\CI.ps1 -Initialize' # Set AppVeyor build version
- pwsh: 'Install-Module -Name Pester -Force'
- pwsh: 'Install-Module -Name Assert -Force'
# To run your custom scripts instead of automatic tests
test_script:
- pwsh: '& .\__tests__\CI.ps1 -Test'
- pwsh: '& .\__tests__\CI.ps1 -Finalize' # Collect and upload results
# Skip Deploy
deploy_script:
- pwsh: '"Deploy skiped on Linux."'

View File

@@ -1,44 +1,93 @@
jobs: # Starter pipeline
- job: Build_PS_Win2016 # Start with a minimal pipeline that you can customize to build and deploy your code.
pool: # Add steps that build, run tests, deploy, and more:
vmImage: vs2017-win2016 # https://aka.ms/yaml
steps:
- powershell: |
.\DoTests.ps1
displayName: 'Run Tests on Windows'
# - job: Build_PSCore_Ubuntu1604
# pool:
# vmImage: ubuntu-16.04
# steps:
# - script: |
# curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
# curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list
# sudo apt-get update
# sudo apt-get install -y powershell
# displayName: 'Install PowerShell Core'
# - script: |
# pwsh -c '.\DoTests.ps1'
# displayName: 'Run Tests on Linux'
# - job: Build_PSCore_MacOS1013
# pool:
# vmImage: xcode9-macos10.13
# steps:
# - script: |
# brew update
# brew tap caskroom/cask
# brew cask install powershell
# displayName: 'Install PowerShell Core'
# - script: |
# pwsh -c '.\DoTests.ps1'
# displayName: 'Run Tests on macOS'
trigger: trigger:
branches:
include:
- '*'
# - master
# - releases/*
paths: paths:
exclude: exclude:
- README.md - README.md
- CHANGELOG.md
jobs:
- job: Windows
pool:
vmImage: 'windows-latest'
steps:
- powershell: 'Install-Module -Name Pester -Force -SkipPublisherCheck'
displayName: 'Update Pester'
- powershell: './__tests__/CI.ps1 -Test'
displayName: 'Install and Test'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResults*.xml'
failTaskOnFailedTests: true
- powershell: './__tests__/CI.ps1 -Artifact'
displayName: 'Prepare Artifact'
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifact: 'Modules'
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.SourcesDirectory)'
artifact: 'Source'
- job: WindowsPSCore
pool:
vmImage: 'windows-latest'
steps:
- pwsh: 'Install-Module -Name Pester -Force'
displayName: 'Update Pester'
- pwsh: './__tests__/CI.ps1 -Test'
displayName: 'Install and Test'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResults*.xml'
failTaskOnFailedTests: true
- job: Ubuntu
pool:
vmImage: 'ubuntu-latest'
steps:
- powershell: 'Install-Module -Name Pester -Force'
displayName: 'Update Pester'
- powershell: './__tests__/CI.ps1 -Test'
displayName: 'Install and Test'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResults*.xml'
failTaskOnFailedTests: true
- job: macOS
pool:
vmImage: 'macOS-latest'
steps:
- script: brew install mono-libgdiplus
displayName: 'Install mono-libgdiplus'
- powershell: 'Install-Module -Name Pester -Force'
displayName: 'Update Pester'
- powershell: './__tests__/CI.ps1 -Test'
displayName: 'Install and Test'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResults*.xml'
failTaskOnFailedTests: true

View File

@@ -2,17 +2,18 @@
*.psd1 *.psd1
*.psm1 *.psm1
AddConditionalFormatting.ps1 AddConditionalFormatting.ps1
AddDataValidation.ps1
Charting.ps1 Charting.ps1
ColorCompletion.ps1 ColorCompletion.ps1
Compare-Worksheet.ps1 Compare-WorkSheet.ps1
ConvertExcelToImageFile.ps1 ConvertExcelToImageFile.ps1
ConvertFromExcelData.ps1 ConvertFromExcelData.ps1
ConvertFromExcelToSQLInsert.ps1 ConvertFromExcelToSQLInsert.ps1
ConvertToExcelXlsx.ps1 ConvertToExcelXlsx.ps1
Copy-ExcelWorkSheet.ps1 Copy-ExcelWorkSheet.ps1
Export-Charts.ps1
Export-Excel.ps1 Export-Excel.ps1
Export-ExcelSheet.ps1 Export-ExcelSheet.ps1
Export-StocksToExcel.ps1
Get-ExcelColumnName.ps1 Get-ExcelColumnName.ps1
Get-ExcelSheetInfo.ps1 Get-ExcelSheetInfo.ps1
Get-ExcelWorkbookInfo.ps1 Get-ExcelWorkbookInfo.ps1
@@ -32,10 +33,12 @@ Open-ExcelPackage.ps1
Pivot.ps1 Pivot.ps1
PivotTable.ps1 PivotTable.ps1
Plot.ps1 Plot.ps1
RemoveWorksheet.ps1
Send-SQLDataToExcel.ps1 Send-SQLDataToExcel.ps1
Set-CellStyle.ps1 Set-CellStyle.ps1
Set-Column.ps1 Set-Column.ps1
Set-Row.ps1 Set-Row.ps1
Set-WorkSheetProtection.ps1
SetFormat.ps1 SetFormat.ps1
TrackingUtils.ps1 TrackingUtils.ps1
Update-FirstObjectProperties.ps1 Update-FirstObjectProperties.ps1