加速在Powershell中读取Excel文件

时间:2013-10-11 09:34:50

标签: excel powershell

我想知道是否有任何方法可以加速使用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的东西,但我不知道怎么做。有什么建议吗?

或者

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

或者

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

2 个答案:

答案 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
         }

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

与绩效相关的是另外两个变化:

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