каталог личных
объявлений

antivan. Дом проектов

Автоматическое преобразование *.xls в *.xlsx

Если вы работаете с программами, которые до сих пор сохраняют файлы в формате Microsoft Excel 2003 и/или еще более старых (а это, например, все программы на платформе 1С версии 7.7), то наверняка вас раздражает регулярно пересохранять документ в новый формат, прежде чем вы сможете нормально с ним работать. А если таких файлов много? А если с такими файлами работает много людей в вашем офисе? Можете посчитать, сколько времени тратят ваши сотрудники/коллеги просто на пересохранение документов Excel?

Решение

На любом ПК в офисе, с установленным пакетом Microsoft Office 2007 и новее, создаете обменку, и запускаете скрипт PowerShell:

[String]$PathToAnalise = "D:\Обменка\Счета\"
$excel = New-Object -ComObject Excel.Application
For(  ;  ;  ) { 
    Get-ChildItem -Path $PathToAnalise *.xls -File -Recurse -Attributes `
        Archive,Compressed,Encrypted,Hidden,Normal,ReadOnly,NotContentIndexed,SparseFile,System |
        ForEach-Object {
        [String]$filefullname = $_.DirectoryName + "\" + $_.BaseName + ".xlsx";
        if (Test-Path -PathType Leaf -Path $filefullname) {
                $ErrorActionPreference = 'Ignore';
                Remove-Item -Path $_.FullName
                $ErrorActionPreference = 'SilentlyContinue';
        } else {
           $EWB = $excel.Workbooks.Open($_.FullName)
           $EWB.SaveAs($_.DirectoryName + "\" + $_.BaseName + ".xlsx", 51)
           $_.DirectoryName + "\" + $_.BaseName + ".xlsx"
           $EWB.Close()
           Remove-Item -Path $_.FullName
        }   
    }
    Start-Sleep -s 3
}

Предварительно, конечно же, исправляете значение переменной $PathToAnalise на локальный путь к обменке. После этого любой XLS-документ, сохраненный в этом месте, будет автоматически преобразован в XLSX-документ в течение 3х секунд.

Если вам не нужна настолько быстрая реакция, то в стоке:

    Start-Sleep -s 3

установите число побольше.

Теперь любой сотрудник вашей компании или вашей сети может сохранить файл в этой обменке и через пару секунд получит файл в новом формате.

Нужно иметь ввиду, что после запуска скрипта, он запускает процесс Excel и держит его в памяти операционной системы, что хорошо, если вы преобразуете много файлов - не нужно тратить ресурсы на запуск программы для обработки каждого нового файла, но может быть расточительно в случае, если вы такую автоматизацию используете, но файлы преобразуете очень нечасто. Также обратите внимание, что этот скрипт не желательно аварийно останавливать, так как процесс Excel не будет закрыт и останется в оперативной памяти. Заспустили и до перезагрузки ПК пусть работает.
Если ваш случай - очень редкие XLS-файлы, нужно исправить код таким образом, чтоб он запускал Excel только тогда, когда в обменке появляется XLS-файл и закрывал его после перобразования:

[String]$PathToAnalise = "D:\Обменка\Счета\"
For(  ;  ;  ) { 
    Get-ChildItem -Path $PathToAnalise *.xls -File -Recurse -Attributes `
        Archive,Compressed,Encrypted,Hidden,Normal,ReadOnly,NotContentIndexed,SparseFile,System |
        ForEach-Object {
        [String]$filefullname = $_.DirectoryName + "\" + $_.BaseName + ".xlsx";
        if (Test-Path -PathType Leaf -Path $filefullname) {
                $ErrorActionPreference = 'Ignore';
                Remove-Item -Path $_.FullName
                $ErrorActionPreference = 'SilentlyContinue';
        } else {
           $excel = New-Object -ComObject Excel.Application
           $EWB = $excel.Workbooks.Open($_.FullName)
           $EWB.SaveAs($_.DirectoryName + "\" + $_.BaseName + ".xlsx", 51)
           $_.DirectoryName + "\" + $_.BaseName + ".xlsx"
           $EWB.Close()
           Remove-Item -Path $_.FullName
           $excel.Quit()
           Stop-Process -Name EXCEL
        }   
    }
    Start-Sleep -s 3
}

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

Можете сказать спасибо.
Оно мне очень пригодится.