mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-13 06:43:17 +00:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99f742fa8c | ||
|
|
558070bb60 | ||
|
|
1e0dd763ca | ||
|
|
a783b9c8ca | ||
|
|
9abbe2983b | ||
|
|
0556e4947a | ||
|
|
859b1e5467 | ||
|
|
0f4e491076 | ||
|
|
b30a91d64f | ||
|
|
d1f794c933 | ||
|
|
a016f069a5 | ||
|
|
fb16ec4677 | ||
|
|
1a51d38c0f | ||
|
|
554163a911 | ||
|
|
efd8dcd60a | ||
|
|
1c77bd31b5 | ||
|
|
35e013fe1d | ||
|
|
8ac9927cfa | ||
|
|
9c305a1dae | ||
|
|
aa738629f7 | ||
|
|
c1a26f4f4b | ||
|
|
63f41ceaec | ||
|
|
b82888527f | ||
|
|
a3c71de190 | ||
|
|
f3a99f04ce | ||
|
|
f631a20269 | ||
|
|
dbd35721ee | ||
|
|
8759070636 | ||
|
|
6259b8d091 | ||
|
|
7086c3707c | ||
|
|
8b28172616 |
@@ -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}
|
||||
else {
|
||||
Write-Verbose -Message "Copying "
|
||||
$excel = Open-ExcelPackage -Path $SourceWorkbook
|
||||
if (-not $excel.Workbook.Worksheets[$Sourceworksheet]) {
|
||||
Write-Warning -Message "Could not find Worksheet $sourceWorksheet in $sourceWorkbook"
|
||||
Close-ExcelPackage -ExcelPackage $excel -NoSave
|
||||
return
|
||||
}
|
||||
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
|
||||
}
|
||||
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 {
|
||||
$null = Add-WorkSheet -ExcelPackage $Excel -WorkSheetname $DestinationWorkSheet -CopySource ($excel.Workbook.Worksheets[$SourceWorkSheet])
|
||||
Close-ExcelPackage -ExcelPackage $excel -Show:$Show
|
||||
return
|
||||
Write-Verbose -Message "Copying "
|
||||
$excel = Open-ExcelPackage -Path $SourceObject
|
||||
if (-not $excel.Workbook.Worksheets[$Sourceworksheet]) {
|
||||
Write-Warning -Message "Could not find Worksheet $sourceWorksheet in $SourceObject"
|
||||
Close-ExcelPackage -ExcelPackage $excel -NoSave
|
||||
return
|
||||
}
|
||||
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])
|
||||
Close-ExcelPackage -ExcelPackage $excel -Show:$Show
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
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 {
|
||||
$SourceObject = (Resolve-Path $SourceObject).ProviderPath
|
||||
try {
|
||||
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 $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 -isnot [OfficeOpenXml.ExcelWorkbook]) {
|
||||
Write-Warning "Not a valid workbook" ; return
|
||||
}
|
||||
#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}
|
||||
}
|
||||
if ($DestinationWorkbook.Worksheets[$DestinationWorksheet]) {
|
||||
Write-Verbose "Destination workbook already has a sheet named '$DestinationWorksheet', deleting it."
|
||||
$DestinationWorkbook.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 }
|
||||
}
|
||||
catch {Write-Warning -Message "Could not write to sheet '$DestinationWorksheet' in the destination workbook. Error was '$($_.exception.message)'" ; return}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ($SourceWorkbook -is [OfficeOpenXml.ExcelWorkbook]) {$sourcews = $SourceWorkbook.Worksheets[$SourceWorkSheet]}
|
||||
elseif ($SourceWorkbook -is [OfficeOpenXml.ExcelPackage] ) {$sourcews = $SourceWorkbook.Workbook.Worksheets[$SourceWorkSheet]}
|
||||
else {
|
||||
$SourceWorkbook = (Resolve-Path $SourceWorkbook).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
|
||||
$sourceWs = $Package1.Workbook.Worksheets[$SourceWorkSheet]
|
||||
}
|
||||
catch {Write-Warning -Message "Could not open $SourceWorkbook" ; 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
|
||||
}
|
||||
elseif ($DestinationWorkbook -is [OfficeOpenXml.ExcelPackage] ) {
|
||||
$wb = $DestinationWorkbook.workbook
|
||||
if ($show) {$package2 = $DestinationWorkbook}
|
||||
}
|
||||
else {
|
||||
$package2 = Open-ExcelPackage -Create -Path $DestinationWorkbook
|
||||
$wb = $package2.Workbook
|
||||
}
|
||||
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 $($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]) {
|
||||
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}
|
||||
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."
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
EPPlus.dll
BIN
EPPlus.dll
Binary file not shown.
89
Examples/CustomizeExportExcel/Out-Excel.ps1
Normal file
89
Examples/CustomizeExportExcel/Out-Excel.ps1
Normal 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
|
||||
|
||||
#>
|
||||
}
|
||||
25
Examples/Sparklines/SalesByQuarter.ps1
Normal file
25
Examples/Sparklines/SalesByQuarter.ps1
Normal 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
|
||||
99
Examples/Sparklines/Sparklines.ps1
Normal file
99
Examples/Sparklines/Sparklines.ps1
Normal 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
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
RootModule = 'ImportExcel.psm1'
|
||||
|
||||
# Version number of this module.
|
||||
ModuleVersion = '6.2.2'
|
||||
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',
|
||||
|
||||
@@ -360,8 +360,9 @@ function Import-Excel {
|
||||
}
|
||||
|
||||
$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
|
||||
|
||||
@@ -272,8 +272,11 @@
|
||||
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.
|
||||
if ($IncludePivotChart -and -not $wsPivot.Drawings["Chart$pivotTableName"] ) {
|
||||
|
||||
74
README.md
74
README.md
@@ -7,23 +7,19 @@ If this project helped you reduce the time to get your job done, let me know.
|
||||
|
||||

|
||||
|
||||
<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|[](https://dougfinke.visualstudio.com/ImportExcel/_build/latest?definitionId=10)|
|
||||
|Azure DevOps|Windows, Linux, Mac|[](https://dougfinke.visualstudio.com/ImportExcel/_build/latest?definitionId=20&branchName=master)|
|
||||
|Appveyor|Windows|[](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
|
||||

|
||||
|
||||
# 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,15 +50,56 @@ Install-Module ImportExcel -scope CurrentUser
|
||||
Install-Module ImportExcel
|
||||
```
|
||||
|
||||
# What's new 6.2.1
|
||||
# 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).
|
||||
|
||||

|
||||
|
||||
|
||||
# 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
|
||||
```
|
||||
|
||||

|
||||
|
||||
# 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)
|
||||
|
||||

|
||||
|
||||
# What's new 6.2.2
|
||||
|
||||
- Fixed Import-Excel and relative path issue, added unit tests.
|
||||
|
||||
# What's new 6.2.0
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
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)) }
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -60,29 +63,29 @@ Describe "Copy-Worksheet" {
|
||||
it "Copied the expected data into the worksheet " {
|
||||
$ws.Cells[2, 1].Value.Gettype().name | Should be 'DateTime'
|
||||
$ws.Cells[2, 2].Formula | Should be 'SUM(F2:G2)'
|
||||
$ws.Cells[2, 5].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 6].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 5].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 6].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 18].Value.GetType().name | Should be 'String'
|
||||
($ws.Cells[2, 11].Value -is [valuetype] ) | Should be $true
|
||||
($ws.Cells[2, 12].Value -is [valuetype] ) | Should be $true
|
||||
($ws.Cells[2, 13].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 11].Value | Should beLessThan 0
|
||||
$ws.Cells[2, 12].Value | Should beLessThan 0
|
||||
$ws.Cells[2, 13].Value | Should beLessThan 0
|
||||
($ws.Cells[2, 11].Value -is [valuetype] ) | Should be $true
|
||||
($ws.Cells[2, 12].Value -is [valuetype] ) | Should be $true
|
||||
($ws.Cells[2, 13].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 11].Value | Should beLessThan 0
|
||||
$ws.Cells[2, 12].Value | Should beLessThan 0
|
||||
$ws.Cells[2, 13].Value | Should beLessThan 0
|
||||
if ((Get-Culture).NumberFormat.NumberGroupSeparator -EQ ",") {
|
||||
($ws.Cells[2, 8].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 9].Value.GetType().name | Should be 'String'
|
||||
($ws.Cells[2, 8].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 9].Value.GetType().name | Should be 'String'
|
||||
}
|
||||
elseif ((Get-Culture).NumberFormat.NumberGroupSeparator -EQ ".") {
|
||||
($ws.Cells[2, 9].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 8].Value.GetType().name | Should be 'String'
|
||||
($ws.Cells[2, 9].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 8].Value.GetType().name | Should be 'String'
|
||||
}
|
||||
($ws.Cells[2, 14].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 15].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 16].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 17].Value.GetType().name | Should be 'String'
|
||||
($ws.Cells[2, 19].Value -is [valuetype] ) | Should be $true
|
||||
($ws.Cells[2, 20].Value -is [valuetype] ) | Should be $true
|
||||
($ws.Cells[2, 14].Value -is [valuetype] ) | Should be $true
|
||||
$ws.Cells[2, 15].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 16].Value.GetType().name | Should be 'String'
|
||||
$ws.Cells[2, 17].Value.GetType().name | Should be 'String'
|
||||
($ws.Cells[2, 19].Value -is [valuetype] ) | Should be $true
|
||||
($ws.Cells[2, 20].Value -is [valuetype] ) | Should be $true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -10,10 +11,10 @@ Banana, London , 300, 200
|
||||
Orange, Paris, 600, 500
|
||||
Banana, Paris, 300, 200
|
||||
Apple, New York, 1200,700
|
||||
|
||||
|
||||
"@ | Export-Excel -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"} -ExcelChartDefinition @{ChartType="Doughnut";XRange="A2:B7"; YRange="C2:C7"; width=800; } -PivotTableDefinition @{Sales=@{
|
||||
PivotRows="City"; PivotColumns="Product"; PivotData=@{Gross="Sum";Net="Sum"}; PivotNumberFormat="$#,##0.00"; PivotTotals="Both"; PivotTableStyle="Medium12"; Activate=$true
|
||||
|
||||
|
||||
PivotChartDefinition=@{Title="Gross and net by city and product"; ChartType="ColumnClustered"; Column=6; Width=600; Height=360; YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"; LegendPosition="Bottom"}}}
|
||||
|
||||
$excel = Open-ExcelPackage $path
|
||||
@@ -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
|
||||
|
||||
@@ -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 " {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -1,24 +1,29 @@
|
||||
Describe "Password Support" {
|
||||
Context "Password protected sheet" {
|
||||
BeforeAll {
|
||||
$password = "YouMustRememberThis"
|
||||
$path = "$env:TEMP\Test.xlsx"
|
||||
|
||||
|
||||
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"
|
||||
$path = "$env:TEMP\Test.xlsx"
|
||||
Remove-Item $path -ErrorAction SilentlyContinue
|
||||
Get-Service | Select-Object -First 10 | Export-excel -password $password -Path $Path -DisplayPropertySet
|
||||
Get-Service | Select-Object -First 10 | Export-excel -password $password -Path $Path -DisplayPropertySet
|
||||
}
|
||||
it "Threw an error when the password was omitted " {
|
||||
{Open-ExcelPackage -Path $path } | should throw
|
||||
}
|
||||
it "Was able to append when the password was included " {
|
||||
{Get-Service | Select-Object -First 10 |
|
||||
{Get-Service | Select-Object -First 10 |
|
||||
Export-excel -password $password -Path $Path -Append } | should not throw
|
||||
}
|
||||
it "Kept the password on the file when it was saved " {
|
||||
{Import-Excel $Path } | should throw
|
||||
{Import-Excel $Path } | should throw
|
||||
}
|
||||
it "Could read the file when the password was included " {
|
||||
(import-excel $path -Password $password).count | should be 20
|
||||
it "Could read the file when the password was included " {
|
||||
(import-excel $path -Password $password).count | should be 20
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
Describe "Test reading relative paths" {
|
||||
BeforeAll {
|
||||
$script:xlfileName = "TestR.xlsx"
|
||||
@{data = 1 } | Export-Excel "$pwd\TestR.xlsx"
|
||||
@{data = 1 } | Export-Excel (Join-Path $PWD "TestR.xlsx")
|
||||
}
|
||||
|
||||
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 | Should Not Be $null
|
||||
$actual.Count | Should Be 1
|
||||
}
|
||||
|
||||
It "Should read with pwd" {
|
||||
$actual = Import-Excel -Path "$pwd\$($script:xlfileName)"
|
||||
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" {
|
||||
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" {
|
||||
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" {
|
||||
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" {
|
||||
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"
|
||||
}
|
||||
}
|
||||
39
__tests__/ProtectWorksheet.tests.ps1
Normal file
39
__tests__/ProtectWorksheet.tests.ps1
Normal 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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -1,15 +1,44 @@
|
||||
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:
|
||||
exclude:
|
||||
- README.md
|
||||
- README.md
|
||||
|
||||
BIN
images/ImproveNowDefaults.png
Normal file
BIN
images/ImproveNowDefaults.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
BIN
images/Sparklines.png
Normal file
BIN
images/Sparklines.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 176 KiB |
Reference in New Issue
Block a user