Экспорт Powershell в Excel
Обновлено: 20.11.2024
Файлы Excel — популярный источник данных. С помощью бесплатного модуля ImportExcel PowerShell поддерживает чтение и запись файлов .xlsx.
Файлы Excel (.xlsx) являются очень важным форматом обмена данными по ряду причин:
- Удобочитаемость: файлы Excel могут быть легко открыты и прочитаны персоналом, не являющимся ИТ-специалистом. Просматривать данные или вносить изменения очень просто.
- Поддержка типов. Файлы Excel поддерживают основные типы данных, такие как строки, даты и числовые значения.
- Не зависит от платформы: вы можете обмениваться данными Excel между платформами и регионами. В отличие от текстовых форматов, с кодировкой и поддержкой специальных символов проблем нет
Однако в PowerShell нет встроенной поддержки файлов .xlsx. Вот почему ранее пользователи прибегали к экспорту данных Excel в csv, а затем использовали Import-Csv для чтения экспортированных данных в PowerShell.
Этот обходной путь требует дополнительной работы и имеет ряд других недостатков. Благодаря бесплатному модулю ImportExcel дополнительный маршрут через csv больше не требуется. Теперь вы можете напрямую читать и записывать данные .xlsx. Microsoft Office не требуется.
В этой статье вы узнаете, как читать и записывать файлы .xlsx и .xlsm, используя всего одну строку кода. Кроме того, я предоставляю вам Convert-XlsToXlsx, умную функцию, которая автоматически преобразует файлы .xls в типы файлов .xlsx и .xlsm. Это важно, поскольку ImportExcel может работать только с современными типами файлов .xlsx и .xlsm. В старых файлах Excel .xls используется проприетарный двоичный формат, который может читать только Excel.
Convert-XlsToXlsx может быть очень полезен сам по себе, когда вам нужно массово преобразовать старые файлы Excel в современные форматы.
Он также иллюстрирует, как получить доступ к объектной модели Excel, и и, что более важно, как освобождать объекты COM, чтобы избежать утечек памяти и фантомных процессов.
Добавление поддержки Excel в PowerShell
Благодаря Дугу Финке и его потрясающему бесплатному модулю ImportExcel чтение файлов и запись файлов .xlsx стало проще простого — установка Office не требуется. Просто загрузите и установите этот бесплатный модуль из галереи PowerShell:
Если у вас есть права Администратора, вы можете вместо этого установить модуль для Всех пользователей. Это гарантирует, что модуль доступен для всех пользователей, но, что более важно, он делает модуль доступным как для Windows PowerShell, так и для PowerShell 7.
Когда вы устанавливаете модули в области CurrentUser, модули доступны только для той версии PowerShell, которую вы использовали для установки, поэтому потенциально вам придется установить модуль дважды в разных местах. р>
Чтение и запись файлов Excel
Import-Excel: получает путь к файлу .xlsx и возвращает все данные из рабочего листа по умолчанию. Используйте параметр -WorksheetName, чтобы указать данный рабочий лист. Пример:
Export-Excel: сохраняет все передаваемые данные в файл *.xlsx. Используйте параметр -WorksheetName, чтобы указать данный рабочий лист. По умолчанию существующие данные на листе будут перезаписаны. Пример:
Игра с примерами данных
Давайте поиграем с новыми командами Excel! Написать файлы Excel очень просто: передайте данные в Export-Excel для создания новых файлов Excel:
Чтобы поиграть с Import-Excel, давайте сначала извлечем несколько реальных файлов с образцами данных.
Загрузка образцов данных
Найти образцы данных Excel очень просто: просто введите в Google Загрузить образцы данных Excel, чтобы получить URL-адреса. Они приходят в виде отдельных файлов и ZIP-архивов. Чтобы сделать загрузку приятной, я создал несколько вспомогательных функций.
Для загрузки файлов используйте Download-File и Download-Zip :
Когда вы запускаете этот код, он загружает несколько примеров файлов Excel:
Чтение файлов Excel
Чтобы считывать данные непосредственно из файлов Excel, используйте Import-Excel . Например, чтобы получить финансовые данные только за декабрь, попробуйте следующее:
По умолчанию Import-Excel считывает данные с первого рабочего листа. Если ваш файл содержит более одного рабочего листа, используйте параметр -WorksheetName, чтобы указать его имя.
Чтобы сгруппировать страны на декабрь, просто используйте стандартные командлеты конвейера PowerShell:
Очевидно, что это можно сделать и непосредственно в Excel. Речь идет об автоматизации (на случай, если вам нужно регулярно проводить такого рода анализ), и это для домашних мальчиков PowerShell, которые могут не знать, как выполнять повороты в Excel, но знают свои инструменты в PowerShell.< /p>
И речь идет об обучении: нет лучшего способа изучить командлеты конвейера PowerShell!
Вот результат:
Доступ к файлам XLS
Плохая новость: файлы .xls недоступны. Они используют проприетарный двоичный формат, который может быть прочитан только Excel.
Хорошая новость: если у вас установлен Excel, конвертировать файлы .xls в файлы .xlsx очень просто. Если вы действительно все еще используете файлы .xls, вам следует подумать об этом преобразовании навсегда. .xls действительно устарел и не должен больше использоваться.
Преобразование XLS в XLSX
Выше я скачал кучу файлов .xls, которые не могут быть обработаны с помощью Import-Excel. Облом.
Ниже приведена функция Convert-XlsToXlsx, которая автоматически преобразует файлы .xls в файлы .xlsx и .xlsm. Сценарий требует, чтобы на вашем компьютере был установлен Microsoft Office, поскольку только Excel умеет открывать двоичный формат, используемый в файлах .xls:
Детальное обсуждение этой функции выходит за рамки этой статьи. Однако я хотел бы отметить, что код иллюстрирует важные аспекты использования объектов COM в PowerShell:
При использовании объектов COM, таких как Excel.Application, может быть сложно освободить все ссылки на объекты в конце. Если вы сделаете это неправильно, ссылки останутся активными, как и процесс excel в памяти. Конечно, вы всегда можете убить процесс после использования, но это может повредить excel, и в следующий раз, когда вы запустите его, он запустится в режиме восстановления.
Лучший подход — убедиться, что вы сохраняете каждую ссылку на объект в выделенной переменной. Затем убедитесь, что вы активно освобождаете каждую ссылку после использования, вызывая ReleaseComObject().
Если вы все сделали правильно, ни одна открытая ссылка не должна сохраниться, а когда вы вызываете Quit(), excel em> следует удалить из списка процессов.
Теперь преобразовать все загруженные файлы .xls в соответствующие новые форматы несложно:
/
Настоящая статья распространяется по международной лицензии Attribution-NoDerivatives 4.0.
Все образцы кода лицензируются по международной лицензии Attribution 4.0. Используйте, делитесь и экспериментируйте свободно.
Вывод: приглашенный блогер Дуг Финке рассказывает о своем модуле PowerShell Excel.
Модуль PowerShell Excel — это совершенно новый, интересный и улучшенный способ взаимодействия с Microsoft Excel из Windows PowerShell. Кроме того, для бонусных баллов вам не нужно устанавливать Excel на целевом компьютере для создания электронной таблицы. Многие пользователи этого модуля создают электронные таблицы Excel на серверах, а затем другие сотрудники компании получают отчеты с центрального сервера. Или на последнем этапе сценария они могут отправить файл .xlsx по почте.
Вызов
До сих пор существовало несколько способов переноса данных в Excel. Один из способов — создать файл значений с разделителями-запятыми (.csv) с помощью команды Export-Csv, а затем открыть его в Excel, например:
Процесс получения | Export-Csv – NoType c:\Temp\ps.csv
Еще один способ получить данные в Excel – удаленное управление Excel. Используйте COM-интерфейс Excel, чтобы раскрутить его, создать рабочую книгу или рабочий лист, а затем прокрутить свои данные, чтобы поместить их в соответствующие ячейки. Вам нужно создать заголовки и добавить данные в правильную строку и столбец.
Вот фрагмент, который создает Excel, делает его видимым, а затем добавляет книгу:
$xl = New-Object -ComObject Excel.Application
Войдите в Office, откройте XML
Что, если бы вы могли просто сделать это?
Процесс получения | Экспорт-Excel c:\temp\ps.xlsx – Показать
В этом примере создается файл ps.xlsx, рабочая книга, рабочий лист, строка заголовка и систематизируются все данные в строках и столбцах. Параметр –Show запускает Excel и открывает файл ps.xlsx.
Это здорово (и работает с любыми данными в PowerShell). Плоские данные важны, как и визуальные эффекты.
Поднимитесь на ступеньку выше
Что, если бы вы могли создать следующий визуальный образ? Модуль PowerShell Excel позволяет создавать сводные таблицы и диаграммы Excel на основе преобразованных данных. Из сгенерированных выше данных (и сохраненных в отдельной электронной таблице в той же книге) можно легко создать сводную таблицу и диаграмму.
Вот сценарий:
Процесс получения | Где Компания |
Экспорт-Excel C:\Temp\ps.xlsx-Показать `
-IncludePivotTable -PivotRows Company -PivotData @Handles="sum">`
-IncludePivotChart -ChartType PieExploded3D
Командлеты IncludePivotTable и IncludePivotChart создают сводную таблицу и диаграмму. ChartType позволяет вам выбрать, какой тип диаграммы вы хотите (есть много вариантов).Параметры PivotRows и PivotData описывают, как сводить данные в таблицы.
Если вы запустите Get-Process, вы увидите каждый процесс, запущенный в вашей системе. Сводная таблица в Excel группирует информацию с помощью PivotRows и вычисляет измерения с помощью PivotData. Здесь вы говорите ему суммировать количество ручек. На предыдущем изображении количество дескрипторов суммируется из Get-Process и группируется по компаниям. Теперь вы можете видеть, что процессы, запущенные корпорацией Microsoft, имеют почти 50 тыс. дескрипторов.
Это краткий обзор
Я написал модуль Excel для подключения к экосистеме PowerShell, чтобы вы могли легко экспортировать любые данные в Excel точно так же, как в файл .csv. Вы можете передать результаты запроса SQL Server или REST API — список можно продолжать и продолжать.
Есть еще много интересного в этом модуле. Попробуйте функцию Import-Excel, которая позволяет читать электронную таблицу Excel и преобразовывать ее в объекты PowerShell. Он подходит для использования существующих электронных таблиц, применения вычислений (или добавления дополнительных данных из поиска) и быстрого создания новой электронной таблицы. Вот пример:
Где взять?
Существует несколько способов загрузки и установки этого модуля.
Галерея PowerShell Если вы используете Windows PowerShell 5.0, вы можете использовать новую команду Install-Module ImportExcel. Он вытащит модуль из галереи.
GitHub Вы также можете получить его с GitHub: dfinke/ImportExcel.
Несколько слов о GitHub…
Вы можете отметить проект, если он вам нравится. Вы также можете открыть вопросы, если у вас есть вопросы или вы нашли проблемы. Кроме того, вы можете установить модуль с GitHub. Вы также можете клонировать или разветвить проект. Это позволяет вам вносить необходимые изменения. Если вы хотите поделиться ими, вы можете создать запрос на извлечение, чтобы добавить его в основной проект.
Присоединяйтесь! Перейдите на GitHub и опубликуйте, что вы хотели бы увидеть и как вы с этим работаете.
Преобразует объекты в серию строк значений, разделенных запятыми (CSV), и сохраняет строки в файл.
Синтаксис
Описание
Командлет Export-CSV создает CSV-файл отправленных вами объектов. Каждый объект представляет собой строку, содержащую разделенный запятыми список значений свойств объекта. Командлет Export-CSV можно использовать для создания электронных таблиц и обмена данными с программами, которые принимают файлы CSV в качестве входных данных.
Не форматируйте объекты перед их отправкой командлету Export-CSV. Если Export-CSV получает отформатированные объекты, файл CSV содержит свойства формата, а не свойства объекта. Чтобы экспортировать только выбранные свойства объекта, используйте командлет Select-Object.
Примеры
Пример 1. Экспорт свойств процесса в CSV-файл
В этом примере выбираются объекты Process с определенными свойствами, объекты экспортируются в файл CSV.
Пример 2. Экспорт процессов в файл с разделителями-запятыми
В этом примере получаются объекты Process и экспортируются объекты в CSV-файл.
Пример 3. Экспорт процессов в файл, разделенный точкой с запятой
В этом примере получаются объекты Process и экспортируются объекты в файл с разделителем в виде точки с запятой.
Пример 4. Экспорт процессов с использованием разделителя списка текущего языка и региональных параметров
В этом примере получаются объекты Process и экспортируются объекты в файл. Разделитель — это разделитель списка текущего языка и региональных параметров.
Пример 5. Экспорт процессов с информацией о типе
Пример 6. Экспорт и добавление объектов в CSV-файл
В этом примере показано, как экспортировать объекты в файл CSV и использовать параметр Append для добавления объектов в существующий файл.
Командлет Get-Service получает объекты службы. Параметр DisplayName возвращает службы, содержащие слово Application. Объекты службы отправляются по конвейеру командлету Select-Object. Командлет Select-Object использует параметр Property для указания свойств DisplayName и Status. В переменной $AppService хранятся объекты.
Командлеты Get-Service и Select-Object повторяются для служб, содержащих слово Windows. В переменной $WinService хранятся объекты службы. Командлет Export-Csv использует параметр Append, чтобы указать, что объекты $WinService добавляются в существующий файл Services.csv. Командлет Get-Content повторяется, чтобы отобразить обновленный файл, содержащий добавленные данные.
Пример 7. Командлет форматирования в конвейере приводит к неожиданным результатам
В этом примере показано, почему важно не использовать командлет форматирования в конвейере. При получении неожиданного вывода устраните неполадки в синтаксисе конвейера.
При использовании командлета Format-Table в конвейере для выбора свойств получены неожиданные результаты. Format-Table отправляет объекты формата таблицы по конвейеру командлету Export-Csv, а не объекту DateTime. Export-Csv преобразует объекты формата таблицы в ряд строк CSV. Командлет Get-Content отображает CSV-файл, содержащий объекты формата таблицы.
Пример 8. Использование параметра Force для перезаписи файлов, доступных только для чтения
В этом примере создается пустой файл, доступный только для чтения, и используется параметр Force для обновления файла.
В командлет Export-Csv добавлен параметр Force, который принудительно записывает экспорт в файл. Командлет Get-Content использует параметр Path для отображения файла, расположенного в текущем каталоге.
Пример 9: Использование параметра Force с Append
В этом примере показано, как использовать параметры Force и Append. При объединении этих параметров несоответствующие свойства объекта могут быть записаны в файл CSV.
Другое выражение создает PSCustomObject со свойствами Name и Edition. Значения хранятся в переменной $AdditionalContent. Переменная $AdditionalContent передается по конвейеру командлету Export-Csv. Параметр Append используется для добавления данных в файл. Добавление завершается неудачно из-за несоответствия имени свойства между Version и Edition.
Параметр Force командлета Export-Csv используется для принудительной записи экспорта в файл. Свойство Edition отбрасывается. Командлет Import-Csv использует параметр Path для отображения файла, расположенного в текущем каталоге.
Пример 10. Экспорт в CSV с кавычками вокруг двух столбцов
В этом примере объект DateTime преобразуется в строку CSV.
Пример 11. Экспорт в CSV с кавычками только при необходимости
В этом примере объект DateTime преобразуется в строку CSV.
Пример 12. Преобразование хэш-таблиц в CSV
В PowerShell 7.2 и более поздних версиях при экспорте хэш-таблиц в CSV ключи первой хэш-таблицы сериализуются и используются в качестве заголовков в выходных данных CSV-файла.
Пример 13. Преобразование хеш-таблиц в CSV с дополнительными свойствами
В PowerShell 7.2 и более поздних версиях при экспорте хэш-таблицы с дополнительными свойствами, добавленными командлетом Add-Member или Select-Object, дополнительные свойства также добавляются в виде заголовка в CSV-файл.
Каждая хеш-таблица имеет свойство ExtraProp, добавленное командлетом Add-Member, а затем экспортированное в CSV. Вы можете видеть, что ExtraProp теперь является заголовком в выходном файле CSV.
Если добавленное свойство имеет то же имя, что и ключ из хеш-таблицы, ключ имеет приоритет, и только ключ экспортируется в CSV.
Параметры
Используйте этот параметр, чтобы команда Export-CSV добавляла выходные данные CSV в конец указанного файла. Без этого параметра Export-CSV заменяет содержимое файла без предупреждения.
Этот параметр появился в Windows PowerShell 3.0.
Тип: | SwitchParameter |
Позиция: | Именованный |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Запрашивает подтверждение перед запуском командлета.
Тип: | SwitchParameter |
Псевдонимы: | cf |
Позиция: | Имя |
Значение по умолчанию: | False | < /tr>
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Тип: | Char |
Позиция: | 1 |
Значение по умолчанию: | запятая (,) |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Указывает кодировку экспортируемого CSV-файла. Значение по умолчанию — utf8NoBOM .
Для этого параметра допустимы следующие значения:
- ascii : использует кодировку для набора символов ASCII (7-бит).
- bigendianunicode : кодирует в формате UTF-16, используя порядок байтов с обратным порядком байтов.
- bigendianutf32 : кодирует в формате UTF-32, используя порядок байтов с обратным порядком байтов.
- oem : использует кодировку по умолчанию для MS-DOS и консольных программ.
- Unicode : кодирует в формате UTF-16, используя порядок байтов с прямым порядком байтов.
- utf7 : кодирует в формате UTF-7.
- utf8 : кодирует в формате UTF-8.
- utf8BOM: кодирует в формате UTF-8 с меткой порядка байтов (BOM).
- utf8NoBOM: кодирует в формате UTF-8 без метки порядка байтов (BOM).
- utf32 : кодирует в формате UTF-32.
UTF-7* больше не рекомендуется использовать. Начиная с PowerShell 7.1, выдается предупреждение, если вы укажете utf7 для параметра Encoding.
Тип: | Кодировка |
Допустимые значения: | ASCII, BigEndianUnicode, BigEndianUTF32, OEM , Unicode, UTF7, UTF8, UTF8BOM, UTF8NoBOM, UTF32 |
Позиция: | По имени |
Значение по умолчанию: | UTF8NoBOM |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Этот параметр позволяет Export-Csv перезаписывать файлы с атрибутом "Только для чтения".
При объединении параметров Force и Append объекты с несовпадающими свойствами могут быть записаны в файл CSV. В файл записываются только те свойства, которые совпадают. Несоответствующие свойства отбрасываются.
Тип: | SwitchParameter |
Позиция: | Именованный |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Этот параметр появился в PowerShell 6.0.
Указывает объекты для экспорта в виде строк CSV. Введите переменную, содержащую объекты, или введите команду или выражение для получения объектов. Вы также можете передавать объекты в Export-CSV .
Тип: | PSObject |
Позиция: | Именованный |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | Истина |
Допускать подстановочные знаки: | False |
Указывает путь к выходному файлу CSV. В отличие от Path, значение параметра LiteralPath используется точно так, как оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь включает escape-символы, используйте одинарные кавычки. Одинарные кавычки сообщают PowerShell, что никакие символы не следует интерпретировать как управляющие последовательности.
Тип: | String |
Псевдонимы: | PSPath, LP td> |
Позиция: | Имя |
Значение по умолчанию: | Нет |
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False< /td> |
Используйте этот параметр, чтобы Export-CSV не перезаписывал существующий файл. По умолчанию, если файл существует по указанному пути, Export-CSV перезаписывает файл без предупреждения.
Тип: | SwitchParameter |
Псевдонимы: | NoOverwrite |
Позиция: | Имя |
Значение по умолчанию: | Нет | < /tr>
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Тип: | SwitchParameter |
Псевдонимы: | NTI |
Позиция: | Имя |
Значение по умолчанию: | Нет | < /tr>
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Тип: | Строка |
Позиция: | 0 |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Указывает имена столбцов, которые должны быть заключены в кавычки. При использовании этого параметра в кавычки заключаются только указанные столбцы. Этот параметр был добавлен в PowerShell 7.0.
Тип: | String [ ] |
Псевдонимы: | QF td> |
Позиция: | Имя |
Значение по умолчанию: | Нет |
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False< /td> |
Использует разделитель списка для текущего языка и региональных параметров в качестве разделителя элементов. Чтобы найти разделитель списка для языка и региональных параметров, используйте следующую команду: (Get-Culture).TextInfo.ListSeparator .
Тип: | SwitchParameter |
Позиция: | Именованный |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
- Никогда — ничего не цитируйте
- Всегда – цитировать все (поведение по умолчанию)
- AsNeeded – заключать в кавычки только те поля, которые содержат символ-разделитель, двойную кавычку или символ новой строки.
Этот параметр был добавлен в PowerShell 7.0.
Предотвращает обработку командлета или внесение изменений. В выходных данных показано, что произойдет, если командлет будет запущен.
Тип: | SwitchParameter |
Псевдонимы: | wi |
Позиция: | Имя |
Значение по умолчанию: | False | < /tr>
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False |