Как скопировать значение столбца из excel в txt файл - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в Power Shell. У меня есть несколько файлов excel (500+), в которых есть столбец Animal Count, который я хотел бы сохранить в новом файле .txt. Может ли кто-нибудь дать мне совет, как этого добиться.

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Попробуйте это для 1 файла, сохраненного в txt с тем же именем. это можно сделать для большего количества файлов с помощью параметров foreach

$FileName = "C:\temp\test.xlsx"
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $false
$Excel.DisplayAlerts = $false
$WorkBook = $Excel.Workbooks.Open($FileName)
$NewFilePath = [System.IO.Path]::ChangeExtension($FileName,".txt")
$Workbook.SaveAs($NewFilepath, 42)   # xlUnicodeText
  # cleanup
$Excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($WorkBook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
0 голосов
/ 12 мая 2020

Глядя на предоставленное вами изображение, значение счетчика находится не в столбце «Количество животных», а в столбце рядом с меткой с этим текстом.

Что касается Тип вывода, я бы рекомендовал не использовать файл .txt, а выводить найденную информацию в виде файла CSV, чтобы сохранить имена файлов и значения количества животных в структурированном виде.

Попробуйте:

$Source = 'D:\Test'  # the path to where the Excel files are

# create an Excel COM object
$excel  = New-Object -ComObject Excel.Application 

# find Excel files in the Source path and loop through.
# you may want to add the -Recurse switch here if the code should also look inside subfolders
$result = Get-ChildItem -Path $Source -Filter '*.xlsx' -File | ForEach-Object {
    $workBook  = $excel.Workbooks.Open($_.FullName)
    $workSheet = $Workbook.Sheets.Item(1)
    $count     = 0
    $label     = $WorkSheet.Cells.Find('*Animal count*')
    if ($label) {
        # get the numeric value for the cell next to the label
        # empty cells will translate to 0
        $count = [int]$workSheet.Cells.Item($label.Row, $label.Column + 1).Value()
    }
    # output a PSObject with the full filename and the animal count value
    [PsCustomObject] @{
        'File'        = $_.FullName
        'AnimalCount' = $count
    }
    $workBook.Close()
}

# quit Excel and clean up the used COM objects
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workSheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workBook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()


# output on screen
$result | Format-Table -AutoSize

#output to CSV file
$result | Export-Csv -Path 'D:\Test\AnimalCount.csv' -UseCulture -NoTypeInformation

Результат на экране будет выглядеть примерно так:

File               AnimalCount
----               -----------
D:\Test\File1.xlsx         165
D:\Test\File2.xlsx           0
D:\Test\File3.xlsx       87596


Edit

Поскольку вы прокомментировали метки находятся в объединенных ячейках , вам нужно использовать это, чтобы найти значение для Animal count:

$label = $workSheet.Range('$A:$B').Find('*Animal count*')

if ($label) {
    # get the numeric value for the cell next to the label
    # empty cells will translate to 0
    $count = [int]$workSheet.Cells.Item($label.Row, $label.Column + 2).Value()
}

Предполагается, что две ячейки объединены в одну.

PS Если количество животных может превысить 2147483647, приведите к [int64] вместо [int]

0 голосов
/ 06 мая 2020

Вы можете использовать Import-Csv, чтобы превратить файл excel в объект PS, и столбцы будут свойствами нового объекта.

$excel = Import-Csv $excelPath
$excel.Animals | out-file $txtPath
...