Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/30.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
Excel 在PowerShell ForEach循环中处理工作表_Excel_Powershell - Fatal编程技术网

Excel 在PowerShell ForEach循环中处理工作表

Excel 在PowerShell ForEach循环中处理工作表,excel,powershell,Excel,Powershell,我有一个PowerShell脚本中的ForEach循环,该脚本试图运行过去2小时内在文件夹中创建的每个文件。它将获取每个文件,删除某些列和行,并且只留下一列带有标题ActiveFaults。然后,它将对每个文件进行排序/分组和格式化,并为每个文件提供一个ActiveFaults字符串 我的脚本的输出是我所需要的,但是它需要花费很多时间来处理。有没有更有效的方法?而且,偶尔,它会给我一个错误,说这个对象不包含工作簿。Open方法…你知道为什么吗?为什么这个问题会是间歇性的?提前谢谢 $PathMX

我有一个PowerShell脚本中的ForEach循环,该脚本试图运行过去2小时内在文件夹中创建的每个文件。它将获取每个文件,删除某些列和行,并且只留下一列带有标题ActiveFaults。然后,它将对每个文件进行排序/分组和格式化,并为每个文件提供一个ActiveFaults字符串

我的脚本的输出是我所需要的,但是它需要花费很多时间来处理。有没有更有效的方法?而且,偶尔,它会给我一个错误,说这个对象不包含工作簿。Open方法…你知道为什么吗?为什么这个问题会是间歇性的?提前谢谢

$PathMX1005 = "\source"
filesMX1005 = Get-ChildItem $PathMX1005 -recurse -include *1Hz*.csv | Where { $_.CreationTime -ge [datetime]::Now.AddMinutes(-180) }

Copy-Item $filesMX1005 \destination -Recurse

$files2MX1005 = Get-ChildItem \destination -Recurse

foreach($file in $files2MX1005) {

    $Excel = New-Object -ComObject excel.application
    $Excel.visible = $false
    $Workbook = $Excel.Workbooks.open($file.FullName) 
    $range = $Workbook.ActiveSheet.Range("A1:FZ1").EntireColumn 
    $range2 = $Workbook.ActiveSheet.Range("A1:A34").EntireRow
    $range.Delete()
    $range2.Delete()
    $Excel.DisplayAlerts=$False
    $Workbook.SaveAs("c:\StrippedHeader.csv")

    $FaultsMX1005 = Import-CSV ":\StrippedHeader.csv" | Group-Object ActiveFaults | foreach-object { $_.group | select -last 1} | Out-String 

    $Excel.Workbooks.Close()
    $Excel.Quit()
我多次看到您的代码中有.csv,这使我认为您根本不需要使用Excel COM对象

因此,首先我们更改$files2MX1005,使其仅过滤csv文件,并在每个文件上使用导入csv。如果您有一个名为ActiveFaults的列,我们可以选择它并继续

$files2MX1005=获取子项C:\temp\files-Recurse-Filter*.csv $files2MX1005中的foreach$文件{ $ActiveFaults=导入CSV$文件|选择ActiveFaults 进一步处理$ActiveFaults }
我不确定你们还用这些数据做了什么,但我认为这将是你们的进步

$files2MX1005不过滤excel文档是我首先关心的问题。也没有必要让com对象$Excel=New object-ComObject Excel.application在循环之外运行该行。这些实际上只是csv文件吗?对于这些,我们不需要使用com对象。我看不出您填充了什么$FaultsMX1005,您缺少ForEachHi Matt的右括号,谢谢您的回复。每个CSV都有5000行300列长,导入它们需要很长时间,这就是为什么我要打开excel,并在导入之前删除行/列。这不合理吗?有更好的方法吗?@CarlosSousa与此方法相比,我没有尝试过基准测试您的Excel代码,所以我不确定哪种方法更快。虽然这看起来像是很多数据,但我与大型CSV合作时效率很高。先试试,也许你的方法更快。使用excel处理csv数据似乎效率低下。导入csv会将整个文件读取到内存中,因此最好使用streamreader逐行读取。