Compare commits

..

14 Commits

Author SHA1 Message Date
dfinke
99f742fa8c Updated readme 2019-08-26 20:41:03 -04:00
dfinke
558070bb60 Bump version 2019-08-26 20:25:25 -04:00
Doug Finke
1e0dd763ca Merge pull request #666 from jhoneill/master
Cross platform test support
2019-08-26 19:58:06 -04:00
jhoneill
a783b9c8ca Fixes to tests to be run x-plaform 2019-08-27 00:31:30 +01:00
jhoneill
9abbe2983b Set-ExcelRange now handles autosize on non-windows 2019-08-27 00:30:56 +01:00
dfinke
0556e4947a Added examples to use Excel sparklines to show data trends 2019-08-26 18:38:30 -04:00
Doug Finke
859b1e5467 Merge pull request #664 from jhoneill/master
Fixes issues with newer EPPLus.
2019-08-26 18:29:08 -04:00
jhoneill
0f4e491076 Two lines went missing from a test. Put back. 2019-08-25 20:25:22 +01:00
jhoneill
b30a91d64f Merge remote-tracking branch 'upstream/master' 2019-08-25 18:39:53 +01:00
jhoneill
d1f794c933 Fixes around EPPlus update 2019-08-25 18:35:46 +01:00
dfinke
a016f069a5 Added Azure DevOps pipeline for three OSes 2019-08-25 12:04:14 -04:00
dfinke
fb16ec4677 Updated az yml to test on Linux and Mac 2019-08-25 08:55:43 -04:00
jhoneill
c1a26f4f4b Added Protect-Worksheet Tests 2019-08-16 14:14:31 +01:00
jhoneill
63f41ceaec WS protection & better control of export -now 2019-08-15 16:03:42 +01:00
30 changed files with 450 additions and 172 deletions

Binary file not shown.

View File

@@ -0,0 +1,25 @@
try { . $PSScriptRoot\..\..\LoadPSD1.ps1 } catch { }
$xlfile = "$env:TEMP\SalesByQuarter.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue
$data = ConvertFrom-Csv @"
Region,Q1,Q2,Q3,Q4,YTDPerformance
Asia,1400,7200,5700,6900
Europe,3400,2300,9400,7300
Midwest,4700,9300,3700,8600
Northeast,2300,4300,4600,5600
"@
$excel = $data | Export-Excel $xlfile -Passthru -AutoSize -TableName SalesByQuarter
$ws = $excel.Sheet1
Set-Format -WorkSheet $ws -Range "B2:E5" -NumberFormat "$#,##0" -AutoSize
$sparkLineType = "line"
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F2"], $ws.Cells["B2:E2"] )
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F3"], $ws.Cells["B3:E3"] )
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F4"], $ws.Cells["B4:E4"] )
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F5"], $ws.Cells["B5:E5"] )
Close-ExcelPackage $excel -Show

View File

@@ -0,0 +1,99 @@
try { . $PSScriptRoot\..\..\LoadPSD1.ps1 } catch { }
class data {
[datetime]$Date
[Double]$AUD
[Double]$CAD
[Double]$CHF
[Double]$DKK
[Double]$EUR
[Double]$GBP
[Double]$HKD
[Double]$JPY
[Double]$MYR
[Double]$NOK
[Double]$NZD
[Double]$RUB
[Double]$SEK
[Double]$THB
[Double]$TRY
[Double]$USD
}
[data[]]$data = ConvertFrom-Csv @"
Date,AUD,CAD,CHF,DKK,EUR,GBP,HKD,JPY,MYR,NOK,NZD,RUB,SEK,THB,TRY,USD
2016-03-01,6.17350,6.42084,8.64785,1.25668,9.37376,12.01683,1.11067,0.07599,2.06900,0.99522,5.69227,0.11665,1.00000,0.24233,2.93017,8.63185
2016-03-02,6.27223,6.42345,8.63480,1.25404,9.35350,12.14970,1.11099,0.07582,2.07401,0.99311,5.73277,0.11757,1.00000,0.24306,2.94083,8.63825
2016-03-07,6.33778,6.38403,8.50245,1.24980,9.32373,12.05756,1.09314,0.07478,2.07171,0.99751,5.77539,0.11842,1.00000,0.23973,2.91088,8.48885
2016-03-08,6.30268,6.31774,8.54066,1.25471,9.36254,12.03361,1.09046,0.07531,2.05625,0.99225,5.72501,0.11619,1.00000,0.23948,2.91067,8.47020
2016-03-09,6.32630,6.33698,8.46118,1.24399,9.28125,11.98879,1.08544,0.07467,2.04128,0.98960,5.71601,0.11863,1.00000,0.23893,2.91349,8.42945
2016-03-10,6.24241,6.28817,8.48684,1.25260,9.34350,11.99193,1.07956,0.07392,2.04500,0.98267,5.58145,0.11769,1.00000,0.23780,2.89150,8.38245
2016-03-11,6.30180,6.30152,8.48295,1.24848,9.31230,12.01194,1.07545,0.07352,2.04112,0.98934,5.62335,0.11914,1.00000,0.23809,2.90310,8.34510
2016-03-15,6.19790,6.21615,8.42931,1.23754,9.22896,11.76418,1.07026,0.07359,2.00929,0.97129,5.49278,0.11694,1.00000,0.23642,2.86487,8.30540
2016-03-16,6.18508,6.22493,8.41792,1.23543,9.21149,11.72470,1.07152,0.07318,2.01179,0.96907,5.49138,0.11836,1.00000,0.23724,2.84767,8.31775
2016-03-17,6.25214,6.30642,8.45981,1.24327,9.26623,11.86396,1.05571,0.07356,2.01706,0.98159,5.59544,0.12024,1.00000,0.23543,2.87595,8.18825
2016-03-18,6.25359,6.32400,8.47826,1.24381,9.26976,11.91322,1.05881,0.07370,2.02554,0.98439,5.59067,0.12063,1.00000,0.23538,2.86880,8.20950
"@
$xlfile = "$env:TEMP\sparklines.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue
$excel = $data | Export-Excel $xlfile -WorksheetName SEKRates -AutoSize -PassThru
# Add a column sparkline for all currencies
Set-Format -WorkSheet $excel.SEKRates -Range "A2:A12" -NumberFormat "yyyy-mm-dd" -AutoSize
Set-Format -WorkSheet $excel.SEKRates -Range A15 -Value Column -AutoSize
$sparklineCol = $excel.SEKRates.SparklineGroups.Add(
"Column",
$excel.SEKRates.Cells["B15:Q15"],
$excel.SEKRates.Cells["B2:Q12"]
)
$sparklineCol.High = $true
$sparklineCol.ColorHigh.SetColor("Red")
# Add a line sparkline for all currencies
Set-Format -WorkSheet $excel.SEKRates -Range A16 -Value Line -AutoSize
$sparklineLine = $excel.SEKRates.SparklineGroups.Add(
"Line",
$excel.SEKRates.Cells["B16:Q16"],
$excel.SEKRates.Cells["B2:Q12"]
)
$sparklineLine.DateAxisRange = $excel.SEKRates.Cells["A2:A12"]
# Add some more random values and add a stacked sparkline.
Set-Format -WorkSheet $excel.SEKRates -Range A17 -Value Stacked -AutoSize
$numbers = 2, -1, 3, -4, 8, 5, -12, 18, 99, 1, -4, 12, -8, 9, 0, -8
$col = 2 # Column B
foreach ($n in $numbers) {
$excel.SEKRates.Cells[17, $col++].Value = $n
}
$sparklineStacked = $excel.SEKRates.SparklineGroups.Add(
"Stacked",
$excel.SEKRates.Cells["R17"],
$excel.SEKRates.Cells["B17:Q17"]
)
$sparklineStacked.High = $true
$sparklineStacked.ColorHigh.SetColor("Red")
$sparklineStacked.Low = $true
$sparklineStacked.ColorLow.SetColor("Green")
$sparklineStacked.Negative = $true
$sparklineStacked.ColorNegative.SetColor("Blue")
Set-Format -WorkSheet $excel.SEKRates -Range "A15:A17" -Bold -Height 50 -AutoSize
$v = @"
High - Red
Low - Green
Negative - Blue
"@
Set-Format -WorkSheet $excel.SEKRates -Range S17 -Value $v -WrapText -Width 20 -HorizontalAlignment Center -VerticalAlignment Center
Close-ExcelPackage $excel -Show

