Автоматическое преобразование *.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
}
Также обратите внимание, что исходный файл уничтожается. Подразумеваю, что этот самый исходный файл вы в любой момент можете перевыгзузить. Если вам так не надо, скрипт придется переделать.