前言

据不完全统计,全世界使用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. 学习 CosmosDB (NoSql)

    Microsoft Azure官网 学习cosmos DB,也称作 documentDB,NoSql,不是关系型数据库,数据以Json的格式存储,灵活性强. 1.DLL 2.Connector set ...

  2. 简单的 Promise 实现 一

    const Promise = function(fn){ let state = { pending: "pending", fulfilled: "fulfilled ...

  3. Linux源码-等待队列注释

    等待队列 Linux中了等待队列的毒,代码中充斥着等待队列.不信你翻翻代码. 等待队列的唤醒我们这里叫激活.免得和线程唤醒混淆. 数据结构 头结点wait_queue_head_t的结构 struct ...

  4. 【重要】使用Git命令行上传到GitHub上

    [本人GitHub账号:] 用户名:chenhongshuang 密码:shuangshuang6300 邮箱:2452420371@qq.com 进入GitHub账号后 1·新建项目文件名称例dem ...

  5. Mycat 分片规则详解--范围分片

    实现方式:切分规则根据文件(autopartition-long.txt)配置的范围来进行切片,制定基准列的取值范围,然后把这一范围的所有数据都放到一个DN上面 优点:适用于整体数量可知或总数量为固定 ...

  6. javaMail邮件发送功能(多收件人,多抄送人,多密送人,多附件)

    private Session session; private Transport transport; private String mailHost = ""; privat ...

  7. Linux创建普通用户以及权限的分配

    LINUX系统能创建一个普通用户,给开发人员让他们登录吗? 答案:可以. 怎么做? 答案:一般给开发 创建一个目录账户 他要做什么操作 就给什么权限 useradd命令 useradd可用来建立用户帐 ...

  8. ava集合---HashSet的源码分析

    一.HasnSet概述 Hashset实现set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set的迭代顺序.特别是它不保证该顺序恒久不变.此类允许使用Null元素 一.HasnSe ...

  9. Flash Builder4.7安装破解

    引用自CSDN博客,日后我会上传FlashBuilder到百度网盘谢谢 http://bbs.csdn.net/topics/391036327

  10. PHP 引用是个坑,请慎用

    去年我参加了很多次会议,其中八次会议里我进行了相关发言,这其中我多次谈到了 PHP 的引用问题,因为很多人对它的理解有所偏差.在深入讨论这个问题之前,我们先回顾一下引用的基本概念,明确什么是" ...