2015-01-08 2 views
1

У меня возникли проблемы, делающие точку опоры на листе excel, и я не уверен, что я делаю неправильно.сценарий powershell для создания таблицы поворота excel

Вот код PowerShell я использовал

# requires excell COM 
#Create excel COM object 
$excel = New-Object -ComObject excel.application 

#Make Visible 
$excel.Visible = $True 

#Add a workbook 
$workbook = $excel.Workbooks.Add() 

#Remove other worksheets 
1..2 | ForEach { 
    $Workbook.worksheets.item(2).Delete() 
} 

#Connect to first worksheet to rename and make active 
$serverInfoSheet = $workbook.Worksheets.Item(1) 
$serverInfoSheet.Name = 'DiskInformation' 
$serverInfoSheet.Activate() | Out-Null 


#Create a Title for the first worksheet and adjust the font 
$row = 1 
$Column = 1 

#Create a header for Disk Space Report; set each cell to Bold and add a background color 
$serverInfoSheet.Cells.Item($row,$column)= 'ColumnA' 
$serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48 
$serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True 
$Column++ 
$serverInfoSheet.Cells.Item($row,$column)= 'ColumnB' 
$serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48 
$serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True 
$Column++ 


#Now it is time to add the data into the worksheet! 
#Increment Row and reset Column back to first column 
$row++ 
$Column = 1 

    $serverInfoSheet.Cells.Item($row,$column)= "a" 
    $Column++ 
    $serverInfoSheet.Cells.Item($row,$column)= "b" 
    $Column++ 

    #Increment to next row and reset Column to 1 
    $Column = 1 
    $row++ 



# rename workbook 
$workbook = $workbook 
#$workbook = $excel.Workbooks.Add() 

# Get sheets 
$ws3 = $workbook.worksheets | where {$_.name -eq "DiskInformation"} #<------- Selects sheet 3 


$xlPivotTableVersion12  = 3 
$xlPivotTableVersion10  = 1 
$xlCount     = -4112 
$xlDescending    = 2 
$xlDatabase    = 1 
$xlHidden     = 0 
$xlRowField    = 1 
$xlColumnField    = 2 
$xlPageField    = 3 
$xlDataField    = 4  
# R1C1 means Row 1 Column 1 or "A1" 
# R65536C5 means Row 65536 Column E or "E65536" 
$PivotTable = $workbook.PivotCaches().Create($xlDatabase,"Report!R1C1:R65536C5",$xlPivotTableVersion10) 
$PivotTable.CreatePivotTable("Pivot!R1C1") | Out-Null 
[void]$ws3.Select() 
$ws3.Cells.Item(3,1).Select() 
$workbook.ShowPivotTableFieldList = $true 

$PivotFields = $ws3.PivotTables('Tables1') #.PivotFields("Computername") # Worksheet Name is Server 
$PivotFields.Orientation = $xlRowField 
$PivotFields.Position = 1 

Вот сообщение об ошибке я получаю Exception призывающего "CreatePivotTable" с "1" аргументом (ы):. «Неправильный параметр (Исключение из HRESULT : 0x8007 0057 (E_INVALIDARG)) " Недвижимости 'Orientation' не найдено на этом объекте; убедитесь, что он существует и настраивается. В C: \ ASM \ scripts \ Powershell \ TEST \ test_excel4.ps1: 80 char: 14 + $ PivotFields. < < < < Ориентация = $ xlRowField + CategoryInfo: InvalidOperation: (Ориентация: String) [], RuntimeException + FullyQualifiedErrorId: PropertyNotFound

Свойство 'Позиция' не может быть найден на этом объекте; убедитесь, что он существует и настраивается. В C: \ ASM \ scripts \ Powershell \ TEST \ test_excel4.ps1: 81 char: 14 + $ PivotFields. < < < < Позиция = 1 + CategoryInfo: InvalidOperation: (Должность: String) [], RuntimeException + FullyQualifiedErrorId: PropertyNotFound

Спасибо за помощь в продвинутом.

+0

Правильный синтаксис Excel будет 'WB.PivotCaches.Add (...). CreatePivotTable()', но если вы посмотрите на переменную '$ PivotTable', то строка, в которую вы получаете ошибку, будет прочитайте как '$ workbook.PivotCaches(). Create (...). CreatePivotTable()', который был бы некорректным синтаксисом (я думаю) Вот статья MSDN об использовании этого метода в Excel, который может помочь http://msdn.microsoft.com/en-us/library/office/ff839885(v=office.15).aspx –

ответ

2

Было несколько проблем с созданием сводной таблицы и полей.

Во-первых, лучше выбрать именно те строки и столбцы, которые вы хотите в таблице, без выбора всей электронной таблицы.

Хороший способ сделать это, чтобы начать с диапазона, а затем попросить Excel, чтобы выбрать каждую клетку до тех пор, пока не найдет пустой, как здесь:

$range1=$ws3.range("A1") 
$range1=$ws3.Range($range1,$range1.End($xlDirection::xlDown)) 

Обратите внимание на определение $xlDirection в

$xlDirection = [Microsoft.Office.Interop.Excel.XLDirection] 

и во второй колонке:

$range2=$ws3.range("B1") 
$range2=$ws3.Range($range2,$range2.End($xlDirection::xlDown)) 

