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 или пустое.

Третий подход определял путь буквально, что на самом деле не очень хорошее решение, но должно работать, если исполнитель файла запускает его в правильной папке и использует правильное имя файла. В этом случае я получаю сообщение об ошибке «Участник« 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 успешно, без каких-либо проблем

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 
  • Как программно перемещать колонку суммирования из строки в столбец в сводной таблице
  • Более быстрый способ написать, чтобы преуспеть в powershell
  • Пакетное переименование w / Powershell - нужно искать и сопоставлять file_id с заголовком в csv
  • Любая возможность удалить программно поврежденные имена рангов (с пробелами) в Excel (2007/2010)
  • Powershell добавить 1 для ссылки на колонку excel
  • Скрипт Powershell для соответствия состояниям значений ячейки excel
  • Обработка файлов Excel
  • Необходимо автоматизировать скрипт для поиска и замены HEX на DEC в XML-файлах
  • быстрое генерирование Excel
  • Импорт CSV в новый рабочий лист
  • Используйте powershell для сортировки колонки excel с заголовком
  • Давайте будем гением компьютера.