Compare commits

...

272 Commits

Author SHA1 Message Date
dfinke
8bb3d50052 Add sample - How to convert abbreviate or shorten long numbers in Excel 2022-05-29 09:54:02 -04:00
dfinke
d5b807d3cb Don't publish images folder and more - Suggestion: Remove unnecessary files when publishing to the gallery #1187 2022-05-28 06:32:01 -04:00
Doug Finke
e2053e4998 fix casing 2022-05-07 17:19:15 -04:00
Doug Finke
8c6c7eeaf6 update 2022-05-07 17:15:24 -04:00
Doug Finke
31abd215dc Merge pull request #1181 from dfinke/update-read-me
Update read me
2022-05-07 09:50:06 -04:00
dfinke
cafaafd53d add link to original readme 2022-05-07 09:45:16 -04:00
dfinke
ee3c8e7680 use / 2022-05-07 09:40:18 -04:00
dfinke
0b207548e0 fix link 2022-05-07 09:39:52 -04:00
dfinke
6628b55ce5 update link 2022-05-07 09:38:28 -04:00
dfinke
f6bfabd96a remove encoding 2022-05-07 09:34:02 -04:00
dfinke
980631df8b update xlsx link 2022-05-07 09:33:08 -04:00
dfinke
4f9b83f0e6 update logo 2022-05-07 08:17:19 -04:00
dfinke
59cf89b451 Additional updates 2022-05-07 08:08:49 -04:00
dfinke
5777d907c4 added Azure pipeline badge 2022-05-06 13:11:56 -04:00
dfinke
d7c516d35e Merge branch 'update-read-me' of https://github.com/dfinke/ImportExcel into update-read-me 2022-05-06 13:01:21 -04:00
dfinke
27d69e7531 Update pointing to examples 2022-05-06 13:01:12 -04:00
Doug Finke
8ae92fba54 spelling 2022-05-05 21:19:24 -04:00
dfinke
aa0f0cf4e2 layout 2022-05-05 18:36:19 -04:00
dfinke
6e38d97498 fix header 2022-05-05 18:35:59 -04:00
dfinke
ef7c8331f5 add links for versions, donate etc 2022-05-05 18:34:56 -04:00
dfinke
267d15f99a Add videos and articles 2022-05-05 18:21:27 -04:00
dfinke
390aca0496 update 2022-05-05 16:58:15 -04:00
dfinke
4fa34ae257 Rename switch NotAsDictionary to Raw 2022-05-04 18:33:19 -04:00
dfinke
0b3b382c4e update 2022-05-04 18:32:27 -04:00
dfinke
415be5bca3 bump version 2022-05-04 18:32:19 -04:00
dfinke
79e5bdf8ba update 2022-05-03 17:54:21 -04:00
dfinke
b03d9b048a bump version 2022-05-03 17:54:16 -04:00
dfinke
aea90aa8d6 Fix reading multiple sheets in the xlsx where row/col count is diff 2022-05-03 17:53:58 -04:00
dfinke
d4ebc9e95d Use explicit parameter names 2022-04-30 13:17:20 -04:00
Doug Finke
6ece4483e2 Merge pull request #1171 from dfinke/add-helper-functions
Add helper functions `Enable-ExcelAutoFilter`,  `Enable-ExcelAutofit`, `Get-ExcelSheetDimensionAddress`
2022-04-30 08:35:08 -04:00
dfinke
ba14511254 update changelog 2022-04-30 08:21:24 -04:00
dfinke
964cf9e9c6 Merge branch 'master' of https://github.com/dfinke/ImportExcel into add-helper-functions 2022-04-30 08:21:18 -04:00
Doug Finke
8d56a351ff Merge pull request #1161 from dfinke/adding-to-import-excel
Update and improve Import-Excel for reading nultiple sheets
2022-04-30 08:04:39 -04:00
dfinke
b2119f08f5 add example for importing an xlsx and multiple sheets 2022-04-30 07:59:22 -04:00
dfinke
634aaacc55 update change log 2022-04-30 07:58:55 -04:00
dfinke
61b44f826d Merge branch 'master' of https://github.com/dfinke/ImportExcel into adding-to-import-excel 2022-04-30 07:25:58 -04:00
Doug Finke
9273261b34 Merge pull request #1173 from dfinke/fix-bug-#1172
Fix bug #1172
2022-04-30 07:10:57 -04:00
dfinke
e55dfdd10e Update changes 2022-04-30 07:05:10 -04:00
dfinke
59e40d62d0 bump version 2022-04-30 07:05:04 -04:00
dfinke
f478e8a134 Add Enable-ExcelAutoFilter and Enable-ExcelAutofit example 2022-04-29 22:11:24 -04:00
dfinke
b634bf9d93 Fix fir #1172 2022-04-29 20:39:51 -04:00
dfinke
a10ade898a Remove xl file after use in test 2022-04-29 20:39:15 -04:00
dfinke
eb10364722 Add helpers 2022-04-28 19:44:49 -04:00
dfinke
b0024cf2c4 bump version 2022-04-28 19:44:40 -04:00
dfinke
91b0e8b0ed update https://github.com/dfinke/ImportExcel/pull/1145 2022-04-19 09:26:20 -04:00
dfinke
b997e90e78 bump version 2022-04-19 09:23:36 -04:00
Doug Finke
4d8710d017 Merge pull request #1145 from jamesmmueller/master
Allow for escaping of single quote in data.
2022-04-19 09:12:20 -04:00
dfinke
7f36b44fa8 renamed to NotAsDictionary 2022-04-12 18:08:11 -04:00
dfinke
483f761016 Add switch to not return data as a dictionary 2022-04-12 18:03:34 -04:00
dfinke
d55f0e64d4 WIP - Add sheets and contents to a hashtable 2022-04-11 18:48:17 -04:00
dfinke
f83f654c4a Update how Import-Excel reads sheets, and remain backward compatible 2022-04-11 16:58:55 -04:00
dfinke
6a956dbd7e delete xlsx after tests run 2022-04-11 16:58:13 -04:00
Doug Finke
0929a442a5 Merge pull request #1149 from caosborn/CO_Examples-AddWorksheetVBA
Adding VBA examples for worksheets
2022-03-27 10:21:15 -04:00
Doug Finke
895a5c0cb2 Merge pull request #1150 from dfinke/isolate-build-issues
Fixes `Get-Service` fail on Windows 2022
2022-03-27 09:44:52 -04:00
dfinke
d7901af8f3 try always importing the clixml 2022-03-27 09:37:15 -04:00
dfinke
34f55a3659 suspect Get-Service 2022-03-25 19:32:53 -04:00
dfinke
606988bcf6 rigger build 2022-03-25 18:45:06 -04:00
Craig Osborn
441f2ada22 fix: Typo in filename 2022-03-25 08:43:48 +00:00
Craig Osborn
29ea7012d7 examples: Add VBA module and call in all worksheets 2022-03-25 08:36:02 +00:00
Craig Osborn
67ac63ddcf examples: Add VBA to single worksheet 2022-03-25 08:35:13 +00:00
James Mueller
c939c6ecb0 Merge pull request #1 from jamesmmueller/jamesmmueller-patch-1
ConvertFrom-ExcelToSQLInsert fix single quotes
2022-03-17 10:55:37 -05:00
James Mueller
96493e059b ConvertFrom-ExcelToSQLInsert fix single quotes
If data in the Excel file contains single quotes, then the insert will bomb as it will be malformed. Quotes would need escaped. Not all languages will support the same escape method, so I recommend it being set by an optional parameter.

Example of what will fail:
  Name
  -----------
  Fry's

INSERT INTO [Name] Values ( 'Fry's' ) 

Corrected for quotes (such as needing to escape a single quote with an additional single quote)

INSERT INTO [Name] Values ('Fry''s') 


Example code:
$ConvertToSqlParams = @{TableName = ‘dbo.Names’
Path = ‘C:\temp\data.xlsx’
ConvertEmptyStringsToNull = $true
UseMSSQLSyntax = $true
SingleQuoteStyle = "''"
}

$SQLInsert = ConvertFrom-ExcelToSqlInsert @ConvertToSqlParams
2022-03-11 16:09:38 -06:00
Doug Finke
cb7f2a06f4 Remove vscode badge 2022-03-06 14:52:37 -05:00
Doug Finke
99beda7a10 Move to mixed case folders 2022-03-06 14:51:30 -05:00
dfinke
0c8bb2300a update links 2022-02-04 17:31:39 -05:00
dfinke
c09083d350 updated 2022-02-04 17:30:40 -05:00
dfinke
556f0ac51e Updated changelog 2022-02-04 17:28:30 -05:00
Doug Finke
1e4fc59a25 Merge pull request #1133 from joshooaj/master
Add Add-ExcelImage example
2022-02-04 15:48:05 -05:00
dfinke
5ab6a9116d @joshooaj added throw if not on Windows, pls review 2022-02-03 18:43:15 -05:00
Josh Hendricks
f33215382a docs: rename to AddImage for consistency 2022-02-02 08:31:35 -08:00
Josh Hendricks
cf5d3f83d6 docs: Update readme 2022-02-02 08:16:22 -08:00
Josh Hendricks
91da711635 docs: add Add-ExcelImage example 2022-02-01 21:37:55 -08:00
Doug Finke
eec5e343d4 Merge pull request #1118 from dfinke/add-freeze-pane-example
Add FreezePane Example
2021-12-30 14:46:52 -05:00
dfinke
d69b640edc Add FreezePane Example 2021-12-30 14:39:33 -05:00
Doug Finke
2ca870a889 Merge pull request #1112 from dfinke/refactor-rezip 2021-11-30 18:44:24 -05:00
Doug Finke
a320cfd28c Merge pull request #1110 from DavisHenckel/FAQ_Docs 2021-11-30 18:32:59 -05:00
dfinke
aa1b042767 Add -ReZip to Close-ExcelPackage like in Export-Excel #1111 2021-11-30 15:50:11 -05:00
dfinke
7e8416d67c Bump version and update change log 2021-11-30 15:49:07 -05:00
Davis Henckel
229b60b25d Remove Unnecessary Import & Add Header
Removed unnecessary import-module statement. Added a header to match the styling of other documents.
2021-11-28 20:03:07 -08:00
Davis Henckel
5700989321 Explain functionality of Open/Close-ExcelPackage 2021-11-28 11:36:37 -08:00
Davis Henckel
56e1704e7e Added missing " || improved readability. 2021-11-28 11:25:21 -08:00
Davis Henckel
8268bbc2e1 Merge pull request #1 from DavisHenckel/FAQ_Docs_2
Faq docs 2
2021-11-26 14:56:17 -08:00
Davis Henckel
5657659331 Add additional dbg info, Doc complete.
Changed variable name in example code, added additional info to Data structure explanation. Final proofread for punctuation and style. Document complete.
2021-11-26 14:53:21 -08:00
Davis Henckel
0d4a32e266 Change phrasing to show better MD style
Added additional headings to read more easily.
2021-11-26 14:42:44 -08:00
Davis Henckel
1c8f8d2a3d Update image to include row/col data num 2021-11-26 14:41:37 -08:00
Davis Henckel
f6a65677df Merge branch 'FAQ_Docs_2' of https://github.com/DavisHenckel/ImportExcel into FAQ_Docs_2 2021-11-26 14:34:23 -08:00
Davis Henckel
86a7865fb2 Add multiple images. 2021-11-26 14:34:17 -08:00
Davis Henckel
8b3bf4f14f Added Debug image showing var contents 2021-11-26 14:33:48 -08:00
Davis Henckel
4d6193f549 Complete Majority of Write to ExistingExcelFile md 2021-11-26 14:28:04 -08:00
Davis Henckel
6ebac7b6dc Add newlines 2021-11-26 12:18:05 -08:00
Davis Henckel
d71dd36d56 First version of file, with Image. 2021-11-26 12:17:39 -08:00
Davis Henckel
3697cdfeee Merge branch 'FAQ_Docs_2' of https://github.com/DavisHenckel/ImportExcel into FAQ_Docs_2 2021-11-26 12:17:06 -08:00
Davis Henckel
1e172cf21f Add Excel Pkg Data Img 2021-11-26 12:16:41 -08:00
Davis Henckel
6da7553c98 Merge branch 'FAQ_Docs' of https://github.com/DavisHenckel/ImportExcel into FAQ_Docs_2 2021-11-26 10:55:43 -08:00
Davis Henckel
5a444c620b Punctuation change 2021-11-26 10:25:30 -08:00
Davis Henckel
4a09fc3570 Punctuation change 2021-11-26 10:25:14 -08:00
Davis Henckel
d706a10276 Complete Document
Demonstrates how to create a blank excel file.
2021-11-26 10:23:09 -08:00
Davis Henckel
1fd2f422cd Create 2 more MD files to create 2021-11-26 10:15:01 -08:00
Davis Henckel
283e50547d Styling Consistency & Punctuation 2021-11-26 09:11:56 -08:00
Davis Henckel
15211a6297 Update Wording.
Punctuation and wording changes.
2021-11-26 09:08:31 -08:00
Davis Henckel
8905b8d401 Fix small typo
Comment in first image should have read "#Loads the Excel file into a PSCustomObject"
2021-11-26 08:58:44 -08:00
Davis Henckel
e9b437af4e Complete first version of ExistingExcelFile FAQ
Added loading a row/col, then mapping to HashTable
2021-11-26 06:56:08 -08:00
Davis Henckel
330e237727 Update Image Paths so they are Relative 2021-11-26 06:31:53 -08:00
Davis Henckel
c56b2cd33a Add first 2 images
Images display debugger and contents of excel file.
2021-11-21 16:56:52 -08:00
Davis Henckel
1aa5c6da45 add initial 2 images for first md FAQ doc 2021-11-21 16:51:14 -08:00
Davis Henckel
9eb894cf59 create directory, add initial md file w/first doc 2021-11-21 16:50:34 -08:00
dfinke
3a4c2d7bd9 bump version 2021-11-20 16:18:12 -05:00
dfinke
42cb5a316a update changelog 2021-11-20 16:18:05 -05:00
dfinke
536cdaa841 tweaked spelling 2021-11-20 15:53:23 -05:00
Doug Finke
6cd9fad7ba Merge pull request #1106 from royashbrook/CI-Updates
Add ACE into testing pipeline
2021-11-20 15:44:13 -05:00
Doug Finke
829d854c3d Merge pull request #1102 from muschebubusche/AddSelectiveColumnImport
Add selective column import
2021-11-20 15:36:05 -05:00
muschebubusche
b33a282740 Add new pester test 2021-11-20 16:51:49 +01:00
muschebubusche
73fc96166c Refactor selective column import
Move code into the function Get-PropertyNames and remove the rest.
Now it only replaces $Columns with $ImportColumns after a couple of checks. So the heavy work like arranging and getting the right values is done in the original way of Import-Excel.
2021-11-20 16:51:40 +01:00
Roy Ashbrook
00f7278115 add back *nix tests 2021-11-16 16:28:03 -05:00
Roy Ashbrook
956cf5aa49 fix 2021-11-16 16:23:54 -05:00
Roy Ashbrook
877310e015 add back pscore 2021-11-16 16:20:59 -05:00
Roy Ashbrook
08bf877535 add back in normal win testing 2021-11-16 16:11:32 -05:00
Roy Ashbrook
88e28a1d6c change path 2021-11-16 16:05:33 -05:00
Roy Ashbrook
eb63fe259a testing caching 2021-11-16 16:02:19 -05:00
Roy Ashbrook
6d97efc5c2 fun with curl... maybe 2021-11-16 15:43:57 -05:00
Roy Ashbrook
c567526eac testing caching 2021-11-16 15:34:36 -05:00
Roy Ashbrook
ed210cc730 testing 2021-11-16 15:29:32 -05:00
Roy Ashbrook
72f44ebcb9 trying a folder 2021-11-16 15:18:37 -05:00
Roy Ashbrook
f1d20ed163 test pipeline cache 2021-11-16 15:13:52 -05:00
Roy Ashbrook
02cf6bb3f3 test ace 2021-11-16 09:03:53 -05:00
dfinke
5cd3897dfa fix png 2021-11-12 19:26:57 -05:00
dfinke
fe4f2848ad bump version 2021-11-12 19:23:36 -05:00
dfinke
4e89b3321a update change log 2021-11-12 19:23:31 -05:00
Doug Finke
43b6ebf84f Merge pull request #1101 from royashbrook/Read-OleDbData
Add ability to query with Oledb
2021-11-12 18:59:41 -05:00
dfinke
1ee9493bc0 Minor tweak. Display query executed 2021-11-12 17:25:45 -05:00
muschebubusche
8f0fc7397d Add example and automatic column arrangement
Add example and automatic column arrangement
2021-11-09 22:40:40 +01:00
Roy Ashbrook
4fa6fbda01 update warning msg for Read-OleDbData 2021-11-09 09:05:15 -05:00
Roy Ashbrook
7177623104 add silent continue to cmd check tests 2021-11-08 18:21:11 -05:00
Roy Ashbrook
487cf51abc fix test skip label name 2021-11-08 18:19:23 -05:00
Roy Ashbrook
ae31e9d39b update skip/help msgs in invoke cmd 2021-11-08 18:08:45 -05:00
Roy Ashbrook
9ba20b8ec8 add back invoke tests, sync skip methods 2021-11-08 17:57:44 -05:00
Roy Ashbrook
9daefc2925 fix typo in skip logic 2021-11-08 17:45:33 -05:00
Roy Ashbrook
f0b4cb28f6 update tests to skip other pre-checks if linux/mac 2021-11-08 17:44:03 -05:00
Roy Ashbrook
5f00f5cbbc update tests 2021-11-08 17:40:33 -05:00
Roy Ashbrook
d41fbf8a05 updating tests 2021-11-08 17:13:40 -05:00
Roy Ashbrook
ebe49f1650 fix or/and 2021-11-08 16:56:23 -05:00
Roy Ashbrook
a3dced10e4 update tests 2021-11-08 16:37:00 -05:00
Roy Ashbrook
1e522c562b test skips for linux/macos, switch to warnings 2021-11-08 16:00:06 -05:00
Roy Ashbrook
5ec299ff2d some debugging messages for troubleshooting CI 2021-11-08 15:43:36 -05:00
Roy Ashbrook
676ecc17e0 update tests to match 2021-11-08 15:25:26 -05:00
Roy Ashbrook
aa1b0018ab Add examples 2021-11-08 15:14:46 -05:00
Roy Ashbrook
eabaab79c5 add ace check 2021-11-08 14:43:57 -05:00
Roy Ashbrook
7a8bbb9771 add to exported functions, formatting, fix typo. 2021-11-04 20:54:51 -04:00
Roy Ashbrook
85f2433ffc Rename helper function to make it more helpful. =) 2021-11-04 10:44:14 -04:00
muschebubusche
62c8d74a59 Add selective column import 2021-11-03 23:15:18 +01:00
Roy Ashbrook
5e7b404daf Add helper method 2021-11-03 10:35:22 -04:00
Roy Ashbrook
91a1240408 add skip test check for ace 2021-10-30 11:20:27 -04:00
Roy Ashbrook
e8c3d96f43 Tests relocated and updated. All passing. 2021-10-29 21:58:05 -04:00
Roy Ashbrook
9417b25af1 move tests into test folder 2021-10-29 16:58:16 -04:00
Roy Ashbrook
a942f2133d Add basic function, tests, and sample file 2021-10-29 13:21:52 -04:00
Doug Finke
533ed07ac8 Remove lowercase public
used for GitBook, no longer needed. #1082
2021-09-17 08:07:56 -04:00
Doug Finke
09f35b5fd5 Merge pull request #1078 from dfinke/Add-Checks-And-Warnings-for-Add-Member-Open-Excel-Package
Add-Checks-And-Warnings-for-Add-Member-Open-Excel-Package
2021-09-14 18:15:47 -04:00
dfinke
23a2ac394f Add try/catch, warning, and tests 2021-09-14 15:44:32 -04:00
dfinke
50928e8e3b Update 2021-09-14 15:44:11 -04:00
dfinke
26827b0764 bump version 2021-09-14 15:44:03 -04:00
Doug Finke
6c35d5b018 Updated 2021-09-10 18:41:03 -04:00
Doug Finke
ab5600c9ba bump version 2021-09-10 18:40:57 -04:00
Doug Finke
47dcc636d9 Merge pull request #1077 from stahler/Open-ExcelPackage
Update open-excelpackage.md
2021-09-10 18:39:00 -04:00
Stahler
1768c0ac92 Update open-excelpackage.md 2021-09-10 14:17:44 -04:00
Doug Finke
694fcdd8c1 Merge pull request #1059 from dfinke/add-test-for-ps-5-to-7-and-linux
Improved checks for Linux, Mac and PS 5.1 - #1056, #1057
2021-07-30 19:27:06 -04:00
dfinke
0192f4d822 Improved checks for Linux, Mac and PS 5.1 - #1056, #1057 2021-07-30 19:21:37 -04:00
dfinke
c641eea10a Improve auto-detection of data on the clipboard 2021-07-24 19:41:57 -04:00
dfinke
99de9a9854 Pass parameters from Read-Clipboard to implementation 2021-07-24 13:48:18 -04:00
Doug Finke
3121c5eaed Merge pull request #1054 from dfinke/Add-new-function-Read-Clipboard
Added Read-Clipboard
2021-07-24 13:37:32 -04:00
dfinke
d02f757568 add change log 2021-07-24 13:26:06 -04:00
dfinke
a693725949 Add Tests 2021-07-24 13:01:51 -04:00
dfinke
5e19d0ca1a Add ReadClipboardImpl function 2021-07-24 13:01:48 -04:00
dfinke
204b82144f Refactor for testing 2021-07-24 13:01:32 -04:00
dfinke
91eefbd48b Added Read-Clipboard 2021-07-24 11:20:04 -04:00
dfinke
f86556a89d Updated, added Open in VS Code badge 2021-07-10 08:46:36 -04:00
dfinke
14e1dfd8db Bump version. Use ProviderPath 2021-06-20 12:11:14 -04:00
Doug Finke
1d961c679e Merge pull request #1031 from sporkabob/master
Fix UNC paths for ConvertFrom-ExcelSheet
2021-05-13 15:54:39 -04:00
sporkabob
7026803415 Fix UNC paths for ConvertFrom-ExcelSheet 2021-05-13 15:22:15 -04:00
Doug Finke
e486135c4f Merge pull request #1029 from MikeyBronowski/patch-2
Removed duplicate entry for the version
2021-05-08 19:05:55 -04:00
Mikey Bronowski
80d9cb1290 Removed duplicate entry for the version
The What's new for 7.1.2 starts at line 58
2021-05-08 23:43:42 +01:00
dfinke
d82c01eabf Updated readme #1014 2021-04-06 20:22:55 -04:00
dfinke
2fcb7a57a2 tweak tests for path returned #1014 2021-04-06 19:37:07 -04:00
dfinke
afe7e545f6 Add unit tests for Get-ExcelFileSummary #1014 2021-04-06 19:32:37 -04:00
dfinke
88638a87a9 Added Get-ExcelFileSummary 2021-02-28 15:59:42 -05:00
Doug Finke
0f354be443 Merge pull request #998 from DarkLite1/master
Added example for exporting data to Excel for Pester 5.1
2021-02-12 09:54:32 -05:00
DarkLite1
abebb9af11 Added example for exporting data to Excel for Pester 5.1 2021-02-12 13:21:59 +01:00
dfinke
d8ae8b1abc change to testdrive 2021-02-07 11:19:43 -05:00
dfinke
30fc53857d Swapped out Get-CimInstance tests 2021-02-07 11:14:08 -05:00
dfinke
04b7895d1e Remove .gitbook 2020-11-28 11:41:44 -05:00
Doug Finke
7f72aa9e86 GitBook: [master] 133 pages and 8 assets modified 2020-11-28 13:13:00 +00:00
Doug Finke
70ab9e46c7 Merge pull request #959 from MikeyBronowski/ExampleDatabar
Example: Removed a duplicate parameter Range/Address
2020-11-27 12:47:24 -05:00
MikeyBronowski
49e355b702 Removed a duplicate parameter Range/Address 2020-11-24 22:24:40 +00:00
Doug Finke
82a8536e47 Merge pull request #954 from jhoneill/master
Fixed the pester issues. (Locally and in AzDo pipelines)
2020-11-23 18:38:51 -05:00
dfinke
35246d51e7 Remove -MaximumVersion 4.99.99 2020-11-23 18:33:17 -05:00
jhoneill
9dafe170f1 Suppress bogus analyzer warnings. 2020-11-23 09:34:14 +00:00
jhoneill
0d29fd813d Merge branch 'master' of https://github.com/jhoneill/ImportExcel 2020-11-23 09:27:54 +00:00
jhoneill
c685ad767c More pester fixing 2020-11-23 09:27:14 +00:00
jhoneill
f283ada708 More pester fixing 2020-11-23 09:12:50 +00:00
jhoneill
bb3923aabf Merge remote-tracking branch 'upstream/master' 2020-11-23 00:43:11 +00:00
Doug Finke
fa0b3ca79b Update Multiplecharts.md 2020-11-13 18:52:53 -05:00
Doug Finke
53f8acda90 Update Multiplecharts.md 2020-11-13 18:50:27 -05:00
Doug Finke
ca586fc2d5 Update Multiplecharts.md 2020-11-13 18:50:14 -05:00
Doug Finke
4c5f1a967e Update Multiplecharts.md 2020-11-13 18:49:58 -05:00
dfinke
f237861e1a added md and png 2020-11-13 18:49:14 -05:00
jhoneill
282d650072 De-skipped some tests. Fixed a tiny bug in Add-Conditional formatting. 2020-11-02 18:01:23 +00:00
dfinke
6149442bc0 First pass. All code must be in a script block 2020-10-31 17:47:07 -04:00
Doug Finke
113bf2c95c Merge pull request #908 from SQLvariant/small-typo
Update ImportExcel-help.xml
2020-08-28 09:11:45 -04:00
Aaron Nelson
27e8130e6c Update ImportExcel-help.xml
Corrected the location of the period.
2020-08-28 08:07:41 -04:00
Doug Finke
c19e219a44 Update README.md 2020-07-11 18:38:54 -04:00
dfinke
795b2017b5 Update readme 2020-07-11 18:20:50 -04:00
Doug Finke
cb749dff07 Merge pull request #835 from scrthq:hotfix/issue_832
fixes #832
2020-07-11 17:49:54 -04:00
dfinke
fd6b847d77 update readme 2020-07-03 12:11:59 -04:00
dfinke
c6d9104d52 Merge branch 'master' of https://github.com/dfinke/ImportExcel 2020-07-03 12:10:34 -04:00
Doug Finke
df157b22ab Merge pull request #885 from MikeyBronowski/Examples1
Standardise examples: loading module + file cleanup
2020-07-03 11:39:52 -04:00
MikeyBronowski
95822ac2e9 Standardise file cleanup 2020-07-01 22:19:42 +02:00
MikeyBronowski
c4d20a9a28 Standardise file cleanup 2020-07-01 22:10:00 +02:00
MikeyBronowski
8a20963577 Standardising examples 2020-07-01 22:04:37 +02:00
dfinke
c30e03a47f updated 2020-06-26 19:38:55 -04:00
Doug Finke
0a77a83e35 Merge pull request #875 from MikeyBronowski/VariableCasing
Variable casing
2020-06-26 19:30:00 -04:00
MikeyBronowski
66f6a5fa0b typo 2020-06-21 22:53:35 +02:00
MikeyBronowski
a3921f5298 Parameters with casing not following standard 2020-06-21 22:34:46 +02:00
dfinke
1823f1dde0 updated readme 2020-06-20 17:44:46 -04:00
Doug Finke
5d5ca57f4b Merge pull request #873 from MikeyBronowski:VariableCasing
Standardising casing of parameter names
2020-06-20 17:36:27 -04:00
MikeyBronowski
11d591aad6 Standardising casing of parameter names 2020-06-20 23:03:27 +02:00
dfinke
9841ef9436 delete appveyor.yml, update badges in readme 2020-05-24 12:23:22 -04:00
dfinke
ae1fa04334 stop appveyor builds 2020-05-24 12:14:41 -04:00
dfinke
a7861ee57d bump version, update readme 2020-05-24 11:50:19 -04:00
Doug Finke
24ca7a4d86 Merge pull request #856 from dfinke/dfinke/issue855
Dfinke/issue855
2020-05-24 11:20:52 -04:00
dfinke
51b23323fa Scrub invalid chars from the filename 2020-05-24 10:59:57 -04:00
dfinke
001aabf526 Added synopsis, and tests the value is a scriptblock 2020-05-23 17:32:22 -04:00
dfinke
a5a98d5c92 Used to drive the Export-MultipleExcelSheets 2020-05-23 17:32:03 -04:00
dfinke
070d40b5af Move to Examples/Experimental 2020-05-23 17:10:54 -04:00
dfinke
c4b3556c5d Don't source the Export-Multiplesheets ps1 2020-05-23 17:06:45 -04:00
dfinke
8151ed4305 Remove help file 2020-05-23 17:06:12 -04:00
Nate Ferrell
6959cffa24 added ImportOnly test and added additional macOS stage on azure-pipelines.yml 2020-05-05 02:22:53 -05:00
Nate Ferrell
6be2195680 Merge remote-tracking branch 'upstream/master' into hotfix/issue_832 2020-05-05 02:21:00 -05:00
Doug Finke
ff77606430 Merge pull request #837 from dfinke/UpdatePesterInstall
Prevent install of Pester v5
2020-05-04 18:52:27 -04:00
dfinke
a874e1385e Prevent install of Pester v5 2020-05-04 09:43:19 -04:00
dfinke
f8b9cf7251 Add Stale bot config 2020-05-03 14:58:02 -04:00
dfinke
5588c0306c added custom formatting example 2020-05-02 16:47:36 -04:00
Nate Ferrell
359f7453c5 fixes #832 2020-05-01 13:34:46 -05:00
dfinke
933abf6539 Tweaked format 2020-03-16 13:39:03 -04:00
dfinke
6a32da7f92 update readme 2020-03-16 13:34:31 -04:00
dfinke
c3ac68ea2c bump version 2020-03-16 13:34:05 -04:00
Doug Finke
5ea9b1d082 Merge pull request #803 from jhoneill/master
fix #802 and #795. Extra examples including pester-xlsx
2020-03-16 12:50:52 -04:00
jhoneill
ae64a884fc Put back asDate lost in merge 2020-03-16 12:10:51 +00:00
jhoneill
b584b22f5f Merge remote-tracking branch 'upstream/master' 2020-03-16 11:43:10 +00:00
jhoneill
eb3a7d3f2d Allow 0 or false to be a column heading 2020-03-16 11:15:40 +00:00
jhoneill
3130020e20 apply freeze to 2 rows if title present #795 2020-03-16 11:10:44 +00:00
jhoneill
fe68ddbb0d New examples incl. Pester to XLSx 2020-03-16 11:07:30 +00:00
Doug Finke
1ce65a0758 Merge pull request #793 from dfinke/FixSheetHasOnlyHeaders
Spike to fix #792
2020-03-01 08:04:45 -05:00
dfinke
13454cce8e Spike to fix #792 2020-02-29 15:55:49 -05:00
Doug Finke
96b61d38f1 Merge pull request #783 from clsmith70/patch-2
Create MultipleWorksheets.ps1
2020-02-18 09:09:41 -05:00
Chris Smith
59e31d54a7 Move to /Examples/CommunityContributions Folder 2020-02-18 09:02:49 -05:00
Chris Smith
6bf16f75f7 Create MultipleWorksheets.ps1
The PS commands to create an Excel file with multiple worksheets and adding one using ExcelPackage functions.
2020-02-16 16:37:27 -05:00
Doug Finke
c547713ee9 Merge pull request #782 from JustinGrote/patch-1
Remove Write-Debug Performance Outputs
2020-02-15 07:13:39 -05:00
Justin Grote
f0ec5f4a96 Remove Write-Debug Performance Outputs
These outputs are unnecessary and can confuse someone observing other debug output.
2020-02-14 14:49:07 -08:00
Doug Finke
7ded94e225 Merge pull request #775 from stahler/master
Update help for GroupDateRow parameter. Thanks for the update Wes (@stahler)!
2020-02-11 18:25:01 -05:00
Wes Stahler
4141ba690e Update New-PivotTableDefinition.md 2020-02-11 08:39:24 -05:00
Wes Stahler
08ecadddb2 Merge pull request #1 from dfinke/master
Update
2020-02-11 08:24:41 -05:00
dfinke
e42f42fde9 Add VLookup 2020-02-03 20:19:57 -05:00
dfinke
12fa49e314 Rename directory 2020-02-03 20:11:49 -05:00
dfinke
98ce564929 Add Excel builtin DSUM Example 2020-02-01 11:55:33 -05:00
jhoneill
7e75ecd0fb Add Subtotals & Groups example 2019-12-31 22:32:34 +00:00
jhoneill
17ec040055 fix message in merge, improve pester example 2019-12-31 19:38:28 +00:00
jhoneill
e65210e378 Fix test not working with single digit dates. 2019-12-31 02:48:57 +00:00
jhoneill
7bfb28d10f Update Pester Syntax from V3 to V4 (V5 won't support the old version) 2019-12-29 17:18:24 +00:00
jhoneill
08fbfc35a3 Add Pester example. Make Hide and Hidden aliases 2019-12-28 21:16:01 +00:00
jhoneill
4315ddc702 Merge branch 'master' of https://github.com/dfinke/ImportExcel 2019-12-22 18:38:12 +00:00
jhoneill
97611fc57c Add -AsDate support to import-Excel and ConvertFrom-Excel sheet. Help upate 2019-12-22 18:04:42 +00:00
jhoneill
118330ea47 Make primary name "PivotTableChartType" (with alias chartType) in Export-Excel 2019-12-22 16:39:38 +00:00
jhoneill
6f48219819 assume IncludePivot when implied by other params 2019-12-22 14:52:06 +00:00
268 changed files with 36643 additions and 6991 deletions

17
.github/stale.yml vendored Normal file
View 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

1
.gitignore vendored
View File

@@ -65,3 +65,4 @@ ImportExcel.zip
~$*
# InstallModule.ps1
# PublishToGallery.ps1
.vscode/*

56
.vscode/launch.json vendored
View File

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

View File

@@ -13,7 +13,10 @@ param
# 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
[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) {
@@ -21,7 +24,7 @@ if ($Initialize) {
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion
Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH"
}
if ($Test) {
if ($Test -or $TestImportOnly) {
function Get-EnvironmentInfo {
if ([environment]::OSVersion.Platform -like "win*") {
# Get Windows Version
@@ -97,7 +100,23 @@ if (-not $VersionFilePath) {
'[Progress] Installing Module.'
. .\CI\Install.ps1
'[Progress] Invoking Pester.'
Invoke-Pester -OutputFile ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
$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.'
@@ -131,6 +150,7 @@ if ($Artifact) {
"[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
@@ -205,4 +225,4 @@ if ($Analyzer) {
else {
"[Info] Invoke-ScriptAnalyzer didn't return any problems."
}
}
}

View File

@@ -1,4 +1,4 @@
[cmdletbinding(DefaultParameterSetName='Scope')]
[cmdletbinding(DefaultParameterSetName = 'Scope')]
Param(
[Parameter(Mandatory = $true, ParameterSetName = 'ModulePath')]
[ValidateNotNullOrEmpty()]
@@ -10,7 +10,7 @@ Param(
[string]
$Scope = 'CurrentUser',
[Parameter(Mandatory=$true, ParameterSetName = 'PreCheckOnly')]
[Parameter(Mandatory = $true, ParameterSetName = 'PreCheckOnly')]
[switch]$PreCheckOnly,
[Parameter(ParameterSetName = 'ModulePath')]
[Parameter(ParameterSetName = 'Scope')]
@@ -30,7 +30,7 @@ Param(
)
Function Show-Warning {
param(
[Parameter(Position=0,ValueFromPipeline=$true)]
[Parameter(Position = 0, ValueFromPipeline = $true)]
$message
)
process {
@@ -49,11 +49,11 @@ if (-not $psdpath -or $psdpath.count -gt 1) {
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
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"
}
@@ -63,7 +63,7 @@ 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"
Show-Warning "File $file in the manifest file list is not present"
}
}
@@ -71,7 +71,7 @@ if (-not $SkipPreChecks) {
# 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(@"
$reg = [Regex]::new(@"
function\s*[-\w]+\s*{ # The function name and opening '{'
(?:
[^{}]+ # Match all non-braces
@@ -84,56 +84,56 @@ if (-not $SkipPreChecks) {
} # 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)) {
$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}
$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] -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"}
$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)) {
$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."
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 ', '))}
$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}
if ($PreCheckOnly) { return }
#region build, determine module path if necessary, create target directory if necessary, copy files based on manifest, build help
try {
try {
if ($ModulePath) {
$ModulePath = $ModulePath -replace "\\$|/$",""
$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)
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
}
@@ -150,13 +150,13 @@ try {
$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))) {
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 }
else { $dest = $ModulePath }
Copy-Item -Path $file -Destination $dest -Force -Recurse
}
@@ -167,19 +167,19 @@ try {
}
$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
'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 {
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"}
if (-not $outputFile -or -not (Test-Path $outputFile)) { throw "Failed to create module" }
}
#endregion
@@ -189,16 +189,16 @@ if ($env:Build_ArtifactStagingDirectory) {
#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 }
try { $outputFile | Import-Module -Force -ErrorAction stop }
catch {
if ($PSScriptRoot) { Pop-Location }
throw "New module failed to load"
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 {
$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
$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)
}
@@ -222,10 +222,12 @@ if (-not $SkipPostChecks) {
AutoSize = $true
Activate = $true
PivotTableDefinition = @{BreakDown = @{
PivotData = @{RuleName = 'Count' }
PivotRows = 'Severity', 'RuleName'
PivotTotals = 'Rows'
PivotChartDefinition = $chartDef }}
PivotData = @{RuleName = 'Count' }
PivotRows = 'Severity', 'RuleName'
PivotTotals = 'Rows'
PivotChartDefinition = $chartDef
}
}
}
Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue
$AnalyzerResults | Export-Excel @ExcelParams
@@ -244,12 +246,21 @@ if (Test-Path $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
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
}
Import-Module Pester
$PesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
$pester = Import-Module Pester -PassThru
$pester
$pesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
if ($PSScriptRoot) { Pop-Location }
Invoke-Pester -OutputFile $PesterOutputPath
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 }

View File

@@ -0,0 +1,119 @@
function Add-ExcelImage {
<#
.SYNOPSIS
Adds an image to a worksheet in an Excel package.
.DESCRIPTION
Adds an image to a worksheet in an Excel package using the
`WorkSheet.Drawings.AddPicture(name, image)` method, and places the
image at the location specified by the Row and Column parameters.
Additional position adjustment can be made by providing RowOffset and
ColumnOffset values in pixels.
.EXAMPLE
$image = [System.Drawing.Image]::FromFile($octocat)
$xlpkg = $data | Export-Excel -Path $path -PassThru
$xlpkg.Sheet1 | Add-ExcelImage -Image $image -Row 4 -Column 6 -ResizeCell
Where $octocat is a path to an image file, and $data is a collection of
data to be exported, and $path is the output path for the Excel document,
Add-Excel places the image at row 4 and column 6, resizing the column
and row as needed to fit the image.
.INPUTS
[OfficeOpenXml.ExcelWorksheet]
.OUTPUTS
None
#>
[CmdletBinding()]
param(
# Specifies the worksheet to add the image to.
[Parameter(Mandatory, ValueFromPipeline)]
[OfficeOpenXml.ExcelWorksheet]
$WorkSheet,
# Specifies the Image to be added to the worksheet.
[Parameter(Mandatory)]
[System.Drawing.Image]
$Image,
# Specifies the row where the image will be placed. Rows are counted from 1.
[Parameter(Mandatory)]
[ValidateRange(1, [int]::MaxValue)]
[int]
$Row,
# Specifies the column where the image will be placed. Columns are counted from 1.
[Parameter(Mandatory)]
[ValidateRange(1, [int]::MaxValue)]
[int]
$Column,
# Specifies the name to associate with the image. Names must be unique per sheet.
# Omit the name and a GUID will be used instead.
[Parameter()]
[string]
$Name,
# Specifies the number of pixels to offset the image on the Y-axis. A
# positive number moves the image down by the specified number of pixels
# from the top border of the cell.
[Parameter()]
[int]
$RowOffset = 1,
# Specifies the number of pixels to offset the image on the X-axis. A
# positive number moves the image to the right by the specified number
# of pixels from the left border of the cell.
[Parameter()]
[int]
$ColumnOffset = 1,
# Increase the column width and row height to fit the image if the current
# dimensions are smaller than the image provided.
[Parameter()]
[switch]
$ResizeCell
)
begin {
if ($IsWindows -eq $false) {
throw "This only works on Windows and won't run on $([environment]::OSVersion)"
}
<#
These ratios work on my machine but it feels fragile. Need to better
understand how row and column sizing works in Excel and what the
width and height units represent.
#>
$widthFactor = 1 / 7
$heightFactor = 3 / 4
}
process {
if ([string]::IsNullOrWhiteSpace($Name)) {
$Name = (New-Guid).ToString()
}
if ($null -ne $WorkSheet.Drawings[$Name]) {
Write-Error "A picture with the name `"$Name`" already exists in worksheet $($WorkSheet.Name)."
return
}
<#
The row and column offsets of 1 ensures that the image lands just
inside the gray cell borders at the top left.
#>
$picture = $WorkSheet.Drawings.AddPicture($Name, $Image)
$picture.SetPosition($Row - 1, $RowOffset, $Column - 1, $ColumnOffset)
if ($ResizeCell) {
<#
Adding 1 to the image height and width ensures that when the
row and column are resized, the bottom right of the image lands
just inside the gray cell borders at the bottom right.
#>
$width = $widthFactor * ($Image.Width + 1)
$height = $heightFactor * ($Image.Height + 1)
$WorkSheet.Column($Column).Width = [Math]::Max($width, $WorkSheet.Column($Column).Width)
$WorkSheet.Row($Row).Height = [Math]::Max($height, $WorkSheet.Row($Row).Height)
}
}
}

View File

@@ -0,0 +1,39 @@
if ($IsWindows -eq $false) {
throw "This only works on Windows and won't run on $([environment]::OSVersion)"
}
Add-Type -AssemblyName System.Drawing
. $PSScriptRoot\Add-ExcelImage.ps1
$data = ConvertFrom-Csv @"
Region,State,Units,Price
West,Texas,927,923.71
North,Tennessee,466,770.67
East,Florida,520,458.68
East,Maine,828,661.24
West,Virginia,465,053.58
North,Missouri,436,235.67
South,Kansas,214,992.47
North,North Dakota,789,640.72
South,Delaware,712,508.55
"@
$path = "$PSScriptRoot/Add-Picture-test.xlsx"
Remove-Item $path -ErrorAction SilentlyContinue
try {
$octocat = "$PSScriptRoot/Octocat.jpg"
$image = [System.Drawing.Image]::FromFile($octocat)
$xlpkg = $data | Export-Excel -Path $path -PassThru
$xlpkg.Sheet1 | Add-ExcelImage -Image $image -Row 4 -Column 6 -ResizeCell
}
finally {
if ($image) {
$image.Dispose()
}
if ($xlpkg) {
Close-ExcelPackage -ExcelPackage $xlpkg -Show
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -0,0 +1,33 @@
# Add-ExcelImage Example
Adding pictures to an Excel worksheet is possible by calling the `AddPicture(name, image)`
method on the `Drawings` property of an `ExcelWorksheet` object.
The `Add-ExcelImage` example here demonstrates how to add a picture at a given
cell location, and optionally resize the row and column to fit the image.
## Running the example
To try this example, run the script `AddImage.ps1`. The `Add-ExcelImage`
function will be dot-sourced, and an Excel document will be created in the same
folder with a sample data set. The Octocat image will then be embedded into
Sheet1.
The creation of the Excel document and the `System.Drawing.Image` object
representing Octocat are properly disposed within a `finally` block to ensure
that the resources are released, even if an error occurs in the `try` block.
## Note about column and row sizing
Care has been taken in this example to get the image placement to be just inside
the cell border, and if the `-ResizeCell` switch is present, the height and width
of the row and column will be increased, if needed, so that the bottom right of
the image also lands just inside the cell border.
The Excel row and column sizes are measured in "point" units rather than pixels,
and a fixed multiplication factor is used to convert the size of the image in
pixels, to the corresponding height and width values in Excel.
It's possible that different DPI or text scaling options could result in
imperfect column and row sizing and if a better strategy is found for converting
the image dimensions to column and row sizes, this example will be updated.

View File

@@ -1,8 +1,8 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlSourcefile = "$env:TEMP\Source.xlsx"
#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

View File

@@ -1,7 +1,8 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlSourcefile = "$env:TEMP\Source.xlsx"
#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

View File

@@ -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

View File

@@ -1,6 +1,9 @@
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

View File

@@ -1,6 +1,9 @@
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

View File

@@ -1,6 +1,9 @@
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

View File

@@ -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

View File

@@ -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,7 +22,7 @@ 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}

View 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

View File

@@ -1,11 +1,13 @@
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

View File

@@ -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

View File

@@ -1,12 +1,14 @@
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"]
@@ -15,10 +17,10 @@ $sheet.Column(1) | Set-ExcelRange -Bold -AutoFit
$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-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 -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

View File

@@ -1,8 +1,9 @@
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 = $(
@@ -25,6 +26,6 @@ $data = $(
# 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)

View File

@@ -1,3 +1,5 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
function Get-DateOffset {
param($days=0)

View File

@@ -1,12 +1,15 @@
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

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,10 +1,11 @@
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
)

View File

@@ -1,8 +1,9 @@
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 = $(
@@ -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)

View File

@@ -1,6 +1,9 @@
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,7 +20,7 @@ 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

View File

@@ -1,7 +1,9 @@
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()
@@ -13,7 +15,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
)

View File

@@ -1,6 +1,9 @@
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,7 +14,7 @@ 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

View File

@@ -1,25 +1,29 @@
try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return}
try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return}
$data = $(
New-PSItem 100 @('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"
Remove-Item -Path $file1 -ErrorAction Ignore
Remove-Item -Path $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
)

View File

@@ -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

View File

@@ -0,0 +1,23 @@
# How to convert abbreviate or shorten long numbers in Excel
Remove-Item .\custom.xlsx -ErrorAction SilentlyContinue
$data = $(
12000
1000
2000
3000
2400
3600
6000
13000
40000
400000
1000000
)
$excel = $data | Export-Excel .\custom.xlsx -PassThru
Set-ExcelRange -Worksheet $excel.Sheet1 -Range "A:A" -NumberFormat '[>999999]#,,"M";#,"K"'
Close-ExcelPackage $excel -Show

View File

@@ -1,7 +1,9 @@
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,9 +15,9 @@ 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"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -15,8 +15,10 @@
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') |

View 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 }
}

View 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

View File

@@ -2,8 +2,10 @@ param ($fibonacciDigits=10)
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

View File

@@ -1,10 +1,13 @@
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,

View File

@@ -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

View File

@@ -1,7 +1,9 @@
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(
@@ -17,4 +19,4 @@ $RandomStyle = {
Get-Process |
Select-Object Company,Handles,PM, NPM|
Export-Excel $xlfile -Show -AutoSize -CellStyleSB $RandomStyle
Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB $RandomStyle

View File

@@ -0,0 +1,54 @@
# Freeze the columns/rows to left and above the cell
$data = ConvertFrom-Csv @"
Region,State,Units,Price,Name,NA,EU,JP,Other
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
"@
$xlfilename = "test.xlsx"
Remove-Item $xlfilename -ErrorAction SilentlyContinue
<#
Freezes the top two rows and the two leftmost column
#>
$data | Export-Excel $xlfilename -Show -Title 'Sales Data' -FreezePane 3, 3

View File

@@ -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

View File

@@ -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

View File

@@ -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
@@ -15,8 +16,10 @@ Timestamp,Tenant
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}}
$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

View File

@@ -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

View File

@@ -0,0 +1,7 @@
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
$xlfile = "$PSScriptRoot\yearlySales.xlsx"
$result = Import-Excel -Path $xlfile -WorksheetName * -Raw
$result | Measure-Object

View File

@@ -0,0 +1,9 @@
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
$xlfile = "$PSScriptRoot\yearlySales.xlsx"
$result = Import-Excel -Path $xlfile -WorksheetName *
foreach ($sheet in $result.Values) {
$sheet
}

Binary file not shown.

View File

@@ -0,0 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
# Create example file
$xlFile = "$PSScriptRoot\ImportColumns.xlsx"
Get-Process | Export-Excel -Path $xlFile
# -ImportColumns will also arrange columns
Import-Excel -Path $xlFile -ImportColumns @(1,3,2) -NoHeader -StartRow 1
# Get only pm, npm, cpu, id, processname
Import-Excel -Path $xlFile -ImportColumns @(6,7,12,25,46) | Format-Table -AutoSize

View File

@@ -0,0 +1,14 @@
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
$queries =
'select * from [sheet1$A:A]',
'select * from [sheet1$]',
'select * from [sheet1$A2:E11]',
'select F2,F5 from [sheet1$A2:E11]',
'select * from [sheet1$A2:E11] where F2 = "Grocery"',
'select F2 as [Category], F5 as [Discount], F5*2 as [DiscountPlus] from [sheet1$A2:E11]'
foreach ($query in $queries) {
"query: $($query)"
Invoke-ExcelQuery .\testOleDb.xlsx $query | Format-Table
}

Binary file not shown.

View File

@@ -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

View File

@@ -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-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

View File

@@ -1,15 +1,16 @@
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

View File

@@ -1,8 +1,9 @@
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

View File

@@ -1,3 +1,5 @@
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

View File

@@ -1,3 +1,5 @@
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

View File

@@ -7,7 +7,7 @@ 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(

View File

@@ -0,0 +1,28 @@
# How to use Enable-ExcelAutoFilter and Enable-ExcelAutofit
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
$data = ConvertFrom-Csv @"
RegionInfo,StateInfo,Units,Price
West,Texas,927,923.71
North,Tennessee,466,770.67
East,Florida,520,458.68
East,Maine,828,661.24
West,Virginia,465,053.58
North,Missouri,436,235.67
South,Kansas,214,992.47
North,North Dakota,789,640.72
South,Delaware,712,508.55
"@
$xlfile = "$PSScriptRoot\enableFeatures.xlsx"
Remove-Item $xlfile -ErrorAction SilentlyContinue
$data | Export-Excel $xlfile
$excel = Open-ExcelPackage $xlfile
Enable-ExcelAutoFilter -Worksheet $excel.Sheet1
Enable-ExcelAutofit -Worksheet $excel.Sheet1
Close-ExcelPackage $excel -Show

147
Examples/Pester-To-XLSx.ps1 Normal file
View File

@@ -0,0 +1,147 @@
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSPossibleIncorrectComparisonWithNull', '', Justification = 'Intentional use to select non null array items')]
[CmdletBinding(DefaultParameterSetName = 'Default')]
param(
[Parameter(Position = 0)]
[string]$XLFile,
[Parameter(ParameterSetName = 'Default', Position = 1)]
[Alias('Path', 'relative_path')]
[object[]]$Script = '.',
[Parameter(ParameterSetName = 'Existing', Mandatory = $true)]
[switch]
$UseExisting,
[Parameter(ParameterSetName = 'Default', Position = 2)]
[Parameter(ParameterSetName = 'Existing', Position = 2, Mandatory = $true)]
[string]$OutputFile,
[Parameter(ParameterSetName = 'Default')]
[Alias("Name")]
[string[]]$TestName,
[Parameter(ParameterSetName = 'Default')]
[switch]$EnableExit,
[Parameter(ParameterSetName = 'Default')]
[Alias('Tags')]
[string[]]$Tag,
[string[]]$ExcludeTag,
[Parameter(ParameterSetName = 'Default')]
[switch]$Strict,
[string]$WorkSheetName = 'PesterResults',
[switch]$append,
[switch]$Show
)
$InvokePesterParams = @{OutputFormat = 'NUnitXml' } + $PSBoundParameters
if (-not $InvokePesterParams['OutputFile']) {
$InvokePesterParams['OutputFile'] = Join-Path -ChildPath 'Pester.xml'-Path ([environment]::GetFolderPath([System.Environment+SpecialFolder]::MyDocuments))
}
if ($InvokePesterParams['Show'] ) { }
if ($InvokePesterParams['XLFile']) { $InvokePesterParams.Remove('XLFile') }
else { $XLFile = $InvokePesterParams['OutputFile'] -replace '.xml$', '.xlsx' }
if (-not $UseExisting) {
$InvokePesterParams.Remove('Append')
$InvokePesterParams.Remove('UseExisting')
$InvokePesterParams.Remove('Show')
$InvokePesterParams.Remove('WorkSheetName')
Invoke-Pester @InvokePesterParams
}
if (-not (Test-Path -Path $InvokePesterParams['OutputFile'])) {
throw "Could not output file $($InvokePesterParams['OutputFile'])"; return
}
$resultXML = ([xml](Get-Content $InvokePesterParams['OutputFile'])).'test-results'
$startDate = [datetime]$resultXML.date
$startTime = $resultXML.time
$machine = $resultXML.environment.'machine-name'
#$user = $resultXML.environment.'user-domain' + '\' + $resultXML.environment.user
$os = $resultXML.environment.platform -replace '\|.*$', " $($resultXML.environment.'os-version')"
<#hierarchy goes
root, [date], start [time], [Name] (always "Pester"), test results broken down as [total],[errors],[failures],[not-run] etc.
Environment (user & machine info)
Culture-Info (current, and currentUi culture)
Test-Suite [name] = "Pester" [result], [time] to execute, etc.
Results
Test-Suite [name] = filename,[result], [Time] to Execute etc
Results
Test-Suite [Name] = Describe block Name, [result], [Time] to execute etc..
Results
Test-Suite [Name] = Context block name [result], [Time] to execute etc.
Results
Test-Case [name] = Describe.Context.It block names [description]= it block name, result], [Time] to execute etc
or if the tests are parameterized
Test suite [description] - name in the the it block with <vars> not filled in
Results
Test-case [description] - name as rendered for display with <vars> filled in
#>
$testResults = foreach ($test in $resultXML.'test-suite'.results.'test-suite') {
$testPs1File = $test.name
#Test if there are context blocks in the hierarchy OR if we go straight from Describe to test-case
if ($test.results.'test-suite'.results.'test-suite' -ne $null) {
foreach ($suite in $test.results.'test-suite') {
$Describe = $suite.description
foreach ($subsuite in $suite.results.'test-suite') {
$Context = $subsuite.description
if ($subsuite.results.'test-suite'.results.'test-case') {
$testCases = $subsuite.results.'test-suite'.results.'test-case'
}
else { $testCases = $subsuite.results.'test-case' }
$testCases | ForEach-Object {
New-Object -TypeName psobject -Property ([ordered]@{
Machine = $machine ; OS = $os
Date = $startDate ; Time = $startTime
Executed = $(if ($_.executed -eq 'True') { 1 })
Success = $(if ($_.success -eq 'True') { 1 })
Duration = $_.time
File = $testPs1File; Group = $Describe
SubGroup = $Context ; Name = ($_.Description -replace '\s{2,}', ' ')
Result = $_.result ; FullDesc = '=Group&" "&SubGroup&" "&Name'
})
}
}
}
}
else {
$test.results.'test-suite' | ForEach-Object {
$Describe = $_.description
$_.results.'test-case' | ForEach-Object {
New-Object -TypeName psobject -Property ([ordered]@{
Machine = $machine ; OS = $os
Date = $startDate ; Time = $startTime
Executed = $(if ($_.executed -eq 'True') { 1 })
Success = $(if ($_.success -eq 'True') { 1 })
Duration = $_.time
File = $testPs1File; Group = $Describe
SubGroup = $null ; Name = ($_.Description -replace '\s{2,}', ' ')
Result = $_.result ; FullDesc = '=Group&" "&Test'
})
}
}
}
}
if (-not $testResults) { Write-Warning 'No Results found' ; return }
$clearSheet = -not $Append
$excel = $testResults | Export-Excel -Path $xlFile -WorkSheetname $WorkSheetName -ClearSheet:$clearSheet -Append:$append -PassThru -BoldTopRow -FreezeTopRow -AutoSize -AutoFilter -AutoNameRange
$ws = $excel.Workbook.Worksheets[$WorkSheetName]
<# Worksheet should look like ..
|A |B |C D |E |F |G |H |I |J |K |L |M
1|Machine |OS |Date Time |Executed |Success |Duration |File |Group |SubGroup |Name |Result |FullDescription
2|Flatfish |Name_Version |[run started] |Boolean |Boolean |In seconds |xx.ps1 |Describe |Context |It |Success |Desc_Context_It
#>
#Display Date as a date, not a date time
Set-Column -Worksheet $ws -Column 3 -NumberFormat 'Short Date' # -AutoSize
#Hide columns E to J (Executed, Success, Duration, File, Group and Subgroup)
(5..10) | ForEach-Object { Set-ExcelColumn -Worksheet $ws -Column $_ -Hide }
#Use conditional formatting to make Failures red, and Successes green (skipped remains black ) ... and save
$endRow = $ws.Dimension.End.Row
Add-ConditionalFormatting -WorkSheet $ws -range "L2:L$endrow" -RuleType ContainsText -ConditionValue "Failure" -BackgroundPattern None -ForegroundColor Red -Bold
Add-ConditionalFormatting -WorkSheet $ws -range "L2:L$endRow" -RuleType ContainsText -ConditionValue "Success" -BackgroundPattern None -ForeGroundColor Green
Close-ExcelPackage -ExcelPackage $excel -Show:$show

View File

@@ -0,0 +1,225 @@
#Requires -Modules @{ ModuleName='Pester'; ModuleVersion='5.1' }
<#
.SYNOPSIS
Run Pester tests and export the results to an Excel file.
.DESCRIPTION
Use the `PesterConfigurationFile` to configure Pester to your requirements.
(Set the Path to the folder containing the tests, ...). Pester will be
invoked with the configuration you defined.
Each Pester 'it' clause will be exported to a row in an Excel file
containing the details of the test (Path, Duration, Result, ...).
.EXAMPLE
$params = @{
PesterConfigurationFile = 'C:\TestResults\PesterConfiguration.json'
ExcelFilePath = 'C:\TestResults\Tests.xlsx'
WorkSheetName = 'Tests'
}
& 'Pester test report.ps1' @params
# Content 'C:\TestResults\PesterConfiguration.json':
{
"Run": {
"Path": "C:\Scripts"
}
Executing the script with this configuration file will generate 1 file:
- 'C:\TestResults\Tests.xlsx' created by this script with Export-Excel
.EXAMPLE
$params = @{
PesterConfigurationFile = 'C:\TestResults\PesterConfiguration.json'
ExcelFilePath = 'C:\TestResults\Tests.xlsx'
WorkSheetName = 'Tests'
}
& 'Pester test report.ps1' @params
# Content 'C:\TestResults\PesterConfiguration.json':
{
"Run": {
"Path": "C:\Scripts"
},
"TestResult": {
"Enabled": true,
"OutputFormat": "NUnitXml",
"OutputPath": "C:/TestResults/PesterTestResults.xml",
"OutputEncoding": "UTF8"
}
}
Executing the script with this configuration file will generate 2 files:
- 'C:\TestResults\PesterTestResults.xml' created by Pester
- 'C:\TestResults\Tests.xlsx' created by this script with Export-Excel
.LINK
https://pester-docs.netlify.app/docs/commands/Invoke-Pester#-configuration
#>
[CmdletBinding()]
Param (
[String]$PesterConfigurationFile = 'PesterConfiguration.json',
[String]$WorkSheetName = 'PesterTestResults',
[String]$ExcelFilePath = 'PesterTestResults.xlsx'
)
Begin {
Function Get-PesterTests {
[CmdLetBinding()]
Param (
$Container
)
if ($testCaseResults = $Container.Tests) {
foreach ($result in $testCaseResults) {
Write-Verbose "Result '$($result.result)' duration '$($result.time)' name '$($result.name)'"
$result
}
}
if ($containerResults = $Container.Blocks) {
foreach ($result in $containerResults) {
Get-PesterTests -Container $result
}
}
}
#region Import Pester configuration file
Try {
Write-Verbose 'Import Pester configuration file'
$getParams = @{
Path = $PesterConfigurationFile
Raw = $true
}
[PesterConfiguration]$pesterConfiguration = Get-Content @getParams |
ConvertFrom-Json
}
Catch {
throw "Failed importing the Pester configuration file '$PesterConfigurationFile': $_"
}
#endregion
}
Process {
#region Execute Pester tests
Try {
Write-Verbose 'Execute Pester tests'
$pesterConfiguration.Run.PassThru = $true
$invokePesterParams = @{
Configuration = $pesterConfiguration
ErrorAction = 'Stop'
}
$invokePesterResult = Invoke-Pester @invokePesterParams
}
Catch {
throw "Failed to execute the Pester tests: $_ "
}
#endregion
#region Get Pester test results for the it clauses
$pesterTestResults = foreach (
$container in $invokePesterResult.Containers
) {
Get-PesterTests -Container $container |
Select-Object -Property *,
@{name = 'Container'; expression = { $container } }
}
#endregion
}
End {
if ($pesterTestResults) {
#region Export Pester test results to an Excel file
$exportExcelParams = @{
Path = $ExcelFilePath
WorksheetName = $WorkSheetName
ClearSheet = $true
PassThru = $true
BoldTopRow = $true
FreezeTopRow = $true
AutoSize = $true
AutoFilter = $true
AutoNameRange = $true
}
Write-Verbose "Export Pester test results to Excel file '$($exportExcelParams.Path)'"
$excel = $pesterTestResults | Select-Object -Property @{
name = 'FilePath'; expression = { $_.container.Item.FullName }
},
@{name = 'FileName'; expression = { $_.container.Item.Name } },
@{name = 'Path'; expression = { $_.ExpandedPath } },
@{name = 'Name'; expression = { $_.ExpandedName } },
@{name = 'Date'; expression = { $_.ExecutedAt } },
@{name = 'Time'; expression = { $_.ExecutedAt } },
Result,
Passed,
Skipped,
@{name = 'Duration'; expression = { $_.Duration.TotalSeconds } },
@{name = 'TotalDuration'; expression = { $_.container.Duration } },
@{name = 'Tag'; expression = { $_.Tag -join ', ' } },
@{name = 'Error'; expression = { $_.ErrorRecord -join ', ' } } |
Export-Excel @exportExcelParams
#endregion
#region Format the Excel worksheet
$ws = $excel.Workbook.Worksheets[$WorkSheetName]
# Display ExecutedAt in Date and Time format
Set-Column -Worksheet $ws -Column 5 -NumberFormat 'Short Date'
Set-Column -Worksheet $ws -Column 6 -NumberFormat 'hh:mm:ss'
# Display Duration in seconds with 3 decimals
Set-Column -Worksheet $ws -Column 10 -NumberFormat '0.000'
# Add comment to Duration column title
$comment = $ws.Cells['J1:J1'].AddComment('Total seconds', $env:USERNAME)
$comment.AutoFit = $true
# Set the width for column Path
$ws.Column(3) | Set-ExcelRange -Width 29
# Center the column titles
Set-ExcelRange -Address $ws.Row(1) -Bold -HorizontalAlignment Center
# Hide columns FilePath, Name, Passed and Skipped
(1, 4, 8, 9) | ForEach-Object {
Set-ExcelColumn -Worksheet $ws -Column $_ -Hide
}
# Set the color to red when 'Result' is 'Failed'
$endRow = $ws.Dimension.End.Row
$formattingParams = @{
Worksheet = $ws
range = "G2:L$endRow"
RuleType = 'ContainsText'
ConditionValue = "Failed"
BackgroundPattern = 'None'
ForegroundColor = 'Red'
Bold = $true
}
Add-ConditionalFormatting @formattingParams
# Set the color to green when 'Result' is 'Passed'
$endRow = $ws.Dimension.End.Row
$formattingParams = @{
Worksheet = $ws
range = "G2:L$endRow"
RuleType = 'ContainsText'
ConditionValue = "Passed"
BackgroundPattern = 'None'
ForegroundColor = 'Green'
}
Add-ConditionalFormatting @formattingParams
#endregion
#region Save the formatted Excel file
Close-ExcelPackage -ExcelPackage $excel
#endregion
}
else {
Write-Warning 'No Pester test results to export'
}
}

View File

@@ -0,0 +1,11 @@
{
"Run": {
"Path": "."
},
"TestResult": {
"Enabled": false,
"OutputFormat": "NUnitXml",
"OutputPath": "PesterTestResults.xml",
"OutputEncoding": "UTF8"
}
}

View File

@@ -1,5 +1,9 @@
$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
#Export some sales data to Excel, format it as a table and put a data-bar in. For this example we won't create the pivot table during the export
$excel = ConvertFrom-Csv @"
@@ -10,7 +14,7 @@ Banana, London , 300, 200
Orange, Paris, 600, 500
Banana, Paris, 300, 200
Apple, New York, 1200,700
"@ | Export-Excel -PassThru -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"}
"@ | Export-Excel -PassThru -Path $xlSourcefile -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"}
#Add a pivot table, specify its address to put it on the same sheet, use the data that was just exported set the table style and number format.
#Use the "City" for the row names, and "Product" for the columnnames, and sum both the gross and net values for each City/Product combination; add grand totals to rows and columns.

21
Examples/PsGallery.ps1 Normal file
View File

@@ -0,0 +1,21 @@
$top1000 = foreach ($p in 1..50) {
$c = Invoke-WebRequest -Uri "https://www.powershellgallery.com/packages" -method Post -Body "q=&sortOrder=package-download-count&page=$p"
[regex]::Matches($c.Content,'<table class="width-hundred-percent">.*?</table>', [System.Text.RegularExpressions.RegexOptions]::Singleline) | foreach {
$name = [regex]::Match($_, "(?<=<h1><a href=.*?>).*(?=</a></h1>)").value
$n = [regex]::replace($_,'^.*By:\s*<li role="menuitem">','', [System.Text.RegularExpressions.RegexOptions]::Singleline)
$n = [regex]::replace($n,'</div>.*$','', [System.Text.RegularExpressions.RegexOptions]::Singleline)
$by = [regex]::match($n,'(?<=">).*(?=</a>)').value
$qty = [regex]::match($n,'\S*(?= downloads)').value
[PSCustomObject]@{
Name = $name
by = $by
Downloads = $qty
}
}
}
del "~\Documents\gallery.xlsx"
$pivotdef = New-PivotTableDefinition -PivotTableName 'Summary' -PivotRows by -PivotData @{name="Count"
Downloads="Sum"} -PivotDataToColumn -Activate -ChartType ColumnClustered -PivotNumberFormat '#,###'
$top1000 | export-excel -path '~\Documents\gallery.xlsx' -Numberformat '#,###' -PivotTableDefinition $pivotdef -TableName 'TopDownloads' -Show

78
Examples/Subtotals.ps1 Normal file
View File

@@ -0,0 +1,78 @@
$Data = ConvertFrom-Csv @'
Product, City, Gross, Net
Apple, London , 300, 250
Orange, London , 400, 350
Banana, London , 300, 200
Grape, Munich, 100, 100
Orange, Paris, 600, 500
Banana, Paris, 300, 200
Apple, New York, 1200,700
'@
$ExcelPath = "$env:temp\subtotal.xlsx"
$SheetName = 'Sheet1'
Remove-Item -Path $ExcelPath -ErrorAction SilentlyContinue
$GroupByFieldName = 'City'
$TotalSingleRows = $false
$GrandTotal = $false
$SubtotalRowHeight = 0 #If non zero will set subtotals to this height
$Subtotals =@{ 'Net' = {"=SUBTOTAL(3,D{0}:D{1})" -f $from, $to}
}
$SubtotalFieldName = 'Net'
$SubtotalFormula = '=SUBTOTAL(3,D{0}:D{1})' # {0} and {1} are placeholders for the first and last row. D is the column to total in
# 1=AVERAGE; 2=COUNT; 3=COUNTA; 4=MAX; 5=MIN; 6=PRODUCT; 7=STDEV; 8=STDEVP; 9=SUM; 10=VAR; 11=VARP add 100 to ignore hidden values
#at each change in the Group by field, insert a subtotal (count) formula in the title column & send to excel - list those rows and make them half height after export
$currentRow = 2
$lastChangeRow = 2
$insertedRows = @()
#$hideRows = @()
$lastValue = $Data[0].$GroupByFieldName
$excel = $Data | ForEach-Object -Process {
if ($_.$GroupByFieldName -ne $lastvalue) {
if ($lastChangeRow -lt ($currentrow - 1) -or $totalSingleRows) {
$formula = $SubtotalFormula -f $lastChangeRow, ($currentrow - 1)
$insertedRows += $currentRow
[pscustomobject]@{$SubtotalFieldName = $formula}
$currentRow += 1
}
$lastChangeRow = $currentRow
$lastValue = $_.$GroupByFieldName
}
$_
$currentRow += 1
} -end {
$formula = $SubtotalFormula -f $lastChangeRow, ($currentrow - 1)
[pscustomobject]@{$SubtotalFieldName=$formula}
if ($GrandTotal) {
$formula = $SubtotalFormula -f $lastChangeRow, ($currentrow - 1)
[pscustomobject]@{$SubtotalFieldName=$formula}
}
} | Export-Excel -Path $ExcelPath -PassThru -AutoSize -AutoFilter -BoldTopRow -WorksheetName $sheetName
#We kept a lists of the total rows. Since single rows won't get expanded/collapsed hide them.
if ($subtotalrowHeight) {
foreach ($r in $insertedrows) { $excel.WorkItems.Row($r).Height = $SubtotalRowHeight}
}
#foreach ($r in $hideRows) { $excel.$SheetName.Row($r).hidden = $true}
$range = $excel.$SheetName.Dimension.Address
$sheetIndex = $excel.Sheet1.Index
Close-ExcelPackage -ExcelPackage $excel
try { $excelApp = New-Object -ComObject "Excel.Application" }
catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return }
try { $excelWorkBook = $excelApp.Workbooks.Open($ExcelPath) }
catch { Write-Warning -Message "Could not Open $ExcelPath." ; return }
$ws = $excelWorkBook.Worksheets.Item($sheetIndex)
$null = $ws.Range($range).Select()
$null = $excelapp.Selection.AutoOutline()
$excelWorkBook.Save()
$excelWorkBook.Close()
$excelApp.Quit()
Start-Process $ExcelPath

View File

@@ -29,7 +29,7 @@ function ConvertTo-PesterTest {
`$target.psobject.Properties.name | ForEach-Object {`$p=@{}} {`$p.`$_=`$(`$target.`$_)}
Invoke-RestMethod @p | Should Be '$($record.ExpectedResult)'
Invoke-RestMethod @p | Should -Be '$($record.ExpectedResult)'
}
"@

View File

@@ -30,7 +30,7 @@ function Test-APIReadXls {
`$target.psobject.Properties.name | ForEach-Object {`$p=@{}} {`$p.`$_=`$(`$target.`$_)}
Invoke-RestMethod @p | Should Be '$($record.ExpectedResult)'
Invoke-RestMethod @p | Should -Be '$($record.ExpectedResult)'
}
"@

View File

@@ -0,0 +1,64 @@
$xlfile = "$env:temp\test.xlsm"
Remove-Item $xlfile -ErrorAction SilentlyContinue
ConvertFrom-Csv @"
Region,Item,TotalSold
West,screwdriver,98
West,kiwi,19
North,kiwi,47
West,screws,48
West,avocado,52
East,avocado,40
South,drill,61
North,orange,92
South,drill,29
South,saw,36
"@ | Export-Excel $xlfile -TableName 'Sales' -WorksheetName 'Sales' -AutoSize
$Excel = ConvertFrom-Csv @"
Supplier,Item,TotalBought
Hardware,screwdriver,98
Groceries,kiwi,19
Hardware,screws,48
Groceries,avocado,52
Hardware,drill,61
Groceries,orange,92
Hardware,drill,29
HArdware,saw,36
"@ | Export-Excel $xlfile -TableName 'Purchases' -WorksheetName 'Purchases' -PassThru -AutoSize
$wb = $Excel.Workbook
$wb.CreateVBAProject()
# Create a module with a sub to highlight the selected row & column of the active table.
# https://docs.microsoft.com/en-gb/office/vba/excel/Concepts/Cells-and-Ranges/highlight-the-active-cell-row-or-column
$codeModule = @"
Public Sub HighlightSelection(ByVal Target As Range)
' Clear the color of all the cells
Cells.Interior.ColorIndex = 0
If Target.Cells.Count > 1 Then Exit Sub
Application.ScreenUpdating = False
With ActiveCell
' Highlight the row and column that contain the active cell, within the current region
Range(Cells(.Row, .CurrentRegion.Column), Cells(.Row, .CurrentRegion.Columns.Count + .CurrentRegion.Column - 1)).Interior.ColorIndex = 38
Range(Cells(.CurrentRegion.Row, .Column), Cells(.CurrentRegion.Rows.Count + .CurrentRegion.Row - 1, .Column)).Interior.ColorIndex = 24
End With
Application.ScreenUpdating = True
End Sub
"@
$module = $wb.VbaProject.Modules.AddModule("PSExcelModule")
$module.Code = $codeModule
# Add a call to the row & column highlight sub on each worksheet.
$codeSheet = @"
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
HighlightSelection Target
End Sub
"@
foreach ($sheet in $wb.Worksheets) {
$sheet.CodeModule.Code = $codeSheet
}
Close-ExcelPackage $Excel -Show

View File

@@ -0,0 +1,41 @@
$xlfile = "$env:temp\test.xlsm"
Remove-Item $xlfile -ErrorAction SilentlyContinue
$Excel = ConvertFrom-Csv @"
Region,Item,TotalSold
West,screwdriver,98
West,kiwi,19
North,kiwi,47
West,screws,48
West,avocado,52
East,avocado,40
South,drill,61
North,orange,92
South,drill,29
South,saw,36
"@ | Export-Excel $xlfile -TableName 'Sales' -WorksheetName 'Sales' -AutoSize -PassThru
$wb = $Excel.Workbook
$sheet = $wb.Worksheets["Sales"]
$wb.CreateVBAProject()
# Add a sub to the 'Worksheet_SelectionChange' event of the worksheet to highlight the selected row & column of the active table.
# https://docs.microsoft.com/en-gb/office/vba/excel/Concepts/Cells-and-Ranges/highlight-the-active-cell-row-or-column
$code = @"
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Clear the color of all the cells
Cells.Interior.ColorIndex = 0
If Target.Cells.Count > 1 Then Exit Sub
Application.ScreenUpdating = False
With ActiveCell
' Highlight the row and column that contain the active cell, within the current region
Range(Cells(.Row, .CurrentRegion.Column), Cells(.Row, .CurrentRegion.Columns.Count + .CurrentRegion.Column - 1)).Interior.ColorIndex = 38
Range(Cells(.CurrentRegion.Row, .Column), Cells(.CurrentRegion.Rows.Count + .CurrentRegion.Row - 1, .Column)).Interior.ColorIndex = 24
End With
Application.ScreenUpdating = True
End Sub
"@
$sheet.CodeModule.Code = $code
Close-ExcelPackage $Excel -Show

View File

@@ -0,0 +1,52 @@
Function Import-Bycolumns {
Param(
[Parameter(Mandatory=$true)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
[Int]$StartRow = 1,
[String]$WorksheetName,
[Int]$EndRow ,
[Int]$StartColumn = 1,
[Int]$EndColumn
)
Function Get-RowNames {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = "Name would be incorrect, and command is not exported")]
param(
[Parameter(Mandatory)]
[Int[]]$Rows,
[Parameter(Mandatory)]
[Int]$StartColumn
)
foreach ($R in $Rows) {
#allow "False" or "0" to be headings
$Worksheet.Cells[$R, $StartColumn] | Where-Object {-not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{N = 'Row'; E = { $R } }, Value
}
}
if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] }
elseif (-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorkSheetName])) {
throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($ExcelPackage.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter." ; return
}
if (-not $EndRow ) { $EndRow = $Worksheet.Dimension.End.Row }
if (-not $EndColumn) { $EndColumn = $Worksheet.Dimension.End.Column }
$Rows = $Startrow .. $EndRow ;
$Columns = (1 + $StartColumn)..$EndColumn
if ((-not $rows) -or (-not ($PropertyNames = Get-RowNames -Rows $Rows -StartColumn $StartColumn))) {
throw "No headers found in left coulmn '$Startcolumn'. "; return
}
if (-not $Columns) {
Write-Warning "Worksheet '$WorksheetName' in workbook contains no data in the rows after left column '$StartColumn'"
}
else {
foreach ($c in $Columns) {
$NewColumn = [Ordered]@{ }
foreach ($p in $PropertyNames) {
$NewColumn[$p.Value] = $Worksheet.Cells[$p.row,$c].text
}
[PSCustomObject]$NewColumn
}
}
}

View File

@@ -0,0 +1,6 @@
# Create an Empty Excel File
Use an empty string to export to an excel file.
```powershell
#Build an Excel file named: "file.xlsx" containing a worksheet: "MyWorksheet"
"" | Export-Excel -Path "C:\Test\file.xlsx" -WorksheetName "MyWorksheet"
```

View File

@@ -0,0 +1,41 @@
# How to Read an Existing Excel File
## Enumerate the Excel File Contents
```powershell
#Load the Excel file into a PSCustomObject
$ExcelFile = Import-Excel "C:\Test\file.xlsx" -WorksheetName "Sheet1"
```
## Visual of Data Structure
The File C:\Test\file.xlsx contains
![ExcelFileContents](/images/FAQ_Images/ExcelFileContents.png)
After loading this data into ```$ExcelFile``` the data is stored like:
![ExcelFileDebugImg](/images/FAQ_Images/ExcelFileDebugImg.jpg)
## Other Common Operations
### Load a Column
```powershell
$SpecificColumn = $ExcelFile."anotherHeader" #loads column with the header "anotherHeader" -- data stored in an array
```
### Load a Row
```powershell
$SpecificRow = $ExcelFile[1] #Loads row at index 1. Index 1 is the first row instead of 0.
```
### Map Contents to Hashtable to Interpret Data
Sometimes mapping to a Hashtable is more convenient to have access to common Hashtable operations. Enumerate a Hashtable with the row's data by:
```powershell
$HashTable = @{}
$SpecificRow= $ExcelFile[2]
$SpecificRow.psobject.properties | ForEach-Object {
$HashTable[$_.Name] = $_.Value
}
```
To then iterate through the enumerated Hashtable:
```powershell
ForEach ($Key in ($HashTable.GetEnumerator()) | Where-Object {$_.Value -eq "x"}){ #Only grabs a key where the value is "x"
#values accessible with $Key.Name or $Key.Value
}
```

View File

@@ -0,0 +1,34 @@
# Write to an Existing Excel File
### Enumerate the Excel File
The cmdlets ```Open-ExcelPackage``` and ```Close-ExcelPackage``` allow for direct modification to Excel file contents.
```powershell
$ExcelPkg = Open-ExcelPackage -Path "C:\Test\file.xlsx"
```
Contents of file.xlsx:
![ExcelFileContents](/images/FAQ_Images/ExcelFileContents.png)
### Enumerate the Worksheet to View or Modify the Data
```powershell
$WorkSheet = $ExcelPkg.Workbook.Worksheets["sheet1"].Cells #open excel worksheet cells from worksheet "sheet1"
```
Visual of data structure:
![DataStructureExcelPkg](/images/FAQ_Images/DataStructureExcelPkg.png)
A1 contains "someHeader", A2 contains "data1" etc.
### Modify a Specific Value in a File
Values can be accessed by row, column. Similar to a 2D array.
```powershell
$WorkSheet[1,4].Value = "New Column Header" #Starts at index 1 not 0
```
Contents of file.xlsx after modifying:
![ExcelFileContentsPostAdd](/images/FAQ_Images/ExcelFileContentsPostAdd.png)
### Load Value at Specific Index
```powershell
$ValueAtIndex = $WorkSheet[2,1].Value #Loads the value at row 2, column A
```
```$ValueAtIndex``` now contains: ![ValueAtIndexData](/images/FAQ_Images/ValueAtIndexData.png)
### Save File After Modifying
The changes will not display in the Excel file until Close-ExcelPackage is called.
```powershell
Close-ExcelPackage $ExcelPkg #close and save changes made to the Excel file.
```
**Note**: If the file is currently in use, Close-ExcelPackage will return an error and will not save the information.

View File

@@ -6,7 +6,7 @@
RootModule = 'ImportExcel.psm1'
# Version number of this module.
ModuleVersion = '7.0.1'
ModuleVersion = '7.5.3'
# ID used to uniquely identify this module
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
@@ -18,7 +18,7 @@
CompanyName = 'Doug Finke'
# Copyright statement for this module
Copyright = 'c 2019 All rights reserved.'
Copyright = 'c 2020 All rights reserved.'
# Description of the functionality provided by this module
Description = @'
@@ -48,11 +48,14 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'ConvertTo-ExcelXlsx',
'Copy-ExcelWorksheet',
'DoChart',
'Enable-ExcelAutoFilter',
'Enable-ExcelAutofit',
'Expand-NumberFormat',
'Export-Excel',
'Export-ExcelSheet',
'Export-MultipleExcelSheets',
'Export-ExcelSheet',
'Get-ExcelColumnName',
'Get-ExcelFileSummary',
'Get-ExcelSheetDimensionAddress',
'Get-ExcelSheetInfo',
'Get-ExcelWorkbookInfo',
'Get-HtmlTable',
@@ -63,6 +66,7 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'Import-UPS',
'Import-USPS',
'Invoke-AllTests',
'Invoke-ExcelQuery',
'Invoke-Sum',
'Join-Worksheet',
'LineChart',
@@ -78,7 +82,10 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'Open-ExcelPackage',
'PieChart',
'Pivot',
'Remove-Worksheet'
'Read-Clipboard',
'Read-OleDbData',
'ReadClipboardImpl',
'Remove-Worksheet',
'Select-Worksheet',
'Send-SQLDataToExcel',
'Set-CellStyle',
@@ -124,9 +131,8 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'.\Charting\Charting.ps1',
'.\InferData\InferData.ps1',
'.\Pivot\Pivot.ps1',
'.\spikes\ConvertFrom-ExcelColumnName.ps1',
'.\Examples', '.\images', '.\Testimonials'
'.\Examples',
'.\Testimonials'
)
# Private data to pass to the module specified in RootModule/ModuleToProcess

View File

@@ -7,8 +7,8 @@ if (-not $Strings) {
try { [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") }
catch { Write-Warning -Message $Strings.SystemDrawingAvailable }
foreach ($directory in @('Private', 'Public','Charting','InferData','Pivot')) {
Get-ChildItem -Path "$PSScriptRoot\$directory\*.ps1" | ForEach-Object {. $_.FullName}
foreach ($directory in @('Private', 'Public', 'Charting', 'InferData', 'Pivot')) {
Get-ChildItem -Path "$PSScriptRoot\$directory\*.ps1" | ForEach-Object { . $_.FullName }
}
if ($PSVersionTable.PSVersion.Major -ge 5) {
@@ -53,8 +53,8 @@ brew install mono-libgdiplus
"@
Write-Warning -Message $msg
}
finally {
$ExcelPackage | Close-ExcelPackage -NoSave
}
}
}
finally {
$ExcelPackage | Close-ExcelPackage -NoSave
}
}

View File

@@ -7,5 +7,5 @@ if (-not $fullPath) {
$fullPath = Join-Path $fullPath -ChildPath "ImportExcel"
}
Push-location $PSScriptRoot
Robocopy . $fullPath /mir /XD .vscode .git CI __tests__ data mdHelp /XF appveyor.yml azure-pipelines.yml .gitattributes .gitignore filelist.txt install.ps1 InstallModule.ps1
Robocopy . $fullPath /mir /XD .vscode images .git .github CI __tests__ data mdHelp spikes /XF README.md README.original.md appveyor.yml azure-pipelines.yml .gitattributes .gitignore filelist.txt install.ps1 InstallModule.ps1 PublishToGallery.ps1
Pop-Location

2
Pivot/README.md Normal file
View File

@@ -0,0 +1,2 @@
# Pivot

View File

@@ -1,38 +1,34 @@
---
external help file: ImportExcel-help.xml
Module Name: ImportExcel
online version:
online version: null
schema: 2.0.0
---
# Pivot
## SYNOPSIS
{{ Fill in the Synopsis }}
## SYNTAX
```
```text
Pivot [[-targetData] <Object>] [[-pivotRows] <Object>] [[-pivotData] <Object>] [[-ChartType] <eChartType>]
[<CommonParameters>]
```
## DESCRIPTION
{{ Fill in the Description }}
## EXAMPLES
### Example 1
```powershell
```text
PS C:\> {{ Add example code here }}
```
{{ Add example description here }}
## PARAMETERS
### -ChartType
{{ Fill ChartType Description }}
```yaml
Type: eChartType
@@ -48,7 +44,6 @@ Accept wildcard characters: False
```
### -pivotData
{{ Fill pivotData Description }}
```yaml
Type: Object
@@ -63,7 +58,6 @@ Accept wildcard characters: False
```
### -pivotRows
{{ Fill pivotRows Description }}
```yaml
Type: Object
@@ -78,7 +72,6 @@ Accept wildcard characters: False
```
### -targetData
{{ Fill targetData Description }}
```yaml
Type: Object
@@ -93,7 +86,8 @@ Accept wildcard characters: False
```
### CommonParameters
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about\_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
## INPUTS
@@ -102,6 +96,8 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable
## OUTPUTS
### System.Object
## NOTES
## RELATED LINKS

View File

@@ -0,0 +1,25 @@
function Invoke-ExcelReZipFile {
<#
#>
param(
[Parameter(Mandatory)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage
)
Write-Verbose -Message "Re-Zipping $($ExcelPackage.file) using .NET ZIP library"
try {
Add-Type -AssemblyName 'System.IO.Compression.Filesystem' -ErrorAction stop
}
catch {
Write-Error "The -ReZip parameter requires .NET Framework 4.5 or later to be installed. Recommend to install Powershell v4+"
continue
}
try {
$TempZipPath = Join-Path -Path ([System.IO.Path]::GetTempPath()) -ChildPath ([System.IO.Path]::GetRandomFileName())
$null = [io.compression.zipfile]::ExtractToDirectory($ExcelPackage.File, $TempZipPath)
Remove-Item $ExcelPackage.File -Force
$null = [io.compression.zipfile]::CreateFromDirectory($TempZipPath, $ExcelPackage.File)
Remove-Item $TempZipPath -Recurse -Force
}
catch { throw "Error resizipping $path : $_" }
}

View File

@@ -69,7 +69,7 @@
$Address = "$($Address.Row):$($Address.Row)"
}
elseif ($Address -is [OfficeOpenXml.ExcelColumn]) {
$Address = (New-Object 'OfficeOpenXml.ExcelAddress' @(1, $address.ColumnMin, 1, $address.ColumnMax).Address) -replace '1',''
$Address = (New-Object 'OfficeOpenXml.ExcelAddress' @(1, $address.ColumnMin, 1, $address.ColumnMax)).Address -replace '1',''
if ($Address -notmatch ':') {$Address = "$Address`:$Address"}
}
if ( $Address -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''}
@@ -87,7 +87,7 @@
if ($Reverse) {
if ($rule.type -match 'IconSet$' ) {$rule.reverse = $true}
elseif ($rule.type -match 'ColorScale$') {$temp =$rule.LowValue.Color ; $rule.LowValue.Color = $rule.HighValue.Color; $rule.HighValue.Color = $temp}
else {Write-Warning -Message "-Reverse was ignored because $ruletype does not support it."}
else {Write-Warning -Message "-Reverse was ignored because $RuleType does not support it."}
}
#endregion
#region set the rule conditions

View File

@@ -11,7 +11,7 @@ function Add-ExcelName {
$ws = $Range.Worksheet
if (-not $RangeName) {
$RangeName = $ws.Cells[$Range.Start.Address].Value
$Range = ($Range.Worksheet.cells[($range.start.row +1), $range.start.Column , $range.end.row, $range.end.column])
$Range = ($Range.Worksheet.cells[($Range.start.row +1), $Range.start.Column , $Range.end.row, $Range.end.column])
}
if ($RangeName -match '\W') {
Write-Warning -Message "Range name '$RangeName' contains illegal characters, they will be replaced with '_'."

View File

@@ -7,7 +7,7 @@
[OfficeOpenXml.ExcelAddressBase]
$Address,
$ExcelPackage,
$SourceWorkSheet,
$SourceWorksheet,
$SourceRange,
$PivotRows,
$PivotData,
@@ -75,11 +75,11 @@
if (-not $wsPivot.PivotTables[$pivotTableName] ) {
try {
#Accept a string or a worksheet object as $SourceWorksheet - we don't need a worksheet if we have a Rangebase .
if ( $SourceWorkSheet -is [string]) {
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets.where( {$_.name -Like $SourceWorkSheet})[0]
if ( $SourceWorksheet -is [string]) {
$SourceWorksheet = $ExcelPackage.Workbook.Worksheets.where( {$_.name -Like $SourceWorksheet})[0]
}
elseif ( $SourceWorkSheet -is [int] ) {
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets[$SourceWorkSheet]
elseif ( $SourceWorksheet -is [int] ) {
$SourceWorksheet = $ExcelPackage.Workbook.Worksheets[$SourceWorksheet]
}
if ( $SourceRange -is [OfficeOpenXml.Table.ExcelTable]) {$SourceRange = $SourceRange.Address }
if ( $sourceRange -is [OfficeOpenXml.ExcelRange] -or
@@ -87,17 +87,17 @@
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceRange, $pivotTableName)
}
elseif (-not $SourceRange) {
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorkSheet.cells[$SourceWorkSheet.Dimension.Address], $pivotTableName)
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorksheet.cells[$SourceWorksheet.Dimension.Address], $pivotTableName)
}
elseif ($SourceWorkSheet -isnot [OfficeOpenXml.ExcelWorksheet] ) {
elseif ($SourceWorksheet -isnot [OfficeOpenXml.ExcelWorksheet] ) {
Write-Warning -Message "Could not find source Worksheet for pivot-table '$pivotTableName'." ; return
}
elseif ( $SourceRange -is [String] -or $SourceRange -is [OfficeOpenXml.ExcelAddress]) {
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorkSheet.Cells[$SourceRange], $pivotTableName)
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorksheet.Cells[$SourceRange], $pivotTableName)
}
else {Write-warning "Could not create a PivotTable with the Source Range provided."; return}
foreach ($Row in $PivotRows) {
try {$null = $pivotTable.RowFields.Add($pivotTable.Fields[$Row]) }
foreach ($row in $PivotRows) {
try {$null = $pivotTable.RowFields.Add($pivotTable.Fields[$row]) }
catch {Write-Warning -message "Could not add '$row' to Rows in PivotTable $pivotTableName." }
}
foreach ($Column in $PivotColumns) {
@@ -150,8 +150,8 @@
else {
Write-Warning -Message "PivotTable defined in $($pivotTableName) already exists, only the data range will be changed."
$pivotTable = $wsPivot.PivotTables[$pivotTableName]
if (-not $SourceRange) { $SourceRange = $SourceWorkSheet.Dimension.Address}
$pivotTable.CacheDefinition.SourceRange = $SourceWorkSheet.cells[$SourceRange]
if (-not $SourceRange) { $SourceRange = $SourceWorksheet.Dimension.Address}
$pivotTable.CacheDefinition.SourceRange = $SourceWorksheet.cells[$SourceRange]
#change for epPlus 4.5 - Previously needed to hack the xml
# $pivotTable.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref = $SourceRange

View File

@@ -4,7 +4,7 @@ function Add-Worksheet {
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "Package", Position = 0)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
[Parameter(Mandatory = $true, ParameterSetName = "WorkBook")]
[Parameter(Mandatory = $true, ParameterSetName = "Workbook")]
[OfficeOpenXml.ExcelWorkbook]$ExcelWorkbook,
[string]$WorksheetName ,
[switch]$ClearSheet,

View File

@@ -1,33 +1,38 @@
function Close-ExcelPackage {
[CmdLetBinding()]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
param (
[parameter(Mandatory=$true, ValueFromPipeline=$true)]
[parameter(Mandatory = $true, ValueFromPipeline = $true)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
[switch]$Show,
[Switch]$Show,
[Switch]$NoSave,
$SaveAs,
[ValidateNotNullOrEmpty()]
[String]$Password,
[switch]$Calculate
[Switch]$Calculate,
[Switch]$ReZip
)
if ( $NoSave) {$ExcelPackage.Dispose()}
if ( $NoSave) { $ExcelPackage.Dispose() }
else {
if ($Calculate) {
try { [OfficeOpenXml.CalculationExtension]::Calculate($ExcelPackage.Workbook) }
catch { Write-Warning "One or more errors occured while calculating, save will continue, but there may be errors in the workbook."}
try { [OfficeOpenXml.CalculationExtension]::Calculate($ExcelPackage.Workbook) }
catch { Write-Warning "One or more errors occured while calculating, save will continue, but there may be errors in the workbook." }
}
if ($SaveAs) {
$SaveAs = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($SaveAs)
if ($Password) {$ExcelPackage.SaveAs( $SaveAs, $Password ) }
else {$ExcelPackage.SaveAs( $SaveAs)}
if ($Password) { $ExcelPackage.SaveAs( $SaveAs, $Password ) }
else { $ExcelPackage.SaveAs( $SaveAs) }
}
else {
if ($Password) {$ExcelPackage.Save($Password) }
else {$ExcelPackage.Save() }
else {
if ($Password) { $ExcelPackage.Save($Password) }
else { $ExcelPackage.Save() }
$SaveAs = $ExcelPackage.File.FullName
}
if ($ReZip) {
Invoke-ExcelReZipFile -ExcelPackage $ExcelPackage
}
$ExcelPackage.Dispose()
if ($Show) {Start-Process -FilePath $SaveAs }
if ($Show) { Start-Process -FilePath $SaveAs }
}
}

View File

@@ -7,7 +7,7 @@
$Referencefile ,
[parameter(Mandatory=$true,Position=1)]
$Differencefile ,
$WorkSheetName = "Sheet1",
$WorksheetName = "Sheet1",
$Property = "*" ,
$ExcludeProperty ,
[Parameter(ParameterSetName='B', Mandatory)]
@@ -32,19 +32,19 @@
catch { Write-Warning -Message "Could not Resolve the filenames." ; return }
#If we have one file , we must have two different worksheet names. If we have two files we can have a single string or two strings.
if ($onefile -and ( ($WorkSheetName.count -ne 2) -or $WorkSheetName[0] -eq $WorkSheetName[1] ) ) {
if ($onefile -and ( ($WorksheetName.count -ne 2) -or $WorksheetName[0] -eq $WorksheetName[1] ) ) {
Write-Warning -Message "If both the Reference and difference file are the same then worksheet name must provide 2 different names"
return
}
if ($WorkSheetName.count -eq 2) {$worksheet1 = $WorkSheetName[0] ; $workSheet2 = $WorkSheetName[1]}
elseif ($WorkSheetName -is [string]) {$worksheet1 = $workSheet2 = $WorkSheetName}
if ($WorksheetName.count -eq 2) {$worksheet1 = $WorksheetName[0] ; $worksheet2 = $WorksheetName[1]}
elseif ($WorksheetName -is [string]) {$worksheet1 = $worksheet2 = $WorksheetName}
else {Write-Warning -Message "You must provide either a single worksheet name or two names." ; return }
$params= @{ ErrorAction = [System.Management.Automation.ActionPreference]::Stop }
foreach ($p in @("HeaderName","NoHeader","StartRow")) {if ($PSBoundParameters[$p]) {$params[$p] = $PSBoundParameters[$p]}}
try {
$sheet1 = Import-Excel -Path $Referencefile -WorksheetName $WorkSheet1 @params
$sheet2 = Import-Excel -Path $Differencefile -WorksheetName $WorkSheet2 @Params
$sheet1 = Import-Excel -Path $Referencefile -WorksheetName $worksheet1 @params
$sheet2 = Import-Excel -Path $Differencefile -WorksheetName $worksheet2 @Params
}
catch {Write-Warning -Message "Could not read the worksheet from $Referencefile and/or $Differencefile." ; return }
@@ -57,7 +57,7 @@
$propList = @()
foreach ($p in $Property) {$propList += ($headings.where({$_ -like $p}) )}
foreach ($p in $ExcludeProperty) {$propList = $propList.where({$_ -notlike $p}) }
if (($headings -contains $key) -and ($propList -notcontains $Key)) {$propList += $Key}
if (($headings -contains $Key) -and ($propList -notcontains $Key)) {$propList += $Key}
$propList = $propList | Select-Object -Unique
if ($propList.Count -eq 0) {Write-Warning -Message "No Columns are selected with -Property = '$Property' and -excludeProperty = '$ExcludeProperty'." ; return}
@@ -106,7 +106,7 @@
}
}
#if font color was specified, set it on changed properties where the same key appears in both sheets.
if ($diff -and $FontColor -and (($propList -contains $Key) -or ($key -is [hashtable])) ) {
if ($diff -and $FontColor -and (($propList -contains $Key) -or ($Key -is [hashtable])) ) {
$updates = $diff.where({$_.SideIndicator -ne "=="}) | Group-object -Property $Key | Where-Object {$_.count -eq 2}
if ($updates) {
$XL1 = Open-ExcelPackage -path $Referencefile
@@ -135,28 +135,28 @@
elseif ($diff -and $FontColor) {Write-Warning -Message "To match rows to set changed cells, you must specify -Key and it must match one of the included properties." }
#if nothing was found write a message which will not be redirected
if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$WorkSheet2 returned no results." }
if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$worksheet2 returned no results." }
if ($Show) {
Start-Process -FilePath $Referencefile
if (-not $oneFile) { Start-Process -FilePath $Differencefile }
if ($GridView) { Write-Warning -Message "-GridView is ignored when -Show is specified" }
}
elseif ($GridView -and $propList -contains $key) {
elseif ($GridView -and $propList -contains $Key) {
if ($IncludeEqual -and -not $ExcludeDifferent) {
$GroupedRows = $diff | Group-Object -Property $key
$GroupedRows = $diff | Group-Object -Property $Key
}
else { #to get the right now numbers on the grid we need to have all the rows.
$GroupedRows = Compare-Object -ReferenceObject $Sheet1 -DifferenceObject $Sheet2 -Property $propList -PassThru -IncludeEqual |
Group-Object -Property $key
Group-Object -Property $Key
}
#Additions, deletions and unchanged rows will give a group of 1; changes will give a group of 2 .
#If one sheet has extra rows we can get a single "==" result from compare, but with the row from the reference sheet
#but the row in the other sheet might so we will look up the row number from the key field build a hash table for that
$Sheet2 | ForEach-Object -Begin {$Rowhash = @{} } -Process {$Rowhash[$_.$key] = $_._row }
$Sheet2 | ForEach-Object -Begin {$rowHash = @{} } -Process {$rowHash[$_.$Key] = $_._row }
$ExpandedDiff = ForEach ($g in $GroupedRows) {
#we're going to create a custom object from a hash table. We want the fields to be ordered
@@ -168,11 +168,11 @@
#if we have already set the side, this is the second record, so set side to indicate "changed"
if ($hash.Side) {$hash.side = "<>"} else {$hash["Side"] = $result.sideindicator}
#if result is "in reference" and we don't have a matching "in difference" (meaning a change) the lookup will be blank. Which we want.
$hash[">Row"] = $Rowhash[$g.Name]
$hash[">Row"] = $rowHash[$g.Name]
#position the key as the next field (only appears once)
$Hash[$key] = $g.Name
$Hash[$Key] = $g.Name
#For all the other fields we care about create <=FieldName and/or =>FieldName
foreach ($p in $propList.Where({$_ -ne $key})) {
foreach ($p in $propList.Where({$_ -ne $Key})) {
if ($result.SideIndicator -eq "==") {$hash[("=>$P")] = $hash[("<=$P")] =$result.$P}
else {$hash[($result.SideIndicator+$P)] =$result.$P}
}
@@ -191,7 +191,7 @@
if ( $ExcludeDifferent) {$ExpandedDiff = $ExpandedDiff.where({$_.side -eq "=="}) | Sort-Object -Property "<row" ,">row" }
elseif ( $IncludeEqual) {$ExpandedDiff = $ExpandedDiff | Sort-Object -Property "<row" ,">row" }
else {$ExpandedDiff = $ExpandedDiff.where({$_.side -ne "=="}) | Sort-Object -Property "<row" ,">row" }
$ExpandedDiff | Update-FirstObjectProperties | Out-GridView -Title "Comparing $Referencefile::$worksheet1 (<=) with $Differencefile::$WorkSheet2 (=>)"
$ExpandedDiff | Update-FirstObjectProperties | Out-GridView -Title "Comparing $Referencefile::$worksheet1 (<=) with $Differencefile::$worksheet2 (=>)"
}
elseif ($GridView ) {Write-Warning -Message "To use -GridView you must specify -Key and it must match one of the included properties." }
elseif (-not $PassThru) {return ($diff | Select-Object -Property (@(@{n="_Side";e={$_.SideIndicator}},"_File" ,"_Sheet","_Row") + $propList))}

View File

@@ -3,56 +3,56 @@
param (
[parameter(Mandatory=$true)]
$Path,
$workSheetname = "Sheet1" ,
$WorksheetName = "Sheet1" ,
[parameter(Mandatory=$true)]
$range,
$destination = "$pwd\temp.png",
[switch]$show
$Range,
$Destination = "$pwd\temp.png",
[switch]$Show
)
$extension = $destination -replace '^.*\.(\w+)$' ,'$1'
$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"
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"
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()
$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"
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"
$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}
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'
$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-ExcelRange -Worksheet $workSheet -Range "b:b" -NumberFormat "#,###" -AutoFit
Set-ExcelRange -Worksheet $workSheet -Range "C:C" -NumberFormat "#,##0.00" -AutoFit
Set-ExcelRange -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
$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-ExcelRange -Worksheet $worksheet -Range "b:b" -NumberFormat "#,###" -AutoFit
Set-ExcelRange -Worksheet $worksheet -Range "C:C" -NumberFormat "#,##0.00" -AutoFit
Set-ExcelRange -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
Export-Excel -ExcelPackage $excelPackage -WorksheetName $worksheetName
Convert-ExcelRangeToImage -Path $Path -workSheetname $workSheetname -range $range -destination "$pwd\temp.png" -show
Convert-ExcelRangeToImage -Path $Path -WorksheetName $worksheetName -range $range -destination "$pwd\temp.png" -show
#>
#Convert-ExcelRangeToImage -Path $Path -workSheetname $workSheetname -range $range -destination "$pwd\temp.png" -show
#Convert-ExcelRangeToImage -Path $Path -WorksheetName $worksheetName -range $range -destination "$pwd\temp.png" -show

Some files were not shown because too many files have changed in this diff Show More