и объединить их в один выбор:

$selection = $ws3.Range($range1, $range2) 

Затем при создании сводной таблицы, очень важно, чтобы дать ему имя (т.е. "Tables1"). Мы будем использовать это имя позже, чтобы ссылаться на него:

$PivotTable.CreatePivotTable("R1C6","Tables1") | Out-Null 

Наконец, мы хотим, чтобы определить, какое поле в сводной таблице делает то, что и какова его позиция.В нашем случае мы хотим, чтобы столбец быть как $ xlRowField и $ xlDataField и мы просто переопределить значение, как показано ниже:

$PivotFields = $ws3.PivotTables("Tables1").PivotFields("ColumnA") 
$PivotFields.Position = 1 
$PivotFields.Orientation = $xlRowField 
$PivotFields.Orientation = $xlDataField 

Вот весь код:

# requires excell COM 
#Create excel COM object 
$excel = New-Object -ComObject excel.application 

#Make Visible 
$excel.Visible = $True 

#Add a workbook 
$workbook = $excel.Workbooks.Add() 

#Remove other worksheets 
1..2 | ForEach { 
    $Workbook.worksheets.item(2).Delete() 
} 

#Connect to first worksheet to rename and make active 
$serverInfoSheet = $workbook.Worksheets.Item(1) 
$serverInfoSheet.Name = 'DiskInformation' 
$serverInfoSheet.Activate() | Out-Null 


#Create a Title for the first worksheet and adjust the font 
$row = 1 
$Column = 1 

#Create a header for Disk Space Report; set each cell to Bold and add a background color 
$serverInfoSheet.Cells.Item($row,$column)= 'ColumnA' 
$serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48 
$serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True 
$Column++ 
$serverInfoSheet.Cells.Item($row,$column)= 'ColumnB' 
$serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48 
$serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True 
$Column++ 


#Now it is time to add the data into the worksheet! 
#Increment Row and reset Column back to first column 
$row++ 
$Column = 1 

    $serverInfoSheet.Cells.Item($row,$column)= "a" 
    $Column++ 
    $serverInfoSheet.Cells.Item($row,$column)= "b" 
    $Column++ 

    #Increment to next row and reset Column to 1 
    $Column = 1 
    $row++ 



# rename workbook 
$workbook = $workbook 
#$workbook = $excel.Workbooks.Add() 

# Get sheets 
$ws3 = $workbook.worksheets | where {$_.name -eq "DiskInformation"} #<------- Selects sheet 3 


$xlPivotTableVersion12  = 3 
$xlPivotTableVersion10  = 1 
$xlCount     = -4112 
$xlDescending    = 2 
$xlDatabase    = 1 
$xlHidden     = 0 
$xlRowField    = 1 
$xlColumnField    = 2 
$xlPageField    = 3 
$xlDataField    = 4  
$xlDirection  = [Microsoft.Office.Interop.Excel.XLDirection] 
# R1C1 means Row 1 Column 1 or "A1" 
# R65536C5 means Row 65536 Column E or "E65536" 

$range1=$ws3.range("A1") 
$range1=$ws3.Range($range1,$range1.End($xlDirection::xlDown)) 
$range2=$ws3.range("B1") 
$range2=$ws3.Range($range2,$range2.End($xlDirection::xlDown)) 
$selection = $ws3.Range($range1, $range2) 

$PivotTable = $workbook.PivotCaches().Create($xlDatabase,$selection,$xlPivotTableVersion10) 
$PivotTable.CreatePivotTable("R1C6","Tables1") | Out-Null 
[void]$ws3.Select() 
$ws3.Cells.Item(3,1).Select() 
$workbook.ShowPivotTableFieldList = $true 

$PivotFields = $ws3.PivotTables("Tables1").PivotFields("ColumnA") 

$PivotFields.Orientation = $xlRowField 
$PivotFields.Orientation = $xlDataField 

$PivotFields = $ws3.PivotTables("Tables1").PivotFields("ColumnB") 

$PivotFields.Orientation = $xlRowField 
$PivotFields.Orientation = $xlDataField 

EDIT:

пример поля настройки является этот:

$PivotFields = $ws3.PivotTables("Tables1").PivotFields("ColumnA") 
$PivotFields.Orientation = $xlHidden 
$PivotFields.Orientation = $xlDataField 

$PivotFields = $ws3.PivotTables("Tables1").PivotFields("ColumnB") 
$PivotFields.Orientation = $xlHidden 
$PivotFields.Orientation = $xlDataField 

или это один

+0

У меня возникла следующая ошибка Исключение: «Позиция»: «Невозможно установить свойство« Позиция класса PivotField » 90. Также есть способ удалить общую сумму и счет из сводной таблицы? – Joe

+0

С Excel 2010 строятся строки, определяющие работу позиции '$ PivotFields.Position = 1'. Однако я вижу ошибку с Excel 2013. Просто удалите эти две строки, и она должна работать. –

+0

Что касается полей, вам нужно попробовать различные возможности и посмотреть, что подходит. Существует множество возможностей для настройки сводных таблиц. Вы можете сделать это, играя с атрибутом '$ PivotFields.Orientation' и добавляя/удаляя то, что вам нужно. –

Смежные вопросы