前言

据不完全统计,全世界使用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则将这一点表现的淋漓尽致,而且毫无疑问,我这里演示的只是一些皮毛,更多有意思的场景,还等待着你的发现呢。

Excel as a Service —— Excel 开发居然可以这么玩的更多相关文章

  1. Excel催化剂开源第43波-Excel选择对象Selection在.Net开发中的使用

    Excel的二次开发有一极大的优势所在,可以结合用户的交互进行程序的运行,大量用户的交互,都是从选择对象开始,用户选择了单元格区域.图形.图表等对象,之后再进行程序代码的加工处理,生成用户所需的最终结 ...

  2. 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂安装过程详解及安装失败解决方法

    因Excel催化剂用了VSTO的开发技术,并且为了最好的用户体验,用了Clickonce的布署方式(无需人工干预自动更新,让用户使用如浏览器访问网站一般,永远是最新的内容和功能).对安装过程有一定的难 ...

  3. 使用Open xml 操作Excel系列之一-读取Excel

    一. 安装Open Xml SDK 从微软网站下载Open xml SDK,安装SDK. 二. 在项目中添加对DocumentFormat.OpenXml库的引用

  4. C#操作Excel(2)-- 打开-读取Excel文档

    由于要为某软件实现导出Excel功能,故有此文. 本文的开发环境是Visual Studio 2010 ,C#, Excel 2007. 新建C#工程后打开Solution Explorer,可以看到 ...

  5. C#操作Excel(1)Excel对象模型

    Excel对象模型  (.Net Perspective) 本文主要针对在Visual Studio中使用C# 开发关于Excel的应用程序 本文的PDF下载地址:C#操作Excel2007.pdf ...

  6. 办公软件-Excel:Microsoft Office Excel 2003百科

    ylbtech-办公软件-Excel:Microsoft Office Excel 2003百科 Microsoft® Office Excel 2003 是一种电子表格程序,可提供对于 XML 的支 ...

  7. JXL包大解析;Java程序生成excel文件和解析excel文件内容

    最近需求变化,需要把excel导入 我以前没有做过,所以我查了一些资料 和参考别人的代码 以下是多种方式: import java.io.File; import java.io.FileInputS ...

  8. C# 设置Excel打印选项及打印excel文档

    C# 设置Excel打印选项及打印excel文档 打印Excel文档是一个很常见的操作,但有时候我们会碰到各种不同的打印需求,例如只打印一个Excel工作表的其中一部分,或打印时每页都有表头,或把工作 ...

  9. SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable

    MS SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表可以在不同服务器上). SqlBulkCopy 类允许编写提供类似功能的托管代码解决方 ...

随机推荐

  1. VS 2017 开发安卓环境搭建 问题总结

    VS 2017可以开发安卓啦,之前一直想尝试开发安卓,但是由于时间忙, Java只学了个基础,不如C#熟练所以一直没有机会接触安卓开发.既然需要利用VS2017开发安卓,那么第一步就是了解VS2017 ...

  2. Python基本知识

    python是一门编程语言,这是我们学习python首先要了解的内容,那么编程语言又是什么,我们为什么需要编程语言 我们讲的话是汉语,英语或者其他语言,计算机也可以讲话,但是他只会说0,1,也只能看懂 ...

  3. 快速创建 HTML5 Canvas 电信网络拓扑图

    前言 属性列表想必大家都不会陌生,正常用 HTML5 来做的属性列表大概就是用下拉菜单之类的,而且很多情况下,下拉列表还不够好看,怎么办?我试着用 HT for Web 来实现属性栏点击按钮弹出多功能 ...

  4. linux kexec内核引导

    linux kexec 介绍 kexec的功能是用一个运行的内核去运行一个新内核,就像运行一个应用程序一样.这种机制因为跳过了bootloader,可以实现系统的快速重启.另外kdump也是基于kex ...

  5. C++string类总结

    一.string的初始化 首先,为了在程序中使用string类型,必须包含头文件 <string>.如下: #include <string> 注意这里不是string.h,s ...

  6. POJ 1979 DFS

    题目链接:http://poj.org/problem?id=1979 #include<cstring> #include<iostream> using namespace ...

  7. POJ1331 Multiply(strtol函数练习)

    题目链接:http://poj.org/problem?id=1331 主要介绍strtol函数: long int strtol(const char *nptr,char **endptr,int ...

  8. pat 喊山

    L3-008. 喊山 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出" ...

  9. C语言描述链表的实现及操作

    一.链表的创建操作 // 操作系统 win 8.1 // 编译环境 Visual Stuido 2017 #include<stdio.h> #include<malloc.h> ...

  10. python全栈学习--day3

    一.基础数据类型 基础数据类型,有7种类型,存在即合理. 1.int 整数 主要是做运算的 .比如加减乘除,幂,取余  + - * / ** %...2.bool 布尔值 判断真假以及作为条件变量3. ...