首页 > 解决方案 > 如何通过office.js Office.initialize获取excel的单元格编号和工作表名称?

问题描述

在此处输入图像描述 有时会收到附加图像错误在 excel 加载项中运行应用程序时出现以下错误。

Office.js 尚未完全加载。您的应用程序必须调用“Office.onReady()”作为其加载序列的一部分(或设置“Office.initialize”函数)。如果您的应用具有此功能,请尝试重新加载此页面。

我已经使用 Office.initialize 函数来获取我们单击 Excel 的单元格编号和工作表编号。但它不会被执行,如果我们在之后重新加载该页面,它将运行(Office.initialize)。

如果我们通过“a”标签(a href)呈现该页面,它将运行良好,但使用 props.history.push 它将无法运行。

Office.initialize = () => {
    Office.context.document.addHandlerAsync(
        Office.EventType.DocumentSelectionChanged,
        () => {
            Excel.run(ctx => {
                const range = ctx.workbook.getSelectedRange();
                range.load('address');
                return ctx.sync().then(() => {
                    const str = range.address;
                    if (str) {
                        const arr = str.split('!');
                        if (arr[1] !== '1:1048576') {
                            const cellNumber = arr[1];
                            ExcelValue.cellValue = cellNumber;
                        }
                    }
                });
            });
            Excel.run(context => {
                const sheet = context.workbook.worksheets.getActiveWorksheet();
                sheet.load('name');
                return context.sync().then(() => {
                    ExcelValue.sheetName = sheet.name;
                    setSheet(ExcelValue);
                });
            }).catch(error => {
                console.log(error.debugInfo);
            });
        },
    );
};

标签: javascriptexcelreactjsreact-routeroffice-js

解决方案


您可以尝试Office.onReady(),因为Office.initialize()事件在 Office.js 初始化自身的内部过程结束时触发。它会在内部进程结束后立即触发。如果为事件分配处理程序的代码在事件触发后执行时间过长,则处理程序不会运行。

所以我们建议您使用Office.onReady()而不是Office.initialize(). 尽管Office.initialize()仍受支持,但Office.onReady()提供了更大的灵活性。

该文档可在https://docs.microsoft.com/en-us/office/dev/add-ins/develop/initialize-add-in找到


推荐阅读