Excel as a Service —— Excel 开发居然可以这么玩
前言
据不完全统计,全世界使用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 开发居然可以这么玩的更多相关文章
- Excel催化剂开源第43波-Excel选择对象Selection在.Net开发中的使用
Excel的二次开发有一极大的优势所在,可以结合用户的交互进行程序的运行,大量用户的交互,都是从选择对象开始,用户选择了单元格区域.图形.图表等对象,之后再进行程序代码的加工处理,生成用户所需的最终结 ...
- 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂安装过程详解及安装失败解决方法
因Excel催化剂用了VSTO的开发技术,并且为了最好的用户体验,用了Clickonce的布署方式(无需人工干预自动更新,让用户使用如浏览器访问网站一般,永远是最新的内容和功能).对安装过程有一定的难 ...
- 使用Open xml 操作Excel系列之一-读取Excel
一. 安装Open Xml SDK 从微软网站下载Open xml SDK,安装SDK. 二. 在项目中添加对DocumentFormat.OpenXml库的引用
- C#操作Excel(2)-- 打开-读取Excel文档
由于要为某软件实现导出Excel功能,故有此文. 本文的开发环境是Visual Studio 2010 ,C#, Excel 2007. 新建C#工程后打开Solution Explorer,可以看到 ...
- C#操作Excel(1)Excel对象模型
Excel对象模型 (.Net Perspective) 本文主要针对在Visual Studio中使用C# 开发关于Excel的应用程序 本文的PDF下载地址:C#操作Excel2007.pdf ...
- 办公软件-Excel:Microsoft Office Excel 2003百科
ylbtech-办公软件-Excel:Microsoft Office Excel 2003百科 Microsoft® Office Excel 2003 是一种电子表格程序,可提供对于 XML 的支 ...
- JXL包大解析;Java程序生成excel文件和解析excel文件内容
最近需求变化,需要把excel导入 我以前没有做过,所以我查了一些资料 和参考别人的代码 以下是多种方式: import java.io.File; import java.io.FileInputS ...
- C# 设置Excel打印选项及打印excel文档
C# 设置Excel打印选项及打印excel文档 打印Excel文档是一个很常见的操作,但有时候我们会碰到各种不同的打印需求,例如只打印一个Excel工作表的其中一部分,或打印时每页都有表头,或把工作 ...
- SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable
MS SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表可以在不同服务器上). SqlBulkCopy 类允许编写提供类似功能的托管代码解决方 ...
随机推荐
- 设计模式——简单工厂模式(C++实现)
#include <iostream> #include <string> using namespace std; class COperator { public: ; p ...
- Linux Centos 下安装软件 三种方式(转)
Linux学习的路还很远呢,各位码农,新年快乐哈! 1)一种是软件的源代码,您需要自己动手编译它.这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz). 2)另一种是软件的可执行程序 ...
- python中的return的返回与执行
author:headsen chen date:2018-03-21 15:12:09 notice:created by headsen chen himself and not allo ...
- UML系列图
用例图: 时序图:
- Linux(CentOS 7)环境下安装MySQL
在CentOS中默认安装有MariaDB,但是我们需要的是MySQL,安装MySQL可以覆盖MariaDB MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 ...
- vue技术解析六之生命周期函数
- gulp工程化工具
gulpfile.js var gulp = require('gulp'); var rename = require('gulp-rename') var pump = require('pump ...
- HttpServletRequest对象方法的用法
1. 获得客户机信息 getRequestURL方法返回客户端发出请求时的完整URL. getRequestURI方法返回请求行中的资源名部分. getQueryString 方法返 ...
- Idea 调试代码
---恢复内容开始--- set DEBUG_PORT=8787 set JAVA_DEBUG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,addr ...
- iOS App 启动性能优化
1. App启动过程 解析Info.plist 加载相关信息,例如如闪屏 沙箱建立.权限检查 Mach-O加载 如果是胖二进制文件,寻找合适当前CPU类别的部分 加载所有依赖的Mach-O文件(递归调 ...