将CSV文件合并到带有选项卡的XLSX中

我目前有5个在PowerShell脚本中创build的registryCSV文件:

  • 文化中心
  • HKCR
  • HKCU
  • HKLM
  • 香港大学

我需要在脚本的末尾打开这些CSV文件,但是如果所有这些文件都包含在一个包含5个不同标题的XLSX文件中

有没有办法通过PowerShell结合文件?

我知道如何获取CSV文件的数据,但不知道如何合并或转换。 我相信一些可能有用的variables。

$Date = Get-Date -Format "d.MMM.yyyy" $DIR = $WPFlistview.Selecteditem.Ransomware $path = "F:\Registry_Export\Results\$DIR\$Date\*" $csvs = Get-ChildItem $path -Include *.csv $output = "F:\Registry_Export\Results\$DIR\$Date\Results.Xlsx" 

如果需要,可以到CSV文件的path:

 F:\ Registry_Export \结果\ $ DIR \ $date\ HKCR.CSV
 F:\ Registry_Export \结果\ $ DIR \ $date\ HKCU.CSV
 F:\ Registry_Export \结果\ $ DIR \ $date\ HKLM.CSV
 F:\ Registry_Export \结果\ $ DIR \ $date\ HKU.CSV
 F:\ Registry_Export \结果\ $ DIR \ $date\ HKCC.CSV

这是我以前试过的。 但是,它完全将我的数据拼凑成错误的行和单元格:

 function MergeCSV { $Date = Get-Date -Format "d.MMM.yyyy" $DIR = $WPFlistview.Selecteditem.Ransomware $path = "F:\Registry_Export\Results\$DIR\$Date\*" $csvs = Get-ChildItem $path -Include *.csv $y = $csvs.Count Write-Host "Detected the following CSV files: ($y)" foreach ($csv in $csvs) { Write-Host " "$csv.Name } $outputfilename = "Final Registry Results" Write-Host Creating: $outputfilename $excelapp = New-Object -ComObject Excel.Application $excelapp.SheetsInNewWorkbook = $csvs.Count $xlsx = $excelapp.Workbooks.Add() $sheet = 1 foreach ($csv in $csvs) { $row = 1 $column = 1 $worksheet = $xlsx.Worksheets.Item($sheet) $worksheet.Name = $csv.Name $file = (Get-Content $csv) foreach ($line in $file) { $linecontents = $line -split ',(?!\s*\w+")' foreach ($cell in $linecontents) { $worksheet.Cells.Item($row,$column) = $cell $column++ } $column = 1 $row++ } $sheet++ } $output = "F:\Registry_Export\Results\$DIR\$Date\Results.Xlsx" $xlsx.SaveAs($output) $excelapp.Quit() } 

CSV的样子https://gyazo.com/177c7c3bb21ddf06d0ebacbb7f4d537b

XLSX的外观如何https://gyazo.com/cd5fb48d61f93aac5ec3034d81811094

您可以使用Doug Finke的ImportExcel然后使用Export-Excel -WorksheetName将原始脚本中的Export-CSVreplace

 Install-Module ImportExcel Export-Excel "F:\Registry_Export\Results\$DIR\$Date\Results.xlsx" -worksheetname "HKCR" Export-Excel "F:\Registry_Export\Results\$DIR\$Date\Results.xlsx" -worksheetname "HKCU" 

因此,仍然使用Excel.Application ComObject,我会build议加载每个CSV作为CSV,而不是像你一样使用Get-Content 。 然后使用ConvertTo-CSV cmdlet,指定使用制表符作为分隔符,并将其复制到剪贴板。 然后只需粘贴到Excel中,它会很好地粘贴。 您可能需要调整列大小,但是数据会按照您的预期显示。 我也会使用For循环而不是ForEach循环,因为Excel可以很好地处理选项卡的数字(尽pipe它是基于1而不是PowerShell的0基础)。 这是我做了这些修改后最终得到的结果:

 function MergeCSV { $Date = Get-Date -Format "d.MMM.yyyy" $DIR = $WPFlistview.Selecteditem.Ransomware $path = "F:\Registry_Export\Results\$DIR\$Date\*" $csvs = Get-ChildItem $path -Include *.csv $y = $csvs.Count Write-Host "Detected the following CSV files: ($y)" Write-Host " "$csvs.Name"`n" $outputfilename = "Final Registry Results" Write-Host Creating: $outputfilename $excelapp = New-Object -ComObject Excel.Application $excelapp.SheetsInNewWorkbook = $csvs.Count $xlsx = $excelapp.Workbooks.Add() for($i=1;$i -le $y;$i++) { $worksheet = $xlsx.Worksheets.Item($i) $worksheet.Name = $csvs[$i-1].Name $file = (Import-Csv $csvs[$i-1].FullName) $file | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | Clip $worksheet.Cells.Item(1).PasteSpecial()|out-null } $output = "F:\Registry_Export\Results\$DIR\$Date\Results.Xlsx" $xlsx.SaveAs($output) $excelapp.Quit() }