前言
據不完全統計,全世界使用Excel作為電子表格和數據處理的用戶數以十億計,這不僅得益於它的使用簡便,同時還因為它內置了很多強大的函數,結合你的想象力可以編寫出各種公式,並可快速根據數據生成圖表和透視分析等。另一方面,Excel在整個Office家族中也是擁有開發者最多的一個組件,不管是在客戶端的VBA宏和VSTO插件開發,以及在早些年出現在SharePoint Server中的Excel Service(包括用來呈現Excel文件的Web Part,以及一套XML Web Service可供遠程調用Excel的功能,包括自定義Excel函數等。
在Office 365的時代,SharePoint Online中已經將Excel Service的功能刪除掉了,取而代之的是2016年7月份左右揭開神秘面紗的Microsoft Graph Excel API,融入Microsoft Graph大家族的Excel Service快速迭代,目前它的功能也趨向穩定了。今天我將用一個實例來介紹一下它的奇妙設計和應用場景。
范例介紹
設想一下,你用Excel做了一份非常強大的“抵押貸款測算表”,這里面可以通過輸入幾個參數,使用Excel自帶的PMT函數計算每月還款額,據此快速生成一個還款計划,如下圖所示:
PMT 是一個財務函數,用於根據固定付款額和固定利率計算貸款的付款額。有興趣可以參考 https://support.office.com/zh-cn/article/PMT-%E5%87%BD%E6%95%B0-0214DA64-9A63-4996-BC20-214433FA6441 的幫助。
與此同時,你還可以很輕松地生成一個數據列表,和對應的圖表,如下圖所示
通過改變“購買價格”、“利率”、“貸款期”、“貸款金額”等單元格的數值,Excel會自動計算其他單元格的數值,包括自動刷新圖表。這一切對廣大的“表哥表姐”來說都是非常熟悉的體驗。
那么問題來了:如果你的一個網頁中也要實現“抵押貸款測算”的功能,你是不是應該自己去實現一次PMT這種函數的功能呢?我不知道,但我覺得你讀了本文后會改變一些想法—— 我們完全可以將這些計算交給Excel Service去做,前端應用直接調用即可。
使用Microsoft Graph中的Excel API,你不僅可以訪問工作簿,工作表和單元格、表格和圖表等,修改他們的屬性和數值,甚至還可以將圖表用圖片的形式讀取過來,一切都在你的掌握之中。接下去用一個范例代碼演示這些奇妙的場景。
Microsoft Graph Excel API的官方文檔,請參考 https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/resources/excel
使用Microsoft Graph 獲取工作簿和單元格
要使用Micrsosoft Graph Excel API,你只需要將Excel文件放到OneDrive for Business或者SharePoint Online的文檔庫中即可。例如,我將演示用的文件放在了一個目錄中:
你需要了解一些Microsoft Graph的背景知識,如果你對Microsoft Graph比較陌生,建議你參考我之前的兩篇文章
本文所采用的方式就是用Graph Explorer這種方式來操作Microsoft Graph Excel API。我的這個文件是在OneDrive for Business 的個人雲盤的根目錄下面的testgraph目錄中,文件名為 demofile.xlsx,所以我可以使用GET https://graph.microsoft.com/v1.0/me/drive/root:/testgraph/demofile.xlsx:/workbook
獲取到這個工作簿
通過 GET https://graph.microsoft.com/v1.0/me/drive/root:/testgraph/demofile.xlsx:/workbook/worksheets
可以獲取工作簿中所有的工作表信息
通過 GET https://graph.microsoft.com/v1.0/me/drive/root:/testgraph/demofile.xlsx:/workbook/worksheets/抵押計算器/range(address='c4')
可以獲取名稱為“抵押計算器“的工作表中的C4單元格對象
當然,也可以通過名稱訪問單元格對象,語法是 GET https://graph.microsoft.com/v1.0/me/drive/root:/testgraph/demofile.xlsx:/workbook/names/每月還貸數額
這樣的
你還可以返回多個單元格的數值,例如下面這樣的查詢 GET https://graph.microsoft.com/v1.0/me/drive/root:/testgraph/demofile.xlsx:/workbook/worksheets/抵押計算器/range(address='c4:c6')/values
更新單元格內容
上一節我用幾種不同的語法展示了如何獲取工作簿、工作表和單元格(包括直接查詢它的數值),那么如果我們希望能修改某個單元格的數值,應該怎么做呢?下面的例子演示了如何將名稱為“抵押計算器“的工作表中的C4的數值修改為一個新的值,例如400000.
需要注意的是,查詢數據我們一般用的API請求方法是GET,而修改數據則需要用到的請求方法是PATCH。為了實現上面所提到的單元格修改需求,我們要執行的查詢是 PATCH https://graph.microsoft.com/v1.0/me/drive/root:/testgraph/demofile.xlsx:/workbook/worksheets/抵押計算器/range(address='c4')
,與此同時,還需要提供新的數值。
{ values:[[400000]] }
PATCH方法可以對目標對象執行局部更新。上面的代碼我們只提供了Values這個屬性集合,但其實還可以增加其他的屬性,來達到一次修改多個屬性的目的。
執行成功后,你可以發現C4的數值已經變成了400000。
這里我埋了一個伏筆,如果你在程序中用如上的方式修改了某個單元格(A)的數值,然后去獲取另外一個單元格(B)的值,假設B跟A是有公式的關系,你可能期望的是B的值也會立即刷新。但事實上,它不會。這里涉及到一些相對復雜的概念,就是Excel API有兩種訪問的模式,我們現在用的這種,是所謂的“非持久化會話模式”,一般用來查詢數據,或者修改后不保存,所以在下一次查詢的時候,其實你獲取的還是舊值。 關於如何創建持久會話,並且在多個查詢中共用它,請參考 https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/workbook_createsession 的詳細說明。
獲取工作表中的圖表
我們已經知道了如何訪問工作簿的單元格,以及如何更新它們的數值,這已經可以讓我們輕松實現很多業務場景了:你可以在Excel中做好很多復雜的公式,設計數據之間的關系,然后通過API修改某些單元格的值,然后去獲取其他單元格的值,看起來你的應用具有了類似Excel那樣神奇的功能,但其實所有的事情都還是Excel在默默地為你服務,你所做的只是調用一兩次接口而已。
接下來還要演示一個有意思的場景是將工作表中的圖表用圖片的形式提取出來,這個場景特別適合於我們已經經過了數據的處理,然后希望將圖表展現在前端的應用中。Excel API可以將一個圖表以一個Base64字符串的形式返回,客戶端可以利用這個進行圖片展現。
聽起來很玄的事情,其實也只是一個GET請求而已 GET https://graph.microsoft.com/v1.0/me/drive/root:/testgraph/demofile.xlsx:/workbook/worksheets/分期還款表格/charts/圖表 1/image
接口返回的結果是一串很長很長的字符串,你肯定是看不懂的。你要做的是將這個字符串復制出來,然后隨便用一個文本編輯器,新建一個文件,然后填入如下的內容
<img src="data:image/png;base64,這里填寫你查詢得到的字符串"></img>
接下來將這個保存為一個html文件,然后在瀏覽器中打開它。你是不是覺得下面這個圖表似曾相識呢,恭喜你答對了,其實這個圖表就是之前Excel文件中的那一個呀。
結語
我在很多場合都分享過Office 365 平台化的能力和開發場景,Microsoft Graph在其中起到了關鍵作用,而今天給大家展示的Excel API則將這一點表現的淋漓盡致,而且毫無疑問,我這里演示的只是一些皮毛,更多有意思的場景,還等待着你的發現呢。