test

# 元のExcelファイルのパス
$originalFilePath = "C:\Path\to\Original\File.xlsx"

# 分割されたファイルの保存先ディレクトリ
$outputDirectory = "C:\Path\to\Output\Directory"

# 1万件ごとに分割する行数
$rowLimit = 10000

# Excelオブジェクトを作成
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false

# ワークブックを開く
$workbook = $excel.Workbooks.Open($originalFilePath)
$worksheet = $workbook.Worksheets.Item(1)

# 列名を取得して保存用の配列に追加
$columnNames = @()
$worksheet.Rows.Item(1).Columns | ForEach-Object {
   $columnName = $_.Text
   $columnNames += $columnName
}

# 元ファイルの行数を取得
$rowCount = ($worksheet.UsedRange.Rows).Count

# 分割処理
for ($startRow = 2; $startRow -le $rowCount; $startRow += $rowLimit) {
   $endRow = $startRow + $rowLimit - 1
   if ($endRow -gt $rowCount) {
       $endRow = $rowCount
   }

   # 新しいワークブックを作成
   $newWorkbook = $excel.Workbooks.Add()
   $newWorksheet = $newWorkbook.Worksheets.Item(1)

   # 列名を新しいワークブックに追加
   for ($col = 1; $col -le $columnNames.Count; $col++) {
       $newWorksheet.Cells.Item(1, $col) = $columnNames[$col - 1]
   }

   # データをコピー
   $range = $worksheet.Range($worksheet.Cells.Item($startRow, 1), $worksheet.Cells.Item($endRow, $columnNames.Count))
   $destinationRange = $newWorksheet.Range("A2").Resize($range.Rows.Count, $range.Columns.Count)
   $range.Copy($destinationRange)

   # 新しいファイルに保存
   $newFilePath = Join-Path -Path $outputDirectory -ChildPath ("Split_" + $startRow + "-" + $endRow + ".xlsx")
   $newWorkbook.SaveAs($newFilePath)
   $newWorkbook.Close()
}

# オブジェクトの解放
$workbook.Close()
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($worksheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

Write-Host "分割が完了しました。"

いいなと思ったら応援しよう!