我想知道是否有任何方法可以加速使用PowerShell读取Excel文件。很多人会说我应该停止使用 do直到,但问题是我需要它很糟糕,因为在我的Excel工作表中可以有2行或5000行。我知道5000行需要一些时间。但是2行不需要90秒+。
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $true
$Excel.DisplayAlerts = $false
$Path = EXCELFILEPATH
$Workbook = $Excel.Workbooks.open($Path)
$Sheet1 = $Workbook.Worksheets.Item(test)
$URows = @()
Do {$URows += $Sheet1.Cells.Item($Row,1).Text; $row = $row + [int] 1} until (!$Sheet1.Cells.Item($Row,1).Text)
$URows | foreach {
$MyParms = @{};
$SetParms = @{};
我在剧本中也得到了30次:
If ($Sheet1.Cells.Item($Row,2).Text){$var1 = $Sheet1.Cells.Item($Row,2).Text
$MyParms.Add("PAR1",$var1)
$SetParms.Add("PAR1",$var1)}
}
我有想法暂时运行$ MyParms的东西,但我不知道怎么做。有什么建议吗?
或者
提高阅读速度,但我不知道如何在不破坏“阅读直到什么都没有”的情况下实现这一目标。
或者
速度是正常的,我不应该抱怨。
答案 0 :(得分:3)
如果您需要速度,请不要首先使用Excel.Application。您可以使用Excel电子表格作为ODBC数据源 - 该文件类似于数据库,每个工作表都是一个表。速度差异巨大。这是一个intro on using Excel spreadsheets without Excel
答案 1 :(得分:2)
使用+=
运算符追加到数组的速度非常慢,因为它会将现有数组中的所有元素复制到新数组中。请改用这样的东西:
$URows = for ($row = 1; !$Sheet1.Cells.Item($row, 1).Text; $row++) {
if ($Sheet1.Cells.Item($Row,2).Text) {
$MyParms['PAR1'] = $Sheet1.Cells.Item($Row, 2).Text)
$SetParms['PAR1'] = $Sheet1.Cells.Item($Row, 2).Text)
}
$Sheet1.Cells.Item($Row,1).Text
}
您的Do
循环基本上是一个计数循环。这种循环的规范形式是
for (init counter; condition; increment counter) {
...
}
所以我相应地改变了循环。当然,你会得到同样的结果:
$row = 1
$URows = Do {
...
$row += 1
}
但这只意味着更多代码没有任何好处。但是,此修改不会对性能产生任何影响。
与绩效相关的是另外两个变化:
Add
方法为哈希表分配值可防止代码在哈希表中已存在密钥时引发错误。$URows
。