mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-06 00:23:20 +00:00
Compare commits
279 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c641eea10a | ||
|
|
99de9a9854 | ||
|
|
3121c5eaed | ||
|
|
d02f757568 | ||
|
|
a693725949 | ||
|
|
5e19d0ca1a | ||
|
|
204b82144f | ||
|
|
91eefbd48b | ||
|
|
f86556a89d | ||
|
|
14e1dfd8db | ||
|
|
1d961c679e | ||
|
|
7026803415 | ||
|
|
e486135c4f | ||
|
|
80d9cb1290 | ||
|
|
d82c01eabf | ||
|
|
2fcb7a57a2 | ||
|
|
afe7e545f6 | ||
|
|
88638a87a9 | ||
|
|
0f354be443 | ||
|
|
abebb9af11 | ||
|
|
d8ae8b1abc | ||
|
|
30fc53857d | ||
|
|
04b7895d1e | ||
|
|
7f72aa9e86 | ||
|
|
70ab9e46c7 | ||
|
|
49e355b702 | ||
|
|
82a8536e47 | ||
|
|
35246d51e7 | ||
|
|
9dafe170f1 | ||
|
|
0d29fd813d | ||
|
|
c685ad767c | ||
|
|
f283ada708 | ||
|
|
bb3923aabf | ||
|
|
fa0b3ca79b | ||
|
|
53f8acda90 | ||
|
|
ca586fc2d5 | ||
|
|
4c5f1a967e | ||
|
|
f237861e1a | ||
|
|
282d650072 | ||
|
|
6149442bc0 | ||
|
|
113bf2c95c | ||
|
|
27e8130e6c | ||
|
|
c19e219a44 | ||
|
|
795b2017b5 | ||
|
|
cb749dff07 | ||
|
|
fd6b847d77 | ||
|
|
c6d9104d52 | ||
|
|
df157b22ab | ||
|
|
95822ac2e9 | ||
|
|
c4d20a9a28 | ||
|
|
8a20963577 | ||
|
|
c30e03a47f | ||
|
|
0a77a83e35 | ||
|
|
66f6a5fa0b | ||
|
|
a3921f5298 | ||
|
|
1823f1dde0 | ||
|
|
5d5ca57f4b | ||
|
|
11d591aad6 | ||
|
|
9841ef9436 | ||
|
|
ae1fa04334 | ||
|
|
a7861ee57d | ||
|
|
24ca7a4d86 | ||
|
|
51b23323fa | ||
|
|
001aabf526 | ||
|
|
a5a98d5c92 | ||
|
|
070d40b5af | ||
|
|
c4b3556c5d | ||
|
|
8151ed4305 | ||
|
|
6959cffa24 | ||
|
|
6be2195680 | ||
|
|
ff77606430 | ||
|
|
a874e1385e | ||
|
|
f8b9cf7251 | ||
|
|
5588c0306c | ||
|
|
359f7453c5 | ||
|
|
933abf6539 | ||
|
|
6a32da7f92 | ||
|
|
c3ac68ea2c | ||
|
|
5ea9b1d082 | ||
|
|
ae64a884fc | ||
|
|
b584b22f5f | ||
|
|
eb3a7d3f2d | ||
|
|
3130020e20 | ||
|
|
fe68ddbb0d | ||
|
|
1ce65a0758 | ||
|
|
13454cce8e | ||
|
|
96b61d38f1 | ||
|
|
59e31d54a7 | ||
|
|
6bf16f75f7 | ||
|
|
c547713ee9 | ||
|
|
f0ec5f4a96 | ||
|
|
7ded94e225 | ||
|
|
4141ba690e | ||
|
|
08ecadddb2 | ||
|
|
e42f42fde9 | ||
|
|
12fa49e314 | ||
|
|
98ce564929 | ||
|
|
7e75ecd0fb | ||
|
|
17ec040055 | ||
|
|
e65210e378 | ||
|
|
7bfb28d10f | ||
|
|
08fbfc35a3 | ||
|
|
4315ddc702 | ||
|
|
97611fc57c | ||
|
|
118330ea47 | ||
|
|
6f48219819 | ||
|
|
9d1a544e77 | ||
|
|
e836928571 | ||
|
|
718bf951b7 | ||
|
|
08dd30696e | ||
|
|
7b51d2f340 | ||
|
|
b3932f0a13 | ||
|
|
84140d757a | ||
|
|
ce8a070673 | ||
|
|
ed41c20f63 | ||
|
|
28e3fe1cd8 | ||
|
|
ed7f43bab3 | ||
|
|
f695e7cc63 | ||
|
|
5757302a6e | ||
|
|
8ccf2799e1 | ||
|
|
c9116c2d18 | ||
|
|
88e0a449c7 | ||
|
|
65754d27cc | ||
|
|
3e10d03b62 | ||
|
|
1be2f82456 | ||
|
|
86f13e1d6f | ||
|
|
40a50ad78b | ||
|
|
5220e7c188 | ||
|
|
d45d90c8a1 | ||
|
|
f5a29b45df | ||
|
|
fb4fb57751 | ||
|
|
300960fd9b | ||
|
|
2e56012408 | ||
|
|
4f17fc36bc | ||
|
|
6be0961d17 | ||
|
|
2bcb332ec7 | ||
|
|
469586e94a | ||
|
|
a9b1a128cd | ||
|
|
dec579a966 | ||
|
|
ce4270babd | ||
|
|
d83a468fa9 | ||
|
|
9b385e72c6 | ||
|
|
4fee745a7f | ||
|
|
8b5fa9e798 | ||
|
|
4608c0bd04 | ||
|
|
c0b3297bd7 | ||
|
|
1baed182c3 | ||
|
|
270a5d921c | ||
|
|
a1ef937619 | ||
|
|
481e2c6cc8 | ||
|
|
0bf85de2a2 | ||
|
|
1667ba33eb | ||
|
|
b534bd974b | ||
|
|
d89346c89c | ||
|
|
229f69313b | ||
|
|
a37f6f3754 | ||
|
|
88e2a23e1b | ||
|
|
6b033d7451 | ||
|
|
d1c347285f | ||
|
|
6508043bc0 | ||
|
|
163eaebf66 | ||
|
|
5e87c3f6a7 | ||
|
|
feb493e397 | ||
|
|
f6c66e21a7 | ||
|
|
02d2fa9975 | ||
|
|
eb3a394013 | ||
|
|
b517b0a974 | ||
|
|
d56fd89557 | ||
|
|
9d2a1e4d47 | ||
|
|
5f3c41e669 | ||
|
|
d4da73e8f4 | ||
|
|
0d0fd5ac80 | ||
|
|
3fb3ba0e0e | ||
|
|
e49b4ee6e8 | ||
|
|
5595aee407 | ||
|
|
c38adba49d | ||
|
|
30e4515287 | ||
|
|
e42f23cd7c | ||
|
|
5fee49967a | ||
|
|
98b91ce19d | ||
|
|
5aa841c225 | ||
|
|
aaf18b4d9a | ||
|
|
2e0cd4f97d | ||
|
|
e132755061 | ||
|
|
5617a960ec | ||
|
|
873f1a365b | ||
|
|
cc7d18cc59 | ||
|
|
f27729d2ab | ||
|
|
d3a2edcc5f | ||
|
|
cc5eff1157 | ||
|
|
66bf3adf17 | ||
|
|
36f27e3d40 | ||
|
|
a7104b729c | ||
|
|
2ef632ad32 | ||
|
|
43927ca078 | ||
|
|
1f767338f2 | ||
|
|
6d97018de6 | ||
|
|
6f2e7d682b | ||
|
|
07b36e5e56 | ||
|
|
16bc380b65 | ||
|
|
d378674d30 | ||
|
|
5959a97439 | ||
|
|
3def13e1d9 | ||
|
|
e2c6495340 | ||
|
|
ef6defd75c | ||
|
|
076a494523 | ||
|
|
031c9b9c73 | ||
|
|
321699e427 | ||
|
|
98b82fc3ba | ||
|
|
394210d41f | ||
|
|
9afc1dbec2 | ||
|
|
7e684b87e3 | ||
|
|
6b9aed612c | ||
|
|
2647081312 | ||
|
|
e6827ba2c5 | ||
|
|
c6b188f915 | ||
|
|
3f79a43dc4 | ||
|
|
53e57b25a6 | ||
|
|
b87fcf6c08 | ||
|
|
35066c0f5d | ||
|
|
912fc35693 | ||
|
|
2711ad5522 | ||
|
|
79c3077162 | ||
|
|
24ca8da4c3 | ||
|
|
6b626e8f5f | ||
|
|
4d17a09537 | ||
|
|
065fc2f1ad | ||
|
|
c71afe802e | ||
|
|
3284f592b9 | ||
|
|
5d92442488 | ||
|
|
fb9a592e9e | ||
|
|
d2a378ffda | ||
|
|
463944ae2d | ||
|
|
34fe2f429a | ||
|
|
f65e198986 | ||
|
|
9e92f2dbc6 | ||
|
|
e45c07c40b | ||
|
|
fbae59b386 | ||
|
|
e3f3ae74a4 | ||
|
|
fda61ca10f | ||
|
|
29efd505ed | ||
|
|
600d95199c | ||
|
|
1ad80825ca | ||
|
|
a2b322d45c | ||
|
|
bb9aa9233b | ||
|
|
591b854e2b | ||
|
|
15eb2130b5 | ||
|
|
ea8927394f | ||
|
|
cfd89f5afc | ||
|
|
3a6946466f | ||
|
|
89a59b1eba | ||
|
|
8047631014 | ||
|
|
9458a29a6b | ||
|
|
ab2405edad | ||
|
|
d1592f8739 | ||
|
|
6650ecd5b8 | ||
|
|
b27f6bec3c | ||
|
|
99f742fa8c | ||
|
|
558070bb60 | ||
|
|
1e0dd763ca | ||
|
|
a783b9c8ca | ||
|
|
9abbe2983b | ||
|
|
0556e4947a | ||
|
|
859b1e5467 | ||
|
|
0f4e491076 | ||
|
|
b30a91d64f | ||
|
|
d1f794c933 | ||
|
|
a016f069a5 | ||
|
|
fb16ec4677 | ||
|
|
1a51d38c0f | ||
|
|
554163a911 | ||
|
|
efd8dcd60a | ||
|
|
1c77bd31b5 | ||
|
|
35e013fe1d | ||
|
|
8ac9927cfa | ||
|
|
9c305a1dae | ||
|
|
aa738629f7 | ||
|
|
c1a26f4f4b | ||
|
|
63f41ceaec |
17
.github/stale.yml
vendored
Normal file
17
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 30
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- pinned
|
||||
- security
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: wontfix
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -60,7 +60,9 @@ test.xlsx
|
||||
testCCFMT.ps1
|
||||
testHide.ps1
|
||||
ImportExcel.zip
|
||||
.vscode/launch.json
|
||||
.vscode/settings.json
|
||||
|
||||
~$*
|
||||
# InstallModule.ps1
|
||||
# PublishToGallery.ps1
|
||||
.vscode/*
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
Function Add-ExcelDataValidationRule {
|
||||
<#
|
||||
.Synopsis
|
||||
Adds data validation to a range of cells
|
||||
.Example
|
||||
>
|
||||
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'E2:E1001' -ValidationType Integer -Operator between -Value 0 -Value2 100 `
|
||||
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody 'Percentage must be a whole number between 0 and 100'
|
||||
|
||||
This defines a validation rule on cells E2-E1001; it is an integer rule and requires a number between 0 and 100
|
||||
If a value is input with a fraction, negative number, or positive number > 100 a stop dialog box appears.
|
||||
.Example
|
||||
>
|
||||
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'B2:B1001' -ValidationType List -Formula 'values!$a$2:$a$1000'
|
||||
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody 'You must select an item from the list'
|
||||
This defines a list rule on Cells B2:1001, and the posible values are in a sheet named "values" at cells A2 to A1000
|
||||
Blank cells in this range are ignored. If $ signs are left out of the fomrmula B2 would be checked against A2-A1000
|
||||
B3, against A3-A1001, B4 against A4-A1002 up to B1001 beng checked against A1001-A1999
|
||||
.Example
|
||||
>
|
||||
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'I2:N1001' -ValidationType List -ValueSet @('yes','YES','Yes')
|
||||
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody "Select Yes or leave blank for no"
|
||||
Similar to the previous example but this time provides a value set; Excel comparisons are case sesnsitive, hence 3 versions of Yes.
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
Param(
|
||||
#The range of cells to be validate, e.g. "B2:C100"
|
||||
[Parameter(ValueFromPipeline = $true,Position=0)]
|
||||
[Alias("Address")]
|
||||
$Range ,
|
||||
#The worksheet where the cells should be validated
|
||||
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
|
||||
#An option corresponding to a choice from the 'Allow' pull down on the settings page in the Excel dialog. Any means "any allowed" i.e. no Validation
|
||||
[ValidateSet('Any','Custom','DateTime','Decimal','Integer','List','TextLength','Time')]
|
||||
$ValidationType,
|
||||
#The operator to apply to Decimal, Integer, TextLength, DateTime and time fields, e.g. equal, between
|
||||
[OfficeOpenXml.DataValidation.ExcelDataValidationOperator]$Operator = [OfficeOpenXml.DataValidation.ExcelDataValidationOperator]::equal ,
|
||||
#For Decimal, Integer, TextLength, DateTime the [first] data value
|
||||
$Value,
|
||||
#When using the between operator, the second data value
|
||||
$Value2,
|
||||
#The [first] data value as a formula. Use absolute formulas $A$1 if (e.g.) you want all cells to check against the same list
|
||||
$Formula,
|
||||
#When using the between operator, the second data value as a formula
|
||||
$Formula2,
|
||||
#When using the list validation type, a set of values (rather than refering to Sheet!B$2:B$100 )
|
||||
$ValueSet,
|
||||
#Corresponds to the the 'Show Error alert ...' check box on error alert page in the Excel dialog
|
||||
[switch]$ShowErrorMessage,
|
||||
#Stop, Warning, or Infomation, corresponding to to the style setting in the Excel dialog
|
||||
[OfficeOpenXml.DataValidation.ExcelDataValidationWarningStyle]$ErrorStyle,
|
||||
#The title for the message box corresponding to to the title setting in the Excel dialog
|
||||
[String]$ErrorTitle,
|
||||
#The error message corresponding to to the Error message setting in the Excel dialog
|
||||
[String]$ErrorBody,
|
||||
#Corresponds to the the 'Show Input message ...' check box on input message page in the Excel dialog
|
||||
[switch]$ShowPromptMessage,
|
||||
#The prompt message corresponding to to the Input message setting in the Excel dialog
|
||||
[String]$PromptBody,
|
||||
#The title for the message box corresponding to to the title setting in the Excel dialog
|
||||
[String]$PromptTitle,
|
||||
#By default the 'Ignore blank' option will be selected, unless NoBlank is sepcified.
|
||||
[String]$NoBlank
|
||||
)
|
||||
if ($Range -is [Array]) {
|
||||
$null = $PSBoundParameters.Remove("Range")
|
||||
$Range | Add-ExcelDataValidationRule @PSBoundParameters
|
||||
}
|
||||
else {
|
||||
#We should accept, a worksheet and a name of a range or a cell address; a table; the address of a table; a named range; a row, a column or .Cells[ ]
|
||||
if (-not $WorkSheet -and $Range.worksheet) {$WorkSheet = $Range.worksheet}
|
||||
if ($Range.Address) {$Range = $Range.Address}
|
||||
|
||||
if ($Range -isnot [string] -or -not $WorkSheet) {Write-Warning -Message "You need to provide a worksheet and range of cells." ;return}
|
||||
#else we assume Range is a range.
|
||||
|
||||
$validation = $WorkSheet.DataValidations."Add$ValidationType`Validation"($Range)
|
||||
if ($validation.AllowsOperator) {$validation.Operator = $Operator}
|
||||
if ($PSBoundParameters.ContainsKey('value')) {
|
||||
$validation.Formula.Value = $Value
|
||||
}
|
||||
elseif ($Formula) {$validation.Formula.ExcelFormula = $Formula}
|
||||
elseif ($ValueSet) {Foreach ($v in $ValueSet) {$validation.Formula.Values.Add($V)}}
|
||||
if ($PSBoundParameters.ContainsKey('Value2')) {
|
||||
$validation.Formula2.Value = $Value2
|
||||
}
|
||||
elseif ($Formula2) {$validation.Formula2.ExcelFormula = $Formula}
|
||||
$validation.ShowErrorMessage = [bool]$ShowErrorMessage
|
||||
$validation.ShowInputMessage = [bool]$ShowPromptMessage
|
||||
$validation.AllowBlank = -not $NoBlank
|
||||
|
||||
if ($PromptTitle) {$validation.PromptTitle = $PromptTitle}
|
||||
if ($ErrorTitle) {$validation.ErrorTitle = $ErrorTitle}
|
||||
if ($PromptBody) {$validation.Prompt = $PromptBody}
|
||||
if ($ErrorBody) {$validation.Error = $ErrorBody}
|
||||
if ($ErrorStyle) {$validation.ErrorStyle = $ErrorStyle}
|
||||
}
|
||||
}
|
||||
228
CI/CI.ps1
Normal file
228
CI/CI.ps1
Normal file
@@ -0,0 +1,228 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Handel Continuous Integration Testing in AppVeyor and Azure DevOps Pipelines.
|
||||
#>
|
||||
param
|
||||
(
|
||||
# AppVeyor Only - Update AppVeyor build name.
|
||||
[Switch]$Initialize,
|
||||
# Installs the module and invoke the Pester tests with the current version of PowerShell.
|
||||
[Switch]$Test,
|
||||
# AppVeyor Only - Upload results to AppVeyor "Tests" tab.
|
||||
[Switch]$Finalize,
|
||||
# AppVeyor and Azure - Upload module as AppVeyor Artifact.
|
||||
[Switch]$Artifact,
|
||||
# Azure - Runs PsScriptAnalyzer against one or more folders and pivots the results to form a report.
|
||||
[Switch]$Analyzer,
|
||||
# Installs the module and invokes only the ModuleImport test.
|
||||
# Used for validating that the module imports still when external dependencies are missing, e.g. mono-libgdiplus on macOS.
|
||||
[Switch]$TestImportOnly
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
if ($Initialize) {
|
||||
$Psd1 = (Get-ChildItem -File -Filter *.psd1 -Name -Path (Split-Path $PSScriptRoot)).PSPath
|
||||
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion
|
||||
Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH"
|
||||
}
|
||||
if ($Test -or $TestImportOnly) {
|
||||
function Get-EnvironmentInfo {
|
||||
if ([environment]::OSVersion.Platform -like "win*") {
|
||||
# Get Windows Version
|
||||
try {
|
||||
$WinRelease, $WinVer = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR
|
||||
$WindowsVersion = "$($WinVer -join '.') ($WinRelease)"
|
||||
}
|
||||
catch {
|
||||
$WindowsVersion = [System.Environment]::OSVersion.Version
|
||||
}
|
||||
#TODO FIXME BUG this gets the latest version of the .NET Framework on the machine (ok for powershell.exe), not the version of .NET CORE in use by PWSH.EXE
|
||||
<#
|
||||
$VersionFilePath = (Get-Process -Id $PID | Select-Object -ExpandProperty Modules |
|
||||
Where-Object -Property modulename -eq "clrjit.dll").FileName
|
||||
if (-not $VersionFilePath) {
|
||||
$VersionFilePath = [System.Reflection.Assembly]::LoadWithPartialName("System.Core").location
|
||||
}
|
||||
(Get-ItemProperty -Path $VersionFilePath).VersionInfo |
|
||||
Select-Object -Property @{n="Version"; e={$_.ProductName + " " + $_.FileVersion}}, ProductName, FileVersionRaw, FileName
|
||||
#>
|
||||
|
||||
# Get .Net Version
|
||||
# https://stackoverflow.com/questions/3487265/powershell-script-to-return-versions-of-net-framework-on-a-machine
|
||||
$Lookup = @{
|
||||
378389 = [version]'4.5'
|
||||
378675 = [version]'4.5.1'
|
||||
378758 = [version]'4.5.1'
|
||||
379893 = [version]'4.5.2'
|
||||
393295 = [version]'4.6'
|
||||
393297 = [version]'4.6'
|
||||
394254 = [version]'4.6.1'
|
||||
394271 = [version]'4.6.1'
|
||||
394802 = [version]'4.6.2'
|
||||
394806 = [version]'4.6.2'
|
||||
460798 = [version]'4.7'
|
||||
460805 = [version]'4.7'
|
||||
461308 = [version]'4.7.1'
|
||||
461310 = [version]'4.7.1'
|
||||
461808 = [version]'4.7.2'
|
||||
461814 = [version]'4.7.2'
|
||||
528040 = [version]'4.8'
|
||||
528049 = [version]'4.8'
|
||||
}
|
||||
|
||||
# For One True framework (latest .NET 4x), change the Where-Object match
|
||||
# to PSChildName -eq "Full":
|
||||
$DotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
|
||||
Get-ItemProperty -name Version, Release -EA 0 |
|
||||
Where-Object { $_.PSChildName -eq "Full" } |
|
||||
Select-Object @{name = ".NET Framework"; expression = { $_.PSChildName } },
|
||||
@{name = "Product"; expression = { $Lookup[$_.Release] } },
|
||||
Version, Release
|
||||
|
||||
# Output
|
||||
[PSCustomObject]($PSVersionTable + @{
|
||||
ComputerName = $env:Computername
|
||||
WindowsVersion = $WindowsVersion
|
||||
'.Net Version' = '{0} (Version: {1}, Release: {2})' -f $DotNetVersion.Product, $DotNetVersion.Version, $DotNetVersion.Release
|
||||
#EnvironmentPath = $env:Path
|
||||
})
|
||||
}
|
||||
else {
|
||||
# Output
|
||||
[PSCustomObject]($PSVersionTable + @{
|
||||
ComputerName = $env:Computername
|
||||
#EnvironmentPath = $env:Path
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
'[Info] Testing On:'
|
||||
Get-EnvironmentInfo
|
||||
'[Progress] Installing Module.'
|
||||
. .\CI\Install.ps1
|
||||
'[Progress] Invoking Pester.'
|
||||
$pesterParams = @{
|
||||
OutputFile = ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
|
||||
PassThru = $true
|
||||
}
|
||||
if ($TestImportOnly) {
|
||||
$pesterParams['Tag'] = 'TestImportOnly'
|
||||
}
|
||||
else {
|
||||
$pesterParams['ExcludeTag'] = 'TestImportOnly'
|
||||
}
|
||||
$testResults = Invoke-Pester @pesterParams
|
||||
'Pester invocation complete!'
|
||||
if ($testResults.FailedCount -gt 0) {
|
||||
"Test failures:"
|
||||
$testResults.TestResult | Where-Object {-not $_.Passed} | Format-List
|
||||
Write-Error "$($testResults.FailedCount) Pester tests failed. Build cannot continue!"
|
||||
}
|
||||
}
|
||||
if ($Finalize) {
|
||||
'[Progress] Finalizing.'
|
||||
$Failure = $false
|
||||
$AppVeyorResultsUri = 'https://ci.appveyor.com/api/testresults/nunit/{0}' -f $env:APPVEYOR_JOB_ID
|
||||
foreach ($TestResultsFile in Get-ChildItem -Path 'TestResultsPS*.xml') {
|
||||
$TestResultsFilePath = $TestResultsFile.FullName
|
||||
"[Info] Uploading Files: $AppVeyorResultsUri, $TestResultsFilePath."
|
||||
# Add PowerShell version to test results
|
||||
$PSVersion = $TestResultsFile.Name.Replace('TestResults', '').Replace('.xml', '')
|
||||
[Xml]$Xml = Get-Content -Path $TestResultsFilePath
|
||||
Select-Xml -Xml $Xml -XPath '//test-case' | ForEach-Object { $_.Node.name = "$PSVersion " + $_.Node.name }
|
||||
$Xml.OuterXml | Out-File -FilePath $TestResultsFilePath
|
||||
|
||||
#Invoke-RestMethod -Method Post -Uri $AppVeyorResultsUri -Body $Xml
|
||||
[Net.WebClient]::new().UploadFile($AppVeyorResultsUri, $TestResultsFilePath)
|
||||
|
||||
if ($Xml.'test-results'.failures -ne '0') {
|
||||
$Failure = $true
|
||||
}
|
||||
}
|
||||
if ($Failure) {
|
||||
throw 'Tests failed.'
|
||||
}
|
||||
}
|
||||
if ($Artifact) {
|
||||
# Get Module Info
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $PSScriptRoot)))
|
||||
$ModulePath = (Get-Module -Name $ModuleName -ListAvailable).ModuleBase | Split-Path
|
||||
$VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum
|
||||
"[Progress] Artifact Start for Module: $ModuleName, Version: $VersionLocal."
|
||||
if ($env:APPVEYOR) {
|
||||
$ZipFileName = "{0} {1} {2} {3:yyyy-MM-dd HH-mm-ss}.zip" -f $ModuleName, $VersionLocal, $env:APPVEYOR_REPO_BRANCH, (Get-Date)
|
||||
$ZipFileName = $ZipFileName -replace ("[{0}]" -f [RegEx]::Escape([IO.Path]::GetInvalidFileNameChars() -join ''))
|
||||
$ZipFileFullPath = Join-Path -Path $PSScriptRoot -ChildPath $ZipFileName
|
||||
"[Info] Artifact. $ModuleName, ZipFileName: $ZipFileName."
|
||||
#Compress-Archive -Path $ModulePath -DestinationPath $ZipFileFullPath
|
||||
[System.IO.Compression.ZipFile]::CreateFromDirectory($ModulePath, $ZipFileFullPath, [System.IO.Compression.CompressionLevel]::Optimal, $true)
|
||||
Push-AppveyorArtifact $ZipFileFullPath -DeploymentName $ModuleName
|
||||
}
|
||||
elseif ($env:AGENT_NAME) {
|
||||
#Write-Host "##vso[task.setvariable variable=ModuleName]$ModuleName"
|
||||
Copy-Item -Path $ModulePath -Destination $env:Build_ArtifactStagingDirectory -Recurse
|
||||
}
|
||||
}
|
||||
if ($Analyzer) {
|
||||
if (!(Get-Module -Name PSScriptAnalyzer -ListAvailable)) {
|
||||
'[Progress] Installing PSScriptAnalyzer.'
|
||||
Install-Module -Name PSScriptAnalyzer -Force
|
||||
}
|
||||
|
||||
if ($env:System_PullRequest_TargetBranch) {
|
||||
'[Progress] Get target branch.'
|
||||
$TempGitClone = Join-Path ([IO.Path]::GetTempPath()) (New-Guid)
|
||||
Copy-Item -Path $PWD -Destination $TempGitClone -Recurse
|
||||
(Get-Item (Join-Path $TempGitClone '.git')).Attributes += 'Hidden'
|
||||
"[Progress] git clean."
|
||||
git -C $TempGitClone clean -f
|
||||
"[Progress] git reset."
|
||||
git -C $TempGitClone reset --hard
|
||||
"[Progress] git checkout."
|
||||
git -C $TempGitClone checkout -q $env:System_PullRequest_TargetBranch
|
||||
|
||||
$DirsToProcess = @{ 'Pull Request' = $PWD ; $env:System_PullRequest_TargetBranch = $TempGitClone }
|
||||
}
|
||||
else {
|
||||
$DirsToProcess = @{ 'GitHub' = $PWD }
|
||||
}
|
||||
|
||||
"[Progress] Running Script Analyzer."
|
||||
$AnalyzerResults = $DirsToProcess.GetEnumerator() | ForEach-Object {
|
||||
$DirName = $_.Key
|
||||
Write-Verbose "[Progress] Running Script Analyzer on $DirName."
|
||||
Invoke-ScriptAnalyzer -Path $_.Value -Recurse -ErrorAction SilentlyContinue |
|
||||
Add-Member -MemberType NoteProperty -Name Location -Value $DirName -PassThru
|
||||
}
|
||||
|
||||
if ($AnalyzerResults) {
|
||||
if (!(Get-Module -Name ImportExcel -ListAvailable)) {
|
||||
'[Progress] Installing ImportExcel.'
|
||||
Install-Module -Name ImportExcel -Force
|
||||
}
|
||||
'[Progress] Creating ScriptAnalyzer.xlsx.'
|
||||
$ExcelParams = @{
|
||||
Path = 'ScriptAnalyzer.xlsx'
|
||||
WorksheetName = 'FullResults'
|
||||
Now = $true
|
||||
Activate = $true
|
||||
Show = $false
|
||||
}
|
||||
$PivotParams = @{
|
||||
PivotTableName = 'BreakDown'
|
||||
PivotData = @{RuleName = 'Count' }
|
||||
PivotRows = 'Severity', 'RuleName'
|
||||
PivotColumns = 'Location'
|
||||
PivotTotals = 'Rows'
|
||||
}
|
||||
Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue
|
||||
|
||||
$PivotParams['PivotChartDefinition'] = New-ExcelChartDefinition -ChartType 'BarClustered' -Column (1 + $DirsToProcess.Count) -Title "Script analysis" -LegendBold
|
||||
$ExcelParams['PivotTableDefinition'] = New-PivotTableDefinition @PivotParams
|
||||
|
||||
$AnalyzerResults | Export-Excel @ExcelParams
|
||||
'[Progress] Analyzer finished.'
|
||||
}
|
||||
else {
|
||||
"[Info] Invoke-ScriptAnalyzer didn't return any problems."
|
||||
}
|
||||
}
|
||||
191
CI/Install.ps1
Normal file
191
CI/Install.ps1
Normal file
@@ -0,0 +1,191 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs module from Git clone or directly from GitHub.
|
||||
File must not have BOM for GitHub deploy to work.
|
||||
#>
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||
param(
|
||||
# Path to install the module to, if not provided -Scope used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'ModulePath')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModulePath,
|
||||
|
||||
# Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'Scope')]
|
||||
[ValidateSet('CurrentUser', 'AllUsers')]
|
||||
[string]
|
||||
$Scope = 'CurrentUser',
|
||||
|
||||
# Get module from GitHub instead of local Git clone, for example "https://raw.githubusercontent.com/ili101/Module.Template/master/Install.ps1"
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[Uri]$FromGitHub
|
||||
)
|
||||
# Set Files and Folders patterns to Include/Exclude.
|
||||
$IncludeFiles = @(
|
||||
'EPPlus.dll',
|
||||
'*.psd1',
|
||||
'*.psm1',
|
||||
'*.ps1'
|
||||
'Charting',
|
||||
'en-US',
|
||||
'Examples',
|
||||
'Public',
|
||||
'Private',
|
||||
'images',
|
||||
'InferData',
|
||||
'InternalFunctions',
|
||||
'Pivot',
|
||||
'spikes',
|
||||
'Testimonials',
|
||||
'README.md',
|
||||
'LICENSE.txt'
|
||||
)
|
||||
$ExcludeFiles = @(
|
||||
'Install.ps1',
|
||||
'InstallModule.ps1',
|
||||
'PublishToGallery.PS1'
|
||||
)
|
||||
|
||||
|
||||
function Invoke-MultiLike {
|
||||
[alias("LikeAny")]
|
||||
[CmdletBinding()]
|
||||
param
|
||||
(
|
||||
$InputObject,
|
||||
[Parameter(Mandatory)]
|
||||
[String[]]$Filters,
|
||||
[Switch]$Not
|
||||
)
|
||||
$FiltersRegex = foreach ($Filter In $Filters) {
|
||||
$Filter = [regex]::Escape($Filter)
|
||||
if ($Filter -match "^\\\*") {
|
||||
$Filter = $Filter.Remove(0, 2)
|
||||
}
|
||||
else {
|
||||
$Filter = '^' + $Filter
|
||||
}
|
||||
if ($Filter -match "\\\*$") {
|
||||
$Filter = $Filter.Substring(0, $Filter.Length - 2)
|
||||
}
|
||||
else {
|
||||
$Filter = $Filter + '$'
|
||||
}
|
||||
$Filter
|
||||
}
|
||||
if ($Not) {
|
||||
$InputObject -notmatch ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.')
|
||||
}
|
||||
else {
|
||||
$InputObject -match ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.')
|
||||
}
|
||||
}
|
||||
|
||||
Push-Location "$PSScriptRoot\.."
|
||||
try {
|
||||
Write-Verbose -Message "Module installation started. Installing from $PWD"
|
||||
|
||||
if (!$ModulePath) {
|
||||
if ($Scope -eq 'CurrentUser') {
|
||||
$ModulePathIndex = 0
|
||||
}
|
||||
else {
|
||||
$ModulePathIndex = 1
|
||||
}
|
||||
if ($IsLinux -or $IsMacOS) {
|
||||
$ModulePathSeparator = ':'
|
||||
}
|
||||
else {
|
||||
$ModulePathSeparator = ';'
|
||||
}
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator)[$ModulePathIndex]
|
||||
}
|
||||
Write-Verbose -Message "Installing to $ModulePath"
|
||||
|
||||
# Get $ModuleName, $TargetPath, [$Links]
|
||||
if ($FromGitHub) {
|
||||
# Fix Could not create SSL/TLS secure channel
|
||||
#$SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol
|
||||
#[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
$WebClient = [System.Net.WebClient]::new()
|
||||
$GitUri = $FromGitHub.AbsolutePath.Split('/')[1, 2] -join '/'
|
||||
$GitBranch = $FromGitHub.AbsolutePath.Split('/')[3]
|
||||
$Links = (Invoke-RestMethod -Uri "https://api.github.com/repos/$GitUri/contents" -Body @{ref = $GitBranch }) | Where-Object { (LikeAny $_.name $IncludeFiles) -and (LikeAny $_.name $ExcludeFiles -Not) }
|
||||
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension(($Links | Where-Object { $_.name -like '*.psm1' }).name)
|
||||
$ModuleVersion = (. ([Scriptblock]::Create((Invoke-WebRequest -Uri ($Links | Where-Object { $_.name -eq "$ModuleName.psd1" }).download_url)))).ModuleVersion
|
||||
}
|
||||
else {
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path $PWD))
|
||||
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path (Join-Path $PWD "$ModuleName.psd1") | Out-String)))).ModuleVersion
|
||||
}
|
||||
$TargetPath = Join-Path -Path $ModulePath -ChildPath $ModuleName
|
||||
$TargetPath = Join-Path -Path $TargetPath -ChildPath $ModuleVersion
|
||||
|
||||
# Create Directory
|
||||
if (-not (Test-Path -Path $TargetPath)) {
|
||||
$null = New-Item -Path $TargetPath -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message ('Created module folder: "{0}"' -f $TargetPath)
|
||||
}
|
||||
|
||||
# Copy Files
|
||||
if ($FromGitHub) {
|
||||
foreach ($Link in $Links) {
|
||||
$TargetPathItem = Join-Path -Path $TargetPath -ChildPath $Link.name
|
||||
if ($Link.type -ne 'dir') {
|
||||
$WebClient.DownloadFile($Link.download_url, $TargetPathItem)
|
||||
Write-Verbose -Message ('Installed module file: "{0}"' -f $Link.name)
|
||||
}
|
||||
else {
|
||||
if (-not (Test-Path -Path $TargetPathItem)) {
|
||||
$null = New-Item -Path $TargetPathItem -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathItem
|
||||
}
|
||||
$SubLinks = (Invoke-RestMethod -Uri $Link.git_url -Body @{recursive = '1' }).tree
|
||||
foreach ($SubLink in $SubLinks) {
|
||||
$TargetPathSub = Join-Path -Path $TargetPathItem -ChildPath $SubLink.path
|
||||
if ($SubLink.'type' -EQ 'tree') {
|
||||
if (-not (Test-Path -Path $TargetPathSub)) {
|
||||
$null = New-Item -Path $TargetPathSub -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathSub
|
||||
}
|
||||
}
|
||||
else {
|
||||
$WebClient.DownloadFile(
|
||||
('https://raw.githubusercontent.com/{0}/{1}/{2}/{3}' -f $GitUri, $GitBranch, $Link.name, $SubLink.path),
|
||||
$TargetPathSub
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Get-ChildItem -Path $PWD -Exclude $ExcludeFiles | Where-Object { LikeAny $_.Name $IncludeFiles } | ForEach-Object {
|
||||
if ($_.Attributes -ne 'Directory') {
|
||||
Copy-Item -Path $_ -Destination $TargetPath
|
||||
Write-Verbose -Message ('Installed module file "{0}"' -f $_)
|
||||
}
|
||||
else {
|
||||
Copy-Item -Path $_ -Destination $TargetPath -Recurse -Force
|
||||
Write-Verbose -Message ('Installed module folder "{0}"' -f $_)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Import Module
|
||||
Write-Verbose -Message "$ModuleName module installation successful to $TargetPath"
|
||||
Import-Module -Name $ModuleName -Force
|
||||
Write-Verbose -Message "Module installed"
|
||||
}
|
||||
catch {
|
||||
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
|
||||
}
|
||||
finally {
|
||||
#if ($FromGitHub) {
|
||||
# [Net.ServicePointManager]::SecurityProtocol = $SecurityProtocol
|
||||
#}
|
||||
Write-Verbose -Message 'Module installation end'
|
||||
Pop-Location
|
||||
}
|
||||
30
CI/InstallPowerShell.ps1
Normal file
30
CI/InstallPowerShell.ps1
Normal file
@@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs PowerShell Core on Windows.
|
||||
#>
|
||||
[CmdLetBinding()]
|
||||
Param
|
||||
(
|
||||
# Version to install in the format from the .msi, for example "7.0.0-preview.1"
|
||||
[String]$Version
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
if (-not $Version) {
|
||||
$Version = (Invoke-RestMethod https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/metadata.json).StableReleaseTag
|
||||
}
|
||||
$Version = $Version -replace "^v",""
|
||||
|
||||
'[Progress] Downloading PowerShell Core.'
|
||||
$MsiPath = Join-Path $env:TEMP "PowerShell-$Version-win-x64.msi"
|
||||
[System.Net.WebClient]::new().DownloadFile("https://github.com/PowerShell/PowerShell/releases/download/v$Version/PowerShell-$Version-win-x64.msi", $MsiPath)
|
||||
|
||||
'[Progress] Installing PowerShell Core.'
|
||||
Start-Process 'msiexec.exe' -Wait -ArgumentList "/i $MsiPath /quiet"
|
||||
Remove-Item -Path $MsiPath
|
||||
$PowerShellFolder = $Version[0]
|
||||
if ($Version -like "*preview*") {
|
||||
$PowerShellFolder += '-preview'
|
||||
}
|
||||
$env:Path = "$env:ProgramFiles\PowerShell\$PowerShellFolder;$env:Path"
|
||||
'[Progress] PowerShell Core Installed.'
|
||||
266
CI/PS-CI.ps1
Normal file
266
CI/PS-CI.ps1
Normal file
@@ -0,0 +1,266 @@
|
||||
[cmdletbinding(DefaultParameterSetName = 'Scope')]
|
||||
Param(
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'ModulePath')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModulePath,
|
||||
|
||||
# Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used.
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[ValidateSet('CurrentUser', 'AllUsers')]
|
||||
[string]
|
||||
$Scope = 'CurrentUser',
|
||||
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'PreCheckOnly')]
|
||||
[switch]$PreCheckOnly,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipPreChecks,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipPostChecks,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipPesterTests,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipHelp,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$CleanModuleDir
|
||||
)
|
||||
Function Show-Warning {
|
||||
param(
|
||||
[Parameter(Position = 0, ValueFromPipeline = $true)]
|
||||
$message
|
||||
)
|
||||
process {
|
||||
write-output "##vso[task.logissue type=warning]File $message"
|
||||
$message >> $script:warningfile
|
||||
}
|
||||
}
|
||||
|
||||
if ($PSScriptRoot) {
|
||||
$workingdir = Split-Path -Parent $PSScriptRoot
|
||||
Push-Location $workingdir
|
||||
}
|
||||
$psdpath = Get-Item "*.psd1"
|
||||
if (-not $psdpath -or $psdpath.count -gt 1) {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw "Did not find a unique PSD file "
|
||||
}
|
||||
else {
|
||||
try { $null = Test-ModuleManifest -Path $psdpath -ErrorAction stop }
|
||||
catch { throw $_ ; return }
|
||||
$ModuleName = $psdpath.Name -replace '\.psd1$' , ''
|
||||
$Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw))))
|
||||
$approvedVerbs = Get-Verb | Select-Object -ExpandProperty verb
|
||||
$script:warningfile = Join-Path -Path $pwd -ChildPath "warnings.txt"
|
||||
}
|
||||
|
||||
#pre-build checks - manifest found, files in it found, public functions and aliases loaded in it. Public functions correct.
|
||||
if (-not $SkipPreChecks) {
|
||||
|
||||
#Check files in the manifest are present
|
||||
foreach ($file in $Settings.FileList) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Show-Warning "File $file in the manifest file list is not present"
|
||||
}
|
||||
}
|
||||
|
||||
#Check files in public have Approved_verb-noun names and are 1 function using the file name as its name with
|
||||
# its name and any alias names in the manifest; function should have a param block and help should be in an MD file
|
||||
# We will want a regex which captures from "function verb-noun {" to its closing "}"
|
||||
# need to match each { to a } - $reg is based on https://stackoverflow.com/questions/7898310/using-regex-to-balance-match-parenthesis
|
||||
$reg = [Regex]::new(@"
|
||||
function\s*[-\w]+\s*{ # The function name and opening '{'
|
||||
(?:
|
||||
[^{}]+ # Match all non-braces
|
||||
|
|
||||
(?<open> { ) # Match '{', and capture into 'open'
|
||||
|
|
||||
(?<-open> } ) # Match '}', and delete the 'open' capture
|
||||
)*
|
||||
(?(open)(?!)) # Fails if 'open' stack isn't empty
|
||||
} # Functions closing '}'
|
||||
"@, 57) # 57 = compile,multi-line ignore case and white space.
|
||||
foreach ($file in (Get-Item .\Public\*.ps1)) {
|
||||
$name = $file.name -replace (".ps1", "")
|
||||
if ($name -notmatch ("(\w+)-\w+")) { Show-Warning "$name in the public folder is not a verb-noun name" }
|
||||
elseif ($Matches[1] -notin $approvedVerbs) { Show-Warning "$name in the public folder does not start with an approved verb" }
|
||||
if (-not ($Settings.FunctionsToExport -ceq $name)) {
|
||||
Show-Warning ('File {0} in the public folder does not match an exported function in the manifest' -f $file.name)
|
||||
}
|
||||
else {
|
||||
$fileContent = Get-Content $file -Raw
|
||||
$m = $reg.Matches($fileContent)
|
||||
if ($m.Count -eq 0) { Show-Warning ('Could not find {0} function in {1}' -f $name, $file.name); continue }
|
||||
elseif ($m.Count -ge 2) { Show-Warning ('Multiple functions in {0}' -f $item.name) ; Continue }
|
||||
elseif ($m[0] -imatch "^\function\s" -and
|
||||
$m[0] -cnotmatch "^\w+\s+$name") { Show-Warning ('function name does not match file name for {0}' -f $file.name) }
|
||||
#$m[0] runs form the f of function to its final } -find the section up to param, check for aliases & comment-based help
|
||||
$m2 = [regex]::Match($m[0], "^.*?param", 17) # 17 = multi-line, ignnore case
|
||||
if (-not $m2.Success) { Show-Warning "function $name has no param() block" }
|
||||
else {
|
||||
if ($m2.value -match "(?<!#\s*)\[\s*Alias\(\s*.([\w-]+).\s*\)\s*\]") {
|
||||
foreach ($a in ($Matches[1] -split '\s*,\s*')) {
|
||||
$a = $a -replace "'", "" -replace '"', ''
|
||||
if (-not ($Settings.AliasesToExport -eq $a)) {
|
||||
Show-Warning "Function $name has alias $a which is not in the manifest"
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($m2.value -match "\.syopsis|\.Description|\.Example") {
|
||||
Show-Warning "Function $name appears to have comment based help."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#Warn about functions which are exported but not found in public
|
||||
$notFromPublic = $Settings.FunctionsToExport.Where( { -not (Test-Path ".\public\$_.ps1") })
|
||||
If ($notFromPublic) { Show-Warning ('Exported function(s) {0} are not loaded from the Public folder' -f ($notFromPublic -join ', ')) }
|
||||
}
|
||||
|
||||
if ($PreCheckOnly) { return }
|
||||
|
||||
#region build, determine module path if necessary, create target directory if necessary, copy files based on manifest, build help
|
||||
try {
|
||||
if ($ModulePath) {
|
||||
$ModulePath = $ModulePath -replace "\\$|/$", ""
|
||||
}
|
||||
else {
|
||||
if ($IsLinux -or $IsMacOS) { $ModulePathSeparator = ':' }
|
||||
else { $ModulePathSeparator = ';' }
|
||||
if ($Scope -eq 'CurrentUser') { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) }
|
||||
else { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) }
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where( { $_ -like "$dir*" }, "First", 1)
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $ModuleName
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $Settings.ModuleVersion
|
||||
}
|
||||
# Clean-up / Create Directory
|
||||
if (-not (Test-Path -Path $ModulePath)) {
|
||||
$null = New-Item -Path $ModulePath -ItemType Directory -ErrorAction Stop
|
||||
'Created module folder: "{0}"' -f $ModulePath
|
||||
}
|
||||
elseif ($CleanModuleDir) {
|
||||
'{0} exists - cleaning before copy' -f $ModulePath
|
||||
Get-ChildItem -Path $ModulePath | Remove-Item -Force -Recurse
|
||||
}
|
||||
'Copying files to: "{0}"' -f $ModulePath
|
||||
$outputFile = $psdpath | Copy-Item -Destination $ModulePath -PassThru
|
||||
$outputFile.fullname
|
||||
foreach ($file in $Settings.FileList) {
|
||||
if ($file -like '.\*') {
|
||||
$dest = ($file -replace '\.\\', "$ModulePath\")
|
||||
if (-not (Test-Path -PathType Container (Split-Path -Parent $dest))) {
|
||||
$null = New-item -Type Directory -Path (Split-Path -Parent $dest)
|
||||
}
|
||||
}
|
||||
else { $dest = $ModulePath }
|
||||
Copy-Item -Path $file -Destination $dest -Force -Recurse
|
||||
}
|
||||
|
||||
if ((Test-Path -PathType Container "mdHelp") -and -not $SkipHelp) {
|
||||
if (-not (Get-Module -ListAvailable platyPS)) {
|
||||
'Installing Platyps to build help files'
|
||||
Install-Module -Name platyPS -Force -SkipPublisherCheck
|
||||
}
|
||||
$platypsInfo = Import-Module platyPS -PassThru -force
|
||||
Get-ChildItem .\mdHelp -Directory | ForEach-Object {
|
||||
'Building help for language ''{0}'', using {1} V{2}.' -f $_.Name, $platypsInfo.Name, $platypsInfo.Version
|
||||
$Null = New-ExternalHelp -Path $_.FullName -OutputPath (Join-Path $ModulePath $_.Name) -Force
|
||||
}
|
||||
}
|
||||
#Leave module path for things which follow.
|
||||
$env:PSNewBuildModule = $ModulePath
|
||||
}
|
||||
catch {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
|
||||
}
|
||||
finally {
|
||||
if (-not $outputFile -or -not (Test-Path $outputFile)) { throw "Failed to create module" }
|
||||
}
|
||||
#endregion
|
||||
|
||||
if ($env:Build_ArtifactStagingDirectory) {
|
||||
Copy-Item -Path (split-path -Parent $ModulePath) -Destination $env:Build_ArtifactStagingDirectory -Recurse
|
||||
}
|
||||
|
||||
#Check valid command names, help, run script analyzer over the files in the module directory
|
||||
if (-not $SkipPostChecks) {
|
||||
try { $outputFile | Import-Module -Force -ErrorAction stop }
|
||||
catch {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw "New module failed to load"
|
||||
}
|
||||
$commands = Get-Command -Module $ModuleName -CommandType function, Cmdlet
|
||||
$commands.where( { $_.name -notmatch "(\w+)-\w+" -or $Matches[1] -notin $approvedVerbs }) | ForEach-Object {
|
||||
Show-Warning ('{0} does not meet the ApprovedVerb-Noun naming rules' -f $_.name)
|
||||
}
|
||||
$helpless = $commands | Get-Help | Where-Object { $_.Synopsis -match "^\s+$($_.name)\s+\[" } | Select-Object -ExpandProperty name
|
||||
foreach ($command in $helpless ) {
|
||||
Show-Warning ('On-line help is missing for {0}.' -f $command)
|
||||
}
|
||||
if (-not (Get-Module -Name PSScriptAnalyzer -ListAvailable)) {
|
||||
Install-Module -Name PSScriptAnalyzer -Force
|
||||
}
|
||||
$PSSAInfo = Import-module -Name PSScriptAnalyzer -PassThru -force
|
||||
"Running {1} V{2} against '{0}' " -f $ModulePath , $PSSAInfo.name, $PSSAInfo.Version
|
||||
$AnalyzerResults = Invoke-ScriptAnalyzer -Path $ModulePath -Recurse -ErrorAction SilentlyContinue
|
||||
if ($AnalyzerResults) {
|
||||
if (-not (Get-Module -Name ImportExcel -ListAvailable)) {
|
||||
#ironically we use this to build import-excel Shouldn't need this there!
|
||||
'Installing ImportExcel.'
|
||||
Install-Module -Name ImportExcel -Force
|
||||
}
|
||||
$chartDef = New-ExcelChartDefinition -ChartType 'BarClustered' -Column 2 -Title "Script analysis" -LegendBold
|
||||
$ExcelParams = @{
|
||||
Path = (Join-Path $pwd 'ScriptAnalyzer.xlsx')
|
||||
WorksheetName = 'FullResults'
|
||||
TableStyle = 'Medium6'
|
||||
AutoSize = $true
|
||||
Activate = $true
|
||||
PivotTableDefinition = @{BreakDown = @{
|
||||
PivotData = @{RuleName = 'Count' }
|
||||
PivotRows = 'Severity', 'RuleName'
|
||||
PivotTotals = 'Rows'
|
||||
PivotChartDefinition = $chartDef
|
||||
}
|
||||
}
|
||||
}
|
||||
Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue
|
||||
$AnalyzerResults | Export-Excel @ExcelParams
|
||||
if (Test-Path $ExcelParams['Path']) {
|
||||
"Try to uploadfile {0}" -f $ExcelParams['Path']
|
||||
"##vso[task.uploadfile]{0}" -f $ExcelParams['Path']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Test-Path $script:warningfile) {
|
||||
"Try to uploadfile {0}" -f $script:warningfile
|
||||
"##vso[task.uploadfile]{0}" -f $script:warningfile
|
||||
}
|
||||
|
||||
#if there are test files, run pester (unless told not to)
|
||||
if (-not $SkipPesterTests -and (Get-ChildItem -Recurse *.tests.ps1)) {
|
||||
Import-Module -Force $outputFile
|
||||
if (-not (Get-Module -ListAvailable pester | Where-Object -Property version -ge ([version]::new(4, 4, 1)))) {
|
||||
Install-Module Pester -Force -SkipPublisherCheck -MaximumVersion 4.99.99
|
||||
}
|
||||
$pester = Import-Module Pester -PassThru
|
||||
$pester
|
||||
$pesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
if ($pester.Version.Major -lt 5) {Invoke-Pester -OutputFile $pesterOutputPath}
|
||||
else {
|
||||
$pesterArgs = [PesterConfiguration]::Default
|
||||
$pesterArgs.Run.Exit = $true
|
||||
$pesterArgs.Output.Verbosity = "Normal"
|
||||
$pesterArgs.TestResult.Enabled = $true
|
||||
$pesterArgs.TestResult.OutputPath = $pesterOutputPath
|
||||
Invoke-Pester -Configuration $pesterArgs
|
||||
}
|
||||
}
|
||||
elseif ($PSScriptRoot) { Pop-Location }
|
||||
106
CI/Publish.ps1
Normal file
106
CI/Publish.ps1
Normal file
@@ -0,0 +1,106 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Deploy module to PowerShellGallery.
|
||||
#>
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "Success")]
|
||||
[CmdletBinding(DefaultParameterSetName = 'ModuleName')]
|
||||
Param
|
||||
(
|
||||
# The name of the installed module to be deployed, if not provided the name of the .psm1 file in the parent folder is used.
|
||||
[Parameter(ParameterSetName = 'ModuleName')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModuleName,
|
||||
|
||||
# Publish module from path (module folder), if not provided -ModuleName is used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'Path')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$Path,
|
||||
|
||||
# Key for PowerShellGallery deployment, if not provided $env:NugetApiKey is used.
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$NugetApiKey,
|
||||
|
||||
# Skip Version verification for PowerShellGallery deployment, can be used for first release.
|
||||
[Switch]$Force
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
if ($Path) {
|
||||
$Path = Resolve-Path -Path $Path
|
||||
if ($Path.Count -ne 1) {
|
||||
throw ('Invalid Path, $Path.Count: {0}.' -f $Path.Count)
|
||||
}
|
||||
$Psd1Path = (Get-ChildItem -File -Filter *.psd1 -Path $Path -Recurse)[0].FullName
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension($Psd1Path)
|
||||
$VersionLocal = (. ([Scriptblock]::Create((Get-Content -Path $Psd1Path | Out-String)))).ModuleVersion
|
||||
}
|
||||
else {
|
||||
# Get Script Root
|
||||
if ($PSScriptRoot) {
|
||||
$ScriptRoot = $PSScriptRoot
|
||||
}
|
||||
elseif ($psISE.CurrentFile.IsUntitled -eq $false) {
|
||||
$ScriptRoot = Split-Path -Path $psISE.CurrentFile.FullPath
|
||||
}
|
||||
elseif ($null -ne $psEditor.GetEditorContext().CurrentFile.Path -and $psEditor.GetEditorContext().CurrentFile.Path -notlike 'untitled:*') {
|
||||
$ScriptRoot = Split-Path -Path $psEditor.GetEditorContext().CurrentFile.Path
|
||||
}
|
||||
else {
|
||||
$ScriptRoot = '.'
|
||||
}
|
||||
|
||||
# Get Module Info
|
||||
if (!$ModuleName) {
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $ScriptRoot)))
|
||||
}
|
||||
$VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum
|
||||
}
|
||||
|
||||
"[Progress] Deploy Script Start for Module: $ModuleName, Version: $VersionLocal."
|
||||
|
||||
# Deploy to PowerShell Gallery if run locally OR from AppVeyor & GitHub master
|
||||
if (!$env:APPVEYOR -or $env:APPVEYOR_REPO_BRANCH -eq 'master') {
|
||||
if ($env:APPVEYOR) {
|
||||
$Success = $true
|
||||
$AppVeyorProject = Invoke-RestMethod -Uri "https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG"
|
||||
$AppVeyorProject.build.jobs | ForEach-Object {
|
||||
'[Info] AppVeyor job name: "{0}", Id: {1}, Status: {2}.' -f $_.name, $_.jobId, $_.status
|
||||
if ($_.jobId -ne $env:APPVEYOR_JOB_ID -and $_.status -ne "success") {
|
||||
$Success = $false
|
||||
}
|
||||
}
|
||||
if (!$Success) {
|
||||
'[Info] There are filed jobs skipping PowerShell Gallery deploy.'
|
||||
break
|
||||
}
|
||||
}
|
||||
try {
|
||||
$VersionGallery = (Find-Module -Name $ModuleName -ErrorAction Stop).Version
|
||||
}
|
||||
catch {
|
||||
if ($_.Exception.Message -notlike 'No match was found for the specified search criteria*' -or !$Force) {
|
||||
throw $_
|
||||
}
|
||||
}
|
||||
|
||||
"[Info] PowerShellGallery. $ModuleName, VersionGallery: $VersionGallery, VersionLocal: $VersionLocal."
|
||||
if ($VersionGallery -lt $VersionLocal -or $Force) {
|
||||
if (!$NugetApiKey) {
|
||||
$NugetApiKey = $env:NugetApiKey
|
||||
}
|
||||
"[Info] PowerShellGallery. Deploying $ModuleName version $VersionLocal."
|
||||
if ($Path) {
|
||||
Publish-Module -NuGetApiKey $NugetApiKey -Path $Path
|
||||
}
|
||||
else {
|
||||
Publish-Module -NuGetApiKey $NugetApiKey -Name $ModuleName -RequiredVersion $VersionLocal
|
||||
}
|
||||
}
|
||||
else {
|
||||
'[Info] PowerShellGallery Deploy Skipped (Version Check).'
|
||||
}
|
||||
}
|
||||
else {
|
||||
'[Info] PowerShellGallery Deploy Skipped.'
|
||||
}
|
||||
'[Progress] Deploy Ended.'
|
||||
6
CI/PublishToGallery.ps1
Normal file
6
CI/PublishToGallery.ps1
Normal file
@@ -0,0 +1,6 @@
|
||||
$p = @{
|
||||
Name = "ImportExcel"
|
||||
NuGetApiKey = $NuGetApiKey
|
||||
}
|
||||
|
||||
Publish-Module @p
|
||||
54
CI/Test-SingleFunctions.ps1
Normal file
54
CI/Test-SingleFunctions.ps1
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
function Test-SingleFunction {
|
||||
param (
|
||||
[parameter(ValueFromPipeline=$true)]
|
||||
$path )
|
||||
begin {
|
||||
$psd = Get-Content -Raw "$PSScriptRoot\..\ImportExcel.psd1"
|
||||
$exportedFunctions = (Invoke-Command ([scriptblock]::Create($psd))).functionsToExport
|
||||
$reg = [Regex]::new(@"
|
||||
function\s*[-\w]+\s*{ # The function name and opening '{'
|
||||
(?:
|
||||
[^{}]+ # Match all non-braces
|
||||
|
|
||||
(?<open> { ) # Match '{', and capture into 'open'
|
||||
|
|
||||
(?<-open> } ) # Match '}', and delete the 'open' capture
|
||||
)*
|
||||
(?(open)(?!)) # Fails if 'open' stack isn't empty
|
||||
} # Functions closing '}'
|
||||
"@, 57) # 41 = compile ignore case and white space.
|
||||
$reg2 = [Regex]::new(@"
|
||||
^function\s*[-\w]+\s*{ # The function name and opening '{'
|
||||
(
|
||||
\#.*?[\r\n]+ # single line comment
|
||||
| # or
|
||||
\s*<\#.*?\#> # <#comment block#>
|
||||
| # or
|
||||
\s*\[.*?\] # [attribute tags]
|
||||
)*
|
||||
"@, 57)
|
||||
# 43 = compile, multi-line, ignore case and white space.
|
||||
}
|
||||
process {
|
||||
$item = Get-item $Path
|
||||
$name = $item.Name -replace "\.\w+$",""
|
||||
Write-Verbose $name
|
||||
$file = Get-Content $item -Raw
|
||||
$m = $reg.Matches($file)
|
||||
|
||||
#based on https://stackoverflow.com/questions/7898310/using-regex-to-balance-match-parenthesis
|
||||
if ($m.Count -eq 0) {return "Could not find $name function in $($item.name)"}
|
||||
elseif ($m.Count -ge 2) {return "Multiple functions in $($item.name)"}
|
||||
elseif ($exportedFunctions -cnotcontains $name) {return "$name not exported (or in the wrong case)"}
|
||||
elseif ($m[0] -cnotmatch "^\w+\s+$name") {return "function $name in wrong case"}
|
||||
$m2 = [regex]::Match($m[0],"param",[System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
|
||||
if (-not $m2.Success) {return "No param block in $name"}
|
||||
# elseif ($m[0] -inotmatch "(?s)^function\s*$name\s*{(\s*<\#.*?\#>|\s*\[.*?\])*\s*param")
|
||||
# elseif ($reg2.IsMatch($m[0].Value)) {return "function $name has comment-based help"}
|
||||
elseif ($m[0] -inotmatch "\[CmdletBinding\(" -and
|
||||
$m[0] -inotmatch "\[parameter\(" ) {return "$name has is not an advanced function"}
|
||||
#elseif (-not (& $Name -?).synopsis) {return "$name has no help"}
|
||||
else {Write-Verbose "$name OK"}
|
||||
}
|
||||
}
|
||||
80
CI/build.ps1
Normal file
80
CI/build.ps1
Normal file
@@ -0,0 +1,80 @@
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||
param(
|
||||
# Path to install the module to, if not provided -Scope used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'ModulePath')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModulePath,
|
||||
|
||||
# Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'Scope')]
|
||||
[ValidateSet('CurrentUser', 'AllUsers')]
|
||||
[string]
|
||||
$Scope = 'CurrentUser',
|
||||
[switch]$Passthru
|
||||
)
|
||||
|
||||
if ($PSScriptRoot) { Push-Location "$PSScriptRoot\.." }
|
||||
|
||||
$psdpath = Get-Item "*.psd1"
|
||||
if (-not $psdpath -or $psdpath.count -gt 1) {
|
||||
throw "Did not find a unique PSD file "
|
||||
}
|
||||
else {
|
||||
$ModuleName = $psdpath.Name -replace '\.psd1$' , ''
|
||||
$Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw))))
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Verbose -Message 'Module installation started'
|
||||
|
||||
if (!$ModulePath) {
|
||||
if ($IsLinux -or $IsMacOS) {$ModulePathSeparator = ':' }
|
||||
else {$ModulePathSeparator = ';' }
|
||||
|
||||
if ($Scope -eq 'CurrentUser') { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) }
|
||||
else { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) }
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where({$_ -like "$dir*"},"First",1)
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $ModuleName
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $Settings.ModuleVersion
|
||||
}
|
||||
|
||||
# Create Directory
|
||||
if (-not (Test-Path -Path $ModulePath)) {
|
||||
$null = New-Item -Path $ModulePath -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message ('Created module folder: "{0}"' -f $ModulePath)
|
||||
}
|
||||
|
||||
Write-Verbose -Message ('Copying files to "{0}"' -f $ModulePath)
|
||||
$outputFile = $psdpath | Copy-Item -Destination $ModulePath -PassThru
|
||||
Foreach ($file in $Settings.FileList) {
|
||||
if ($file -like '.\*') {
|
||||
$dest = ($file -replace '\.\\',"$ModulePath\")
|
||||
if (-not (Test-Path -PathType Container (Split-Path -Parent $dest))) {
|
||||
$null = New-item -Type Directory -Path (Split-Path -Parent $dest)
|
||||
}
|
||||
}
|
||||
else {$dest = $ModulePath }
|
||||
Copy-Item $file -Destination $dest -Force -Recurse
|
||||
}
|
||||
|
||||
if (Test-Path -PathType Container "mdHelp") {
|
||||
if (-not (Get-Module -ListAvailable platyPS)) {
|
||||
Write-Verbose-Message ('Installing Platyps to build help files')
|
||||
Install-Module -Name platyPS -Force -SkipPublisherCheck
|
||||
}
|
||||
Import-Module platyPS
|
||||
Get-ChildItem .\mdHelp -Directory | ForEach-Object {
|
||||
New-ExternalHelp -Path $_.FullName -OutputPath (Join-Path $ModulePath $_.Name) -Force -Verbose
|
||||
}
|
||||
}
|
||||
$env:PSNewBuildModule = $ModulePath
|
||||
|
||||
if ($Passthru) {$outputFile}
|
||||
}
|
||||
catch {
|
||||
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
|
||||
}
|
||||
finally {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
Write-Verbose -Message 'Module installation end'
|
||||
}
|
||||
75
CI/pipeline.yml
Normal file
75
CI/pipeline.yml
Normal file
@@ -0,0 +1,75 @@
|
||||
# https://aka.ms/yaml
|
||||
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- '*'
|
||||
# - master
|
||||
# - releases/*
|
||||
paths:
|
||||
exclude:
|
||||
- README.md
|
||||
- CHANGELOG.md
|
||||
|
||||
jobs:
|
||||
- job: 'Windows_PowerShell_all_options'
|
||||
pool:
|
||||
vmImage: 'windows-latest'
|
||||
steps:
|
||||
- powershell: 'Install-Module -Name Pester -Force -SkipPublisherCheck'
|
||||
displayName: 'Update Pester'
|
||||
- powershell: './CI/PS-CI.ps1 '
|
||||
displayName: 'Check Build Check Pack Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
targetPath: '$(Build.ArtifactStagingDirectory)/ImportExcel'
|
||||
artifact: 'ImportExcel'
|
||||
|
||||
- job: 'PowerShell_Core_on_Windows_Build_and_Pester_only'
|
||||
pool:
|
||||
vmImage: 'windows-latest'
|
||||
steps:
|
||||
- pwsh: 'Install-Module -Name Pester -Force'
|
||||
displayName: 'Update Pester'
|
||||
- pwsh: '.\CI\PS-CI.ps1 -SkipPreChecks -SkipHelp -SkipPostChecks'
|
||||
displayName: 'Install and Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
|
||||
- job: 'Ubuntu_Build_and_Pester_Only'
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
steps:
|
||||
- powershell: 'Install-Module -Name Pester -Force'
|
||||
displayName: 'Update Pester'
|
||||
- powershell: './CI/PS-CI.ps1 -SkipPreChecks -SkipHelp -SkipPostChecks '
|
||||
displayName: 'Install and Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
|
||||
- job: 'macOS_Build_and_Pester_Only'
|
||||
pool:
|
||||
vmImage: 'macOS-latest'
|
||||
steps:
|
||||
- script: brew install mono-libgdiplus
|
||||
displayName: 'Install mono-libgdiplus'
|
||||
- powershell: 'Install-Module -Name Pester -Force'
|
||||
displayName: 'Update Pester'
|
||||
- powershell: './CI/PS-CI.ps1 -SkipPreChecks -SkipHelp -SkipPostChecks'
|
||||
displayName: 'Install and Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
@@ -1,44 +0,0 @@
|
||||
Function ColorCompletion {
|
||||
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
|
||||
[System.Drawing.KnownColor].GetFields() | Where-Object {$_.IsStatic -and $_.name -like "$wordToComplete*" } |
|
||||
Sort-Object name | ForEach-Object {New-CompletionResult $_.name $_.name
|
||||
}
|
||||
}
|
||||
|
||||
if (Get-Command -Name register-argumentCompleter -ErrorAction SilentlyContinue) {
|
||||
Register-ArgumentCompleter -CommandName Export-Excel -ParameterName TitleBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName DataBarColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName ForeGroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName AllDataBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName TabColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Join-Worksheet -ParameterName TitleBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-Worksheet -ParameterName AddBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-Worksheet -ParameterName ChangeBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-Worksheet ` -ParameterName DeleteBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName KeyFontColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName AddBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName ChangeBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-MulipleSheets ` -ParameterName DeleteBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName KeyFontColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName ConditionalTextColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName BorderColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName BorderColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
Function Convert-XlRangeToImage {
|
||||
<#
|
||||
.Synopsis
|
||||
Gets the specified part of an Excel file and exports it as an image
|
||||
.Description
|
||||
Excel allows charts to be exported directly to a file, but can't do this with the rest of a sheet. To work round this this function
|
||||
* Opens a copy of Excel and loads a file
|
||||
* Selects a worksheet and then a range of cells in that worksheet
|
||||
* Copies the select to the clipboard
|
||||
* Saves the clipboard contents as an image file (it will save as .JPG unless the file name ends .BMP or .PNG)
|
||||
* Copies a single cell to the clipboard (to prevent the "you have put a lot in the clipboard" message appearing)
|
||||
* Closes Excel
|
||||
#>
|
||||
Param (
|
||||
#Path to the Excel file
|
||||
[parameter(Mandatory=$true)]
|
||||
$Path,
|
||||
#Worksheet name - if none is specified "Sheet1" will be assumed
|
||||
$workSheetname = "Sheet1" ,
|
||||
#Range of cells within the sheet, e.g "A1:Z99"
|
||||
[parameter(Mandatory=$true)]
|
||||
$range,
|
||||
#A bmp, png or jpg file where the result will be saved
|
||||
$destination = "$pwd\temp.png",
|
||||
#If specified opens the image in the default viewer.
|
||||
[switch]$show
|
||||
)
|
||||
$extension = $destination -replace '^.*\.(\w+)$' ,'$1'
|
||||
if ($extension -in @('JPEG','BMP','PNG')) {
|
||||
$Format = [system.Drawing.Imaging.ImageFormat]$extension
|
||||
} #if we don't recognise the extension OR if it is JPG with an E, use JPEG format
|
||||
else { $Format = [system.Drawing.Imaging.ImageFormat]::Jpeg}
|
||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Starting Excel"
|
||||
$xlApp = New-Object -ComObject "Excel.Application"
|
||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Opening Workbook and copying data"
|
||||
$xlWbk = $xlApp.Workbooks.Open($Path)
|
||||
$xlWbk.Worksheets($workSheetname).Select()
|
||||
$null = $xlWbk.ActiveSheet.Range($range).Select()
|
||||
$null = $xlApp.Selection.Copy()
|
||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Saving copied data"
|
||||
# Get-Clipboard came in with PS5. Older versions can use [System.Windows.Clipboard] but it is ugly.
|
||||
$image = Get-Clipboard -Format Image
|
||||
$image.Save($destination, $Format)
|
||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Closing Excel"
|
||||
$null = $xlWbk.ActiveSheet.Range("a1").Select()
|
||||
$null = $xlApp.Selection.Copy()
|
||||
$xlApp.Quit()
|
||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Completed
|
||||
if ($show) {Start-Process -FilePath $destination}
|
||||
else {Get-Item -Path $destination}
|
||||
}
|
||||
<#
|
||||
del demo*.xlsx
|
||||
|
||||
$workSheetname = 'Processes'
|
||||
$Path = "$pwd\demo.xlsx"
|
||||
$myData = Get-Process | Select-Object -Property Name,WS,CPU,Description,company,startTime
|
||||
|
||||
$excelPackage = $myData | Export-Excel -KillExcel -Path $Path -WorkSheetname $workSheetname -ClearSheet -AutoSize -AutoFilter -BoldTopRow -FreezeTopRow -PassThru
|
||||
$workSheet = $excelPackage.Workbook.Worksheets[$workSheetname]
|
||||
$range = $workSheet.Dimension.Address
|
||||
Set-Format -WorkSheet $workSheet -Range "b:b" -NumberFormat "#,###" -AutoFit
|
||||
Set-Format -WorkSheet $workSheet -Range "C:C" -NumberFormat "#,##0.00" -AutoFit
|
||||
Set-Format -WorkSheet $workSheet -Range "F:F" -NumberFormat "dd MMMM HH:mm:ss" -AutoFit
|
||||
Add-ConditionalFormatting -WorkSheet $workSheet -Range "c2:c1000" -DataBarColor Blue
|
||||
Add-ConditionalFormatting -WorkSheet $workSheet -Range "b2:B1000" -RuleType GreaterThan -ConditionValue '104857600' -ForeGroundColor "Red" -Bold
|
||||
|
||||
Export-Excel -ExcelPackage $excelPackage -WorkSheetname $workSheetname
|
||||
|
||||
Convert-XlRangeToImage -Path $Path -workSheetname $workSheetname -range $range -destination "$pwd\temp.png" -show
|
||||
#>
|
||||
|
||||
|
||||
#Convert-XlRangeToImage -Path $Path -workSheetname $workSheetname -range $range -destination "$pwd\temp.png" -show
|
||||
@@ -1,50 +0,0 @@
|
||||
function ConvertFrom-ExcelData {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Reads data from a sheet, and for each row, calls a custom scriptblock with a list of property names and the row of data.
|
||||
|
||||
|
||||
.EXAMPLE
|
||||
ConvertFrom-ExcelData .\testSQLGen.xlsx {
|
||||
param($propertyNames, $record)
|
||||
|
||||
$reportRecord = @()
|
||||
foreach ($pn in $propertyNames) {
|
||||
$reportRecord += "{0}: {1}" -f $pn, $record.$pn
|
||||
}
|
||||
$reportRecord +=""
|
||||
$reportRecord -join "`r`n"
|
||||
}
|
||||
|
||||
First: John
|
||||
Last: Doe
|
||||
The Zip: 12345
|
||||
....
|
||||
#>
|
||||
param(
|
||||
[Alias("FullName")]
|
||||
[Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Mandatory = $true)]
|
||||
[ValidateScript( { Test-Path $_ -PathType Leaf })]
|
||||
$Path,
|
||||
[ScriptBlock]$scriptBlock,
|
||||
[Alias("Sheet")]
|
||||
$WorkSheetname = 1,
|
||||
[int]$HeaderRow = 1,
|
||||
[string[]]$Header,
|
||||
[switch]$NoHeader,
|
||||
[switch]$DataOnly
|
||||
)
|
||||
|
||||
$null = $PSBoundParameters.Remove('scriptBlock')
|
||||
$params = @{} + $PSBoundParameters
|
||||
|
||||
$data = Import-Excel @params
|
||||
|
||||
$PropertyNames = $data[0].psobject.Properties |
|
||||
Where-Object {$_.membertype -match 'property'} |
|
||||
Select-Object -ExpandProperty name
|
||||
|
||||
foreach ($record in $data) {
|
||||
& $scriptBlock $PropertyNames $record
|
||||
}
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
function ConvertFrom-ExcelToSQLInsert {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Generate SQL insert statements from Excel spreadsheet.
|
||||
.DESCRIPTION
|
||||
Generate SQL insert statements from Excel spreadsheet.
|
||||
.PARAMETER TableName
|
||||
Name of the target database table.
|
||||
.PARAMETER Path
|
||||
Path to an existing .XLSX file
|
||||
This parameter is passed to Import-Excel as is.
|
||||
.PARAMETER WorkSheetname
|
||||
Specifies the name of the worksheet in the Excel workbook to import. By default, if no name is provided, the first worksheet will be imported.
|
||||
This parameter is passed to Import-Excel as is.
|
||||
.PARAMETER StartRow
|
||||
The row from where we start to import data, all rows above the StartRow are disregarded. By default this is the first row.
|
||||
When the parameters ‘-NoHeader’ and ‘-HeaderName’ are not provided, this row will contain the column headers that will be used as property names. When one of both parameters are provided, the property names are automatically created and this row will be treated as a regular row containing data.
|
||||
.PARAMETER Header
|
||||
Specifies custom property names to use, instead of the values defined in the column headers of the TopRow.
|
||||
If you provide fewr header names than there is data in the worksheet, then only the data with a corresponding header name will be imported and the data without header name will be disregarded.
|
||||
If you provide more header names than there is data in the worksheet, then all data will be imported and all objects will have all the property names you defined in the header names. As such, the last properties will be blank as there is no data for them.
|
||||
.PARAMETER NoHeader
|
||||
Automatically generate property names (P1, P2, P3, ..) instead of the ones defined in the column headers of the TopRow.
|
||||
This switch is best used when you want to import the complete worksheet ‘as is’ and are not concerned with the property names.
|
||||
.PARAMETER DataOnly
|
||||
Import only rows and columns that contain data, empty rows and empty columns are not imported.
|
||||
.PARAMETER ConvertEmptyStringsToNull
|
||||
If specified, cells without any data are replaced with NULL, instead of an empty string.
|
||||
This is to address behviors in certain DBMS where an empty string is insert as 0 for INT column, instead of a NULL value.
|
||||
|
||||
.EXAMPLE
|
||||
Generate SQL insert statements from Movies.xlsx file, leaving blank cells as empty strings:
|
||||
|
||||
----------------------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Sheet1 |
|
||||
----------------------------------------------------------
|
||||
| A B C |
|
||||
|1 Movie Name Year Rating |
|
||||
|2 The Bodyguard 1992 9 |
|
||||
|3 The Matrix 1999 8 |
|
||||
|4 Skyfall 2012 9 |
|
||||
|5 The Avengers 2012 |
|
||||
----------------------------------------------------------
|
||||
|
||||
PS C:\> Import-Excel -TableName "Movies" -Path 'C:\Movies.xlsx'
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Bodyguard', '1992', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Matrix', '1999', '8');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('Skyfall', '2012', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Avengers', '2012', '');
|
||||
|
||||
.EXAMPLE
|
||||
Generate SQL insert statements from Movies.xlsx file, specify NULL instead of an empty string.
|
||||
|
||||
----------------------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Sheet1 |
|
||||
----------------------------------------------------------
|
||||
| A B C |
|
||||
|1 Movie Name Year Rating |
|
||||
|2 The Bodyguard 1992 9 |
|
||||
|3 The Matrix 1999 8 |
|
||||
|4 Skyfall 2012 9 |
|
||||
|5 The Avengers 2012 |
|
||||
----------------------------------------------------------
|
||||
|
||||
PS C:\> ConvertFrom-ExcelToSQLInsert -TableName "Movies" -Path "C:\Movies.xlsx" -ConvertEmptyStringsToNull
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Bodyguard', '1992', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Matrix', '1999', '8');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('Skyfall', '2012', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Avengers', '2012', NULL);
|
||||
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
$TableName,
|
||||
[Alias("FullName")]
|
||||
[Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Mandatory = $true)]
|
||||
[ValidateScript( { Test-Path $_ -PathType Leaf })]
|
||||
$Path,
|
||||
[Alias("Sheet")]
|
||||
$WorkSheetname = 1,
|
||||
[Alias('HeaderRow', 'TopRow')]
|
||||
[ValidateRange(1, 9999)]
|
||||
[Int]$StartRow,
|
||||
[string[]]$Header,
|
||||
[switch]$NoHeader,
|
||||
[switch]$DataOnly,
|
||||
[switch]$ConvertEmptyStringsToNull,
|
||||
[switch]$UseMSSQLSyntax
|
||||
)
|
||||
|
||||
$null = $PSBoundParameters.Remove('TableName')
|
||||
$null = $PSBoundParameters.Remove('ConvertEmptyStringsToNull')
|
||||
$null = $PSBoundParameters.Remove('UseMSSQLSyntax')
|
||||
|
||||
$params = @{} + $PSBoundParameters
|
||||
|
||||
ConvertFrom-ExcelData @params {
|
||||
param($propertyNames, $record)
|
||||
|
||||
$ColumnNames = "'" + ($PropertyNames -join "', '") + "'"
|
||||
if($UseMSSQLSyntax) {
|
||||
$ColumnNames = "[" + ($PropertyNames -join "], [") + "]"
|
||||
}
|
||||
|
||||
$values = foreach ($propertyName in $PropertyNames) {
|
||||
if ($ConvertEmptyStringsToNull.IsPresent -and [string]::IsNullOrEmpty($record.$propertyName)) {
|
||||
'NULL'
|
||||
}
|
||||
else {
|
||||
"'" + $record.$propertyName + "'"
|
||||
}
|
||||
}
|
||||
$targetValues = ($values -join ", ")
|
||||
|
||||
"INSERT INTO {0} ({1}) Values({2});" -f $TableName, $ColumnNames, $targetValues
|
||||
}
|
||||
}
|
||||
28
DoTests.ps1
28
DoTests.ps1
@@ -1,28 +0,0 @@
|
||||
param(
|
||||
[Switch]$DontCreateZip
|
||||
)
|
||||
|
||||
##
|
||||
# Used in Appveyor.yml
|
||||
##
|
||||
|
||||
$PSVersionTable.PSVersion
|
||||
|
||||
## Create the zip before the tests run
|
||||
## Otherwise the EPPlus.dll is in use after the Pester run
|
||||
$ModuleVersion = (Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content -Raw .\ImportExcel.psd1)))).moduleVersion
|
||||
|
||||
if (!$DontCreateZip) {
|
||||
$dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss")
|
||||
Compress-Archive -Path . -DestinationPath .\$dest
|
||||
}
|
||||
|
||||
if ($null -eq (Get-Module -ListAvailable pester)) {
|
||||
Install-Module -Name Pester -Repository PSGallery -Force -Scope CurrentUser
|
||||
}
|
||||
|
||||
$result = Invoke-Pester -Script $PSScriptRoot\__tests__ -Verbose -PassThru
|
||||
|
||||
if ($result.FailedCount -gt 0) {
|
||||
throw "$($result.FailedCount) tests failed."
|
||||
}
|
||||
BIN
EPPlus.dll
BIN
EPPlus.dll
Binary file not shown.
@@ -1,15 +1,15 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
|
||||
$xlSourcefile = "$env:TEMP\Source.xlsx"
|
||||
write-host "Save location: $xlSourcefile"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
#Put some simple data in a worksheet and Get an excel package object to represent the file
|
||||
$TabData1 = 1..5 | Export-Excel $xlSourcefile -WorksheetName 'Tab 1' -AutoSize -AutoFilter
|
||||
1..5 | Export-Excel $xlSourcefile -WorksheetName 'Tab1' -AutoSize -AutoFilter
|
||||
|
||||
#Add another tab. Replace the $TabData2 with your data
|
||||
$TabData2 = 1..10 | Export-Excel $xlSourcefile -WorksheetName 'Tab 2' -AutoSize -AutoFilter
|
||||
1..10 | Export-Excel $xlSourcefile -WorksheetName 'Tab 2' -AutoSize -AutoFilter
|
||||
|
||||
#Add another tab. Replace the $TabData3 with your data
|
||||
$TabData3 = 1..15 | Export-Excel $xlSourcefile -WorksheetName 'Tab 3' -AutoSize -AutoFilter -Show
|
||||
1..15 | Export-Excel $xlSourcefile -WorksheetName 'Tab 3' -AutoSize -AutoFilter -Show
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
|
||||
$xlSourcefile = "$env:TEMP\Source.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
#Put some simple data in a worksheet and Get an excel package object to represent the file
|
||||
$excel = 1..10 | Export-Excel $xlSourcefile -PassThru
|
||||
#Add a new worksheet named 'NewSheet' and copying the sheet that was just made (Sheet1) to the new sheet
|
||||
Add-WorkSheet -ExcelPackage $excel -WorkSheetname "NewSheet" -CopySource $excel.Workbook.Worksheets["Sheet1"]
|
||||
Add-Worksheet -ExcelPackage $excel -WorkSheetname "NewSheet" -CopySource $excel.Workbook.Worksheets["Sheet1"]
|
||||
#Save and open in Excel
|
||||
Close-ExcelPackage -ExcelPackage $excel -Show
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
# Creates a worksheet, addes a chart and then a Linear trendline
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlfile = "$env:TEMP\trendLine.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,Item,TotalSold
|
||||
@@ -18,4 +21,4 @@ South,avocado,73
|
||||
"@
|
||||
|
||||
$cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine Linear
|
||||
$data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange -Show
|
||||
$data | Export-Excel $xlSourcefile -ExcelChartDefinition $cd -AutoNameRange -Show
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item temp.xlsx -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = Invoke-Sum -data (Get-Process) -dimension Company -measure Handles, PM, VirtualMemorySize
|
||||
|
||||
@@ -11,4 +14,4 @@ $c = New-ExcelChartDefinition -Title "ProcessStats" `
|
||||
-SeriesHeader "PM","VM"
|
||||
|
||||
$data |
|
||||
Export-Excel -Path temp.xlsx -AutoSize -TableName Processes -ExcelChartDefinition $c -Show
|
||||
Export-Excel -Path $xlSourcefile -AutoSize -TableName Processes -ExcelChartDefinition $c -Show
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item temp.xlsx -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = @"
|
||||
A,B,C,Date
|
||||
@@ -15,5 +18,5 @@ $c = New-ExcelChartDefinition -Title Impressions `
|
||||
-SeriesHeader 'B data','A data' `
|
||||
-Row 0 -Column 0
|
||||
|
||||
$data | ConvertFrom-Csv | Export-Excel -path temp.xlsx -AutoSize -TableName Impressions
|
||||
Export-Excel -path temp.xlsx -worksheetName chartPage -ExcelChartDefinition $c -show
|
||||
$data | ConvertFrom-Csv | Export-Excel -path $xlSourcefile -AutoSize -TableName Impressions
|
||||
Export-Excel -path $xlSourcefile -worksheetName chartPage -ExcelChartDefinition $c -show
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item -Path Tools.xlsx
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = @"
|
||||
ID,Product,Quantity,Price,Total
|
||||
@@ -16,4 +19,4 @@ $c2 = New-ExcelChartDefinition -YRange "Total "-XRange "Product" -Title "Total
|
||||
$c3 = New-ExcelChartDefinition -YRange "Quantity"-XRange "Product" -Title "Sales volume" -NoLegend -Height 225 -Row 15
|
||||
|
||||
$data | ConvertFrom-Csv |
|
||||
Export-Excel -Path "Tools.xlsx" -AutoFilter -AutoNameRange -AutoSize -ExcelChartDefinition $c1,$c2,$c3 -Show
|
||||
Export-Excel -Path $xlSourcefile -AutoFilter -AutoNameRange -AutoSize -ExcelChartDefinition $c1,$c2,$c3 -Show
|
||||
BIN
Examples/Charts/Multiplecharts.png
Normal file
BIN
Examples/Charts/Multiplecharts.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
@@ -1,5 +1,9 @@
|
||||
$xlfile = "$env:TEMP\visitors.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Week, TotalVisitors
|
||||
@@ -23,5 +27,5 @@ $cd = New-ExcelChartDefinition `
|
||||
-NoLegend `
|
||||
-ChartTrendLine Linear
|
||||
|
||||
$data | Export-Excel $xlfile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd
|
||||
$data | Export-Excel $xlSourcefile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
function plot {
|
||||
param(
|
||||
@@ -10,8 +10,10 @@ function plot {
|
||||
$minx=[math]::Round($minx,1)
|
||||
$maxx=[math]::Round($maxx,1)
|
||||
|
||||
$file = 'C:\temp\plot.xlsx'
|
||||
Remove-Item $file -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
# $c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35
|
||||
|
||||
@@ -20,9 +22,9 @@ function plot {
|
||||
X=$i.ToString("N1")
|
||||
Y=(&$f $i)
|
||||
}
|
||||
}) | Export-Excel $file -Show -AutoNameRange -LineChart -NoLegend #-ExcelChartDefinition $c
|
||||
}) | Export-Excel $xlSourcefile -Show -AutoNameRange -LineChart -NoLegend #-ExcelChartDefinition $c
|
||||
}
|
||||
|
||||
function pi {[math]::pi}
|
||||
|
||||
plot {[math]::Tan($args[0])} (pi) (3*(pi)/2-.01)
|
||||
plot -f {[math]::Tan($args[0])} -minx (pi) -maxx (3*(pi)/2-.01)
|
||||
27
Examples/CommunityContributions/MultipleWorksheets.ps1
Normal file
27
Examples/CommunityContributions/MultipleWorksheets.ps1
Normal file
@@ -0,0 +1,27 @@
|
||||
<#
|
||||
To see this written up with example screenshots, head over to the IT Splat blog
|
||||
URL: http://bit.ly/2SxieeM
|
||||
#>
|
||||
|
||||
## Create an Excel file with multiple worksheets
|
||||
# Get a list of processes on the system
|
||||
$processes = Get-Process | Sort-Object -Property ProcessName | Group-Object -Property ProcessName | Where-Object {$_.Count -gt 2}
|
||||
|
||||
# Export the processes to Excel, each process on its own sheet
|
||||
$processes | ForEach-Object { $_.Group | Export-Excel -Path MultiSheetExample.xlsx -WorksheetName $_.Name -AutoSize -AutoFilter }
|
||||
|
||||
# Show the completed file
|
||||
Invoke-Item .\MultiSheetExample.xlsx
|
||||
|
||||
## Add an additional sheet to the new workbook
|
||||
# Use Open-ExcelPackage to open the workbook
|
||||
$excelPackage = Open-ExcelPackage -Path .\MultiSheetExample.xlsx
|
||||
|
||||
# Create a new worksheet and give it a name, set MoveToStart to make it the first sheet
|
||||
$ws = Add-Worksheet -ExcelPackage $excelPackage -WorksheetName 'All Services' -MoveToStart
|
||||
|
||||
# Get all the running services on the system
|
||||
Get-Service | Export-Excel -ExcelPackage $excelPackage -WorksheetName $ws -AutoSize -AutoFilter
|
||||
|
||||
# Close the package and show the final result
|
||||
Close-ExcelPackage -ExcelPackage $excelPackage -Show
|
||||
@@ -1,9 +1,9 @@
|
||||
echo Last7Days LastMonth LastWeek NextMonth NextWeek ThisMonth ThisWeek Today Tomorrow Yesterday |
|
||||
"Last7Days", "LastMonth", "LastWeek", "NextMonth", "NextWeek", "ThisMonth", "ThisWeek", "Today", "Tomorrow", "Yesterday" |
|
||||
Foreach-Object {
|
||||
$text = @"
|
||||
`$f = ".\testExport.xlsx"
|
||||
|
||||
rm `$f -ErrorAction Ignore
|
||||
remove-item `$f -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel `$f -Show -AutoSize -ConditionalText `$(
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "$env:temp\conditionalTextFormatting.xlsx"
|
||||
Remove-Item $file -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
Get-Service |
|
||||
Select-Object Status, Name, DisplayName, ServiceName |
|
||||
Export-Excel $file -Show -AutoSize -AutoFilter -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -AutoFilter -ConditionalText $(
|
||||
New-ConditionalText stop #Stop is the condition value, the rule is defaults to 'Contains text' and the default Colors are used
|
||||
New-ConditionalText runn darkblue cyan #runn is the condition value, the rule is defaults to 'Contains text'; the foregroundColur is darkblue and the background is cyan
|
||||
New-ConditionalText -ConditionalType EndsWith svc wheat green #the rule here is 'Ends with' and the value is 'svc' the forground is wheat and the background dark green
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Define a "Contains blanks" rule. No format is specified so it default to dark-red text on light-pink background.
|
||||
$ContainsBlanks = New-ConditionalText -ConditionalType ContainsBlanks
|
||||
|
||||
$data = $(
|
||||
New-PSItem a b c (echo p1 p2 p3)
|
||||
New-PSItem a b c @('p1', 'p2', 'p3')
|
||||
New-PSItem
|
||||
New-PSItem d e f
|
||||
New-PSItem
|
||||
@@ -12,8 +12,10 @@ $data = $(
|
||||
New-PSItem g h i
|
||||
)
|
||||
|
||||
$file ="$env:temp\testblanks.xlsx"
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
Remove-Item $file -ErrorAction Ignore
|
||||
#use the conditional format definition created above
|
||||
$data | Export-Excel $file -show -ConditionalText $ContainsBlanks
|
||||
$data | Export-Excel $xlSourcefile -show -ConditionalText $ContainsBlanks
|
||||
@@ -1,32 +1,34 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$path = "$env:temp\test.xlsx"
|
||||
Remove-Item -Path $path -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
#Export processes, and get an ExcelPackage object representing the file.
|
||||
$excel = Get-Process |
|
||||
Select-Object -Property Name,Company,Handles,CPU,PM,NPM,WS |
|
||||
Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -PassThru
|
||||
Export-Excel -Path $xlSourcefile -ClearSheet -WorkSheetname "Processes" -PassThru
|
||||
|
||||
$sheet = $excel.Workbook.Worksheets["Processes"]
|
||||
|
||||
#Apply fixed formatting to columns. Set-Format is an Alias for Set-Excel Range, -NFormat is an alias for numberformat
|
||||
#Apply fixed formatting to columns. -NFormat is an alias for numberformat
|
||||
$sheet.Column(1) | Set-ExcelRange -Bold -AutoFit
|
||||
$sheet.Column(2) | Set-Format -Width 29 -WrapText
|
||||
$sheet.Column(3) | Set-Format -HorizontalAlignment Right -NFormat "#,###"
|
||||
$sheet.Column(2) | Set-ExcelRange -Width 29 -WrapText
|
||||
$sheet.Column(3) | Set-ExcelRange -HorizontalAlignment Right -NFormat "#,###"
|
||||
|
||||
Set-ExcelRange -Range -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
|
||||
#Set-Format is an alias for Set-ExcelRange
|
||||
Set-Format -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
|
||||
#In Set-ExcelRange / Set-Format "-Address" is an alias for "-Range"
|
||||
Set-Format -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
|
||||
Set-ExcelRange -Range $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
|
||||
|
||||
Set-ExcelRange -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
|
||||
#In Set-ExcelRange "-Address" is an alias for "-Range"
|
||||
Set-ExcelRange -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
|
||||
|
||||
#Create a Red Data-bar for the values in Column D
|
||||
Add-ConditionalFormatting -WorkSheet $sheet -Address "D2:D1048576" -DataBarColor Red
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Address "D2:D1048576" -DataBarColor Red
|
||||
# Conditional formatting applies to "Addreses" aliases allow either "Range" or "Address" to be used in Set-ExcelRange or Add-Conditional formatting.
|
||||
Add-ConditionalFormatting -WorkSheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red
|
||||
|
||||
foreach ($c in 5..9) {Set-Format -Address $sheet.Column($c) -AutoFit }
|
||||
foreach ($c in 5..9) {Set-ExcelRange -Address $sheet.Column($c) -AutoFit }
|
||||
|
||||
#Create a pivot and save the file.
|
||||
Export-Excel -ExcelPackage $excel -WorkSheetname "Processes" -IncludePivotChart -ChartType ColumnClustered -NoLegend -PivotRows company -PivotData @{'Name'='Count'} -Show
|
||||
@@ -1,12 +1,13 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = "$env:TEMP\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = $(
|
||||
|
||||
New-PSItem North 111 (echo Region Amount )
|
||||
New-PSItem North 111 @( 'Region', 'Amount' )
|
||||
New-PSItem East 111
|
||||
New-PSItem West 122
|
||||
New-PSItem South 200
|
||||
@@ -21,10 +22,10 @@ $data = $(
|
||||
New-PSItem Westerly 120
|
||||
New-PSItem SouthWest 118
|
||||
)
|
||||
# in this example instead of doing $variable = New-Conditional text <parameters> .... ; Export-excel -conditionalText $variable <other parameters>
|
||||
# the syntax is used is Export-excel -conditionalText (New-Conditional text <parameters>) <other parameters>
|
||||
# in this example instead of doing $variable = New-Conditional text <parameters> .... ; Export-excel -ConditionalText $variable <other parameters>
|
||||
# the syntax is used is Export-excel -ConditionalText (New-Conditional text <parameters>) <other parameters>
|
||||
|
||||
|
||||
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)
|
||||
$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType BelowAverage)
|
||||
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType TopPercent)
|
||||
#$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)
|
||||
$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType BelowAverage)
|
||||
#$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType TopPercent)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
function Get-DateOffset {
|
||||
param($days=0)
|
||||
|
||||
|
||||
(Get-Date).AddDays($days).ToShortDateString()
|
||||
}
|
||||
|
||||
@@ -8,7 +10,7 @@ function Get-Number {
|
||||
Get-Random -Minimum 10 -Maximum 100
|
||||
}
|
||||
|
||||
New-PSItem (Get-DateOffset -7) (Get-Number) 'LastWeek,Last7Days,ThisMonth' (echo Date Amount Label)
|
||||
New-PSItem (Get-DateOffset -7) (Get-Number) 'LastWeek,Last7Days,ThisMonth' @('Date', 'Amount', 'Label')
|
||||
New-PSItem (Get-DateOffset) (Get-Number) 'Today,ThisMonth,ThisWeek'
|
||||
New-PSItem (Get-DateOffset -30) (Get-Number) LastMonth
|
||||
New-PSItem (Get-DateOffset -1) (Get-Number) 'Yesterday,ThisMonth,ThisWeek'
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item "$env:TEMP\testExport.xlsx" -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
Get-Process | Where-Object Company | Select-Object Company, Name, PM, Handles, *mem* |
|
||||
|
||||
#This example creates a 3 Icon set for the values in the "PM column, and Highlights company names (anywhere in the data) with different colors
|
||||
|
||||
Export-Excel "$env:TEMP\testExport.xlsx" -Show -AutoSize -AutoNameRange `
|
||||
Export-Excel -Path $xlSourcefile -Show -AutoSize -AutoNameRange `
|
||||
-ConditionalFormat $(
|
||||
New-ConditionalFormattingIconSet -Range "C:C" `
|
||||
-ConditionalFormat ThreeIconSet -IconType Arrows
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Last7Days
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType LastMonth
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType LastWeek
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType NextMonth
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType NextWeek
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType ThisMonth
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType ThisWeek
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Today
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Tomorrow
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Yesterday
|
||||
)
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = $(
|
||||
|
||||
New-PSItem North 111 (echo Region Amount )
|
||||
New-PSItem North 111 @('Region', 'Amount' )
|
||||
New-PSItem East 11
|
||||
New-PSItem West 12
|
||||
New-PSItem South 1000
|
||||
@@ -22,4 +23,4 @@ $data = $(
|
||||
New-PSItem SouthWest 11
|
||||
)
|
||||
|
||||
$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType DuplicateValues)
|
||||
$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType DuplicateValues)
|
||||
@@ -1,6 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item -Path .\test.xlsx -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$excel = @"
|
||||
Month,New York City,Austin Texas,Portland Oregon
|
||||
@@ -17,9 +20,9 @@ Oct,65,82,63
|
||||
Nov,54,71,52
|
||||
Dec,44,63,46
|
||||
"@ | ConvertFrom-csv |
|
||||
Export-Excel -Path .\test.xlsx -WorkSheetname Sheet1 -AutoNameRange -AutoSize -Title "Monthly Temperatures" -PassThru
|
||||
Export-Excel -Path $xlSourcefile -WorkSheetname Sheet1 -AutoNameRange -AutoSize -Title "Monthly Temperatures" -PassThru
|
||||
|
||||
$sheet = $excel.Workbook.Worksheets["Sheet1"]
|
||||
Add-ConditionalFormatting -WorkSheet $sheet -Range "B1:D14" -DataBarColor CornflowerBlue
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Range "B1:D14" -DataBarColor CornflowerBlue
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
@@ -1,19 +1,21 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
function Get-DateOffset ($days=0) {
|
||||
(Get-Date).AddDays($days).ToShortDateString()
|
||||
}
|
||||
|
||||
$(
|
||||
New-PSItem (Get-DateOffset -1) (Get-DateOffset 1) (echo Start End)
|
||||
New-PSItem (Get-DateOffset -1) (Get-DateOffset 1) @("Start", "End")
|
||||
New-PSItem (Get-DateOffset) (Get-DateOffset 7)
|
||||
New-PSItem (Get-DateOffset -10) (Get-DateOffset -1)
|
||||
) |
|
||||
|
||||
Export-Excel $f -Show -AutoSize -AutoNameRange -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -AutoNameRange -ConditionalText $(
|
||||
New-ConditionalText -Range Start -ConditionalType Yesterday -ConditionalTextColor Red
|
||||
New-ConditionalText -Range End -ConditionalType Yesterday -BackgroundColor Blue -ConditionalTextColor Red
|
||||
)
|
||||
@@ -1,6 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item -Path .\test.xlsx -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$excel = @"
|
||||
Month,Sales
|
||||
@@ -11,12 +14,12 @@ Apr,952
|
||||
May,770
|
||||
Jun,621
|
||||
"@ | ConvertFrom-csv |
|
||||
Export-Excel -Path .\test.xlsx -WorkSheetname Sheet1 -AutoNameRange -PassThru
|
||||
Export-Excel -Path $xlSourcefile -WorkSheetname Sheet1 -AutoNameRange -PassThru
|
||||
|
||||
$sheet = $excel.Workbook.Worksheets["Sheet1"]
|
||||
Add-ConditionalFormatting -WorkSheet $sheet -Range "B1:B7" -DataBarColor LawnGreen
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Range "B1:B7" -DataBarColor LawnGreen
|
||||
|
||||
Set-Format -Address $sheet.Cells["A8"] -Value "Total"
|
||||
Set-Format -Address $sheet.Cells["B8"] -Formula "=Sum(Sales)"
|
||||
Set-ExcelRange -Address $sheet.Cells["A8"] -Value "Total"
|
||||
Set-ExcelRange -Address $sheet.Cells["B8"] -Formula "=Sum(Sales)"
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
@@ -1,25 +1,29 @@
|
||||
try {ipmo ..\..\ImportExcel.psd1 -Force} catch {}
|
||||
try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return}
|
||||
|
||||
$data = $(
|
||||
New-PSItem 100 (echo test testx)
|
||||
New-PSItem 200
|
||||
New-PSItem 300
|
||||
New-PSItem 400
|
||||
New-PSItem 500
|
||||
)
|
||||
$data = $(
|
||||
New-PSItem 100 @('test', 'testx')
|
||||
New-PSItem 200
|
||||
New-PSItem 300
|
||||
New-PSItem 400
|
||||
New-PSItem 500
|
||||
)
|
||||
|
||||
$file1 = "$env:Temp\tryComparison1.xlsx"
|
||||
$file2 = "$env:Temp\tryComparison2.xlsx"
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile1 = "$env:TEMP\ImportExcelExample1.xlsx"
|
||||
$xlSourcefile2 = "$env:TEMP\ImportExcelExample2.xlsx"
|
||||
|
||||
rm $file1 -ErrorAction Ignore
|
||||
rm $file2 -ErrorAction Ignore
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile1"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile2"
|
||||
|
||||
$data | Export-Excel $file1 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThan 300
|
||||
New-ConditionalText -ConditionalType LessThan 300 -BackgroundColor cyan
|
||||
)
|
||||
Remove-Item $xlSourcefile1 -ErrorAction Ignore
|
||||
Remove-Item $xlSourcefile2 -ErrorAction Ignore
|
||||
|
||||
$data | Export-Excel $file2 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
|
||||
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
|
||||
)
|
||||
$data | Export-Excel $xlSourcefile1 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThan 300
|
||||
New-ConditionalText -ConditionalType LessThan 300 -BackgroundColor cyan
|
||||
)
|
||||
|
||||
$data | Export-Excel $xlSourcefile2 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
|
||||
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
|
||||
)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-csv @"
|
||||
Store,January,February,March,April,May,June
|
||||
store27,99511,64582,45216,48690,64921,54066
|
||||
store82,22275,23708,28223,26699,41388,31648
|
||||
store41,24683,22583,97947,31999,39092,41201
|
||||
store16,16568,48040,68589,20394,63202,26197
|
||||
store21,99353,23470,28398,21788,94101,88608
|
||||
store86,66662,83321,27489,92627,54084,24278
|
||||
store07,92692,53300,29284,39643,33556,53885
|
||||
store58,68875,83705,66635,81025,30207,75570
|
||||
store01,21292,82341,81339,12505,29516,41634
|
||||
store82,74047,93325,25002,40113,76278,45707
|
||||
"@
|
||||
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName RawData -WorksheetName RawData
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName TopData -WorksheetName StoresTop10Sales
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName Databar -WorksheetName StoresSalesDataBar
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName TwoColorScale -WorksheetName StoresSalesTwoColorScale
|
||||
|
||||
$xl = Open-ExcelPackage -Path $xlSourcefile
|
||||
|
||||
Set-ExcelRange -Worksheet $xl.StoresTop10Sales -Range $xl.StoresTop10Sales.dimension.address -NumberFormat 'Currency' -AutoSize
|
||||
Set-ExcelRange -Worksheet $xl.StoresSalesDataBar -Range $xl.StoresSalesDataBar.dimension.address -NumberFormat 'Currency' -AutoSize
|
||||
Set-ExcelRange -Worksheet $xl.StoresSalesTwoColorScale -Range $xl.StoresSalesDataBar.dimension.address -NumberFormat 'Currency' -AutoSize
|
||||
|
||||
Add-ConditionalFormatting -Worksheet $xl.StoresTop10Sales -Address $xl.StoresTop10Sales.dimension.address -RuleType Top -ForegroundColor white -BackgroundColor green -ConditionValue 10
|
||||
Add-ConditionalFormatting -Worksheet $xl.StoresSalesDataBar -Address $xl.StoresSalesDataBar.dimension.address -DataBarColor Red
|
||||
Add-ConditionalFormatting -Worksheet $xl.StoresSalesTwoColorScale -Address $xl.StoresSalesDataBar.dimension.address -RuleType TwoColorScale
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ConvertFrom-ExcelToSQLInsert People .\testSQLGen.xlsx
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = "$env:temp\dashboard.xlsx"
|
||||
Remove-Item $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = @"
|
||||
From,To,RDollars,RPercent,MDollars,MPercent,Revenue,Margin
|
||||
@@ -13,60 +15,60 @@ New York,San Francisco,3221000,.0629,1088000,.04,436,21
|
||||
New York,Phoneix,2782000,.0723,467000,.10,674,33
|
||||
"@ | ConvertFrom-Csv
|
||||
|
||||
$data | Export-Excel $f -AutoSize
|
||||
$data | Export-Excel $xlSourcefile -AutoSize
|
||||
|
||||
$excel = Open-ExcelPackage $f
|
||||
$excel = Open-ExcelPackage $xlSourcefile
|
||||
|
||||
$sheet1 = $excel.Workbook.Worksheets["sheet1"]
|
||||
|
||||
$sheet1.View.ShowGridLines = $false
|
||||
$sheet1.View.ShowHeaders = $false
|
||||
|
||||
Set-Format -Address $sheet1.Cells["C:C"] -NumberFormat "$#,##0" -WrapText -HorizontalAlignment Center
|
||||
Set-Format -Address $sheet1.Cells["D:D"] -NumberFormat "#.#0%" -WrapText -HorizontalAlignment Center
|
||||
Set-ExcelRange -Address $sheet1.Cells["C:C"] -NumberFormat "$#,##0" -WrapText -HorizontalAlignment Center
|
||||
Set-ExcelRange -Address $sheet1.Cells["D:D"] -NumberFormat "#.#0%" -WrapText -HorizontalAlignment Center
|
||||
|
||||
Set-Format -Address $sheet1.Cells["E:E"] -NumberFormat "$#,##0" -WrapText -HorizontalAlignment Center
|
||||
Set-Format -Address $sheet1.Cells["F:F"] -NumberFormat "#.#0%" -WrapText -HorizontalAlignment Center
|
||||
Set-ExcelRange -Address $sheet1.Cells["E:E"] -NumberFormat "$#,##0" -WrapText -HorizontalAlignment Center
|
||||
Set-ExcelRange -Address $sheet1.Cells["F:F"] -NumberFormat "#.#0%" -WrapText -HorizontalAlignment Center
|
||||
|
||||
Set-Format -Address $sheet1.Cells["G:H"] -WrapText -HorizontalAlignment Center
|
||||
Set-ExcelRange -Address $sheet1.Cells["G:H"] -WrapText -HorizontalAlignment Center
|
||||
|
||||
## Insert Rows/Columns
|
||||
$sheet1.InsertRow(1, 1)
|
||||
|
||||
foreach ($col in Write-Output 2 4 6 8 10 12 14) {
|
||||
foreach ($col in @(2, 4, 6, 8, 10, 12, 14)) {
|
||||
$sheet1.InsertColumn($col, 1)
|
||||
$sheet1.Column($col).width = .75
|
||||
}
|
||||
|
||||
Set-Format -Address $sheet1.Cells["E:E"] -Width 12
|
||||
Set-Format -Address $sheet1.Cells["I:I"] -Width 12
|
||||
Set-ExcelRange -Address $sheet1.Cells["E:E"] -Width 12
|
||||
Set-ExcelRange -Address $sheet1.Cells["I:I"] -Width 12
|
||||
|
||||
$BorderBottom = "Thick"
|
||||
$BorderColor = "Black"
|
||||
|
||||
Set-Format -Address $sheet1.Cells["A2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["A2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
|
||||
Set-Format -Address $sheet1.Cells["C2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-Format -Address $sheet1.Cells["E2:G2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-Format -Address $sheet1.Cells["I2:K2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-Format -Address $sheet1.Cells["M2:O2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["C2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["E2:G2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["I2:K2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["M2:O2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
|
||||
Set-Format -Address $sheet1.Cells["A2:C8"] -FontColor Gray
|
||||
Set-ExcelRange -Address $sheet1.Cells["A2:C8"] -FontColor Gray
|
||||
|
||||
$HorizontalAlignment = "Center"
|
||||
Set-Format -Address $sheet1.Cells["F1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Revenue
|
||||
Set-Format -Address $sheet1.Cells["J1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Margin
|
||||
Set-Format -Address $sheet1.Cells["N1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Passenger
|
||||
Set-ExcelRange -Address $sheet1.Cells["F1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Revenue
|
||||
Set-ExcelRange -Address $sheet1.Cells["J1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Margin
|
||||
Set-ExcelRange -Address $sheet1.Cells["N1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Passenger
|
||||
|
||||
Set-Format -Address $sheet1.Cells["E2"] -Value '($)'
|
||||
Set-Format -Address $sheet1.Cells["G2"] -Value '%'
|
||||
Set-Format -Address $sheet1.Cells["I2"] -Value '($)'
|
||||
Set-Format -Address $sheet1.Cells["K2"] -Value '%'
|
||||
Set-ExcelRange -Address $sheet1.Cells["E2"] -Value '($)'
|
||||
Set-ExcelRange -Address $sheet1.Cells["G2"] -Value '%'
|
||||
Set-ExcelRange -Address $sheet1.Cells["I2"] -Value '($)'
|
||||
Set-ExcelRange -Address $sheet1.Cells["K2"] -Value '%'
|
||||
|
||||
Set-Format -Address $sheet1.Cells["C10"] -HorizontalAlignment Right -Bold -Value "Grand Total Calculation"
|
||||
Set-Format -Address $sheet1.Cells["E10"] -Formula "=Sum(E3:E8)" -Bold
|
||||
Set-Format -Address $sheet1.Cells["I10"] -Formula "=Sum(I3:I8)" -Bold
|
||||
Set-Format -Address $sheet1.Cells["M10"] -Formula "=Sum(M3:M8)" -Bold
|
||||
Set-Format -Address $sheet1.Cells["O10"] -Formula "=Sum(O3:O8)" -Bold
|
||||
Set-ExcelRange -Address $sheet1.Cells["C10"] -HorizontalAlignment Right -Bold -Value "Grand Total Calculation"
|
||||
Set-ExcelRange -Address $sheet1.Cells["E10"] -Formula "=Sum(E3:E8)" -Bold
|
||||
Set-ExcelRange -Address $sheet1.Cells["I10"] -Formula "=Sum(I3:I8)" -Bold
|
||||
Set-ExcelRange -Address $sheet1.Cells["M10"] -Formula "=Sum(M3:M8)" -Bold
|
||||
Set-ExcelRange -Address $sheet1.Cells["O10"] -Formula "=Sum(O3:O8)" -Bold
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
|
||||
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
|
||||
|
||||
#>
|
||||
}
|
||||
BIN
Examples/ExcelBuiltIns/DSUM.png
Normal file
BIN
Examples/ExcelBuiltIns/DSUM.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
34
Examples/ExcelBuiltIns/DSUM.ps1
Normal file
34
Examples/ExcelBuiltIns/DSUM.ps1
Normal file
@@ -0,0 +1,34 @@
|
||||
# DSUM
|
||||
# Adds the numbers in a field (column) of records in a list or database that match conditions that you specify.
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Color,Date,Sales
|
||||
Red,1/15/2018,250
|
||||
Blue,1/15/2018,200
|
||||
Red,1/16/2018,175
|
||||
Blue,1/16/2018,325
|
||||
Red,1/17/2018,150
|
||||
Blue,1/17/2018,300
|
||||
"@
|
||||
|
||||
$xl = Export-Excel -InputObject $data -Path $xlSourcefile -AutoSize -AutoFilter -TableName SalesInfo -AutoNameRange -PassThru
|
||||
|
||||
$databaseAddress = $xl.Sheet1.Dimension.Address
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range C:C -NumberFormat '$##0'
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E1 -Value Color
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range F1 -Value Date
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range G1 -Value Sales
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E2 -Value Red
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E4 -Value Sales
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range F4 -Formula ('=DSUM({0},"Sales",E1:G2)' -f $databaseAddress) -NumberFormat '$##0'
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
23
Examples/ExcelBuiltIns/VLOOKUP.ps1
Normal file
23
Examples/ExcelBuiltIns/VLOOKUP.ps1
Normal file
@@ -0,0 +1,23 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Fruit,Amount
|
||||
Apples,50
|
||||
Oranges,20
|
||||
Bananas,60
|
||||
Lemons,40
|
||||
"@
|
||||
|
||||
$xl = Export-Excel -InputObject $data -Path $xlSourcefile -PassThru -AutoSize
|
||||
|
||||
Set-ExcelRange -Worksheet $xl.Sheet1 -Range D2 -BackgroundColor LightBlue -Value Apples
|
||||
|
||||
$rows = $xl.Sheet1.Dimension.Rows
|
||||
Set-ExcelRange -Worksheet $xl.Sheet1 -Range E2 -Formula "=VLookup(D2,A2:B$($rows),2,FALSE)"
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
BIN
Examples/ExcelBuiltIns/VLookUp.png
Normal file
BIN
Examples/ExcelBuiltIns/VLookUp.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
@@ -13,10 +13,12 @@
|
||||
* Add .01 in column F
|
||||
#>
|
||||
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$path = "$Env:TEMP\DataValidation.xlsx"
|
||||
Remove-Item $path -ErrorAction SilentlyContinue
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv -InputObject @"
|
||||
ID,Region,Product,Quantity,Price
|
||||
@@ -29,7 +31,7 @@ ID,Region,Product,Quantity,Price
|
||||
|
||||
# Export the raw data
|
||||
$excelPackage = $Data |
|
||||
Export-Excel -WorksheetName "Sales" -Path $path -PassThru
|
||||
Export-Excel -WorksheetName "Sales" -Path $xlSourcefile -PassThru
|
||||
|
||||
# Creates a sheet with data that will be used in a validation rule
|
||||
$excelPackage = @('Chisel', 'Crowbar', 'Drill', 'Hammer', 'Nails', 'Saw', 'Screwdriver', 'Wrench') |
|
||||
@@ -39,7 +41,7 @@ $excelPackage = @('Chisel', 'Crowbar', 'Drill', 'Hammer', 'Nails', 'Saw', 'Screw
|
||||
|
||||
#region Creating a list using a PowerShell array
|
||||
$ValidationParams = @{
|
||||
WorkSheet = $excelPackage.sales
|
||||
Worksheet = $excelPackage.sales
|
||||
ShowErrorMessage = $true
|
||||
ErrorStyle = 'stop'
|
||||
ErrorTitle = 'Invalid Data'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ConvertFrom-ExcelToSQLInsert -TableName "Movies" -Path ".\Movies.xlsx" -ConvertEmptyStringsToNull
|
||||
''
|
||||
|
||||
46
Examples/Experimental/Export-MultipleExcelSheets.ps1
Normal file
46
Examples/Experimental/Export-MultipleExcelSheets.ps1
Normal file
@@ -0,0 +1,46 @@
|
||||
function Export-MultipleExcelSheets {
|
||||
<#
|
||||
.Synopsis
|
||||
Takes a hash table of scriptblocks and exports each as a sheet in an Excel file
|
||||
|
||||
.Example
|
||||
$p = Get-Process
|
||||
|
||||
$InfoMap = @{
|
||||
PM = { $p | Select-Object company, pm }
|
||||
Handles = { $p | Select-Object company, handles }
|
||||
Services = { Get-Service }
|
||||
}
|
||||
|
||||
Export-MultipleExcelSheets -Path $xlfile -InfoMap $InfoMap -Show -AutoSize
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
$Path,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[hashtable]$InfoMap,
|
||||
[string]$Password,
|
||||
[Switch]$Show,
|
||||
[Switch]$AutoSize
|
||||
)
|
||||
|
||||
$parameters = @{ } + $PSBoundParameters
|
||||
$parameters.Remove("InfoMap")
|
||||
$parameters.Remove("Show")
|
||||
|
||||
$parameters.Path = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)
|
||||
|
||||
foreach ($entry in $InfoMap.GetEnumerator()) {
|
||||
if ($entry.Value -is [scriptblock]) {
|
||||
Write-Progress -Activity "Exporting" -Status "$($entry.Key)"
|
||||
$parameters.WorkSheetname = $entry.Key
|
||||
|
||||
& $entry.Value | Export-Excel @parameters
|
||||
}
|
||||
else {
|
||||
Write-Warning "$($entry.Key) not exported, needs to be a scriptblock"
|
||||
}
|
||||
}
|
||||
|
||||
if ($Show) { Invoke-Item $Path }
|
||||
}
|
||||
19
Examples/Experimental/tryExportMultipleExcelSheets.ps1
Normal file
19
Examples/Experimental/tryExportMultipleExcelSheets.ps1
Normal file
@@ -0,0 +1,19 @@
|
||||
. "$PSScriptRoot\Export-MultipleExcelSheets.ps1"
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$p = Get-Process
|
||||
|
||||
$InfoMap = @{
|
||||
PM = { $p | Select-Object company, pm }
|
||||
Handles = { $p | Select-Object company, handles }
|
||||
Services = { Get-Service }
|
||||
Files = { Get-ChildItem -File }
|
||||
Albums = { ConvertFrom-Csv (Invoke-RestMethod https://raw.githubusercontent.com/dfinke/powershell-for-developers/master/chapter05/BeaverMusic/BeaverMusic.UI.Shell/albums.csv) }
|
||||
WillNotGetExported = "Hello World"
|
||||
}
|
||||
|
||||
Export-MultipleExcelSheets -Path $xlSourcefile -InfoMap $InfoMap -Show -AutoSize
|
||||
@@ -1,9 +1,11 @@
|
||||
param ($fibonacciDigits=10)
|
||||
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "fib.xlsx"
|
||||
Remove-Item "fib.xlsx" -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$(
|
||||
New-PSItem 0
|
||||
@@ -15,4 +17,4 @@ $(
|
||||
New-PSItem ('=a{0}+a{1}' -f ($_+1),$_)
|
||||
}
|
||||
)
|
||||
) | Export-Excel $file -Show
|
||||
) | Export-Excel $xlSourcefile -Show
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlfile = "$env:temp\testFmt.xlsx"
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
Get-Process |
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlfile -Show -AutoSize -CellStyleSB {
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB {
|
||||
param(
|
||||
$workSheet,
|
||||
$totalRows,
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
$data = ConvertFrom-Csv @'
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$data = ConvertFrom-Csv @'
|
||||
Item,Quantity,Price,Total Cost
|
||||
Footballs,9,21.95,197.55
|
||||
Cones,36,7.99,287.64
|
||||
@@ -16,9 +18,9 @@ $pkg = $data | Export-Excel -Path $f -AutoSize -PassThru
|
||||
|
||||
$ws = $pkg.Workbook.Worksheets["Sheet1"]
|
||||
|
||||
Set-ExcelRange -WorkSheet $ws -Range "A2:C6" -BackgroundColor PeachPuff -FontColor Purple -FontSize 12 -Width 12
|
||||
Set-ExcelRange -WorkSheet $ws -Range "D2:D6" -BackgroundColor WhiteSmoke -FontColor Orange -Bold -FontSize 12 -Width 12
|
||||
Set-ExcelRange -WorkSheet $ws -Range "A1:D1" -BackgroundColor BlueViolet -FontColor Wheat -FontSize 12 -Width 12
|
||||
Set-ExcelRange -WorkSheet $ws -Range "A:A" -Width 15
|
||||
Set-ExcelRange -Worksheet $ws -Range "A2:C6" -BackgroundColor PeachPuff -FontColor Purple -FontSize 12 -Width 12
|
||||
Set-ExcelRange -Worksheet $ws -Range "D2:D6" -BackgroundColor WhiteSmoke -FontColor Orange -Bold -FontSize 12 -Width 12
|
||||
Set-ExcelRange -Worksheet $ws -Range "A1:D1" -BackgroundColor BlueViolet -FontColor Wheat -FontSize 12 -Width 12
|
||||
Set-ExcelRange -Worksheet $ws -Range "A:A" -Width 15
|
||||
|
||||
Close-ExcelPackage -ExcelPackage $pkg -Show
|
||||
@@ -1,7 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlfile = "$env:temp\testFmt.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$RandomStyle = {
|
||||
param(
|
||||
@@ -11,10 +13,10 @@ $RandomStyle = {
|
||||
)
|
||||
|
||||
2..$totalRows | ForEach-Object{
|
||||
Set-CellStyle $workSheet $_ $LastColumn Solid (Write-Output LightGreen Gray Red|Get-Random)
|
||||
Set-CellStyle $workSheet $_ $LastColumn Solid (Get-Random @("LightGreen", "Gray", "Red"))
|
||||
}
|
||||
}
|
||||
|
||||
Get-Process |
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlfile -Show -AutoSize -CellStyleSB $RandomStyle
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB $RandomStyle
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
if(!(gcm ig -ErrorAction SilentlyContinue)) {
|
||||
if(!(Get-Command ig -ErrorAction SilentlyContinue)) {
|
||||
|
||||
"Use ``Install-Module NameIT`` to get the needed module from the gallery to support running this script"
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
$sign=@{sign=echo + -}
|
||||
$location=@{location=echo Atlanta Newark Washington Chicago Philadelphia Houston Phoneix}
|
||||
$sign=@{sign=@( "+", "-" )}
|
||||
$location=@{location=@("Atlanta", "Newark", "Washington", "Chicago", "Philadelphia", "Houston", "Phoneix")}
|
||||
|
||||
$(1..6 | Foreach-Object {
|
||||
|
||||
|
||||
$from=$to=""
|
||||
while($from -eq $to) {
|
||||
$from=ig "[location]" -CustomData $location
|
||||
$to=ig "[location]" -CustomData $location
|
||||
}
|
||||
}
|
||||
|
||||
[double]$a=ig "########"
|
||||
[double]$b=ig ".####"
|
||||
[double]$c=ig "#######"
|
||||
[double]$d=ig "[sign].##" -CustomData $sign
|
||||
[double]$e=ig "###"
|
||||
[double]$e=ig "###"
|
||||
[double]$f=ig "[sign]##" -CustomData $sign
|
||||
|
||||
#"{0},{1},{2},{3},{4},{5},{6},{7}" -f $from, $to, $a, $b, $c, $d, $e, $f
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
$xlfile = "$env:TEMP\Points.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Points `
|
||||
-PivotRows Driver, Date -PivotData @{Points = "SUM"} -GroupDateRow Date -GroupDatePart Years, Months
|
||||
|
||||
Import-Csv "$PSScriptRoot\First10Races.csv" |
|
||||
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Export-Excel $xlfile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
@@ -1,10 +1,13 @@
|
||||
$xlfile = "$env:TEMP\Places.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Places `
|
||||
-PivotRows Driver, FinishPosition -PivotData @{Date = "Count"} -GroupNumericRow FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3
|
||||
|
||||
Import-Csv "$PSScriptRoot\First10Races.csv" |
|
||||
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Export-Excel $xlfile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
@@ -1,3 +1,4 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
$data = ConvertFrom-Csv @"
|
||||
Timestamp,Tenant
|
||||
10/29/2018 3:00:00.123,1
|
||||
@@ -13,10 +14,12 @@ Timestamp,Tenant
|
||||
10/29/2018 3:01:40.989,1
|
||||
10/29/2018 3:01:50.545,1
|
||||
10/29/2018 3:02:00.999,1
|
||||
"@ | Select-Object @{n = 'Timestamp'; e = {get-date $_.timestamp}}, tenant, @{n = 'Bucket'; e = { - (get-date $_.timestamp).Second % 30}}
|
||||
"@ | Select-Object @{n = 'Timestamp'; e = {Get-date $_.timestamp}}, tenant, @{n = 'Bucket'; e = { - (Get-date $_.timestamp).Second % 30}}
|
||||
|
||||
$f = "$env:temp\pivottest.xlsx"
|
||||
Remove-Item $f -ErrorAction SilentlyContinue
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$pivotDefParams = @{
|
||||
PivotTableName = 'Timestamp Buckets'
|
||||
@@ -29,7 +32,7 @@ $pivotDefParams = @{
|
||||
|
||||
$excelParams = @{
|
||||
PivotTableDefinition = New-PivotTableDefinition @pivotDefParams
|
||||
Path = $f
|
||||
Path = $xlSourcefile
|
||||
WorkSheetname = "Log Data"
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
@"
|
||||
site,link
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#We will create links to each race in the first 10 rows of the spreadSheet
|
||||
#The next row will be column labels
|
||||
#After that will come a block for each race.
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Read the data, and decide how much space to leave for the hyperlinks
|
||||
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
|
||||
Import-Html "http://en.wikipedia.org/wiki/Demographics_of_India" 4
|
||||
@@ -1,3 +1,3 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Import-Html "http://www.science.co.il/PTelements.asp" 1
|
||||
@@ -1,3 +1,3 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Import-Html "https://en.wikipedia.org/wiki/List_of_Star_Trek:_The_Original_Series_episodes" 2
|
||||
@@ -1,5 +1,5 @@
|
||||
#requires -modules "Get-IndexedItem"
|
||||
[cmdletbinding()]
|
||||
[CmdletBinding()]
|
||||
Param()
|
||||
Remove-Item ~\documents\music.xlsx -ErrorAction SilentlyContinue
|
||||
[System.Diagnostics.Stopwatch]$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
|
||||
@@ -22,7 +22,7 @@ $ws = $excel.Music
|
||||
Set-ExcelRow -Worksheet $ws -Row 1 -Value {($worksheet.cells[$row,$column].value -replace '^SYSTEM\.','') -replace '^MEDIA\.|^AUDIO\.|^MUSIC\.','' }
|
||||
Set-ExcelColumn -Worksheet $ws -Column 5 -NumberFormat 'mm:ss.0' -StartRow 2 -Value {$worksheet.cells[$row,$column].value / 864000000000 }
|
||||
Write-Verbose -Message ("Cells Reset: " + $stopwatch.Elapsed.TotalSeconds)
|
||||
Set-Column -Worksheet $ws -Column 6 -NumberFormat '#.#,,"MB"'
|
||||
Set-ExcelColumn -Worksheet $ws -Column 6 -NumberFormat '#.#,,"MB"'
|
||||
Set-ExcelColumn -Worksheet $ws -Column 7 -NumberFormat '0.0,"KHz"'
|
||||
$ws.Cells[$ws.Dimension].AutoFitColumns()
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#Get rid of pre-exisiting sheet
|
||||
$path = "$Env:TEMP\test.xlsx"
|
||||
remove-item -Path $path -ErrorAction SilentlyContinue
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
#Create simple pages for 3 stores with product ID, Product Name, quanity price and total
|
||||
|
||||
@@ -11,7 +14,7 @@ ID,Product,Quantity,Price,Total
|
||||
12003,Saw,12,15.37,184.44
|
||||
12010,Drill,20,8,160
|
||||
12011,Crowbar,7,23.48,164.36
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $path -WorkSheetname Oxford
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Oxford
|
||||
|
||||
@"
|
||||
ID,Product,Quantity,Price,Total
|
||||
@@ -20,7 +23,7 @@ ID,Product,Quantity,Price,Total
|
||||
12003,Saw,10,15.37,153.70
|
||||
12010,Drill,10,8,80
|
||||
12012,Pliers,2,14.99,29.98
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $path -WorkSheetname Abingdon
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Abingdon
|
||||
|
||||
|
||||
@"
|
||||
@@ -29,7 +32,7 @@ ID,Product,Quantity,Price,Total
|
||||
12002,Hammer,2,12.10,24.20
|
||||
12010,Drill,11,8,88
|
||||
12012,Pliers,3,14.99,44.97
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $path -WorkSheetname Banbury
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Banbury
|
||||
|
||||
#define a pivot table with a chart to show a sales by store, broken down by product
|
||||
$ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -PivotColumns "Product" -PivotData @{"Total"="SUM"} -IncludePivotChart -ChartTitle "Sales Breakdown" -ChartType ColumnStacked -ChartColumn 10
|
||||
@@ -40,4 +43,4 @@ $ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -
|
||||
#Put in a title and freeze to top of the sheet including title and colmun headings
|
||||
#Add the Pivot table.
|
||||
#Show the result
|
||||
Join-Worksheet -Path $path -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "Combined" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -PivotTableDefinition $ptdef -show
|
||||
Join-Worksheet -Path $xlSourcefile -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "Combined" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -PivotTableDefinition $ptdef -show
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$path = "$env:TEMP\Test.xlsx"
|
||||
Remove-item -Path $path -ErrorAction SilentlyContinue
|
||||
#Export disk volume, and Network adapter to their own sheets.
|
||||
Get-WmiObject -Class win32_logicaldisk |
|
||||
Get-CimInstance -ClassName Win32_LogicalDisk |
|
||||
Select-Object -Property DeviceId,VolumeName, Size,Freespace |
|
||||
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"
|
||||
Export-Excel -Path $xlSourcefile -WorkSheetname Volumes -NumberFormat "0,000"
|
||||
Get-NetAdapter |
|
||||
Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed |
|
||||
Export-Excel -Path $path -WorkSheetname NetAdapters
|
||||
Export-Excel -Path $xlSourcefile -WorkSheetname NetAdapters
|
||||
|
||||
#Create a summary page with a title of Summary, label the blocks with the name of the sheet they came from and hide the source sheets
|
||||
Join-Worksheet -Path $path -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show
|
||||
Join-Worksheet -Path $xlSourcefile -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlfile = "$env:temp\AllSales.xlsx"
|
||||
|
||||
Remove-Item $xlfile -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$params = @{
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
AutoNameRange = $true
|
||||
ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold'
|
||||
Path = $xlfile
|
||||
Path = $xlSourcefile
|
||||
}
|
||||
#Import 4 sets of sales data from 4 CSV files, using the parameters above.
|
||||
Import-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ColumnChart -Title "Central Limit Theorem" -NoLegend ($(
|
||||
for ($i = 1; $i -le 500; $i++) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Sum up handles by company
|
||||
# Show the Pie Chart
|
||||
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
PieChart -Title "Total Handles by Company" `
|
||||
(Invoke-Sum (Get-Process | Where-Object company) company handles)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Sum up PM by company
|
||||
# Show the Pie Chart
|
||||
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
PieChart -Title "Total PM by Company" `
|
||||
(Invoke-Sum (Get-Process|Where-Object company) company pm)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
$PropertyNames = echo Cost Date Name
|
||||
$PropertyNames = @("Cost", "Date", "Name")
|
||||
|
||||
New-PSItem 1.1 1/1/2015 John $PropertyNames
|
||||
New-PSItem 2.1 1/2/2015 Tom
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
BarChart (.\TargetData.ps1) "A BarChart"
|
||||
@@ -1,3 +1,3 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ColumnChart (.\TargetData.ps1) "A ColumnChart"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
PieChart (.\TargetData.ps1) "A PieChart"
|
||||
@@ -1,8 +1,9 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlFile = "$env:TEMP\mw.xlsx"
|
||||
|
||||
Remove-Item $xlFile -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$leftCsv = @"
|
||||
MyProp1,MyProp2,Length
|
||||
@@ -16,4 +17,4 @@ a,b,10
|
||||
c,d,21
|
||||
"@ | ConvertFrom-Csv
|
||||
|
||||
Merge-Worksheet -OutputFile $xlFile -ReferenceObject $leftCsv -DifferenceObject $rightCsv -Key Length -Show
|
||||
Merge-Worksheet -OutputFile $xlSourcefile -ReferenceObject $leftCsv -DifferenceObject $rightCsv -Key Length -Show
|
||||
@@ -1,7 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
|
||||
|
||||
#Get a subset of services into $s and export them
|
||||
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property *
|
||||
[System.Collections.ArrayList]$s = Get-service | Select-Object -first 25 -Property *
|
||||
$s | Export-Excel -Path $env:temp\server1.xlsx
|
||||
|
||||
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s.
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
|
||||
|
||||
#Get a subset of services into $s and export them
|
||||
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name,DisplayName,StartType
|
||||
[System.Collections.ArrayList]$s = Get-service | Select-Object -first 25 -Property Name,DisplayName,StartType
|
||||
$s | Export-Excel -Path $env:temp\server1.xlsx
|
||||
|
||||
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s.
|
||||
|
||||
@@ -7,8 +7,9 @@ param(
|
||||
$InterestRate = .065,
|
||||
$Term = 30
|
||||
)
|
||||
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
function New-CellData {
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='Does not change system state')]
|
||||
param(
|
||||
$Range,
|
||||
$Value,
|
||||
@@ -16,7 +17,7 @@ function New-CellData {
|
||||
)
|
||||
|
||||
$setFormatParams = @{
|
||||
WorkSheet = $ws
|
||||
Worksheet = $ws
|
||||
Range = $Range
|
||||
NumberFormat = $Format
|
||||
}
|
||||
@@ -28,7 +29,7 @@ function New-CellData {
|
||||
$setFormatParams.Value = $Value
|
||||
}
|
||||
|
||||
Set-Format @setFormatParams
|
||||
Set-ExcelRange @setFormatParams
|
||||
}
|
||||
|
||||
$f = "$PSScriptRoot\mortgage.xlsx"
|
||||
@@ -37,19 +38,19 @@ Remove-Item $f -ErrorAction SilentlyContinue
|
||||
$pkg = "" | Export-Excel $f -Title 'Fixed Rate Loan Payments' -PassThru -AutoSize
|
||||
$ws = $pkg.Workbook.Worksheets["Sheet1"]
|
||||
|
||||
New-CellData A3 'Amount'
|
||||
New-CellData B3 $Amount '$#,##0'
|
||||
New-CellData -Range A3 -Value 'Amount'
|
||||
New-CellData -Range B3 -Value $Amount -Format '$#,##0'
|
||||
|
||||
New-CellData A4 "Interest Rate"
|
||||
New-CellData B4 $InterestRate 'Percentage'
|
||||
New-CellData -Range A4 -Value "Interest Rate"
|
||||
New-CellData -Range B4 -Value $InterestRate -Format 'Percentage'
|
||||
|
||||
New-CellData A5 "Term (Years)"
|
||||
New-CellData B5 $Term
|
||||
New-CellData -Range A5 -Value "Term (Years)"
|
||||
New-CellData -Range B5 -Value $Term
|
||||
|
||||
New-CellData D3 "Monthly Payment"
|
||||
New-CellData F3 "=-PMT(F4, B5*12, B3)" '$#,##0.#0'
|
||||
New-CellData -Range D3 -Value "Monthly Payment"
|
||||
New-CellData -Range F3 -Value "=-PMT(F4, B5*12, B3)" -Format '$#,##0.#0'
|
||||
|
||||
New-CellData D4 "Monthly Rate"
|
||||
New-CellData F4 "=((1+B4)^(1/12))-1" 'Percentage'
|
||||
New-CellData -Range D4 -Value "Monthly Rate"
|
||||
New-CellData -Range F4 -Value "=((1+B4)^(1/12))-1" -Format 'Percentage'
|
||||
|
||||
Close-ExcelPackage $pkg -Show
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlfile = "$env:TEMP\testThis.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction Ignore
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$header = echo `
|
||||
'Date/Time - Peak Brightness (UT)' `
|
||||
'Latitude (Deg)' `
|
||||
'Longitude (Deg)' `
|
||||
'Altitude (km)' `
|
||||
'Velocity (km/s)' `
|
||||
'Velocity Components (km/s) vx' `
|
||||
'Velocity Components (km/s) vy' `
|
||||
'Velocity Components (km/s) vz' `
|
||||
'Total Radiated Energy (J)' `
|
||||
$header = @(
|
||||
'Date/Time - Peak Brightness (UT)' ,
|
||||
'Latitude (Deg)' ,
|
||||
'Longitude (Deg)' ,
|
||||
'Altitude (km)' ,
|
||||
'Velocity (km/s)' ,
|
||||
'Velocity Components (km/s) vx' ,
|
||||
'Velocity Components (km/s) vy' ,
|
||||
'Velocity Components (km/s) vz' ,
|
||||
'Total Radiated Energy (J)' ,
|
||||
'Calculated Total Impact Energy (kt)'
|
||||
)
|
||||
|
||||
$splat=@{
|
||||
url='http://neo.jpl.nasa.gov/fireballs/'
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
function New-PSItem {
|
||||
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='Does not change system state')]
|
||||
param()
|
||||
$totalArgs = $args.Count
|
||||
|
||||
if($args[-1] -is [array]) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "$env:TEMP\disks.xlsx"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "$env:temp\disks.xlsx"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "disks.xlsx"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "disks.xlsx"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "disks.xlsx"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "disks.xlsx"
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user