将CSV传递给Excel工作簿(不是来自文件)

时间:2017-07-18 14:35:03

标签: excel vba powershell csv

我有一个包含日志条目的CSV文件夹。对于CSV的每个条目,如果Risk属性不是Low而不是None,那么我将它放在累积CSV对象中。从那里,我想直接将其导入Excel工作簿而无需将CSV保存到文件

$CSVPaths = (Split-Path $PSCommandPath)
$AccumulateExportPath = (Split-Path $PSCommandPath)
$FileName="Accumulate"
$Acc=@()

Foreach ($csv in (Get-ChildItem C:\Scripts\Nessus\Sheets |? {$_.Extension -like ".csv" -and $_.BaseName -notlike "$FileName"}))
{
    $Content = Import-CSV $csv.FullName
    Foreach ($Log in $Content)
    {
        If ($Log.Risk -ne "None" -and $Log.Risk -ne "Low")
        {
            $Acc+=$Log
        }
    }
}

$CSV = $ACC |ConvertTo-CSV -NoTypeInformation

Add-Type -AssemblyName Microsoft.Office.Interop.Excel
$Script:Excel = New-Object -ComObject Excel.Application
$Excel.Visible=$True
#$Excel.Workbooks.OpenText($CSV) What should replace this?

是否有像[{3}}这样的方法可以让我将CSV 对象而不是文件路径传递给CSV文件,或者我将不得不写我自己的转换功能?

2 个答案:

答案 0 :(得分:1)

有趣的问题。我不知道允许您传递CSV 对象的方法。

但是,如果您的结果CSV不是太大而且您使用的是PowerShell 5.0+,则可以将对象转换为字符串并利用Set-Clipboardmore info)< / p>

$headers =  ($csv | Get-Member | Where-Object {$_.MemberType -eq "NoteProperty"}).Name
$delim   = "`t"

# headers
foreach($header in $headers){
    $myString += $header + $delim
}

# trim delimiter at the end, and add new line
$myString = $myString.TrimEnd($delim)
$myString = $myString + "`n"

# loop over each line and repeat
foreach($line in $csv){
    foreach($header in $headers){
        $myString += $line.$header + $delim
    }
    $myString = $myString.TrimEnd($delim)
    $myString = $myString + "`n"
}

# copy to clipboard
Set-Clipboard $myString

# paste into excel from clipboard
$Excel.Workbooks.Worksheets.Item(1).Paste()

答案 1 :(得分:0)

这是另一种从PowerShell创建Excel电子表格而无需编写.csv文件的方法。

$dirs = 'C:\src\t', 'C:\src\sql'

$records = $()
$records = foreach ($dir in $dirs) {
    Get-ChildItem -Path $dir -File '*.txt' -Recurse |
        Select-Object @{Expression={$_.FullName}; Label="filename"}
    }

#open excel
$excel = New-Object -ComObject excel.application
$excel.visible = $false

#add a default workbook

$workbook = $excel.Workbooks.Add()
#remove worksheet 2 & 3

$workbook.Worksheets.Item(3).Delete()
$workbook.Worksheets.Item(2).Delete()

#give the remaining worksheet a name
$uregwksht = $workbook.Worksheets.Item(1)
$uregwksht.Name = 'File Names'

# Start on row 1
$i = 1

# the .appendix to $record refers to the column header in the csv file
foreach ($record in $records) {
    $excel.cells.item($i,1) = $record.filename
    $i++
}

#adjusting the column width so all data's properly visible
$usedRange = $uregwksht.UsedRange
$usedRange.EntireColumn.AutoFit() | Out-Null

#saving & closing the file
$outputpath = Join-Path -Path $Env:USERPROFILE -ChildPath "desktop\exceltest.xlsx"
$workbook.SaveAs($outputpath)
$excel.Quit()