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

时间:2014-11-08 16:25:08

标签: excel powershell

我有一个包含2000多个MS Excel 2010 .XLSX电子表格的文件夹,我需要执行以下操作:

  1. 我需要打开每个单独的文件
  2. 复制单元格B4的内容(+每个文件在单元格B4上都有唯一内容),
  3. 将单元格B4的内容附加到原始文件名
  4. 我正在使用Ansgar Wiechers'下面的代码,它似乎工作。

    非常感谢你。

    尝试学习和紧密的死线并不是一个很好的匹配:)

1 个答案:

答案 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
}