[英]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.