ユーザ用ツール

サイト用ツール


powershell:excelをcsvから更新1

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
powershell:excelをcsvから更新1 [2023/04/11 02:32] 180.46.4.12powershell:excelをcsvから更新1 [2023/04/19 05:40] (現在) taatin
行 20: 行 20:
   * 変更を保存し、Excelを閉じる   * 変更を保存し、Excelを閉じる
   * COMオブジェクトの解放   * COMオブジェクトの解放
 +<code># Excelファイルを開く
 +$excel = New-Object -ComObject Excel.Application
 +$excel.Visible = $false
 +$workbook = $excel.Workbooks.Open("C:\path\to\TEST.xlsx")
 +$worksheetHistory = $workbook.Worksheets.Item("履歴")
 +$worksheetObject = $workbook.Worksheets.Item("オブジェクト")
 +$worksheetPolisy = $workbook.Worksheets.Item("ポリシ")
  
 +# シートとCSVを比較して更新
 +$UpdateSheetSummary = ""
 +
 +# 1. シート「オブジェクト」とCSVファイル「Object.csv」を比較
 +$objectCsv = Import-Csv -Path "Object.csv"
 +$objectSheetHeaders = $worksheetObject.Rows.Item(1).Cells.Value2
 +$objectSheetData = $worksheetObject.Range("A2", $worksheetObject.Cells.SpecialCells("xlCellTypeLastCell")).Value2
 +$headersMatch = ($objectCsv[0].PSObject.Properties.Name -join ",") -eq ($objectSheetHeaders -join ",")
 +
 +if ($headersMatch) {
 +    $rowsMatch = $true
 +    for ($i = 0; $i -lt $objectCsv.Count; $i++) {
 +        if (($objectCsv[$i].PSObject.Properties.Value -join ",") -ne ($objectSheetData[$i] -join ",")) {
 +            $rowsMatch = $false
 +            break
 +        }
 +    }
 +} else {
 +    $rowsMatch = $false
 +}
 +if (-not $rowsMatch) {
 +    $UpdateSheetSummary += "・オブジェクト更新"
 +}
 +
 +# 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較
 +$polisyCsv = Import-Csv -Path "Polisy.csv"
 +$polisySheetHeaders = $worksheetPolisy.Rows.Item(1).Cells.Value2
 +$polisySheetData = $worksheetPolisy.Range("A2", $worksheetPolisy.Cells.SpecialCells("xlCellTypeLastCell")).Value2
 +$headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join ",") -eq ($polisySheetHeaders | Select-Object -First 8 -join ",")
 +
 +if ($headersMatch) {
 +    $rowsMatch = $true
 +    for ($i = 0; $i -lt $polisyCsv.Count; $i++) {
 +        if (($polisyCsv[$i].PSObject.Properties.Value | Select-Object -First 8 -join ",") -ne ($polisySheetData[$i] | Select-Object -First 8 -join ",")) {
 +            $rowsMatch = $false
 +            break
 +        }
 +    }
 +} else {
 +    $rowsMatch = $false
 +}
 +if (-not $rowsMatch) {
 +    $UpdateSheetSummary += "・ポリシ"
 +}
 +
 +# 履歴シートの更新
 +$lastUpdateRow = ($worksheetHistory.Cells["C:C"].Where({$_.Value -ne $null}) | Select-Object -Last 1).Start.Row
 +$updateRow = $lastUpdateRow + 3
 +$worksheetHistory.Cells.Item($updateRow, "C").Value2 = $worksheetHistory.Cells.Item(2, "W").Value2 + 1
 +$worksheetHistory.Cells.Item($updateRow, "H").Value2 = $worksheetHistory.Cells.Item(2, "AB").Value2
 +$worksheetHistory.Cells.Item($updateRow, "M").Value2 = $UpdateSheetSummary
 +$worksheetHistory.Cells.Item($updateRow, "R").Value2 = (Get-Date).ToString("yyyy/MM/dd") + " " + $UpdateSheetSummary + "`r`n`r`n"
 +
 +# バックアップを作成
 +$backupFileName = $worksheetHistory.Cells.Item(2, "AB").Value2.Replace("/", "") + "_TEST.xlsx"
 +$workbook.SaveCopyAs("C:\path\to\backup\$backupFileName")
 +
 +# 変更を保存し、Excelを閉じる
 +$workbook.Save()
 +$workbook.Close()
 +$excel.Quit()
 +
 +# COMオブジェクトの解放
 +[System.Runtime.InteropServices.Marshal]::ReleaseComObject($worksheetHistory)
 +[System.Runtime.InteropServices.Marshal]::ReleaseComObject($worksheetObject)
 +[System.Runtime.InteropServices.Marshal]::ReleaseComObject($worksheetPolisy)
 +[System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook)
 +[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
 +
 +</code>
 +
 +
 +====== 更新前 ======
 <code> <code>
 +function Get-Range {
 +    param (
 +        $worksheet,
 +        $range
 +    )
 +    $rows = $range.Rows.Count
 +    $cols = $range.Columns.Count
 +    $array = New-Object 'object[,]' $rows,$cols
 +    for ($r = 1; $r -le $rows; $r++) {
 +        for ($c = 1; $c -le $cols; $c++) {
 +            $array[$r-1, $c-1] = $worksheet.Cells.Item($r, $c).Value2
 +        }
 +    }
 +    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 "Object.csv" $objectCsv = Import-Csv -Path "Object.csv"
-$objectSheet = $worksheetObject.UsedRange.Value2 +$headersMatch = ($objectCsv[0].PSObject.Properties.Name -join ",") -eq ($objectSheet[0,] -join ",")
-$headersMatch = ($objectCsv[0].PSObject.Properties.Name -join ",") -eq ($objectSheet[0] -join ",")+
 if ($headersMatch) { if ($headersMatch) {
     $rowsMatch = $true     $rowsMatch = $true
     for ($i = 0; $i -lt $objectCsv.Count; $i++) {     for ($i = 0; $i -lt $objectCsv.Count; $i++) {
-        if (($objectCsv[$i].PSObject.Properties.Value -join ",") -ne ($objectSheet[$i + 1] -join ",")) {+        if (($objectCsv[$i].PSObject.Properties.Value -join ",") -ne ($objectSheet[$i + 1,] -join ",")) {
             $rowsMatch = $false             $rowsMatch = $false
             break             break
行 54: 行 155:
 # 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較 # 2. シート「ポリシ」とCSVファイル「Polisy.csv」を比較
 $polisyCsv = Import-Csv -Path "Polisy.csv" $polisyCsv = Import-Csv -Path "Polisy.csv"
-$polisySheet = $worksheetPolisy.UsedRange.Value2 +$headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join ",") -eq ($polisySheet[0,0..7] -join ",")
-$headersMatch = ($polisyCsv[0].PSObject.Properties.Name | Select-Object -First 8 -join ",") -eq ($polisySheet[0] | Select-Object -First 8 -join ",")+
 if ($headersMatch) { if ($headersMatch) {
     $rowsMatch = $true     $rowsMatch = $true
     for ($i = 0; $i -lt $polisyCsv.Count; $i++) {     for ($i = 0; $i -lt $polisyCsv.Count; $i++) {
-        if (($polisyCsv[$i].PSObject.Properties.Value | Select-Object -First 8 -join ",") -ne ($polisySheet[$i + 1] | Select-Object -First 8 -join ",")) {+        if (($polisyCsv[$i].PSObject.Properties.Value | Select-Object -First 8 -join ",") -ne ($polisySheet[$i + 1,0..7] -join ",")) {
             $rowsMatch = $false             $rowsMatch = $false
             break             break
行 93: 行 193:
 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook) [System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook)
 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
 +
 </code> </code>
-失礼しました。$objectSheetには、2次元配列としてシート全体の値が含まれているため、列名を取得する方法が異なります。以下の方法でシート「オブジェクト」の1行目(A行)の要素を取得してみてください。 + 
-<code> +
-$objectSheetHeaders = ($objectSheet | Select-Object -First 1 | ForEach-Object { $_ -join "," }).Split(","+
-</code> +
-これで、$objectSheetHeadersにシート「オブジェクト」の1行目(A行)の要素が含まれます。次に、$headersMatchを以下のように修正してください。 +
-<code> +
-$headersMatch = ($objectCsv[0].PSObject.Properties.Name -join ",") -eq ($objectSheetHeaders -join ","+
-</code> +
-この変更により、正確にシート「オブジェクト」の1行目(A行)の要素を比較できるようになります。同様の方法で、他のシートのヘッダーを比較する部分も修正してください。+
  
 ====== 要件更新前 ====== ====== 要件更新前 ======
powershell/excelをcsvから更新1.1681180357.txt.gz · 最終更新: 2023/04/11 02:32 by 180.46.4.12

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki