#powershell #csv #powershell-2.0
Вопрос:
Я пытаюсь преобразовать свой CSV-файл в файл Excel с некоторым табличным форматом и стилем, но по какой-то причине я получаю «Не удается индексировать в нулевой массив». Я буду очень признателен, если смогу получить какую-либо помощь или предложение. Спасибо
function Convert-to-Excel{ $params = @{ AutoSize = $true TableStyle = 'Medium6' 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-Records11.xlsx" } $modifiedFile = Import-Csv "C:AuditLogSearchModified-Audit-Log-Records.csv" $actionReference = Import-Csv "C:AuditLogSearchReferenceAction.csv" $xlsx = 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 amp; Time" = $u."Date amp; Time" "Type of Action" = if (($actionReference | where-object { $_.Name -eq $u."Type of Action" }).Value -ne $null) { ($actionReference | where-object { $_.Name -eq $u."Type of Action" }).Value } else { $u."Type of Action" } } | Export-Excel @params $ws = $xlsx.Workbook.Worksheets[$params.Worksheetname] $ws.View.ShowGridLines = $false # =gt; This will hide the GridLines on your file Close-ExcelPackage $xlsx } }
Комментарии:
1. Где это
$xlsx
определено?2. @MathiasR.Jessen Привет, я обновил опубликованное, поэтому, пожалуйста, проверьте. $xlsx определен для каждого.
3.
foreach
ничего не возвращает. К чему ты пытаешься приступить$xlsx
?4. Вы должны, по крайней мере, установить его в новый экземпляр объекта excel.
5. @Джесси, не могли бы вы, пожалуйста, показать мне, как это сделать?. Я застрял с этой ошибкой в течение последних нескольких часов 🙁
Ответ №1:
Вы закрываете пакет Excel на первой итерации своего цикла, поэтому, когда он переходит к следующему, он пытается сделать что-то подобное:
$null[$null] # =gt; InvalidOperation: Cannot index into a null array
Попробуйте изменить свою функцию, чтобы она выглядела так:
- Во-первых, постройте
object[]
:
$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 amp; Time" = $u."Date amp; Time" "Type of Action" = if (($actionReference......... else { $u."Type of Action" } } }
- Затем экспортируйте его в Excel:
$xlsx = $result | Export-Excel @params $ws = $xlsx.Workbook.Worksheets[$params.Worksheetname] $ws.View.ShowGridLines = $false # =gt; This will hide the GridLines on your file Close-ExcelPackage $xlsx
Одна вещь, которую следует отметить, PassThru = $true
$params
означает, что вместо прямого сохранения Excel мы хотим сохранить объект в переменной для «дальнейших манипуляций», и под дальнейшими манипуляциями я имею в виду, в данном случае, скрытие линий сетки рабочего листа ( $ws.View.ShowGridLines = $false
), а затем закрытие пакета (сохраните его на диске).
Если вам не требуется вносить какие-либо изменения в рабочий лист, вы можете просто удалить PassThru
его полностью и сделать:
$result | Export-Excel @params
Который закроет пакет и сохранит Excel на вашем диске.
Комментарии:
1. @aaselab рад помочь 🙂 пожалуйста, посмотрите мое последнее обновление, я чувствую ответственность за то, что указал на это, так как я познакомил вас с
ImportExcel
Модулем.2. Огромное спасибо. 🙂