Назад | Перейти на главную страницу

Как читать данные ячеек в Excel и выводить их в командную строку

Я системный администратор и пытаюсь научиться использовать PowerShell ... Я никогда раньше не создавал никаких сценариев или кодирования, и я учился онлайн, изучая центр скриптов technet и онлайн-форумы.

Я пытаюсь открыть электронную таблицу Excel, получить от нее информацию (имена пользователей и пароль), а затем вывести ее в командную строку в PowerShell. Когда я когда-либо пытаюсь это сделать, я все равно получаю исключение, вызывающее "InvokeMember", вот код, который у меня есть:

 
function Invoke([object]$m, [string]$method, $parameters)
{
$m.PSBase.GetType().InvokeMember(
$method, [Reflection.BindingFlags]::InvokeMethod, $null, $m, $parameters,$ciUS )
} 

$ ciUS = [System.Globalization.CultureInfo] 'en-US'

$ objExcel = New-Object -comobject Excel.Application $ objExcel.Visible = $ False $ objExcel.DisplayAlerts = $ False

$ objWorkbook = Invoke $ objExcel.Workbooks.Open "C: \ PS \ User Data.xls" Write-Host "Число рабочих листов:" $ objWorkbook.Sheets.Count

$ objWorksheet = $ objWorkbook.Worksheets.Item (1) Write-Host "Рабочий лист:" $ objWorksheet.Name

$ Forename = $ objWorksheet.Cells.Item (2,1) .Text $ Surname = $ objWorksheet.Cells.Item (2,2) .Text

Write-Host "Имя:" $ Forename Write-Host "Фамилия:" $ Surname

$ objExcel.Quit () If (ps excel) {kill -name excel}

Я прочитал много разных сообщений на форумах и статей о том, как попытаться решить проблему en-US, но я не могу ее решить и надеюсь, что кто-то здесь может помочь!

Вот упомянутая мною проблема Exeption:

Exception calling "InvokeMember" with "6" argument(s): "Method 'System.Management.Automation.PSMethod.C:\PS\User Data.x
ls' not found."
At C:\PS\excel.ps1:3 char:33
+ $m.PSBase.GetType().InvokeMember <<<< (
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Число рабочих листов: нельзя вызвать метод для выражения с нулевым значением. В C: \ PS \ excel.ps1: 18 символов: 45 + $ objWorksheet = $ objWorkbook.Worksheets.Item <<<< (1) + CategoryInfo: InvalidOperation: (Item: String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Рабочий лист: нельзя вызвать метод для выражения с нулевым значением. В C: \ PS \ excel.ps1: 21 символ: 37 + $ Forename = $ objWorksheet.Cells.Item <<<< (2,1) .Text + CategoryInfo: InvalidOperation: (Item: String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Вы не можете вызвать метод для выражения с нулевым значением. В C: \ PS \ excel.ps1: 22 символа: 36 + $ Surname = $ objWorksheet.Cells.Item <<<< (2,2) .Text + CategoryInfo: InvalidOperation: (Item: String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Имя фамилия:

Это первый вопрос, который я когда-либо задавал, постарайтесь вести себя хорошо! :))

Большое спасибо

Максимум

Я попытался изменить код, и он вроде работает!

Вместо того, чтобы использовать

$objWorkbook = Invoke $objExcel.Workbooks.Open "C:\PS\User Data.xls"

Я забрал Workbooks.Open "C:\PS\User Data.xls" и создали переменную $file = "C:\PS\User Data.xls"

Сейчас использую

$objWorkbook = Invoke $objExcel.Workbooks Open($File)

И это почти работает! Теперь он не выдает мне никаких ошибок, и вот результат в cmd

Numer of worksheets: 3
Worksheet: List Of Names
Forename:
Surname:

Но по какой-то причине он все еще не отображает $ Forename или $ Surname

P.S Я также сделал, как вы сказали, Массимо, и создал логин при переполнении стека и задал вопрос там!

Спасибо за помощь ребята

Ради интереса попробуйте изменить свой код, чтобы он работал с xls файл, в имени которого нет пробела. Если это сработает, вам нужно экранировать пробел в имени файла в этой строке:

$objWorkbook = Invoke $objExcel.Workbooks.Open "C:\PS\User Data.xls"

или, возможно, укажите параметр в этом:

$m.PSBase.GetType().InvokeMember(
$method, [Reflection.BindingFlags]::InvokeMethod, $null, $m, $parameters,$ciUS )

Попробуйте использовать .Value2 вместо текста. Вот простой пример того, как открыть книгу Excel и прочитать значение:

$xl = New-Object -comobject Excel.Application
$wb = $xl.WorkBooks.Open("C:\temp\test.xls")
$ws = $wb.Worksheets.Item(1)
Write-Host $ws.Cells.Item(2,1).Value2

спасибо за помощь ... Я устранил проблему! Я использовал PowerShell V2 CTP2, теперь я обновился до CTP3, это устранило проблему языкового барьера, и теперь я могу запускать сценарии, не беспокоясь о функции вызова, и все в порядке!

Большое спасибо

Максимум