過(guò)去發(fā)表過(guò)一些Office Add-in開(kāi)發(fā)的文章,并且也在不同的場(chǎng)合分享過(guò)新的開(kāi)發(fā)模式及其帶來(lái)的機(jī)遇。有不少朋友給我反饋,也討論到一些常見(jiàn)問(wèn)題,我這里集中地總結(jié)一下給大家參考。
1. Office Web Add-in的適用場(chǎng)景 這是很多人的困惑。我在這篇文章中詳細(xì)對(duì)照了三種為Office開(kāi)發(fā)Add-in的技術(shù)和表現(xiàn)形式,這里再總結(jié)一下新的Web Add-in適用的場(chǎng)合
- 開(kāi)發(fā)人員本身對(duì)于網(wǎng)絡(luò)開(kāi)發(fā)比較熟悉
- 你希望這個(gè)插件能夠跨平臺(tái)使用
- 你希望更加方便地進(jìn)行集中部署和更新
- 這個(gè)插件的功能除了Office內(nèi)部的操作,還有大量的外部資源訪(fǎng)問(wèn)
- 用戶(hù)能隨時(shí)訪(fǎng)問(wèn)網(wǎng)絡(luò),并且網(wǎng)絡(luò)條件有保障
用戶(hù)對(duì)于運(yùn)行速度的敏感度不是很高,并不是說(shuō)Web Add-in的運(yùn)行速度慢,是因?yàn)閃eb Add-in開(kāi)發(fā)中很多操作都是異步執(zhí)行的,所以會(huì)造成感覺(jué)上的運(yùn)行慢的體驗(yàn)
2. 工作原理到底是怎么樣的 這也是很多人的疑問(wèn)。我們可以稍微回顧一下歷史,VBA是直接運(yùn)行在Office進(jìn)程(例如Excel)中的,它應(yīng)該算是一個(gè)腳本,會(huì)有主程序動(dòng)態(tài)加載,編譯運(yùn)行。一旦運(yùn)行結(jié)束,則會(huì)釋放資源。而VSTO則更為復(fù)雜,因?yàn)樗怯?NET開(kāi)發(fā)出來(lái)的托管代碼,所以他本身是不能通過(guò)宿主程序直接運(yùn)行的,而是需要從宿主程序(其實(shí)是COM)通過(guò)平臺(tái)調(diào)用的方式(Interop)發(fā)起一個(gè)指令,然后由.NET CLR加載Add-in的組件,這個(gè)組件如果需要操作Excel的資源,又要通過(guò)平臺(tái)調(diào)用的方式反過(guò)來(lái)調(diào)用COM。
那么,今天的Web Add-in到底又是怎么樣加載和運(yùn)行的呢?它是通過(guò)一個(gè)獨(dú)立的瀏覽器進(jìn)程(例如IE)來(lái)運(yùn)行的。下面我將詳細(xì)解釋這方面的原理。
通過(guò)nslookup命令,可以看出我目前這個(gè)托管在azurewebsites.net上面的范例插件,它的服務(wù)器IP地址是 13.75.46.26(注意,因?yàn)锳zure平臺(tái)有很多服務(wù)器,所以實(shí)際上針對(duì)一個(gè)域名可能會(huì)有很多IP地址,如果你用nslookup命令可能得到的結(jié)果跟我不一樣)
在插件加載后,我們一般會(huì)在進(jìn)程管理器中看到兩個(gè)IE的進(jìn)程。這里有一個(gè)細(xì)節(jié),如果你的Office是32位的,那么它的核心進(jìn)程會(huì)是一個(gè)32位的,你可以查看如果加載多個(gè)插件的話(huà),它所占用的內(nèi)存會(huì)逐步增加。但是,仍然是一個(gè)進(jìn)程。
但是,如果你的Windows是64位的,此時(shí)它會(huì)另外創(chuàng)建一個(gè)64位的IE進(jìn)程,這兩個(gè)進(jìn)程其實(shí)是一個(gè)調(diào)用的關(guān)系。從下圖可以看出來(lái)32位的進(jìn)程其實(shí)是在調(diào)用64位那個(gè)進(jìn)程的。
如果要具體來(lái)證明這些進(jìn)程是訪(fǎng)問(wèn)到我們那個(gè)插件的網(wǎng)站,可以通過(guò)進(jìn)程查看器來(lái)觀察
3. 如何在Web Add-in的Javascript代碼中異步訪(fǎng)問(wèn)到遠(yuǎn)程的服務(wù) 既然我們知道Office Add-in本質(zhì)上是一個(gè)網(wǎng)絡(luò)應(yīng)用,根據(jù)你所選擇的開(kāi)發(fā)技術(shù)不同,對(duì)于訪(fǎng)問(wèn)遠(yuǎn)程服務(wù)資源的做法也不一樣。如果你是用ASP.NET MVC來(lái)實(shí)現(xiàn)的,那么可能會(huì)簡(jiǎn)單一些,因?yàn)镸VC本身就可以包含一些服務(wù)器代碼。但如果你更加喜歡用Javascript代碼來(lái)編程,你的服務(wù)資源調(diào)用,需要注意遵循一個(gè)兩個(gè)重要原則:
- $("#run").click(() => tryCatch(run));
- async function run() {
- await Excel.run(async (context) => {
- await $.get("https://webaddinapisample.azurewebsites.net/api/values").done(async function (result) {
- //這里一定要注意,必須是https地址,而且證書(shū)要有效,并且設(shè)置跨域訪(fǎng)問(wèn)
- var sheet = context.workbook.worksheets.getActiveWorksheet();
- var range = sheet.getRange("A1:B1");
- range.values = [result];
- await context.sync();
-
- }).fail(function (jqXHR, textStatus, errorThrown) {
- console.log(errorThrown);
- });
- });
- }
- /** 嘗試執(zhí)行某個(gè)方法 */
- async function tryCatch(callback) {
- try {
- await callback();
- }
- catch (error) {
- OfficeHelpers.UI.notify(error);
- OfficeHelpers.Utilities.log(error);
- }
- }
復(fù)制代碼
4. 網(wǎng)絡(luò)斷開(kāi)是否可以繼續(xù)用 這個(gè)問(wèn)題的答案跟問(wèn)題本身一樣簡(jiǎn)單:不能。由于Web Add-in本質(zhì)上是一個(gè)網(wǎng)絡(luò)應(yīng)用,所以沒(méi)有網(wǎng)絡(luò),Add-in是無(wú)法加載的。
據(jù)官方提到,有可能日后會(huì)有支持本地緩存的技術(shù)實(shí)現(xiàn)。但目前還沒(méi)有看到這方面的路線(xiàn)圖。
5. 能不能通過(guò)代碼增加菜單
這可能是跟VBA和VSTO相比較而言,比較大的劣勢(shì),其他的功能方面,也并不是完全一致,這個(gè)還有一個(gè)不斷發(fā)展的過(guò)程,好消息是,這些API還是快速地開(kāi)發(fā)中。
轉(zhuǎn)載自博客園 作者:陳希章
|