Compare commits

..

43 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
dfinke
1a51d38c0f Add image showing defaults 2019-08-21 17:37:19 -04:00
dfinke
554163a911 Update readme 2019-08-21 17:37:05 -04:00
dfinke
efd8dcd60a Bump version 2019-08-21 17:36:57 -04:00
Doug Finke
1c77bd31b5 Merge pull request #661 from ili101/Out-Excel
Out-Excel and -Now
2019-08-21 17:06:30 -04:00
ili101
35e013fe1d Reverted to Pester Old syntax 2019-08-18 22:37:24 +03:00
ili101
8ac9927cfa ParameterSets Tests and Out-Excel Example 2019-08-18 22:09:28 +03:00
ili101
9c305a1dae Change -Now default from -AutoFilter to -TableName 2019-08-17 08:03:52 +03:00
ili101
aa738629f7 Out-Excel 2019-08-17 06:29:59 +03: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
dfinke
b82888527f Updated 2019-07-24 09:54:24 -04:00
dfinke
a3c71de190 Bump version 2019-07-24 09:54:20 -04:00
Doug Finke
f3a99f04ce Merge pull request #638 from jhoneill/master
Updates for copy sheet, clear all in Set-Excel range and fixing a password regression
2019-07-24 09:49:42 -04:00
jhoneill
f631a20269 Conflict resolution 2019-07-24 13:02:39 +01:00
jhoneill
dbd35721ee Fix broken test & regression re: passwords 2019-07-24 12:02:22 +01:00
jhoneill
8759070636 add clearall to set-ExcelRange; 2019-07-24 12:01:06 +01:00
Doug Finke
6259b8d091 Merge pull request #630 from 1DontEx1st/patch-1
Fix typo
2019-07-11 13:21:29 -04:00
1DontEx1st
7086c3707c Fix typo
Changed "Autofiler" to "Autofilter" in -Now description.
2019-07-11 12:01:36 -04:00
jhoneill
8b28172616 Refactored copy sheet and added pipe support 2019-07-09 19:10:51 +01:00
dfinke
abdd37b09e Updated readme and bumped version 2019-07-04 16:20:19 -04:00
Doug Finke
e1e855a823 Merge pull request #628 from dfinke/RelativePath
Added resolve-path and tests. #627; Commented out write-warning
2019-07-04 16:18:14 -04:00
dfinke
585d9686a6 Remove firstTimeThru check 2019-07-04 16:14:36 -04:00
dfinke
e87a6bdaf5 Add extension test back in 2019-07-04 12:16:44 -04:00
dfinke
5ded5111b4 Rename test 2019-07-04 12:16:34 -04:00
dfinke
914c61048b Moved back, CI has issues with $psscriptroot for xlsx 2019-07-04 12:03:05 -04:00
dfinke
25fb76d9b7 Remove test, put check in begin block 2019-07-04 11:59:15 -04:00
dfinke
7faa27a3b3 create xlsx before all in cwd 2019-07-04 11:53:59 -04:00
dfinke
5700be0684 works locally, not in the CI tho 2019-07-04 11:45:42 -04:00
dfinke
6d86108060 wip: remove param validation 2019-07-04 11:40:02 -04:00
dfinke
4581c2b3e9 Added resolve-path and tests. #627; Commented out write-warning 2019-07-04 11:18:28 -04:00
dfinke
142c31ccc1 Added image to readme 2019-06-18 14:56:00 -04:00
38 changed files with 876 additions and 291 deletions

View File

