powershell:excelをcsvから更新1
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
powershell:excelをcsvから更新1 [2023/04/19 04:18] – taatin | powershell:excelをcsvから更新1 [2023/04/19 05:40] (現在) – taatin | ||
---|---|---|---|
行 20: | 行 20: | ||
* 変更を保存し、Excelを閉じる | * 変更を保存し、Excelを閉じる | ||
* COMオブジェクトの解放 | * COMオブジェクトの解放 | ||
- | + | < | |
- | < | + | |
- | # Excelファイルを開く | + | |
$excel = New-Object -ComObject Excel.Application | $excel = New-Object -ComObject Excel.Application | ||
$excel.Visible = $false | $excel.Visible = $false | ||
行 35: | 行 33: | ||
# 1. シート「オブジェクト」とCSVファイル「Object.csv」を比較 | # 1. シート「オブジェクト」とCSVファイル「Object.csv」を比較 | ||
$objectCsv = Import-Csv -Path " | $objectCsv = Import-Csv -Path " | ||
- | $objectSheet | + | $objectSheetHeaders |
- | $objectSheetHeaders | + | $objectSheetData |
$headersMatch = ($objectCsv[0].PSObject.Properties.Name -join "," | $headersMatch = ($objectCsv[0].PSObject.Properties.Name -join "," | ||
行 42: | 行 40: | ||
$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 | ||
行 56: | 行 54: | ||
# 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較 | # 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較 | ||
$polisyCsv = Import-Csv -Path " | $polisyCsv = Import-Csv -Path " | ||
- | $polisySheet | + | $polisySheetHeaders |
- | $polisySheetHeaders | + | $polisySheetData |
$headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join "," | $headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join "," | ||
行 63: | 行 61: | ||
$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 | ||
行 76: | 行 74: | ||
# 履歴シートの更新 | # 履歴シートの更新 | ||
+ | $lastUpdateRow = ($worksheetHistory.Cells[" | ||
$updateRow = $lastUpdateRow + 3 | $updateRow = $lastUpdateRow + 3 | ||
$worksheetHistory.Cells.Item($updateRow, | $worksheetHistory.Cells.Item($updateRow, | ||
行 97: | 行 96: | ||
[System.Runtime.InteropServices.Marshal]:: | [System.Runtime.InteropServices.Marshal]:: | ||
[System.Runtime.InteropServices.Marshal]:: | [System.Runtime.InteropServices.Marshal]:: | ||
+ | |||
</ | </ | ||
+ | |||
+ | |||
+ | ====== 更新前 ====== | ||
< | < | ||
function Get-Range { | function Get-Range { | ||
行 114: | 行 117: | ||
return $array | return $array | ||
} | } | ||
+ | |||
+ | # Excelファイルを開く | ||
+ | $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(" | ||
+ | |||
+ | $objectRange = $worksheetObject.UsedRange | ||
+ | $objectSheet = Get-Range -worksheet $worksheetObject -range $objectRange | ||
$polisyRange = $worksheetPolisy.UsedRange | $polisyRange = $worksheetPolisy.UsedRange | ||
$polisySheet = Get-Range -worksheet $worksheetPolisy -range $polisyRange | $polisySheet = Get-Range -worksheet $worksheetPolisy -range $polisyRange | ||
- | function Get-Range { | + | |
- | param ( | + | # シートとCSVを比較して更新 |
- | $worksheet, | + | $UpdateSheetSummary = "" |
- | | + | |
- | ) | + | # 1. シート「オブジェクト」とCSVファイル「Object.csv」を比較 |
- | $rows = $range.Rows.Count | + | $objectCsv |
- | $cols = $range.Columns.Count | + | $headersMatch |
- | $array = New-Object ' | + | if ($headersMatch) { |
- | for ($r = 1; $r -le $rows; $r++) { | + | $rowsMatch = $true |
- | | + | for ($i = 0; $i -lt $objectCsv.Count; $i++) { |
- | $array[$r-1, $c-1] = $worksheet.Cells.Item($r, | + | |
+ | $rowsMatch | ||
+ | break | ||
} | } | ||
} | } | ||
- | return | + | } else { |
+ | | ||
+ | } | ||
+ | if (-not $rowsMatch) { | ||
+ | $UpdateSheetSummary += " | ||
} | } | ||
- | $polisyRange | + | # 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較 |
- | $polisySheet = Get-Range -worksheet | + | $polisyCsv |
+ | $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 | ||
+ | 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]:: | ||
</ | </ | ||
powershell/excelをcsvから更新1.1681877926.txt.gz · 最終更新: 2023/04/19 04:18 by taatin