Как использовать PowerShell для записи содержимого файлов в разные строки в Excel - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь автоматизировать следующую задачу, выполняемую вручную, и борюсь с ее частью:

1) Откройте текстовый файл, содержащий несколько строк с данными.

2) Скопируйте содержимое этого файла в буфер обмена.

3) Откройте электронную таблицу и таблицу Excel.

4) Переименуйте электронную таблицу в Test.

5) Вставьте содержимое буфера обмена.

Когда это делается вручную, содержимое вставляется, и каждая строка в текстовом файле вставляется как новая строка в столбце A.

Изначально клиент хотел, чтобы все содержимое файла было введено в клетку A1. Я смог добиться этого с помощью приведенного ниже кода PowerShell.

Однако с тех пор они изменили это значение на то, что каждая строка текста должна go выделяться в отдельную строку в столбце A.

I не могу понять, как сделать это изящно с помощью метода Get-Content, копируя текстовые данные. Я видел обходные пути к этой проблеме, когда Excel открывает текстовый файл и копирует текст в промежуточную рабочую книгу, а затем в окончательную рабочую книгу.

Может кто-нибудь сообщить мне, если возможно изменить мой уже работающий код ниже чтобы он добавлял текст в строки в столбце A, а не в ячейку A1?

# Clear the screen of any previous text.
cls

$ExcelFile="C:\Users\User\Desktop\Test\Test.xlsx"
$TextFile="C:\Users\User\Desktop\Test\TestText.txt"
$Content = Get-Content $TextFile -Raw

# Perform operations in Excel based on content of the downloaded file.
$Excel = New-Object -ComObject Excel.Application

# For troubleshooting enable the below to view Excel as file is manipulated:
#$Excel.Visible=$true
# Disable Excel alerts. Hash this line out for troubleshooting.
$Excel.DisplayAlerts = $false

# Set up workbook...
$Workbook = $Excel.Workbooks.Add()
$Data = $Workbook.Worksheets.Item(1)
$Data.Name = 'Test'

# Insert Data   
$Data.Cells.Item(1,1) = "$Content"

# Format, save and quit excel
$UsedRange = $Data.UsedRange                                                                                              
$UsedRange.EntireColumn.AutoFit() | Out-Null
$Workbook.SaveAs("$ExcelFile")
$Excel.Quit()

Я знаю, что часть, которую мне нужно изменить, выглядит следующим образом, но я не уверен, что нужно изменить до:

# Insert Data   
$Data.Cells.Item(1,1) = "$Content"

Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Для этого вам нужно найти последнюю использованную строку на листе и написать каждую строку оттуда:

$ExcelFile = "C:\Users\User\Desktop\Test\Test.xlsx"
$TextFile  = "C:\Users\User\Desktop\Test\TestText.txt"

# Perform operations in Excel based on content of the downloaded file.
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$Excel.DisplayAlerts = $false

# open the file and select the first worksheet
$WorkBook  = $Excel.Workbooks.Open($ExcelFile)
$WorkSheet = $Workbook.Worksheets.Item(1)
# get the first unused row
$row = ($WorkSheet.UsedRange.Rows).Count + 1
# fill in the data
Get-Content -Path $TextFile | ForEach-Object {
    $WorkSheet.Cells.Item($row++, 1) = $_
}

# format column A and save the file
$UsedRange = $WorkSheet.UsedRange                                                                                              
$UsedRange.EntireColumn.AutoFit() | Out-Null
$WorkBook.Save()

# quit excel and clean up the used COM objects
$Excel.Quit()
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($WorkSheet)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($WorkBook)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
0 голосов
/ 24 марта 2020

Я думаю, что решением было бы прочитать каждую строку в содержании с помощью for или foreach l oop

в l oop, записать содержимое строки в последнюю строку столбца A в файле Excel .

Это будет примерно так

foreach($line in $Content){
   $Data.Cells.Item($LastRow,1) = $line


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