Разделить Excelfile .xlxs с помощью Powershell на основе значений столбцов - PullRequest
1 голос
/ 04 февраля 2020

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

´´´Column1 # Column2 # Column3´´´ ´´´AA # data # data # data´´´ ´´´AA # data # data # data´´´ ´´´AB # data # data # data´´´ ´´´A C # data # data # data´´´ ´´´A C # data # data # data´´´

Результатом должно быть несколько файлов с именами файлов AA.xlxs, AB.xlxs, A C .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"
}

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

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

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

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 голос
/ 04 февраля 2020

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...