根据每个文件的B4单元格内容批量重命名Excel 2010文件
我有超过2000 + MS Excel 2010 .XLSX
电子表格的文件夹,我需要执行以下操作:
- 我需要打开每个单独的文件
- 复制单元格
B4
的内容(每个文件在单元格B4
上都有唯一的内容)和 - 将单元格
B4
的内容附加到原始文件名称
我正在使用下面的Ansgar Wiechers的代码,它似乎正在工作。
非常感谢。
试图学习和紧死线不是一个伟大的比赛:)
一方面,您试图采用的代码被devise为在单个文件上运行。 Open()
方法不支持path中的通配符。
$wb = $xl.Workbooks.Open("C:\...") # open the file # ... # do stuff # ... $a = Release-Ref($wb) # release the reference to the workbook
所以你需要做的第一件事就是围绕该部分进行循环,并用Get-ChildItem
的输出提供它。 如果您希望Get-ChildItem
从特定path启动,则需要通过-Path
参数指定该path,否则将从当前工作目录开始。
$root = 'C:\some\folder' Get-ChildItem -Path $root -Filter '*.xlsx' -Recurse | ForEach-Object { $wb = $xl.Workbooks.Open( $_.FullName ) # ... # do stuff # ... $a = Release-Ref($wb) }
确保在循环外部保留Excel应用程序对象的处理。
提取单元格B4的值:
$b4 = $wb.Sheets.Item(1).Cells.Item(4, 2).Value
并将其附加到文件名称:
$newname = $_.BaseName + $b4 + $_.Extension
如果.Value
不返回该单元格中的实际值,请改为使用.Text
。
在重新命名文件之前,您需要先closures文件。 但是, Release-Ref
函数只能释放对象的引用。 它不会closures工作簿(或关于这个问题的应用程序)。 你需要自己做:
$root = 'C:\some\folder' Get-ChildItem -Path $root -Filter '*.xlsx' -Recurse | ForEach-Object { $wb = $xl.Workbooks.Open($_.FullName) # ... # do stuff # ... $wb.Close() # actually close the file $a = Release-Ref($wb) Rename-Item -Path $_.FullName -NewName $newname }