Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Пакетное преобразование xls ->xlsx (xls -> csv)

Ответить
Настройки темы
PowerShell - [решено] Пакетное преобразование xls ->xlsx (xls -> csv)

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Требуется скрипт для преобразования всех файлов в определенной папке xls в xlsx (или csv).

Отправлено: 08:19, 07-07-2021

 

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
[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
}
об этом скрипте у меня на сайте
в общем-то все итак видно, так что по ссылке ходить совсем не обязательно

Отправлено: 17:51, 12-07-2025 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6690
Благодарности: 1566

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 12-07-2025 в 20:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:43, 12-07-2025 | #22


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата DJ Mogarych:
в составе Офиса версии примерно с 2007 есть встроенный конвертер excelcnv.exe, и париться с ком-объектом Экселя уже не нужно, выше в теме было написано об этом. »
Видел, да. Но использование плохо документированной тулзы от майкрософта - моветон же. А скрипт с использованием ком-объекта - отработал несколько лет.

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

Отправлено: 21:52, 12-07-2025 | #23


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 12:48, 13-07-2025 | #24


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата YuS_2:
http://forum.oszone.net/post-2926058-11.html
Спасибо. Посмотрю

Отправлено: 21:44, 14-07-2025 | #25


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Интересно. Но, похоже, проще гонять цикл с опросом, а задержкой можно и нагрузку регулировать

Отправлено: 22:36, 14-07-2025 | #26



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Пакетное преобразование xls ->xlsx (xls -> csv)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Поиск по файлам xlsx и xls Sisin Microsoft Office (Word, Excel, Outlook и т.д.) 7 22-09-2015 15:48
PowerShell - [решено] csv to xls, xlsx firstarey Скриптовые языки администрирования Windows 3 17-03-2015 08:27
2003/XP/2000 - [решено] Пакет обеспечения совместимости Отключить автоматическре преобразование из xlsx в xls SANIOK_AV Microsoft Office (Word, Excel, Outlook и т.д.) 2 11-10-2011 17:29
PowerShell - Сложное преобразование xls или csv файла в текстовый tarasov.evgeny Скриптовые языки администрирования Windows 1 29-05-2011 15:04




 
Переход