Новый объект возвращает пустой объект
Я пытаюсь расширить этот пример, используя модуль extarnal для вызова общих методов. Моя цель – создать новый файл xls и написать ему.
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml") | Out-Null [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Packaging") [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Spreadsheet") [Reflection.Assembly]::LoadWithPartialName("OpenXmlPowerTools") Import-Module (join-path (Split-Path $MyInvocation.MyCommand.Path) "GenericMethods.psm1") $document = [DocumentFormat.OpenXml.Packaging.SpreadsheetDocument]::Create("C:\Temp\text.xlsx", [DocumentFormat.OpenXml.SpreadsheetDocumentType]::Workbook) $workbookPart = $document.AddWorkbookPart(); $workbookPart.Workbook = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Workbook $worksheetPart = Invoke-GenericMethod -InputObject $workbookPart -MethodName AddNewPart -GenericType DocumentFormat.OpenXml.Packaging.WorksheetPart $sheetData = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.SheetData $worksheetPart.Worksheet = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Worksheet -ArgumentList $sheetData [DocumentFormat.OpenXml.Spreadsheet.Sheets]$foo = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Sheets Invoke-GenericMethod -InputObject $document.WorkbookPart.Workbook -MethodName AppendChild -GenericType DocumentFormat.OpenXml.Spreadsheet.Sheets -ArgumentList $foo $document.Close()
Проблема в том, что этот фрагмент кода
[DocumentFormat.OpenXml.Spreadsheet.Sheets]$foo = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Sheets Invoke-GenericMethod -InputObject $document.WorkbookPart.Workbook -MethodName AppendChild -GenericType DocumentFormat.OpenXml.Spreadsheet.Sheets -ArgumentList $foo
throws error Invoke-GenericMethod : No matching method was found
. Выдает, потому что New-Object
создает что-то, что рассматривается как пустой массив функцией Invoke-GenericMethod
. Таким образом, модуль ищет общие методы без параметров. Обратите внимание, что первый вызов Invoke-GenericMethod
работает нормально.
- Как заставить Excel взаимодействовать с .NET или PowerShell или OData
- OLEDB - не может читать листы excel из powershell
- Powershell - добавьте улов, чтобы забрать, если нет процессов Excel
- Powershell - получить ячейку (например, B32) после запуска поиска значения в документе Excel
- Если ячейка пуста, удалите лист в PowerShell
Как мне вызвать Invoke-GenericMethod
с параметром -ArgumentList
?
- ComObject Excel.Application без пакета Office Suite
- Искать несколько элементов в excel и возвращать весь feild
- Данные Powershell вставляются в существующий лист
- Как использовать данные на листе Excel с помощью PowerShell?
- Как заставить этот скрипт проходить через все файлы в каталоге?
- Скрипт Powershell для написания в эксклюзивном листе
- Как я могу установить Excels «Пересчитать книгу перед сохранением» в Powershell?
- добавить colum в объединенный файл csv
Проблема с вашим кодом заключается в том, что класс DocumentFormat.OpenXml.OpenXmlElement
(базовый класс для DocumentFormat.OpenXml.Spreadsheet.Sheets
) реализует интерфейс IEnumerable
. Это делает PowerShell интерпретировать любой экземпляр DocumentFormat.OpenXml.Spreadsheet.Sheets
как сбор, а не особый объект.
Когда вы пишете только
$foo
PowerShell будет перечислять коллекции и отображать дочерние элементы (точнее, вы увидите дочерний элемент дочернего элемента, потому что командлеты форматирования обычно выполняют еще одно перечисление коллекций). И так как вы только что создали этот объект, он будет пустым и ничего не будет отображаться.
Чтобы фактически отобразить объект $foo
, вам нужно написать его следующим образом:
,$foo | Format-Table -Expand CoreOnly
или
,,$foo
Тот факт, что PowerShell интерпретирует экземпляр DocumentFormat.OpenXml.Spreadsheet.Sheets
как коллекции, также влияет на преобразование в [Object[]]
(тип параметра -ArgumentList
). Вместо того, чтобы обертывать массив одиночных элементов (как вы хотите вызвать метод с единственным аргументом), как это происходит для особых объектов, PowerShell создает массив из элементов коллекции.
Чтобы решить вашу проблему, вам нужно сделать обертку в один массив элементов самостоятельно. Вы можете сделать это с помощью унарного запятой:
-ArgumentList (,$foo)