Данный скрипт поможет пересохранить файлы Excel в csv. Может быть полезно перед отправкой прайсов на хостинг для дальнейшей обработки
Представим, что у нас есть директория с файлами "\\server\Quad Solutions\hosting\". Наша задача - найти файлы, имя которых начинается с xlsxtocsv_ и сохранить их в формате csv. Также для проверки работы будем сохранять оригинальный файл.
Например, на входе файл xlsxtocsv_test.xlsx, на выходе получаем два файла test.csv и test_orig.xlsx
1. Конвертировать файлы xlsx в csv при помощи компонента DCOM Excel.Application
Distributed Component Object Model (DCOM) - программная архитектура, разработанная компанией Microsoft для распределения приложений между несколькими компьютерами в сети. Программный компонент на одной из машин может использовать DCOM для передачи сообщения (его называют удаленным вызовом процедуры) к компоненту на другой машине. DCOM автоматически устанавливает соединение, передает сообщение и возвращает ответ удаленного компонента.
#папка для поиска файлов
$folder = "\\server\Quad Solutions\hosting\"
Get-ChildItem -File -Path "$($folder)xlsxtocsv_*" | ForEach-Object {
$basename = $($_.Basename)
$basename = $basename.replace('xlsxtocsv_','')
$FilePath = $_.FullName
$FilePathSave = $folder + $basename + ".csv"
$FilePathCopy = $folder + $basename + "_orig" + $($_.Extension)
try
{
unblock-file -path $FilePath
$ExcelObj = New-Object -comobject Excel.Application
$ExcelWorkBook = $ExcelObj.Workbooks.Open($FilePath)
$ExcelWorkBook.Worksheets.Item(1).Activate()
start-sleep -seconds 3
if (Test-Path $FilePathSave){
Remove-item -path $FilePathSave
}
$ExcelWorkBook.SaveAs($FilePathSave, 62)
$ExcelObj.quit()
}
finally
{ start-sleep -seconds 3
Move-Item -Path $FilePath -Destination $FilePathCopy -Force
}
}
Недостатки работы с DCOM Excel.Application:
Среди недостатков использования DCOM Excel.Application можно отметить сложности в настройке самого компонента.
2. Конвертировать файлы xlsx в csv при помощи модуля ImportExcel
Модуль ImportExcel позволяет автоматизировать работу с Excel с помощью PowerShell без установки Microsoft Office Excel.
Установка модуля ImportExcel
- для всех пользователей системы:
Install-Module ImportExcel -Scope AllUsers
- или для текущего пользователя
Install-Module ImportExcel -Scope CurrentUser
#папка для поиска файлов
$folder = "\\server\Quad Solutions\hosting\"
Get-ChildItem -File -Path "$($folder)xlsxtocsv_*" | ForEach-Object {
$basename = $($_.Basename)
$basename = $basename.replace('xlsxtocsv_','')
$FilePath = $_.FullName
$FilePathCopy = $folder + "orig_" + $basename + $($_.Extension)
$FilePathSave = $folder + $basename + ".csv"
try
{
unblock-file -path $FilePath
Import-Excel -NoHeader -Path $FilePath | Export-Csv $FilePathSave -NoTypeInformation -Encoding utf8 -Delimiter ';' -Force
}
finally
{
Move-Item -Path $FilePath -Destination $FilePathCopy -Force
}
}
Вариант обработки файла со множеством рабочих листов
#папка для поиска файлов
$folder = "\\server\Quad Solutions\hosting\"
Get-ChildItem -File -Path "$($folder)xlsxtocsv_*" | ForEach-Object {
$basename = $($_.Basename)
$basename = $basename.replace('xlsxtocsv_','')
$FilePath = $_.FullName
$FilePathCopy = $folder + "orig_" + $basename + $($_.Extension)
try
{
unblock-file -path $FilePath
$i = 1;
$sheets = (Get-ExcelSheetInfo -Path $FilePath).Name
foreach ($sheet in $sheets) {
if($i -eq 1){
$FilePathSave = $folder + $basename + ".csv"
}else{
$FilePathSave = $folder + $basename + "_sheet" + $i + ".csv"
}
Import-Excel -NoHeader -WorksheetName $sheet -Path $FilePath | Export-Csv $FilePathSave -NoTypeInformation -Encoding utf8 -Delimiter ';' -Force
$i = $i+1
}
}
finally
{
Move-Item -Path $FilePath -Destination $FilePathCopy -Force
}
}
- 28.11.2023
- 557 просмотров