View File

@@ -4,7 +4,7 @@
RootModule = 'ImportExcel.psm1' RootModule = 'ImportExcel.psm1'
# Version number of this module. # Version number of this module.
ModuleVersion = '6.2.4' ModuleVersion = '6.5.0'
# ID used to uniquely identify this module # ID used to uniquely identify this module
GUID = '60dd4136-feff-401a-ba27-a84458c57ede' GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
@@ -118,6 +118,7 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'Set-ExcelColumn', 'Set-ExcelColumn',
'Set-ExcelRange', 'Set-ExcelRange',
'Set-ExcelRow', 'Set-ExcelRow',
'Set-WorkSheetProtection',
'Test-Boolean', 'Test-Boolean',
'Test-Date', 'Test-Date',
'Test-Integer', 'Test-Integer',

View File

@@ -272,7 +272,10 @@
Write-Warning -Message "PivotTable defined in $($pivotTableName) already exists, only the data range will be changed." Write-Warning -Message "PivotTable defined in $($pivotTableName) already exists, only the data range will be changed."
$pivotTable = $wsPivot.PivotTables[$pivotTableName] $pivotTable = $wsPivot.PivotTables[$pivotTableName]
if (-not $SourceRange) { $SourceRange = $SourceWorkSheet.Dimension.Address} if (-not $SourceRange) { $SourceRange = $SourceWorkSheet.Dimension.Address}
$pivotTable.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref = $SourceRange $pivotTable.CacheDefinition.SourceRange = $SourceWorkSheet.cells[$SourceRange]
#change for epPlus 4.5 - Previously needed to hack the xml
# $pivotTable.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref = $SourceRange
} }
#Create the chart if it doesn't exist, leave alone if it does. #Create the chart if it doesn't exist, leave alone if it does.

View File

@@ -7,23 +7,19 @@ If this project helped you reduce the time to get your job done, let me know.
![](https://media.giphy.com/media/hpXxJ78YtpT0s/giphy.gif) ![](https://media.giphy.com/media/hpXxJ78YtpT0s/giphy.gif)
<br/>
<br/> <p>
<br/> <a href="https://www.powershellgallery.com/packages/ImportExcel"><img src="https://img.shields.io/powershellgallery/v/ImportExcel.svg"></a>
<br/> <a href="https://www.powershellgallery.com/packages/ImportExcel"><img src="https://img.shields.io/powershellgallery/dt/ImportExcel.svg"></a>
<p align="center"> <a href="./LICENSE.txt"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a>
<a href="https://ci.appveyor.com/project/dfinke/importexcel/branch/master"><img src="https://ci.appveyor.com/api/projects/status/21hko6eqtpccrkba/branch/master?svg=true"></a>
<a href="https://dougfinke.visualstudio.com/ImportExcel/_build?definitionId=10"><img src="https://dougfinke.visualstudio.com/ImportExcel/_apis/build/status/ImportExcel-CI?branchName=master"></a>
</p> </p>
<p align="center"> |CI System |OS|Status|
<a href="./LICENSE.txt"><img |---|---|---|
src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a> |Azure DevOps|Windows|[![Build status](https://dougfinke.visualstudio.com/ImportExcel/_apis/build/status/ImportExcel-CI)](https://dougfinke.visualstudio.com/ImportExcel/_build/latest?definitionId=10)|
<a href="https://www.powershellgallery.com/packages/ImportExcel"><img |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)|
src="https://img.shields.io/powershellgallery/dt/ImportExcel.svg"></a> |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)|
<a href="https://www.powershellgallery.com/packages/ImportExcel"><img
src="https://img.shields.io/powershellgallery/v/ImportExcel.svg"></a>
</p>
<!-- /BADGES --> <!-- /BADGES -->
@@ -37,7 +33,8 @@ This PowerShell Module allows you to read and write Excel files without installi
![](https://raw.githubusercontent.com/dfinke/ImportExcel/master/images/testimonial.png) ![](https://raw.githubusercontent.com/dfinke/ImportExcel/master/images/testimonial.png)
# How to Videos # How to Videos
* [PowerShell Excel Module - ImportExcel](https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5uoqS92stXioZw-u-ze_NtvSo0k0K0kq)
* [PowerShell Excel Module - ImportExcel](https://www.youtube.com/watch?v=fvKKdIzJCws&list=PL5uoqS92stXioZw-u-ze_NtvSo0k0K0kq)
Installation Installation
- -
@@ -53,6 +50,23 @@ Install-Module ImportExcel -scope CurrentUser
Install-Module ImportExcel Install-Module ImportExcel
``` ```
# What's new 6.5.0
This is now using the latest version of EPPlus. Unit tests are updated and passing, if you hit problems, please open an issue.
You can rollback to an older version from the PowerShell Gallery if you are blocked.
- Unit tests were updated and fixed
- "Set-WorksheetProtection" is now switched on
- Made a change to make Set-Excel range more friendly when Auto Sizing on non-windows platforms
- Fixed - Windows only tests don't attempt to run on non-windows systems
- Tests based on Get-Process don't attempt to run if <20 processes are returned
- If $env:TEMP is not set (as will be the case on Linux)
- Join-Path if used so paths are built with / or with \ as suits the OS where the test is running.
- Excel Sparklines now supported, check out the examples [SalesByQuarter](https://github.com/dfinke/ImportExcel/blob/master/Examples/Sparklines/SalesByQuarter.ps1) and [Sparklines](https://github.com/dfinke/ImportExcel/blob/master/Examples/Sparklines/Sparklines.ps1).
![](./images/Sparklines.png)
# What's new 6.2.4 # What's new 6.2.4
Sensible parameter defaults, make your life easier and gets things done faster. Sensible parameter defaults, make your life easier and gets things done faster.

View File

@@ -25,6 +25,14 @@
"WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 etc "WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 etc
the new data cells should become a named range, which will also be the new data cells should become a named range, which will also be
named "WinsToFastLaps" and the column width will be set automatically. named "WinsToFastLaps" and the column width will be set automatically.
When a value begins with "=", it is treated as a formula.
If value is a script block it will be evaluated, so here the string "=E$row/C$Row"
will have the number of the current row inserted. See the value parameter for a list of
variables which can be used. Note than when evaluating an expression in a string,
it is necessary to wrap it in $() so $row is valid but $($row+1) is needed. To prevent
Variables merging into other parts of the string, use the back tick "$columnName`4" will
be "G4" - withouth the backtick the string will look for a variable named "columnName4"
.EXAMPLE .EXAMPLE
Set-ExcelColumn -Worksheet $ws -Heading "Link" -Value {"https://en.wikipedia.org" + $worksheet.cells["B$Row"].value } -AutoSize Set-ExcelColumn -Worksheet $ws -Heading "Link" -Value {"https://en.wikipedia.org" + $worksheet.cells["B$Row"].value } -AutoSize

View File

@@ -7,7 +7,7 @@
.Example .Example
Set-WorkSheetProtection -WorkSheet $planSheet -IsProtected -AllowAll -AllowInsertColumns:$false -AllowDeleteColumns:$false -UnLockAddress "A:N" Set-WorkSheetProtection -WorkSheet $planSheet -IsProtected -AllowAll -AllowInsertColumns:$false -AllowDeleteColumns:$false -UnLockAddress "A:N"
Turns on protection for the worksheet in $planSheet, checks all the allow boxes excel Insert and Delete columns and unlocks columns A-N Turns on protection for the worksheet in $planSheet, checks all the allow boxes except Insert and Delete columns and unlocks columns A-N
#> #>
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')]
param ( param (
@@ -48,7 +48,7 @@
[switch]$BlockEditObject, [switch]$BlockEditObject,
##Opposite of the value in the 'Edit Scenarios' check box. Set to allow when Protect is first enabled ##Opposite of the value in the 'Edit Scenarios' check box. Set to allow when Protect is first enabled
[switch]$BlockEditScenarios, [switch]$BlockEditScenarios,
#Address range for cells to lock in the form "A:Z" or "1:10" or "A1:Z10" #Address range for cells to lock in the form "A:Z" or "1:10" or "A1:Z10". If No range is specified, the whole sheet is locked by default.
[string]$LockAddress, [string]$LockAddress,
#Address range for cells to Unlock in the form "A:Z" or "1:10" or "A1:Z10" #Address range for cells to Unlock in the form "A:Z" or "1:10" or "A1:Z10"
[string]$UnLockAddress [string]$UnLockAddress
@@ -72,10 +72,13 @@
} }
Else {Write-Warning -Message "You haven't said if you want to turn protection off, or on." } Else {Write-Warning -Message "You haven't said if you want to turn protection off, or on." }
if ($LockAddress) {
Set-ExcelRange -Range $WorkSheet.cells[$LockAddress] -Locked
}
elseif ($IsProtected) {
Set-ExcelRange -Range $WorkSheet.Cells -Locked
}
if ($UnlockAddress) { if ($UnlockAddress) {
Set-ExcelRange -Range $WorkSheet.cells[$UnlockAddress] -Locked:$false Set-ExcelRange -Range $WorkSheet.cells[$UnlockAddress] -Locked:$false
} }
if ($lockAddress) {
Set-ExcelRange -Range $WorkSheet.cells[$UnlockAddress] -Locked
}
} }

View File

@@ -230,12 +230,15 @@
else {Write-Warning -Message ("Can set the height of a row or a range but not a {0} object" -f ($Range.GetType().name)) } else {Write-Warning -Message ("Can set the height of a row or a range but not a {0} object" -f ($Range.GetType().name)) }
} }
if ($Autosize) { if ($Autosize) {
try {
if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.AutoFit() } if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.AutoFit() }
elseif ($Range -is [OfficeOpenXml.ExcelRange] ) { elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {
$Range.AutoFitColumns() $Range.AutoFitColumns()
} }
else {Write-Warning -Message ("Can autofit a column or a range but not a {0} object" -f ($Range.GetType().name)) } else {Write-Warning -Message ("Can autofit a column or a range but not a {0} object" -f ($Range.GetType().name)) }
}
catch {Write-Warning -Message "Failed autosizing columns of worksheet '$WorksheetName': $_"}
} }
elseif ($PSBoundParameters.ContainsKey('Width')) { elseif ($PSBoundParameters.ContainsKey('Width')) {
if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.Width = $Width} if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.Width = $Width}

View File

