根据每个文件的B4单元格内容批量重命名Excel 2010文件

我有超过2000 + MS Excel 2010 .XLSX电子表格的文件夹,我需要执行以下操作:

  1. 我需要打开每个单独的文件
  2. 复制单元格B4的内容(每个文件在单元格B4上都有唯一的内容)和
  3. 将单元格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 }