Excelファイル(xlsx形式)でカレンダーを作成します。
祝日は対応しません。
スクリプト
<#
.SYNOPSIS
任意の年のカレンダー(.xlsx)を作成する。
.DESCRIPTION
デフォルトで2020年のカレンダーを作成します。
.EXAMPLE
PS>CalenderMaker.ps1 [xlsxファイルパス] [西暦]
.PARAMETER XlsxPath
作成するxlsxファイルのパス
.PARAMETER Year
作成するカレンダーの年。西暦で指定。
#>
param(
[string]$XlsxPath = (Join-Path ([Environment]::GetFolderPath("MyDocuments")) "Calender.xlsx"),
[int]$Year = 2020
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "STOP"
function Make-Calender
{
param(
[Parameter(ValueFromPipeline=$false,Mandatory=$true)]
[string]
$XlsxPath,
[Parameter(ValueFromPipeline=$false,Mandatory=$true)]
[int]
$Year
)
$week = @("日","月","火","水","木","金","土")
$Excel = New-Object -ComObject Excel.Application # Excel起動
$Excel.Visible = $True
# ワークブックの初期処理
$XlsxExits = Test-Path -LiteralPath $XlsxPath # ファイルの存在確認
if ($XlsxExits) {
# ファイルが有る
$Workbook = $Excel.Workbooks.Open($XlsxPath) # ワークブックを開く
} else {
# ファイルが無い
$Workbook = $Excel.Workbooks.Add() # ワークブックを作成
}
try {
# ワークシートの初期処理
$SheetName = "Calender"
$Sheet = $Workbook.Worksheets | ? { $SheetName -eq $_.Name } # ワークシート名Calenderを取り出す
if(-not($Sheet)) {
# シート無し
$Sheet = $Workbook.Worksheets.Add() # ワークシートを作成
$Sheet.Name = $SheetName
}
# 年をセット
$Sheet.Range("A1") | % {
$_.Value = $Year
$_.NumberFormatLocal = "0""年"""
}
# 月のループ
for($m=0; $m -lt 12;$m++) {
if ($m -gt 5) {
# 右側(7-12月)
$y = 5 + ($m-6) * 8
$x = 1 + 9
} else {
# 左側(1-6月)
$y = 5 + $m * 8
$x = 1
}
# 月をセット
$Sheet.Cells.Item($y, $x) | % {
$_.Value = ($m+1)
$_.NumberFormatLocal = "0""月"""
}
# 罫線をセット
$Sheet.Range($Sheet.Cells.Item($y, ($x+1)),$Sheet.Cells.Item(($y+6), ($x+7))) | % {
# 罫線の種類を指定
$_.borders.LineStyle = 1
# 罫線の太さを指定
$_.borders.Weight = 2
}
# 曜日をセット
for($i=0;$i -lt 7;$i++) {
$Sheet.Cells.Item($y, ($x + 1 + $i)) = $week[$i]
}
# 月末日を計算
$ds = (Get-Date -Year $Year -Month ($m+1) -Day 1)
$de = $ds.AddMonths(1).AddDays(-1)
# 日付のループ
$j = 0
for($i=1;$i -le $de.Day;$i++) {
$d = (Get-Date -Year $Year -Month ($m+1) -Day $i)
$w = $d.DayOfWeek.value__
# 日付をセット
$Sheet.Cells.Item(($y + 1 + $j), ($x + 1 + $w)) = $i
if ($w -eq 6) { $j++ }
}
}
# カラムの自動調整
$Sheet.Columns("B:H").AutoFit() | Out-NUll
$Sheet.Columns("K:Q").AutoFit() | Out-NUll
# 日曜日赤
$Sheet.Columns("B:B").font.ColorIndex = 3
$Sheet.Columns("K:K").font.ColorIndex = 3
} catch {
throw $_
} finally {
# ワークブックを保存
if ($XlsxExits) {
# ファイルが有る
$Workbook.Save() # 上書き保存
} else {
# ファイルが無い
$Workbook.SaveAs($XlsxPath) # 名前を付けて保存
}
$Excel.Quit() # Excelを終了
$Excel = $Null
[System.GC]::Collect() # ガーベージコレクト
}
}
Make-Calender $XlsxPath $Year
コメント