@@ -1,4 +1,7 @@
Describe "Test adding trendlines to charts" { Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
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
@@ -21,7 +24,7 @@ South,avocado,73
Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
} }
It "Should add a linear trendline" { It "Should add a linear trendline".PadRight(90) {
$cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine Linear $cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine Linear
$data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange $data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange
@@ -34,7 +37,7 @@ South,avocado,73
Close-ExcelPackage $excel Close-ExcelPackage $excel
} }
It "Should add a MovingAvgerage trendline" { It "Should add a MovingAvgerage trendline".PadRight(90) {
$cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine MovingAvgerage $cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine MovingAvgerage
$data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange $data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange

View File

@@ -1,4 +1,6 @@
#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.
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() }
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if ($PSVersionTable.PSVersion.Major -gt 5) { Write-Warning "Can't test grid view on V6 and later" } if ($PSVersionTable.PSVersion.Major -gt 5) { Write-Warning "Can't test grid view on V6 and later" }
else {Add-Type -AssemblyName System.Windows.Forms } else {Add-Type -AssemblyName System.Windows.Forms }
@@ -19,7 +21,7 @@ Describe "Compare Worksheet" {
$s.RemoveAt(5) $s.RemoveAt(5)
$s | Export-Excel -Path $env:temp\server2.xlsx $s | Export-Excel -Path $env:temp\server2.xlsx
#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" | Sort-Object -Property _row, _file $comp = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" | Sort-Object -Property _row, _file
} }
it "Found the right number of differences " { it "Found the right number of differences " {
$comp | should not beNullOrEmpty $comp | should not beNullOrEmpty
@@ -55,13 +57,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 $ModulePath; " + '$null = Compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView; Start-Sleep -sec 5')
} }
else { else {
$null = Compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView:$useGrid $null = Compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView:$useGrid
} }
$xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx" $xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx" $xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets[1] $s1Sheet = $xl1.Workbook.Worksheets[1]
$s2Sheet = $xl2.Workbook.Worksheets[1] $s2Sheet = $xl2.Workbook.Worksheets[1]
} }
@@ -85,9 +87,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 "$env:temp\server1.xlsx" "$env:temp\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 "$env:temp\server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx" $xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets[1] $s1Sheet = $xl1.Workbook.Worksheets[1]
$s2Sheet = $xl2.Workbook.Worksheets[1] $s2Sheet = $xl2.Workbook.Worksheets[1]
} }
@@ -130,9 +132,9 @@ Describe "Compare Worksheet" {
$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 $env:temp\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 "$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
$xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx" $xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx" $xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets["server1"] $s1Sheet = $xl1.Workbook.Worksheets["server1"]
$s2Sheet = $xl2.Workbook.Worksheets["server2"] $s2Sheet = $xl2.Workbook.Worksheets["server2"]
} }
@@ -188,7 +190,7 @@ Describe "Compare Worksheet" {
Describe "Merge Worksheet" { Describe "Merge Worksheet" {
Context "Merge with 3 properties" { Context "Merge with 3 properties" {
BeforeAll { BeforeAll {
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\combined*.xlsx" -ErrorAction SilentlyContinue
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property * [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property *
$s | Export-Excel -Path $env:temp\server1.xlsx $s | Export-Excel -Path $env:temp\server1.xlsx
@@ -205,7 +207,7 @@ Describe "Merge Worksheet" {
$s | Export-Excel -Path $env:temp\server2.xlsx $s | Export-Excel -Path $env:temp\server2.xlsx
#Assume default worksheet name, (sheet1) and column header for key ("name") #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 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" $excel = Open-ExcelPackage -Path "$env:temp\combined1.xlsx"
$ws = $excel.Workbook.Worksheets["sheet1"] $ws = $excel.Workbook.Worksheets["sheet1"]
} }
@@ -247,14 +249,14 @@ 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 "$env:temp\server1.xlsx" -Differencefile "$env:temp\server2.xlsx" -OutputFile "$env:temp\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 "$env:temp\server*.xlsx" , "$env:temp\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 $env:temp\server1.xlsx
@@ -281,7 +283,7 @@ Describe "Merge Multiple sheets" {
$s | Export-Excel -Path $env:temp\server3.xlsx $s | Export-Excel -Path $env:temp\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 "$env:temp\server1.xlsx", "$env:temp\server2.xlsx","$env:temp\server3.xlsx" -OutputFile "$env:temp\combined3.xlsx" -Property name,displayname,startType -Key name
$excel = Open-ExcelPackage -Path "$env:temp\combined3.xlsx" $excel = Open-ExcelPackage -Path "$env:temp\combined3.xlsx"
$ws = $excel.Workbook.Worksheets["sheet1"] $ws = $excel.Workbook.Worksheets["sheet1"]
@@ -295,10 +297,10 @@ Describe "Merge Multiple sheets" {
$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
$ws.Cells[ 1,12].Value | Should be "Server3 Row" $ws.Cells[ 1,12].Value | Should be "server3 Row"
} }
it "Joined the three sheets correctly " { it "Joined the three sheets correctly " {
$ws.Cells[ 2,3 ].Value | Should be $ws.Cells[ 2,5 ].Value $ws.Cells[ 2,3 ].Value | Should be $ws.Cells[ 2,5 ].Value

View File

@@ -1,5 +1,5 @@
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 = "$env:TEMP\testSQL.xlsx"
Describe "ConvertFrom-ExcelToSQLInsert" { Describe "ConvertFrom-ExcelToSQLInsert" {
@@ -16,7 +16,7 @@ Describe "ConvertFrom-ExcelToSQLInsert" {
Remove-Item $xlFile -Recurse -Force -ErrorAction Ignore Remove-Item $xlFile -Recurse -Force -ErrorAction Ignore
} }
It "Should be empty double single quotes" { It "Should be empty double single quotes".PadRight(90) {
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', '');" $expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', '');"
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 $actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1
@@ -24,7 +24,7 @@ Describe "ConvertFrom-ExcelToSQLInsert" {
$actual | should be $expected $actual | should be $expected
} }
It "Should have NULL" { It "Should have NULL".PadRight(90) {
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);" $expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);"
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 -ConvertEmptyStringsToNull $actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 -ConvertEmptyStringsToNull

View File

@@ -1,3 +1,6 @@
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" $path1 = "$env:TEMP\Test1.xlsx"
$path2 = "$env:TEMP\Test2.xlsx" $path2 = "$env:TEMP\Test2.xlsx"
Remove-item -Path $path1, $path2 -ErrorAction SilentlyContinue Remove-item -Path $path1, $path2 -ErrorAction SilentlyContinue
@@ -91,8 +94,8 @@ Describe "Copy-Worksheet" {
$xlfile = "$env:TEMP\reports.xlsx" $xlfile = "$env:TEMP\reports.xlsx"
$xlfileArchive = "$env:TEMP\reportsArchive.xlsx" $xlfileArchive = "$env:TEMP\reportsArchive.xlsx"
rm $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
rm $xlfileArchive -ErrorAction SilentlyContinue Remove-Item $xlfileArchive -ErrorAction SilentlyContinue
$sheets = echo 1.1.2019 1.2.2019 1.3.2019 1.4.2019 1.5.2019 $sheets = echo 1.1.2019 1.2.2019 1.3.2019 1.4.2019 1.5.2019
@@ -119,8 +122,8 @@ Describe "Copy-Worksheet" {
$xlfile = "$env:TEMP\reports.xlsx" $xlfile = "$env:TEMP\reports.xlsx"
$xlfileArchive = "$env:TEMP\reportsArchive.xlsx" $xlfileArchive = "$env:TEMP\reportsArchive.xlsx"
rm $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
rm $xlfileArchive -ErrorAction SilentlyContinue Remove-Item $xlfileArchive -ErrorAction SilentlyContinue
$sheets = echo 1.1.2019 1.2.2019 1.3.2019 1.4.2019 1.5.2019 $sheets = echo 1.1.2019 1.2.2019 1.3.2019 1.4.2019 1.5.2019

View File

@@ -1,12 +1,14 @@
#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} 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 {
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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -68,7 +70,7 @@ Describe ExportExcel {
} }
Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" { Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" {
$path = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -117,7 +119,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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -156,7 +158,7 @@ Describe ExportExcel {
Context " # Number format parameter" { Context " # Number format parameter" {
BeforeAll { BeforeAll {
$path = "$env:temp\test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -179,7 +181,7 @@ Describe ExportExcel {
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"} if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"}
else {$OtherCurrencySymbol = "£"} else {$OtherCurrencySymbol = "£"}
$path = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -296,7 +298,7 @@ Describe ExportExcel {
Context "# # Setting cells for different data types with -noHeader" { Context "# # Setting cells for different data types with -noHeader" {
$path = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Test -NoHeader & -NoNumberConversion #Test -NoHeader & -NoNumberConversion
[PSCustOmobject][Ordered]@{ [PSCustOmobject][Ordered]@{
@@ -357,7 +359,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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -385,8 +387,9 @@ Describe ExportExcel {
} }
Context "#Example 6 # Adding multiple conditional formats using short form syntax. " { Context "#Example 6 # Adding multiple conditional formats using short form syntax. " {
if ($notwindows) {Write-warning "Test only runs on Windows" ; return}
#Test adding mutliple conditional blocks and using the minimal syntax for new-ConditionalText #Test adding mutliple conditional blocks and using the minimal syntax for new-ConditionalText
$path = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Testing -Passthrough #Testing -Passthrough
@@ -448,9 +451,11 @@ 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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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.
$Excel = Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company | Export-Excel $path -WorkSheetname Processes -PassThru $Script:Procs= Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company
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
@@ -461,11 +466,13 @@ Describe ExportExcel {
$excel.ProcessesPivotTable | Should not beNullOrEmpty $excel.ProcessesPivotTable | Should not beNullOrEmpty
$PTws | Should not beNullOrEmpty $PTws | Should not beNullOrEmpty
$PTws.PivotTables.Count | Should be 1 $PTws.PivotTables.Count | Should be 1
$PTws.View.TabSelected | Should be $true
$Excel.Workbook.Worksheets["Processes"] | Should not beNullOrEmpty $Excel.Workbook.Worksheets["Processes"] | Should not beNullOrEmpty
$Excel.Workbook.Worksheets.Count | Should beGreaterThan 2 $Excel.Workbook.Worksheets.Count | Should beGreaterThan 2
$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 " {
$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
@@ -505,7 +512,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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -527,7 +534,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"]
@@ -540,13 +547,15 @@ 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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
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 $Script:Procs= Get-Process
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 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 -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]
@@ -590,11 +599,14 @@ 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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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;
Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -TableName ProcTab -AutoNameRange -WorkSheetname NoOffset -ClearSheet $Script:Procs= Get-process
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
Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -AutoNameRange -WorkSheetname NoOffset -Append -Numberformat 'Number' $Script:Procs| 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"]
@@ -623,7 +635,8 @@ 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" {
$path = "$env:TEMP\Test.xlsx" if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return}
$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
@@ -678,10 +691,10 @@ Describe ExportExcel {
$PC1 = $ptsheet1.Drawings[0] $PC1 = $ptsheet1.Drawings[0]
$PC2 = $ptsheet2.Drawings[0] $PC2 = $ptsheet2.Drawings[0]
it "Created the pivot tables linked to the right data. " { it "Created the pivot tables linked to the right data. " {
$PT1.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref | $PT1.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.name|
Should be ("A1:" + $ws1.Dimension.End.Address) Should be "All_services"
$PT2.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref | $PT2.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.name |
Should be ("A2:" + $ws2.Dimension.End.Address) #Title in row 1 Should be "Processes"
} }
it "Set the other pivot tables and chart options from the definitions. " { it "Set the other pivot tables and chart options from the definitions. " {
$pt1.PageFields[0].Name | Should be 'StartType' $pt1.PageFields[0].Name | Should be 'StartType'
@@ -705,8 +718,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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "test.xlsx"
Remove-Item $path Remove-Item $path -ErrorAction SilentlyContinue
#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"]
@@ -734,8 +747,6 @@ 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
@@ -758,6 +769,10 @@ 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
@@ -785,7 +800,7 @@ Describe ExportExcel {
} }
Context " # Chart from MultiSeries.ps1 in the Examples\charts Directory" { Context " # Chart from MultiSeries.ps1 in the Examples\charts Directory" {
$path = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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.
@@ -808,7 +823,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 " {
@@ -843,7 +858,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 = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -883,8 +898,9 @@ Describe ExportExcel {
} }
Close-ExcelPackage -ExcelPackage $excel -nosave Close-ExcelPackage -ExcelPackage $excel -nosave
} }
Context " # Quick line chart" { Context " # Quick line chart" {
$path = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -901,11 +917,11 @@ Describe ExportExcel {
} }
Context " # Quick Pie chart and three icon conditional formating" { Context " # Quick Pie chart and three icon conditional formating" {
$path = "$Env:TEMP\Pie.xlsx" $path = Join-Path $Env:TEMP "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
@@ -941,7 +957,8 @@ Describe ExportExcel {
} }
Context " # Awkward multiple tables" { Context " # Awkward multiple tables" {
$path = "$Env:TEMP\test.xlsx" if ($notWindows) {Write-warning "Test only runs on Windows" ; return}
$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 $r = Get-ChildItem -path C:\WINDOWS\system32 -File
@@ -976,7 +993,7 @@ Describe ExportExcel {
} }
Context " # Parameters and ParameterSets" { Context " # Parameters and ParameterSets" {
$Path = "$Env:TEMP\test.xlsx" $Path = join-path $env:TEMP "temp.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
@@ -1011,24 +1028,26 @@ 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 and AutoSize".PadRight(87) { it "Now will use temp Path, set TableName with generated name".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru $ExcelPackage = $Processes | Export-Excel -Now -PassThru
$Worksheet = $ExcelPackage.Workbook.Worksheets[1] $Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should BeLike ([IO.Path]::GetTempPath() + '*') $ExcelPackage.File | Should BeLike ([IO.Path]::GetTempPath() + '*')
$Worksheet.Tables[0].Name | Should Be 'Table1' $Script:Worksheet.Tables[0].Name | Should Be 'Table1'
$Worksheet.AutoFilterAddress | Should BeNullOrEmpty $Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty}
$Worksheet.Column(5).Width | Should BeGreaterThan 9.5 it "Applies AutoSize with these".PadRight(87) {
} $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
$Worksheet = $ExcelPackage.Workbook.Worksheets[1] $Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should Be $Path $ExcelPackage.File | Should Be $Path
$Worksheet.Tables | Should BeNullOrEmpty $Script:Worksheet.Tables | Should BeNullOrEmpty
$Worksheet.AutoFilterAddress | Should BeNullOrEmpty $Script: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) {
@@ -1050,11 +1069,14 @@ 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'
$Worksheet = $ExcelPackage.Workbook.Worksheets[1] $Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$Script:Worksheet.Tables[0].Name | Should Be 'Data'
$Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty
}
it "Allows to set TableName with AutoSize".PadRight(87) {
$Script:Worksheet.Column(5).Width | Should BeGreaterThan 9.5
} -skip:$notwindows
$Worksheet.Tables[0].Name | Should Be 'Data'
$Worksheet.AutoFilterAddress | Should BeNullOrEmpty
$Worksheet.Column(5).Width | Should BeGreaterThan 9.5
}
} }
} }

View File

@@ -1,6 +1,7 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$path = "$Env:TEMP\test.xlsx" $path = Join-Path $Env:TEMP "test.xlsx"
remove-item -path $path -ErrorAction SilentlyContinue remove-item -path $path -ErrorAction SilentlyContinue
ConvertFrom-Csv @" ConvertFrom-Csv @"
Product, City, Gross, Net Product, City, Gross, Net
@@ -40,7 +41,7 @@ Describe "Creating workbook with a single line" {
} }
} }
Context "PivotTable" { Context "PivotTable" {
it "Created the PivotTable on a new page and made it active " { it "Created the PivotTable on a new page " {
$ws2 | Should not beNullOrEmpty $ws2 | Should not beNullOrEmpty
$ws2.PivotTables[0] | Should not beNullOrEmpty $ws2.PivotTables[0] | Should not beNullOrEmpty
$ws2.PivotTables[0].Fields.Count | Should be 4 $ws2.PivotTables[0].Fields.Count | Should be 4
@@ -49,8 +50,10 @@ Describe "Creating workbook with a single line" {
$ws2.PivotTables[0].ColumnFields[0].Name | Should be "Product" $ws2.PivotTables[0].ColumnFields[0].Name | Should be "Product"
$ws2.PivotTables[0].RowGrandTotals | Should be $true $ws2.PivotTables[0].RowGrandTotals | Should be $true
$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
$ws2.View.TabSelected | Should be $true
} }
it "Made the PivotTable page active " {
$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,9 +1,11 @@
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$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 = "$env:TEMP\Results.xlsx" $path = Join-Path $Env:TEMP "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 |
@@ -81,7 +83,7 @@ Describe "Creating small named ranges with hyperlinks" {
$placesMade = $Sheet.Cells[(2 + $results.Count), 5].value - $Sheet.Cells[(2 + $results.Count), 3].value $placesMade = $Sheet.Cells[(2 + $results.Count), 5].value - $Sheet.Cells[(2 + $results.Count), 3].value
$sheet.Cells[(2 + $results.Count), $columns].value | Should be $placesmade $sheet.Cells[(2 + $results.Count), $columns].value | Should be $placesmade
} }
It "Applied ConditionalFormatting, including StopIfTrue, Priority and Reverse " { It "Applied ConditionalFormatting, including StopIfTrue, Priority " {
$sheet.ConditionalFormatting[0].Address.Start.Column | should be $columns $sheet.ConditionalFormatting[0].Address.Start.Column | should be $columns
$sheet.ConditionalFormatting[0].Address.End.Column | should be $columns $sheet.ConditionalFormatting[0].Address.End.Column | should be $columns
$sheet.ConditionalFormatting[0].Address.End.Row | should be $expectedRows $sheet.ConditionalFormatting[0].Address.End.Row | should be $expectedRows
@@ -90,11 +92,13 @@ Describe "Creating small named ranges with hyperlinks" {
$sheet.ConditionalFormatting[0].Icon3.Value | Should be 1 $sheet.ConditionalFormatting[0].Icon3.Value | Should be 1
$sheet.ConditionalFormatting[1].Priority | Should be 1 $sheet.ConditionalFormatting[1].Priority | Should be 1
$sheet.ConditionalFormatting[1].StopIfTrue | Should be $true $sheet.ConditionalFormatting[1].StopIfTrue | Should be $true
}
It "Applied ConditionalFormatting, including Reverse " {
$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

@@ -5,15 +5,15 @@ Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
Describe "Check if Function aliases exist" { Describe "Check if Function aliases exist" {
It "Set-Column should exist" { It "Set-Column should exist".PadRight(90) {
${Alias:Set-Column} | Should Not BeNullOrEmpty ${Alias:Set-Column} | Should Not BeNullOrEmpty
} }
It "Set-Row should exist" { It "Set-Row should exist".PadRight(90) {
${Alias:Set-Row} | Should Not BeNullOrEmpty ${Alias:Set-Row} | Should Not BeNullOrEmpty
} }
It "Set-Format should exist" { It "Set-Format should exist".PadRight(90) {
${Alias:Set-Format} | Should Not BeNullOrEmpty ${Alias:Set-Format} | Should Not BeNullOrEmpty
} }
@@ -21,7 +21,7 @@ Describe "Check if Function aliases exist" {
Get-Command Merge-MulipleSheets | Should Not Be $null Get-Command Merge-MulipleSheets | Should Not Be $null
} }
#> #>
It "New-ExcelChart should exist" { It "New-ExcelChart should exist".PadRight(90) {
${Alias:New-ExcelChart} | Should Not BeNullOrEmpty ${Alias:New-ExcelChart} | Should Not BeNullOrEmpty
} }

View File

@@ -1,5 +1,5 @@
Describe "ImportExcel File List" { Describe "ImportExcel File List" {
It "All files should exist" { It "All files should exist".PadRight(90) {
$fileList = Get-Content "$PSScriptRoot\..\filelist.txt" $fileList = Get-Content "$PSScriptRoot\..\filelist.txt"
foreach ($file in $fileList) { foreach ($file in $fileList) {

View File

@@ -8,20 +8,20 @@ Describe "Tests" {
} }
} }
It "Should have two items" { It "Should have two items".PadRight(90) {
$data.count | Should be 2 $data.count | Should be 2
} }
It "Should have items a and b" { It "Should have items a and b".PadRight(90) {
$data[0].p1 | Should be "a" $data[0].p1 | Should be "a"
$data[1].p1 | Should be "b" $data[1].p1 | Should be "b"
} }
It "Should read fast < 2100 milliseconds" { It "Should read fast < 2100 milliseconds".PadRight(90) {
$timer.TotalMilliseconds | should BeLessThan 2100 $timer.TotalMilliseconds | should BeLessThan 2100
} }
It "Should read larger xlsx, 4k rows 1 col < 3000 milliseconds" { It "Should read larger xlsx, 4k rows 1 col < 3000 milliseconds".PadRight(90) {
$timer = Measure-Command { $timer = Measure-Command {
$null = Import-Excel $PSScriptRoot\LargerFile.xlsx $null = Import-Excel $PSScriptRoot\LargerFile.xlsx
} }
@@ -29,7 +29,7 @@ Describe "Tests" {
$timer.TotalMilliseconds | should BeLessThan 3000 $timer.TotalMilliseconds | should BeLessThan 3000
} }
It "Should be able to open, read and close as seperate actions" { It "Should be able to open, read and close as seperate actions".PadRight(90) {
$timer = Measure-Command { $timer = Measure-Command {
$excel = Open-ExcelPackage $PSScriptRoot\Simple.xlsx $excel = Open-ExcelPackage $PSScriptRoot\Simple.xlsx
$data = Import-Excel -ExcelPackage $excel $data = Import-Excel -ExcelPackage $excel

View File

@@ -1,6 +1,8 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
Describe "Exporting with -Inputobject" { Describe "Exporting with -Inputobject" {
BeforeAll { BeforeAll {
$path = "$env:TEMP\Results.xlsx" $path = Join-Path $Env:TEMP "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

@@ -1,4 +1,7 @@
$data1 = ConvertFrom-Csv -InputObject @" if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$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
@@ -24,7 +27,7 @@ ID,Product,Quantity,Price,Total
Describe "Join Worksheet part 1" { Describe "Join Worksheet part 1" {
BeforeAll { BeforeAll {
$path = "$Env:TEMP\test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -52,7 +55,7 @@ Describe "Join Worksheet part 1" {
it "Activated the correct worksheet " { it "Activated the correct worksheet " {
$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" {
@@ -89,10 +92,11 @@ Describe "Join Worksheet part 1" {
} }
} }
} }
$path = "$env:TEMP\Test.xlsx" $path = Join-Path $Env:TEMP "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

@@ -1,9 +1,10 @@
if ($PSVersionTable.PSVersion.Major -GT 5) { 
Describe "Password Support" {
if ($PSVersionTable.PSVersion.Major -GT 5) {
Write-Warning "Can't test passwords on V6 and later" Write-Warning "Can't test passwords on V6 and later"
return return
} }
Describe "Password Support" {
Context "Password protected sheet" { Context "Password protected sheet" {
BeforeAll { BeforeAll {
$password = "YouMustRememberThis" $password = "YouMustRememberThis"

View File

@@ -1,38 +1,38 @@
Describe "Test reading relative paths" { Describe "Test reading relative paths" {
BeforeAll { BeforeAll {
$script:xlfileName = "TestR.xlsx" $script:xlfileName = "TestR.xlsx"
@{data = 1 } | Export-Excel "$pwd\TestR.xlsx" @{data = 1 } | Export-Excel (Join-Path $PWD "TestR.xlsx")
} }
AfterAll { AfterAll {
Remove-Item "$pwd\$($script:xlfileName)" Remove-Item (Join-Path $PWD "$($script:xlfileName)")
} }
It "Should read local file" { It "Should read local file".PadRight(90) {
$actual = Import-Excel -Path ".\$($script:xlfileName)" $actual = Import-Excel -Path ".\$($script:xlfileName)"
$actual | Should Not Be $null $actual | Should Not Be $null
$actual.Count | Should Be 1 $actual.Count | Should Be 1
} }
It "Should read with pwd" { It "Should read with pwd".PadRight(90){
$actual = Import-Excel -Path "$pwd\$($script:xlfileName)" $actual = Import-Excel -Path (Join-Path $PWD "$($script:xlfileName)")
$actual | Should Not Be $null $actual | Should Not Be $null
} }
It "Should read with just a file name and resolve to cwd" { It "Should read with just a file name and resolve to cwd".PadRight(90){
$actual = Import-Excel -Path "$($script:xlfileName)" $actual = Import-Excel -Path "$($script:xlfileName)"
$actual | Should Not Be $null $actual | Should Not Be $null
} }
It "Should fail for not found" { It "Should fail for not found".PadRight(90){
{ Import-Excel -Path "ExcelFileDoesNotExist.xlsx" } | Should Throw "'ExcelFileDoesNotExist.xlsx' file not found" { Import-Excel -Path "ExcelFileDoesNotExist.xlsx" } | Should Throw "'ExcelFileDoesNotExist.xlsx' file not found"
} }
It "Should fail for xls extension" { It "Should fail for xls extension".PadRight(90){
{ Import-Excel -Path "ExcelFileDoesNotExist.xls" } | Should Throw "Import-Excel does not support reading this extension type .xls" { Import-Excel -Path "ExcelFileDoesNotExist.xls" } | Should Throw "Import-Excel does not support reading this extension type .xls"
} }
It "Should fail for xlsxs extension" { It "Should fail for xlsxs extension".PadRight(90){
{ Import-Excel -Path "ExcelFileDoesNotExist.xlsxs" } | Should Throw "Import-Excel does not support reading this extension type .xlsxs" { Import-Excel -Path "ExcelFileDoesNotExist.xlsxs" } | Should Throw "Import-Excel does not support reading this extension type .xlsxs"
} }
} }

View File

@@ -0,0 +1,39 @@
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-Item -path $path -ErrorAction SilentlyContinue
$excel = ConvertFrom-Csv @"
Product, City, Gross, Net
Apple, London , 300, 250
Orange, London , 400, 350
Banana, London , 300, 200
Orange, Paris, 600, 500
Banana, Paris, 300, 200
Apple, New York, 1200,700
"@ | Export-Excel -Path $path -WorksheetName Sheet1 -PassThru
$ws = $excel.sheet1
Set-WorkSheetProtection -WorkSheet $ws -IsProtected -BlockEditObject -AllowFormatRows -UnLockAddress "1:1"
Close-ExcelPackage -ExcelPackage $excel
Describe "Setting worksheet protection " {
BeforeAll {
$excel = Open-ExcelPackage -Path $path
$ws = $ws = $excel.sheet1
}
it "Turned on protection for the sheet " {
$ws.Protection.IsProtected | should be $true
}
it "Set sheet-wide protection options " {
$ws.Protection.AllowEditObject | should be $false
$ws.Protection.AllowFormatRows | should be $true
$ws.cells["a2"].Style.Locked | should be $true
}
it "Unprotected some cells " {
$ws.cells["a1"].Style.Locked | should be $false
}
}

View File

@@ -1,5 +1,10 @@
$path = "$env:temp\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,5 +1,6 @@
#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" {
@@ -10,7 +11,7 @@ Name,Age
Jane,10 Jane,10
John,20 John,20
"@ "@
$xlFile1 = "$env:TEMP\RemoveWorsheet1.xlsx" $xlFile1 = Join-Path $Env:TEMP "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
@@ -18,7 +19,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 = "$env:TEMP\RemoveWorsheet2.xlsx" $xlFile2 = Join-Path $Env:TEMP "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
@@ -27,11 +28,11 @@ John,20
$data | Export-Excel -Path $xlFile2 -WorksheetName Sheet1 $data | Export-Excel -Path $xlFile2 -WorksheetName Sheet1
} }
it "Should throw about the Path" { it "Should throw about the Path".PadRight(87) {
{Remove-WorkSheet} | Should throw 'Remove-WorkSheet requires the and Excel file' {Remove-WorkSheet} | Should throw 'Remove-WorkSheet requires the and Excel file'
} }
it "Should delete Target2" { it "Should delete Target2".PadRight(87) {
Remove-WorkSheet -Path $xlFile1 -WorksheetName Target2 Remove-WorkSheet -Path $xlFile1 -WorksheetName Target2
$actual = Get-ExcelSheetInfo -Path $xlFile1 $actual = Get-ExcelSheetInfo -Path $xlFile1
@@ -42,7 +43,7 @@ John,20
$actual[2].Name | Should Be "Sheet1" $actual[2].Name | Should Be "Sheet1"
} }
it "Should delete Sheet1" { it "Should delete Sheet1".PadRight(87) {
Remove-WorkSheet -Path $xlFile1 Remove-WorkSheet -Path $xlFile1
$actual = Get-ExcelSheetInfo -Path $xlFile1 $actual = Get-ExcelSheetInfo -Path $xlFile1
@@ -53,7 +54,7 @@ John,20
$actual[2].Name | Should Be "Target3" $actual[2].Name | Should Be "Target3"
} }
it "Should delete multiple sheets" { it "Should delete multiple sheets".PadRight(87) {
Remove-WorkSheet -Path $xlFile1 -WorksheetName Target1, Sheet1 Remove-WorkSheet -Path $xlFile1 -WorksheetName Target1, Sheet1
$actual = Get-ExcelSheetInfo -Path $xlFile1 $actual = Get-ExcelSheetInfo -Path $xlFile1
@@ -63,9 +64,9 @@ John,20
$actual[1].Name | Should Be "Target3" $actual[1].Name | Should Be "Target3"
} }
it "Should delete sheet from multiple workbooks" { it "Should delete sheet from multiple workbooks".PadRight(87) {
Get-ChildItem "$env:TEMP\RemoveWorsheet*.xlsx" | Remove-WorkSheet Get-ChildItem (Join-Path $Env:TEMP "removeWorsheet*.xlsx") | Remove-WorkSheet
$actual = Get-ExcelSheetInfo -Path $xlFile1 $actual = Get-ExcelSheetInfo -Path $xlFile1

View File

@@ -1,5 +1,6 @@
 Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
$path = "$Env:TEMP\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
@@ -299,7 +300,7 @@ Describe "Conditional Formatting" {
} }
} }
$path = "$Env:TEMP\test.xlsx" $path = Join-Path $Env:TEMP "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
@@ -320,7 +321,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 = "$Env:TEMP\testNamedRange.xlsx" $xlfile = Join-Path $Env:TEMP "testNamedRange.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfile -ErrorAction SilentlyContinue
} }

View File

@@ -1,3 +1,7 @@
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
@@ -7,7 +11,7 @@ ID,Product,Quantity,Price
12011,Crowbar,7,23.48 12011,Crowbar,7,23.48
"@ "@
$path = "$Env:TEMP\DataValidation.xlsx" $path = Join-Path $Env:TEMP "DataValidation.xlsx"
Describe "Data validation and protection" { Describe "Data validation and protection" {
Context "Data Validation rules" { Context "Data Validation rules" {
@@ -32,7 +36,6 @@ Describe "Data validation and protection" {
$ws.DataValidations[0].ValidationType.Type.tostring() | Should be 'List' $ws.DataValidations[0].ValidationType.Type.tostring() | Should be 'List'
$ws.DataValidations[0].Formula.ExcelFormula | Should be 'values!$a$1:$a$10' $ws.DataValidations[0].Formula.ExcelFormula | Should be 'values!$a$1:$a$10'
$ws.DataValidations[0].Formula2 | Should benullorempty $ws.DataValidations[0].Formula2 | Should benullorempty
$ws.DataValidations[0].Operator.tostring() | should be 'any'
} }
It "Created an integer validation rule for values between X and Y " { It "Created an integer validation rule for values between X and Y " {
$ws.DataValidations[1].ValidationType.Type.tostring() | Should be 'Whole' $ws.DataValidations[1].ValidationType.Type.tostring() | Should be 'Whole'

View File

@@ -1,13 +1,42 @@
resources: jobs:
- repo: self - job: Build_PS_Win2016
queue: pool:
name: Hosted VS2017 vmImage: vs2017-win2016
steps: steps:
- powershell: ./ '.\DoTests.ps1' - powershell: |
displayName: 'PowerShell Script' .\DoTests.ps1
displayName: 'Run Tests on Windows'
- task: ArchiveFiles@2 - job: Build_PSCore_Ubuntu1604
displayName: 'Archive $(Build.BinariesDirectory)'
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:
paths: paths:

BIN
images/Sparklines.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB