Мне нужно разделить и сохранить файл Excel на основе значений первого столбца с помощью сценария powershell. Вот как создается файл Excel (около 30 000 строк)

´´´Column1 # Column2 # Column3´´´
´´´AA # data # data # data´´´
´´´AA # data # data # data´´´
´´´AB # data # data # data´´´
´´´AC # data # data # data´´´
´´´AC # data # data # data´´´

Результатом должно быть несколько файлов с именами файлов AA.xlxs, AB.xlxs, AC.xlxs и, конечно, соответствующими данными строк.

То, что у меня есть, это следующий код:

$objexcel = New-Object -ComObject Excel.Application
$wb = $objexcel.WorkBooks.Open("C:\Test.xlsx")
$objexcel.Visible = $true
$objexcel.DisplayAlerts = $False
$ws = $wb.Worksheets.Item(1)
$doc = $ws.Range("A:A")

foreach ($doc in $docs) {
$newfile,$objexcel = $objexcel.where({$doc -eq $doc})
$newfile | Export-Excel "C:\$doc.xlxs"
}

Он просто открывает файл, но ничего не происходит. Было бы здорово, если бы какой-нибудь кодировщик мог взглянуть на код или предоставить работающий. Заранее спасибо.

1
Pillic 4 Фев 2020 в 18:17

2 ответа

Лучший ответ

Ниже приведен рабочий код, который будет перебирать уникальные элементы в первом столбце, делать его копию в новой электронной таблице и сохранять ее.

Function Create-Excel-Spreadsheet {
    Param($NameOfSpreadsheet)

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

    # add a worksheet
    $workbook = $excel.Workbooks.Add()
    $xl_wksht= $workbook.Worksheets.Item(1)
    $xl_wksht.Name = $NameOfSpreadsheet

    return $workbook
}


$objexcel = New-Object -ComObject Excel.Application
$wb = $objexcel.WorkBooks.Open("C:\Temp\Test.xlsx") # Changing path for test.xlsx file.

$objexcel.Visible = $true
$objexcel.DisplayAlerts = $False
$ws = $wb.Worksheets.Item(1)

$usedRange = $ws.UsedRange
$usedRange.AutoFilter()

$totalRows = $usedRange.Rows.Count


$rangeForUnique = $usedRange.Offset(1, 0).Resize($UsedRange.Rows.Count-1) 
[string[]]$UniqueListOfRowValues = $rangeForUnique.Columns.Item(1).Value2 | sort -Unique

for ($i = 0; $i -lt $UniqueListOfRowValues.Count; $i++) {
    $newRange = $usedRange.AutoFilter(1, $UniqueListOfRowValues[$i])

    $workbook = Create-Excel-Spreadsheet $UniqueListOfRowValues[$i]
    $wksheet = $workbook.Worksheets.Item(1)

    $range = $ws.UsedRange.Cells
    $range.Copy()

    $wksheet.Paste($wksheet.Range("A1"))
    $workbook.SaveAs("C:\temp\" + $UniqueListOfRowValues[$i], $xlFixedFormat)
    $workbook.Close()
}
1
halfer 9 Фев 2020 в 20:34

Причина в том, что ничего не происходит, потому что вы перебираете $docs, который не содержит никаких элементов. Это в настоящее время нуль.

Когда вы делаете ссылку для поиска данных, вы используете $ objexcel, но это ваше приложение Excel ... а не рабочий лист, который вы хотите перебрать. Используйте $ as для доступа к рабочему листу.

Вам нужно перебрать Cells ваших $ ws и взять данные, когда cell.Item (x, 0), и создать новый файл на основе этого со значениями в двух других столбцах.

Ссылка на пример в SO -> Создать и обновить файл Excel

1
Joe 4 Фев 2020 в 20:22