@@ -3,24 +3,27 @@
.SYNOPSIS
Copies a worksheet between workbooks or within the same workbook.
.DESCRIPTION
Copy-ExcelWorkSheet takes Source and Destination workbook parameters; each can be the path to an XLSx file, an ExcelPackage object or an ExcelWorkbook object.
The Source worksheet is specified by name or number (starting from 1), and the destination worksheet can be explicitly named,
or will follow the name of the source if no name is specified.
Copy-ExcelWorkSheet takes a Source object which is either a worksheet,
or a package, Workbook or path, in which case the source worksheet can be specified
by name or number (starting from 1).
The destination worksheet can be explicitly named, or will follow the name of the source if no name is specified.
The Destination workbook can be given as the path to an XLSx file, an ExcelPackage object or an ExcelWorkbook object.
.EXAMPLE
C:\> Copy-ExcelWorkSheet -SourceWorkbook Test1.xlsx -DestinationWorkbook Test2.xlsx
This is the simplest version of the command: no source worksheet is specified so Copy-ExcelWorksheet uses the first sheet in the workbook
No Destination sheet is specified so the new worksheet will be the same as the one which is being copied.
.EXAMPLE
C:\> Copy-ExcelWorkSheet -SourceWorkbook Server1.xlsx -sourceWorksheet "Settings" -DestinationWorkbook Settings.xlsx -DestinationWorkSheet "Server1"
C:\> Copy-ExcelWorkSheet -SourceWorkbook Server1.xlsx -sourceWorksheet "Settings" -DestinationWorkbook Settings.xlsx -DestinationWorksheet "Server1"
Here the Settings page from Server1's workbook is copied to the 'Server1" page of a "Settings" workbook.
.EXAMPLE
C:\> $excel = Open-ExcelPackage .\test.xlsx
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet "first" -DestinationWorkbook $excel -Show -DestinationWorkSheet Duplicate
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet "first" -DestinationWorkbook $excel -Show -DestinationWorksheet Duplicate
This opens the workbook test.xlsx and copies the worksheet named "first" to a new worksheet named "Duplicate",
because -Show is specified the file is saved and opened in Excel
.EXAMPLE
C:\> $excel = Open-ExcelPackage .\test.xlsx
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet 1 -DestinationWorkbook $excel -DestinationWorkSheet Duplicate
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet 1 -DestinationWorkbook $excel -DestinationWorksheet Duplicate
C:\> Close-ExcelPackage $excel
This is almost the same as the previous example, except source sheet is specified by position rather than name and
because -Show is not specified, so other steps can be carried using the package object, at the end the file is saved by Close-ExcelPackage
@@ -29,83 +32,99 @@
[CmdletBinding()]
param(
#An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data is found.
[Parameter(Mandatory = $true)]
$SourceWorkbook,
[Parameter(Mandatory = $true,ValueFromPipeline=$true)]
[Alias('SourceWorkbook')]
$SourceObject,
#Name or number (starting from 1) of the worksheet in the source workbook (defaults to 1).
$SourceWorkSheet = 1 ,
#An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data should be copied.
[Parameter(Mandatory = $true)]
$DestinationWorkbook,
#Name of the worksheet in the destination workbook; by default the same as the source worksheet's name. If the sheet exists it will be deleted and re-copied.
$DestinationWorkSheet,
$DestinationWorksheet,
#if the destination is an excel package or a path, launch excel and open the file on completion.
[Switch]$Show
)
#Special case - give the same path for source and destination worksheet
if ($SourceWorkbook -is [System.String] -and $SourceWorkbook -eq $DestinationWorkbook) {
if (-not $DestinationWorkSheet) {Write-Warning -Message "You must specify a destination worksheet name if copying within the same workbook."; return}
begin {
#For the case where we are piped multiple sheets, we want to open the destination in the begin and close it in the end.
if ($DestinationWorkbook -is [OfficeOpenXml.ExcelPackage] ) {
if ($Show) {$package2 = $DestinationWorkbook}
$DestinationWorkbook = $DestinationWorkbook.Workbook
}
elseif ($DestinationWorkbook -is [string] -and ($DestinationWorkbook -ne $SourceObject)) {
$package2 = Open-ExcelPackage -Create -Path $DestinationWorkbook
$DestinationWorkbook = $package2.Workbook
}
}
process {
#Special case - given the same path for source and destination worksheet
if ($SourceObject -is [System.String] -and $SourceObject -eq $DestinationWorkbook) {
if (-not $DestinationWorksheet) {Write-Warning -Message "You must specify a destination worksheet name if copying within the same workbook."; return}
else {
Write-Verbose -Message "Copying "
$excel = Open-ExcelPackage -Path $SourceWorkbook
$excel = Open-ExcelPackage -Path $SourceObject
if (-not $excel.Workbook.Worksheets[$Sourceworksheet]) {
Write-Warning -Message "Could not find Worksheet $sourceWorksheet in $sourceWorkbook"
Write-Warning -Message "Could not find Worksheet $sourceWorksheet in $SourceObject"
Close-ExcelPackage -ExcelPackage $excel -NoSave
return
}
elseif ($excel.Workbook.Worksheets[$Sourceworksheet].name -eq $DestinationWorkSheet) {
elseif ($excel.Workbook.Worksheets[$Sourceworksheet].name -eq $DestinationWorksheet) {
Write-Warning -Message "The destination worksheet name is the same as the source. "
Close-ExcelPackage -ExcelPackage $excel -NoSave
return
}
else {
$null = Add-WorkSheet -ExcelPackage $Excel -WorkSheetname $DestinationWorkSheet -CopySource ($excel.Workbook.Worksheets[$SourceWorkSheet])
$null = Add-WorkSheet -ExcelPackage $excel -WorkSheetname $DestinationWorksheet -CopySource ($excel.Workbook.Worksheets[$SourceWorkSheet])
Close-ExcelPackage -ExcelPackage $excel -Show:$Show
return
}
}
}
else {
if ($SourceWorkbook -is [OfficeOpenXml.ExcelWorkbook]) {$sourcews = $SourceWorkbook.Worksheets[$SourceWorkSheet]}
elseif ($SourceWorkbook -is [OfficeOpenXml.ExcelPackage] ) {$sourcews = $SourceWorkbook.Workbook.Worksheets[$SourceWorkSheet]}
if ($SourceObject -is [OfficeOpenXml.ExcelWorksheet]) {$sourceWs = $SourceObject}
elseif ($SourceObject -is [OfficeOpenXml.ExcelWorkbook]) {$sourceWs = $SourceObject.Worksheets[$SourceWorkSheet]}
elseif ($SourceObject -is [OfficeOpenXml.ExcelPackage] ) {$sourceWs = $SourceObject.Workbook.Worksheets[$SourceWorkSheet]}
else {
$SourceWorkbook = (Resolve-Path $SourceWorkbook).ProviderPath
$SourceObject = (Resolve-Path $SourceObject).ProviderPath
try {
Write-Verbose "Opening worksheet '$Worksheetname' in Excel workbook '$SourceWorkbook'."
$Stream = New-Object -TypeName System.IO.FileStream -ArgumentList $SourceWorkbook, 'Open', 'Read' , 'ReadWrite'
$Package1 = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Stream
Write-Verbose "Opening worksheet '$Worksheetname' in Excel workbook '$SourceObject'."
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $SourceObject, 'Open', 'Read' , 'ReadWrite'
$package1 = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
$sourceWs = $Package1.Workbook.Worksheets[$SourceWorkSheet]
}
catch {Write-Warning -Message "Could not open $SourceWorkbook" ; return}
catch {Write-Warning -Message "Could not open $SourceObject - the error was '$($_.exception.message)' " ; return}
}
if (-not $sourceWs) {Write-Warning -Message "Could not find worksheet '$Sourceworksheet' in the source workbook." ; return}
else {
try {
if ($DestinationWorkbook -is [OfficeOpenXml.ExcelWorkbook]) {
$wb = $DestinationWorkbook
if ($DestinationWorkbook -isnot [OfficeOpenXml.ExcelWorkbook]) {
Write-Warning "Not a valid workbook" ; return
}
elseif ($DestinationWorkbook -is [OfficeOpenXml.ExcelPackage] ) {
$wb = $DestinationWorkbook.workbook
if ($show) {$package2 = $DestinationWorkbook}
#check if we have a destination sheet name and set one if not. Because we might loop round check $psBoundParameters, not the variable.
if (-not $PSBoundParameters['DestinationWorksheet']) {
#if we are piped files, use the file name without the extension as the destination sheet name, Otherwise use the source sheet name
if ($_ -is [System.IO.FileInfo]) {$DestinationWorksheet = $_.name -replace '\.xlsx$', '' }
else { $DestinationWorksheet = $sourceWs.Name}
}
else {
$package2 = Open-ExcelPackage -Create -Path $DestinationWorkbook
$wb = $package2.Workbook
if ($DestinationWorkbook.Worksheets[$DestinationWorksheet]) {
Write-Verbose "Destination workbook already has a sheet named '$DestinationWorksheet', deleting it."
$DestinationWorkbook.Worksheets.Delete($DestinationWorksheet)
}
if (-not $DestinationWorkSheet) {$DestinationWorkSheet = $SourceWs.Name}
if ($wb.Worksheets[$DestinationWorkSheet]) {
Write-Verbose "Destination workbook already has a sheet named '$DestinationWorkSheet', deleting it."
$wb.Worksheets.Delete($DestinationWorkSheet)
Write-Verbose "Copying '$($sourcews.name)' from $($SourceObject) to '$($DestinationWorksheet)' in $($PSBoundParameters['DestinationWorkbook'])"
$null = Add-WorkSheet -ExcelWorkbook $DestinationWorkbook -WorkSheetname $DestinationWorksheet -CopySource $sourceWs
#Leave the destination open but close the source - if we're copying more than one sheet we'll re-open it and live with the inefficiency
if ($stream) {$stream.Close() }
if ($package1) {Close-ExcelPackage -ExcelPackage $package1 -NoSave }
}
Write-Verbose "Copying $($SourceWorkSheet) from $($SourceWorkbook) to $($DestinationWorkSheet) in $($DestinationWorkbook)"
$null = Add-WorkSheet -ExcelWorkbook $wb -WorkSheetname $DestinationWorkSheet -CopySource $sourceWs
if ($Stream) {$Stream.Close() }
if ($package1) {Close-ExcelPackage -ExcelPackage $Package1 -NoSave }
if ($package2) {Close-ExcelPackage -ExcelPackage $Package2 -Show:$show }
if ($show -and $DestinationWorkbook -is [OfficeOpenXml.ExcelWorkbook]) {
catch {Write-Warning -Message "Could not write to sheet '$DestinationWorksheet' in the destination workbook. Error was '$($_.exception.message)'" ; return}
}
}
}
end {
#OK Now we can close the destination package
if ($package2) {Close-ExcelPackage -ExcelPackage $package2 -Show:$Show }
if ($Show -and -not $package2) {
Write-Warning -Message "-Show only works if the Destination workbook is given as a file path or an ExcelPackage object."
}
}
catch {Write-Warning -Message "Could not write to sheet '$DestinationWorkSheet' in the destination workbook" ; return}
}
}
}

Binary file not shown.

View File

@@ -0,0 +1,89 @@
<#
This is an example on how to customize Export-Excel to your liking.
First select a name for your function, in ths example its "Out-Excel" you can even set the name to "Export-Excel".
You can customize the following things:
1. To add parameters to the function define them in "param()", here I added "Preset1" and "Preset2".
The parameters need to be removed after use (see comments and code below).
2. To remove parameters from the function add them to the list under "$_.Name -notmatch", I removed "Now".
3. Add your custom code, here I defined what the Presets do:
Preset1 configure the TableStyle, name the table depending on WorksheetName and FreezeTopRow.
Preset2 will set AutoFilter and add the Title "Daily Report".
(see comments and code below).
#>
Function Out-Excel {
[CmdletBinding(DefaultParameterSetName = 'Default')]
param(
[switch]
${Preset1},
[switch]
${Preset2}
)
DynamicParam {
$paramDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
foreach ($P in (Get-Command -Name Export-Excel).Parameters.values.where( { $_.Name -notmatch 'Verbose|Debug|Action$|Variable$|Buffer$|Now' })) {
$paramDictionary.Add($P.Name, [System.Management.Automation.RuntimeDefinedParameter]::new( $P.Name, $P.ParameterType, $P.Attributes ) )
}
return $paramDictionary
}
begin {
try {
# Run you custom code here if it need to run before calling Export-Excel.
$PSBoundParameters['Now'] = $true
if ($Preset1) {
$PSBoundParameters['TableStyle'] = 'Medium7'
$PSBoundParameters['FreezeTopRow'] = $true
if ($PSBoundParameters['WorksheetName'] -and -not $PSBoundParameters['TableName']) {
$PSBoundParameters['TableName'] = $PSBoundParameters['WorksheetName'] + '_Table'
}
}
elseif ($Preset2) {
$PSBoundParameters['Title'] = 'Daily Report'
$PSBoundParameters['AutoFilter'] = $true
}
# Remove the extra params we added as Export-Excel will not know what to do with them:
$null = $PSBoundParameters.Remove('Preset1')
$null = $PSBoundParameters.Remove('Preset2')
# The rest of the code was auto generated.
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) {
$PSBoundParameters['OutBuffer'] = 1
}
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Export-Excel', [System.Management.Automation.CommandTypes]::Function)
# You can add a pipe after @PSBoundParameters to manipulate the output.
$scriptCmd = { & $wrappedCmd @PSBoundParameters }
$steppablePipeline = $scriptCmd.GetSteppablePipeline()
$steppablePipeline.Begin($PSCmdlet)
}
catch {
throw
}
}
process {
try {
$steppablePipeline.Process($_)
}
catch {
throw
}
}
end {
try {
$steppablePipeline.End()
}
catch {
throw
}
}
<#
.ForwardHelpTargetName Export-Excel
.ForwardHelpCategory Function
#>
}

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

@@ -138,7 +138,7 @@
.PARAMETER Activate
If there is already content in the workbook, a new sheet will not be active UNLESS Activate is specified; if a PivotTable is included it will be the active sheet
.PARAMETER Now
The -Now switch is a shortcut that automatically creates a temporary file, enables "AutoSize", "AutoFiler" and "Show", and opens the file immediately.
The -Now switch is a shortcut that automatically creates a temporary file, enables "AutoSize", "TableName" and "Show", and opens the file immediately.
.PARAMETER NumberFormat
Formats all values that can be converted to a number to the format specified.
@@ -418,12 +418,12 @@
.LINK
https://github.com/dfinke/ImportExcel
#>
[CmdletBinding(DefaultParameterSetName = 'Now')]
[CmdletBinding(DefaultParameterSetName = 'Default')]
[OutputType([OfficeOpenXml.ExcelPackage])]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
Param(
[Parameter(Mandatory = $true, ParameterSetName = "Path", Position = 0)]
[Parameter(ParameterSetName = 'Default', Position = 0)]
[String]$Path,
[Parameter(Mandatory = $true, ParameterSetName = "Package")]
@@ -473,14 +473,9 @@
else { $true }
})]
[String]$RangeName,
[ValidateScript( {
if (-not $_) { throw 'Tablename is null or empty.' }
elseif ($_[0] -notmatch '[a-z]') { throw 'Tablename starts with an invalid character.' }
else { $true }
})]
[String]$TableName,
$TableName,
[OfficeOpenXml.Table.TableStyles]$TableStyle,
@@ -512,7 +507,7 @@
[ScriptBlock]$CellStyleSB,
#If there is already content in the workbook the sheet with the PivotTable will not be active UNLESS Activate is specified
[switch]$Activate,
[Parameter(ParameterSetName = 'Now')]
[Parameter(ParameterSetName = 'Default')]
[Switch]$Now,
[Switch]$ReturnRange,
#By default PivotTables have Totals for each Row (on the right) and for each column at the bottom. This allows just one or neither to be selected.
@@ -531,12 +526,15 @@
try {
$script:Header = $null
if ($Append -and $ClearSheet) {throw "You can't use -Append AND -ClearSheet."}
$TableName = if ($null -eq $TableName -or ($TableName -is [bool] -and $false -eq $TableName)) { $null } else {[String]$TableName}
if ($PSBoundParameters.Keys.Count -eq 0 -Or $Now -or (-not $Path -and -not $ExcelPackage) ) {
$Path = [System.IO.Path]::GetTempFileName() -replace '\.tmp', '.xlsx'
$Show = $true
$AutoSize = $true
if (-not $TableName) {
$AutoFilter = $true
if (-not $PSBoundParameters.ContainsKey("Path")) { $Path = [System.IO.Path]::GetTempFileName() -replace '\.tmp', '.xlsx' }
if (-not $PSBoundParameters.ContainsKey("Show")) { $Show = $true }
if (-not $PSBoundParameters.ContainsKey("AutoSize")) { $AutoSize = $true }
if (-not $PSBoundParameters.ContainsKey("TableName") -and
-not $PSBoundParameters.ContainsKey("TableStyle") -and
-not $AutoFilter) {
$TableName = ''
}
}
if ($ExcelPackage) {
@@ -578,7 +576,7 @@
}
#if we did not get a table name but there is a table which covers the active part of the sheet, set table name to that, and don't do anything with autofilter
if (-not $TableName -and $ws.Tables.Where({$_.address.address -eq $ws.dimension.address})) {
if ($null -eq $TableName -and $ws.Tables.Where({$_.address.address -eq $ws.dimension.address})) {
$TableName = $ws.Tables.Where({$_.address.address -eq $ws.dimension.address},'First', 1).Name
$AutoFilter = $false
}
@@ -809,7 +807,7 @@
if ($RangeName) { Add-ExcelName -Range $ws.Cells[$dataRange] -RangeName $RangeName}
#Allow table to be inserted by specifying Name, or Style or both; only process autoFilter if there is no table (they clash).
if ($TableName) {
if ($null -ne $TableName) {
if ($PSBoundParameters.ContainsKey('TableStyle')) {
Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName -TableStyle $TableStyle
}

View File

@@ -4,7 +4,7 @@
RootModule = 'ImportExcel.psm1'
# Version number of this module.
ModuleVersion = '6.2.1'
ModuleVersion = '6.5.0'
# ID used to uniquely identify this module
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
@@ -16,7 +16,7 @@
CompanyName = 'Doug Finke'
# Copyright statement for this module
Copyright = 'c 2015 All rights reserved.'
Copyright = 'c 2019 All rights reserved.'
# Description of the functionality provided by this module
Description = @'
@@ -118,6 +118,7 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'Set-ExcelColumn',
'Set-ExcelRange',
'Set-ExcelRow',
'Set-WorkSheetProtection',
'Test-Boolean',
'Test-Date',
'Test-Integer',

View File

@@ -48,7 +48,7 @@ if ($PSVersionTable.PSVersion.Major -ge 5) {
. $PSScriptRoot\plot.ps1
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')]
Param()
[PSPlot]::new()
@@ -269,7 +269,6 @@ function Import-Excel {
[Parameter(ParameterSetName = "PathA", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
[Parameter(ParameterSetName = "PathB", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
[Parameter(ParameterSetName = "PathC", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
[ValidateScript( {(Test-Path -Path $_ -PathType Leaf) -and ($_ -match '.xls$|.xlsx$|.xlsm$')})]
[String]$Path,
[Parameter(ParameterSetName = "PackageA", Mandatory)]
[Parameter(ParameterSetName = "PackageB", Mandatory)]
@@ -300,12 +299,13 @@ function Import-Excel {
)
begin {
$sw = [System.Diagnostics.Stopwatch]::StartNew()
Function Get-PropertyNames {
<#
.SYNOPSIS
Create objects containing the column number and the column name for each of the different header types.
#>
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification="Name would be incorrect, and command is not exported")]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = "Name would be incorrect, and command is not exported")]
Param (
[Parameter(Mandatory)]
[Int[]]$Columns,
@@ -318,13 +318,13 @@ function Import-Excel {
$i = 0
foreach ($C in $Columns) {
$i++
$C | Select-Object @{N = 'Column'; E = {$_}}, @{N = 'Value'; E = {'P' + $i}}
$C | Select-Object @{N = 'Column'; E = { $_ } }, @{N = 'Value'; E = { 'P' + $i } }
}
}
elseif ($HeaderName) {
$i = 0
foreach ($H in $HeaderName) {
$H | Select-Object @{N = 'Column'; E = {$Columns[$i]}}, @{N = 'Value'; E = {$H}}
$H | Select-Object @{N = 'Column'; E = { $Columns[$i] } }, @{N = 'Value'; E = { $H } }
$i++
}
}
@@ -334,7 +334,7 @@ function Import-Excel {
}
foreach ($C in $Columns) {
$Worksheet.Cells[$StartRow, $C] | Where-Object {$_.Value} | Select-Object @{N = 'Column'; E = {$C}}, Value
$Worksheet.Cells[$StartRow, $C] | Where-Object { $_.Value } | Select-Object @{N = 'Column'; E = { $C } }, Value
}
}
}
@@ -346,43 +346,57 @@ function Import-Excel {
process {
if ($path) {
$extension = [System.IO.Path]::GetExtension($Path)
if ($extension -notmatch '.xlsx$|.xlsm$') {
throw "Import-Excel does not support reading this extension type $($extension)"
}
$resolvedPath = (Resolve-Path $Path -ErrorAction SilentlyContinue)
if ($resolvedPath) {
$Path = $resolvedPath.ProviderPath
}
else {
throw "'$($Path)' file not found"
}
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path, 'Open', 'Read', 'ReadWrite'
if ($Password) {$ExcelPackage = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream , $Password }
else {$ExcelPackage = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream}
$ExcelPackage = New-Object -TypeName OfficeOpenXml.ExcelPackage
if ($Password) { $ExcelPackage.Load($stream,$Password)}
else { $ExcelPackage.Load($stream) }
}
try {
#Select worksheet
if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] }
elseif(-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorkSheetName])) {
elseif (-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorkSheetName])) {
throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($ExcelPackage.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter." ; return
}
Write-Debug $sw.Elapsed.TotalMilliseconds
#region Get rows and columns
#If we are doing dataonly it is quicker to work out which rows to ignore before processing the cells.
if (-not $EndRow ) {$EndRow = $Worksheet.Dimension.End.Row }
if (-not $EndColumn) {$EndColumn = $Worksheet.Dimension.End.Column }
if (-not $EndRow ) { $EndRow = $Worksheet.Dimension.End.Row }
if (-not $EndColumn) { $EndColumn = $Worksheet.Dimension.End.Column }
$endAddress = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[$EndRow]C[$EndColumn]", 0, 0)
if ($DataOnly) {
#If we are using headers startrow will be the header-row so examine data from startRow + 1,
if ($NoHeader) {$range = "A" + ($StartRow ) + ":" + $endAddress }
else {$range = "A" + ($StartRow + 1 ) + ":" + $endAddress }
if ($NoHeader) { $range = "A" + ($StartRow ) + ":" + $endAddress }
else { $range = "A" + ($StartRow + 1 ) + ":" + $endAddress }
#We're going to look at every cell and build 2 hash tables holding rows & columns which contain data.
#Want to Avoid 'select unique' operations & large Sorts, becuse time time taken increases with square
#of number of items (PS uses heapsort at large size). Instead keep a list of what we have seen,
#using Hash tables: "we've seen it" is all we need, no need to worry about "seen it before" / "Seen it many times".
$colHash = @{}
$rowHash = @{}
$colHash = @{ }
$rowHash = @{ }
foreach ($cell in $Worksheet.Cells[$range]) {
if ($null -ne $cell.Value ) {$colHash[$cell.Start.Column] = 1; $rowHash[$cell.Start.row] = 1 }
if ($null -ne $cell.Value ) { $colHash[$cell.Start.Column] = 1; $rowHash[$cell.Start.row] = 1 }
}
$rows = ( $StartRow..$EndRow ).Where( {$rowHash[$_]})
$columns = ($StartColumn..$EndColumn).Where( {$colHash[$_]})
$rows = ( $StartRow..$EndRow ).Where( { $rowHash[$_] })
$columns = ($StartColumn..$EndColumn).Where( { $colHash[$_] })
}
else {
$Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) {Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results."}
if ($NoHeader) {$Rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) {Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results."} }
else {$Rows = (1 + $StartRow)..$EndRow ; if ($StartRow -ge $EndRow) {Write-Warning -Message "Selecting $StartRow as the header with data in $(1+$StartRow) to $EndRow might give odd results."}}
$Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." }
if ($NoHeader) { $Rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) { Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results." } }
else { $Rows = (1 + $StartRow)..$EndRow } # ; if ($StartRow -ge $EndRow) { Write-Warning -Message "Selecting $StartRow as the header with data in $(1+$StartRow) to $EndRow might give odd results." } }
}
#endregion
#region Create property names
@@ -402,7 +416,7 @@ function Import-Excel {
foreach ($R in $Rows) {
#Disabled write-verbose for speed
# Write-Verbose "Import row '$R'"
$NewRow = [Ordered]@{}
$NewRow = [Ordered]@{ }
foreach ($P in $PropertyNames) {
$NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Value
@@ -417,7 +431,7 @@ function Import-Excel {
}
catch { throw "Failed importing the Excel workbook '$Path' with worksheet '$Worksheetname': $_"; return }
finally {
if ($Path) {$stream.close(); $ExcelPackage.Dispose() }
if ($Path) { $stream.close(); $ExcelPackage.Dispose() }
}
}
}
@@ -463,9 +477,9 @@ function ConvertFrom-ExcelSheet {
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Stream
$workbook = $xl.Workbook
$targetSheets = $workbook.Worksheets | Where-Object {$_.Name -like $SheetName}
$targetSheets = $workbook.Worksheets | Where-Object { $_.Name -like $SheetName }
$params = @{} + $PSBoundParameters
$params = @{ } + $PSBoundParameters
$params.Remove("OutputPath")
$params.Remove("SheetName")
$params.Remove('Extension')
@@ -496,7 +510,7 @@ function Export-MultipleExcelSheets {
[Switch]$AutoSize
)
$parameters = @{} + $PSBoundParameters
$parameters = @{ } + $PSBoundParameters
$parameters.Remove("InfoMap")
$parameters.Remove("Show")
@@ -509,7 +523,7 @@ function Export-MultipleExcelSheets {
& $entry.Value | Export-Excel @parameters
}
if ($Show) {Invoke-Item $Path}
if ($Show) { Invoke-Item $Path }
}
Function WorksheetArgumentCompleter {
@@ -519,7 +533,7 @@ Function WorksheetArgumentCompleter {
$xlpkg = Open-ExcelPackage -ReadOnly -Path $xlPath
$WorksheetNames = $xlPkg.Workbook.Worksheets.Name
Close-ExcelPackage -nosave -ExcelPackage $xlpkg
$WorksheetNames.where( {$_ -like "*$wordToComplete*"}) | foreach-object {
$WorksheetNames.where( { $_ -like "*$wordToComplete*" }) | foreach-object {
New-Object -TypeName System.Management.Automation.CompletionResult -ArgumentList "'$_'",
$_ , ([System.Management.Automation.CompletionResultType]::ParameterValue) , $_
}

View File

@@ -272,7 +272,10 @@
Write-Warning -Message "PivotTable defined in $($pivotTableName) already exists, only the data range will be changed."
$pivotTable = $wsPivot.PivotTables[$pivotTableName]
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.

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)
<br/>
<br/>
<br/>
<br/>
<p align="center">
<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>
<a href="https://www.powershellgallery.com/packages/ImportExcel"><img src="https://img.shields.io/powershellgallery/v/ImportExcel.svg"></a>
<a href="https://www.powershellgallery.com/packages/ImportExcel"><img src="https://img.shields.io/powershellgallery/dt/ImportExcel.svg"></a>
<a href="./LICENSE.txt"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a>
</p>
<p align="center">
<a href="./LICENSE.txt"><img
src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a>
<a href="https://www.powershellgallery.com/packages/ImportExcel"><img
src="https://img.shields.io/powershellgallery/dt/ImportExcel.svg"></a>
<a href="https://www.powershellgallery.com/packages/ImportExcel"><img
src="https://img.shields.io/powershellgallery/v/ImportExcel.svg"></a>
</p>
|CI System |OS|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)|
|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)|
|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)|
<!-- /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)
# 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
-
@@ -53,6 +50,58 @@ Install-Module ImportExcel -scope CurrentUser
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
Sensible parameter defaults, make your life easier and gets things done faster.
- Thank you to [DomRRuggeri](https://github.com/DomRRuggeri) for the initial Out-Excel PR and kicking off the conversation on the improvements.
- Thank you to [ili101](https://github.com/ili101) for refactoring and improving the defaults, and adding the tests for parameters.
- Creates a table, with filtering
- Chooses a `TableStyle`
- Displays the Excel spreadsheet automatically
```powershell
Get-Process | select Company, Name, Handles | Export-Excel
```
![image](./images/ImproveNowDefaults.png)
# What's new 6.2.3
Thank you [jhoneill](https://github.com/jhoneill).
- Refactored copy sheet and added pipe support
- Add `ClearAll` to `Set-ExcelRange`
- Fix broken test & regression for `passwords`
- **Note**: Passwords do not work on `pwsh`. The EPPlus library does not support these dotnet core APIs at this time.
# What's new 6.2.2
- Added requested feature, chart trendlines.
- [Example PowerShell script](https://github.com/dfinke/ImportExcel/blob/master/Examples/Charts/NumberOfVisitors.ps1)
![](/images/ChartTrendlines.png)
- Fixed Import-Excel and relative path issue, added unit tests.
# What's new 6.2.0
Thank you to [James O'Neill](https://github.com/jhoneill)

View File

@@ -25,6 +25,14 @@
"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
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
Set-ExcelColumn -Worksheet $ws -Heading "Link" -Value {"https://en.wikipedia.org" + $worksheet.cells["B$Row"].value } -AutoSize

View File

@@ -13,7 +13,7 @@
Set-ExcelRow -Worksheet $ws -Heading Total -Value {"=sum($columnName`2:$columnName$endrow)" }
$Ws contains a worksheet object, and no Row number is specified so
Set-ExcelRow will select the next row after the endof the data in
Set-ExcelRow will select the next row after the end of the data in
the sheet. The first cell in the row will contain "Total", and
each of the other cells will contain
=Sum(xx2:xx99)

View File

@@ -7,7 +7,7 @@
.Example
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')]
param (
@@ -48,7 +48,7 @@
[switch]$BlockEditObject,
##Opposite of the value in the 'Edit Scenarios' check box. Set to allow when Protect is first enabled
[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,
#Address range for cells to Unlock in the form "A:Z" or "1:10" or "A1:Z10"
[string]$UnLockAddress
@@ -72,10 +72,13 @@
}
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) {
Set-ExcelRange -Range $WorkSheet.cells[$UnlockAddress] -Locked:$false
}
if ($lockAddress) {
Set-ExcelRange -Range $WorkSheet.cells[$UnlockAddress] -Locked
}
}

View File

@@ -124,7 +124,10 @@
$Range = $WorkSheet.Cells[$Range]
}
elseif ($Range -is [string]) {Write-Warning -Message "The range pararameter you have specified also needs a worksheet parameter." ;return}
#else we assume Range is a range.
#else we assume $Range is a range.
if ($ClearAll) {
$Range.Clear()
}
if ($ResetFont) {
$Range.Style.Font.Color.SetColor( ([System.Drawing.Color]::Black))
$Range.Style.Font.Bold = $false
@@ -227,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)) }
}
if ($Autosize) {
try {
if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.AutoFit() }
elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {
$Range.AutoFitColumns()
}
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')) {
if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.Width = $Width}
@@ -332,6 +338,7 @@ if (Get-Command -ErrorAction SilentlyContinue -name Register-ArgumentCompleter)
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName FontName -ScriptBlock $Function:ListFonts
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName FontName -ScriptBlock $Function:ListFonts
}
function Expand-NumberFormat {
<#
.SYNOPSIS

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 {
$script:data = ConvertFrom-Csv @"
Region,Item,TotalSold
@@ -21,7 +24,7 @@ South,avocado,73
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
$data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange
@@ -34,7 +37,7 @@ South,avocado,73
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
$data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange

View File

@@ -1,6 +1,8 @@
#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
if ($PSVersionTable.PSVersion.Major -gt 5) { Write-Warning "Can't test grid view on V6" }
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" {
Context "Simple comparison output" {
@@ -19,7 +21,7 @@ Describe "Compare Worksheet" {
$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
$comp = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" | Sort-Object -Property _row, _file
}
it "Found the right number of differences " {
$comp | should not beNullOrEmpty
@@ -55,13 +57,13 @@ Describe "Compare Worksheet" {
$ModulePath = (Get-Command -Name 'Compare-WorkSheet').Module.Path
$PowerShellExec = if ($PSEdition -eq 'Core') {'pwsh.exe'} else {'powershell.exe'}
$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 {
$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"
$xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx"
$xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets[1]
$s2Sheet = $xl2.Workbook.Worksheets[1]
}
@@ -85,9 +87,9 @@ Describe "Compare Worksheet" {
Context "Setting the forgound to highlight changed properties" {
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)
$xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx"
$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"
$xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx"
$s1Sheet = $xl1.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
#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
$xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx"
$xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx"
$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"
$xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx"
$s1Sheet = $xl1.Workbook.Worksheets["server1"]
$s2Sheet = $xl2.Workbook.Worksheets["server2"]
}
@@ -188,7 +190,7 @@ Describe "Compare Worksheet" {
Describe "Merge Worksheet" {
Context "Merge with 3 properties" {
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 *
$s | Export-Excel -Path $env:temp\server1.xlsx
@@ -205,7 +207,7 @@ Describe "Merge Worksheet" {
$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
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"]
}
@@ -247,14 +249,14 @@ Describe "Merge Worksheet" {
}
Context "Wider data set" {
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" {
Context "Merge 3 sheets with 3 properties" {
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
$s | Export-Excel -Path $env:temp\server1.xlsx
@@ -281,7 +283,7 @@ Describe "Merge Multiple sheets" {
$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"
$ws = $excel.Workbook.Worksheets["sheet1"]
@@ -295,10 +297,10 @@ Describe "Merge Multiple sheets" {
$ws.Cells[ 1,6 ].Value | Should be "Server2 StartType"
$ws.Column(7).hidden | Should be $true
$ws.Cells[ 1,8].Value | Should be "Server2 Row"
$ws.Cells[ 1,9 ].Value | Should be "Server3 DisplayName"
$ws.Cells[ 1,10].Value | Should be "Server3 StartType"
$ws.Cells[ 1,9 ].Value | Should be "server3 DisplayName"
$ws.Cells[ 1,10].Value | Should be "server3 StartType"
$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 " {
$ws.Cells[ 2,3 ].Value | Should be $ws.Cells[ 2,5 ].Value

View File

@@ -1,5 +1,5 @@
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$xlFile = "$env:TEMP\testSQL.xlsx"
Describe "ConvertFrom-ExcelToSQLInsert" {
@@ -16,7 +16,7 @@ Describe "ConvertFrom-ExcelToSQLInsert" {
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', '');"
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1
@@ -24,7 +24,7 @@ Describe "ConvertFrom-ExcelToSQLInsert" {
$actual | should be $expected
}
It "Should have NULL" {
It "Should have NULL".PadRight(90) {
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);"
$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"
$path2 = "$env:TEMP\Test2.xlsx"
Remove-item -Path $path1, $path2 -ErrorAction SilentlyContinue
@@ -91,8 +94,8 @@ Describe "Copy-Worksheet" {
$xlfile = "$env:TEMP\reports.xlsx"
$xlfileArchive = "$env:TEMP\reportsArchive.xlsx"
rm $xlfile -ErrorAction SilentlyContinue
rm $xlfileArchive -ErrorAction SilentlyContinue
Remove-Item $xlfile -ErrorAction SilentlyContinue
Remove-Item $xlfileArchive -ErrorAction SilentlyContinue
$sheets = echo 1.1.2019 1.2.2019 1.3.2019 1.4.2019 1.5.2019
@@ -101,7 +104,7 @@ Describe "Copy-Worksheet" {
}
}
it "Should copy and remove sheets" {
it "Should copy and remove sheets " {
$targetSheets = echo 1.1.2019 1.4.2019
$targetSheets | ForEach-Object {
@@ -113,4 +116,28 @@ Describe "Copy-Worksheet" {
(Get-ExcelSheetInfo -Path $xlfile ).Count | Should Be 3
}
}
Context "Copy worksheet should support piped input" {
BeforeAll {
$xlfile = "$env:TEMP\reports.xlsx"
$xlfileArchive = "$env:TEMP\reportsArchive.xlsx"
Remove-Item $xlfile -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 | ForEach-Object {
"Hello World" | Export-Excel $xlfile -WorksheetName $_
}
$e = Open-ExcelPackage $xlfile
$e.Workbook.Worksheets | Copy-ExcelWorkSheet -DestinationWorkbook $xlfileArchive
Close-ExcelPackage -NoSave $e
}
it "Should copy sheets piped into the command " {
$excel = Open-ExcelPackage $xlfileArchive
$excel.Workbook.Worksheets.Count | should be 5
$excel.Workbook.Worksheets['1.3.2019'].Cells['A1'].Value | should be 'Hello World'
}
}
}

View File

@@ -1,12 +1,14 @@
#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 {
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
#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
@@ -68,7 +70,7 @@ Describe ExportExcel {
}
Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" {
$path = "$env:TEMP\Test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue
$processes = Get-Process | Select-Object -First 100
$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 " {
$path = "$env:TEMP\Test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue
#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
@@ -156,7 +158,7 @@ Describe ExportExcel {
Context " # Number format parameter" {
BeforeAll {
$path = "$env:temp\test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue
1..10 | Export-Excel -Path $path -Numberformat 'Number'
1..10 | Export-Excel -Path $path -Numberformat 'Percentage' -Append
@@ -179,7 +181,7 @@ Describe ExportExcel {
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"}
else {$OtherCurrencySymbol = "£"}
$path = "$env:TEMP\Test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
$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
Remove-item -Path $path -ErrorAction SilentlyContinue
@@ -296,7 +298,7 @@ Describe ExportExcel {
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
#Test -NoHeader & -NoNumberConversion
[PSCustOmobject][Ordered]@{
@@ -357,7 +359,7 @@ Describe ExportExcel {
#Test New-ConditionalText builds correctly
$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
#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
@@ -385,8 +387,9 @@ Describe ExportExcel {
}
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
$path = "$env:TEMP\Test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue
#Testing -Passthrough
@@ -448,9 +451,11 @@ Describe ExportExcel {
}
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.
$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 ...
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
$PTws | Should not beNullOrEmpty
$PTws.PivotTables.Count | Should be 1
$PTws.View.TabSelected | Should be $true
$Excel.Workbook.Worksheets["Processes"] | Should not beNullOrEmpty
$Excel.Workbook.Worksheets.Count | Should beGreaterThan 2
$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]
it "Built the expected Pivot table " {
$pt.RowFields.Count | Should be 1
@@ -505,7 +512,7 @@ Describe ExportExcel {
}
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
$Excel = Open-ExcelPackage $path
#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[6].Name | Should be "NearDone"
$excel.Workbook.Worksheets[7].Name | Should be "Sheet1"
}
} -skip:($Procs.count -lt 20)
it "Cloned 'Sheet1' to '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. " {
$path = "$env:TEMP\Test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
remove-item -Path $path -ErrorAction SilentlyContinue
#Catch warning
$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
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
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= 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 -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
$dataWs = $Excel.Workbook.Worksheets["withOffset"]
$pt = $Excel.Workbook.Worksheets["PTOffset"].PivotTables[0]
@@ -590,11 +599,14 @@ Describe ExportExcel {
}
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;
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
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
$dataWs = $Excel.Workbook.Worksheets["NoOffset"]
@@ -623,7 +635,8 @@ Describe ExportExcel {
}
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.
$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
@@ -678,10 +691,10 @@ Describe ExportExcel {
$PC1 = $ptsheet1.Drawings[0]
$PC2 = $ptsheet2.Drawings[0]
it "Created the pivot tables linked to the right data. " {
$PT1.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref |
Should be ("A1:" + $ws1.Dimension.End.Address)
$PT2.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref |
Should be ("A2:" + $ws2.Dimension.End.Address) #Title in row 1
$PT1.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.name|
Should be "All_services"
$PT2.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.name |
Should be "Processes"
}
it "Set the other pivot tables and chart options from the definitions. " {
$pt1.PageFields[0].Name | Should be 'StartType'
@@ -705,8 +718,8 @@ Describe ExportExcel {
}
Context "#Example 13 # Formatting and another way to do a pivot. " {
$path = "$env:TEMP\Test.xlsx"
Remove-Item $path
$path = Join-Path $Env:TEMP "test.xlsx"
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
$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"]
@@ -734,8 +747,6 @@ Describe ExportExcel {
}
it "Applied the formating " {
$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(2).style.wraptext | Should be $true
$sheet.Column(2).width | Should be 29
@@ -758,6 +769,10 @@ Describe ExportExcel {
$sheet.ConditionalFormatting[2].Formula | Should be '104857600'
$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 " {
$sheet.Names.Count | Should be 7
$sheet.Names[0].Start.Column | Should be 1
@@ -785,7 +800,7 @@ Describe ExportExcel {
}
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
#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].PM | 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'
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" {
$path = "$env:TEMP\Test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
#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
#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
}
Context " # Quick line chart" {
$path = "$env:TEMP\Test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue
#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
@@ -901,11 +917,11 @@ Describe ExportExcel {
}
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
$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 |
Select-Object -Property Name, @{n="TotalPm";e={($_.group | Measure-Object -sum -Property pm).sum }} |
Export-Excel -NoHeader -AutoNameRange -path $path -ReturnRange -PieChart -ShowPercent
@@ -941,7 +957,8 @@ Describe ExportExcel {
}
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.
remove-item -Path $path -ErrorAction SilentlyContinue
$r = Get-ChildItem -path C:\WINDOWS\system32 -File
@@ -975,4 +992,91 @@ Describe ExportExcel {
}
}
Context " # Parameters and ParameterSets" {
$Path = join-path $env:TEMP "temp.xlsx"
Remove-Item -Path $Path -ErrorAction SilentlyContinue
$Processes = Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company
it "Default Set with Path".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Path $Path -PassThru
$Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should Be $Path
$Worksheet.Cells['A1'].Value | Should Be 'Name'
$Worksheet.Tables | Should BeNullOrEmpty
$Worksheet.AutoFilterAddress | Should BeNullOrEmpty
}
it "ExcelPackage Set. Path and (ExcelPackage or Now) should throw".PadRight(87) {
$ExcelPackage = Export-Excel -Path $Path -PassThru
{Export-Excel -ExcelPackage $ExcelPackage -Path $Path} | Should Throw 'Parameter set cannot be resolved using the specified named parameters'
{Export-Excel -ExcelPackage $ExcelPackage -Now} | Should Throw 'Parameter set cannot be resolved using the specified named parameters'
$Processes | Export-Excel -ExcelPackage $ExcelPackage
Remove-Item -Path $Path
}
it "If TableName and AutoFilter provided AutoFilter will be ignored".PadRight(87) {
$ExcelPackage = Export-Excel -Path $Path -PassThru -TableName 'Data' -AutoFilter
$Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$Worksheet.Tables[0].Name | Should Be 'Data'
$Worksheet.AutoFilterAddress | Should BeNullOrEmpty
}
it "Default Set with Path and TableName with generated name".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Path $Path -PassThru -TableName ''
$Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should Be $Path
$Worksheet.Tables[0].Name | Should Be 'Table1'
}
it "Now will use temp Path, set TableName with generated name".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru
$Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should BeLike ([IO.Path]::GetTempPath() + '*')
$Script:Worksheet.Tables[0].Name | Should Be 'Table1'
$Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty}
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) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru -Path $Path -TableName:$false
$Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$ExcelPackage.File | Should Be $Path
$Script:Worksheet.Tables | Should BeNullOrEmpty
$Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty
}
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 -CommandName 'Invoke-Item'
it "Now will Show".PadRight(87) {
$Processes | Export-Excel
Assert-MockCalled -CommandName 'Invoke-Item' -Times 1 -Exactly -Scope 'It'
}
it "Now allows override of Show".PadRight(87) {
$Processes | Export-Excel -Show:$false
Assert-MockCalled -CommandName 'Invoke-Item' -Times 0 -Exactly -Scope 'It'
}
#>
it "Now allows override of AutoSize and TableName to AutoFilter".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru -AutoSize:$false -AutoFilter
$Worksheet = $ExcelPackage.Workbook.Worksheets[1]
$Worksheet.Tables | Should BeNullOrEmpty
$Worksheet.AutoFilterAddress | Should Not BeNullOrEmpty
[math]::Round($Worksheet.Column(5).Width, 2) | Should Be 9.14
}
it "Now allows to set TableName".PadRight(87) {
$ExcelPackage = $Processes | Export-Excel -Now -PassThru -TableName 'Data'
$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
}
}

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
ConvertFrom-Csv @"
Product, City, Gross, Net
@@ -40,7 +41,7 @@ Describe "Creating workbook with a single line" {
}
}
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.PivotTables[0] | Should not beNullOrEmpty
$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].RowGrandTotals | Should be $true
$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 " {
$ws2.Drawings[0] | Should not beNullOrEmpty
$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"
Describe "Creating small named ranges with hyperlinks" {
BeforeAll {
$path = "$env:TEMP\Results.xlsx"
$path = Join-Path $Env:TEMP "results.xlsx"
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
$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
$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.End.Column | should be $columns
$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[1].Priority | Should be 1
$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.G | Should beLessThan 128
$sheet.ConditionalFormatting[3].HighValue.Color.R | Should beLessThan 128
$sheet.ConditionalFormatting[3].HighValue.Color.G | Should begreaterThan 180
}
} -Skip # << Bug in EPPLus 4.5
}
Context "Adding a table" {
it "Created a table " {

View File

@@ -5,15 +5,15 @@ Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
Describe "Check if Function aliases exist" {
It "Set-Column should exist" {
It "Set-Column should exist".PadRight(90) {
${Alias:Set-Column} | Should Not BeNullOrEmpty
}
It "Set-Row should exist" {
It "Set-Row should exist".PadRight(90) {
${Alias:Set-Row} | Should Not BeNullOrEmpty
}
It "Set-Format should exist" {
It "Set-Format should exist".PadRight(90) {
${Alias:Set-Format} | Should Not BeNullOrEmpty
}
@@ -21,7 +21,7 @@ Describe "Check if Function aliases exist" {
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
}

View File

@@ -1,5 +1,5 @@
Describe "ImportExcel File List" {
It "All files should exist" {
It "All files should exist".PadRight(90) {
$fileList = Get-Content "$PSScriptRoot\..\filelist.txt"
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
}
It "Should have items a and b" {
It "Should have items a and b".PadRight(90) {
$data[0].p1 | Should be "a"
$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
}
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 {
$null = Import-Excel $PSScriptRoot\LargerFile.xlsx
}
@@ -29,7 +29,7 @@ Describe "Tests" {
$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 {
$excel = Open-ExcelPackage $PSScriptRoot\Simple.xlsx
$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" {
BeforeAll {
$path = "$env:TEMP\Results.xlsx"
$path = Join-Path $Env:TEMP "results.xlsx"
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
$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
12001,Nails,37,3.99,147.63
12002,Hammer,5,12.10,60.5
@@ -24,7 +27,7 @@ ID,Product,Quantity,Price,Total
Describe "Join Worksheet part 1" {
BeforeAll {
$path = "$Env:TEMP\test.xlsx"
$path = Join-Path $Env:TEMP "test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue
$data1 | Export-Excel -Path $path -WorkSheetname Oxford
$data2 | Export-Excel -Path $path -WorkSheetname Abingdon
@@ -52,7 +55,7 @@ Describe "Join Worksheet part 1" {
it "Activated the correct worksheet " {
$excel.Workbook.worksheets["SummaryPivot"].View.TabSelected | Should be $true
$excel.Workbook.worksheets["Total"].View.TabSelected | Should be $false
}
} -Skip # << Bug in EPPLus 4.5
}
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
#switched to CIM objects so test runs on V6
Describe "Join Worksheet part 2" {
if ($notWindows) {Write-warning -message "Test only runs on Windows" ; return}
Get-CimInstance -ClassName win32_logicaldisk |
Select-Object -Property DeviceId,VolumeName, Size,Freespace |
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"

View File

@@ -1,4 +1,10 @@
Describe "Password Support" {

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

38
__tests__/Path.tests.ps1 Normal file
View File

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

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." {
if ($notWindows) {Write-warning -message "Test uses get-service so only works on Windows" ; return}
Context "Conditional Formatting" {
Remove-Item -path $path -ErrorAction SilentlyContinue
$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
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
Describe "Remove Worksheet" {
Context "Remove a worksheet output" {
@@ -10,7 +11,7 @@ Name,Age
Jane,10
John,20
"@
$xlFile1 = "$env:TEMP\RemoveWorsheet1.xlsx"
$xlFile1 = Join-Path $Env:TEMP "removeWorsheet1.xlsx"
Remove-Item $xlFile1 -ErrorAction SilentlyContinue
$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 Sheet1
$xlFile2 = "$env:TEMP\RemoveWorsheet2.xlsx"
$xlFile2 = Join-Path $Env:TEMP "removeWorsheet2.xlsx"
Remove-Item $xlFile2 -ErrorAction SilentlyContinue
$data | Export-Excel -Path $xlFile2 -WorksheetName Target1
@@ -27,11 +28,11 @@ John,20
$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'
}
it "Should delete Target2" {
it "Should delete Target2".PadRight(87) {
Remove-WorkSheet -Path $xlFile1 -WorksheetName Target2
$actual = Get-ExcelSheetInfo -Path $xlFile1
@@ -42,7 +43,7 @@ John,20
$actual[2].Name | Should Be "Sheet1"
}
it "Should delete Sheet1" {
it "Should delete Sheet1".PadRight(87) {
Remove-WorkSheet -Path $xlFile1
$actual = Get-ExcelSheetInfo -Path $xlFile1
@@ -53,7 +54,7 @@ John,20
$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
$actual = Get-ExcelSheetInfo -Path $xlFile1
@@ -63,9 +64,9 @@ John,20
$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

View File

@@ -1,5 +1,6 @@

$path = "$Env:TEMP\test.xlsx"
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" }
$path = Join-Path $Env:TEMP "test.xlsx"
$data = ConvertFrom-Csv -InputObject @"
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 @"
ID,Product,Quantity,Price,Total
12001,Nails,37,3.99,147.63
@@ -320,7 +321,7 @@ ID,Product,Quantity,Price,Total
Describe "AutoNameRange data with a single property name" {
BeforeEach {
$xlfile = "$Env:TEMP\testNamedRange.xlsx"
$xlfile = Join-Path $Env:TEMP "testNamedRange.xlsx"
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 @"
ID,Product,Quantity,Price
12001,Nails,37,3.99
@@ -7,7 +11,7 @@ ID,Product,Quantity,Price
12011,Crowbar,7,23.48
"@
$path = "$Env:TEMP\DataValidation.xlsx"
$path = Join-Path $Env:TEMP "DataValidation.xlsx"
Describe "Data validation and protection" {
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].Formula.ExcelFormula | Should be 'values!$a$1:$a$10'
$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 " {
$ws.DataValidations[1].ValidationType.Type.tostring() | Should be 'Whole'

BIN
__tests__/testRelative.xlsx Normal file

Binary file not shown.

View File

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

BIN
images/ChartTrendlines.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
images/Sparklines.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB