mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-06 00:23:20 +00:00
Compare commits
1114 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79e5bdf8ba | ||
|
|
b03d9b048a | ||
|
|
aea90aa8d6 | ||
|
|
d4ebc9e95d | ||
|
|
6ece4483e2 | ||
|
|
ba14511254 | ||
|
|
964cf9e9c6 | ||
|
|
8d56a351ff | ||
|
|
b2119f08f5 | ||
|
|
634aaacc55 | ||
|
|
61b44f826d | ||
|
|
9273261b34 | ||
|
|
e55dfdd10e | ||
|
|
59e40d62d0 | ||
|
|
f478e8a134 | ||
|
|
b634bf9d93 | ||
|
|
a10ade898a | ||
|
|
eb10364722 | ||
|
|
b0024cf2c4 | ||
|
|
91b0e8b0ed | ||
|
|
b997e90e78 | ||
|
|
4d8710d017 | ||
|
|
7f36b44fa8 | ||
|
|
483f761016 | ||
|
|
d55f0e64d4 | ||
|
|
f83f654c4a | ||
|
|
6a956dbd7e | ||
|
|
0929a442a5 | ||
|
|
895a5c0cb2 | ||
|
|
d7901af8f3 | ||
|
|
34f55a3659 | ||
|
|
606988bcf6 | ||
|
|
441f2ada22 | ||
|
|
29ea7012d7 | ||
|
|
67ac63ddcf | ||
|
|
c939c6ecb0 | ||
|
|
96493e059b | ||
|
|
cb7f2a06f4 | ||
|
|
99beda7a10 | ||
|
|
0c8bb2300a | ||
|
|
c09083d350 | ||
|
|
556f0ac51e | ||
|
|
1e4fc59a25 | ||
|
|
5ab6a9116d | ||
|
|
f33215382a | ||
|
|
cf5d3f83d6 | ||
|
|
91da711635 | ||
|
|
eec5e343d4 | ||
|
|
d69b640edc | ||
|
|
2ca870a889 | ||
|
|
a320cfd28c | ||
|
|
aa1b042767 | ||
|
|
7e8416d67c | ||
|
|
229b60b25d | ||
|
|
5700989321 | ||
|
|
56e1704e7e | ||
|
|
8268bbc2e1 | ||
|
|
5657659331 | ||
|
|
0d4a32e266 | ||
|
|
1c8f8d2a3d | ||
|
|
f6a65677df | ||
|
|
86a7865fb2 | ||
|
|
8b3bf4f14f | ||
|
|
4d6193f549 | ||
|
|
6ebac7b6dc | ||
|
|
d71dd36d56 | ||
|
|
3697cdfeee | ||
|
|
1e172cf21f | ||
|
|
6da7553c98 | ||
|
|
5a444c620b | ||
|
|
4a09fc3570 | ||
|
|
d706a10276 | ||
|
|
1fd2f422cd | ||
|
|
283e50547d | ||
|
|
15211a6297 | ||
|
|
8905b8d401 | ||
|
|
e9b437af4e | ||
|
|
330e237727 | ||
|
|
c56b2cd33a | ||
|
|
1aa5c6da45 | ||
|
|
9eb894cf59 | ||
|
|
3a4c2d7bd9 | ||
|
|
42cb5a316a | ||
|
|
536cdaa841 | ||
|
|
6cd9fad7ba | ||
|
|
829d854c3d | ||
|
|
b33a282740 | ||
|
|
73fc96166c | ||
|
|
00f7278115 | ||
|
|
956cf5aa49 | ||
|
|
877310e015 | ||
|
|
08bf877535 | ||
|
|
88e28a1d6c | ||
|
|
eb63fe259a | ||
|
|
6d97efc5c2 | ||
|
|
c567526eac | ||
|
|
ed210cc730 | ||
|
|
72f44ebcb9 | ||
|
|
f1d20ed163 | ||
|
|
02cf6bb3f3 | ||
|
|
5cd3897dfa | ||
|
|
fe4f2848ad | ||
|
|
4e89b3321a | ||
|
|
43b6ebf84f | ||
|
|
1ee9493bc0 | ||
|
|
8f0fc7397d | ||
|
|
4fa6fbda01 | ||
|
|
7177623104 | ||
|
|
487cf51abc | ||
|
|
ae31e9d39b | ||
|
|
9ba20b8ec8 | ||
|
|
9daefc2925 | ||
|
|
f0b4cb28f6 | ||
|
|
5f00f5cbbc | ||
|
|
d41fbf8a05 | ||
|
|
ebe49f1650 | ||
|
|
a3dced10e4 | ||
|
|
1e522c562b | ||
|
|
5ec299ff2d | ||
|
|
676ecc17e0 | ||
|
|
aa1b0018ab | ||
|
|
eabaab79c5 | ||
|
|
7a8bbb9771 | ||
|
|
85f2433ffc | ||
|
|
62c8d74a59 | ||
|
|
5e7b404daf | ||
|
|
91a1240408 | ||
|
|
e8c3d96f43 | ||
|
|
9417b25af1 | ||
|
|
a942f2133d | ||
|
|
533ed07ac8 | ||
|
|
09f35b5fd5 | ||
|
|
23a2ac394f | ||
|
|
50928e8e3b | ||
|
|
26827b0764 | ||
|
|
6c35d5b018 | ||
|
|
ab5600c9ba | ||
|
|
47dcc636d9 | ||
|
|
1768c0ac92 | ||
|
|
694fcdd8c1 | ||
|
|
0192f4d822 | ||
|
|
c641eea10a | ||
|
|
99de9a9854 | ||
|
|
3121c5eaed | ||
|
|
d02f757568 | ||
|
|
a693725949 | ||
|
|
5e19d0ca1a | ||
|
|
204b82144f | ||
|
|
91eefbd48b | ||
|
|
f86556a89d | ||
|
|
14e1dfd8db | ||
|
|
1d961c679e | ||
|
|
7026803415 | ||
|
|
e486135c4f | ||
|
|
80d9cb1290 | ||
|
|
d82c01eabf | ||
|
|
2fcb7a57a2 | ||
|
|
afe7e545f6 | ||
|
|
88638a87a9 | ||
|
|
0f354be443 | ||
|
|
abebb9af11 | ||
|
|
d8ae8b1abc | ||
|
|
30fc53857d | ||
|
|
04b7895d1e | ||
|
|
7f72aa9e86 | ||
|
|
70ab9e46c7 | ||
|
|
49e355b702 | ||
|
|
82a8536e47 | ||
|
|
35246d51e7 | ||
|
|
9dafe170f1 | ||
|
|
0d29fd813d | ||
|
|
c685ad767c | ||
|
|
f283ada708 | ||
|
|
bb3923aabf | ||
|
|
fa0b3ca79b | ||
|
|
53f8acda90 | ||
|
|
ca586fc2d5 | ||
|
|
4c5f1a967e | ||
|
|
f237861e1a | ||
|
|
282d650072 | ||
|
|
6149442bc0 | ||
|
|
113bf2c95c | ||
|
|
27e8130e6c | ||
|
|
c19e219a44 | ||
|
|
795b2017b5 | ||
|
|
cb749dff07 | ||
|
|
fd6b847d77 | ||
|
|
c6d9104d52 | ||
|
|
df157b22ab | ||
|
|
95822ac2e9 | ||
|
|
c4d20a9a28 | ||
|
|
8a20963577 | ||
|
|
c30e03a47f | ||
|
|
0a77a83e35 | ||
|
|
66f6a5fa0b | ||
|
|
a3921f5298 | ||
|
|
1823f1dde0 | ||
|
|
5d5ca57f4b | ||
|
|
11d591aad6 | ||
|
|
9841ef9436 | ||
|
|
ae1fa04334 | ||
|
|
a7861ee57d | ||
|
|
24ca7a4d86 | ||
|
|
51b23323fa | ||
|
|
001aabf526 | ||
|
|
a5a98d5c92 | ||
|
|
070d40b5af | ||
|
|
c4b3556c5d | ||
|
|
8151ed4305 | ||
|
|
6959cffa24 | ||
|
|
6be2195680 | ||
|
|
ff77606430 | ||
|
|
a874e1385e | ||
|
|
f8b9cf7251 | ||
|
|
5588c0306c | ||
|
|
359f7453c5 | ||
|
|
933abf6539 | ||
|
|
6a32da7f92 | ||
|
|
c3ac68ea2c | ||
|
|
5ea9b1d082 | ||
|
|
ae64a884fc | ||
|
|
b584b22f5f | ||
|
|
eb3a7d3f2d | ||
|
|
3130020e20 | ||
|
|
fe68ddbb0d | ||
|
|
1ce65a0758 | ||
|
|
13454cce8e | ||
|
|
96b61d38f1 | ||
|
|
59e31d54a7 | ||
|
|
6bf16f75f7 | ||
|
|
c547713ee9 | ||
|
|
f0ec5f4a96 | ||
|
|
7ded94e225 | ||
|
|
4141ba690e | ||
|
|
08ecadddb2 | ||
|
|
e42f42fde9 | ||
|
|
12fa49e314 | ||
|
|
98ce564929 | ||
|
|
7e75ecd0fb | ||
|
|
17ec040055 | ||
|
|
e65210e378 | ||
|
|
7bfb28d10f | ||
|
|
08fbfc35a3 | ||
|
|
4315ddc702 | ||
|
|
97611fc57c | ||
|
|
118330ea47 | ||
|
|
6f48219819 | ||
|
|
9d1a544e77 | ||
|
|
e836928571 | ||
|
|
718bf951b7 | ||
|
|
08dd30696e | ||
|
|
7b51d2f340 | ||
|
|
b3932f0a13 | ||
|
|
84140d757a | ||
|
|
ce8a070673 | ||
|
|
ed41c20f63 | ||
|
|
28e3fe1cd8 | ||
|
|
ed7f43bab3 | ||
|
|
f695e7cc63 | ||
|
|
5757302a6e | ||
|
|
8ccf2799e1 | ||
|
|
c9116c2d18 | ||
|
|
88e0a449c7 | ||
|
|
65754d27cc | ||
|
|
3e10d03b62 | ||
|
|
1be2f82456 | ||
|
|
86f13e1d6f | ||
|
|
40a50ad78b | ||
|
|
5220e7c188 | ||
|
|
d45d90c8a1 | ||
|
|
f5a29b45df | ||
|
|
fb4fb57751 | ||
|
|
300960fd9b | ||
|
|
2e56012408 | ||
|
|
4f17fc36bc | ||
|
|
6be0961d17 | ||
|
|
2bcb332ec7 | ||
|
|
469586e94a | ||
|
|
a9b1a128cd | ||
|
|
dec579a966 | ||
|
|
ce4270babd | ||
|
|
d83a468fa9 | ||
|
|
9b385e72c6 | ||
|
|
4fee745a7f | ||
|
|
8b5fa9e798 | ||
|
|
4608c0bd04 | ||
|
|
c0b3297bd7 | ||
|
|
1baed182c3 | ||
|
|
270a5d921c | ||
|
|
a1ef937619 | ||
|
|
481e2c6cc8 | ||
|
|
0bf85de2a2 | ||
|
|
1667ba33eb | ||
|
|
b534bd974b | ||
|
|
d89346c89c | ||
|
|
229f69313b | ||
|
|
a37f6f3754 | ||
|
|
88e2a23e1b | ||
|
|
6b033d7451 | ||
|
|
d1c347285f | ||
|
|
6508043bc0 | ||
|
|
163eaebf66 | ||
|
|
5e87c3f6a7 | ||
|
|
feb493e397 | ||
|
|
f6c66e21a7 | ||
|
|
02d2fa9975 | ||
|
|
eb3a394013 | ||
|
|
b517b0a974 | ||
|
|
d56fd89557 | ||
|
|
9d2a1e4d47 | ||
|
|
5f3c41e669 | ||
|
|
d4da73e8f4 | ||
|
|
0d0fd5ac80 | ||
|
|
3fb3ba0e0e | ||
|
|
e49b4ee6e8 | ||
|
|
5595aee407 | ||
|
|
c38adba49d | ||
|
|
30e4515287 | ||
|
|
e42f23cd7c | ||
|
|
5fee49967a | ||
|
|
98b91ce19d | ||
|
|
5aa841c225 | ||
|
|
aaf18b4d9a | ||
|
|
2e0cd4f97d | ||
|
|
e132755061 | ||
|
|
5617a960ec | ||
|
|
873f1a365b | ||
|
|
cc7d18cc59 | ||
|
|
f27729d2ab | ||
|
|
d3a2edcc5f | ||
|
|
cc5eff1157 | ||
|
|
66bf3adf17 | ||
|
|
36f27e3d40 | ||
|
|
a7104b729c | ||
|
|
2ef632ad32 | ||
|
|
43927ca078 | ||
|
|
1f767338f2 | ||
|
|
6d97018de6 | ||
|
|
6f2e7d682b | ||
|
|
07b36e5e56 | ||
|
|
16bc380b65 | ||
|
|
d378674d30 | ||
|
|
5959a97439 | ||
|
|
3def13e1d9 | ||
|
|
e2c6495340 | ||
|
|
ef6defd75c | ||
|
|
076a494523 | ||
|
|
031c9b9c73 | ||
|
|
321699e427 | ||
|
|
98b82fc3ba | ||
|
|
394210d41f | ||
|
|
9afc1dbec2 | ||
|
|
7e684b87e3 | ||
|
|
6b9aed612c | ||
|
|
2647081312 | ||
|
|
e6827ba2c5 | ||
|
|
c6b188f915 | ||
|
|
3f79a43dc4 | ||
|
|
53e57b25a6 | ||
|
|
b87fcf6c08 | ||
|
|
35066c0f5d | ||
|
|
912fc35693 | ||
|
|
2711ad5522 | ||
|
|
79c3077162 | ||
|
|
24ca8da4c3 | ||
|
|
6b626e8f5f | ||
|
|
4d17a09537 | ||
|
|
065fc2f1ad | ||
|
|
c71afe802e | ||
|
|
3284f592b9 | ||
|
|
5d92442488 | ||
|
|
fb9a592e9e | ||
|
|
d2a378ffda | ||
|
|
463944ae2d | ||
|
|
34fe2f429a | ||
|
|
f65e198986 | ||
|
|
9e92f2dbc6 | ||
|
|
e45c07c40b | ||
|
|
fbae59b386 | ||
|
|
e3f3ae74a4 | ||
|
|
fda61ca10f | ||
|
|
29efd505ed | ||
|
|
600d95199c | ||
|
|
1ad80825ca | ||
|
|
a2b322d45c | ||
|
|
bb9aa9233b | ||
|
|
591b854e2b | ||
|
|
15eb2130b5 | ||
|
|
ea8927394f | ||
|
|
cfd89f5afc | ||
|
|
3a6946466f | ||
|
|
89a59b1eba | ||
|
|
8047631014 | ||
|
|
9458a29a6b | ||
|
|
ab2405edad | ||
|
|
d1592f8739 | ||
|
|
6650ecd5b8 | ||
|
|
b27f6bec3c | ||
|
|
99f742fa8c | ||
|
|
558070bb60 | ||
|
|
1e0dd763ca | ||
|
|
a783b9c8ca | ||
|
|
9abbe2983b | ||
|
|
0556e4947a | ||
|
|
859b1e5467 | ||
|
|
0f4e491076 | ||
|
|
b30a91d64f | ||
|
|
d1f794c933 | ||
|
|
a016f069a5 | ||
|
|
fb16ec4677 | ||
|
|
1a51d38c0f | ||
|
|
554163a911 | ||
|
|
efd8dcd60a | ||
|
|
1c77bd31b5 | ||
|
|
35e013fe1d | ||
|
|
8ac9927cfa | ||
|
|
9c305a1dae | ||
|
|
aa738629f7 | ||
|
|
c1a26f4f4b | ||
|
|
63f41ceaec | ||
|
|
b82888527f | ||
|
|
a3c71de190 | ||
|
|
f3a99f04ce | ||
|
|
f631a20269 | ||
|
|
dbd35721ee | ||
|
|
8759070636 | ||
|
|
6259b8d091 | ||
|
|
7086c3707c | ||
|
|
8b28172616 | ||
|
|
abdd37b09e | ||
|
|
e1e855a823 | ||
|
|
585d9686a6 | ||
|
|
e87a6bdaf5 | ||
|
|
5ded5111b4 | ||
|
|
914c61048b | ||
|
|
25fb76d9b7 | ||
|
|
7faa27a3b3 | ||
|
|
5700be0684 | ||
|
|
6d86108060 | ||
|
|
4581c2b3e9 | ||
|
|
142c31ccc1 | ||
|
|
b99b7ba799 | ||
|
|
17b5d2caec | ||
|
|
6add16aa9f | ||
|
|
9aa0192ee6 | ||
|
|
fa25d1ac06 | ||
|
|
8131eee50f | ||
|
|
3ce485a144 | ||
|
|
bb1b413ada | ||
|
|
08078410dc | ||
|
|
3edcc0bdfb | ||
|
|
25081f84c1 | ||
|
|
668e3c982c | ||
|
|
98cf7e03c1 | ||
|
|
5b5c1c6fce | ||
|
|
4383916090 | ||
|
|
7c2bbf9595 | ||
|
|
48ca35b9ff | ||
|
|
68be3c3483 | ||
|
|
78326b4258 | ||
|
|
94b10b6f51 | ||
|
|
8ac9815e83 | ||
|
|
b3184d36a9 | ||
|
|
e58265075a | ||
|
|
453b2d8963 | ||
|
|
bc816851c9 | ||
|
|
b0a68e3445 | ||
|
|
8a1d0b0cf8 | ||
|
|
26f55251e2 | ||
|
|
0f9b308d53 | ||
|
|
847c9a1dc4 | ||
|
|
b488ffc700 | ||
|
|
3ec2481750 | ||
|
|
2d26c854d9 | ||
|
|
a4348ddca7 | ||
|
|
6bfdea6d3e | ||
|
|
cfd3db5803 | ||
|
|
f20a9de3df | ||
|
|
978e8d38b5 | ||
|
|
e7d2b528e5 | ||
|
|
899a8215e5 | ||
|
|
b06e9e35b7 | ||
|
|
6c7f00b031 | ||
|
|
337af82ae2 | ||
|
|
77ef2ebc40 | ||
|
|
92c97b25c3 | ||
|
|
52231254a5 | ||
|
|
494ac51ae5 | ||
|
|
0febb4a3c2 | ||
|
|
62f0faa5c5 | ||
|
|
1055bc41bf | ||
|
|
e100fa7a36 | ||
|
|
83bd387f98 | ||
|
|
caf0059ef5 | ||
|
|
965831ba57 | ||
|
|
a49cab5efc | ||
|
|
17bcea15e8 | ||
|
|
79fb29740d | ||
|
|
2984fe2ef5 | ||
|
|
8734dbd26c | ||
|
|
0211edf008 | ||
|
|
552552b93d | ||
|
|
2229bfb3ed | ||
|
|
25e7962100 | ||
|
|
6071f77218 | ||
|
|
52b9333d7c | ||
|
|
d3d8d76a71 | ||
|
|
f5f97fcd56 | ||
|
|
6665c2952d | ||
|
|
31444320cb | ||
|
|
d5734ff9b2 | ||
|
|
4481637c21 | ||
|
|
6caf247f5b | ||
|
|
65641955ba | ||
|
|
f2c13949a4 | ||
|
|
878ca570fb | ||
|
|
28fd5512bb | ||
|
|
7e465e3729 | ||
|
|
22283604f8 | ||
|
|
0c603afc0e | ||
|
|
a4a989c556 | ||
|
|
d94db666d7 | ||
|
|
438be760f7 | ||
|
|
2949ecc173 | ||
|
|
639ca738f6 | ||
|
|
736dd648f4 | ||
|
|
acdbd4a618 | ||
|
|
ad35d39850 | ||
|
|
e7afe166a4 | ||
|
|
37b076706e | ||
|
|
3303116658 | ||
|
|
89a8cb0469 | ||
|
|
bb9f4c31a6 | ||
|
|
996d1246cf | ||
|
|
0bb08fcb20 | ||
|
|
d004019761 | ||
|
|
a54ca228e9 | ||
|
|
bb6ff474a8 | ||
|
|
86b5c13543 | ||
|
|
c2525b0348 | ||
|
|
9625e4a8ac | ||
|
|
82177da695 | ||
|
|
b3f7a60be8 | ||
|
|
643610c267 | ||
|
|
bd7d70a050 | ||
|
|
d1f41012a1 | ||
|
|
0fbe9dbc9b | ||
|
|
e0b2d15c53 | ||
|
|
34c924ae19 | ||
|
|
9217962306 | ||
|
|
56acf56430 | ||
|
|
ef9be471ab | ||
|
|
9db2bc068e | ||
|
|
9560ea83f9 | ||
|
|
9c79ba573c | ||
|
|
894e645a47 | ||
|
|
f3dc390bfa | ||
|
|
f0f58f84a0 | ||
|
|
7ded24d2f9 | ||
|
|
cf964e3e4f | ||
|
|
8c5b3b2f5f | ||
|
|
8409adeeba | ||
|
|
153d4d8c45 | ||
|
|
69f9ba7d17 | ||
|
|
e4deb5801e | ||
|
|
1a74c0f0d0 | ||
|
|
72e44da219 | ||
|
|
bef2f29651 | ||
|
|
787dda70ee | ||
|
|
285e9e4949 | ||
|
|
01e3ea206d | ||
|
|
6f3420d11e | ||
|
|
2981bf23b1 | ||
|
|
c5cc018eb5 | ||
|
|
268d48ce3d | ||
|
|
eca631670c | ||
|
|
284560e109 | ||
|
|
234615dfdb | ||
|
|
d31cd04781 | ||
|
|
77481f2901 | ||
|
|
54fec69f88 | ||
|
|
1dc9a02d7d | ||
|
|
f86fdbab22 | ||
|
|
66937db040 | ||
|
|
80520299aa | ||
|
|
2753a6876a | ||
|
|
ade442b18c | ||
|
|
45ba112f73 | ||
|
|
e1fe36699b | ||
|
|
b3f4b188da | ||
|
|
0ce75794e6 | ||
|
|
3afe2059e5 | ||
|
|
66b7b64779 | ||
|
|
d90cd6d2d0 | ||
|
|
1d1f266fb6 | ||
|
|
4945b4d6e3 | ||
|
|
21b5a11aca | ||
|
|
d1976bf3a9 | ||
|
|
ffcdd39ae9 | ||
|
|
b4b5e75d28 | ||
|
|
4c3eb792d6 | ||
|
|
c4ef920bdf | ||
|
|
d81c2055e9 | ||
|
|
4528f3b052 | ||
|
|
5acec641fe | ||
|
|
04d06ff008 | ||
|
|
1974beef2d | ||
|
|
49f0c97635 | ||
|
|
0710724e2d | ||
|
|
a6438d468a | ||
|
|
ce92461efc | ||
|
|
b3c4a334b5 | ||
|
|
6b2190bfff | ||
|
|
5822ef330e | ||
|
|
d78e3fff98 | ||
|
|
85bd85ee69 | ||
|
|
04e8faaccc | ||
|
|
2c062a4e5d | ||
|
|
80c1a945f0 | ||
|
|
1d5ec26b04 | ||
|
|
860b2724f5 | ||
|
|
c38648a654 | ||
|
|
dcd730a4d1 | ||
|
|
0fdaeb977b | ||
|
|
61173d5e40 | ||
|
|
d26f0c66dd | ||
|
|
fe4fcff444 | ||
|
|
01c58faea8 | ||
|
|
dce2f6d108 | ||
|
|
49afad6977 | ||
|
|
b7add5f9e1 | ||
|
|
c07fc81dfe | ||
|
|
3835ceeebb | ||
|
|
6683bed799 | ||
|
|
20aade4bdd | ||
|
|
b6965e0724 | ||
|
|
9d85c6cb81 | ||
|
|
a17fc95415 | ||
|
|
ecb045274a | ||
|
|
e5c4a715d6 | ||
|
|
e27e98a9eb | ||
|
|
9da8bf8bf7 | ||
|
|
50905c7989 | ||
|
|
91a7c17341 | ||
|
|
3c18af50b9 | ||
|
|
66f5d09ace | ||
|
|
fa64299760 | ||
|
|
c36e5fb582 | ||
|
|
5158addc36 | ||
|
|
bf2e37ac9f | ||
|
|
d22d40cdc2 | ||
|
|
df49e04c6c | ||
|
|
f60ca87358 | ||
|
|
cef95f9ebe | ||
|
|
288071035f | ||
|
|
414d1ac72b | ||
|
|
1c7241774f | ||
|
|
7c773ff915 | ||
|
|
46de6c5934 | ||
|
|
955c737bb7 | ||
|
|
74e5fee161 | ||
|
|
c3331e8f09 | ||
|
|
1951a61699 | ||
|
|
5b29ccd9c2 | ||
|
|
d8bd5a8cb6 | ||
|
|
820722b481 | ||
|
|
08c82977f5 | ||
|
|
a2dd42fc80 | ||
|
|
c1d778ef85 | ||
|
|
7abb5dde89 | ||
|
|
0f15f3e3e5 | ||
|
|
3194bb0ee4 | ||
|
|
b1f716f0d5 | ||
|
|
a8f7a13248 | ||
|
|
d200a2929b | ||
|
|
99e69bd6c0 | ||
|
|
4f0c0d7c28 | ||
|
|
968d5a57b6 | ||
|
|
bdefb45095 | ||
|
|
4297d2ef82 | ||
|
|
a49bdb3abc | ||
|
|
a983ecd765 | ||
|
|
5a7d84e624 | ||
|
|
e0f5d9f789 | ||
|
|
7d3bcb810c | ||
|
|
8975aa2e95 | ||
|
|
77f30f105b | ||
|
|
972142f727 | ||
|
|
cfd1ac99b2 | ||
|
|
e09c5e5207 | ||
|
|
3ff59907ff | ||
|
|
ef4ac9777b | ||
|
|
65b1f79d53 | ||
|
|
ecad48acb3 | ||
|
|
f47887f7fe | ||
|
|
061ae22bfe | ||
|
|
53b63b3780 | ||
|
|
378a20a094 | ||
|
|
7edf5f8a3a | ||
|
|
6393701a2f | ||
|
|
71c22d647d | ||
|
|
ef656f72b3 | ||
|
|
dfd9b23cd7 | ||
|
|
f94a075f52 | ||
|
|
cea9713129 | ||
|
|
343687c418 | ||
|
|
d4d2b4a856 | ||
|
|
bed52d456d | ||
|
|
31e6eaf59b | ||
|
|
d770646dc7 | ||
|
|
bc65699068 | ||
|
|
ce3fd2021f | ||
|
|
10f670b4e6 | ||
|
|
c49b7b6db0 | ||
|
|
f768634214 | ||
|
|
07342235b9 | ||
|
|
2793ff1c21 | ||
|
|
121346f939 | ||
|
|
dc8a096732 | ||
|
|
c63512e658 | ||
|
|
e46fe6d3e9 | ||
|
|
6ae50c3193 | ||
|
|
ee2378150c | ||
|
|
259c7e8ae6 | ||
|
|
ae30bfe6c3 | ||
|
|
3756cd6ad8 | ||
|
|
1014250e0b | ||
|
|
951364da51 | ||
|
|
c1604fc08a | ||
|
|
5a235e309e | ||
|
|
af77580b5e | ||
|
|
b06a5059c5 | ||
|
|
edab941c44 | ||
|
|
91fb314bca | ||
|
|
d07affcd46 | ||
|
|
2b3228d041 | ||
|
|
34c5177dfc | ||
|
|
f52ba1c50a | ||
|
|
b50cc67bb3 | ||
|
|
42e2b11a88 | ||
|
|
b6509d3f5c | ||
|
|
29503861fb | ||
|
|
196497e3a0 | ||
|
|
d9fe0a31c3 | ||
|
|
26bf4b9a64 | ||
|
|
a0719b22f0 | ||
|
|
42d56ac557 | ||
|
|
9b9c1de8fd | ||
|
|
e3fdbf9fcc | ||
|
|
abb971be88 | ||
|
|
77fb51da8d | ||
|
|
61c73461ca | ||
|
|
00d88eec0e | ||
|
|
d7dc6102e8 | ||
|
|
04fb8717b9 | ||
|
|
b7cc70bb0b | ||
|
|
bc2277cfdd | ||
|
|
d23d7950ab | ||
|
|
ff02988920 | ||
|
|
07f15f417f | ||
|
|
e7099d78ab | ||
|
|
af13cfa1d0 | ||
|
|
2d22894858 | ||
|
|
5082d2120d | ||
|
|
7995503bd3 | ||
|
|
51a32fb23e | ||
|
|
1b8eb35437 | ||
|
|
51c6a98360 | ||
|
|
0e477ae6ef | ||
|
|
dda73a9138 | ||
|
|
cd7790153f | ||
|
|
134dd2e172 | ||
|
|
245bbbd17b | ||
|
|
c9ad507966 | ||
|
|
39ae2d9a53 | ||
|
|
d08fe73a79 | ||
|
|
8c8c852785 | ||
|
|
c2d5d97ffd | ||
|
|
69b5b7f169 | ||
|
|
26f60aac28 | ||
|
|
f3f48c5ffc | ||
|
|
7690494224 | ||
|
|
d1164f2049 | ||
|
|
97156620ec | ||
|
|
e2c5e0b7cf | ||
|
|
ffdb6533de | ||
|
|
32bb371145 | ||
|
|
21ebf6fc73 | ||
|
|
6950463966 | ||
|
|
dfe09612ff | ||
|
|
e5d2051ee8 | ||
|
|
f785fe0566 | ||
|
|
7cdd486c51 | ||
|
|
d5ebfd5db4 | ||
|
|
a9fc4aa613 | ||
|
|
4c4093f4de | ||
|
|
e6b5bf1937 | ||
|
|
50c02cd8f1 | ||
|
|
7de956b343 | ||
|
|
3697d53bdd | ||
|
|
cd1dcde6d0 | ||
|
|
82efbef979 | ||
|
|
87c2ff610d | ||
|
|
2efb2c99f4 | ||
|
|
08155c25f5 | ||
|
|
8579ce0b78 | ||
|
|
a563857bf3 | ||
|
|
e699fba967 | ||
|
|
3988658875 | ||
|
|
90942e4084 | ||
|
|
de72cfe8cd | ||
|
|
bfbba90c44 | ||
|
|
9a81ddeebd | ||
|
|
d3b7bfaa63 | ||
|
|
f18bca69eb | ||
|
|
6734b2bde1 | ||
|
|
75676a810f | ||
|
|
02878e1d4d | ||
|
|
82458edd7c | ||
|
|
73af0b5dc9 | ||
|
|
eec13674dc | ||
|
|
49dd9f20ee | ||
|
|
7563185bd4 | ||
|
|
c5270e9a47 | ||
|
|
6797f22775 | ||
|
|
e5841d76c6 | ||
|
|
fc4b1638da | ||
|
|
df220534d8 | ||
|
|
fb888f239e | ||
|
|
eac352c28a | ||
|
|
e4fbf7e92e | ||
|
|
852575eb02 | ||
|
|
ab9776fce2 | ||
|
|
41eecf2528 | ||
|
|
b722269584 | ||
|
|
e8d60c7040 | ||
|
|
35b722c7eb | ||
|
|
c5265c9f1c | ||
|
|
bd6a5a3faf | ||
|
|
892ba5d73f | ||
|
|
fae040ced1 | ||
|
|
15e176fc2c | ||
|
|
c7a27d69ff | ||
|
|
b641ce915f | ||
|
|
06986df83a | ||
|
|
6c449bd9ce | ||
|
|
b591a4ab18 | ||
|
|
35553baa05 | ||
|
|
a9aeca9550 | ||
|
|
a72d489707 | ||
|
|
512812d774 | ||
|
|
f18bcff4db | ||
|
|
886d185e6f | ||
|
|
d24890cb97 | ||
|
|
c707848eff | ||
|
|
5ed078222c | ||
|
|
d7e4a0ec2f | ||
|
|
cb42bdec15 | ||
|
|
13a09a8a99 | ||
|
|
33cf407c10 | ||
|
|
23e6180e03 | ||
|
|
4227453299 | ||
|
|
a154fb94f4 | ||
|
|
91eabeada1 | ||
|
|
8ef93de26f | ||
|
|
94659d3fc2 | ||
|
|
192a1aef87 | ||
|
|
9f7884f991 | ||
|
|
36fc9501eb | ||
|
|
06c2210951 | ||
|
|
acd66607d3 | ||
|
|
6c24db9593 | ||
|
|
529ee035ec | ||
|
|
42938f68ba | ||
|
|
0b2aaefac5 | ||
|
|
a3693a7faf | ||
|
|
bdea70c2f1 | ||
|
|
036b9352f3 | ||
|
|
54a387913d | ||
|
|
b2a884e7f1 | ||
|
|
050deb3506 | ||
|
|
bb7a132344 | ||
|
|
2812917228 | ||
|
|
8052b56387 | ||
|
|
fa887bbb24 | ||
|
|
62fe9f01ad | ||
|
|
3024217ca5 | ||
|
|
171783cac7 | ||
|
|
f689c84d04 | ||
|
|
3508acb395 | ||
|
|
d74cce91b6 | ||
|
|
f7636b080a | ||
|
|
821864772a | ||
|
|
2a0395965f | ||
|
|
71330f31e5 | ||
|
|
520bb079e5 | ||
|
|
5e7221062d | ||
|
|
bf63c27d0a | ||
|
|
3ce9018d3c | ||
|
|
b026e1b23c | ||
|
|
1b8be2c605 | ||
|
|
a018df09eb | ||
|
|
9b306458e4 | ||
|
|
ab6bc327e8 | ||
|
|
45c96cd37a | ||
|
|
e47e1d99c1 | ||
|
|
f2be21f955 | ||
|
|
711d253d1a | ||
|
|
2a62dc9b45 | ||
|
|
15f1839d29 | ||
|
|
e0f3171bba | ||
|
|
dc9bff8240 | ||
|
|
cd52f3c704 | ||
|
|
7a9fbaedb1 | ||
|
|
4df916c9f5 | ||
|
|
36387c8f1a | ||
|
|
a9ae83b586 | ||
|
|
64f55c8ba4 | ||
|
|
817ed117a8 | ||
|
|
db98f8482d | ||
|
|
767d75d0c5 | ||
|
|
cd9a5c0122 | ||
|
|
0266aab415 | ||
|
|
8b51ac4159 | ||
|
|
a10d59cbec | ||
|
|
4bf1020431 | ||
|
|
8906d7dbf4 | ||
|
|
ba06c4620f | ||
|
|
2683ec985f | ||
|
|
e09f2b5563 | ||
|
|
8e69b66e82 | ||
|
|
b436b61a8f | ||
|
|
39a68e71c4 | ||
|
|
893b2f3214 | ||
|
|
3a4b0267e7 | ||
|
|
2728d21ffb | ||
|
|
3f28fa5ebe | ||
|
|
807990c4ba | ||
|
|
bf8e8ed6bf | ||
|
|
6a53d3ddc9 | ||
|
|
9c628c49be | ||
|
|
152627298a | ||
|
|
b8cc7f163f | ||
|
|
3f1ea599e3 | ||
|
|
5d2520d8e3 | ||
|
|
d99dd3bbae | ||
|
|
1e0720f57b | ||
|
|
61fc2b24b7 | ||
|
|
21108f5136 | ||
|
|
6dd928097c | ||
|
|
8f2dd982c5 | ||
|
|
904145ebae | ||
|
|
47a61f5eb3 | ||
|
|
f703addeb1 | ||
|
|
a022f0ae1b | ||
|
|
cff83eb692 | ||
|
|
f3197fe076 | ||
|
|
a50363e55f | ||
|
|
7c2943baa1 | ||
|
|
1e115d5ede | ||
|
|
ffbc6b46dc | ||
|
|
d082ca207c | ||
|
|
31573ee803 | ||
|
|
9632664c2c | ||
|
|
da7a70752c | ||
|
|
f8884a64fd | ||
|
|
58ab93a6eb | ||
|
|
94d86927ba | ||
|
|
d31a262f37 | ||
|
|
2e8c69ea6b | ||
|
|
9261b49b56 | ||
|
|
bc80134560 | ||
|
|
6dfa5b1aac | ||
|
|
6f921e1a3d | ||
|
|
feb5868952 | ||
|
|
f48e4ad26c | ||
|
|
33d86cb3c9 | ||
|
|
4753568a39 | ||
|
|
af31bab499 | ||
|
|
3d76bec6c4 | ||
|
|
5dd73789a3 | ||
|
|
85a78dad7e | ||
|
|
13652bc4ed | ||
|
|
0540d221e0 | ||
|
|
243ba0bb3c | ||
|
|
b5177de50d | ||
|
|
695c986b78 | ||
|
|
c6dc928e11 | ||
|
|
066ab8f348 | ||
|
|
7dad54f6e9 | ||
|
|
81fc0742f0 | ||
|
|
f33afef2f0 | ||
|
|
97275a99de | ||
|
|
9e01d7fc0b | ||
|
|
593c586a24 | ||
|
|
4b23d8193b | ||
|
|
4408a04619 | ||
|
|
34457d05da | ||
|
|
d5bf0a44b4 | ||
|
|
cbe5c8e347 | ||
|
|
848177c358 | ||
|
|
80224da067 | ||
|
|
a5b9ddc257 | ||
|
|
2f70cd88e8 | ||
|
|
5969bba169 | ||
|
|
7de56c803c | ||
|
|
5e4220bd09 | ||
|
|
e8a3d3f350 | ||
|
|
458a08dab0 | ||
|
|
c598bbc2a5 | ||
|
|
dc4b66fffe | ||
|
|
9b57853881 | ||
|
|
a4169a42f1 | ||
|
|
0862fcdc8c | ||
|
|
28ddd7de13 | ||
|
|
21d9c56854 | ||
|
|
0f9bf07d30 | ||
|
|
1df63e3206 | ||
|
|
360c497bee | ||
|
|
182e4313b3 | ||
|
|
df3702a09c | ||
|
|
4616112aee | ||
|
|
a6f0d621f8 | ||
|
|
0489ac7d4f | ||
|
|
9969a94309 | ||
|
|
6d106fcc33 | ||
|
|
98d7c04b3f | ||
|
|
23b1608671 | ||
|
|
e008f3cc21 | ||
|
|
9b7e068beb | ||
|
|
624a4e4b82 | ||
|
|
93868d4cd3 | ||
|
|
53b35f9285 | ||
|
|
edc8b29859 | ||
|
|
efadf83b6b | ||
|
|
890906ff10 | ||
|
|
bd40cfe829 | ||
|
|
08254b0fe1 | ||
|
|
1834a4967f | ||
|
|
954ed8d736 | ||
|
|
4823424ae3 | ||
|
|
e07fad442a | ||
|
|
a175125990 | ||
|
|
ca92d468cf | ||
|
|
8d6f5521af | ||
|
|
ceb986b408 | ||
|
|
48607e403e | ||
|
|
57c02a466d | ||
|
|
1004d8a9ea | ||
|
|
f5acf88a17 | ||
|
|
85151f8375 | ||
|
|
304a96e955 | ||
|
|
3c027bafdd | ||
|
|
ac04f0025a | ||
|
|
fd2c5dd042 | ||
|
|
51447f9732 | ||
|
|
6966d0d4ef | ||
|
|
2dc50250fc | ||
|
|
8ad38b544e | ||
|
|
06124e12e7 | ||
|
|
d1c3e7b23e | ||
|
|
f0203f38e8 | ||
|
|
ef816d28d2 | ||
|
|
85512c2261 | ||
|
|
409f69e915 | ||
|
|
58ae6845ff | ||
|
|
5d70003582 | ||
|
|
9a66cb6123 | ||
|
|
efb9e158b5 | ||
|
|
75aaff300a | ||
|
|
12fd17b9ea | ||
|
|
facb38a2aa | ||
|
|
222e0609d9 | ||
|
|
a3c2a92e33 | ||
|
|
1f435277a5 | ||
|
|
295b369a81 | ||
|
|
84ad62989a | ||
|
|
a0563d4daa | ||
|
|
2c16cdcbfe | ||
|
|
e45437e32e | ||
|
|
aadae64105 | ||
|
|
41b2455705 | ||
|
|
d75350c659 | ||
|
|
323c52a24b | ||
|
|
bcc2db8657 | ||
|
|
e42fa83043 | ||
|
|
662d5913ae | ||
|
|
d8d624ba9c | ||
|
|
2e7df0a2fe | ||
|
|
b90087bd63 | ||
|
|
c39a012205 | ||
|
|
675ba9d664 | ||
|
|
a8b20df16c | ||
|
|
097f11a661 | ||
|
|
c359560fd8 | ||
|
|
ea0a5a7c76 | ||
|
|
39019d2680 | ||
|
|
d009581b1b | ||
|
|
8344118c11 | ||
|
|
1b695478e7 | ||
|
|
39d176e31b | ||
|
|
ed84db6b2e | ||
|
|
b33223460e | ||
|
|
822e63a667 | ||
|
|
f9aa52cdae | ||
|
|
615f677b2e | ||
|
|
26f6df7168 | ||
|
|
dc67012590 | ||
|
|
2ae32dae7c | ||
|
|
e8a027c951 | ||
|
|
363deae40d | ||
|
|
1cfa5c2115 | ||
|
|
2354636edd | ||
|
|
81fa60dad8 |
17
.github/stale.yml
vendored
Normal file
17
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 30
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- pinned
|
||||
- security
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: wontfix
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
12
.gitignore
vendored
12
.gitignore
vendored
@@ -2,6 +2,8 @@
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
*.gitignore
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
@@ -14,6 +16,8 @@ $RECYCLE.BIN/
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
*.dll
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
@@ -42,6 +46,7 @@ Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
testExport.xlsx
|
||||
test.xlsx
|
||||
test.ps1
|
||||
testPwd.xlsx
|
||||
test.csv
|
||||
@@ -55,4 +60,9 @@ test.xlsx
|
||||
testCCFMT.ps1
|
||||
testHide.ps1
|
||||
ImportExcel.zip
|
||||
*.xlsx
|
||||
.vscode/settings.json
|
||||
|
||||
~$*
|
||||
# InstallModule.ps1
|
||||
# PublishToGallery.ps1
|
||||
.vscode/*
|
||||
|
||||
37
.vscode/spellright.dict
vendored
Normal file
37
.vscode/spellright.dict
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
databar
|
||||
appveyor
|
||||
SqlDataToExcel
|
||||
xlsm
|
||||
jameseholt
|
||||
params
|
||||
robinmalik
|
||||
scriptblock
|
||||
headsphere
|
||||
xelsirko
|
||||
importexcel
|
||||
Mihalicz
|
||||
idx
|
||||
Möller
|
||||
redoz
|
||||
dir
|
||||
pivotables
|
||||
WorkSheetname
|
||||
Lachance-Guillemette
|
||||
ints
|
||||
pscookiemonster
|
||||
ps
|
||||
pwd
|
||||
Nuget
|
||||
EPPLus
|
||||
intellisense
|
||||
PivtoTableName
|
||||
New-Excelchart
|
||||
paypal
|
||||
dll
|
||||
enums
|
||||
Numberformat
|
||||
ChartDefiniton
|
||||
hashtables
|
||||
Agramont
|
||||
AGramont
|
||||
Jhoneill
|
||||
228
CI/CI.ps1
Normal file
228
CI/CI.ps1
Normal file
@@ -0,0 +1,228 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Handel Continuous Integration Testing in AppVeyor and Azure DevOps Pipelines.
|
||||
#>
|
||||
param
|
||||
(
|
||||
# AppVeyor Only - Update AppVeyor build name.
|
||||
[Switch]$Initialize,
|
||||
# Installs the module and invoke the Pester tests with the current version of PowerShell.
|
||||
[Switch]$Test,
|
||||
# AppVeyor Only - Upload results to AppVeyor "Tests" tab.
|
||||
[Switch]$Finalize,
|
||||
# AppVeyor and Azure - Upload module as AppVeyor Artifact.
|
||||
[Switch]$Artifact,
|
||||
# Azure - Runs PsScriptAnalyzer against one or more folders and pivots the results to form a report.
|
||||
[Switch]$Analyzer,
|
||||
# Installs the module and invokes only the ModuleImport test.
|
||||
# Used for validating that the module imports still when external dependencies are missing, e.g. mono-libgdiplus on macOS.
|
||||
[Switch]$TestImportOnly
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
if ($Initialize) {
|
||||
$Psd1 = (Get-ChildItem -File -Filter *.psd1 -Name -Path (Split-Path $PSScriptRoot)).PSPath
|
||||
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion
|
||||
Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH"
|
||||
}
|
||||
if ($Test -or $TestImportOnly) {
|
||||
function Get-EnvironmentInfo {
|
||||
if ([environment]::OSVersion.Platform -like "win*") {
|
||||
# Get Windows Version
|
||||
try {
|
||||
$WinRelease, $WinVer = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR
|
||||
$WindowsVersion = "$($WinVer -join '.') ($WinRelease)"
|
||||
}
|
||||
catch {
|
||||
$WindowsVersion = [System.Environment]::OSVersion.Version
|
||||
}
|
||||
#TODO FIXME BUG this gets the latest version of the .NET Framework on the machine (ok for powershell.exe), not the version of .NET CORE in use by PWSH.EXE
|
||||
<#
|
||||
$VersionFilePath = (Get-Process -Id $PID | Select-Object -ExpandProperty Modules |
|
||||
Where-Object -Property modulename -eq "clrjit.dll").FileName
|
||||
if (-not $VersionFilePath) {
|
||||
$VersionFilePath = [System.Reflection.Assembly]::LoadWithPartialName("System.Core").location
|
||||
}
|
||||
(Get-ItemProperty -Path $VersionFilePath).VersionInfo |
|
||||
Select-Object -Property @{n="Version"; e={$_.ProductName + " " + $_.FileVersion}}, ProductName, FileVersionRaw, FileName
|
||||
#>
|
||||
|
||||
# Get .Net Version
|
||||
# https://stackoverflow.com/questions/3487265/powershell-script-to-return-versions-of-net-framework-on-a-machine
|
||||
$Lookup = @{
|
||||
378389 = [version]'4.5'
|
||||
378675 = [version]'4.5.1'
|
||||
378758 = [version]'4.5.1'
|
||||
379893 = [version]'4.5.2'
|
||||
393295 = [version]'4.6'
|
||||
393297 = [version]'4.6'
|
||||
394254 = [version]'4.6.1'
|
||||
394271 = [version]'4.6.1'
|
||||
394802 = [version]'4.6.2'
|
||||
394806 = [version]'4.6.2'
|
||||
460798 = [version]'4.7'
|
||||
460805 = [version]'4.7'
|
||||
461308 = [version]'4.7.1'
|
||||
461310 = [version]'4.7.1'
|
||||
461808 = [version]'4.7.2'
|
||||
461814 = [version]'4.7.2'
|
||||
528040 = [version]'4.8'
|
||||
528049 = [version]'4.8'
|
||||
}
|
||||
|
||||
# For One True framework (latest .NET 4x), change the Where-Object match
|
||||
# to PSChildName -eq "Full":
|
||||
$DotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
|
||||
Get-ItemProperty -name Version, Release -EA 0 |
|
||||
Where-Object { $_.PSChildName -eq "Full" } |
|
||||
Select-Object @{name = ".NET Framework"; expression = { $_.PSChildName } },
|
||||
@{name = "Product"; expression = { $Lookup[$_.Release] } },
|
||||
Version, Release
|
||||
|
||||
# Output
|
||||
[PSCustomObject]($PSVersionTable + @{
|
||||
ComputerName = $env:Computername
|
||||
WindowsVersion = $WindowsVersion
|
||||
'.Net Version' = '{0} (Version: {1}, Release: {2})' -f $DotNetVersion.Product, $DotNetVersion.Version, $DotNetVersion.Release
|
||||
#EnvironmentPath = $env:Path
|
||||
})
|
||||
}
|
||||
else {
|
||||
# Output
|
||||
[PSCustomObject]($PSVersionTable + @{
|
||||
ComputerName = $env:Computername
|
||||
#EnvironmentPath = $env:Path
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
'[Info] Testing On:'
|
||||
Get-EnvironmentInfo
|
||||
'[Progress] Installing Module.'
|
||||
. .\CI\Install.ps1
|
||||
'[Progress] Invoking Pester.'
|
||||
$pesterParams = @{
|
||||
OutputFile = ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
|
||||
PassThru = $true
|
||||
}
|
||||
if ($TestImportOnly) {
|
||||
$pesterParams['Tag'] = 'TestImportOnly'
|
||||
}
|
||||
else {
|
||||
$pesterParams['ExcludeTag'] = 'TestImportOnly'
|
||||
}
|
||||
$testResults = Invoke-Pester @pesterParams
|
||||
'Pester invocation complete!'
|
||||
if ($testResults.FailedCount -gt 0) {
|
||||
"Test failures:"
|
||||
$testResults.TestResult | Where-Object {-not $_.Passed} | Format-List
|
||||
Write-Error "$($testResults.FailedCount) Pester tests failed. Build cannot continue!"
|
||||
}
|
||||
}
|
||||
if ($Finalize) {
|
||||
'[Progress] Finalizing.'
|
||||
$Failure = $false
|
||||
$AppVeyorResultsUri = 'https://ci.appveyor.com/api/testresults/nunit/{0}' -f $env:APPVEYOR_JOB_ID
|
||||
foreach ($TestResultsFile in Get-ChildItem -Path 'TestResultsPS*.xml') {
|
||||
$TestResultsFilePath = $TestResultsFile.FullName
|
||||
"[Info] Uploading Files: $AppVeyorResultsUri, $TestResultsFilePath."
|
||||
# Add PowerShell version to test results
|
||||
$PSVersion = $TestResultsFile.Name.Replace('TestResults', '').Replace('.xml', '')
|
||||
[Xml]$Xml = Get-Content -Path $TestResultsFilePath
|
||||
Select-Xml -Xml $Xml -XPath '//test-case' | ForEach-Object { $_.Node.name = "$PSVersion " + $_.Node.name }
|
||||
$Xml.OuterXml | Out-File -FilePath $TestResultsFilePath
|
||||
|
||||
#Invoke-RestMethod -Method Post -Uri $AppVeyorResultsUri -Body $Xml
|
||||
[Net.WebClient]::new().UploadFile($AppVeyorResultsUri, $TestResultsFilePath)
|
||||
|
||||
if ($Xml.'test-results'.failures -ne '0') {
|
||||
$Failure = $true
|
||||
}
|
||||
}
|
||||
if ($Failure) {
|
||||
throw 'Tests failed.'
|
||||
}
|
||||
}
|
||||
if ($Artifact) {
|
||||
# Get Module Info
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $PSScriptRoot)))
|
||||
$ModulePath = (Get-Module -Name $ModuleName -ListAvailable).ModuleBase | Split-Path
|
||||
$VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum
|
||||
"[Progress] Artifact Start for Module: $ModuleName, Version: $VersionLocal."
|
||||
if ($env:APPVEYOR) {
|
||||
$ZipFileName = "{0} {1} {2} {3:yyyy-MM-dd HH-mm-ss}.zip" -f $ModuleName, $VersionLocal, $env:APPVEYOR_REPO_BRANCH, (Get-Date)
|
||||
$ZipFileName = $ZipFileName -replace ("[{0}]" -f [RegEx]::Escape([IO.Path]::GetInvalidFileNameChars() -join ''))
|
||||
$ZipFileFullPath = Join-Path -Path $PSScriptRoot -ChildPath $ZipFileName
|
||||
"[Info] Artifact. $ModuleName, ZipFileName: $ZipFileName."
|
||||
#Compress-Archive -Path $ModulePath -DestinationPath $ZipFileFullPath
|
||||
[System.IO.Compression.ZipFile]::CreateFromDirectory($ModulePath, $ZipFileFullPath, [System.IO.Compression.CompressionLevel]::Optimal, $true)
|
||||
Push-AppveyorArtifact $ZipFileFullPath -DeploymentName $ModuleName
|
||||
}
|
||||
elseif ($env:AGENT_NAME) {
|
||||
#Write-Host "##vso[task.setvariable variable=ModuleName]$ModuleName"
|
||||
Copy-Item -Path $ModulePath -Destination $env:Build_ArtifactStagingDirectory -Recurse
|
||||
}
|
||||
}
|
||||
if ($Analyzer) {
|
||||
if (!(Get-Module -Name PSScriptAnalyzer -ListAvailable)) {
|
||||
'[Progress] Installing PSScriptAnalyzer.'
|
||||
Install-Module -Name PSScriptAnalyzer -Force
|
||||
}
|
||||
|
||||
if ($env:System_PullRequest_TargetBranch) {
|
||||
'[Progress] Get target branch.'
|
||||
$TempGitClone = Join-Path ([IO.Path]::GetTempPath()) (New-Guid)
|
||||
Copy-Item -Path $PWD -Destination $TempGitClone -Recurse
|
||||
(Get-Item (Join-Path $TempGitClone '.git')).Attributes += 'Hidden'
|
||||
"[Progress] git clean."
|
||||
git -C $TempGitClone clean -f
|
||||
"[Progress] git reset."
|
||||
git -C $TempGitClone reset --hard
|
||||
"[Progress] git checkout."
|
||||
git -C $TempGitClone checkout -q $env:System_PullRequest_TargetBranch
|
||||
|
||||
$DirsToProcess = @{ 'Pull Request' = $PWD ; $env:System_PullRequest_TargetBranch = $TempGitClone }
|
||||
}
|
||||
else {
|
||||
$DirsToProcess = @{ 'GitHub' = $PWD }
|
||||
}
|
||||
|
||||
"[Progress] Running Script Analyzer."
|
||||
$AnalyzerResults = $DirsToProcess.GetEnumerator() | ForEach-Object {
|
||||
$DirName = $_.Key
|
||||
Write-Verbose "[Progress] Running Script Analyzer on $DirName."
|
||||
Invoke-ScriptAnalyzer -Path $_.Value -Recurse -ErrorAction SilentlyContinue |
|
||||
Add-Member -MemberType NoteProperty -Name Location -Value $DirName -PassThru
|
||||
}
|
||||
|
||||
if ($AnalyzerResults) {
|
||||
if (!(Get-Module -Name ImportExcel -ListAvailable)) {
|
||||
'[Progress] Installing ImportExcel.'
|
||||
Install-Module -Name ImportExcel -Force
|
||||
}
|
||||
'[Progress] Creating ScriptAnalyzer.xlsx.'
|
||||
$ExcelParams = @{
|
||||
Path = 'ScriptAnalyzer.xlsx'
|
||||
WorksheetName = 'FullResults'
|
||||
Now = $true
|
||||
Activate = $true
|
||||
Show = $false
|
||||
}
|
||||
$PivotParams = @{
|
||||
PivotTableName = 'BreakDown'
|
||||
PivotData = @{RuleName = 'Count' }
|
||||
PivotRows = 'Severity', 'RuleName'
|
||||
PivotColumns = 'Location'
|
||||
PivotTotals = 'Rows'
|
||||
}
|
||||
Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue
|
||||
|
||||
$PivotParams['PivotChartDefinition'] = New-ExcelChartDefinition -ChartType 'BarClustered' -Column (1 + $DirsToProcess.Count) -Title "Script analysis" -LegendBold
|
||||
$ExcelParams['PivotTableDefinition'] = New-PivotTableDefinition @PivotParams
|
||||
|
||||
$AnalyzerResults | Export-Excel @ExcelParams
|
||||
'[Progress] Analyzer finished.'
|
||||
}
|
||||
else {
|
||||
"[Info] Invoke-ScriptAnalyzer didn't return any problems."
|
||||
}
|
||||
}
|
||||
191
CI/Install.ps1
Normal file
191
CI/Install.ps1
Normal file
@@ -0,0 +1,191 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs module from Git clone or directly from GitHub.
|
||||
File must not have BOM for GitHub deploy to work.
|
||||
#>
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||
param(
|
||||
# Path to install the module to, if not provided -Scope used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'ModulePath')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModulePath,
|
||||
|
||||
# Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'Scope')]
|
||||
[ValidateSet('CurrentUser', 'AllUsers')]
|
||||
[string]
|
||||
$Scope = 'CurrentUser',
|
||||
|
||||
# Get module from GitHub instead of local Git clone, for example "https://raw.githubusercontent.com/ili101/Module.Template/master/Install.ps1"
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[Uri]$FromGitHub
|
||||
)
|
||||
# Set Files and Folders patterns to Include/Exclude.
|
||||
$IncludeFiles = @(
|
||||
'EPPlus.dll',
|
||||
'*.psd1',
|
||||
'*.psm1',
|
||||
'*.ps1'
|
||||
'Charting',
|
||||
'en-US',
|
||||
'Examples',
|
||||
'Public',
|
||||
'Private',
|
||||
'images',
|
||||
'InferData',
|
||||
'InternalFunctions',
|
||||
'Pivot',
|
||||
'spikes',
|
||||
'Testimonials',
|
||||
'README.md',
|
||||
'LICENSE.txt'
|
||||
)
|
||||
$ExcludeFiles = @(
|
||||
'Install.ps1',
|
||||
'InstallModule.ps1',
|
||||
'PublishToGallery.PS1'
|
||||
)
|
||||
|
||||
|
||||
function Invoke-MultiLike {
|
||||
[alias("LikeAny")]
|
||||
[CmdletBinding()]
|
||||
param
|
||||
(
|
||||
$InputObject,
|
||||
[Parameter(Mandatory)]
|
||||
[String[]]$Filters,
|
||||
[Switch]$Not
|
||||
)
|
||||
$FiltersRegex = foreach ($Filter In $Filters) {
|
||||
$Filter = [regex]::Escape($Filter)
|
||||
if ($Filter -match "^\\\*") {
|
||||
$Filter = $Filter.Remove(0, 2)
|
||||
}
|
||||
else {
|
||||
$Filter = '^' + $Filter
|
||||
}
|
||||
if ($Filter -match "\\\*$") {
|
||||
$Filter = $Filter.Substring(0, $Filter.Length - 2)
|
||||
}
|
||||
else {
|
||||
$Filter = $Filter + '$'
|
||||
}
|
||||
$Filter
|
||||
}
|
||||
if ($Not) {
|
||||
$InputObject -notmatch ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.')
|
||||
}
|
||||
else {
|
||||
$InputObject -match ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.')
|
||||
}
|
||||
}
|
||||
|
||||
Push-Location "$PSScriptRoot\.."
|
||||
try {
|
||||
Write-Verbose -Message "Module installation started. Installing from $PWD"
|
||||
|
||||
if (!$ModulePath) {
|
||||
if ($Scope -eq 'CurrentUser') {
|
||||
$ModulePathIndex = 0
|
||||
}
|
||||
else {
|
||||
$ModulePathIndex = 1
|
||||
}
|
||||
if ($IsLinux -or $IsMacOS) {
|
||||
$ModulePathSeparator = ':'
|
||||
}
|
||||
else {
|
||||
$ModulePathSeparator = ';'
|
||||
}
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator)[$ModulePathIndex]
|
||||
}
|
||||
Write-Verbose -Message "Installing to $ModulePath"
|
||||
|
||||
# Get $ModuleName, $TargetPath, [$Links]
|
||||
if ($FromGitHub) {
|
||||
# Fix Could not create SSL/TLS secure channel
|
||||
#$SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol
|
||||
#[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
$WebClient = [System.Net.WebClient]::new()
|
||||
$GitUri = $FromGitHub.AbsolutePath.Split('/')[1, 2] -join '/'
|
||||
$GitBranch = $FromGitHub.AbsolutePath.Split('/')[3]
|
||||
$Links = (Invoke-RestMethod -Uri "https://api.github.com/repos/$GitUri/contents" -Body @{ref = $GitBranch }) | Where-Object { (LikeAny $_.name $IncludeFiles) -and (LikeAny $_.name $ExcludeFiles -Not) }
|
||||
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension(($Links | Where-Object { $_.name -like '*.psm1' }).name)
|
||||
$ModuleVersion = (. ([Scriptblock]::Create((Invoke-WebRequest -Uri ($Links | Where-Object { $_.name -eq "$ModuleName.psd1" }).download_url)))).ModuleVersion
|
||||
}
|
||||
else {
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path $PWD))
|
||||
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path (Join-Path $PWD "$ModuleName.psd1") | Out-String)))).ModuleVersion
|
||||
}
|
||||
$TargetPath = Join-Path -Path $ModulePath -ChildPath $ModuleName
|
||||
$TargetPath = Join-Path -Path $TargetPath -ChildPath $ModuleVersion
|
||||
|
||||
# Create Directory
|
||||
if (-not (Test-Path -Path $TargetPath)) {
|
||||
$null = New-Item -Path $TargetPath -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message ('Created module folder: "{0}"' -f $TargetPath)
|
||||
}
|
||||
|
||||
# Copy Files
|
||||
if ($FromGitHub) {
|
||||
foreach ($Link in $Links) {
|
||||
$TargetPathItem = Join-Path -Path $TargetPath -ChildPath $Link.name
|
||||
if ($Link.type -ne 'dir') {
|
||||
$WebClient.DownloadFile($Link.download_url, $TargetPathItem)
|
||||
Write-Verbose -Message ('Installed module file: "{0}"' -f $Link.name)
|
||||
}
|
||||
else {
|
||||
if (-not (Test-Path -Path $TargetPathItem)) {
|
||||
$null = New-Item -Path $TargetPathItem -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathItem
|
||||
}
|
||||
$SubLinks = (Invoke-RestMethod -Uri $Link.git_url -Body @{recursive = '1' }).tree
|
||||
foreach ($SubLink in $SubLinks) {
|
||||
$TargetPathSub = Join-Path -Path $TargetPathItem -ChildPath $SubLink.path
|
||||
if ($SubLink.'type' -EQ 'tree') {
|
||||
if (-not (Test-Path -Path $TargetPathSub)) {
|
||||
$null = New-Item -Path $TargetPathSub -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathSub
|
||||
}
|
||||
}
|
||||
else {
|
||||
$WebClient.DownloadFile(
|
||||
('https://raw.githubusercontent.com/{0}/{1}/{2}/{3}' -f $GitUri, $GitBranch, $Link.name, $SubLink.path),
|
||||
$TargetPathSub
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Get-ChildItem -Path $PWD -Exclude $ExcludeFiles | Where-Object { LikeAny $_.Name $IncludeFiles } | ForEach-Object {
|
||||
if ($_.Attributes -ne 'Directory') {
|
||||
Copy-Item -Path $_ -Destination $TargetPath
|
||||
Write-Verbose -Message ('Installed module file "{0}"' -f $_)
|
||||
}
|
||||
else {
|
||||
Copy-Item -Path $_ -Destination $TargetPath -Recurse -Force
|
||||
Write-Verbose -Message ('Installed module folder "{0}"' -f $_)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Import Module
|
||||
Write-Verbose -Message "$ModuleName module installation successful to $TargetPath"
|
||||
Import-Module -Name $ModuleName -Force
|
||||
Write-Verbose -Message "Module installed"
|
||||
}
|
||||
catch {
|
||||
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
|
||||
}
|
||||
finally {
|
||||
#if ($FromGitHub) {
|
||||
# [Net.ServicePointManager]::SecurityProtocol = $SecurityProtocol
|
||||
#}
|
||||
Write-Verbose -Message 'Module installation end'
|
||||
Pop-Location
|
||||
}
|
||||
30
CI/InstallPowerShell.ps1
Normal file
30
CI/InstallPowerShell.ps1
Normal file
@@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs PowerShell Core on Windows.
|
||||
#>
|
||||
[CmdLetBinding()]
|
||||
Param
|
||||
(
|
||||
# Version to install in the format from the .msi, for example "7.0.0-preview.1"
|
||||
[String]$Version
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
if (-not $Version) {
|
||||
$Version = (Invoke-RestMethod https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/metadata.json).StableReleaseTag
|
||||
}
|
||||
$Version = $Version -replace "^v",""
|
||||
|
||||
'[Progress] Downloading PowerShell Core.'
|
||||
$MsiPath = Join-Path $env:TEMP "PowerShell-$Version-win-x64.msi"
|
||||
[System.Net.WebClient]::new().DownloadFile("https://github.com/PowerShell/PowerShell/releases/download/v$Version/PowerShell-$Version-win-x64.msi", $MsiPath)
|
||||
|
||||
'[Progress] Installing PowerShell Core.'
|
||||
Start-Process 'msiexec.exe' -Wait -ArgumentList "/i $MsiPath /quiet"
|
||||
Remove-Item -Path $MsiPath
|
||||
$PowerShellFolder = $Version[0]
|
||||
if ($Version -like "*preview*") {
|
||||
$PowerShellFolder += '-preview'
|
||||
}
|
||||
$env:Path = "$env:ProgramFiles\PowerShell\$PowerShellFolder;$env:Path"
|
||||
'[Progress] PowerShell Core Installed.'
|
||||
266
CI/PS-CI.ps1
Normal file
266
CI/PS-CI.ps1
Normal file
@@ -0,0 +1,266 @@
|
||||
[cmdletbinding(DefaultParameterSetName = 'Scope')]
|
||||
Param(
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'ModulePath')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModulePath,
|
||||
|
||||
# Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used.
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[ValidateSet('CurrentUser', 'AllUsers')]
|
||||
[string]
|
||||
$Scope = 'CurrentUser',
|
||||
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'PreCheckOnly')]
|
||||
[switch]$PreCheckOnly,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipPreChecks,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipPostChecks,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipPesterTests,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$SkipHelp,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
[switch]$CleanModuleDir
|
||||
)
|
||||
Function Show-Warning {
|
||||
param(
|
||||
[Parameter(Position = 0, ValueFromPipeline = $true)]
|
||||
$message
|
||||
)
|
||||
process {
|
||||
write-output "##vso[task.logissue type=warning]File $message"
|
||||
$message >> $script:warningfile
|
||||
}
|
||||
}
|
||||
|
||||
if ($PSScriptRoot) {
|
||||
$workingdir = Split-Path -Parent $PSScriptRoot
|
||||
Push-Location $workingdir
|
||||
}
|
||||
$psdpath = Get-Item "*.psd1"
|
||||
if (-not $psdpath -or $psdpath.count -gt 1) {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw "Did not find a unique PSD file "
|
||||
}
|
||||
else {
|
||||
try { $null = Test-ModuleManifest -Path $psdpath -ErrorAction stop }
|
||||
catch { throw $_ ; return }
|
||||
$ModuleName = $psdpath.Name -replace '\.psd1$' , ''
|
||||
$Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw))))
|
||||
$approvedVerbs = Get-Verb | Select-Object -ExpandProperty verb
|
||||
$script:warningfile = Join-Path -Path $pwd -ChildPath "warnings.txt"
|
||||
}
|
||||
|
||||
#pre-build checks - manifest found, files in it found, public functions and aliases loaded in it. Public functions correct.
|
||||
if (-not $SkipPreChecks) {
|
||||
|
||||
#Check files in the manifest are present
|
||||
foreach ($file in $Settings.FileList) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Show-Warning "File $file in the manifest file list is not present"
|
||||
}
|
||||
}
|
||||
|
||||
#Check files in public have Approved_verb-noun names and are 1 function using the file name as its name with
|
||||
# its name and any alias names in the manifest; function should have a param block and help should be in an MD file
|
||||
# We will want a regex which captures from "function verb-noun {" to its closing "}"
|
||||
# need to match each { to a } - $reg is based on https://stackoverflow.com/questions/7898310/using-regex-to-balance-match-parenthesis
|
||||
$reg = [Regex]::new(@"
|
||||
function\s*[-\w]+\s*{ # The function name and opening '{'
|
||||
(?:
|
||||
[^{}]+ # Match all non-braces
|
||||
|
|
||||
(?<open> { ) # Match '{', and capture into 'open'
|
||||
|
|
||||
(?<-open> } ) # Match '}', and delete the 'open' capture
|
||||
)*
|
||||
(?(open)(?!)) # Fails if 'open' stack isn't empty
|
||||
} # Functions closing '}'
|
||||
"@, 57) # 57 = compile,multi-line ignore case and white space.
|
||||
foreach ($file in (Get-Item .\Public\*.ps1)) {
|
||||
$name = $file.name -replace (".ps1", "")
|
||||
if ($name -notmatch ("(\w+)-\w+")) { Show-Warning "$name in the public folder is not a verb-noun name" }
|
||||
elseif ($Matches[1] -notin $approvedVerbs) { Show-Warning "$name in the public folder does not start with an approved verb" }
|
||||
if (-not ($Settings.FunctionsToExport -ceq $name)) {
|
||||
Show-Warning ('File {0} in the public folder does not match an exported function in the manifest' -f $file.name)
|
||||
}
|
||||
else {
|
||||
$fileContent = Get-Content $file -Raw
|
||||
$m = $reg.Matches($fileContent)
|
||||
if ($m.Count -eq 0) { Show-Warning ('Could not find {0} function in {1}' -f $name, $file.name); continue }
|
||||
elseif ($m.Count -ge 2) { Show-Warning ('Multiple functions in {0}' -f $item.name) ; Continue }
|
||||
elseif ($m[0] -imatch "^\function\s" -and
|
||||
$m[0] -cnotmatch "^\w+\s+$name") { Show-Warning ('function name does not match file name for {0}' -f $file.name) }
|
||||
#$m[0] runs form the f of function to its final } -find the section up to param, check for aliases & comment-based help
|
||||
$m2 = [regex]::Match($m[0], "^.*?param", 17) # 17 = multi-line, ignnore case
|
||||
if (-not $m2.Success) { Show-Warning "function $name has no param() block" }
|
||||
else {
|
||||
if ($m2.value -match "(?<!#\s*)\[\s*Alias\(\s*.([\w-]+).\s*\)\s*\]") {
|
||||
foreach ($a in ($Matches[1] -split '\s*,\s*')) {
|
||||
$a = $a -replace "'", "" -replace '"', ''
|
||||
if (-not ($Settings.AliasesToExport -eq $a)) {
|
||||
Show-Warning "Function $name has alias $a which is not in the manifest"
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($m2.value -match "\.syopsis|\.Description|\.Example") {
|
||||
Show-Warning "Function $name appears to have comment based help."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#Warn about functions which are exported but not found in public
|
||||
$notFromPublic = $Settings.FunctionsToExport.Where( { -not (Test-Path ".\public\$_.ps1") })
|
||||
If ($notFromPublic) { Show-Warning ('Exported function(s) {0} are not loaded from the Public folder' -f ($notFromPublic -join ', ')) }
|
||||
}
|
||||
|
||||
if ($PreCheckOnly) { return }
|
||||
|
||||
#region build, determine module path if necessary, create target directory if necessary, copy files based on manifest, build help
|
||||
try {
|
||||
if ($ModulePath) {
|
||||
$ModulePath = $ModulePath -replace "\\$|/$", ""
|
||||
}
|
||||
else {
|
||||
if ($IsLinux -or $IsMacOS) { $ModulePathSeparator = ':' }
|
||||
else { $ModulePathSeparator = ';' }
|
||||
if ($Scope -eq 'CurrentUser') { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) }
|
||||
else { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) }
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where( { $_ -like "$dir*" }, "First", 1)
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $ModuleName
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $Settings.ModuleVersion
|
||||
}
|
||||
# Clean-up / Create Directory
|
||||
if (-not (Test-Path -Path $ModulePath)) {
|
||||
$null = New-Item -Path $ModulePath -ItemType Directory -ErrorAction Stop
|
||||
'Created module folder: "{0}"' -f $ModulePath
|
||||
}
|
||||
elseif ($CleanModuleDir) {
|
||||
'{0} exists - cleaning before copy' -f $ModulePath
|
||||
Get-ChildItem -Path $ModulePath | Remove-Item -Force -Recurse
|
||||
}
|
||||
'Copying files to: "{0}"' -f $ModulePath
|
||||
$outputFile = $psdpath | Copy-Item -Destination $ModulePath -PassThru
|
||||
$outputFile.fullname
|
||||
foreach ($file in $Settings.FileList) {
|
||||
if ($file -like '.\*') {
|
||||
$dest = ($file -replace '\.\\', "$ModulePath\")
|
||||
if (-not (Test-Path -PathType Container (Split-Path -Parent $dest))) {
|
||||
$null = New-item -Type Directory -Path (Split-Path -Parent $dest)
|
||||
}
|
||||
}
|
||||
else { $dest = $ModulePath }
|
||||
Copy-Item -Path $file -Destination $dest -Force -Recurse
|
||||
}
|
||||
|
||||
if ((Test-Path -PathType Container "mdHelp") -and -not $SkipHelp) {
|
||||
if (-not (Get-Module -ListAvailable platyPS)) {
|
||||
'Installing Platyps to build help files'
|
||||
Install-Module -Name platyPS -Force -SkipPublisherCheck
|
||||
}
|
||||
$platypsInfo = Import-Module platyPS -PassThru -force
|
||||
Get-ChildItem .\mdHelp -Directory | ForEach-Object {
|
||||
'Building help for language ''{0}'', using {1} V{2}.' -f $_.Name, $platypsInfo.Name, $platypsInfo.Version
|
||||
$Null = New-ExternalHelp -Path $_.FullName -OutputPath (Join-Path $ModulePath $_.Name) -Force
|
||||
}
|
||||
}
|
||||
#Leave module path for things which follow.
|
||||
$env:PSNewBuildModule = $ModulePath
|
||||
}
|
||||
catch {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
|
||||
}
|
||||
finally {
|
||||
if (-not $outputFile -or -not (Test-Path $outputFile)) { throw "Failed to create module" }
|
||||
}
|
||||
#endregion
|
||||
|
||||
if ($env:Build_ArtifactStagingDirectory) {
|
||||
Copy-Item -Path (split-path -Parent $ModulePath) -Destination $env:Build_ArtifactStagingDirectory -Recurse
|
||||
}
|
||||
|
||||
#Check valid command names, help, run script analyzer over the files in the module directory
|
||||
if (-not $SkipPostChecks) {
|
||||
try { $outputFile | Import-Module -Force -ErrorAction stop }
|
||||
catch {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw "New module failed to load"
|
||||
}
|
||||
$commands = Get-Command -Module $ModuleName -CommandType function, Cmdlet
|
||||
$commands.where( { $_.name -notmatch "(\w+)-\w+" -or $Matches[1] -notin $approvedVerbs }) | ForEach-Object {
|
||||
Show-Warning ('{0} does not meet the ApprovedVerb-Noun naming rules' -f $_.name)
|
||||
}
|
||||
$helpless = $commands | Get-Help | Where-Object { $_.Synopsis -match "^\s+$($_.name)\s+\[" } | Select-Object -ExpandProperty name
|
||||
foreach ($command in $helpless ) {
|
||||
Show-Warning ('On-line help is missing for {0}.' -f $command)
|
||||
}
|
||||
if (-not (Get-Module -Name PSScriptAnalyzer -ListAvailable)) {
|
||||
Install-Module -Name PSScriptAnalyzer -Force
|
||||
}
|
||||
$PSSAInfo = Import-module -Name PSScriptAnalyzer -PassThru -force
|
||||
"Running {1} V{2} against '{0}' " -f $ModulePath , $PSSAInfo.name, $PSSAInfo.Version
|
||||
$AnalyzerResults = Invoke-ScriptAnalyzer -Path $ModulePath -Recurse -ErrorAction SilentlyContinue
|
||||
if ($AnalyzerResults) {
|
||||
if (-not (Get-Module -Name ImportExcel -ListAvailable)) {
|
||||
#ironically we use this to build import-excel Shouldn't need this there!
|
||||
'Installing ImportExcel.'
|
||||
Install-Module -Name ImportExcel -Force
|
||||
}
|
||||
$chartDef = New-ExcelChartDefinition -ChartType 'BarClustered' -Column 2 -Title "Script analysis" -LegendBold
|
||||
$ExcelParams = @{
|
||||
Path = (Join-Path $pwd 'ScriptAnalyzer.xlsx')
|
||||
WorksheetName = 'FullResults'
|
||||
TableStyle = 'Medium6'
|
||||
AutoSize = $true
|
||||
Activate = $true
|
||||
PivotTableDefinition = @{BreakDown = @{
|
||||
PivotData = @{RuleName = 'Count' }
|
||||
PivotRows = 'Severity', 'RuleName'
|
||||
PivotTotals = 'Rows'
|
||||
PivotChartDefinition = $chartDef
|
||||
}
|
||||
}
|
||||
}
|
||||
Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue
|
||||
$AnalyzerResults | Export-Excel @ExcelParams
|
||||
if (Test-Path $ExcelParams['Path']) {
|
||||
"Try to uploadfile {0}" -f $ExcelParams['Path']
|
||||
"##vso[task.uploadfile]{0}" -f $ExcelParams['Path']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Test-Path $script:warningfile) {
|
||||
"Try to uploadfile {0}" -f $script:warningfile
|
||||
"##vso[task.uploadfile]{0}" -f $script:warningfile
|
||||
}
|
||||
|
||||
#if there are test files, run pester (unless told not to)
|
||||
if (-not $SkipPesterTests -and (Get-ChildItem -Recurse *.tests.ps1)) {
|
||||
Import-Module -Force $outputFile
|
||||
if (-not (Get-Module -ListAvailable pester | Where-Object -Property version -ge ([version]::new(4, 4, 1)))) {
|
||||
Install-Module Pester -Force -SkipPublisherCheck -MaximumVersion 4.99.99
|
||||
}
|
||||
$pester = Import-Module Pester -PassThru
|
||||
$pester
|
||||
$pesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
if ($pester.Version.Major -lt 5) {Invoke-Pester -OutputFile $pesterOutputPath}
|
||||
else {
|
||||
$pesterArgs = [PesterConfiguration]::Default
|
||||
$pesterArgs.Run.Exit = $true
|
||||
$pesterArgs.Output.Verbosity = "Normal"
|
||||
$pesterArgs.TestResult.Enabled = $true
|
||||
$pesterArgs.TestResult.OutputPath = $pesterOutputPath
|
||||
Invoke-Pester -Configuration $pesterArgs
|
||||
}
|
||||
}
|
||||
elseif ($PSScriptRoot) { Pop-Location }
|
||||
106
CI/Publish.ps1
Normal file
106
CI/Publish.ps1
Normal file
@@ -0,0 +1,106 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Deploy module to PowerShellGallery.
|
||||
#>
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "Success")]
|
||||
[CmdletBinding(DefaultParameterSetName = 'ModuleName')]
|
||||
Param
|
||||
(
|
||||
# The name of the installed module to be deployed, if not provided the name of the .psm1 file in the parent folder is used.
|
||||
[Parameter(ParameterSetName = 'ModuleName')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModuleName,
|
||||
|
||||
# Publish module from path (module folder), if not provided -ModuleName is used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'Path')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$Path,
|
||||
|
||||
# Key for PowerShellGallery deployment, if not provided $env:NugetApiKey is used.
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$NugetApiKey,
|
||||
|
||||
# Skip Version verification for PowerShellGallery deployment, can be used for first release.
|
||||
[Switch]$Force
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
if ($Path) {
|
||||
$Path = Resolve-Path -Path $Path
|
||||
if ($Path.Count -ne 1) {
|
||||
throw ('Invalid Path, $Path.Count: {0}.' -f $Path.Count)
|
||||
}
|
||||
$Psd1Path = (Get-ChildItem -File -Filter *.psd1 -Path $Path -Recurse)[0].FullName
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension($Psd1Path)
|
||||
$VersionLocal = (. ([Scriptblock]::Create((Get-Content -Path $Psd1Path | Out-String)))).ModuleVersion
|
||||
}
|
||||
else {
|
||||
# Get Script Root
|
||||
if ($PSScriptRoot) {
|
||||
$ScriptRoot = $PSScriptRoot
|
||||
}
|
||||
elseif ($psISE.CurrentFile.IsUntitled -eq $false) {
|
||||
$ScriptRoot = Split-Path -Path $psISE.CurrentFile.FullPath
|
||||
}
|
||||
elseif ($null -ne $psEditor.GetEditorContext().CurrentFile.Path -and $psEditor.GetEditorContext().CurrentFile.Path -notlike 'untitled:*') {
|
||||
$ScriptRoot = Split-Path -Path $psEditor.GetEditorContext().CurrentFile.Path
|
||||
}
|
||||
else {
|
||||
$ScriptRoot = '.'
|
||||
}
|
||||
|
||||
# Get Module Info
|
||||
if (!$ModuleName) {
|
||||
$ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $ScriptRoot)))
|
||||
}
|
||||
$VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum
|
||||
}
|
||||
|
||||
"[Progress] Deploy Script Start for Module: $ModuleName, Version: $VersionLocal."
|
||||
|
||||
# Deploy to PowerShell Gallery if run locally OR from AppVeyor & GitHub master
|
||||
if (!$env:APPVEYOR -or $env:APPVEYOR_REPO_BRANCH -eq 'master') {
|
||||
if ($env:APPVEYOR) {
|
||||
$Success = $true
|
||||
$AppVeyorProject = Invoke-RestMethod -Uri "https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG"
|
||||
$AppVeyorProject.build.jobs | ForEach-Object {
|
||||
'[Info] AppVeyor job name: "{0}", Id: {1}, Status: {2}.' -f $_.name, $_.jobId, $_.status
|
||||
if ($_.jobId -ne $env:APPVEYOR_JOB_ID -and $_.status -ne "success") {
|
||||
$Success = $false
|
||||
}
|
||||
}
|
||||
if (!$Success) {
|
||||
'[Info] There are filed jobs skipping PowerShell Gallery deploy.'
|
||||
break
|
||||
}
|
||||
}
|
||||
try {
|
||||
$VersionGallery = (Find-Module -Name $ModuleName -ErrorAction Stop).Version
|
||||
}
|
||||
catch {
|
||||
if ($_.Exception.Message -notlike 'No match was found for the specified search criteria*' -or !$Force) {
|
||||
throw $_
|
||||
}
|
||||
}
|
||||
|
||||
"[Info] PowerShellGallery. $ModuleName, VersionGallery: $VersionGallery, VersionLocal: $VersionLocal."
|
||||
if ($VersionGallery -lt $VersionLocal -or $Force) {
|
||||
if (!$NugetApiKey) {
|
||||
$NugetApiKey = $env:NugetApiKey
|
||||
}
|
||||
"[Info] PowerShellGallery. Deploying $ModuleName version $VersionLocal."
|
||||
if ($Path) {
|
||||
Publish-Module -NuGetApiKey $NugetApiKey -Path $Path
|
||||
}
|
||||
else {
|
||||
Publish-Module -NuGetApiKey $NugetApiKey -Name $ModuleName -RequiredVersion $VersionLocal
|
||||
}
|
||||
}
|
||||
else {
|
||||
'[Info] PowerShellGallery Deploy Skipped (Version Check).'
|
||||
}
|
||||
}
|
||||
else {
|
||||
'[Info] PowerShellGallery Deploy Skipped.'
|
||||
}
|
||||
'[Progress] Deploy Ended.'
|
||||
6
CI/PublishToGallery.ps1
Normal file
6
CI/PublishToGallery.ps1
Normal file
@@ -0,0 +1,6 @@
|
||||
$p = @{
|
||||
Name = "ImportExcel"
|
||||
NuGetApiKey = $NuGetApiKey
|
||||
}
|
||||
|
||||
Publish-Module @p
|
||||
54
CI/Test-SingleFunctions.ps1
Normal file
54
CI/Test-SingleFunctions.ps1
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
function Test-SingleFunction {
|
||||
param (
|
||||
[parameter(ValueFromPipeline=$true)]
|
||||
$path )
|
||||
begin {
|
||||
$psd = Get-Content -Raw "$PSScriptRoot\..\ImportExcel.psd1"
|
||||
$exportedFunctions = (Invoke-Command ([scriptblock]::Create($psd))).functionsToExport
|
||||
$reg = [Regex]::new(@"
|
||||
function\s*[-\w]+\s*{ # The function name and opening '{'
|
||||
(?:
|
||||
[^{}]+ # Match all non-braces
|
||||
|
|
||||
(?<open> { ) # Match '{', and capture into 'open'
|
||||
|
|
||||
(?<-open> } ) # Match '}', and delete the 'open' capture
|
||||
)*
|
||||
(?(open)(?!)) # Fails if 'open' stack isn't empty
|
||||
} # Functions closing '}'
|
||||
"@, 57) # 41 = compile ignore case and white space.
|
||||
$reg2 = [Regex]::new(@"
|
||||
^function\s*[-\w]+\s*{ # The function name and opening '{'
|
||||
(
|
||||
\#.*?[\r\n]+ # single line comment
|
||||
| # or
|
||||
\s*<\#.*?\#> # <#comment block#>
|
||||
| # or
|
||||
\s*\[.*?\] # [attribute tags]
|
||||
)*
|
||||
"@, 57)
|
||||
# 43 = compile, multi-line, ignore case and white space.
|
||||
}
|
||||
process {
|
||||
$item = Get-item $Path
|
||||
$name = $item.Name -replace "\.\w+$",""
|
||||
Write-Verbose $name
|
||||
$file = Get-Content $item -Raw
|
||||
$m = $reg.Matches($file)
|
||||
|
||||
#based on https://stackoverflow.com/questions/7898310/using-regex-to-balance-match-parenthesis
|
||||
if ($m.Count -eq 0) {return "Could not find $name function in $($item.name)"}
|
||||
elseif ($m.Count -ge 2) {return "Multiple functions in $($item.name)"}
|
||||
elseif ($exportedFunctions -cnotcontains $name) {return "$name not exported (or in the wrong case)"}
|
||||
elseif ($m[0] -cnotmatch "^\w+\s+$name") {return "function $name in wrong case"}
|
||||
$m2 = [regex]::Match($m[0],"param",[System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
|
||||
if (-not $m2.Success) {return "No param block in $name"}
|
||||
# elseif ($m[0] -inotmatch "(?s)^function\s*$name\s*{(\s*<\#.*?\#>|\s*\[.*?\])*\s*param")
|
||||
# elseif ($reg2.IsMatch($m[0].Value)) {return "function $name has comment-based help"}
|
||||
elseif ($m[0] -inotmatch "\[CmdletBinding\(" -and
|
||||
$m[0] -inotmatch "\[parameter\(" ) {return "$name has is not an advanced function"}
|
||||
#elseif (-not (& $Name -?).synopsis) {return "$name has no help"}
|
||||
else {Write-Verbose "$name OK"}
|
||||
}
|
||||
}
|
||||
80
CI/build.ps1
Normal file
80
CI/build.ps1
Normal file
@@ -0,0 +1,80 @@
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||
param(
|
||||
# Path to install the module to, if not provided -Scope used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'ModulePath')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$ModulePath,
|
||||
|
||||
# Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used.
|
||||
[Parameter(Mandatory, ParameterSetName = 'Scope')]
|
||||
[ValidateSet('CurrentUser', 'AllUsers')]
|
||||
[string]
|
||||
$Scope = 'CurrentUser',
|
||||
[switch]$Passthru
|
||||
)
|
||||
|
||||
if ($PSScriptRoot) { Push-Location "$PSScriptRoot\.." }
|
||||
|
||||
$psdpath = Get-Item "*.psd1"
|
||||
if (-not $psdpath -or $psdpath.count -gt 1) {
|
||||
throw "Did not find a unique PSD file "
|
||||
}
|
||||
else {
|
||||
$ModuleName = $psdpath.Name -replace '\.psd1$' , ''
|
||||
$Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw))))
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Verbose -Message 'Module installation started'
|
||||
|
||||
if (!$ModulePath) {
|
||||
if ($IsLinux -or $IsMacOS) {$ModulePathSeparator = ':' }
|
||||
else {$ModulePathSeparator = ';' }
|
||||
|
||||
if ($Scope -eq 'CurrentUser') { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) }
|
||||
else { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) }
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where({$_ -like "$dir*"},"First",1)
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $ModuleName
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $Settings.ModuleVersion
|
||||
}
|
||||
|
||||
# Create Directory
|
||||
if (-not (Test-Path -Path $ModulePath)) {
|
||||
$null = New-Item -Path $ModulePath -ItemType Directory -ErrorAction Stop
|
||||
Write-Verbose -Message ('Created module folder: "{0}"' -f $ModulePath)
|
||||
}
|
||||
|
||||
Write-Verbose -Message ('Copying files to "{0}"' -f $ModulePath)
|
||||
$outputFile = $psdpath | Copy-Item -Destination $ModulePath -PassThru
|
||||
Foreach ($file in $Settings.FileList) {
|
||||
if ($file -like '.\*') {
|
||||
$dest = ($file -replace '\.\\',"$ModulePath\")
|
||||
if (-not (Test-Path -PathType Container (Split-Path -Parent $dest))) {
|
||||
$null = New-item -Type Directory -Path (Split-Path -Parent $dest)
|
||||
}
|
||||
}
|
||||
else {$dest = $ModulePath }
|
||||
Copy-Item $file -Destination $dest -Force -Recurse
|
||||
}
|
||||
|
||||
if (Test-Path -PathType Container "mdHelp") {
|
||||
if (-not (Get-Module -ListAvailable platyPS)) {
|
||||
Write-Verbose-Message ('Installing Platyps to build help files')
|
||||
Install-Module -Name platyPS -Force -SkipPublisherCheck
|
||||
}
|
||||
Import-Module platyPS
|
||||
Get-ChildItem .\mdHelp -Directory | ForEach-Object {
|
||||
New-ExternalHelp -Path $_.FullName -OutputPath (Join-Path $ModulePath $_.Name) -Force -Verbose
|
||||
}
|
||||
}
|
||||
$env:PSNewBuildModule = $ModulePath
|
||||
|
||||
if ($Passthru) {$outputFile}
|
||||
}
|
||||
catch {
|
||||
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
|
||||
}
|
||||
finally {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
Write-Verbose -Message 'Module installation end'
|
||||
}
|
||||
75
CI/pipeline.yml
Normal file
75
CI/pipeline.yml
Normal file
@@ -0,0 +1,75 @@
|
||||
# https://aka.ms/yaml
|
||||
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- '*'
|
||||
# - master
|
||||
# - releases/*
|
||||
paths:
|
||||
exclude:
|
||||
- README.md
|
||||
- CHANGELOG.md
|
||||
|
||||
jobs:
|
||||
- job: 'Windows_PowerShell_all_options'
|
||||
pool:
|
||||
vmImage: 'windows-latest'
|
||||
steps:
|
||||
- powershell: 'Install-Module -Name Pester -Force -SkipPublisherCheck'
|
||||
displayName: 'Update Pester'
|
||||
- powershell: './CI/PS-CI.ps1 '
|
||||
displayName: 'Check Build Check Pack Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
targetPath: '$(Build.ArtifactStagingDirectory)/ImportExcel'
|
||||
artifact: 'ImportExcel'
|
||||
|
||||
- job: 'PowerShell_Core_on_Windows_Build_and_Pester_only'
|
||||
pool:
|
||||
vmImage: 'windows-latest'
|
||||
steps:
|
||||
- pwsh: 'Install-Module -Name Pester -Force'
|
||||
displayName: 'Update Pester'
|
||||
- pwsh: '.\CI\PS-CI.ps1 -SkipPreChecks -SkipHelp -SkipPostChecks'
|
||||
displayName: 'Install and Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
|
||||
- job: 'Ubuntu_Build_and_Pester_Only'
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
steps:
|
||||
- powershell: 'Install-Module -Name Pester -Force'
|
||||
displayName: 'Update Pester'
|
||||
- powershell: './CI/PS-CI.ps1 -SkipPreChecks -SkipHelp -SkipPostChecks '
|
||||
displayName: 'Install and Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
|
||||
- job: 'macOS_Build_and_Pester_Only'
|
||||
pool:
|
||||
vmImage: 'macOS-latest'
|
||||
steps:
|
||||
- script: brew install mono-libgdiplus
|
||||
displayName: 'Install mono-libgdiplus'
|
||||
- powershell: 'Install-Module -Name Pester -Force'
|
||||
displayName: 'Update Pester'
|
||||
- powershell: './CI/PS-CI.ps1 -SkipPreChecks -SkipHelp -SkipPostChecks'
|
||||
displayName: 'Install and Test'
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFormat: 'NUnit'
|
||||
testResultsFiles: '**/TestResults*.xml'
|
||||
failTaskOnFailedTests: true
|
||||
@@ -9,7 +9,7 @@ function DoChart {
|
||||
)
|
||||
|
||||
if($targetData[0] -is [System.ValueType]) {
|
||||
$chart = New-ExcelChart -YRange "A1:A$($targetData.count)" -Title $title -ChartType $ChartType
|
||||
$chart = New-ExcelChartDefinition -YRange "A1:A$($targetData.count)" -Title $title -ChartType $ChartType
|
||||
} else {
|
||||
$xyRange = Get-XYRange $targetData
|
||||
|
||||
@@ -19,7 +19,7 @@ function DoChart {
|
||||
$Y = $xyRange.YRange.ExcelColumn
|
||||
$YRange = "{0}2:{0}{1}" -f $Y,($targetData.count+1)
|
||||
|
||||
$chart = New-ExcelChart -XRange $xRange -YRange $yRange -Title $title -ChartType $ChartType `
|
||||
$chart = New-ExcelChartDefinition -XRange $xRange -YRange $yRange -Title $title -ChartType $ChartType `
|
||||
-NoLegend:$NoLegend -ShowCategory:$ShowCategory -ShowPercent:$ShowPercent
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
function Copy-ExcelWorkSheet {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
$SourceWorkbook,
|
||||
[Parameter(Mandatory=$true)]
|
||||
$SourceWorkSheet,
|
||||
[Parameter(Mandatory=$true)]
|
||||
$DestinationWorkbook,
|
||||
$DestinationWorkSheet,
|
||||
[Switch]$Show
|
||||
)
|
||||
|
||||
Write-Verbose "Copying $($SourceWorkSheet) from $($SourceWorkbook) to $($DestinationWorkSheet) in $($DestinationWorkbook)"
|
||||
|
||||
if(!$DestinationWorkSheet) {
|
||||
$DestinationWorkSheet = $SourceWorkSheet
|
||||
}
|
||||
|
||||
Import-Excel -Path $SourceWorkbook -WorkSheetname $SourceWorkSheet |
|
||||
Export-Excel -Path $DestinationWorkbook -WorkSheetname $DestinationWorkSheet -Show:$Show
|
||||
}
|
||||
BIN
EPPlus.dll
BIN
EPPlus.dll
Binary file not shown.
119
Examples/AddImage/Add-ExcelImage.ps1
Normal file
119
Examples/AddImage/Add-ExcelImage.ps1
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
39
Examples/AddImage/AddImage.ps1
Normal file
39
Examples/AddImage/AddImage.ps1
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
Examples/AddImage/Octocat.jpg
Normal file
BIN
Examples/AddImage/Octocat.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.1 KiB |
33
Examples/AddImage/README.md
Normal file
33
Examples/AddImage/README.md
Normal 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.
|
||||
15
Examples/AddWorkSheet/AddMultiWorkSheet.ps1
Normal file
15
Examples/AddWorkSheet/AddMultiWorkSheet.ps1
Normal file
@@ -0,0 +1,15 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
#Put some simple data in a worksheet and Get an excel package object to represent the file
|
||||
1..5 | Export-Excel $xlSourcefile -WorksheetName 'Tab1' -AutoSize -AutoFilter
|
||||
|
||||
#Add another tab. Replace the $TabData2 with your data
|
||||
1..10 | Export-Excel $xlSourcefile -WorksheetName 'Tab 2' -AutoSize -AutoFilter
|
||||
|
||||
#Add another tab. Replace the $TabData3 with your data
|
||||
1..15 | Export-Excel $xlSourcefile -WorksheetName 'Tab 3' -AutoSize -AutoFilter -Show
|
||||
13
Examples/AddWorkSheet/AddWorkSheet.ps1
Normal file
13
Examples/AddWorkSheet/AddWorkSheet.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
#Put some simple data in a worksheet and Get an excel package object to represent the file
|
||||
$excel = 1..10 | Export-Excel $xlSourcefile -PassThru
|
||||
#Add a new worksheet named 'NewSheet' and copying the sheet that was just made (Sheet1) to the new sheet
|
||||
Add-Worksheet -ExcelPackage $excel -WorkSheetname "NewSheet" -CopySource $excel.Workbook.Worksheets["Sheet1"]
|
||||
#Save and open in Excel
|
||||
Close-ExcelPackage -ExcelPackage $excel -Show
|
||||
24
Examples/Charts/ChartAndTrendlines.ps1
Normal file
24
Examples/Charts/ChartAndTrendlines.ps1
Normal file
@@ -0,0 +1,24 @@
|
||||
# Creates a worksheet, addes a chart and then a Linear trendline
|
||||
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 @"
|
||||
Region,Item,TotalSold
|
||||
West,screws,60
|
||||
South,lemon,48
|
||||
South,apple,71
|
||||
East,screwdriver,70
|
||||
East,kiwi,32
|
||||
West,screwdriver,1
|
||||
South,melon,21
|
||||
East,apple,79
|
||||
South,apple,68
|
||||
South,avocado,73
|
||||
"@
|
||||
|
||||
$cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine Linear
|
||||
$data | Export-Excel $xlSourcefile -ExcelChartDefinition $cd -AutoNameRange -Show
|
||||
@@ -1,12 +1,17 @@
|
||||
rm temp.xlsx -ErrorAction Ignore
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$data = invoke-sum (ps) company handles,pm,VirtualMemorySize
|
||||
#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 -Title Stats `
|
||||
$data = Invoke-Sum -data (Get-Process) -dimension Company -measure Handles, PM, VirtualMemorySize
|
||||
|
||||
$c = New-ExcelChartDefinition -Title "ProcessStats" `
|
||||
-ChartType LineMarkersStacked `
|
||||
-Header "Stuff" `
|
||||
-XRange "Processes[Company]" `
|
||||
-YRange "Processes[PM]","Processes[VirtualMemorySize]"
|
||||
|
||||
$data |
|
||||
Export-Excel temp.xlsx -AutoSize -TableName Processes -Show -ExcelChartDefinition $c
|
||||
-XRange "Processes[Name]" `
|
||||
-YRange "Processes[PM]","Processes[VirtualMemorySize]" `
|
||||
-SeriesHeader "PM","VM"
|
||||
|
||||
$data |
|
||||
Export-Excel -Path $xlSourcefile -AutoSize -TableName Processes -ExcelChartDefinition $c -Show
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
rm temp.xlsx -ErrorAction Ignore
|
||||
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 = @"
|
||||
A,B,C,Date
|
||||
2,1,1,2016-03-29
|
||||
5,10,1,2016-03-29
|
||||
"@ | ConvertFrom-Csv
|
||||
"@
|
||||
|
||||
$c = New-ExcelChart -Title Impressions `
|
||||
-ChartType Line -Header "Something" `
|
||||
$c = New-ExcelChartDefinition -Title Impressions `
|
||||
-ChartType Line `
|
||||
-XRange "Impressions[Date]" `
|
||||
-YRange @("Impressions[B]","Impressions[A]") `
|
||||
-SeriesHeader 'B data','A data'
|
||||
-SeriesHeader 'B data','A data' `
|
||||
-Row 0 -Column 0
|
||||
|
||||
$data |
|
||||
Export-Excel temp.xlsx -AutoSize -TableName Impressions -Show -ExcelChartDefinition $c
|
||||
$data | ConvertFrom-Csv | Export-Excel -path $xlSourcefile -AutoSize -TableName Impressions
|
||||
Export-Excel -path $xlSourcefile -worksheetName chartPage -ExcelChartDefinition $c -show
|
||||
|
||||
@@ -1,19 +1,22 @@
|
||||
rm *.xlsx
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = @"
|
||||
ID,Product,Quantity,Price,Total
|
||||
12001,Nails,37,3.99,147.63
|
||||
12002,Hammer,5,12.10,60.5
|
||||
12003,Saw,12,15.37,184.44
|
||||
12010,Drill,20,8,160
|
||||
12010,Drill,20,8,160
|
||||
12011,Crowbar,7,23.48,164.36
|
||||
"@ | ConvertFrom-Csv
|
||||
"@
|
||||
|
||||
$xRange = "Product"
|
||||
$c1 = New-ExcelChartDefinition -YRange "Price" -XRange "Product" -Title "Item price" -NoLegend -Height 225
|
||||
$c2 = New-ExcelChartDefinition -YRange "Total "-XRange "Product" -Title "Total sales" -NoLegend -Height 225 -Row 9 -Column 15
|
||||
$c3 = New-ExcelChartDefinition -YRange "Quantity"-XRange "Product" -Title "Sales volume" -NoLegend -Height 225 -Row 15
|
||||
|
||||
$yRange="Price"; $c1 = New-ExcelChart -YRange $yRange -XRange $xRange -Title $yRange -Height 225
|
||||
$yRange="Total"; $c2 = New-ExcelChart -YRange $yRange -XRange $xRange -Title $yRange -Row 9 -Column 15 -Height 225
|
||||
$yRange="Quantity"; $c3 = New-ExcelChart -YRange $yRange -XRange $xRange -Title $yRange -Row 15 -Height 225
|
||||
|
||||
$data |
|
||||
Export-Excel -ExcelChartDefinition $c1,$c2,$c3 Tools.xlsx -Show -AutoFilter -AutoNameRange -AutoSize
|
||||
$data | ConvertFrom-Csv |
|
||||
Export-Excel -Path $xlSourcefile -AutoFilter -AutoNameRange -AutoSize -ExcelChartDefinition $c1,$c2,$c3 -Show
|
||||
BIN
Examples/Charts/Multiplecharts.png
Normal file
BIN
Examples/Charts/Multiplecharts.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
31
Examples/Charts/NumberOfVisitors.ps1
Normal file
31
Examples/Charts/NumberOfVisitors.ps1
Normal file
@@ -0,0 +1,31 @@
|
||||
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
|
||||
1,11916
|
||||
2,11665
|
||||
3,13901
|
||||
4,15444
|
||||
5,21592
|
||||
6,15057
|
||||
7,26187
|
||||
8,20662
|
||||
9,28935
|
||||
10,32443
|
||||
"@
|
||||
|
||||
$cd = New-ExcelChartDefinition `
|
||||
-XRange Week `
|
||||
-YRange TotalVisitors `
|
||||
-Title "No. Of Visitors" `
|
||||
-ChartType ColumnClustered `
|
||||
-NoLegend `
|
||||
-ChartTrendLine Linear
|
||||
|
||||
$data | Export-Excel $xlSourcefile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
function plot {
|
||||
param(
|
||||
$f,
|
||||
@@ -7,20 +9,22 @@ function plot {
|
||||
|
||||
$minx=[math]::Round($minx,1)
|
||||
$maxx=[math]::Round($maxx,1)
|
||||
|
||||
$file = 'C:\temp\plot.xlsx'
|
||||
rm $file -ErrorAction Ignore
|
||||
|
||||
$c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35
|
||||
|
||||
#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
|
||||
|
||||
$(for ($i = $minx; $i -lt $maxx-.1; $i+=.1) {
|
||||
[pscustomobject]@{
|
||||
X=$i.ToString("N1")
|
||||
Y=(&$f $i)
|
||||
}
|
||||
}) | Export-Excel $file -Show -AutoNameRange -ExcelChartDefinition $c
|
||||
}) | Export-Excel $xlSourcefile -Show -AutoNameRange -LineChart -NoLegend #-ExcelChartDefinition $c
|
||||
}
|
||||
|
||||
function pi {[math]::pi}
|
||||
|
||||
plot {[math]::Tan($args[0])} (pi) (3*(pi)/2-.01)
|
||||
plot -f {[math]::Tan($args[0])} -minx (pi) -maxx (3*(pi)/2-.01)
|
||||
27
Examples/CommunityContributions/MultipleWorksheets.ps1
Normal file
27
Examples/CommunityContributions/MultipleWorksheets.ps1
Normal file
@@ -0,0 +1,27 @@
|
||||
<#
|
||||
To see this written up with example screenshots, head over to the IT Splat blog
|
||||
URL: http://bit.ly/2SxieeM
|
||||
#>
|
||||
|
||||
## Create an Excel file with multiple worksheets
|
||||
# Get a list of processes on the system
|
||||
$processes = Get-Process | Sort-Object -Property ProcessName | Group-Object -Property ProcessName | Where-Object {$_.Count -gt 2}
|
||||
|
||||
# Export the processes to Excel, each process on its own sheet
|
||||
$processes | ForEach-Object { $_.Group | Export-Excel -Path MultiSheetExample.xlsx -WorksheetName $_.Name -AutoSize -AutoFilter }
|
||||
|
||||
# Show the completed file
|
||||
Invoke-Item .\MultiSheetExample.xlsx
|
||||
|
||||
## Add an additional sheet to the new workbook
|
||||
# Use Open-ExcelPackage to open the workbook
|
||||
$excelPackage = Open-ExcelPackage -Path .\MultiSheetExample.xlsx
|
||||
|
||||
# Create a new worksheet and give it a name, set MoveToStart to make it the first sheet
|
||||
$ws = Add-Worksheet -ExcelPackage $excelPackage -WorksheetName 'All Services' -MoveToStart
|
||||
|
||||
# Get all the running services on the system
|
||||
Get-Service | Export-Excel -ExcelPackage $excelPackage -WorksheetName $ws -AutoSize -AutoFilter
|
||||
|
||||
# Close the package and show the final result
|
||||
Close-ExcelPackage -ExcelPackage $excelPackage -Show
|
||||
@@ -1,9 +1,9 @@
|
||||
echo Last7Days LastMonth LastWeek NextMonth NextWeek ThisMonth ThisWeek Today Tomorrow Yesterday |
|
||||
% {
|
||||
"Last7Days", "LastMonth", "LastWeek", "NextMonth", "NextWeek", "ThisMonth", "ThisWeek", "Today", "Tomorrow", "Yesterday" |
|
||||
Foreach-Object {
|
||||
$text = @"
|
||||
`$f = ".\testExport.xlsx"
|
||||
|
||||
rm `$f -ErrorAction Ignore
|
||||
remove-item `$f -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel `$f -Show -AutoSize -ConditionalText `$(
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
$file = ".\conditionalTextFormatting.xlsx"
|
||||
rm $file -ErrorAction Ignore
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Get-Service |
|
||||
Select Status, Name, DisplayName, ServiceName |
|
||||
Export-Excel $file -Show -AutoSize -AutoFilter -ConditionalText $(
|
||||
New-ConditionalText stop
|
||||
New-ConditionalText runn darkblue cyan
|
||||
New-ConditionalText -ConditionalType EndsWith svc wheat green
|
||||
New-ConditionalText -ConditionalType BeginsWith windows darkgreen wheat
|
||||
#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 $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
|
||||
New-ConditionalText -ConditionalType BeginsWith windows darkgreen wheat #this is 'Begins with "Windows"' the forground is dark green and the background wheat
|
||||
)
|
||||
@@ -1,15 +1,21 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Define a "Contains blanks" rule. No format is specified so it default to dark-red text on light-pink background.
|
||||
$ContainsBlanks = New-ConditionalText -ConditionalType ContainsBlanks
|
||||
|
||||
$data = $(
|
||||
New-PSItem a b c (echo p1 p2 p3)
|
||||
New-PSItem
|
||||
New-PSItem a b c @('p1', 'p2', 'p3')
|
||||
New-PSItem
|
||||
New-PSItem d e f
|
||||
New-PSItem
|
||||
New-PSItem
|
||||
New-PSItem g h i
|
||||
New-PSItem
|
||||
New-PSItem
|
||||
New-PSItem g h i
|
||||
)
|
||||
|
||||
$file ="c:\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
|
||||
|
||||
rm $file -ErrorAction Ignore
|
||||
$data | Export-Excel $file -show -ConditionalText $ContainsBlanks
|
||||
#use the conditional format definition created above
|
||||
$data | Export-Excel $xlSourcefile -show -ConditionalText $ContainsBlanks
|
||||
34
Examples/ConditionalFormatting/Databar.ps1
Normal file
34
Examples/ConditionalFormatting/Databar.ps1
Normal file
@@ -0,0 +1,34 @@
|
||||
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 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 $xlSourcefile -ClearSheet -WorkSheetname "Processes" -PassThru
|
||||
|
||||
$sheet = $excel.Workbook.Worksheets["Processes"]
|
||||
|
||||
#Apply fixed formatting to columns. -NFormat is an alias for numberformat
|
||||
$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 $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
|
||||
|
||||
Set-ExcelRange -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
|
||||
#In Set-ExcelRange "-Address" is an alias for "-Range"
|
||||
Set-ExcelRange -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
|
||||
|
||||
#Create a Red Data-bar for the values in Column D
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Address "D2:D1048576" -DataBarColor Red
|
||||
# Conditional formatting applies to "Addreses" aliases allow either "Range" or "Address" to be used in Set-ExcelRange or Add-Conditional formatting.
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red
|
||||
|
||||
foreach ($c in 5..9) {Set-ExcelRange -Address $sheet.Column($c) -AutoFit }
|
||||
|
||||
#Create a pivot and save the file.
|
||||
Export-Excel -ExcelPackage $excel -WorkSheetname "Processes" -IncludePivotChart -ChartType ColumnClustered -NoLegend -PivotRows company -PivotData @{'Name'='Count'} -Show
|
||||
@@ -1,11 +1,14 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = $(
|
||||
|
||||
New-PSItem North 111 (echo Region Amount )
|
||||
New-PSItem East 111
|
||||
New-PSItem North 111 @( 'Region', 'Amount' )
|
||||
New-PSItem East 111
|
||||
New-PSItem West 122
|
||||
New-PSItem South 200
|
||||
|
||||
@@ -14,13 +17,15 @@ $data = $(
|
||||
New-PSItem SouthWest 136
|
||||
New-PSItem South 127
|
||||
|
||||
New-PSItem NorthByNory 100
|
||||
New-PSItem NothEast 110
|
||||
New-PSItem Westerly 120
|
||||
New-PSItem NorthByNory 100
|
||||
New-PSItem NothEast 110
|
||||
New-PSItem Westerly 120
|
||||
New-PSItem SouthWest 118
|
||||
)
|
||||
)
|
||||
# in this example instead of doing $variable = New-Conditional text <parameters> .... ; Export-excel -ConditionalText $variable <other parameters>
|
||||
# the syntax is used is Export-excel -ConditionalText (New-Conditional text <parameters>) <other parameters>
|
||||
|
||||
|
||||
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)
|
||||
$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType BelowAverage)
|
||||
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType TopPercent)
|
||||
#$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)
|
||||
$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType BelowAverage)
|
||||
#$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType TopPercent)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
function Get-DateOffset {
|
||||
param($days=0)
|
||||
|
||||
|
||||
(Get-Date).AddDays($days).ToShortDateString()
|
||||
}
|
||||
|
||||
@@ -8,7 +10,7 @@ function Get-Number {
|
||||
Get-Random -Minimum 10 -Maximum 100
|
||||
}
|
||||
|
||||
New-PSItem (Get-DateOffset -7) (Get-Number) 'LastWeek,Last7Days,ThisMonth' (echo Date Amount Label)
|
||||
New-PSItem (Get-DateOffset -7) (Get-Number) 'LastWeek,Last7Days,ThisMonth' @('Date', 'Amount', 'Label')
|
||||
New-PSItem (Get-DateOffset) (Get-Number) 'Today,ThisMonth,ThisWeek'
|
||||
New-PSItem (Get-DateOffset -30) (Get-Number) LastMonth
|
||||
New-PSItem (Get-DateOffset -1) (Get-Number) 'Yesterday,ThisMonth,ThisWeek'
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
rm .\testExport.xlsx -ErrorAction Ignore
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ps | where Company | select Company, Name, PM, Handles, *mem* |
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
Export-Excel .\testExport.xlsx -Show -AutoSize -AutoNameRange `
|
||||
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 -Path $xlSourcefile -Show -AutoSize -AutoNameRange `
|
||||
-ConditionalFormat $(
|
||||
New-ConditionalFormattingIconSet -Range "C:C" `
|
||||
-ConditionalFormat ThreeIconSet -IconType Arrows
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Last7Days
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType LastMonth
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType LastWeek
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType NextMonth
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType NextWeek
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType ThisMonth
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType ThisWeek
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Today
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Tomorrow
|
||||
)
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Yesterday
|
||||
)
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
$f = ".\testExport.xlsx"
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
rm $f -ErrorAction Ignore
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = $(
|
||||
|
||||
New-PSItem North 111 (echo Region Amount )
|
||||
New-PSItem East 11
|
||||
New-PSItem West 12
|
||||
New-PSItem South 1000
|
||||
New-PSItem North 111 @('Region', 'Amount' )
|
||||
New-PSItem East 11
|
||||
New-PSItem West 12
|
||||
New-PSItem South 1000
|
||||
|
||||
New-PSItem NorthEast 10
|
||||
New-PSItem SouthEast 14
|
||||
New-PSItem SouthWest 13
|
||||
New-PSItem South 12
|
||||
New-PSItem NorthEast 10
|
||||
New-PSItem SouthEast 14
|
||||
New-PSItem SouthWest 13
|
||||
New-PSItem South 12
|
||||
|
||||
New-PSItem NorthByNory 100
|
||||
New-PSItem NothEast 110
|
||||
New-PSItem Westerly 120
|
||||
New-PSItem SouthWest 11
|
||||
)
|
||||
New-PSItem NorthByNory 100
|
||||
New-PSItem NothEast 110
|
||||
New-PSItem Westerly 120
|
||||
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)
|
||||
28
Examples/ConditionalFormatting/MonthlyTemperatuesDatabar.ps1
Normal file
28
Examples/ConditionalFormatting/MonthlyTemperatuesDatabar.ps1
Normal file
@@ -0,0 +1,28 @@
|
||||
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
|
||||
|
||||
$excel = @"
|
||||
Month,New York City,Austin Texas,Portland Oregon
|
||||
Jan,39,61,46
|
||||
Feb,42,65,51
|
||||
Mar,50,73,56
|
||||
Apr,62,80,61
|
||||
May,72,86,67
|
||||
Jun,80,92,73
|
||||
Jul,85,95,80
|
||||
Aug,84,96,80
|
||||
Sep,76,90,75
|
||||
Oct,65,82,63
|
||||
Nov,54,71,52
|
||||
Dec,44,63,46
|
||||
"@ | ConvertFrom-csv |
|
||||
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
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
@@ -1,18 +1,21 @@
|
||||
ipmo ImportExcel -Force
|
||||
$f = ".\testExport.xlsx"
|
||||
rm $f -ErrorAction Ignore
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
function Get-DateOffset ($days=0) {
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
function Get-DateOffset ($days=0) {
|
||||
(Get-Date).AddDays($days).ToShortDateString()
|
||||
}
|
||||
|
||||
$(
|
||||
New-PSItem (Get-DateOffset -1) (Get-DateOffset 1) (echo Start End)
|
||||
New-PSItem (Get-DateOffset) (Get-DateOffset 7)
|
||||
New-PSItem (Get-DateOffset -10) (Get-DateOffset -1)
|
||||
) |
|
||||
New-PSItem (Get-DateOffset -1) (Get-DateOffset 1) @("Start", "End")
|
||||
New-PSItem (Get-DateOffset) (Get-DateOffset 7)
|
||||
New-PSItem (Get-DateOffset -10) (Get-DateOffset -1)
|
||||
) |
|
||||
|
||||
Export-Excel $f -Show -AutoSize -AutoNameRange -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -AutoNameRange -ConditionalText $(
|
||||
New-ConditionalText -Range Start -ConditionalType Yesterday -ConditionalTextColor Red
|
||||
New-ConditionalText -Range End -ConditionalType Yesterday -BackgroundColor Blue -ConditionalTextColor Red
|
||||
)
|
||||
25
Examples/ConditionalFormatting/SalesReportWithDatabar.ps1
Normal file
25
Examples/ConditionalFormatting/SalesReportWithDatabar.ps1
Normal file
@@ -0,0 +1,25 @@
|
||||
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
|
||||
|
||||
$excel = @"
|
||||
Month,Sales
|
||||
Jan,1277
|
||||
Feb,1003
|
||||
Mar,1105
|
||||
Apr,952
|
||||
May,770
|
||||
Jun,621
|
||||
"@ | ConvertFrom-csv |
|
||||
Export-Excel -Path $xlSourcefile -WorkSheetname Sheet1 -AutoNameRange -PassThru
|
||||
|
||||
$sheet = $excel.Workbook.Worksheets["Sheet1"]
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Range "B1:B7" -DataBarColor LawnGreen
|
||||
|
||||
Set-ExcelRange -Address $sheet.Cells["A8"] -Value "Total"
|
||||
Set-ExcelRange -Address $sheet.Cells["B8"] -Formula "=Sum(Sales)"
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
@@ -1,27 +1,29 @@
|
||||
cls
|
||||
try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return}
|
||||
|
||||
ipmo ..\..\ImportExcel.psd1 -Force
|
||||
$data = $(
|
||||
New-PSItem 100 @('test', 'testx')
|
||||
New-PSItem 200
|
||||
New-PSItem 300
|
||||
New-PSItem 400
|
||||
New-PSItem 500
|
||||
)
|
||||
|
||||
$data = $(
|
||||
New-PSItem 100 (echo test testx)
|
||||
New-PSItem 200
|
||||
New-PSItem 300
|
||||
New-PSItem 400
|
||||
New-PSItem 500
|
||||
)
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile1 = "$env:TEMP\ImportExcelExample1.xlsx"
|
||||
$xlSourcefile2 = "$env:TEMP\ImportExcelExample2.xlsx"
|
||||
|
||||
$file1 = "tryComparison1.xlsx"
|
||||
$file2 = "tryComparison2.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile1"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile2"
|
||||
|
||||
rm $file1 -ErrorAction Ignore
|
||||
rm $file2 -ErrorAction Ignore
|
||||
Remove-Item $xlSourcefile1 -ErrorAction Ignore
|
||||
Remove-Item $xlSourcefile2 -ErrorAction Ignore
|
||||
|
||||
$data | Export-Excel $file1 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThan 300
|
||||
New-ConditionalText -ConditionalType LessThan 300 -BackgroundColor cyan
|
||||
)
|
||||
$data | Export-Excel $xlSourcefile1 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThan 300
|
||||
New-ConditionalText -ConditionalType LessThan 300 -BackgroundColor cyan
|
||||
)
|
||||
|
||||
$data | Export-Excel $file2 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
|
||||
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
|
||||
)
|
||||
$data | Export-Excel $xlSourcefile2 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
|
||||
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
|
||||
)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-csv @"
|
||||
Store,January,February,March,April,May,June
|
||||
store27,99511,64582,45216,48690,64921,54066
|
||||
store82,22275,23708,28223,26699,41388,31648
|
||||
store41,24683,22583,97947,31999,39092,41201
|
||||
store16,16568,48040,68589,20394,63202,26197
|
||||
store21,99353,23470,28398,21788,94101,88608
|
||||
store86,66662,83321,27489,92627,54084,24278
|
||||
store07,92692,53300,29284,39643,33556,53885
|
||||
store58,68875,83705,66635,81025,30207,75570
|
||||
store01,21292,82341,81339,12505,29516,41634
|
||||
store82,74047,93325,25002,40113,76278,45707
|
||||
"@
|
||||
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName RawData -WorksheetName RawData
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName TopData -WorksheetName StoresTop10Sales
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName Databar -WorksheetName StoresSalesDataBar
|
||||
Export-Excel -InputObject $data -Path $xlSourcefile -TableName TwoColorScale -WorksheetName StoresSalesTwoColorScale
|
||||
|
||||
$xl = Open-ExcelPackage -Path $xlSourcefile
|
||||
|
||||
Set-ExcelRange -Worksheet $xl.StoresTop10Sales -Range $xl.StoresTop10Sales.dimension.address -NumberFormat 'Currency' -AutoSize
|
||||
Set-ExcelRange -Worksheet $xl.StoresSalesDataBar -Range $xl.StoresSalesDataBar.dimension.address -NumberFormat 'Currency' -AutoSize
|
||||
Set-ExcelRange -Worksheet $xl.StoresSalesTwoColorScale -Range $xl.StoresSalesDataBar.dimension.address -NumberFormat 'Currency' -AutoSize
|
||||
|
||||
Add-ConditionalFormatting -Worksheet $xl.StoresTop10Sales -Address $xl.StoresTop10Sales.dimension.address -RuleType Top -ForegroundColor white -BackgroundColor green -ConditionValue 10
|
||||
Add-ConditionalFormatting -Worksheet $xl.StoresSalesDataBar -Address $xl.StoresSalesDataBar.dimension.address -DataBarColor Red
|
||||
Add-ConditionalFormatting -Worksheet $xl.StoresSalesTwoColorScale -Address $xl.StoresSalesDataBar.dimension.address -RuleType TwoColorScale
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
14
Examples/ConvertFrom/ConvertFrom.ps1
Normal file
14
Examples/ConvertFrom/ConvertFrom.ps1
Normal file
@@ -0,0 +1,14 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ConvertFrom-ExcelToSQLInsert People .\testSQLGen.xlsx
|
||||
|
||||
ConvertFrom-ExcelData .\testSQLGen.xlsx {
|
||||
param($propertyNames, $record)
|
||||
|
||||
$reportRecord = @()
|
||||
foreach ($pn in $propertyNames) {
|
||||
$reportRecord += "{0}: {1}" -f $pn, $record.$pn
|
||||
}
|
||||
$reportRecord +=""
|
||||
$reportRecord -join "`r`n"
|
||||
}
|
||||
BIN
Examples/ConvertFrom/testSQLGen.xlsx
Normal file
BIN
Examples/ConvertFrom/testSQLGen.xlsx
Normal file
Binary file not shown.
74
Examples/CustomReporting/CustomReport.ps1
Normal file
74
Examples/CustomReporting/CustomReport.ps1
Normal file
@@ -0,0 +1,74 @@
|
||||
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 = @"
|
||||
From,To,RDollars,RPercent,MDollars,MPercent,Revenue,Margin
|
||||
Atlanta,New York,3602000,.0809,955000,.09,245,65
|
||||
New York,Washington,4674000,.105,336000,.03,222,16
|
||||
Chicago,New York,4674000,.0804,1536000,.14,550,43
|
||||
New York,Philadelphia,12180000,.1427,-716000,-.07,321,-25
|
||||
New York,San Francisco,3221000,.0629,1088000,.04,436,21
|
||||
New York,Phoneix,2782000,.0723,467000,.10,674,33
|
||||
"@ | ConvertFrom-Csv
|
||||
|
||||
$data | Export-Excel $xlSourcefile -AutoSize
|
||||
|
||||
$excel = Open-ExcelPackage $xlSourcefile
|
||||
|
||||
$sheet1 = $excel.Workbook.Worksheets["sheet1"]
|
||||
|
||||
$sheet1.View.ShowGridLines = $false
|
||||
$sheet1.View.ShowHeaders = $false
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["C:C"] -NumberFormat "$#,##0" -WrapText -HorizontalAlignment Center
|
||||
Set-ExcelRange -Address $sheet1.Cells["D:D"] -NumberFormat "#.#0%" -WrapText -HorizontalAlignment Center
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["E:E"] -NumberFormat "$#,##0" -WrapText -HorizontalAlignment Center
|
||||
Set-ExcelRange -Address $sheet1.Cells["F:F"] -NumberFormat "#.#0%" -WrapText -HorizontalAlignment Center
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["G:H"] -WrapText -HorizontalAlignment Center
|
||||
|
||||
## Insert Rows/Columns
|
||||
$sheet1.InsertRow(1, 1)
|
||||
|
||||
foreach ($col in @(2, 4, 6, 8, 10, 12, 14)) {
|
||||
$sheet1.InsertColumn($col, 1)
|
||||
$sheet1.Column($col).width = .75
|
||||
}
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["E:E"] -Width 12
|
||||
Set-ExcelRange -Address $sheet1.Cells["I:I"] -Width 12
|
||||
|
||||
$BorderBottom = "Thick"
|
||||
$BorderColor = "Black"
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["A2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["C2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["E2:G2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["I2:K2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
Set-ExcelRange -Address $sheet1.Cells["M2:O2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["A2:C8"] -FontColor Gray
|
||||
|
||||
$HorizontalAlignment = "Center"
|
||||
Set-ExcelRange -Address $sheet1.Cells["F1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Revenue
|
||||
Set-ExcelRange -Address $sheet1.Cells["J1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Margin
|
||||
Set-ExcelRange -Address $sheet1.Cells["N1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Passenger
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["E2"] -Value '($)'
|
||||
Set-ExcelRange -Address $sheet1.Cells["G2"] -Value '%'
|
||||
Set-ExcelRange -Address $sheet1.Cells["I2"] -Value '($)'
|
||||
Set-ExcelRange -Address $sheet1.Cells["K2"] -Value '%'
|
||||
|
||||
Set-ExcelRange -Address $sheet1.Cells["C10"] -HorizontalAlignment Right -Bold -Value "Grand Total Calculation"
|
||||
Set-ExcelRange -Address $sheet1.Cells["E10"] -Formula "=Sum(E3:E8)" -Bold
|
||||
Set-ExcelRange -Address $sheet1.Cells["I10"] -Formula "=Sum(I3:I8)" -Bold
|
||||
Set-ExcelRange -Address $sheet1.Cells["M10"] -Formula "=Sum(M3:M8)" -Bold
|
||||
Set-ExcelRange -Address $sheet1.Cells["O10"] -Formula "=Sum(O3:O8)" -Bold
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
89
Examples/CustomizeExportExcel/Out-Excel.ps1
Normal file
89
Examples/CustomizeExportExcel/Out-Excel.ps1
Normal file
@@ -0,0 +1,89 @@
|
||||
<#
|
||||
This is an example on how to customize Export-Excel to your liking.
|
||||
First select a name for your function, in ths example its "Out-Excel" you can even set the name to "Export-Excel".
|
||||
You can customize the following things:
|
||||
1. To add parameters to the function define them in "param()", here I added "Preset1" and "Preset2".
|
||||
The parameters need to be removed after use (see comments and code below).
|
||||
2. To remove parameters from the function add them to the list under "$_.Name -notmatch", I removed "Now".
|
||||
3. Add your custom code, here I defined what the Presets do:
|
||||
Preset1 configure the TableStyle, name the table depending on WorksheetName and FreezeTopRow.
|
||||
Preset2 will set AutoFilter and add the Title "Daily Report".
|
||||
(see comments and code below).
|
||||
#>
|
||||
function Out-Excel {
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||
param(
|
||||
[switch]
|
||||
${Preset1},
|
||||
[switch]
|
||||
${Preset2}
|
||||
)
|
||||
DynamicParam {
|
||||
$paramDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
|
||||
foreach ($P in (Get-Command -Name Export-Excel).Parameters.values.where( { $_.Name -notmatch 'Verbose|Debug|Action$|Variable$|Buffer$|Now' })) {
|
||||
$paramDictionary.Add($P.Name, [System.Management.Automation.RuntimeDefinedParameter]::new( $P.Name, $P.ParameterType, $P.Attributes ) )
|
||||
}
|
||||
return $paramDictionary
|
||||
}
|
||||
|
||||
begin {
|
||||
try {
|
||||
# Run you custom code here if it need to run before calling Export-Excel.
|
||||
$PSBoundParameters['Now'] = $true
|
||||
if ($Preset1) {
|
||||
$PSBoundParameters['TableStyle'] = 'Medium7'
|
||||
$PSBoundParameters['FreezeTopRow'] = $true
|
||||
if ($PSBoundParameters['WorksheetName'] -and -not $PSBoundParameters['TableName']) {
|
||||
$PSBoundParameters['TableName'] = $PSBoundParameters['WorksheetName'] + '_Table'
|
||||
}
|
||||
}
|
||||
elseif ($Preset2) {
|
||||
$PSBoundParameters['Title'] = 'Daily Report'
|
||||
$PSBoundParameters['AutoFilter'] = $true
|
||||
}
|
||||
# Remove the extra params we added as Export-Excel will not know what to do with them:
|
||||
$null = $PSBoundParameters.Remove('Preset1')
|
||||
$null = $PSBoundParameters.Remove('Preset2')
|
||||
|
||||
# The rest of the code was auto generated.
|
||||
$outBuffer = $null
|
||||
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) {
|
||||
$PSBoundParameters['OutBuffer'] = 1
|
||||
}
|
||||
|
||||
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Export-Excel', [System.Management.Automation.CommandTypes]::Function)
|
||||
# You can add a pipe after @PSBoundParameters to manipulate the output.
|
||||
$scriptCmd = { & $wrappedCmd @PSBoundParameters }
|
||||
|
||||
$steppablePipeline = $scriptCmd.GetSteppablePipeline()
|
||||
$steppablePipeline.Begin($PSCmdlet)
|
||||
}
|
||||
catch {
|
||||
throw
|
||||
}
|
||||
}
|
||||
|
||||
process {
|
||||
try {
|
||||
$steppablePipeline.Process($_)
|
||||
}
|
||||
catch {
|
||||
throw
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
try {
|
||||
$steppablePipeline.End()
|
||||
}
|
||||
catch {
|
||||
throw
|
||||
}
|
||||
}
|
||||
<#
|
||||
|
||||
.ForwardHelpTargetName Export-Excel
|
||||
.ForwardHelpCategory Function
|
||||
|
||||
#>
|
||||
}
|
||||
BIN
Examples/ExcelBuiltIns/DSUM.png
Normal file
BIN
Examples/ExcelBuiltIns/DSUM.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
34
Examples/ExcelBuiltIns/DSUM.ps1
Normal file
34
Examples/ExcelBuiltIns/DSUM.ps1
Normal file
@@ -0,0 +1,34 @@
|
||||
# DSUM
|
||||
# Adds the numbers in a field (column) of records in a list or database that match conditions that you specify.
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Color,Date,Sales
|
||||
Red,1/15/2018,250
|
||||
Blue,1/15/2018,200
|
||||
Red,1/16/2018,175
|
||||
Blue,1/16/2018,325
|
||||
Red,1/17/2018,150
|
||||
Blue,1/17/2018,300
|
||||
"@
|
||||
|
||||
$xl = Export-Excel -InputObject $data -Path $xlSourcefile -AutoSize -AutoFilter -TableName SalesInfo -AutoNameRange -PassThru
|
||||
|
||||
$databaseAddress = $xl.Sheet1.Dimension.Address
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range C:C -NumberFormat '$##0'
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E1 -Value Color
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range F1 -Value Date
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range G1 -Value Sales
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E2 -Value Red
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E4 -Value Sales
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range F4 -Formula ('=DSUM({0},"Sales",E1:G2)' -f $databaseAddress) -NumberFormat '$##0'
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
23
Examples/ExcelBuiltIns/VLOOKUP.ps1
Normal file
23
Examples/ExcelBuiltIns/VLOOKUP.ps1
Normal file
@@ -0,0 +1,23 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Fruit,Amount
|
||||
Apples,50
|
||||
Oranges,20
|
||||
Bananas,60
|
||||
Lemons,40
|
||||
"@
|
||||
|
||||
$xl = Export-Excel -InputObject $data -Path $xlSourcefile -PassThru -AutoSize
|
||||
|
||||
Set-ExcelRange -Worksheet $xl.Sheet1 -Range D2 -BackgroundColor LightBlue -Value Apples
|
||||
|
||||
$rows = $xl.Sheet1.Dimension.Rows
|
||||
Set-ExcelRange -Worksheet $xl.Sheet1 -Range E2 -Formula "=VLookup(D2,A2:B$($rows),2,FALSE)"
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
BIN
Examples/ExcelBuiltIns/VLookUp.png
Normal file
BIN
Examples/ExcelBuiltIns/VLookUp.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
87
Examples/ExcelDataValidation/MutipleValidations.ps1
Normal file
87
Examples/ExcelDataValidation/MutipleValidations.ps1
Normal file
@@ -0,0 +1,87 @@
|
||||
#region Setup
|
||||
<#
|
||||
This examples demos three types of validation:
|
||||
* Creating a list using a PowerShell array
|
||||
* Creating a list data from another Excel Worksheet
|
||||
* Creating a rule for numbers to be between 0 an 10000
|
||||
|
||||
Run the script then try"
|
||||
* Add random data in Column B
|
||||
* Then choose from the drop down list
|
||||
* Add random data in Column C
|
||||
* Then choose from the drop down list
|
||||
* Add .01 in column F
|
||||
#>
|
||||
|
||||
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 -InputObject @"
|
||||
ID,Region,Product,Quantity,Price
|
||||
12001,North,Nails,37,3.99
|
||||
12002,South,Hammer,5,12.10
|
||||
12003,East,Saw,12,15.37
|
||||
12010,West,Drill,20,8
|
||||
12011,North,Crowbar,7,23.48
|
||||
"@
|
||||
|
||||
# Export the raw data
|
||||
$excelPackage = $Data |
|
||||
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') |
|
||||
Export-excel -ExcelPackage $excelPackage -WorksheetName Values -PassThru
|
||||
|
||||
#endregion
|
||||
|
||||
#region Creating a list using a PowerShell array
|
||||
$ValidationParams = @{
|
||||
Worksheet = $excelPackage.sales
|
||||
ShowErrorMessage = $true
|
||||
ErrorStyle = 'stop'
|
||||
ErrorTitle = 'Invalid Data'
|
||||
}
|
||||
|
||||
|
||||
$MoreValidationParams = @{
|
||||
Range = 'B2:B1001'
|
||||
ValidationType = 'List'
|
||||
ValueSet = @('North', 'South', 'East', 'West')
|
||||
ErrorBody = "You must select an item from the list."
|
||||
}
|
||||
|
||||
Add-ExcelDataValidationRule @ValidationParams @MoreValidationParams
|
||||
#endregion
|
||||
|
||||
#region Creating a list data from another Excel Worksheet
|
||||
$MoreValidationParams = @{
|
||||
Range = 'C2:C1001'
|
||||
ValidationType = 'List'
|
||||
Formula = 'values!$a$1:$a$10'
|
||||
ErrorBody = "You must select an item from the list.`r`nYou can add to the list on the values page" #Bucket
|
||||
}
|
||||
|
||||
Add-ExcelDataValidationRule @ValidationParams @MoreValidationParams
|
||||
#endregion
|
||||
|
||||
#region Creating a rule for numbers to be between 0 an 10000
|
||||
$MoreValidationParams = @{
|
||||
Range = 'F2:F1001'
|
||||
ValidationType = 'Integer'
|
||||
Operator = 'between'
|
||||
Value = 0
|
||||
Value2 = 10000
|
||||
ErrorBody = 'Quantity must be a whole number between 0 and 10000'
|
||||
}
|
||||
|
||||
Add-ExcelDataValidationRule @ValidationParams @MoreValidationParams
|
||||
#endregion
|
||||
|
||||
#region Close Package
|
||||
Close-ExcelPackage -ExcelPackage $excelPackage -Show
|
||||
#endregion
|
||||
6
Examples/ExcelToSQLInsert/DemoSQLInsert.ps1
Normal file
6
Examples/ExcelToSQLInsert/DemoSQLInsert.ps1
Normal file
@@ -0,0 +1,6 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ConvertFrom-ExcelToSQLInsert -TableName "Movies" -Path ".\Movies.xlsx" -ConvertEmptyStringsToNull
|
||||
''
|
||||
'# UseMSSQLSyntax'
|
||||
ConvertFrom-ExcelToSQLInsert -UseMSSQLSyntax -TableName "Movies" -Path ".\Movies.xlsx" -ConvertEmptyStringsToNull
|
||||
BIN
Examples/ExcelToSQLInsert/Movies.xlsx
Normal file
BIN
Examples/ExcelToSQLInsert/Movies.xlsx
Normal file
Binary file not shown.
46
Examples/Experimental/Export-MultipleExcelSheets.ps1
Normal file
46
Examples/Experimental/Export-MultipleExcelSheets.ps1
Normal file
@@ -0,0 +1,46 @@
|
||||
function Export-MultipleExcelSheets {
|
||||
<#
|
||||
.Synopsis
|
||||
Takes a hash table of scriptblocks and exports each as a sheet in an Excel file
|
||||
|
||||
.Example
|
||||
$p = Get-Process
|
||||
|
||||
$InfoMap = @{
|
||||
PM = { $p | Select-Object company, pm }
|
||||
Handles = { $p | Select-Object company, handles }
|
||||
Services = { Get-Service }
|
||||
}
|
||||
|
||||
Export-MultipleExcelSheets -Path $xlfile -InfoMap $InfoMap -Show -AutoSize
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
$Path,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[hashtable]$InfoMap,
|
||||
[string]$Password,
|
||||
[Switch]$Show,
|
||||
[Switch]$AutoSize
|
||||
)
|
||||
|
||||
$parameters = @{ } + $PSBoundParameters
|
||||
$parameters.Remove("InfoMap")
|
||||
$parameters.Remove("Show")
|
||||
|
||||
$parameters.Path = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)
|
||||
|
||||
foreach ($entry in $InfoMap.GetEnumerator()) {
|
||||
if ($entry.Value -is [scriptblock]) {
|
||||
Write-Progress -Activity "Exporting" -Status "$($entry.Key)"
|
||||
$parameters.WorkSheetname = $entry.Key
|
||||
|
||||
& $entry.Value | Export-Excel @parameters
|
||||
}
|
||||
else {
|
||||
Write-Warning "$($entry.Key) not exported, needs to be a scriptblock"
|
||||
}
|
||||
}
|
||||
|
||||
if ($Show) { Invoke-Item $Path }
|
||||
}
|
||||
19
Examples/Experimental/tryExportMultipleExcelSheets.ps1
Normal file
19
Examples/Experimental/tryExportMultipleExcelSheets.ps1
Normal file
@@ -0,0 +1,19 @@
|
||||
. "$PSScriptRoot\Export-MultipleExcelSheets.ps1"
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$p = Get-Process
|
||||
|
||||
$InfoMap = @{
|
||||
PM = { $p | Select-Object company, pm }
|
||||
Handles = { $p | Select-Object company, handles }
|
||||
Services = { Get-Service }
|
||||
Files = { Get-ChildItem -File }
|
||||
Albums = { ConvertFrom-Csv (Invoke-RestMethod https://raw.githubusercontent.com/dfinke/powershell-for-developers/master/chapter05/BeaverMusic/BeaverMusic.UI.Shell/albums.csv) }
|
||||
WillNotGetExported = "Hello World"
|
||||
}
|
||||
|
||||
Export-MultipleExcelSheets -Path $xlSourcefile -InfoMap $InfoMap -Show -AutoSize
|
||||
@@ -1,16 +1,20 @@
|
||||
param ($fibonacciDigits=10)
|
||||
|
||||
$file = "fib.xlsx"
|
||||
rm "fib.xlsx" -ErrorAction Ignore
|
||||
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
|
||||
|
||||
$(
|
||||
New-PSItem 0
|
||||
New-PSItem 1
|
||||
|
||||
|
||||
(
|
||||
2..$fibonacciDigits |
|
||||
ForEach {
|
||||
ForEach-Object {
|
||||
New-PSItem ('=a{0}+a{1}' -f ($_+1),$_)
|
||||
}
|
||||
)
|
||||
) | Export-Excel $file -Show
|
||||
) | Export-Excel $xlSourcefile -Show
|
||||
|
||||
@@ -1,12 +1,19 @@
|
||||
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
|
||||
|
||||
Get-Process |
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlfile -Show -AutoSize -CellStyleSB {
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB {
|
||||
param(
|
||||
$workSheet,
|
||||
$totalRows,
|
||||
$lastColumn
|
||||
)
|
||||
|
||||
|
||||
Set-CellStyle $workSheet 1 $LastColumn Solid Cyan
|
||||
|
||||
foreach($row in (2..$totalRows | Where-Object {$_ % 2 -eq 0})) {
|
||||
|
||||
26
Examples/FormatCellStyles/ApplyStyle.ps1
Normal file
26
Examples/FormatCellStyles/ApplyStyle.ps1
Normal file
@@ -0,0 +1,26 @@
|
||||
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
|
||||
Shin Guards,14,10.95,153.3
|
||||
Turf Shoes,22,79.95,1758.9
|
||||
Baseballs,68,7.99,543.32
|
||||
Baseball Gloves,31,65.00,2015.00
|
||||
Baseball Bats,38,159.00,6042.00
|
||||
'@
|
||||
|
||||
$f = "$env:TEMP\styles.xlsx"
|
||||
Remove-Item $f -ErrorAction SilentlyContinue
|
||||
|
||||
$pkg = $data | Export-Excel -Path $f -AutoSize -PassThru
|
||||
|
||||
$ws = $pkg.Workbook.Worksheets["Sheet1"]
|
||||
|
||||
Set-ExcelRange -Worksheet $ws -Range "A2:C6" -BackgroundColor PeachPuff -FontColor Purple -FontSize 12 -Width 12
|
||||
Set-ExcelRange -Worksheet $ws -Range "D2:D6" -BackgroundColor WhiteSmoke -FontColor Orange -Bold -FontSize 12 -Width 12
|
||||
Set-ExcelRange -Worksheet $ws -Range "A1:D1" -BackgroundColor BlueViolet -FontColor Wheat -FontSize 12 -Width 12
|
||||
Set-ExcelRange -Worksheet $ws -Range "A:A" -Width 15
|
||||
|
||||
Close-ExcelPackage -ExcelPackage $pkg -Show
|
||||
@@ -1,15 +1,22 @@
|
||||
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
|
||||
|
||||
$RandomStyle = {
|
||||
param(
|
||||
$workSheet,
|
||||
$totalRows,
|
||||
$lastColumn
|
||||
)
|
||||
)
|
||||
|
||||
2..$totalRows | ForEach-Object{
|
||||
Set-CellStyle $workSheet $_ $LastColumn Solid (Write-Output LightGreen Gray Red|Get-Random)
|
||||
Set-CellStyle $workSheet $_ $LastColumn Solid (Get-Random @("LightGreen", "Gray", "Red"))
|
||||
}
|
||||
}
|
||||
|
||||
Get-Process |
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlfile -Show -AutoSize -CellStyleSB $RandomStyle
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB $RandomStyle
|
||||
|
||||
54
Examples/Freeze/FreezePane.ps1
Normal file
54
Examples/Freeze/FreezePane.ps1
Normal 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
|
||||
38
Examples/GenerateData/GenDataForCustomReport.ps1
Normal file
38
Examples/GenerateData/GenDataForCustomReport.ps1
Normal file
@@ -0,0 +1,38 @@
|
||||
if(!(Get-Command ig -ErrorAction SilentlyContinue)) {
|
||||
|
||||
"Use ``Install-Module NameIT`` to get the needed module from the gallery to support running this script"
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
$sign=@{sign=@( "+", "-" )}
|
||||
$location=@{location=@("Atlanta", "Newark", "Washington", "Chicago", "Philadelphia", "Houston", "Phoneix")}
|
||||
|
||||
$(1..6 | Foreach-Object {
|
||||
|
||||
$from=$to=""
|
||||
while($from -eq $to) {
|
||||
$from=ig "[location]" -CustomData $location
|
||||
$to=ig "[location]" -CustomData $location
|
||||
}
|
||||
|
||||
[double]$a=ig "########"
|
||||
[double]$b=ig ".####"
|
||||
[double]$c=ig "#######"
|
||||
[double]$d=ig "[sign].##" -CustomData $sign
|
||||
[double]$e=ig "###"
|
||||
[double]$f=ig "[sign]##" -CustomData $sign
|
||||
|
||||
#"{0},{1},{2},{3},{4},{5},{6},{7}" -f $from, $to, $a, $b, $c, $d, $e, $f
|
||||
|
||||
[PSCustomObject][Ordered]@{
|
||||
From=$from
|
||||
To=$to
|
||||
RDollars=$a
|
||||
RPercent=$b
|
||||
MDollars=$c
|
||||
MPercent=$d
|
||||
Revenue=$e
|
||||
Margin=$f
|
||||
}
|
||||
} | ConvertTo-Csv -NoTypeInformation) -replace '"','' # | Export-Excel
|
||||
101
Examples/Grouping/First10Races.csv
Normal file
101
Examples/Grouping/First10Races.csv
Normal file
@@ -0,0 +1,101 @@
|
||||
Race,Date,FinishPosition,Driver,GridPosition,Team,Points
|
||||
Australian,25/03/2018,1,Sebastian Vettel,3,Ferrari,25
|
||||
Australian,25/03/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||
Australian,25/03/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||
Australian,25/03/2018,4,Daniel Ricciardo,8,Red Bull Racing-TAG Heuer,12
|
||||
Australian,25/03/2018,5,Fernando Alonso,10,McLaren-Renault,10
|
||||
Australian,25/03/2018,6,Max Verstappen,4,Red Bull Racing-TAG Heuer,8
|
||||
Australian,25/03/2018,7,Nico Hülkenberg,7,Renault,6
|
||||
Australian,25/03/2018,8,Valtteri Bottas,15,Mercedes,4
|
||||
Australian,25/03/2018,9,Stoffel Vandoorne,11,McLaren-Renault,2
|
||||
Australian,25/03/2018,10,Carlos Sainz,9,Renault,1
|
||||
Bahrain,08/04/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||
Bahrain,08/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||
Bahrain,08/04/2018,3,Lewis Hamilton,9,Mercedes,15
|
||||
Bahrain,08/04/2018,4,Pierre Gasly,5,STR-Honda,12
|
||||
Bahrain,08/04/2018,5,Kevin Magnussen,6,Haas-Ferrari,10
|
||||
Bahrain,08/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||
Bahrain,08/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||
Bahrain,08/04/2018,8,Stoffel Vandoorne,14,McLaren-Renault,4
|
||||
Bahrain,08/04/2018,9,Marcus Ericsson,17,Sauber-Ferrari,2
|
||||
Bahrain,08/04/2018,10,Esteban Ocon,8,Force India-Mercedes,1
|
||||
Chinese,15/04/2018,1,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,25
|
||||
Chinese,15/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||
Chinese,15/04/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||
Chinese,15/04/2018,4,Lewis Hamilton,4,Mercedes,12
|
||||
Chinese,15/04/2018,5,Max Verstappen,5,Red Bull Racing-TAG Heuer,10
|
||||
Chinese,15/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||
Chinese,15/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||
Chinese,15/04/2018,8,Sebastian Vettel,1,Ferrari,4
|
||||
Chinese,15/04/2018,9,Carlos Sainz,9,Renault,2
|
||||
Chinese,15/04/2018,10,Kevin Magnussen,11,Haas-Ferrari,1
|
||||
Azerbaijan,29/04/2018,1,Lewis Hamilton,2,Mercedes,25
|
||||
Azerbaijan,29/04/2018,2,Kimi Räikkönen,6,Ferrari,18
|
||||
Azerbaijan,29/04/2018,3,Sergio Pérez,8,Force India-Mercedes,15
|
||||
Azerbaijan,29/04/2018,4,Sebastian Vettel,1,Ferrari,12
|
||||
Azerbaijan,29/04/2018,5,Carlos Sainz,9,Renault,10
|
||||
Azerbaijan,29/04/2018,6,Charles Leclerc,13,Sauber-Ferrari,8
|
||||
Azerbaijan,29/04/2018,7,Fernando Alonso,12,McLaren-Renault,6
|
||||
Azerbaijan,29/04/2018,8,Lance Stroll,10,Williams-Mercedes,4
|
||||
Azerbaijan,29/04/2018,9,Stoffel Vandoorne,16,McLaren-Renault,2
|
||||
Azerbaijan,29/04/2018,10,Brendon Hartley,19,STR-Honda,1
|
||||
Spanish,13/05/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||
Spanish,13/05/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||
Spanish,13/05/2018,3,Max Verstappen,5,Red Bull Racing-TAG Heuer,15
|
||||
Spanish,13/05/2018,4,Sebastian Vettel,3,Ferrari,12
|
||||
Spanish,13/05/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||
Spanish,13/05/2018,6,Kevin Magnussen,7,Haas-Ferrari,8
|
||||
Spanish,13/05/2018,7,Carlos Sainz,9,Renault,6
|
||||
Spanish,13/05/2018,8,Fernando Alonso,8,McLaren-Renault,4
|
||||
Spanish,13/05/2018,9,Sergio Pérez,15,Force India-Mercedes,2
|
||||
Spanish,13/05/2018,10,Charles Leclerc,14,Sauber-Ferrari,1
|
||||
Monaco,27/05/2018,1,Daniel Ricciardo,1,Red Bull Racing-TAG Heuer,25
|
||||
Monaco,27/05/2018,2,Sebastian Vettel,2,Ferrari,18
|
||||
Monaco,27/05/2018,3,Lewis Hamilton,3,Mercedes,15
|
||||
Monaco,27/05/2018,4,Kimi Räikkönen,4,Ferrari,12
|
||||
Monaco,27/05/2018,5,Valtteri Bottas,5,Mercedes,10
|
||||
Monaco,27/05/2018,6,Esteban Ocon,6,Force India-Mercedes,8
|
||||
Monaco,27/05/2018,7,Pierre Gasly,10,STR-Honda,6
|
||||
Monaco,27/05/2018,8,Nico Hülkenberg,11,Renault,4
|
||||
Monaco,27/05/2018,9,Max Verstappen,20,Red Bull Racing-TAG Heuer,2
|
||||
Monaco,27/05/2018,10,Carlos Sainz,8,Renault,1
|
||||
Canadian,10/06/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||
Canadian,10/06/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||
Canadian,10/06/2018,3,Max Verstappen,3,Red Bull Racing-TAG Heuer,15
|
||||
Canadian,10/06/2018,4,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,12
|
||||
Canadian,10/06/2018,5,Lewis Hamilton,4,Mercedes,10
|
||||
Canadian,10/06/2018,6,Kimi Räikkönen,5,Ferrari,8
|
||||
Canadian,10/06/2018,7,Nico Hülkenberg,7,Renault,6
|
||||
Canadian,10/06/2018,8,Carlos Sainz,9,Renault,4
|
||||
Canadian,10/06/2018,9,Esteban Ocon,8,Force India-Mercedes,2
|
||||
Canadian,10/06/2018,10,Charles Leclerc,13,Sauber-Ferrari,1
|
||||
French,24/06/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||
French,24/06/2018,2,Max Verstappen,4,Red Bull Racing-TAG Heuer,18
|
||||
French,24/06/2018,3,Kimi Räikkönen,6,Ferrari,15
|
||||
French,24/06/2018,4,Daniel Ricciardo,5,Red Bull Racing-TAG Heuer,12
|
||||
French,24/06/2018,5,Sebastian Vettel,3,Ferrari,10
|
||||
French,24/06/2018,6,Kevin Magnussen,9,Haas-Ferrari,8
|
||||
French,24/06/2018,7,Valtteri Bottas,2,Mercedes,6
|
||||
French,24/06/2018,8,Carlos Sainz,7,Renault,4
|
||||
French,24/06/2018,9,Nico Hülkenberg,12,Renault,2
|
||||
French,24/06/2018,10,Charles Leclerc,8,Sauber-Ferrari,1
|
||||
Austrian,01/07/2018,1,Max Verstappen,4,Red Bull Racing-TAG Heuer,25
|
||||
Austrian,01/07/2018,2,Kimi Räikkönen,3,Ferrari,18
|
||||
Austrian,01/07/2018,3,Sebastian Vettel,6,Ferrari,15
|
||||
Austrian,01/07/2018,4,Romain Grosjean,5,Haas-Ferrari,12
|
||||
Austrian,01/07/2018,5,Kevin Magnussen,8,Haas-Ferrari,10
|
||||
Austrian,01/07/2018,6,Esteban Ocon,11,Force India-Mercedes,8
|
||||
Austrian,01/07/2018,7,Sergio Pérez,15,Force India-Mercedes,6
|
||||
Austrian,01/07/2018,8,Fernando Alonso,20,McLaren-Renault,4
|
||||
Austrian,01/07/2018,9,Charles Leclerc,17,Sauber-Ferrari,2
|
||||
Austrian,01/07/2018,10,Marcus Ericsson,18,Sauber-Ferrari,1
|
||||
British,08/07/2018,1,Sebastian Vettel,2,Ferrari,25
|
||||
British,08/07/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||
British,08/07/2018,3,Kimi Räikkönen,3,Ferrari,15
|
||||
British,08/07/2018,4,Valtteri Bottas,4,Mercedes,12
|
||||
British,08/07/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||
British,08/07/2018,6,Nico Hülkenberg,11,Renault,8
|
||||
British,08/07/2018,7,Esteban Ocon,10,Force India-Mercedes,6
|
||||
British,08/07/2018,8,Fernando Alonso,13,McLaren-Renault,4
|
||||
British,08/07/2018,9,Kevin Magnussen,7,Haas-Ferrari,2
|
||||
British,08/07/2018,10,Sergio Pérez,12,Force India-Mercedes,1
|
||||
|
13
Examples/Grouping/GroupDate.ps1
Normal file
13
Examples/Grouping/GroupDate.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
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
|
||||
|
||||
$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 $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
13
Examples/Grouping/GroupNumeric.ps1
Normal file
13
Examples/Grouping/GroupNumeric.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
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
|
||||
|
||||
$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 $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
42
Examples/Grouping/TimestampBucket.ps1
Normal file
42
Examples/Grouping/TimestampBucket.ps1
Normal file
@@ -0,0 +1,42 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
$data = ConvertFrom-Csv @"
|
||||
Timestamp,Tenant
|
||||
10/29/2018 3:00:00.123,1
|
||||
10/29/2018 3:00:10.456,1
|
||||
10/29/2018 3:01:20.389,1
|
||||
10/29/2018 3:00:30.222,1
|
||||
10/29/2018 3:00:40.143,1
|
||||
10/29/2018 3:00:50.809,1
|
||||
10/29/2018 3:01:00.193,1
|
||||
10/29/2018 3:01:10.555,1
|
||||
10/29/2018 3:01:20.739,1
|
||||
10/29/2018 3:01:30.912,1
|
||||
10/29/2018 3:01:40.989,1
|
||||
10/29/2018 3:01:50.545,1
|
||||
10/29/2018 3:02:00.999,1
|
||||
"@ | Select-Object @{n = 'Timestamp'; e = {Get-date $_.timestamp}}, tenant, @{n = 'Bucket'; e = { - (Get-date $_.timestamp).Second % 30}}
|
||||
|
||||
#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'
|
||||
PivotRows = @('Timestamp', 'Tenant')
|
||||
PivotData = @{'Bucket' = 'count'}
|
||||
GroupDateRow = 'TimeStamp'
|
||||
GroupDatePart = @('Hours', 'Minutes')
|
||||
Activate = $true
|
||||
}
|
||||
|
||||
$excelParams = @{
|
||||
PivotTableDefinition = New-PivotTableDefinition @pivotDefParams
|
||||
Path = $xlSourcefile
|
||||
WorkSheetname = "Log Data"
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
Show = $true
|
||||
}
|
||||
|
||||
$data | Export-Excel @excelParams
|
||||
101
Examples/HyperLinks/First10Races.csv
Normal file
101
Examples/HyperLinks/First10Races.csv
Normal file
@@ -0,0 +1,101 @@
|
||||
Race,Date,FinishPosition,Driver,GridPosition,Team,Points
|
||||
Australian,25/03/2018,1,Sebastian Vettel,3,Ferrari,25
|
||||
Australian,25/03/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||
Australian,25/03/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||
Australian,25/03/2018,4,Daniel Ricciardo,8,Red Bull Racing-TAG Heuer,12
|
||||
Australian,25/03/2018,5,Fernando Alonso,10,McLaren-Renault,10
|
||||
Australian,25/03/2018,6,Max Verstappen,4,Red Bull Racing-TAG Heuer,8
|
||||
Australian,25/03/2018,7,Nico Hülkenberg,7,Renault,6
|
||||
Australian,25/03/2018,8,Valtteri Bottas,15,Mercedes,4
|
||||
Australian,25/03/2018,9,Stoffel Vandoorne,11,McLaren-Renault,2
|
||||
Australian,25/03/2018,10,Carlos Sainz,9,Renault,1
|
||||
Bahrain,08/04/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||
Bahrain,08/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||
Bahrain,08/04/2018,3,Lewis Hamilton,9,Mercedes,15
|
||||
Bahrain,08/04/2018,4,Pierre Gasly,5,STR-Honda,12
|
||||
Bahrain,08/04/2018,5,Kevin Magnussen,6,Haas-Ferrari,10
|
||||
Bahrain,08/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||
Bahrain,08/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||
Bahrain,08/04/2018,8,Stoffel Vandoorne,14,McLaren-Renault,4
|
||||
Bahrain,08/04/2018,9,Marcus Ericsson,17,Sauber-Ferrari,2
|
||||
Bahrain,08/04/2018,10,Esteban Ocon,8,Force India-Mercedes,1
|
||||
Chinese,15/04/2018,1,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,25
|
||||
Chinese,15/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||
Chinese,15/04/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||
Chinese,15/04/2018,4,Lewis Hamilton,4,Mercedes,12
|
||||
Chinese,15/04/2018,5,Max Verstappen,5,Red Bull Racing-TAG Heuer,10
|
||||
Chinese,15/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||
Chinese,15/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||
Chinese,15/04/2018,8,Sebastian Vettel,1,Ferrari,4
|
||||
Chinese,15/04/2018,9,Carlos Sainz,9,Renault,2
|
||||
Chinese,15/04/2018,10,Kevin Magnussen,11,Haas-Ferrari,1
|
||||
Azerbaijan,29/04/2018,1,Lewis Hamilton,2,Mercedes,25
|
||||
Azerbaijan,29/04/2018,2,Kimi Räikkönen,6,Ferrari,18
|
||||
Azerbaijan,29/04/2018,3,Sergio Pérez,8,Force India-Mercedes,15
|
||||
Azerbaijan,29/04/2018,4,Sebastian Vettel,1,Ferrari,12
|
||||
Azerbaijan,29/04/2018,5,Carlos Sainz,9,Renault,10
|
||||
Azerbaijan,29/04/2018,6,Charles Leclerc,13,Sauber-Ferrari,8
|
||||
Azerbaijan,29/04/2018,7,Fernando Alonso,12,McLaren-Renault,6
|
||||
Azerbaijan,29/04/2018,8,Lance Stroll,10,Williams-Mercedes,4
|
||||
Azerbaijan,29/04/2018,9,Stoffel Vandoorne,16,McLaren-Renault,2
|
||||
Azerbaijan,29/04/2018,10,Brendon Hartley,19,STR-Honda,1
|
||||
Spanish,13/05/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||
Spanish,13/05/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||
Spanish,13/05/2018,3,Max Verstappen,5,Red Bull Racing-TAG Heuer,15
|
||||
Spanish,13/05/2018,4,Sebastian Vettel,3,Ferrari,12
|
||||
Spanish,13/05/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||
Spanish,13/05/2018,6,Kevin Magnussen,7,Haas-Ferrari,8
|
||||
Spanish,13/05/2018,7,Carlos Sainz,9,Renault,6
|
||||
Spanish,13/05/2018,8,Fernando Alonso,8,McLaren-Renault,4
|
||||
Spanish,13/05/2018,9,Sergio Pérez,15,Force India-Mercedes,2
|
||||
Spanish,13/05/2018,10,Charles Leclerc,14,Sauber-Ferrari,1
|
||||
Monaco,27/05/2018,1,Daniel Ricciardo,1,Red Bull Racing-TAG Heuer,25
|
||||
Monaco,27/05/2018,2,Sebastian Vettel,2,Ferrari,18
|
||||
Monaco,27/05/2018,3,Lewis Hamilton,3,Mercedes,15
|
||||
Monaco,27/05/2018,4,Kimi Räikkönen,4,Ferrari,12
|
||||
Monaco,27/05/2018,5,Valtteri Bottas,5,Mercedes,10
|
||||
Monaco,27/05/2018,6,Esteban Ocon,6,Force India-Mercedes,8
|
||||
Monaco,27/05/2018,7,Pierre Gasly,10,STR-Honda,6
|
||||
Monaco,27/05/2018,8,Nico Hülkenberg,11,Renault,4
|
||||
Monaco,27/05/2018,9,Max Verstappen,20,Red Bull Racing-TAG Heuer,2
|
||||
Monaco,27/05/2018,10,Carlos Sainz,8,Renault,1
|
||||
Canadian,10/06/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||
Canadian,10/06/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||
Canadian,10/06/2018,3,Max Verstappen,3,Red Bull Racing-TAG Heuer,15
|
||||
Canadian,10/06/2018,4,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,12
|
||||
Canadian,10/06/2018,5,Lewis Hamilton,4,Mercedes,10
|
||||
Canadian,10/06/2018,6,Kimi Räikkönen,5,Ferrari,8
|
||||
Canadian,10/06/2018,7,Nico Hülkenberg,7,Renault,6
|
||||
Canadian,10/06/2018,8,Carlos Sainz,9,Renault,4
|
||||
Canadian,10/06/2018,9,Esteban Ocon,8,Force India-Mercedes,2
|
||||
Canadian,10/06/2018,10,Charles Leclerc,13,Sauber-Ferrari,1
|
||||
French,24/06/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||
French,24/06/2018,2,Max Verstappen,4,Red Bull Racing-TAG Heuer,18
|
||||
French,24/06/2018,3,Kimi Räikkönen,6,Ferrari,15
|
||||
French,24/06/2018,4,Daniel Ricciardo,5,Red Bull Racing-TAG Heuer,12
|
||||
French,24/06/2018,5,Sebastian Vettel,3,Ferrari,10
|
||||
French,24/06/2018,6,Kevin Magnussen,9,Haas-Ferrari,8
|
||||
French,24/06/2018,7,Valtteri Bottas,2,Mercedes,6
|
||||
French,24/06/2018,8,Carlos Sainz,7,Renault,4
|
||||
French,24/06/2018,9,Nico Hülkenberg,12,Renault,2
|
||||
French,24/06/2018,10,Charles Leclerc,8,Sauber-Ferrari,1
|
||||
Austrian,01/07/2018,1,Max Verstappen,4,Red Bull Racing-TAG Heuer,25
|
||||
Austrian,01/07/2018,2,Kimi Räikkönen,3,Ferrari,18
|
||||
Austrian,01/07/2018,3,Sebastian Vettel,6,Ferrari,15
|
||||
Austrian,01/07/2018,4,Romain Grosjean,5,Haas-Ferrari,12
|
||||
Austrian,01/07/2018,5,Kevin Magnussen,8,Haas-Ferrari,10
|
||||
Austrian,01/07/2018,6,Esteban Ocon,11,Force India-Mercedes,8
|
||||
Austrian,01/07/2018,7,Sergio Pérez,15,Force India-Mercedes,6
|
||||
Austrian,01/07/2018,8,Fernando Alonso,20,McLaren-Renault,4
|
||||
Austrian,01/07/2018,9,Charles Leclerc,17,Sauber-Ferrari,2
|
||||
Austrian,01/07/2018,10,Marcus Ericsson,18,Sauber-Ferrari,1
|
||||
British,08/07/2018,1,Sebastian Vettel,2,Ferrari,25
|
||||
British,08/07/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||
British,08/07/2018,3,Kimi Räikkönen,3,Ferrari,15
|
||||
British,08/07/2018,4,Valtteri Bottas,4,Mercedes,12
|
||||
British,08/07/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||
British,08/07/2018,6,Nico Hülkenberg,11,Renault,8
|
||||
British,08/07/2018,7,Esteban Ocon,10,Force India-Mercedes,6
|
||||
British,08/07/2018,8,Fernando Alonso,13,McLaren-Renault,4
|
||||
British,08/07/2018,9,Kevin Magnussen,7,Haas-Ferrari,2
|
||||
British,08/07/2018,10,Sergio Pérez,12,Force India-Mercedes,1
|
||||
|
@@ -1,7 +1,8 @@
|
||||
#$(
|
||||
# New-PSItem 'Every Man a King' http://orisonswettmarden.wwwhubs.com/ccount/click.php?id=2
|
||||
# New-PSItem 'Be Good to Yourself' http://orisonswettmarden.wwwhubs.com/ccount/click.php?id=3
|
||||
# New-PSItem 'Character : The Grandest Thing in the World' http://orisonswettmarden.wwwhubs.com/ccount/click.php?id=4
|
||||
# New-PSItem 'The Conquest of Worry' http://orisonswettmarden.wwwhubs.com/ccount/click.php?id=5
|
||||
# New-PSItem 'Success Nuggets' http://orisonswettmarden.wwwhubs.com/ccount/click.php?id=6
|
||||
#) | Export-Excel hyperlinks.xlsx -Show -AutoSize
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
@"
|
||||
site,link
|
||||
google,http://www.google.com
|
||||
stackoverflow,http://stackoverflow.com
|
||||
microsoft,http://microsoft.com
|
||||
"@ | ConvertFrom-Csv | Export-Excel
|
||||
|
||||
28
Examples/HyperLinks/Races.ps1
Normal file
28
Examples/HyperLinks/Races.ps1
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
#First 10 races is a CSV file containing the top 10 finishers for the first 10 Formula one races of 2018. Read this file and group the results by race
|
||||
#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
|
||||
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv"
|
||||
$results = Import-Csv -Path $dataPath | Group-Object -Property RACE
|
||||
$topRow = $lastDataRow = 1 + $results.Count
|
||||
|
||||
#Export the first row of the first group (race) with headers.
|
||||
$path = "$env:TEMP\Results.xlsx"
|
||||
Remove-Item -Path $path -ErrorAction SilentlyContinue
|
||||
$excel = $results[0].Group[0] | Export-Excel -Path $path -StartRow $TopRow -BoldTopRow -PassThru
|
||||
|
||||
#export each group (race) below the last one, without headers, and create a range for each using the group (Race) name
|
||||
foreach ($r in $results) {
|
||||
$excel = $R.Group | Export-Excel -ExcelPackage $excel -NoHeader -StartRow ($lastDataRow +1) -RangeName $R.Name -PassThru -AutoSize
|
||||
$lastDataRow += $R.Group.Count
|
||||
}
|
||||
|
||||
#Create a hyperlink for each property with display text of "RaceNameGP" which links to the range created when the rows were exported a
|
||||
$results | ForEach-Object {(New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!$($_.Name)" , "$($_.name) GP")} |
|
||||
Export-Excel -ExcelPackage $excel -AutoSize -Show
|
||||
|
||||
7
Examples/Import-Excel/ImportMultipleSheetsAsArray.ps1
Normal file
7
Examples/Import-Excel/ImportMultipleSheetsAsArray.ps1
Normal file
@@ -0,0 +1,7 @@
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
$xlfile = "$PSScriptRoot\yearlySales.xlsx"
|
||||
|
||||
$result = Import-Excel -Path $xlfile -WorksheetName * -NotAsDictionary
|
||||
|
||||
$result | Measure-Object
|
||||
@@ -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
|
||||
}
|
||||
BIN
Examples/Import-Excel/yearlySales.xlsx
Normal file
BIN
Examples/Import-Excel/yearlySales.xlsx
Normal file
Binary file not shown.
9
Examples/ImportColumns/ImportColumns.ps1
Normal file
9
Examples/ImportColumns/ImportColumns.ps1
Normal 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
|
||||
@@ -1,2 +1,4 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
|
||||
Import-Html "http://en.wikipedia.org/wiki/Demographics_of_India" 4
|
||||
@@ -1 +1,3 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Import-Html "http://www.science.co.il/PTelements.asp" 1
|
||||
@@ -1 +1,3 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
Import-Html "https://en.wikipedia.org/wiki/List_of_Star_Trek:_The_Original_Series_episodes" 2
|
||||
41
Examples/Index - Music.ps1
Normal file
41
Examples/Index - Music.ps1
Normal file
@@ -0,0 +1,41 @@
|
||||
#requires -modules "Get-IndexedItem"
|
||||
[CmdletBinding()]
|
||||
Param()
|
||||
Remove-Item ~\documents\music.xlsx -ErrorAction SilentlyContinue
|
||||
[System.Diagnostics.Stopwatch]$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
|
||||
|
||||
#Query system index for .MP3 files in C:\Users, where album artist is non-blank. Leave sorted table with columns of interest in $Music.
|
||||
|
||||
Get-IndexedItem "itemtype='.mp3'","AlbumArtist like '%'" -Recurse C:\Users -OutputVariable Music `
|
||||
-OrderBy AlbumArtist, AlbumTitle, TrackNumber, Title -NoFiles `
|
||||
-Property AlbumArtist, AlbumTitle, TrackNumber, Title, Duration, Size, SampleRate
|
||||
Write-Verbose -Message ("Fetched " + $music.Rows.Count + " rows from index: " + $stopwatch.Elapsed.TotalSeconds)
|
||||
#Send Table in $Music to Excel, format as a table, point $ws to the Worksheet
|
||||
$excel = Send-SQLDataToExcel -Path ~\documents\music.xlsx -DataTable $music -WorkSheetname Music -TableName Music -Passthru
|
||||
Write-Verbose -Message ("Inserted into Excel: " + $stopwatch.Elapsed.TotalSeconds)
|
||||
$ws = $excel.Music
|
||||
|
||||
#Strip "SYSTEM.", "SYSTEM.AUDIO", "SYSTEM.MEDIA", "SYSTEM.MUSIC" from the column headings
|
||||
#Convert Duration (column 5) from 100ns ticks to days and format as minutes, seconds, decimal
|
||||
#Format filesize and sample rate nicely
|
||||
#Autofit the columns.
|
||||
Set-ExcelRow -Worksheet $ws -Row 1 -Value {($worksheet.cells[$row,$column].value -replace '^SYSTEM\.','') -replace '^MEDIA\.|^AUDIO\.|^MUSIC\.','' }
|
||||
Set-ExcelColumn -Worksheet $ws -Column 5 -NumberFormat 'mm:ss.0' -StartRow 2 -Value {$worksheet.cells[$row,$column].value / 864000000000 }
|
||||
Write-Verbose -Message ("Cells Reset: " + $stopwatch.Elapsed.TotalSeconds)
|
||||
Set-ExcelColumn -Worksheet $ws -Column 6 -NumberFormat '#.#,,"MB"'
|
||||
Set-ExcelColumn -Worksheet $ws -Column 7 -NumberFormat '0.0,"KHz"'
|
||||
$ws.Cells[$ws.Dimension].AutoFitColumns()
|
||||
|
||||
#Make a Pivot table for sum of space and count of tracks by artist. Sort by artist, apply formatting to space, give it nice titles.
|
||||
$pt = Add-PivotTable -PassThru -PivotTableName SpaceUsedByMusic -ExcelPackage $excel -SourceWorkSheet $ws `
|
||||
-PivotRows ALBUMARTIST -PivotData ([ordered]@{"Size"="Sum"; "Duration"="Count"}) -PivotDataToColumn
|
||||
|
||||
$pt.RowFields[0].Sort = [OfficeOpenXml.Table.PivotTable.eSortType]::Ascending
|
||||
$pt.DataFields[0].Format = '#.0,,"MB"'
|
||||
$pt.DataFields[0].Name = 'Space Used'
|
||||
$pt.DataFields[1].Name = 'Tracks'
|
||||
|
||||
#Save the file, and load it into Excel
|
||||
$stopwatch.Stop()
|
||||
Write-Verbose -Message ("Pivot Done: " + $stopwatch.Elapsed.TotalSeconds)
|
||||
Close-ExcelPackage -show $excel
|
||||
26
Examples/InteractWithOtherModules/Pester/Analyze_that.ps1
Normal file
26
Examples/InteractWithOtherModules/Pester/Analyze_that.ps1
Normal file
@@ -0,0 +1,26 @@
|
||||
param(
|
||||
$PesterTestsPath = "$PSScriptRoot\..\..\..\__tests__\"
|
||||
)
|
||||
|
||||
$xlfile = "$env:Temp\testResults.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$xlparams = @{
|
||||
Path = $xlfile
|
||||
InputObject = (Invoke-Pester -Script $PesterTestsPath -PassThru).TestResult | Sort-Object describe
|
||||
WorksheetName = 'FullResults'
|
||||
|
||||
IncludePivotTable = $true
|
||||
PivotRows = 'Describe'
|
||||
PivotColumns = 'Passed'
|
||||
PivotData = @{'Passed' = 'Count' }
|
||||
|
||||
IncludePivotChart = $true
|
||||
ChartType = 'BarClustered'
|
||||
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
Activate = $true
|
||||
}
|
||||
|
||||
Export-Excel -Show @xlparams
|
||||
@@ -0,0 +1,62 @@
|
||||
<#
|
||||
.Synopsis
|
||||
Runs PsScriptAnalyzer against one or more folders and pivots the results to form a report.
|
||||
|
||||
.Example
|
||||
Analyze_this.ps1
|
||||
Invokes script analyzer on the current directory; creates a file in $env:temp and opens it in Excel
|
||||
.Example
|
||||
Analyze_this.ps1 -xlfile ..\mymodule.xlsx -quiet
|
||||
Invokes script analyzer on the current directory; creates a file in the parent directory but does not open it
|
||||
.Example
|
||||
"." , (dir 'C:\Program Files\WindowsPowerShell\Modules\ImportExcel\') | .\examples\ScriptAnalyzer\Analyze_this.ps1
|
||||
run from a developemnt directory for importExcel it will produce a report for that directory compared against installed versions
|
||||
this creates the file in the default location and opens it
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[parameter(ValueFromPipeline = $true)]
|
||||
$Path = $PWD,
|
||||
$xlfile = "$env:TEMP\ScriptAnalyzer.xlsx",
|
||||
$ChartType = 'BarClustered' ,
|
||||
$PivotColumns = 'Location',
|
||||
[switch]$Quiet
|
||||
)
|
||||
|
||||
begin {
|
||||
Remove-Item -Path $xlfile -ErrorAction SilentlyContinue
|
||||
$xlparams = @{
|
||||
Path = $xlfile
|
||||
WorksheetName = 'FullResults'
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
Activate = $true
|
||||
Show = (-not $Quiet)
|
||||
}
|
||||
$pivotParams = @{
|
||||
PivotTableName = 'BreakDown'
|
||||
PivotData = @{RuleName = 'Count' }
|
||||
PivotRows = 'Severity', 'RuleName'
|
||||
PivotColumns = 'Location'
|
||||
PivotTotals = 'Rows'
|
||||
}
|
||||
$dirsToProcess = @()
|
||||
}
|
||||
process {
|
||||
if ($path.fullName) {$dirsToProcess += $path.fullName}
|
||||
elseif ($path.path) {$dirsToProcess += $path.Path}
|
||||
else {$dirsToProcess += $path}
|
||||
}
|
||||
|
||||
end {
|
||||
$pivotParams['-PivotChartDefinition'] = New-ExcelChartDefinition -ChartType $chartType -Column (1 + $dirsToProcess.Count) -Title "Script analysis" -LegendBold
|
||||
$xlparams['PivotTableDefinition'] = New-PivotTableDefinition @pivotParams
|
||||
|
||||
$dirsToProcess | ForEach-Object {
|
||||
$dirName = (Resolve-Path -Path $_) -replace "^.*\\(.*?)\\(.*?)$", '$1-$2'
|
||||
Write-Progress -Activity "Running Script Analyzer" -CurrentOperation $dirName
|
||||
Invoke-ScriptAnalyzer -Path $_ -ErrorAction SilentlyContinue |
|
||||
Add-Member -MemberType NoteProperty -Name Location -Value $dirName -PassThru
|
||||
} | Export-Excel @xlparams
|
||||
Write-Progress -Activity "Running Script Analyzer" -Completed
|
||||
}
|
||||
14
Examples/InvokeExcelQuery/Examples.ps1
Normal file
14
Examples/InvokeExcelQuery/Examples.ps1
Normal 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
|
||||
}
|
||||
BIN
Examples/InvokeExcelQuery/testOleDb.xlsx
Normal file
BIN
Examples/InvokeExcelQuery/testOleDb.xlsx
Normal file
Binary file not shown.
6
Examples/JoinWorksheet/EastSales.csv
Normal file
6
Examples/JoinWorksheet/EastSales.csv
Normal file
@@ -0,0 +1,6 @@
|
||||
"Region","Item","UnitSold","UnitCost"
|
||||
"East","Banana","38","0.26"
|
||||
"East","Kale","71","0.69"
|
||||
"East","Apple","35","0.55"
|
||||
"East","Potato","48","0.48"
|
||||
"East","Kale","41","0.74"
|
||||
|
46
Examples/JoinWorksheet/Join-Worksheet.sample.ps1
Normal file
46
Examples/JoinWorksheet/Join-Worksheet.sample.ps1
Normal file
@@ -0,0 +1,46 @@
|
||||
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
|
||||
|
||||
@"
|
||||
ID,Product,Quantity,Price,Total
|
||||
12001,Nails,37,3.99,147.63
|
||||
12002,Hammer,5,12.10,60.5
|
||||
12003,Saw,12,15.37,184.44
|
||||
12010,Drill,20,8,160
|
||||
12011,Crowbar,7,23.48,164.36
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Oxford
|
||||
|
||||
@"
|
||||
ID,Product,Quantity,Price,Total
|
||||
12001,Nails,53,3.99,211.47
|
||||
12002,Hammer,6,12.10,72.60
|
||||
12003,Saw,10,15.37,153.70
|
||||
12010,Drill,10,8,80
|
||||
12012,Pliers,2,14.99,29.98
|
||||
"@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Abingdon
|
||||
|
||||
|
||||
@"
|
||||
ID,Product,Quantity,Price,Total
|
||||
12001,Nails,20,3.99,79.80
|
||||
12002,Hammer,2,12.10,24.20
|
||||
12010,Drill,11,8,88
|
||||
12012,Pliers,3,14.99,44.97
|
||||
"@ | 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
|
||||
|
||||
#Join the 3 worksheets.
|
||||
#Name the combined page "Total" and Name the column with the sheet names "store" (as the sheets 'Oxford','Abingdon' and 'Banbury' are the names of the stores
|
||||
#Format the data as a table named "Summary", using the style "Light1", put the column headers in bold
|
||||
#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 $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
|
||||
17
Examples/JoinWorksheet/Join-worksheet-blocks.sample.ps1
Normal file
17
Examples/JoinWorksheet/Join-worksheet-blocks.sample.ps1
Normal file
@@ -0,0 +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
|
||||
|
||||
#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 $xlSourcefile -WorkSheetname Volumes -NumberFormat "0,000"
|
||||
Get-NetAdapter |
|
||||
Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed |
|
||||
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 $xlSourcefile -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show
|
||||
24
Examples/JoinWorksheet/JoinSalesData.ps1
Normal file
24
Examples/JoinWorksheet/JoinSalesData.ps1
Normal file
@@ -0,0 +1,24 @@
|
||||
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
|
||||
|
||||
$params = @{
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
AutoNameRange = $true
|
||||
ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold'
|
||||
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
|
||||
Import-Csv $PSScriptRoot\EastSales.csv | Export-Excel -WorkSheetname East @params
|
||||
Import-Csv $PSScriptRoot\SouthSales.csv | Export-Excel -WorkSheetname South @params
|
||||
Import-Csv $PSScriptRoot\WestSales.csv | Export-Excel -WorkSheetname West @params
|
||||
|
||||
#Join the 4 worksheets together on a sheet named Allsales, use the same parameters, except for AutoNameRange and ExcelChartDefinition.
|
||||
$params.Remove("AutoNameRange")
|
||||
$params.Remove("ExcelChartDefinition")
|
||||
Join-Worksheet -WorkSheetName AllSales -Show @params
|
||||
5
Examples/JoinWorksheet/NorthSales.csv
Normal file
5
Examples/JoinWorksheet/NorthSales.csv
Normal file
@@ -0,0 +1,5 @@
|
||||
"Region","Item","UnitSold","UnitCost"
|
||||
"North","Apple","40","0.68"
|
||||
"North","Kale","55","0.35"
|
||||
"North","Banana","33","0.31"
|
||||
"North","Pear","29","0.74"
|
||||
|
6
Examples/JoinWorksheet/SouthSales.csv
Normal file
6
Examples/JoinWorksheet/SouthSales.csv
Normal file
@@ -0,0 +1,6 @@
|
||||
"Region","Item","UnitSold","UnitCost"
|
||||
"South","Banana","54","0.46"
|
||||
"South","Pear","39","0.44"
|
||||
"South","Potato","33","0.46"
|
||||
"South","Banana","49","0.31"
|
||||
"South","Apple","38","0.59"
|
||||
|
12
Examples/JoinWorksheet/WestSales.csv
Normal file
12
Examples/JoinWorksheet/WestSales.csv
Normal file
@@ -0,0 +1,12 @@
|
||||
"Region","Item","UnitSold","UnitCost"
|
||||
"West","Banana","74","0.56"
|
||||
"West","Apple","26","0.7"
|
||||
"West","Banana","59","0.49"
|
||||
"West","Potato","56","0.62"
|
||||
"West","Banana","60","0.64"
|
||||
"West","Pear","32","0.29"
|
||||
"West","Apple","73","0.26"
|
||||
"West","Banana","49","0.59"
|
||||
"West","Pear","65","0.35"
|
||||
"West","Apple","60","0.34"
|
||||
"West","Kale","67","0.38"
|
||||
|
@@ -1,9 +1,11 @@
|
||||
ColumnChart -Title "Central Limit Theorem" ($(
|
||||
for ($i = 1; $i -le 500; $i++) {
|
||||
$s=0
|
||||
for ($j = 1; $j -le 100; $j++){
|
||||
$s+=Get-Random -Minimum 0 -Maximum 2
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
ColumnChart -Title "Central Limit Theorem" -NoLegend ($(
|
||||
for ($i = 1; $i -le 500; $i++) {
|
||||
$s = 0
|
||||
for ($j = 1; $j -le 100; $j++) {
|
||||
$s += Get-Random -Minimum 0 -Maximum 2
|
||||
}
|
||||
$s
|
||||
}
|
||||
$s
|
||||
}
|
||||
) | Sort | Group | select Count, Name)
|
||||
) | Sort-Object | Group-Object | Select-Object Count, Name)
|
||||
@@ -2,5 +2,7 @@
|
||||
# Sum up handles by company
|
||||
# Show the Pie Chart
|
||||
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
PieChart -Title "Total Handles by Company" `
|
||||
(Invoke-Sum (Get-Process|Where company) company handles)
|
||||
(Invoke-Sum (Get-Process | Where-Object company) company handles)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
# Sum up PM by company
|
||||
# Show the Pie Chart
|
||||
|
||||
PieChart -Title "Total PM by Company" `
|
||||
(Invoke-Sum (Get-Process|Where company) company pm)
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
PieChart -Title "Total PM by Company" `
|
||||
(Invoke-Sum (Get-Process|Where-Object company) company pm)
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user