Powershell excel ширина столбца

Продолжаем работать в Excel через Powershell. Напомню, что в предыдущей части мы создали небольшую таблицу и заполнили её данными. Также напомню, что это не моё “изобретение”, а очень вольный перевод вот этих трёх статей.

Для начала подготовим плацдарм для работы: создадим объект Excel и заполним его начальными данными. Я не буду на этом останавливаться, так как это было подробно рассмотрено в прошлой статье.

# Создаём Excel
$Excel = New-Object -ComObject Excel.Application

# Делаем Excel видимым
$Excel.Visible = $true

# Добавляем рабочую книгу
$WorkBook = $Excel.Workbooks.Add()

# Цепляемся к первому листу
$DiskInformation = $WorkBook.Worksheets.Item(1)

# Переименовываем лист
$DiskInformation.Name = 'Информация о дисках'

# Заголовок таблицы (самая первая ячейка)
$Row = 1
$Column = 1
$DiskInformation.Cells.Item($Row, $Column) = 'Сведения о дисковом пространстве'

# Форматируем текст, чтобы он был похож на заголовок
$DiskInformation.Cells.Item($Row, $Column).Font.Size = 18
$DiskInformation.Cells.Item($Row, $Column).Font.Bold = $true
$DiskInformation.Cells.Item($Row, $Column).Font.ThemeFont = 1
$DiskInformation.Cells.Item($Row, $Column).Font.ThemeColor = 4
$DiskInformation.Cells.Item($Row, $Column).Font.ColorIndex = 55
$DiskInformation.Cells.Item($Row, $Column).Font.Color = 8210719

# Объединяем диапазон ячеек
$Range = $DiskInformation.Range('A1','G2')
$Range.Merge()

На данном этапе у нас будет одна текстовая строка, размещённая в диапазоне ячеек с A1 по G2, т.е. в двух строках и семи столбцах, что по умолчанию выглядит не очень презентабельно, так как текст выравнивается по нижнему краю:

Excel - DiskInformation-1

Объединённые ячейки (неформатированные)

Чтобы текст в объединённых ячейках выглядел красивее его можно выровнять по вертикали по центру.

Все варианты вертикального выравнивания можно посмотреть в MSDN. А значения, которые нужно при этом использовать можно узнать выполнив команду:

[Enum]::getvalues([Microsoft.Office.Interop.Excel.XLVAlign]) |
    Select-Object @{n="Name";e={"$_"}},value__

В результате мы увидим следующую таблицу:

Name value__
xlVAlignTop -4160
xlVAlignJustify -4130
xlVAlignDistributed -4117
xlVAlignCenter -4108
xlVAlignBottom -4107

Из таблицы видно, что для выравнивания по середине нужно использовать значение

–4108.

Выравниваем:

# Выравнивание по вертикали
$Range.VerticalAlignment = -4108

После выравнивания наш текст будет выглядеть уже красивее:

Excel - DiskInformation-2

Объединённые ячейки (отформатированные)

Переходим к заполнению таблицы данными.

Для начала переходим на следующую строку. Так как в последствии вокруг таблицы мы нарисуем рамку, нам понадобится номер начальной строки, поэтому сохраним его в отдельной переменной.

Начинаем с шапки таблицы:

# Переходим на следующую строку
$Row++; $Row++

# Номер начальной строки
$InitialRow = $Row

# Заполняем шапку таблицы, устанавливая цвет фона ячейки и текст жирным
$DiskInformation.Cells.Item($Row, $Column) = 'Буква диска'
$DiskInformation.Cells.Item($Row, $Column).Interior.ColorIndex = 15
$DiskInformation.Cells.Item($Row, $Column).Font.Bold = $true
$Column++

$DiskInformation.Cells.Item($Row, $Column) = 'Метка'
$DiskInformation.Cells.Item($Row, $Column).Interior.ColorIndex = 15
$DiskInformation.Cells.Item($Row, $Column).Font.Bold = $true
$Column++

$DiskInformation.Cells.Item($Row, $Column) = 'Размер'
$DiskInformation.Cells.Item($Row, $Column).Interior.ColorIndex = 15
$DiskInformation.Cells.Item($Row, $Column).Font.Bold = $true
$Column++

$DiskInformation.Cells.Item($Row, $Column) = 'Занято'
$DiskInformation.Cells.Item($Row, $Column).Interior.ColorIndex = 15
$DiskInformation.Cells.Item($Row, $Column).Font.Bold = $true
$Column++

$DiskInformation.Cells.Item($Row, $Column) = 'Свободно'
$DiskInformation.Cells.Item($Row, $Column).Interior.ColorIndex = 15
$DiskInformation.Cells.Item($Row, $Column).Font.Bold = $true
$Column++

$DiskInformation.Cells.Item($Row, $Column) = 'Свободно, %'
$DiskInformation.Cells.Item($Row, $Column).Interior.ColorIndex = 15
$DiskInformation.Cells.Item($Row, $Column).Font.Bold = $true

# Переходим на следующую строку, возвращаемся в первый столбец
$Row++
$Column = 1

Сама таблица заполняется в цикле по логическим дискам:

Get-WmiObject Win32_LogicalDisk -Filter "DriveType = 3" | ForEach-Object {...}

Фильтрация нужна для того, чтобы исключить из рассмотрения CD/DVD диски (которые чаще всего пустые, и следовательно их размер будет равен нулю).

В цикле выводим в таблицу, интересующую нас информацию:

# Буква
$DiskInformation.Cells.Item($Row, $Column) = $_.DeviceID
$Column++

# Метка
$DiskInformation.Cells.Item($Row, $Column) = $_.VolumeName
$Column++

# Размер
$DiskInformation.Cells.Item($Row, $Column) = ([Math]::Round($_.Size/1GB, 2))
$Column++

# Занято
$DiskInformation.Cells.Item($Row, $Column) =
    [math]::Round((($_.Size - $_.FreeSpace)/1GB),2)
$Column++

# Свободно
$DiskInformation.Cells.Item($Row, $Column) =
    ([Math]::Round($_.FreeSpace/1GB, 2))
$Column++

# Сводобно, %
$DiskInformation.Cells.Item($Row, $Column) =
    ("{0:P}" -f ($_.FreeSpace / $_.Size))

А также раскрашиваем строки в зависимости от процента свободного места на диске. Для простоты я раскрашиваю строку, относящуюся к конкретному диску в жёлтый цвет, если свободного места на нём меньше 5 ГБ, и в красный цвет, если свободного места меньше 1 ГБ:

# Смотрим на заполненность дисков и раскрашиваем

# Выделяем строку таблицы
$Range = $DiskInformation.Range(("A{0}" -f $Row),("F{0}" -f $Row))
$Range.Select() | Out-Null

# Если свободного места меньше 1 ГБ
if ($_.FreeSpace -lt 1GB)
{
    # Подсвечиваем красным
    $Range.Interior.ColorIndex = 3
}

# Если свободного места меньше 5 ГБ
elseif ($_.FreeSpace -lt 5GB)
{
    # Подсвечиваем жёлтым
    $Range.Interior.ColorIndex = 6
}

# Переходим на следующую строку и возвращаемся к первой строке
$Column = 1
$Row++

Смотрим, что получилось:

 Excel - DiskInformation-3

Результаты работы (неформатированные)

Как видно на дисках C и D свободного места меньше 5 ГБ, поэтому соответствующие строки подсвечены жёлтым цветом. А на Диске F свободного места вообще меньше 1 ГБ, поэтому он подсвечен красным цветом. Кстати, для быстрого забивания диска мне пришёл на помощь скрипт, генерирующий файл заданного размера.

В целом работа выполнена. Осталось привести таблицу к боле красивому виду. Для этого мы выровняем ширину столбцов в таблице и нарисуем рамку вокруг таблицы.

Начнём с рамки.

Сейчас курсор стоит уже на следующей строке, так как в цикле мы его перевели находясь ещё в цикле. А так как нам нужны только строки таблицы возвращаемся на одну строку назад и выделяем таблицу:

# Возвращаемся на одну строку назад
$Row--

# Выделяем нашу таблицу
$DataRange = $DiskInformation.Range(("A{0}" -f $InitialRow), ("F{0}" -f $Row))

Напомню, что $InitialRow – это номер начальный строки таблицы, который мы заранее сохранили.

Переходим к “рисованию” рамки – границы диапазона ячеек.

Чтобы узнать все возможные варианты границ диапазона ячеек можно выполнить команду:

[Enum]::getvalues([Microsoft.Office.Interop.Excel.XlBordersIndex]) |
    Select-Object @{n="Name";e={"$_"}},value__

В результате получим таблицу:

Name value__
xlDiagonalDown 5
xlDiagonalUp 6
xlEdgeLeft 7
xlEdgeTop 8
xlEdgeBottom 9
xlEdgeRight 10
xlInsideVertical 11
xlInsideHorizontal 12

Как видно из таблицы для рамки подходят значения с 7 по 12.

“Рисуем”:

