使用选项卡将CSV文件合并到XLSX中

时间:2017-04-17 21:17:15

标签: excel powershell csv merge

我目前有一个在PowerShell脚本中创建的5个注册表CSV文件:

  • HKCC
  • HKCR
  • HKCU
  • HKLM
  • HKU

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

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

我了解如何获取CSV文件的数据,但不了解如何合并或转换。我认为可能有用的一些变量。

$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文件的路径:

F:\Registry_Export\Results\$DIR\$Date\HKCR.CSV
F:\Registry_Export\Results\$DIR\$Date\HKCU.CSV
F:\Registry_Export\Results\$DIR\$Date\HKLM.CSV
F:\Registry_Export\Results\$DIR\$Date\HKU.CSV
F:\Registry_Export\Results\$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

2 个答案:

答案 0 :(得分:2)

所以,仍然使用Excel.Application ComObject,我建议将每个CSV加载为CSV,而不是像你一样使用Get-Content。然后使用ConvertTo-CSV cmdlet,指定使用tab作为分隔符,并将其复制到剪贴板。然后只需粘贴到Excel中,它就会很好地粘贴。您可能希望调整列大小,但数据将按照您的预期显示。我也会使用For循环而不是ForEach循环,因为Excel可以很好地使用标签的数字(虽然它是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()
}

答案 1 :(得分:0)

您可以使用ImportExcel by Doug Finke然后将原始脚本中的Export-CSV替换为Export-Excel -WorksheetName

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"