1

我想知道是否有任何方法可以加快使用 powershell 读取 Excel 文件的速度。许多人会说我应该停止使用do until,但问题是我非常需要它,因为在我的 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 东西的想法,但我不知道如何。有什么建议么?

或者

提高阅读速度,但我不知道如何在不破坏“阅读直到什么都没有”的情况下实现这一目标。

或者

速度是正常的,我不应该抱怨。

4

2 回答 2

3

如果您需要速度,请不要首先使用 Excel.Application。您可以使用 Excel 电子表格作为 ODBC 数据源 - 该文件类似于数据库,每个工作表都是一个表。速度差异是巨大的。这是关于在没有 Excel 的情况下使用 Excel 电子表格的介绍

于 2013-10-11T12:53:57.760 回答
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
         }

但这只是意味着更多的代码没有任何好处。但是,此修改不会对性能产生任何影响。

与性能相关的是另外两个变化:

  1. 我在第一个循环中移动了填充哈希表的代码,因此代码不会在数据上循环两次。使用索引和赋值运算符而不是为Add哈希表分配值的方法可以防止代码在哈希表中已存在键时引发错误。
  2. 现在,代码不再附加到数组(具有上述性能影响),而是简单地回显循环中的单元格文本,PowerShell 自动将其转换为列表。然后将该列表分配给变量$URows
于 2013-10-11T10:20:29.893 回答