5

Мы объединяем множество общих файловых ресурсов в один и тысячи файлов MS Excel (не говоря уже о Access и Word), которые имеют различные ссылки на другие листы. Некоторые из них упоминаются относительно местоположения файла, а другие содержат полный путь к указанной рабочей книге (т.е. I:/PUBLIC/username/file.xls).

Мы отсканировали наши серверы с помощью некоторых собственных программ для обнаружения файлов с работающими ссылками, но хотели бы избежать написания собственного кода, чтобы выполнить массовое обновление для изменения ссылок, если это возможно.

Есть ли какие-либо инструменты или методы, которые кто-либо использовал для переноса большого количества таких файлов? Мой поисковый запрос нашел ExcelPipe (http://www.datamystic.com/excelpipe.html), но их веб-сайт и моя неспособность найти какие-либо отзывы о продукте не внушают мне уверенности.

2 ответа2

4

Есть много доступных инструментов:

И много других. Сделайте резервную копию и протестируйте ее.

Я написал сценарий VBA, который перечисляет все файлы и их ссылки в данной папке, может быть полезен для такой задачи, как эта.

1

Я провел слишком много времени с этим, но я думаю, что наконец-то нашел решение :)

Скачайте скрипт Powershell и запустите его. Он запрашивает у вас папку. Выберите папку с таким количеством файлов Excel, сколько хотите. Затем вы должны ввести старую строку поиска и новую строку замены. Затем он заменит все гиперссылки во всех выбранных файлах, используя строки поиска и замены.

Как это работает вкратце

  1. Попросить папку
  2. Спросите старую строку поиска
  3. Спросите новую строку замены
  4. Переберите все файлы XLS, XLSX, XLSB или любое другое выражение регулярного выражения .*XLS? Матчи
  5. Цикл каждого листа в текущей книге
  6. Проходить по каждой гиперссылке на текущем листе
  7. Попробуйте заменить адрес гиперссылки (без учета регистра)
  8. Сохранить текущую книгу
  9. Закройте все, если закончите

Код

$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() 

Пожалуйста, проверьте это

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .