好的,是时候开始这个问题了。我找到了以下脚本http://blogs.technet.com/b/heyscriptingguy/archive/2010/09/09/copy-csv-columns-to-an-excel-spreadsheet-by-using-powershell.aspx
我的问题是如何让powershell为任意数量的CSV文件循环该脚本。脚本的速度并不重要。我收到了一些答案,在某种程度上,他们有问题。使用Technet脚本提供正确的输出。
我已经想出了这个,但是很难让代码循环遍历多个CSV文件。
Function Excel-Stuff {
[cmdletBinding()]
Param([Parameter(ValueFromPipeline=$true)][string]$junk)
$excel.cells.item(1,1) = "Server"
$excel.cells.item(1,2) = "Rack"
$excel.cells.item(1,3) = "Environment"
$excel.cells.item(1,4) = "RebootTime"
$excel.cells.item(1,5) = "Schedule"
$i = 2
$processes = Import-Csv 'C:\Monday.csv'
foreach ($process in $processes){
$excel.cells.item($i,1) = $process.Server
$excel.cells.item($i,2) = $process.Rack
$excel.cells.item($i,3) = $process.Environment
$excel.cells.item($i,4) = $process.RebootTime
$excel.cells.item($i,5) = $process.Schedule
$i++
} #end foreach process
$autofit = $Global:worksheet.UsedRange
$autofit.EntireColumn.AutoFit() | Out-Null
}#End Function.
$Excel = New-Object -ComObject excel.application
$workbook = $Excel.workbooks.add(1)
$Global:worksheet = $workbook.WorkSheets.Item(1)
$Global:worksheet.Name='Monday'
Excel-Stuff
$Excel.visible = $True
答案 0 :(得分:0)
好的,让我们不要这么做。复制/粘贴是你的朋友,你可以在这里轻松完成。
你有星期一到星期五的标签,我假设有7个CSV文件。循环这个东西7次,并在每个循环中创建一个选项卡,命名它,然后复制整个CSV,将其转换为制表符分隔的CSV,并将其传递给CLIP.exe。然后只需在当前工作表上选择A1并粘贴。使用下一个CSV文件开始下一个循环。
$path = "c:\tmp\mytest.xlsx"
$day = @("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
$Excel = New-Object -ComObject excel.application
$Excel.visible = $false
$workbook = $Excel.workbooks.add(1)
$day | %{
$processes = Import-Csv -Path "D:\Scripts\work\$_.csv"
$worksheet = $workbook.WorkSheets.add()
$processes | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | Clip.exe
$worksheet.select()
$worksheet.Name = $_
[void]$Excel.ActiveSheet.Range("A1:A1").Select()
[void]$Excel.ActiveCell.PasteSpecial()
[void]$worksheet.UsedRange.EntireColumn.AutoFit()
}
#Clean up extra sheets
$Excel.DisplayAlerts = $false
$workbook.Worksheets|?{$day -notcontains $_.name}|%{$_.Delete()}
$Excel.DisplayAlerts = $true
[void]$Excel.ActiveSheet.Range("A1:A1").Select()
$workbook.saveas($path)
$Excel.Quit()
Remove-Variable -Name excel
[gc]::collect()
[gc]::WaitForPendingFinalizers()
然后您唯一关心的是CSV文件的顺序正确。如果你将你的CSV文件命名为Monday.csv,Tuesday.csv等,这可能会更简单,但只要它们被命名为星期一是第一个,并且它按字母数字顺序排列你就可以了那段代码。
(编辑以反映保存前单个单元格选择的注释建议,并将-notin更改为-notcontains)