工作中,基于同事提供的基础数据在PowerBI中搭建好数据模型之后如何更方便地刷新,是一个很重要的问题。
最简单的方式是原始数据来自于联网的数据库,这样刷新不需要手动操作。
但是如果数据不是来自于数据库,而是来自于Excel,就很头疼。
实际工作中,我找到了两种不基于联网数据库的PowerBI报表刷新方式,分别列举如下。
两种方法用的建模工具是PowerBI Destkop,因为要用它将模型发送到PowerBI网络服务。
当然用Excel作为建模工具也是可以的,这样就不需要PowerBI网络服务,只是Excel模型只能在本地计算机上刷新,如果要把生成的报表共享给其他同事要做一番额外的工作——比如,把模型放入OneDrive For Business然后共享给同事。
一、基于OneDrive For Business的PowerBI报表自动刷新方法
第一步,得有一个OneDrive For Business账号,我是公司购买了一个office365,就自带1T的OneDrive For Business了。
第二步,得准备一个OneDrive For Business文件夹,用于存放原始数据。
第三步,基于OneDrive For Business建立PowerBI数据模型。这一步很简单,直接建立一个类似于下面这样的数据源即可:
SharePoint.Contents("https://xxx-my.sharepoint.cn/xxx/", [ApiVersion = "Auto"])
到哪里去获取引号中的链接地址呢?在PowerBI网页版中点击左上角的九个点,选择OneDrive图标,然后鼠标左键单击,就会进入OneDrive For Business页面了。
在地址栏可以发现类似于下面这样的链接地址:
https://xxx-my.sharepoint.cn/xxx/_layouts/15/onedrive.aspx
把后面的【_layouts/15/onedrive.aspx】去掉,就可以在PowerBI中进入OneDrive For Business的根目录了(当然,也可以进入特定文件夹而不用进入根目录,具体参见这个英文链接)。
第一次打开OneDrive For Business链接会要求填写凭据,填写PowerBI账号密码即可。
之后就跟操作本地文件夹和文件一模一样了。
第四步,把数据源文件夹以链接的方式分享给同事,让其编辑或替换里边的原始数据即可。
这一步比较繁琐,并不是直接生成分享链接发给同事,他们就可以操作的:通过这样的方式分享出去的链接,必须要有该OneDrive For Business的有效账号才能打开,而不是匿名方式打开。
而我需要的恰恰是匿名就能打开链接(这种方式对保密性要求很高的数据并不适合,任何拥有该链接的人都可以看到并修改其中的数据;如果对安全性要求很高,建议给相关人员购买账号)。所以参考了这篇教程,打开了OneDrive For Business的匿名分享。
匿名分享成功后,把链接发给同事,他们打开链接就可以在浏览器里边编辑原始数据(无需安装任何程序),当然,也可以把文件下载到本地后编辑再上传上去。
需要注意的是,已有文件只能覆盖不能删除。
第五步,非常重要!不能通过PowerBI Desktop直接发布到PowerBI网络服务,因为这样发布上去后PowerBI计划刷新虽然成功,然而数据并不会更新。
别问我怎么知道的,因为我是今天才知道的。
在PowerBI Desktop中建立好数据模型后,保存,再把模型文件(也就是pbix文件)放到OneDrive For Business中。
第六步,在PowerBI网络版中,点击左下角的【获取数据】,然后选择【文件】,再选择【OneDrive For Business】,然后找到对应的pbix文件进行连接。连接后之前做的图表也会自动加载,不需要重新在网页中再做一遍。
第七步,在PowerBI网络服务中设置刷新。
可见网关连接不需要了,但是要在数据源凭据里进行设置,之后就可以设置计划刷新了。
这种方式的好处是无需本地计算机随时开机,只要把链接发给同事让他们更新其中的文件就好了。
坏处是如果采用匿名链接,对安全性要求高的数据就很危险了,这时需要额外花钱去给需要更新数据的同事购买能打开OneDrive For Business链接的账号,这一般都是office365账号且隶属于同一个组织。
二、基于本地网关的全自动刷新方式
这是我最先采用的方法。
这种刷新方式要求在本地计算机上安装数据网关。配置好之后,只要本地电脑开机,那么数据网关就和PowerBI服务器建立了持久的连接,能自动刷新本地计算机上的数据。
那么,同事的数据如何到达我自己的电脑呢?有很多种方式,适用场景最广的是通过发送电子邮件(这样不受局域网限制),然后用某种方式把电子邮件自动保存到指定文件夹,再把这个指定文件夹添加到数据网关的数据源。
我平时用outlook比较多,所以找了一段VBA代码(代码见附件)来自动监测指定主题的邮件,如果有附件则自动保存到指定文件夹。
把这段VBA代码添加到outlook之后,再创建一条规则:当新邮件来自于指定主题且包含附件,则将其保存到指定的文件夹:
如果宏无法运行,则需启用宏:
如果在规则中找不到运行脚本的命令,则需:
这种方式的好处是基本做到了全自动化:同事只需要根据指定规则发邮件到指定邮箱即可。
但这种方式也有很大弊端:必须保持数据网关所在的电脑随时开机,否则万一在非工作时间也需要刷新数据就很麻烦了。而在周末和节假日期间,这类非服务器的电脑一直开机也有安全隐患——且不说浪费电的问题。
附件:自动保存附件的VBA代码
Option Explicit
Public Sub SaveAttach(Item As Outlook.MailItem)
SaveAttachment Item, "S:\Holding\", "*.xls"
MsgBox "附件已保存"
End Sub
' 保存附件
' path为保存路径,condition为附件名匹配条件
Private Sub SaveAttachment(ByVal Item As Object, path$, Optional condition$ = "*")
Dim olAtt As Attachment
Dim i As Integer
If Item.Attachments.Count > 0 Then
For i = 1 To Item.Attachments.Count
Set olAtt = Item.Attachments(i)
' save the attachment
If olAtt.FileName Like condition Then
olAtt.SaveAsFile path & olAtt.FileName
End If
Next
End If
Set olAtt = Nothing
End Sub