У меня возникли некоторые проблемы при использовании API JavaScript Javascript для создания надстройки Excel.
Первый выпуск:
Добавление строк в существующую таблицу с помощью библиотеки Excel Js : я создаю таблицу и добавляю несколько строк; затем пользователь может обновить содержимое таблицы новыми данными, поступающими из службы REST (чтобы результирующие строки таблицы могли изменяться: увеличиваться / уменьшаться или совпадать).
tl; dr; Мне нужно заменить строки таблицы новыми.
Это кажется довольно простым: в пространстве имен таблиц есть метод addRows
( ссылка ).
Но это не сработает, как ожидалось: если таблица уже содержит строки, новые будут добавлены в конец, а не заменят существующие.
Вот код:
const currentWorksheet = context.workbook.worksheets.getItemOrNullObject(
"Sheet1"
)
let excelTable = currentWorksheet.tables.getItemOrNullObject(tableName)
if (excelTable.isNullObject) {
excelTable = currentWorksheet.tables.add(tableRange, true /* hasHeaders */)
excelTable.name = tableName
excelTable.getHeaderRowRange().values = [excelHeaders]
excelTable.rows.add(null, excelData)
} else {
excelTable.rows.add(0, excelData)
}
Я также пытался удалить старые строки, а затем добавить новые.
if (!excelTable.isNullObject) {
for (let i = tableRows - 1; i >= 0; i--) {
// Deletes all table rows
excelTable.rows.items[i].delete()
}
excelTable.rows.add(0, excelData)
}
Но .. все работает нормально только , если под столбцами таблицы нет содержимого (нет функций, других таблиц и т. Д.).
Я попробовал другой метод: используя диапазонов .
В первый раз, когда я создаю таблицу, затем я удаляю все строки, получаю диапазон новых данных и вставляю значения:
if (excelTable.isNullObject) {
excelTable = currentWorksheet.tables.add(tableRange, true /* hasHeaders */)
excelTable.name = tableName
excelTable.getHeaderRowRange().values = [excelHeaders]
excelTable.rows.add(null, excelData)
} else {
let actualRange, newDataRange
const tableRows = excelTable.rows.items.length
const tableColumns = excelTable.columns.items.length
const dataRows = excelData.length
const dataColumns = excelData[0].length
actualRange = excelTable.getDataBodyRange()
for (let i = tableRows - 1; i >= 0; i--) {
// Deletes all table rows
excelTable.rows.items[i].delete()
}
newDataRange = actualRange.getAbsoluteResizedRange(dataRows, tableColumns)
newDataRange.values = excelData
}
Но у этого решения все еще есть недостатки.
Это должно быть так сложно добавить / отредактировать / удалить строки в таблице Excel?
Второй выпуск:
Используя ту же таблицу, если пользователь решит добавить несколько «дополнительных» столбцов (с формулой, основанной на значениях таблицы, например), нужно ли мне заполнять эти новые столбцы данными null
?
const tableColumns = excelTable.columns.items.length
const dataRows = excelData.length
const dataColumns = excelData[0].length
if (tableColumns > dataColumns) {
let diff = tableColumns - dataColumns
for (let i = 0; i < diff; i++) {
for (let j = 0; j < dataRows; j++) {
excelData[j].push(null)
}
}
}
Excel API не может справиться с этим сценарием?
Пожалуйста, не могли бы вы мне помочь?
Заранее спасибо.