我们正在将大量文件共享合并为一个,并且有数千个 MS Excel(更不用说 Access 和 Word)文件,这些文件包含指向其他工作表的各种链接。其中一些是相对于文件位置引用的,而另一些则包含引用工作簿的完整路径(即 I:/PUBLIC/username/file.xls)。
我们已经使用一些自制程序扫描了我们的服务器,以检测具有有效链接的文件,但如果可能的话,我们希望避免编写我们自己的代码来进行批量更新来更改链接。
有没有人使用过任何工具或技术来迁移此类大量文件?我在谷歌上找到了 ExcelPipe (http://www.datamystic.com/excelpipe.html),但是他们的网站和我无法找到的产品评论让我充满信心。
答案1
有许多可用的工具:
- 冰茶替代品(似乎是免费软件 - 一位用户在另一篇文章中指出“似乎不适用于 .xlsm 文件。”)
- 电力GREP,一个很棒的工具。
- 联科科技
- 查找 Excel 的断开链接
- ReplaceMagic Excel 版本
还有许多其他的。请备份并测试一下。
我编写了一个 VBA 脚本,列出了给定文件夹中的所有文件及其链接,对于这样的任务可能很有用。
答案2
我花了太多时间在这上面,但我想我终于找到解决方案了:)
下载Powershell 脚本并运行它。它会要求您提供一个文件夹。选择一个包含任意数量的 Excel 文件的文件夹。接下来,您必须输入旧的搜索字符串和新的替换字符串。然后,它将使用您的搜索和替换字符串替换所有选定文件中的所有超链接。
→
简要介绍
- 询问文件夹
- 询问旧的搜索字符串
- 要求更换新琴弦
- 循环遍历每个 XLS、XLSX、XLSB 文件或正则表达式
.*XLS?
匹配的任何内容 - 循环遍历当前工作簿中的每个工作表
- 循环遍历当前工作表中的每个超链接
- 尝试替换超链接地址(不区分大小写)
- 保存当前工作簿
- 如果完成则关闭所有内容
代码
$object = New-Object -comObject Shell.Application
$folder = $object.BrowseForFolder(0, 'Select the folder', 0)
$oldname = Read-Host 'Enter your old string to search for'
$newname = Read-Host 'Enter your new string'
if (!$folder -or !$oldname -or !$newname) {exit}
$excel = New-Object -comObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
foreach ($file in Get-ChildItem -literalPath $folder.self.Path*.xls?) {
$workbook = $excel.Workbooks.Open($file.name)
foreach ($sheet in $workbook.Sheets) {
foreach ($cell in $sheet.Hyperlinks) {
$cell.Address = $cell.Address -ireplace $oldname, $newname
}
}
$workbook.Save()
$workbook.Close()
}
$excel.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()