我需要找到数据在哪一行,然后将其复制以及下面的所有其他行,并将其移至工作表的顶部。剪切和粘贴是可行的,但是我似乎找不到能够让我选择所需所有行的函数。
到目前为止,我已经尝试过了。
$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open('C:\Users\xx\Test2\TestFile2.xlsx')
$Worksheet = $Workbook.Sheets.Item(1)
$worksheet.Activate()
$Found = $Worksheet.Cells.Find('Last Name')
[char] $col = $found.column + 64
[String] $value = $col + $found.row
$range = $worsheet.Range("$value :A4")
但是我明白了
You cannot call a method on a null-valued expression.
At line:1 char:1
+ $range = $worsheet.Range("$value :A4")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
对于Powershell来说我还很陌生,因此可以提供任何帮助
谢谢!
答案 0 :(得分:1)
我强烈建议对此操作使用ImportExcel module,以便您可以直接在PowerShell中操作对象。假设我们有一个这样的表:
+----------+---------+
| Column1 | Column2 |
+----------+---------+
| Value1 | a |
| Value2 | b |
| LastName | c |
| Value3 | d |
| Value4 | e |
+----------+---------+
我们可以做的是将其导入PowerShell对象,然后找到要查找的值(在我的情况下为Column1 -eq 'LastName'
):
$data = Import-Excel .\Book1.xlsx
$i = 0
$data | % {if ($_.Column1 -eq "LastName"){
$i
break
}
else {
$i++
}
}
然后,我们必须将所有从顶部开始的行保存到一个变量,并将从刚发现的行开始的行保存到另一个变量:
$above = @()
$thisAndBelow = @()
for ($j = 0; $j -lt $data.length; $j++) {
if ($j -lt $i) {$above += $data[$j]}
else {$thisAndBelow += $data[$j]
}
}
然后将它们放在一起并导出到输出文件:
$object = $thisAndBelow + $above
$object | Export-Excel .\Book2.xlsx
如预期的那样,输出为:
+----------+---------+
| Column1 | Column2 |
+----------+---------+
| LastName | c |
| Value3 | d |
| Value4 | e |
| Value1 | a |
| Value2 | b |
+----------+---------+