Надстройка MS Word - получить содержимое таблицы, вставленной и связанной с Excel - PullRequest
0 голосов
/ 12 октября 2019

РЕДАКТИРОВАТЬ : Ранее сформулированный вопрос несколько вводил в заблуждение, создавая впечатление, что я намерен использовать объект ActiveX вместо связанной таблицы.

Я разрабатываю надстройку для MS Word , где мне нужно иметь возможность извлекать данные таблиц, которые были скопированы из MS Excel . Таблицы связаны так, что каждое изменение в Excel отражается в Word. Вот шаги воспроизведения для улучшения изображения:

  1. Выберите всю именованную таблицу в Excel и скопируйте в буфер обмена
  2. В Word: выберите «Специальная вставка»
  3. В диалоговом окне: «Вставить ссылку» в формате HTML (также может быть форматированным текстом (RTF))
  4. Теперь изменения данных в Excel немедленно отражаются в Word из-за ссылки

Я борюсь с правильным использованием Word API для программного выбора таблиц из документа и извлечения их данных, возможно, в виде простых JSON-файлов и с соответствующими формулами Excel. Вот как это более-менее делается с помощью API Excel:

Excel.run(function(context) {  
  var sheet = context.workbook.worksheets.getItem("Sample");  
  var expensesTable = sheet.tables.getItem("ExpensesTable");  

  // Get data from the header row  
  var headerRange = expensesTable.getHeaderRowRange().load("values");  

  // Get data from the table  
  var bodyRange = expensesTable.getDataBodyRange().load("values");  

  // Get data from a single column  
  var columnRange = expensesTable.columns  
    .getItem("Merchant")  
    .getDataBodyRange()  
    .load("values");  

  // Get data from a single row  
  var rowRange = expensesTable.rows.getItemAt(1).load("values");  

  // Sync to populate proxy objects with data from Excel  
  return context.sync().then(function() {  
    var headerValues = headerRange.values;  
    var bodyValues = bodyRange.values;  
    var merchantColumnValues = columnRange.values;  
    var secondRowValues = rowRange.values;  

    // Write data from table back to the sheet  
    sheet.getRange("A11:A11").values = [["Results"]];  
    sheet.getRange("A13:D13").values = headerValues;  
    sheet.getRange("A14:D20").values = bodyValues;  
    sheet.getRange("B23:B29").values = merchantColumnValues;  
    sheet.getRange("A32:D32").values = secondRowValues;  

    // Sync to update the sheet in Excel  
    return context.sync();  
  });  
}).catch(errorHandlerFunction);

(взято из официальных документов )

Мой код пока:

 Word.run(context => {
   const table1 = context.document.body.tables.getFirstOrNullObject();
   table1.load(["rows"]);

   const rows = table1.rows;
   rows.load(["items"]);

   return context.sync().then(() => {
     console.log("log", rows);
   });
 });

Мне нужен совет о том, как правильно объединить вызовы <object>.load(<props>) & context.sync(), чтобы получить нужные мне данные.

...