Excel Web Add-in使用displayDialogAsync出现TypeError报错求助
开发Excel Web Add-in时,原功能区按钮打开任务窗格功能正常,改用displayDialogAsync打开对话框时,对话框能正常打开但出现TypeError报错,以下是详细信息:
相关代码
commands.js
function CompanyDisplayDialog(event) { Office.context.ui.displayDialogAsync("https://localhost:3000/Mycompany.html", {height: 50, width: 50, displayInIframe: true}, (asyncResult) => { dialog = asyncResult.value; if (asyncResult.status === Office.AsyncResultStatus.Failed) { console.error('Error opening dialog: ' + asyncResult.error.message); } else { const dialog = asyncResult.value; dialog.addEventHandler(Office.EventType.DialogMessageReceived, receiveMessage); dialog.addEventHandler(Office.EventType.DialogEventReceived, dialogClosed); } event.completed(); }
mycompany.js
Office.onReady((info) => { if (info.host === Office.HostType.Excel) { console.log("Excel add-in is ready."); //Office.context.ui.addHandlerAsync(Office.EventType.DialogParentMessageReceived,onMessageFromParent); } });
company.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Office JavaScript API --> <script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js"></script> <title>Company</title> </head> <body> <div class="container"> <h2>Company Information</h2> <div id="message" class="message-area"></div> </div> </body> </html>
报错信息
Uncaught TypeError TypeError: Cannot read properties of undefined (reading 'register')
at (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:346859)
at (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:1507516)
Promise.then ---
at (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:1507458)
at (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:1526108)
at t (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:1530020)
at (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:1530033)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:26614)
at t (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:26015)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:32590)
at c (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:4670)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:4759)
at j (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:31996)
at (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:256293)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:33148)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:5641)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:4824)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:33041)
at (appsforoffice.microsoft.com/lib/1.1/hosted/excel-win32-16.01.js:25:115895)
at E (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:29409)
at s (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:31277)
at c (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:4670)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:4759)
at y (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:34102)
at m (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:6822)
script ---
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:6079)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:4475)
at H (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:34631)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:35376)
at (appsforoffice.microsoft.com/lib/1.1/hosted/office.js:76:36231)
已做操作
已在清单文件的<AppDomains>中添加本地域名:
<AppDomains> <AppDomain>https://localhost:3000</AppDomain> </AppDomains>
解决思路
- 移除
displayInIframe参数:该参数仅适用于OAuth等特定场景,普通对话框无需启用,移除后可避免Office.js在iframe环境下的初始化冲突。修改commands.js中的配置:
Office.context.ui.displayDialogAsync("https://localhost:3000/Mycompany.html", {height: 50, width: 50}, (asyncResult) => { // 原有逻辑保持不变 } );
- 升级Office.js版本:当前使用的1.1版本较旧,存在对话框环境下的API兼容问题,建议升级到最新稳定版,修改company.html中的引用:
<script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1.15/hosted/office.js"></script>
- 简化对话框初始化逻辑:对话框无需完整初始化Excel模块,调整mycompany.js代码:
Office.onReady(() => { console.log("Dialog is ready."); // 如需接收父窗口消息,再启用DialogParentMessageReceived事件监听 });
- 检查清单权限配置:确保清单中
Permissions设置正确,对话框模式下至少需要ReadWriteDocument或对应权限,同时确认SourceLocation与对话框页面域名一致。
内容的提问来源于stack exchange,提问作者AlukardDve

