如何读取Excel中的单元格数据并输出到命令提示符

我是一个系统pipe理员,我正在学习如何使用PowerShell …我从来没有做过任何types的脚本或编码之前,我一直在网上教学,通过从technet脚本中心和在线论坛学习。

我想完成的是打开一个Excel电子表格从它(用户名和密码)获取信息,然后输出到PowerShell的命令提示符。 当我试图做到这一点,我得到一个exception调用“InvokeMember”无论如何,这里是我到目前为止的代码:

 
函数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”
写主机“工作表数量:”$ objWorkbook.Sheets.Count

$ objWorksheet = $ objWorkbook.Worksheets.Item(1)
写主机“工作表:”$ objWorksheet.Name

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

写主机“名字:”$ Forename
写主机“姓:”$姓

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

我已经阅读了许多关于如何尝试解决美国问题的论坛和文章,但我似乎无法绕过它,希望有人在这里可以帮助!

这里是我提到的执行问题:

使用“6”参数调用“InvokeMember”的exception:“Method”System.Management.Automation.PSMethod.C:\ PS \ User Data.x
我找不到。“
在C:\ PS \ excel.ps1:3 char:33
 + $ m.PSBase.GetType()。InvokeMember <<<<(
     + CategoryInfo:NotSpecified:(:) [],MethodInvocationException
     + FullyQualifiedErrorId:DotNetMethodException 

工作表数量:
您无法在空值expression式上调用方法。
在C:\ PS \ excel.ps1:18 char:45
+ $ objWorksheet = $ objWorkbook.Worksheets.Item <<<<(1)
+ CategoryInfo:InvalidOperation:(Item:String)[],RuntimeException
+ FullyQualifiedErrorId:InvokeMethodOnNull

工作表:
您无法在空值expression式上调用方法。
在C:\ PS \ excel.ps1:21 char:37
+ $ Forename = $ objWorksheet.Cells.Item <<<<(2,1).Text
+ CategoryInfo:InvalidOperation:(Item:String)[],RuntimeException
+ FullyQualifiedErrorId:InvokeMethodOnNull

您无法在空值expression式上调用方法。
在C:\ PS \ excel.ps1:22 char:36
+ $姓氏= $ objWorksheet.Cells.Item <<<<(2,2).Text
+ CategoryInfo:InvalidOperation:(Item:String)[],RuntimeException
+ FullyQualifiedErrorId:InvokeMethodOnNull

用名字:
姓:

这是我曾经问过的第一个问题,试着做好! :))

非常感谢

马克斯

只是为了好玩,试着修改你的代码来运行一个没有名字空间的xls文件。 如果这样的话,那么你需要在这一行中转义文件名中的空格:

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

或者可能引用这个参数:

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

我尝试修改代码,我有它的工作!

而不是使用

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

我拿走了Workbooks.Open "C:\PS\User Data.xls" 。打开Workbooks.Open "C:\PS\User Data.xls"并创build了一个variables$file = "C:\PS\User Data.xls"

现在我用

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

它几乎工作! 它现在不会对我造成任何错误,这是cmd的结果

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

但由于某种原因,它仍然不显示$ Forename或$姓氏

PS我也做了你所说的Massimo,并创build了一个堆栈溢出login,并在那里问了问题!

谢谢你们的帮助

尝试使用.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这已经修复了语言障碍问题,我现在可以运行脚本而不用担心调用function,一切都很好!

非常感谢

马克斯