为什么使用Powershell读取Excel文件如此缓慢?
我有一个28 KB的XLSX格式的小Excel文件,我想用Powershell修改它。该文件包含59行和366列 我的代码遍历第一列并搜索特定条目,然后遍历找到的列并输出找到的行和第一行的内容。代码如下:为什么使用Powershell读取Excel文件如此缓慢?,excel,powershell,Excel,Powershell,我有一个28 KB的XLSX格式的小Excel文件,我想用Powershell修改它。该文件包含59行和366列 我的代码遍历第一列并搜索特定条目,然后遍历找到的列并输出找到的行和第一行的内容。代码如下: # Define some parameters. $year = "2015" $filename = "C:\...\file.xlsx" $person = "Lastname, Firstname" # Open Excel file and select worksheet. $e
# 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。 下面是我对如何用字符串No registed hostname替换所有单元格的看法,左边的单元格值是我的数据的IP地址。 我已经注释掉了以前使用的while循环 既然你打算做更新,你可以考虑这个……/P>
$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只需一秒钟即可完成所有必要的更改。是否需要在excel中使用此选项。我们可以通过编程将数据转换为csv,以便对其进行操作。这并不是要回答为什么速度慢。@Matt Excel文件有很多装饰和功能,在我看来,保存这些信息需要做很多工作。这就是为什么我放弃了我的Perl解决方案,它也必须从头开始构建新的Excel文件,因为它存在一个Perl模块来读取Excel文件,一个用于编写Excel文件,但没有一个用于更新Excel文件。我不是说丢失Excel文件。只需将其作为csv副本使用即可。我们可以通过编程实现。excel没有更改。您似乎没有保存更改,只是查询数据。@Matt是的,更新仍然丢失,因为我花了一天的时间调查,为什么读取速度这么慢。但最后我不得不更新Excel文件。这看起来像是一个复制品。即使不是一个精确的副本,我怀疑我的答案可以帮助你。