2014-11-08 30 views
1

我有过2000+的MS Excel 2010 .XLSX电子表格的文件夹,我需要执行以下操作:批量重命名的Excel根据每个文件的B4单元格内容2010个文件

  1. 我需要打开每个单独的文件
  2. 复制单元格B4的内容(+每个文件对细胞B4独特的内容),以及
  3. 细胞B4的内容附加到原文件名

我在下面使用Ansgar Wiechers的代码,它似乎在工作。

非常感谢。

努力学习和严格的死线是不是一个伟大的比赛:)

+1

什么不起作用?你的_real_问题是什么?你对上面的代码做了什么来尝试使它适合你? – Matt 2014-11-08 16:30:29

+0

用适当的问题和示例编辑修改了我的帖子。谢谢Matt – HGtez 2014-11-08 17:23:31

回答

1

一件事,你要采取的代码被设计为在一个单一的文件进行操作。 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 
}
+0

谢谢Ansgar,我试着将代码拼凑在一起,它运行但是:1.-它想要浏览驱动器中的所有文件。 2.-我无法重命名任何文件。 – HGtez 2014-11-08 22:09:32

+0

@HGtez你的代码实际上并没有关闭工作簿(对不起,没有足够关注'Release-Ref'的作用 - 或者不这么做)。此外,您需要告诉'Get-ChildItem'从哪里开始,否则将从当前工作目录开始。查看更新的答案。 – 2014-11-09 00:27:32

+0

谢谢Ansgar,我尝试了你的代码,并用新的结果更新了我原来的帖子。 – HGtez 2014-11-09 12:14:05

相关问题