РЕДАКТИРОВАТЬ : Ранее сформулированный вопрос несколько вводил в заблуждение, создавая впечатление, что я намерен использовать объект ActiveX вместо связанной таблицы.
Я разрабатываю надстройку для MS Word , где мне нужно иметь возможность извлекать данные таблиц, которые были скопированы из MS Excel . Таблицы связаны так, что каждое изменение в Excel отражается в Word. Вот шаги воспроизведения для улучшения изображения:
- Выберите всю именованную таблицу в Excel и скопируйте в буфер обмена
- В Word: выберите «Специальная вставка»
- В диалоговом окне: «Вставить ссылку» в формате HTML (также может быть форматированным текстом (RTF))
- Теперь изменения данных в 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()
, чтобы получить нужные мне данные.