Невозможно вставить строку со значениями в диапазон листа - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь вставить несколько строк в лист Excel, который не содержит таблиц, но я могу вставлять только пустые строки.Попытка изменить значения этих пустых строк приводит к row.values печати правильных данных, но строки в самом файле остаются пустыми, даже после context.sync().

Я пытался использовать insertметод из Excel.Range для успешной вставки пустой строки, выполнив:

let empty_space   = sheet.getCell(index,0).getResizedRange(index, row.length)
empty_space.insert("Down")

Затем я попытался использовать ссылку на новый диапазон empty_space, чтобы заменить его значения на значения в массиве с именем row (длина которого использовалась для определения диапазона выше):

empty_space.load("values")
await context.sync()
empty_space.values[0] = row 

Если я затем сделаю console.log(empty_space.values), я вижу правильные значения в списке, но строка в файле все еще пуста.

Я также попытался вставить строку в используемый диапазон листа с помощью сплайсинга:

full_range.values.splice(index, 0, row)

, который выполняет те же действия, что и выше, правильно печатая на консоли, но отображая пустойЯчейки.

Как вставить массив значений в новую строку в верхней части файла, используя Диапазоны.Я не могу преобразовать диапазон в таблицу, так как это создает много других проблем.

РЕДАКТИРОВАТЬ: Ниже приведено полное содержание функции, которую я использую, чтобы попытаться достичь этого:

insert_banner = async ( sheet_range, context ) => {
   let banner_rows = this.state.sheet_content.banner.banner_rows

    for (let r in banner_rows) {
      let index         = parseInt(r)
      let row           = banner_rows[r]

      let empty_space   = this.state.sheet.getCell(index,0).getResizedRange(index, row.length)
      empty_space.insert("Down")
      empty_space.values[0] = row
      await context.sync()
    }
}

banner_rows - это двумерный массив.

РЕДАКТИРОВАТЬ 2: я пытался использовать set метод Excel.Range, например:

empty_space.set( {values: row} )

Но независимо отчто я пытаюсь, я получаю следующую ошибку:

"InvalidArgument: количество строк или столбцов во входном массиве не соответствует размеру или измерениям диапазона."

Четхотя во время отладки я вижу, что и row и empty_space.values имеют одинаковые размеры, 1x48.

РЕДАКТИРОВАТЬ 3: Вот другой подход, который я попробовал:

insert_banner = async ( sheet_range, context ) => {
  let banner_rows  = this.state.sheet_content.banner.banner_rows
  let sheet_values = sheet_range.values

  for (let r in banner_rows) {
    let index = parseInt(r)
    let row   = banner_rows[r]
    sheet_values.splice(index, 0, row)
  }

  return context.sync()
}

В этом случаеЕсли я добавлю точку останова после этой функции, я вижу, что значения sheet_range s do содержат правильную информацию в соответствующих строках.Я не понимаю, почему это не отражается в самом файле.

1 Ответ

1 голос
/ 23 апреля 2019

Я вижу пару проблем в вашем коде:

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

  2. Когда вы присваиваете значения empty_space.values ​​[0], вы заполняете только прокси-объект в вашем JavaScript, а не фактический диапазон в книге. Чтобы отправить новые значения в рабочую книгу, вы должны вызвать context.sync. (Поскольку, похоже, вам не нужен context.sync над этой строкой, просто переместите его ниже строки.) Причина, по которой работает context.log, заключается в том, что вы регистрируете значения прокси-объекта.

Я думаю, что код в вашем втором блоке кода должен быть:

empty_space.values[0] = row
await context.sync()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...