powershell:excelをcsvから更新1
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
powershell:excelをcsvから更新1 [2023/04/06 09:33] – taatin | powershell:excelをcsvから更新1 [2023/04/19 05:40] (現在) – taatin | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ======要件の更新 | + | ====== 要件の更新 ====== |
- | ====== Excelファイルを開く | + | |
- | シート「オブジェクト」とCSVファイル「Object.csv」を比較 | + | |
- | CSVファイルの要素を洗い出し、同じ要素がシート「オブジェクト」の1行目に存在するか確認 | + | |
- | ForeachでObject.csvの各行の要素の値が、「オブジェクト」シートの同じ行の値であれば、同じ内容とする | + | |
- | 異なるファイルであった場合、$UpdateSheetSummaryに「・オブジェクト更新」の文字を追加する | + | |
- | シート「ポリシ」とCSVファイル「Polisy.csv」を比較 | + | |
- | CSVファイルの要素を左から順に8個洗い出し、シート「ポリシ」のA1列-H1列に記載の要素が同じことを確認 | + | |
- | ForeachでObject.csvの各行の左から8個の要素の値が、「ポリシ」シートとA列-H列各行が同じ値であれば、同じ内容とする | + | |
- | 異なるファイルであった場合、$UpdateSheetSummaryに「・ポリシ」の文字を追加する | + | |
- | 履歴シートの更新 | + | |
- | C列に値が入っている最終行を探し、その3行下が更新行 | + | |
- | 更新行に次の情報を入力する | + | |
- | Revision (C列) | + | |
- | UpdateDate (H列) | + | |
- | UpdateSheet (M列) | + | |
- | UpdateDetails (R列) | + | |
- | バックアップを作成 | + | |
- | 変更を保存し、Excelを閉じる | + | |
- | COMオブジェクトの解放 | + | |
- | ====== | + | |
+ | * Excelファイルを開く | ||
+ | * シート「オブジェクト」とCSVファイル「Object.csv」を比較 | ||
+ | * CSVファイルの要素を洗い出し、同じ要素がシート「オブジェクト」の1行目に存在するか確認 | ||
+ | * ForeachでObject.csvの各行の要素の値が、「オブジェクト」シートの同じ行の値であれば、同じ内容とする | ||
+ | * 異なるファイルであった場合、$UpdateSheetSummaryに「・オブジェクト更新」の文字を追加する | ||
+ | * シート「ポリシ」とCSVファイル「Polisy.csv」を比較 | ||
+ | * CSVファイルの要素を左から順に8個洗い出し、シート「ポリシ」のA1列-H1列に記載の要素が同じことを確認 | ||
+ | * ForeachでObject.csvの各行の左から8個の要素の値が、「ポリシ」シートとA列-H列各行が同じ値であれば、同じ内容とする | ||
+ | * 異なるファイルであった場合、$UpdateSheetSummaryに「・ポリシ」の文字を追加する | ||
+ | * 履歴シートの更新 | ||
+ | * C列に値が入っている最終行を探し、その3行下が更新行 | ||
+ | * 更新行に次の情報を入力する | ||
+ | * Revision (C列) | ||
+ | * UpdateDate (H列) | ||
+ | * UpdateSheet (M列) | ||
+ | * UpdateDetails (R列) | ||
+ | * バックアップを作成 | ||
+ | * 変更を保存し、Excelを閉じる | ||
+ | * COMオブジェクトの解放 | ||
+ | < | ||
+ | $excel = New-Object -ComObject Excel.Application | ||
+ | $excel.Visible = $false | ||
+ | $workbook = $excel.Workbooks.Open(" | ||
+ | $worksheetHistory = $workbook.Worksheets.Item(" | ||
+ | $worksheetObject = $workbook.Worksheets.Item(" | ||
+ | $worksheetPolisy = $workbook.Worksheets.Item(" | ||
+ | |||
+ | # シートとCSVを比較して更新 | ||
+ | $UpdateSheetSummary = "" | ||
+ | |||
+ | # 1. シート「オブジェクト」とCSVファイル「Object.csv」を比較 | ||
+ | $objectCsv = Import-Csv -Path " | ||
+ | $objectSheetHeaders = $worksheetObject.Rows.Item(1).Cells.Value2 | ||
+ | $objectSheetData = $worksheetObject.Range(" | ||
+ | $headersMatch = ($objectCsv[0].PSObject.Properties.Name -join "," | ||
+ | |||
+ | if ($headersMatch) { | ||
+ | $rowsMatch = $true | ||
+ | for ($i = 0; $i -lt $objectCsv.Count; | ||
+ | if (($objectCsv[$i].PSObject.Properties.Value -join "," | ||
+ | $rowsMatch = $false | ||
+ | break | ||
+ | } | ||
+ | } | ||
+ | } else { | ||
+ | $rowsMatch = $false | ||
+ | } | ||
+ | if (-not $rowsMatch) { | ||
+ | $UpdateSheetSummary += " | ||
+ | } | ||
+ | |||
+ | # 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較 | ||
+ | $polisyCsv = Import-Csv -Path " | ||
+ | $polisySheetHeaders = $worksheetPolisy.Rows.Item(1).Cells.Value2 | ||
+ | $polisySheetData = $worksheetPolisy.Range(" | ||
+ | $headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join "," | ||
+ | |||
+ | if ($headersMatch) { | ||
+ | $rowsMatch = $true | ||
+ | for ($i = 0; $i -lt $polisyCsv.Count; | ||
+ | if (($polisyCsv[$i].PSObject.Properties.Value | Select-Object -First 8 -join "," | ||
+ | $rowsMatch = $false | ||
+ | break | ||
+ | } | ||
+ | } | ||
+ | } else { | ||
+ | $rowsMatch = $false | ||
+ | } | ||
+ | if (-not $rowsMatch) { | ||
+ | $UpdateSheetSummary += " | ||
+ | } | ||
+ | |||
+ | # 履歴シートの更新 | ||
+ | $lastUpdateRow = ($worksheetHistory.Cells[" | ||
+ | $updateRow = $lastUpdateRow + 3 | ||
+ | $worksheetHistory.Cells.Item($updateRow, | ||
+ | $worksheetHistory.Cells.Item($updateRow, | ||
+ | $worksheetHistory.Cells.Item($updateRow, | ||
+ | $worksheetHistory.Cells.Item($updateRow, | ||
+ | |||
+ | # バックアップを作成 | ||
+ | $backupFileName = $worksheetHistory.Cells.Item(2, | ||
+ | $workbook.SaveCopyAs(" | ||
+ | |||
+ | # 変更を保存し、Excelを閉じる | ||
+ | $workbook.Save() | ||
+ | $workbook.Close() | ||
+ | $excel.Quit() | ||
+ | |||
+ | # COMオブジェクトの解放 | ||
+ | [System.Runtime.InteropServices.Marshal]:: | ||
+ | [System.Runtime.InteropServices.Marshal]:: | ||
+ | [System.Runtime.InteropServices.Marshal]:: | ||
+ | [System.Runtime.InteropServices.Marshal]:: | ||
+ | [System.Runtime.InteropServices.Marshal]:: | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ====== 更新前 ====== | ||
< | < | ||
+ | function Get-Range { | ||
+ | param ( | ||
+ | $worksheet, | ||
+ | $range | ||
+ | ) | ||
+ | $rows = $range.Rows.Count | ||
+ | $cols = $range.Columns.Count | ||
+ | $array = New-Object ' | ||
+ | for ($r = 1; $r -le $rows; $r++) { | ||
+ | for ($c = 1; $c -le $cols; $c++) { | ||
+ | $array[$r-1, | ||
+ | } | ||
+ | } | ||
+ | return $array | ||
+ | } | ||
+ | |||
# Excelファイルを開く | # Excelファイルを開く | ||
$excel = New-Object -ComObject Excel.Application | $excel = New-Object -ComObject Excel.Application | ||
行 29: | 行 125: | ||
$worksheetObject = $workbook.Worksheets.Item(" | $worksheetObject = $workbook.Worksheets.Item(" | ||
$worksheetPolisy = $workbook.Worksheets.Item(" | $worksheetPolisy = $workbook.Worksheets.Item(" | ||
+ | |||
+ | $objectRange = $worksheetObject.UsedRange | ||
+ | $objectSheet = Get-Range -worksheet $worksheetObject -range $objectRange | ||
+ | |||
+ | $polisyRange = $worksheetPolisy.UsedRange | ||
+ | $polisySheet = Get-Range -worksheet $worksheetPolisy -range $polisyRange | ||
# シートとCSVを比較して更新 | # シートとCSVを比較して更新 | ||
行 35: | 行 137: | ||
# 1. シート「オブジェクト」とCSVファイル「Object.csv」を比較 | # 1. シート「オブジェクト」とCSVファイル「Object.csv」を比較 | ||
$objectCsv = Import-Csv -Path " | $objectCsv = Import-Csv -Path " | ||
- | $objectSheet = $worksheetObject.UsedRange.Value2 | + | $headersMatch = ($objectCsv[0].PSObject.Properties.Name -join "," |
- | $headersMatch = ($objectCsv[0].PSObject.Properties.Name -join "," | + | |
if ($headersMatch) { | if ($headersMatch) { | ||
$rowsMatch = $true | $rowsMatch = $true | ||
for ($i = 0; $i -lt $objectCsv.Count; | for ($i = 0; $i -lt $objectCsv.Count; | ||
- | if (($objectCsv[$i].PSObject.Properties.Value -join "," | + | if (($objectCsv[$i].PSObject.Properties.Value -join "," |
$rowsMatch = $false | $rowsMatch = $false | ||
break | break | ||
行 54: | 行 155: | ||
# 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較 | # 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較 | ||
$polisyCsv = Import-Csv -Path " | $polisyCsv = Import-Csv -Path " | ||
- | $polisySheet = $worksheetPolisy.UsedRange.Value2 | + | $headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join "," |
- | $headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join "," | + | |
if ($headersMatch) { | if ($headersMatch) { | ||
$rowsMatch = $true | $rowsMatch = $true | ||
for ($i = 0; $i -lt $polisyCsv.Count; | for ($i = 0; $i -lt $polisyCsv.Count; | ||
- | if (($polisyCsv[$i].PSObject.Properties.Value | Select-Object -First 8 -join "," | + | if (($polisyCsv[$i].PSObject.Properties.Value | Select-Object -First 8 -join "," |
$rowsMatch = $false | $rowsMatch = $false | ||
break | break | ||
行 93: | 行 193: | ||
[System.Runtime.InteropServices.Marshal]:: | [System.Runtime.InteropServices.Marshal]:: | ||
[System.Runtime.InteropServices.Marshal]:: | [System.Runtime.InteropServices.Marshal]:: | ||
- | </ | ||
+ | </ | ||
powershell/excelをcsvから更新1.1680773627.txt.gz · 最終更新: 2023/04/06 09:33 by taatin