我有一个包含2000多个MS Excel 2010 .XLSX
电子表格的文件夹,我需要执行以下操作:
B4
的内容(+每个文件在单元格B4
上都有唯一内容),B4
的内容附加到原始文件名我正在使用Ansgar Wiechers'下面的代码,它似乎工作。
非常感谢你。
尝试学习和紧密的死线并不是一个很好的匹配:)
答案 0 :(得分:2)
首先,您尝试采用的代码旨在对单个文件进行操作。 Open()
方法不支持路径中的通配符。
$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
参数指定该路径,否则它将从当前工作目录开始。
$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
。
在重命名文件之前,您需要先关闭它。但是,Release-Ref
函数仅释放对象的引用。它不会关闭工作簿(或该问题的应用程序)。你需要自己做:
$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
}