Как вставить значения массива из XML в каждую последовательную ячейку строки в Excel, цикл для каждой строки? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть файл XML, который содержит значение для каждого часа данного дня для данного месяца.

Например, дата / время начала будут 15-го числа в 12:00 утра данного месяца, а дата / время окончания будут 15-го числа в 12:00 утра следующего месяца.

Пример файла XML:

<Generated>
<Entry>
    <ID>76492055</ID>
    <Date>2018-09-15</Date>
    <Time>00:00:00</Time>
    <Income>746557.0993</Income>
</Entry>
<Entry>
    <ID>76492055</ID>
    <Date>2018-09-15</Date>
    <Time>01:00:00</Time>
    <Income>815445.5908</Income>
</Entry>
<Entry>
    <ID>76492055</ID>
    <Date>2018-09-15</Date>
    <Time>02:00:00</Time>
    <Income>1190228.1310</Income>
</Entry>
<Entry>
    <ID>76492055</ID>
    <Date>2018-09-15</Date>
    <Time>03:00:00</Time>
    <Income>932243.0268</Income>
</Entry>
<Entry>
    <ID>76492055</ID>
    <Date>2018-09-15</Date>
    <Time>04:00:00</Time>
    <Income>709702.1181</Income>
</Entry>
...
</Generated>

Я вполне могу точно отобразить данные с помощью следующего кода в PowerShell:

$xml = [System.Xml.XmlDocument](Get-Content "TheXMLFile.xml")

[datetime]$EndDate = (Get-Date).AddMonths(0).ToString("yyyy-MM-15")
[datetime]$StartDate = (Get-Date).AddMonths(-1).ToString("yyyy-MM-15")

$IncomeDates = 0..(($EndDate - $StartDate).days-1) | % { 
$StartDate.AddDays($_).ToShortDateString() }

foreach ($IncomeDate in $IncomeDates) { 
    $xml.Generated.Entry | Where {$_.Date -eq $IncomeDate} | Select ID,Date,Time,Income
}

Однако мне нужно, чтобы PowerShell извлекал данные XML для данного дня (в часе) этого месяца и вставлял их в каждую последовательную ячейку в этой строке (того дня) на целевом листе Excel.

Пример целевой таблицы:

Target worksheet

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Взяв ваш код и расширив foreach:

$xml = [System.Xml.XmlDocument](Get-Content "TheXMLFile.xml")

[datetime]$EndDate = (Get-Date).AddMonths(0).ToString("yyyy-MM-15")
[datetime]$StartDate = (Get-Date).AddMonths(-1).ToString("yyyy-MM-15")

$IncomeDates = 0..(($EndDate - $StartDate).days-1) | % { 
$StartDate.AddDays($_).ToShortDateString() }

$Data = foreach ($IncomeDate in $IncomeDates) { 
    $xml.Generated.Entry | Where {$_.Date -eq $IncomeDate} | Select ID,Date,Time,Income
}

$Data|Export-excel .\TheExcelfile.xlsx -IncludePivotTable  -PivotRows "Date" -PivotColumns "Time" -PivotData @{"InCome"="Sum"} -Sh

Доходность, основанная на ваших данных образца:

enter image description here

0 голосов
/ 27 октября 2018

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

$xml = [System.Xml.XmlDocument](Get-Content "TheXMLFile.xml")

$XL = New-Object -ComObject Excel.Application
$WB = $XL.workbooks.open('C:\Path\To\Spreadsheet.xls')
$DateRange = $WB.ActiveSheet.UsedRange.Columns.Item(1).Cells|% Text|Select -skip 1

# Create a hashtable representing a blank day
$BlankDay = [ordered]@{}
0..23|ForEach{$Blankday.Add(("{0}:00:00" -f "$_".Padleft(2,'0')),$null)}

# Build Hashtable to track all days as objects based off the blank day hashtable
$DataHash = [ordered]@{}
$DateRange | ForEach-Object{ $DataHash.add($_,[pscustomobject]$BlankDay) }

# Update each day with data from the XML
$xml.Generated.Entry | Where{$_.date -in $DateRange} | ForEach-Object {
    $DataHash[$_.Date]."$($_.Time)" = $_.Income
}
# Convert the data to a tab delimited CSV, skipping the header row, and copy it to the clipboard
$DataHash.Values|convertto-csv -del "`t" -notype|Select -Skip 1 | clip
# Paste it into cell B2
$WB.ActiveSheet.Rows.Item(2).Cells.Item(2).PasteSpecial()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...