7..12 | ForEach-Object `
{
    $DataRange.Borders.Item($_).LineStyle = 1
    $DataRange.Borders.Item($_).Weight = 2
}

Подгоняем ширину столбцов:

# Подгоняем ширину столбцов
$UsedRange = $DiskInformation.UsedRange
$UsedRange.EntireColumn.AutoFit() | Out-Null

В результате получается вот так:

Excel - DiskInformation-4

Результаты работы (отформатированные)

Осталось сохранить полученный результат и выйти из Excel:

# Сохраняем результат и выходим
$WorkBook.SaveAs("C:tempDiskSpace.xlsx")
$Excel.Quit()

I downloaded Excel report but I need to resize some of the columns to different width using PowerShell so I’m just wondering how can I achieve that. Any help or suggestion will be appreciated.

For Example, I want to modify User, Date & Time, Item column to width size 30, Activity Column to width size 50 and some other column to width size 30 so on…


function Modify-Columns {

    $params = @{
        AutoSize      = $true
        # TableName     = 'exampleTable'
        TableStyle    = 'Light9' # => Here you can chosse the Style you like the most
        BoldTopRow    = $true
        WorksheetName = "Audit Log"
        PassThru      = $true
        Path          = "C:AuditLogSearch$((Get-Date).AddDays(-7).ToString('yyyy-MM-dd')) _ $(Get-Date -Format "yyyy-MM-dd") Audit-Log-Records.xlsx" # => Define where to save it here!
    }

    Write-Host "Start Modifiying Column and Row using AD DisplayName and Excel Files"

    $modifiedFile = Import-Csv "C:AuditLogSearchModified-Audit-Log-Records.csv"
    $actionReference = Import-Csv "C:AuditLogSearchReferenceeDiscovery_Activities_List.csv"

    $result = foreach ($u in $modifiedFile) {
        $u.User = (Get-AzureADUser -ObjectId $u.User).DisplayName
        New-Object PsObject -Property @{
            User                      = $u.User
            # "Search Criteria"         = $u."Search Criteria"
            "Result Status"           = $u."Result Status"
            "Date & Time"             = $u."Date & Time"
            "Search Conditions"       = $u."Search Conditions"
            "SharePoint Sites"        = $u."SharePoint Sites"
            "Exchange Public Folders" = $u."Exchange Public Folders"
            "Exchange Mailboxes"      = $u."Exchange Mailboxes"
            "Case Name"               = $u."Case Name"     
            "Search Criteria"         = $u."Search Criteria"
            "Item"                    = $u."Item"
            
            "Activity"                = if (($actionReference | where-object { $_.Name -eq $u."Activity" }).Value -ne $null) { ($actionReference | where-object { $_.Name -eq $u."Activity" }).Value }
            else { $u."Activity" }
        }  | Select-object -Property User, "Date & Time", "Case Name", "Item", "Activity" , "SharePoint Sites", "Exchange Mailboxes", "Exchange Public Folders" , "Search Criteria", "Result Status"
    }
    
    $xlsx = $result | Export-Excel @params
    $ws = $xlsx.Workbook.Worksheets[$params.Worksheetname]
    $ws.View.ShowGridLines = $false # => This will hide the GridLines on your file
    Close-ExcelPackage $xlsx

    Write-Host "Finished Modifiying Column and Row using AD DisplayName and Excel Files"
}

Содержание

  1. Использование команд форматирования для изменения представления выходных данных
  2. Использование Format-Wide для вывода с одним элементом
  3. Управление отображением Format-Wide с помощью столбца
  4. Использование Format-List для представления списка
  5. Получение подробных сведений с помощью Format-List с подстановочными знаками
  6. Использование Format-Table для табличных выходных данных
  7. Улучшение выходных данных Format-Table
  8. Упаковка Format-Table выходных данных в столбцы
  9. Упорядочение выходных данных таблицы
  10. PowerShell: системное администрирование и программирование
  11. Всё о PowerShell в Windows и на Linux. Системное администрирование Windows
  12. Как поменять заголовок столбца в выводе PowerShell. Как поменять ширину и выравнивание в таблицах
  13. Параметр -Property командлета Format-Table
  14. Примеры использования параметра -Property командлета Format-Table
  15. Как поменять заголовок столбца в выводе PowerShell
  16. Как поменять ширину и выравнивание в таблицах
  17. Using Format commands to change output view
  18. Using Format-Wide for single-item output
  19. Controlling Format-Wide display with column
  20. Using Format-List for a list view
  21. Getting detailed information using Format-List with wildcards
  22. Using Format-Table for tabular output
  23. Improving Format-Table output
  24. Wrapping Format-Table output in columns
  25. Organizing table output

Использование команд форматирования для изменения представления выходных данных

PowerShell предоставляет набор командлетов, которые позволяют контролировать, какие свойства должны отображаться для определенных объектов. Имена всех этих командлетов начинаются глаголом Format . Они позволяют выбрать, какие свойства будут отображаться.

В этой статье описываются командлеты Format-Wide , Format-List и Format-Table .

Каждый тип объекта в PowerShell имеет свойства по умолчанию, которые используются, если вы не выбираете свойства для отображения. Каждый командлет использует один и тот же параметр Property для указания отображаемых свойств. Так как Format-Wide отображает только одно свойство, в параметре Property он принимает только одно значение, тогда как Format-List и Format-Table поддерживают списки с именами свойств.

В этом примере выходные данные командлета Get-Process по умолчанию показывают, что у нас есть два экземпляра Internet Explorer.

Для объектов Process по умолчанию применяется формат со следующими свойствами.

Использование Format-Wide для вывода с одним элементом

По умолчанию командлет Format-Wide отображает только свойство по умолчанию для объекта. Данные, связанные с каждым объектом, отображаются в одном столбце:

Можно также задать свойство, отличное от используемого по умолчанию:

Управление отображением Format-Wide с помощью столбца

С помощью командлета Format-Wide одновременно можно отобразить только одно свойство. Это удобно для отображения больших списков в нескольких столбцах.

Использование Format-List для представления списка

Командлет Format-List показывает объект в виде списка, в котором каждое свойство снабжено меткой и отображается в отдельной строке:

Можно указать произвольное число свойств:

Получение подробных сведений с помощью Format-List с подстановочными знаками

Командлет Format-List позволяет использовать подстановочные знаки в качестве значения параметра Property. Это дает возможность отображать подробные сведения. Часто объекты содержат больше информации, чем необходимо. Поэтому PowerShell по умолчанию выводит значения не всех свойств. Чтобы отобразить все свойства объекта, используйте Format-List -Property * команду . Следующая команда создает более 60 строк выходных данных для одного процесса:

Команда Format-List полезна для вывода подробных сведений, но для получения сведений с большим числом элементов обычно удобнее использовать упрощенное табличное представление.

Использование Format-Table для табличных выходных данных

Если вызвать командлет Format-Table без указания имен свойств для форматирования вывода команды Get-Process , вы получите такие же выходные данные, как и без командлета Format . По умолчанию PowerShell отображает объекты Process в табличном формате.

Get-Service доступен только на платформах Windows.

Улучшение выходных данных Format-Table

Хотя табличное представление и полезно при выводе большого количества сведений, интерпретация данных может вызвать затруднения, если экран слишком узок и не вмещает все данные. В предыдущем примере выходные данные усекаются. Если указать параметр AutoSize при выполнении команды Format-Table , PowerShell вычислит ширину столбцов на основе размера отображаемых данных. Это повышает удобство чтения столбцов.

Командлет Format-Table и в этом случае может усекать данные, но теперь только на правой границе экрана. Свойствам, за исключением последнего отображаемого, выделяется столько места, сколько нужно для корректного вывода самого длинного элемента данных.

Команда Format-Table предполагает, что свойства перечислены в порядке важности. Командлет пытается полностью отобразить свойства, ближайшие к началу. Если команда Format-Table не может отобразить все свойства, она удаляет из представления некоторые столбцы. Это поведение можно увидеть в предыдущем примере для свойства DependentServices.

Упаковка Format-Table выходных данных в столбцы

Вы можете принудительно создать оболочку Format-Table для длинных данных в его отображаемом столбце с помощью параметра Wrap . Использование параметра Wrap не всегда приводит к ожидаемому результату, так как без параметра AutoSize он применяет параметры по умолчанию:

Использование параметра Wrap без других параметров не очень замедляет обработку. Но применение параметра AutoSize к рекурсивному выводу списка файлов в каталоге со сложной структурой может потребовать значительного времени и потреблять много памяти.

Если загрузка системы для вашего сценария не критична, параметр AutoSize хорошо сочетается с параметром Wrap. В этом случае ширина первых столбцов также позволяет выводить элементы в одной строке, а последний столбец при необходимости разбивается на несколько строк.

Возможно, некоторые столбцы не попадут в представление, если первым будет указан самый широкий столбец. Для получения лучших результатов выводите первыми элементы данных наименьшего объема.

В следующем примере первыми указаны наибольшие по размеру свойства.

Даже при использовании переноса строк столбец Id пришлось исключить:

Упорядочение выходных данных таблицы

Другим полезным параметром управления табличным выводом является GroupBy. Длинные табличные списки особенно тяжелы для сравнения. Параметр GroupBy группирует выходные данные в соответствии со значением свойства. Например, можно сгруппировать службы по параметру StartType, чтобы упростить проверку, но исключить значение StartType из списка отображаемых свойств:

Источник

PowerShell: системное администрирование и программирование

Всё о PowerShell в Windows и на Linux. Системное администрирование Windows

Как поменять заголовок столбца в выводе PowerShell. Как поменять ширину и выравнивание в таблицах

Командлет Format-Table предназначен для вывода данных в виде таблицы. У данного командлета есть несколько опций, с помощью которых можно управлять внешним видом таблицы и некоторыми другими её свойствами.

С помощью опции -Property можно менять набор выводимых данных (какие столбцы будут показаны), так и определять заголовки столбцов и использовать вычисления в выводимых данных.

Подробности смотрите в статьях:

Рассмотрим подробнее справку по опции -Property, а затем перейдём к примерам.

Параметр -Property командлета Format-Table

Параметр -Propert задаёт выводимые свойства объекта и порядок их появления. Введите одно или несколько имён свойств, разделённых запятыми, или используйте хеш-таблицу для отображения вычисляемого свойства. Подстановочные знаки разрешены.

Если вы опустите этот параметр, отображаемые свойства будут зависеть от свойств первого объекта. Например, если у первого объекта есть PropertyA и PropertyB, а у последующих объектов есть PropertyA, PropertyB и PropertyC, то будут отображаться только заголовки PropertyA и PropertyB.

Параметр -Property является необязательным. Вы не можете использовать параметры -Property и -View в одной и той же команде.

Значение параметра -Property может быть новым вычисляемым свойством. Чтобы создать вычисляемое свойство, используйте хеш-таблицу. Допустимые следующие ключи:

  • Name (или Label) = ` `
  • Expression = ` ` или ` `
  • FormatString = ` `
  • Width = ` `
  • Alignment = значением может быть Left, Center или Right

Примеры использования параметра -Property командлета Format-Table

Как поменять заголовок столбца в выводе PowerShell

Рассмотрим использование параметра -Property командлета Format-Table для изменения заголовка столбца.

К примеру, командлет Get-ChildItem без указания опций выведет папки и файлы в текущей рабочей директории:

Можно увидеть, что показано четыре столбца:

  • Mode
  • LastWriteTime
  • Length
  • Name

Команда, аналогичная предыдущей, но с явным указанием выводимых данных:

Необязательно указывать опцию -Property, следующая и предыдущая команды идентична:

В последствии в командах не будет указываться -Property.

В шапке таблицы используются английские обозначения, соответствующие названию свойств.

Следующая команда заменить заголовок последнего столбца, вместо Name там будет «Имя»:

В этой команде вместо Name (выводимый параметр) использовано выражение @>. В этом выражении значение Label (в данном случае «Имя») является заголовком выводимого столбца. А значение Expression (в данном случае $_.Name) это выводимые данные. Обратите внимание, что в качестве выводимых данных используется конструкция $_.Name, которая получилась объединением последовательности символов «$_.» и имени свойства, в данном случае «Name».

В следующей команде все имена столбцов заменены заголовками на русском языке:

При желании вы можете поменять столбцы местами или вовсе исключить ненужные данные:

Также вы можете выбрать другие данные для вывода и поменять заголовки для них:

Как поменять ширину и выравнивание в таблицах

Кроме уже рассмотренных ключей опции -Property:

  • Name (или Label) = ` `
  • Expression = ` ` или ` `

для изменения внешнего вида таблицы также можно использовать следующие:

  • Width = ЧИСЛО
  • Alignment = значением может быть «Left«, «Center» или «Right«

Как можно понять из названия ключей, Width устанавливает ширину столбцов, а Alignment отвечает за выравнивание выводимых данных в столбце.

В следующем выражении показано использование Width:

Обратите внимание на структуру:

В следующей команде показано одновременное использование Width и Alignment (а также уже рассмотренных выше Label и Expression):

Источник

Using Format commands to change output view

PowerShell has a set of cmdlets that allow you to control how properties are displayed for particular objects. The names of all the cmdlets begin with the verb Format . They let you select which properties you want to show.

This article describes the Format-Wide , Format-List , and Format-Table cmdlets.

Each object type in PowerShell has default properties that are used when you don’t select the properties to display. Each cmdlet uses the same Property parameter to specify which properties you want displayed. Because Format-Wide only shows a single property, its Property parameter only takes a single value, but the property parameters of Format-List and Format-Table accept a list of property names.

In this example, the default output of Get-Process cmdlet shows that we’ve two instances of Internet Explorer running.

The default format for Process objects displays the properties shown here:

Using Format-Wide for single-item output

The Format-Wide cmdlet, by default, displays only the default property of an object. The information associated with each object is displayed in a single column:

You can also specify a non-default property:

Controlling Format-Wide display with column

With the Format-Wide cmdlet, you can only display a single property at a time. This makes it useful for displaying large lists in multiple columns.

Using Format-List for a list view

The Format-List cmdlet displays an object in the form of a listing, with each property labeled and displayed on a separate line:

You can specify as many properties as you want:

Getting detailed information using Format-List with wildcards

The Format-List cmdlet lets you use a wildcard as the value of its Property parameter. This lets you display detailed information. Often, objects include more information than you need, which is why PowerShell doesn’t show all property values by default. To show all properties of an object, use the Format-List -Property * command. The following command generates more than 60 lines of output for a single process:

Although the Format-List command is useful for showing detail, if you want an overview of output that includes many items, a simpler tabular view is often more useful.

Using Format-Table for tabular output

If you use the Format-Table cmdlet with no property names specified to format the output of the Get-Process command, you get exactly the same output as you do without a Format cmdlet. By default, PowerShell displays Process objects in a tabular format.

Get-Service is only available on Windows platforms.

Improving Format-Table output

Although a tabular view is useful for displaying lots of information, it may be difficult to interpret if the display is too narrow for the data. In the previous example, the output is truncated. If you specify the AutoSize parameter when you run the Format-Table command, PowerShell calculates column widths based on the actual data displayed. This makes the columns readable.

The Format-Table cmdlet might still truncate data, but it only truncates at the end of the screen. Properties, other than the last one displayed, are given as much size as they need for their longest data element to display correctly.

The Format-Table command assumes that properties are listed in order of importance. The cmdlet attempts to fully display the properties nearest the beginning. If the Format-Table command can’t display all the properties, it removes some columns from the display. You can see this behavior in the DependentServices property previous example.

Wrapping Format-Table output in columns

You can force lengthy Format-Table data to wrap within its display column using the Wrap parameter. Using the Wrap parameter may not do what you expect, since it uses default settings if you don’t also specify AutoSize:

Using the Wrap parameter by itself doesn’t slow down processing very much. However, using AutoSize to format a recursive file listing of a large directory structure can take a long time and use lots of memory before displaying the first output items.

If you aren’t concerned about system load, then AutoSize works well with the Wrap parameter. The initial columns still use as much width as needed to display items on one line, but the final column is wrapped, if necessary.

Some columns may not be displayed when you specify the widest columns first. For best results, specify the smallest data elements first.

In the following example, we specify the widest properties first.

Even with wrapping, the final Id column is omitted:

Organizing table output

Another useful parameter for tabular output control is GroupBy. Longer tabular listings in particular may be hard to compare. The GroupBy parameter groups output based on a property value. For example, we can group services by StartType for easier inspection, omitting the StartType value from the property listing:

Источник

  • Remove From My Forums
  • Вопрос

  • Здравствуйте, как создать в PowerShell excel файл с четырьмя подписанными столбцами «Тип» «Номер» «Комната» «Фамилия»  и соответственно нестандартной ширины ячейки в экселе,
    хотя бы раза в 3 побольше?

    Заранее спасибо.

Ответы

  • $computer = $Env:computername
    $UserProfile = $env:USERPROFILE
    New-Item $UserProfiledesktopInventory -ItemType Directory -force | Out-Null
    
    $xl = new-object -comobject excel.application
    $xl.visible = $true
    $wb = $xl.Workbooks.Add()
    $ws = $wb.Worksheets.Item(1)
    $ws.columns.item(1).columnWidth = 50
    $ws.columns.item(2).columnWidth = 50
    $ws.columns.item(3).columnWidth = 50
    $ws.columns.item(4).columnWidth = 50
    $ws.columns.item(5).columnWidth = 50
    $ws.columns.item(6).columnWidth = 50
    
    $i=1
    #win32_BaseBoard
    $bb = get-wmiobject win32_BaseBoard
    $ws.cells.item($i,1) = "BaseBoard"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    $ws.cells.item($i,1) = "Name"
    $ws.cells.item($i,2) = "Manufacturer"
    $ws.cells.item($i,3) = "SerialNumber"
    $i++
    $ws.cells.item($i,1) = $bb.Name
    $ws.cells.item($i,2) = $bb.Manufacturer
    $ws.cells.item($i,3) = $bb.SerialNumber
    $i+=2
    
    #win32_Processor
    $pr = get-wmiobject win32_Processor
    $ws.cells.item($i,1) = "Processor"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    $ws.cells.item($i,1) = "Name"
    $ws.cells.item($i,2) = "Manufacturer"
    $ws.cells.item($i,3) = "SerialNumber"
    $i++
    $ws.cells.item($i,1) = $pr.Name
    $ws.cells.item($i,2) = $pr.Manufacturer
    $ws.cells.item($i,3) = $pr.ProcessorID
    $i+=2
    
    #win32_Bios
    $bi = get-wmiobject win32_Bios
    $ws.cells.item($i,1) = "BIOS"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    $ws.cells.item($i,1) = "Name"
    $ws.cells.item($i,2) = "Manufacturer"
    $ws.cells.item($i,3) = "SerialNumber"
    $i++
    $ws.cells.item($i,1) = $bi.Name
    $ws.cells.item($i,2) = $bi.Manufacturer
    $i+=2
    
    #Win32_CDROMDrive
    $cd = get-wmiobject Win32_CDROMDrive
    $ws.cells.item($i,1) = "CDROMDrive"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    $ws.cells.item($i,1) = "Caption"
    $ws.cells.item($i,2) = "Drive"
    $ws.cells.item($i,3) = "SerialNumber"
    $i++
    $ws.cells.item($i,1) = $cd.Caption
    $ws.cells.item($i,2) = $cd.Drive
    $ws.cells.item($i,3) = $cd.SerialNumber
    $i+=2
    
    #Win32_DesktopMonitor
    $ws.cells.item($i,1) = "PNPDeviceID"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    get-wmiobject Win32_DesktopMonitor | Foreach {
    	$ws.cells.item($i,1) = $_.PNPDeviceID
    	$i++
    }
    $i++
    
    #Win32_DiskDrive
    $ws.cells.item($i,1) = "DiskDrive"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    $ws.cells.item($i,1) = "DeviceID"
    $ws.cells.item($i,2) = "Model"
    $ws.cells.item($i,3) = "Size"
    $ws.cells.item($i,4) = "Caption"
    $i++
    get-wmiobject Win32_DiskDrive | Foreach {
    	$ws.cells.item($i,1) = $_.DeviceID
    	$ws.cells.item($i,2) = $_.Model
    	$ws.cells.item($i,3) = $_.Size
    	$ws.cells.item($i,4) = $_.Caption
    	$i++
    }
    $i++
    
    #Win32_NetworkAdapter 
    $ws.cells.item($i,1) = "NetworkAdapter"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    $ws.cells.item($i,1) = "DeviceID"
    $ws.cells.item($i,2) = "MacAddress"
    $ws.cells.item($i,3) = "Name"
    $i++
    get-wmiobject Win32_NetworkAdapter | Foreach {
    	$ws.cells.item($i,1) = $_.DeviceID
    	$ws.cells.item($i,2) = $_.MacAddress
    	$ws.cells.item($i,3) = $_.Name
    	$i++
    }
    $i++
    
    #Win32_NetworkAdapterConfiguration 
    $ws.cells.item($i,1) = "NetworkAdapterConfiguration"
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $i++
    $ws.cells.item($i,1) = "IpAddress"
    $ws.cells.item($i,2) = "Description"
    $i++
    get-wmiobject Win32_NetworkAdapterConfiguration| Foreach {
    	$ws.cells.item($i,1) = $_.IpAddress
    	$ws.cells.item($i,2) = $_.Description
    	$i++
    }
    $i++
    
    #Win32_PhysicalMemory 
    $fm = get-wmiobject Win32_PhysicalMemory
    $ws.cells.item($i,1).Font.Size = 18
    $ws.cells.item($i,1).Font.Bold=$True
    $ws.cells.item($i,1) = "PhysicalMemory"
    $i++
    $ws.cells.item($i,1) = "Capacity"
    $ws.cells.item($i,2) = "Caption"
    $ws.cells.item($i,3) = "Manufacturer"
    $ws.cells.item($i,4) = "PartNumber"
    $ws.cells.item($i,5) = "SerialNumber"
    $ws.cells.item($i,6) = "Speed"
    $i++
    $ws.cells.item($i,1) = $fm.Capacity
    $ws.cells.item($i,2) = $fm.Caption
    $ws.cells.item($i,3) = $fm.Manufacturer
    $ws.cells.item($i,4) = $fm.PartNumber
    $ws.cells.item($i,5) = $fm.SerialNumber
    $ws.cells.item($i,6) = $fm.Speed
    $i+=2
    
    $wb.saveas("C:Users$($Env:UserName)DesktopInventory$computer.xlsx")
    $xl.Quit()
    

    • Предложено в качестве ответа

      23 мая 2015 г. 8:44

    • Помечено в качестве ответа
      KazunEditor
      25 мая 2015 г. 8:59

  • $xl = new-object -comobject excel.application
    $xl.visible = $true
    $wb = $xl.Workbooks.Add()
    $ws = $wb.Worksheets.Item(1)
    $ws.columns.item(1).columnWidth = 50
    $ws.columns.item(2).columnWidth = 50
    $ws.columns.item(3).columnWidth = 50
    $ws.columns.item(4).columnWidth = 50
    $ws.cells.item(1,1) = "Тип"
    $ws.cells.item(1,2) = "Номер"
    $ws.cells.item(1,3) = "Комната"
    $ws.cells.item(1,4) = "Фамилия"
    
    
    $wb.saveas("c:Filesfile.xls")
    $xl.Quit()

    • Предложено в качестве ответа
      Vector BCOModerator
      23 мая 2015 г. 8:42
    • Помечено в качестве ответа
      KazunEditor
      25 мая 2015 г. 8:59

  • да вон у него на принтскрине… он все в одну строчку фигачит
    у нег не ругается тольна на те строчки которые закоментированы в итоге

    • Помечено в качестве ответа
      KazunEditor
      25 мая 2015 г. 8:59

I’ve already written about Doug Finke’s ImportExcel module – for example, this post from last year covers

  • Basic exporting (use where-object to reduce the number of rows , select-object to remove columns that aren’t needed)
  • Using -ClearSheet to remove old data, –Autosize to get the column-widths right, setting titles, freezing panes and applying filters, creating tables
  • Setting formats and conditional format      
  • In this post I want to round up a few other things I commonly use.

    Any custom work after the export means asking Export-Excel to pass through the unsaved Excel Package object like this

    $xl = Get-WmiObject -Class win32_logicaldisk | select -Property DeviceId,VolumeName, Size,Freespace |
               Export-Excel -Path "$env:computerName.xlsx" -WorkSheetname Volumes –PassThru

    Then we can set about making modifications to the sheet. I can keep referring to it via the Excel package object, but it’s easier to use a variable. 
    $Sheet = $xl.Workbook.Worksheets["Volumes"]

    Then I can start applying formatting, or adding extra information to the file
    Set-Format -WorkSheet $sheet -Range "C:D" -NumberFormat "0,000"
    Set-Column -Worksheet $sheet -Column 5
    -Heading "PercentageFree" -Value {"=D$row/C$row"} -NumberFormat "0%" 

    I talked about Set-column in another post. Sometimes though, the data isn’t a natural row or column and the only way to do things is by “Poking” individual cells, like this

        
    $sheet.Cells["G2"].value = "Collected on"
    $sheet.Cells["G3"].value = [datetime]::Today
    $sheet.Cells["G3"].Style.Numberformat.Format =
     "mm-dd-yy"
    $sheet.Cells.AutoFitColumns()
    Close-ExcelPackage $xl –Show

    Sharp-eyed readers will see that the date format appears to be “Least-significant-in-the-middle” which is only used by one country – and not the one where I live. It turns out Excel tokenizes some formats – this MSDN page explains and describes “number formats whose formatCode value is implied rather than explicitly saved in the file….. [some] can be interpreted differently, depending on the UI language”. In other words if you write “mm-dd-yy” or “m/d/yy h:mm” it will be translated into the local date or date time format. When Export-Excel encounters a date/time value it uses the second of these; and yes, the first one does use hyphens and the second does use slashes. My to-do list includes adding an argument completer for Set-Format so that it proposes these formats.

    Since the columns change their widths during these steps I only auto-size them when I’ve finished setting their data and formats. So now I have the first page in the audit workbook for my computer

    image

    Of course there times when we don’t want a book per computer with each aspect on it’s own sheet, but we want book for each aspect with a page per computer.
    If we want to copy a sheet from one workbook to another, we could read the data and write it back out like this

    Import-Excel -Path "$env:COMPUTERNAME.xlsx" -WorksheetName "volumes" | 
         Export-Excel
    -Path "volumes.xlsx" -WorkSheetname $env:COMPUTERNAME

    but this strips off all the formatting and loses the formulas  – however the Workbook object offers a better way, we can get the Excel package for an existing file with
    $xl1 = Open-ExcelPackage -path "$env:COMPUTERNAME.xlsx"

    and create a new file and get the Package object for it with 
    $xl2 = Export-Excel -Path "volumes.xlsx" -PassThru

    (if the file exists we can use Open-ExcelPackage). The worksheets collection has an add method which allows you to specify an existing sheet as the basis of the new one, so we can call that, remove the default sheet that export created, and close the files (saving and loading in Excel, or not, as required) 

    $newSheet = $xl2.Workbook.Worksheets.Add($env:COMPUTERNAME, ($xl1.Workbook.Worksheets["Volumes"]))
    $xl2.Workbook.Worksheets.Delete("Sheet1")
    Close-ExcelPackage $xl2 -show
    Close-ExcelPackage $xl1 –NoSave

    The new workbook looks the same (formatting has been preserved —  although I have found it doesn’t like conditional formatting) but the file name and sheet name have switched places.

    image

    Recently I’ve found that I want the equivalent of selecting “Transpose” in Excel’s paste-special dialog- take an object with many properties and instead of exporting it so it runs over many columns in making a two-column list of Property name and value
    For example
    $x = Get-WmiObject win32_computersystem  | Select-Object -Property Caption,Domain,Manufacturer,
                                Model, TotalPhysicalMemory, NumberOfProcessors, NumberOfLogicalProcessors

    $x.psobject.Properties | Select-Object -Property name,value |
        Export-Excel -Path "$env:COMPUTERNAME.xlsx" -WorkSheetname General -NoHeader -AutoSize –Show

    imagec

    When I do this i a real script I use the –passthru swtich and apply some formatting

    $ws    = $excel.Workbook.Worksheets["General"]
    $ws.Column(1).Width                     =  64
    $ws.Column(1).Style.VerticalAlignment   = "Center"
    $ws.Column(2).Width                     =  128
    $ws.Column(2).Style.HorizontalAlignment = "Left"
    $ws.Column(2).Style.WrapText            = $true

    Of course I could use Set-Format instead but sometimes the natural way is to refer to use .Cells[]  , .Row() or .Column().

    Like this post? Please share to your friends:
  • Powerpoint based on excel
  • Powershell excel удалить строку
  • Power query для excel для mac
  • Powerpivot нет в надстройках excel 2016
  • Powershell excel сохранить как