Метод COM-объекта Excel недоступен

Я пытаюсь вставить новую строку в лист Excel. Я открываю файл с помощью Powershell, получаю объект для листа, а затем получаю объект диапазона, например

$Range=$Sheet.Range("A1")
$Range.Insert()

Когда я набираю вставку, Powershell даже выполняет заполнение табуляции. Итак, он видит в этом метод. Но когда я запускаю эту строку, я получаю ошибку

OperationStopped: невозможно получить свойство Insert класса Range.

Кто-нибудь знает, что здесь происходит, или другой способ вставить строку? Я не могу перейти к концу текста на листе, потому что мои данные находятся в таблице, а под ней находится еще одна таблица. Итак, все не так однозначно.

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

Tim Roberts 18.08.2024 20:36

Из связанных вопросов ниже: stackoverflow.com/questions/57960250/…

bugdrown 18.08.2024 20:48

@TimRoberts: По умолчанию (если таблицы не мешают) вызов .Insert() для одной ячейки вставляет одну ячейку выше целевой (т. е. все ячейки в одном столбце смещаются вниз).

mklement0 18.08.2024 23:24
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для этого вам нужно вызвать таблицу по имени:

# Initialize Excel application
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false  # Set to $true if you want to see Excel's window

# Open the existing workbook
$Workbook = $Excel.Workbooks.Open("C:\your\excel\path.xlsx")

# Select the worksheet containing the table
$Sheet = $Workbook.Sheets.Item(1)

# Access the table by name (or index if you prefer)
$Table = $Sheet.ListObjects.Item("YourTableName")

# Add a new row at the end of the table
$Table.ListRows.Add() | Out-Null

# Optionally, you can fill data in the newly added row (if needed)
# Let's assume you want to fill the first column of the new row
$LastRowIndex = $Table.ListRows.Count
$Table.DataBodyRange.Rows.Item($LastRowIndex).Columns.Item(1).Value2 = "New Value"

# Save and close the workbook
$Workbook.Save()
$Workbook.Close()
$Excel.Quit()

# Release the COM objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Table)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Sheet)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Workbook)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)

В качестве отступления: хотя вы можете вызывать [Runtime.InteropServices.Marshal]::ReleaseComObject() для каждой ссылки, проще выполнять все операции COM в дочерней области (& { ... }), чтобы, когда ее переменные выходят за пределы области видимости, освобождение происходило автоматически. Ускорить выпуск можно позвонив [GC]::Collect(). Подробности смотрите в этом ответе.

mklement0 18.08.2024 21:31

Предисловие:

  • В этом ответе рассматривается заданный вопрос, а именно, как вставить строку в электронную таблицу в целом.

  • Если, напротив, вы хотите вставить строки в объект таблицы внутри электронной таблицы, см. Ответ Дома.


Неясное сообщение об ошибке (наблюдаемое в Excel версии 16.0.17830.20138/Office 2019) означает, что ваша ячейка A1 является частью таблицы.

  • В противном случае вызов будет успешным и вставит одну ячейку над текущей ячейкой A1, сместив все существующие ячейки в столбце 1 вниз по умолчанию (при отсутствии явного указания аргумента, указывающего направление вставки).[1]

  • Поскольку такая операция может повредить таблицу, она предотвращается, хотя формулировка сообщения об ошибке бесполезна.

    • Фактически, полезное сообщение об ошибке отображается, если ячейка где-то ниже целевой в том же столбце является частью таблицы (что предполагает, что то, как ошибка возникла в вашем случае, является ошибкой):
      This won't work because it would move cells in a table on your worksheet.

Чтобы вставить в электронную таблицу целую строку (а не только таблицу), получите ссылку на строку, над которой нужно вставить:

# Inserts a new row above the first one.
$Sheet.Rows(1).Insert()

[1] Quoting from the Range.Insert documentation, with respect to the optional Shift parameter: "Specifies which way to shift the cells. Can be one of the following XlInsertShiftDirection constants: xlShiftToRight [in PowerShell, use -4161] or xlShiftDown [in PowerShell, use -4121]. If this argument is omitted, Microsoft Excel decides based on the shape of the range."

Другие вопросы по теме