import xlsx преобразован в csv в powershell
Мне нужно импортировать файл csv в мой PS-скрипт. В том же скрипте у меня есть функция для преобразования xlsx-файла в csv, который мне нужно импортировать. Но я не могу найти способ сделать это. Я пробовал три подхода:
$CSVLicence = Import-Csv (ConvertXLSX -File $Licence) -Delimiter "," -Encoding UTF8
Где ConvertXLSX – это функция преобразования xlsx в csv, $ License – это переменная, определенная в начале скрипта. Второй подход заключается в следующем:
$CSVfile = ConvertXLSX -File $Licence $CSVLicence = ImportCsv $CSVfile -Delimiter "," -Encoding UTF8
В обоих случаях я получаю сообщение об ошибке в столбце сразу после «Import-Csv», этот аргумент Path имеет значение null или пустое.
- Передать переменную из PowerShell в макрос VBA?
- Задайте переменную с URL-адресом в действие powershell
- Функция Powershell, которая принимает многомерные массивы в качестве параметров
- Возвращать повторяющиеся имена (включая частичные совпадения)
- Обновить набор данных Excel в SharePoint Online с помощью ошибки PowerShell 403
Третий подход определял путь буквально, что на самом деле не очень хорошее решение, но должно работать, если исполнитель файла запускает его в правильной папке и использует правильное имя файла. В этом случае я получаю сообщение об ошибке «Участник« Proemail Exchg Business »уже присутствует» перед командлетом «Импорт-ЦСВ»
Создается файл csv, и он выглядит точно так, как должен, поэтому, очевидно, не существует ошибки в функции преобразования.
Функция ConvertXLSX определяется следующим образом:
$Licence = "licence" Function ConvertXLSX ($File) { $PWD = "r:\Licence\" $ExcelFile = $PWD + $File + ".xlsx" $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $false $Excel.DisplayAlerts = $false $wb = $Excel.Workbooks.Open($ExcelFile) foreach ($ws in $wb.Worksheets | where {$_.name -eq "Pridani"}) { $ws.SaveAs($PWD + $File + ".csv",6) } $Excel.Quit() } ConvertXLSX -File $Licence
Функция создает файл csv успешно, без каких-либо проблем
- Powershell: Открыть HTM и Сохранить как XLS
- Возвращение Powershell приводит к Excel через VBA
- Вывод SQL в PowerShell
- Powershell - добавить 1 к строке
- Скрипт Powershell перестает работать при запуске планировщика задач
- Процесс удаления после выполнения скрипта excel Powershell запускается. Что мне не хватает?
- Как определить, установлено ли 64-битное или 32-битное excel через Powershell?
- Импорт Excel, экспорт CSV с помощью PowerShell
TheIncorrigible1 очень хорошо объяснил проблему. Теперь, когда вы отредактировали вопрос, чтобы добавить функцию ConvertXLSX
, мы можем построить это, чтобы получить подходящее решение.
$ws.SaveAs($PWD + $File + ".csv",6)
Эта часть – это сохранение имени файла $PWD + $File + ".csv"
. Число 6
представляет CSV XlFileFormat Enumeration .
Функция ничего не возвращает, просто выполняет действие во внешнем файле. Вот почему вы получаете пустую или пустую ошибку. Мы можем заставить его вернуть путь к файлу или вернуть данные в объект и использовать ConvertFrom-Csv
.
Учитывая ваш код, объект потребует больше работы, поскольку у вас уже есть путь к файлу.
Чтобы вернуть путь к файлу, измените:
} $Excel.Quit() }
Для того, чтобы:
} $Excel.Quit() return $($PWD + $File + ".csv") }
Затем вы должны работать.
Вы можете улучшить его читабельность и краткость:
-
Назначьте имя файла CSV переменной.
-
Избегайте назначения
$PWD
поскольку это псевдоним дляGet-Location
-
Избавьтесь от
foreach
. Вы получаете только один лист и сохраняете этот лист на данный момент. Если вы делаете это для нескольких листов, вам нужно будетImport-Csv
, как передать несколько путей / объектов вImport-Csv
/ConvertFrom-Csv
Объединяя все это:
$Licence = "licence" Function ConvertXLSX ($File) { $rootDir = "r:\Licence\" $ExcelFile = $rootDir + $File + ".xlsx" $CSVFile = $ExcelFile.Replace(".xlsx",".csv") $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $false $Excel.DisplayAlerts = $false $wb = $Excel.Workbooks.Open($ExcelFile) $ws = $wb.Worksheets | where {$_.name -eq "Pridani"}) $ws.SaveAs($CSVFile,6) $Excel.Quit() return CSVFile } ConvertXLSX -File $Licence
Я получаю сообщение об ошибке «Участник« Proemail Exchg Business »уже присутствует» перед командлетом «Import-Csv»
Этот вопрос обрабатывается в этой статье StackOverflow . Короче говоря, у вас есть две колонки с «Proemail Exchg Business» в первой строке.
PowerShell создает объект из CSV: заголовки столбцов должны быть уникальными. Либо закрепите в листе excel, либо вручную укажите уникальные заголовки, используя -Header
как в связанной записи.
Вы используете неверный командлет. Import-Csv
предназначен для использования с file.csv
, а не с строковым объектом или иным способом. Для этой цели существует командлет ConvertFrom-Csv
, который принимает параметр -InputObject
(указывающий, что он принимает ввод конвейера).
PS C:\> Get-Help -Name 'ConvertFrom-Csv' SYNTAX ConvertFrom-Csv [-InputObject] <PSObject[]> [[-Delimiter] <Char>] [-Header <String[]>]
Используется в вашем примере:
## Declaration of the delimiter is unnecessary when it's a comma $CSVLicense = ConvertXLSX -File $Licence | ConvertFrom-Csv