我正在创建一个脚本,我将提供一个 SharePoint 2007 文档库列表,这些文档库将执行以下操作:
- 在 Excel 中,在链接到其他工作簿 + 工作表 (XLS/XLSX) 的单元格中查找公式
- 如果找到,请将公式链接替换为
http://serverold/site/doclib/
并http://servernew/sites/sitecollection/doclib
保存 - 否则,关闭工作簿并移至下一个记录所有更改的完整 URL 和文件名
使用此链接上的代码 作为我的起点,我无法进行以下工作:
- 使脚本检测公式中的 URL 的正则表达式
- 修改脚本以将旧路径替换为单元格内公式中的新路径。
- a为每个分支处理何时找到匹配项(保存并关闭)和未找到匹配项(仅关闭)
我不会详细介绍我所做的所有研究(信息非常简单),只是在另一个线程中提到您可以在 Excel 中集中枚举这些链接,但没有给出示例或链接,并且当我尝试在 PowerShell(安装了 Excel 2010)中枚举链接集合时,我正在使用的示例工作簿是空的,我在这个意义上将其称为“链接”。
枚举链接集合的示例:
$File = "C:\temp\example.xls"
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Workbook.LinkSources
所以这就引出了一个问题,哪种方法是正确的?
示例 Excel 公式
=+'http://server.old/site/site/Work in Progress `enter code here`Documents/Statements/[Hierarchy2011.xls]Reports'!$AD$37+'http://server.old/site/site/Work in Progress Documents/
枚举链接的脚本(从我提到的链接作为我的起点) -
$path = "C:\temp"
$excelSheets = Get-Childitem -Path $path -Include *.xls,*.xlsx -Recurse
$excel = New-Object -comobject Excel.Application
$excel.visible = $false
foreach($excelSheet in $excelSheets)
{
$workbook = $excel.Workbooks.Open($excelSheet)
"There are $($workbook.Sheets.count) sheets in $excelSheet"
For($i = 1 ; $i -le $workbook.Sheets.count ; $i++)
{
$worksheet = $workbook.sheets.item($i)
"`tLooking for links on $($worksheet.name) worksheet"
$rowMax = ($worksheet.usedRange.rows).count
$columnMax = ($worksheet.usedRange.columns).count
For($row = 1 ; $row -le $rowMax ; $row ++)
{
For($column = 1 ; $column -le $columnMax ; $column ++)
{
[string]$formula = $workSheet.cells.item($row,$column).formula
if($formula -match "\w?:\\\w*\\\[\w*\.xls\w?\]") {"`t`t$($formula)"}
} #end for $column
} #end for $row
$worksheet = $rowmax = $columnMax = $row = $column = $formula = $null
} #end for
$workbook.saved = $true
$workbook.close()
} #end foreach
$excel.quit()
$excel = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()
感谢任何可以提供帮助的人和您的时间。最好的,灰