.xlsm в CSV с использованием Powershell - PullRequest
0 голосов
/ 25 июня 2018

Я хотел бы преобразовать несколько файлов в папке из .xlsm в CSV.Файлы Excel содержат несколько листов.Поскольку мои знания в Powershell очень ограничены в тот момент, когда я искал в Интернете сценарий и нашел его в Извлеките и преобразовайте все листы Excel в файлы CSV с помощью PowerShell

Проблема заключается в том, что наНесколько раз мне удавалось заставить эти сценарии работать (один сценарий вызывает другой), но я не выяснил, когда и как это происходит.Я запускаю сценарий (ы) из Powershell ISE и получаю следующее сообщение об ошибке:

Исключение вызывает "Open" с аргументом (ами) "1": "Извините, мы не смогли найтиC: \ Docs. Возможно, он был перемещен, переименован или удален? "В C: \ Docs \ xlstocsv.ps1: 9 char: 5 + $ wb = $ E.Workbooks.Open ($ excelFile) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: ComMethodTargetInvocation

Поскольку я успешно запускал эти сценарии пару разтогда правильно предположить, что сценарии верны и что-то не так с моей настройкой Powershell (?)?У меня закончились идеи.

PS Я надеюсь, что здесь разрешено вставлять ссылки на другие веб-страницы.

Редактировать код добавлен.

Скрипт один (тот, который я начинаю с Powershell ISE):

$ens = Get-ChildItem "C:\Docs\" -filter *.xlsm
foreach($e in $ens)
{   [threading.thread]::CurrentThread.CurrentCulture = 'en-US'
    ExportWSToCSV -excelFileName $e.BaseName -csvLoc "C:\Docs\Final\"
}

Сценарий два :

Function ExportWSToCSV ($excelFileName, $csvLoc)

{   [threading.thread]::CurrentThread.CurrentCulture = 'en-US'
    $excelFile = "C:\Docs\"
    $E = New-Object -ComObject Excel.Application
    $E.Visible = $false
    $E.DisplayAlerts = $false
    $wb = $E.Workbooks.Open($excelFile)
    foreach ($ws in $wb.Worksheets)
    {
        $n = $excelFileName + "_" + $ws.Name
        $ws.SaveAs($csvLoc + $n + '.csv', 6)
    }
    $E.Quit()
}
ExportWSToCSV -excelFileName "file" -csvLoc "C:\Docs\Final\"     

Я добавил "[threading.thread] ::CurrentThread.CurrentCulture = 'en-US' ", и я смог успешно запустить эти сценарии, но только один раз.Так что это в принципе, кажется, я могу отбросить эту строку из кода.

1 Ответ

0 голосов
/ 26 июня 2018

Если ваша единственная цель - преобразовать файлы из .xlsm в .csv, вы можете сделать это следующим образом (используя примеры кода):

function Convert-XlsmToCsv {
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateNotNullOrEmpty()]
        [Alias('FullName')]
        [string] $Path
    )
    begin {
        $excel = New-Object -ComObject Excel.Application -Property @{
            Visible       = $false
            DisplayAlerts = $false
        }
    }
    process {
        $root = Split-Path -Path $Path
        $filename = [System.IO.Path]::GetFileNameWithoutExtension($Path)
        $workbook = $excel.Workbooks.Open($Path)
        foreach ($worksheet in $workbook.Worksheets) {
            $name = Join-Path -Path $root -ChildPath "${filename}_$($worksheet.Name).csv"
            try {
                $worksheet.SaveAs($name, 6)
            } catch {
                Write-Error -Message "Failed to save csv! Path: '$name'. $PSItem"
            }
        }
    }
    end {
        $excel.Quit()
        $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
    }
}

Используется:

Get-ChildItem -Path C:\Docs -Filter *.xlsm |
    Convert-XlsmToCsv

Здесь сделаны некоторые предположения, но их достаточно легко редактировать.

...