2015-01-14 3 views
0

Хорошо, пришло время для начала этого вопроса. Я нашел следующий скрипт http://blogs.technet.com/b/heyscriptingguy/archive/2010/09/09/copy-csv-columns-to-an-excel-spreadsheet-by-using-powershell.aspxФункция Powershell импортирует несколько CSV в рабочую книгу Excel

Вопрос: как я могу получить 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

Этот подход является медленным. Не можете ли вы открыть CSV непосредственно в Excel и скопировать листы в новую книгу? Что касается ошибки, которую вы получаете: объекты рабочего листа не имеют свойства «Worksheets» (они не содержат других рабочих листов). –

+0

Допустим, я просто бросаю дротики на примерах кода, пытаясь придумать что-то работоспособное. Я не нашел образец кода, который открывает любое количество CSV, а затем перемещает их в Excel и переименовывает рабочий лист. – user4317867

ответ

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)

+0

Спасибо за это! Он делает именно то, что моя цель, однако, есть диапазон ячеек на каждом листе, который все еще выделен. Я знаю, что метод 'unselect' имеет место, чтобы отменить выбор, как только рабочий лист будет добавлен, но он ускользает от меня в данный момент. – user4317867

+0

Ум, просто добавьте одну строку перед сохранением '$ Excel.ActiveSheet.Range (« A1: A1 »). Выберите()', и это просто сделает первую ячейку текущего листа единственным выбранным. – TheMadTechnician

+0

Ушел в проблему с оператором, потому что у меня есть Powershell v4 на моей рабочей станции, и я не могу ожидать, что все, кто будет использовать это, будут иметь PS v4. Любые другие идеи? – user4317867

Смежные вопросы