Удалить и заменить лист, не удаляя ссылки на него в Excel Javascript - PullRequest
1 голос
/ 18 апреля 2020

Вот что я пытаюсь выполнить sh, используя Excel Javascript API:

  1. У меня есть Sheet1 и Sheet2 в моей книге. Внутри Sheet2 могут быть некоторые ссылки на ячейки в Sheet2, но я не знаю, где и даже если они существуют.
  2. Я бы хотел заменить Sheet1 другим листом (скажем, Sheet3), но я не хочу, чтобы ссылки на ячейки Sheet1 на Sheet2 ломались.
  3. И Sheet1, и Sheet2 имеют произвольное количество данных, а также неограниченное количество.

Мой вопрос: как я могу эффективно выполнить вышеуказанную операцию, используя только API Excel Javascript?

Вот несколько решений, о которых я подумал (некоторые я пробовал):

  1. Удалить Sheet1. Переименуйте Sheet3 в Sheet1. Это не работает, так как ссылки на Sheet1 в Sheet2 становятся неопределенными.
  2. Найдите и замените все экземпляры Sheet1 на Sheet3 в Sheet2 перед удалением и переименованием , Я обеспокоен тем, что это не будет достаточно эффективным, поскольку он должен просматривать все клетки.
  3. Приостановить расчет, затем удалить, затем переименовать, затем возобновить расчет. Это не работает, поскольку приостановка вычислений, по-видимому, не приостанавливает такого рода обновление ссылок, и поэтому ссылки в Sheet2 до Sheet1 по-прежнему прерываются.
  4. Копировать все данные ячейки из Sheet3 в Sheet1. Однако, поскольку нам также необходимо скопировать форматирование, что, насколько я понимаю, не может быть выполнено массово. Я не думаю, что мы могли бы сделать это достаточно эффективно, поскольку может быть произвольный объем данных.

Любая обратная связь будет принята с благодарностью. Боюсь, что без решения у нас может затянуться примерно месяц работы над нашей надстройкой :(

1 Ответ

0 голосов
/ 19 апреля 2020

Вы можете использовать range.copyFrom API для варианта 4, с этим API вы можете копировать форматы, формулы, значения. по умолчанию он копирует все.

  await Excel.run(async (context) => {
    const sheet = context.workbook.worksheets.getItem("Sheet3");
    const sheet2 = context.workbook.worksheets.getItem("Sheet1");

    // copy a range from another sheet
    sheet2.getRange("A1").copyFrom("Sheet3!A1:E1");

    await context.sync();
  });

Документ можно найти по адресу https://docs.microsoft.com/en-us/javascript/api/excel/excel.range?view=excel-js-preview#copyfrom -sourcerange - copytype - skipblanks - transpose-

...