PPT中使用ECharts实现可拖拽关系图
0 条评论Office中有简单的自定义图表,但很多时候无法满足使用的要求。地图、关系图、坐标图等复杂的表无法绘制,图表中数据点拖拽、动态数据、数据在展示中的自由筛选等交互无法完成。本文通过ECharts在PPT中引入更现代的图表功能,让图标更加丰富、美观、可交互。关于图表的基本使用,文中提供了关系图可拖拽版本的实现,方便了复杂关系的显示。
基础思路
这篇文章的基本问题是这个:
我需要在PPT中展示一个非常复杂的关系,图包含大量节点和连线。关系图可以根据演示的情况实时变化,方便讨论。
所以大致思路是这样的,在PPT中添加网页控件,在网页控件中通过ECharts绘制需要的图形。过程中碰到的主要问题有:
- PPT在插入控件、运行控件时产生不必要的提示
- ECharts图表未提供符合要求的拖拽,拖拽后产生回弹或整体重排
完成后的效果可以见这里。
为了方便测试,这里提供了完整项目的下载,需注意项目中未包括基础HTML一节中应下载的echarts-en.js
,额外下载即可。
PPT设置
PPT的设置为,添加控件、控件自动运行、消除不必要提示,最终达到与原生表格没有差别的体验。
为了方便下面的叙述,以下内容均运行在Windows 10,Office 2016,文件列表如下:
1 | drag-demo |
添加控件
在开发工具一栏中,选择其他控件,其中可以找到Microsoft Web Browser
,点击确定。
但因为ActiveX的关系,这边一般都会提示,“无法插入此ActiveX控件”。
为了解决问题,需要更改如下注册表(Win+R regedit),允许插入控件。如下键值若没有,新建即可,全部改为0。Office如果不是16的话根据Office版本更改最后一条。
1 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{8856F961-340A-11D0-A96B-00C04FD705A2}\Compatibility Flags |
由于IE版本可能不同,这里还需要限制Web Browser
使用特定版本的IE,将下面的键值改为十进制的10001。
1 | HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION\PowerPnt.exe |
以上内容参考该指南,如果设置了还是不能成功插入可以进一步阅读指南。
控件自动运行
双击该控件可以打开VBA的编辑窗口,将如下代码添加到最开头。
1 | Sub OnSlideShowPageChange() |
这就是一个简单的VBA,每次切换页面都会调用OnSlideShowPageChange
函数,在该函数中进行判断,若页码为Web Browser
所在的页码则将页面转到本地的网页主页。
消除不必要提醒
即使这样操作后,网页主页加载本地的JS还是会提示,“为帮助保护你的安全,你的Web浏览器已经限制此文件现实可能访问你的计算机的活动内容。单击此处查看选项”。虽然所有JS写进网页里也是个办法,但终究不方便。这里可以通过在HTML中DOCTYPE
后加入如下的一行,规避这一提醒。
1 | <!-- saved from url=(0013)about:internet --> |
全部完成之后由于使用的VBA,需要将PPT保存为“启用宏的PowerPoint演示文稿”(main.pptm),另存即可。
ECharts设置
ECharts设置为基础HTML,生成关系图,添加拖拽。
由于IE的兼容性问题,以下的代码都经过了一些例如用var
替换const
的操作,这也没办法。如果你知道如何将Chrome作为控件加入PPT,请一定留言告诉我。
基础HTML
基础的代码如下:
1 |
|
在body
中添加一个div
用于显示图表,之后引入ECharts和配置文件。
echarts-en.js
是ECharts包,为了方便离线使用,这里下载到了本地(下载地址见这里)。
生成关系图
ECharts的图形生成是通过设置Option字典完成的,也就是根据文档创建一个Option字典,通过chart.setOption(option)
完成设置。
关系图对应的是series
项下类型为graph
的内容,代码如下:
1 | var BASE_GRAPH_ID = 'relationship' |
添加拖拽
由于其他布局都存在回弹或者自动重新排列的问题,这里没办法使用force
布局提供的拖拽。也无法使用默认布局,默认布局在拖拽一个节点后其他节点会重新排布。所以最后我们选择坐标系布局,每一个节点预先设置位置,在坐标数量多的情况下也可以随机数或者借助另一个默认布局,确定节点的位置。
二维坐标的关系图节点没有默认的拖拽,而一般的图形均有拖拽的默认选项。所以实现的思路为,在关系图每一个节点上覆盖一个透明的可拖拽图形,拖拽透明图形的时候同步更改节点的位置。
实现代码如下,需要复制在上述代码后面:
1 | var dragOption = { |
其中涉及的一个问题是关系图的布局和单独图形的坐标系统不同,同样的[100, 100]
在两个坐标系统中位置是不一样的。单独图形是直接根据像素确定的,关系图则有图形专门的坐标系统。通过convertToPixel
和convertFromPixel
可以完成转换。
我这里是使用Chrome完成的Debug,全部结束之后运行main.pptm,再放映幻灯片。