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

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

我是一名系统管理员,我正在尝试学习如何使用 powershell...我以前从未编写过任何类型的脚本或编码,我一直通过从 technet 脚本中心和在线论坛学习在线自学。

我想要完成的是打开一个 excel 电子表格并从中获取信息(用户名和密码),然后将其输出到 powershell 中的命令提示符中。每当我尝试执行此操作时,我都会收到一个调用“InvokeMember”的异常,这是我目前拥有的代码:

 
函数调用([对象] $m,[字符串] $方法,$参数)
{
$m.PSBase.GetType().InvokeMember(
$方法,[Reflection.BindingFlags]::InvokeMethod,$null,$m,$参数,$ciUS)
}

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

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

$objWorkbook = 调用 $objExcel.Workbooks.Open "C:\PS\User Data.xls" Write-Host“工作表数量:”$objWorkbook.Sheets.Count

$obj工作表 = $objWorkbook.工作表.项目(1) 写入主机“工作表:”$objWorksheet.Name

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

写主机“名字:”$名字 写入主机“姓氏:”$Surname

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

我已经阅读了论坛上许多关于如何尝试解决 en-US 问题的帖子和文章,但我似乎无法解决它,希望这里有人可以提供帮助!

下面是我提到的异常问题:

使用“6”个参数调用“InvokeMember”时发生异常:“方法‘System.Management.Automation.PSMethod.C:\PS\User Data.x
ls' 未找到。
位于 C:\PS\excel.ps1:3 char:33
+ $m.PSBase.GetType().InvokeMember <<<< (
    + CategoryInfo:未指定:(:) [],MethodInvocationException
    + 完全合格错误标识:DotNetMethodException

工作表数量: 您不能对空值表达式调用方法。 位于 C:\PS\excel.ps1:18 字符:45 + $objWorksheet = $objWorkbook.Worksheets.Item <<<< (1) + CategoryInfo:无效操作:(项目:字符串)[],运行时异常 + 完全合格的错误标识:InvokeMethodOnNull

工作表: 您不能对空值表达式调用方法。 位于 C:\PS\excel.ps1:21 字符:37 + $Forename = $objWorksheet.Cells.Item <<<< (2,1).文本 + CategoryInfo:无效操作:(项目:字符串)[],运行时异常 + 完全合格的错误标识:InvokeMethodOnNull

您不能对空值表达式调用方法。 位于 C:\PS\excel.ps1:22 字符:36 + $Surname = $objWorksheet.Cells.Item <<<< (2,2).Text + CategoryInfo:无效操作:(项目:字符串)[],运行时异常 + 完全合格的错误标识:InvokeMethodOnNull

名字: 姓:

这是我问过的第一个问题,尽量友善一点!:))

非常感谢

最大限度

答案1

只是为了好玩,尝试修改代码以针对xls名称中没有空格的文件运行。如果可行,则需要在以下行中转义文件名中的空格:

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

或者也许引用这个参数:

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

答案2

我尝试修改代码并且让它能够正常工作!

而不是使用

$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

PS 我也按照 Massimo 所说的做了,并在 stack overflow 上创建了一个登录并在那里提出了问题!

感谢你们的帮助

答案3

尝试使用 .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

答案4

谢谢你的帮助...我已经解决了这个问题!我之前使用的是 PowerShell V2 CTP2,现在我已升级到 CTP3,这解决了语言障碍问题,我现在可以运行脚本而不必担心调用函数,一切都很好!

非常感谢

最大限度

相关内容