複数csvファイルをexcelの各シートに書込む2
前回powershellを使い複数のcsvをそれぞれのシートに分けて新規Excelファイルとして書き込む方法についてお教え頂きましたが、既存ファイルの場合下記の下記のコードのようにすると既存シートがある場合既存のシートにシート名を変え書き加えられることになります。既存シートをそのままにして新規シートとして追加するような方法をお教えください。
$csvFiles = @("D:\test_data\test_data1.csv", "D:\test_data\test_data2.csv")
# Excelファイルのパス
$excelPath = (Get-ChildItem "D:\test_data\AAA.xlsx").FullName
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$book = $excel.Workbooks.Open($excelPath)
foreach ($index in 0..($csvFiles.Length - 1)) {
if ($index -eq 0) {
$sheet = $book.Sheets.Item(1)
} else {
$sheet = $book.Sheets.Add()
}
$sheet.Name = "data" + ($index + 1)
$startRange = "C2"
$QueryTable = $sheet.QueryTables.Add("TEXT;"+$csvFiles[$index], $sheet.Range($startRange))
$QueryTable.TextFileCommaDelimiter = $True
$QueryTable.TextFilePlatform = 65001
$QueryTable.TextFileStartRow = 1
$QueryTable.Refresh($false)
$QueryTable.Name = "仮テーブル"
$QueryTable.Delete()
}
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) > $null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($book) > $null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) > $null
Remove-Variable sheet, book, excel
[gc]::Collect()
[GC]::WaitForPendingFinalizers()
なお、csvファイルの指定方法は違います(ファイル名で指定する方が分からないのでコピペのコードそのままに近い)がExport-Excelを使った下記コード場合同じシート名がある場合は、そのシートに書き込まれますがそれ以外は新規シート名(csvファイル名)として付け加えられます。
$csvs = Get-ChildItem .\* -Include *.csv
$csvCount = $csvs.Count
Write-Host "Detected the following CSV files: ($csvCount)"
foreach ($csv in $csvs) {
Write-Host " -"$csv.Name
}
$excelFileName = "D:\test_data\AAD.xlsx."
Write-Host "Creating: $excelFileName"
foreach ($csv in $csvs) {
$csvPath = ".\" + $csv.Name
$worksheetName = $csv.Name.Replace(".csv","")
Write-Host " - Adding $worksheetName to $excelFileName"
Import-Csv -Path $csvPath | Export-Excel -Path $excelFileName -WorkSheetname $worksheetName -StartRow 2 -StartColumn 3
}
しかしならこの方法では大きなデータの場合処理時間を要することになります。処理時間で言うなら下記コードの方が一番速いですがやはり新規シートに置き換えられる問題があります。
$sourceFiles = @("D:\test_data\test_data1.csv", "D:\test_data\test_data2.csv")
$outputFile = "D:\test_data\AAE.xlsx"
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$outputWorkbook = $excel.Workbooks.Add()
$index=1;
foreach ($sourceFile in $sourceFiles) {
$workbook = $excel.Workbooks.Open($sourceFile)
foreach ($sheet in $workbook.Sheets) {
$sheet.Copy([ref]$outputWorkbook.Sheets.Item($outputWorkbook.Sheets.Count))
}
$index=$outputWorkbook.Sheets.Count
$workbook.Close($false);
}
$outputWorkbook.Sheets.Item($index).Delete()
$outputWorkbook.SaveAs($outputFile);
$excel.Quit();
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($outputWorkbook) | Out-Null;
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null;
Write-Output "Sheets have been combined into $outputFile";
私のコピペ能力ではここまでです。シート名が同じの場合は上書きされそれ以外は新規シートとして追加される方法になれば幸いです。よろしくお願いいたします。
お礼
ご回答ありがとうございました。いろいろ試みたのですが、どうにも行きつけません。ご回答のURLを参考にもう少し頑張ってみます。