加快在Powershell中读取Excel文件的速度

加快在Powershell中读取Excel文件的速度,excel,powershell,Excel,Powershell,我想知道是否有任何方法可以加快使用powershell读取Excel文件的速度。很多人会说我应该停止使用do,直到,但问题是我非常需要它,因为在我的Excel工作表中可能有2行或5000行。我知道5000行需要一些时间。但两行不需要90秒以上 $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $true $Excel.DisplayAlerts = $fals

我想知道是否有任何方法可以加快使用powershell读取Excel文件的速度。很多人会说我应该停止使用do,直到,但问题是我非常需要它,因为在我的Excel工作表中可能有2行或5000行。我知道5000行需要一些时间。但两行不需要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的想法,但我不知道如何运行。有什么建议吗

提高阅读速度,但我不知道如何在不破坏“无所不读”的情况下达到这一目的


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

使用
+=
操作符附加到数组非常慢,因为它会将所有元素从现有数组复制到新数组。改用类似的方式:

$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
    方法为哈希表赋值,可以防止代码在哈希表中已经存在键时引发错误
  • 现在,代码不再附加到数组(具有上述性能影响)中,而是简单地在循环中回显单元格文本,PowerShell会自动将其转换为列表。然后将该列表分配给变量
    $URows

  • 使用
    +=
    运算符附加到数组速度非常慢,因为它会将现有数组中的所有元素复制到新数组中。改用类似的方式:

    $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
    方法为哈希表赋值,可以防止代码在哈希表中已经存在键时引发错误
  • 现在,代码不再附加到数组(具有上述性能影响)中,而是简单地在循环中回显单元格文本,PowerShell会自动将其转换为列表。然后将该列表分配给变量
    $URows

  • 如果需要速度,首先不要使用Excel.Application。您可以使用Excel电子表格作为ODBC数据源—该文件类似于数据库,每个工作表都是一个表。速度差很大。这里有一个

    如果你需要速度,首先不要使用Excel.Application。您可以使用Excel电子表格作为ODBC数据源—该文件类似于数据库,每个工作表都是一个表。速度差很大。这里有一个

    听起来不错,你能简单解释一下它是如何工作的吗?特别是你即兴表演的第一行。我的$MyParms.Add有什么问题-它是否仍能像splatting一样工作??我想了解将所有内容转换为新代码的原因,除了+=到++非常感谢!知道了!改编了我的剧本。效果更好!听起来不错,你能简单解释一下它是怎么工作的吗?特别是你即兴表演的第一行。我的$MyParms.Add有什么问题-它是否仍能像splatting一样工作??我想了解将所有内容转换为新代码的原因,除了+=到++非常感谢!知道了!改编了我的剧本。效果更好!非常感谢您的链接。不容易理解,但我会试试看!我问了另一个关于ODBC数据库的问题。你能看一下吗?我被卡住了。有点晚了,但我想你指的是OLEDB数据源。看起来technet链接已经更新了。非常感谢您的链接。不容易理解,但我会试试看!我问了另一个关于ODBC数据库的问题。你能看一下吗?我被卡住了。有点晚了,但我想你指的是OLEDB数据源。看起来technet链接已经更新了。