PDA

Показать полную графическую версию : [решено] Пакетное преобразование xls ->xlsx (xls -> csv)


Страниц : 1 [2]

antivan
12-07-2025, 17:51
[String]$PathToAnalise = "D:\Обменка\Счета\"

$excel = New-Object -ComObject Excel.Application # открываем экземпляр Excel, он будет один на весь скрипт
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
}
$excel.Quit() # закрываем экземпляр Excel - это действие бессмысленно,
# т.к. при нормальной работе выхода из цикла не произойдет,
# а при аварийной остановке скрипта исполнение до этого места не дойдет


У меня несколько лет работает так.
Если есть идеи, как не гонять цикл, а отслеживать именно появление файла - было бы интересно посмотреть.

Вариант без висящего в памяти Excel


[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
}


об этом скрипте у меня на сайте (https://antivan.ru/blog/autoconvert-xls-to-xlsx/)
в общем-то все итак видно, так что по ссылке ходить совсем не обязательно

DJ Mogarych
12-07-2025, 20:43
antivan, в составе Офиса версии примерно с 2007 есть встроенный конвертер excelcnv.exe, и париться с ком-объектом Экселя уже не нужно, выше в теме было написано об этом.

Вот вариант с конвертацией и автоматическим удалением оригиналов.
Можно вставить в планировщик и запускать через определённые промежутки времени.
Проверки перед удалением оригиналов можно ещё навертеть какие угодно.

# Папка с файлами .xls
$folder = "C:\temp"
# Путь до конвертера
$converter = "C:\Program Files\Microsoft Office\root\Office16\excelcnv.exe"

# Запускать процесс только если в папке есть файлы .xls
if ($files = dir $folder -Include "*.xls" -Recurse) {
# Конвертировать
$files |% {
& $converter -oice "$($_.FullName)" "$($_.FullName + "x")"
}
# Ожидание завершения процессов конвертации
do {
sleep 5
} while (get-process excelcnv -ErrorAction SilentlyContinue)
# Удалить оригинал, если есть соответствующий файл .xlsx и он не нулевого размера
dir $folder -Include "*.xlsx" -Recurse |% {
$xls = "$($_.DirectoryName)\$($_.basename).xls"
if ($_.Length -ne 0 -and (Test-Path $xls)) {
del $xls
}
}
}

antivan
12-07-2025, 21:52
в составе Офиса версии примерно с 2007 есть встроенный конвертер excelcnv.exe, и париться с ком-объектом Экселя уже не нужно, выше в теме было написано об этом. »

Видел, да. Но использование плохо документированной тулзы от майкрософта - моветон же. А скрипт с использованием ком-объекта - отработал несколько лет.

Никого ни к чему не призываю и не обязываю, естественно, просто таки созрел до публикации сайта, потихоньку выкладываю результаты своего "творчества". Не ахти что, но может кому-то будет полезно

YuS_2
13-07-2025, 12:48
Если есть идеи, как не гонять цикл, а отслеживать именно появление файла - было бы интересно посмотреть. »
http://forum.oszone.net/post-2926058-11.html

antivan
14-07-2025, 21:44
http://forum.oszone.net/post-2926058-11.html

Спасибо. Посмотрю

antivan
14-07-2025, 22:36
Интересно. Но, похоже, проще гонять цикл с опросом, а задержкой можно и нагрузку регулировать




© OSzone.net 2001-2012