Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用Powershell读取Excel文件如此缓慢?_Excel_Powershell - Fatal编程技术网

为什么使用Powershell读取Excel文件如此缓慢?

为什么使用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

我有一个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.
$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文件。这看起来像是一个复制品。即使不是一个精确的副本,我怀疑我的答案可以帮助你。