簡體   English   中英

為什么用Powershell讀取Excel文件這么慢?

[英]Why is it so slow to read an Excel file with Powershell?

我有一個小文件,格式為XLSX,大小為28 KB,我想用Powershell對其進行修改。 該文件包含59行和366列。

我的代碼遍歷第一列並搜索特定的條目,然后遍歷找到的列並輸出找到的行和第一行的內容。 這是代碼:

# Define some parameters.
$year = "2015"
$filename = "C:\...\file.xlsx"
$person = "Lastname, Firstname"

# Open Excel file and select worksheet.
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Open($filename)
$worksheet = $workbook.sheets.item($year)
$cells = $worksheet.cells

# Search person name in first column.
$rows = $worksheet.UsedRange.Rows.count
"Rows: $rows"
$row = 1

while ($row -le $rows)
{
  $cell = $cells.item($row,1).value2
  if ($person -eq $cell) {
    break
  }
  $row++
}

# List row
$cols = $worksheet.UsedRange.Columns.count
"Cols: $cols"
foreach ($col in 2..$cols)
{
  $date = $cells.item(1,$col).value2
  $data = $cells.item($row,$col).value2
  $date = [DateTime]::FromOADate($date)
  $msg = $date.ToString("yyyy-MM-dd") + " " + $data
  "$msg"
}

# Close workbook and Excel file and release COM object.
$workbook.close()
$excel.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

我的問題:程序運行緩慢。 迭代366列需要5分鍾以上的時間!

PS C:\...> Measure-Command { .\program.ps1 }

Days              : 0
Hours             : 0
Minutes           : 5
Seconds           : 33
Milliseconds      : 580
Ticks             : 3335806616
TotalDays         : 0,00386088728703704
TotalHours        : 0,0926612948888889
TotalMinutes      : 5,55967769333333
TotalSeconds      : 333,5806616
TotalMilliseconds : 333580,6616

我簡直不敢相信這是正常的。 相反,我認為我的程序確實有問題。 但是我不知道那是什么。

我必須更改什么才能使其更快?

使用循環並查找替換Excel中的單元格值將使您永遠受益……我要替換111個單元格,大約需要40秒鍾才能完成。 但是,您可以利用命令Replace,它的速度要快得多。 但是要提供相對單元格的值,您必須將Excel應用程序的引用樣式更改為xlR1c1。 以下是我如何使用字符串“ Noregistered hostname”替換所有單元格的信息,其中該單元格的值為左側,即我的數據的IP地址。 我已經注釋掉了以前使用過的while循環。由於您打算進行更新,因此可以考慮一下...

$Range=$WorkSheet.Range("B1").EntireColumn
# Replace Cells with No registered hostname
$SearchString="No registered hostname"
# Using Excel reference style xlR1C1 to set the formula for replace
$xls.Application.ReferenceStyle=2 
$Range.Replace($SearchString, "=RC[-1]")
# while ($NoDNS=$Range.find($SearchString))
#   {
#   $NoDNS.Activate()
#   $RefRow=$NoDNS.Row
#   $NoDNS.value()=$WorkSheet.Cells.Item($RefRow, 1).Text
#   }
$xls.Application.ReferenceStyle=1

與之前的while循環相比,使用replace僅需一秒鍾即可完成所有必要的更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM