前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel催化剂开源第49波-Excel与PowerBIDeskTop互通互联之第三篇

Excel催化剂开源第49波-Excel与PowerBIDeskTop互通互联之第三篇

作者头像
Excel催化剂
发布2021-08-19 15:55:02
4210
发布2021-08-19 15:55:02
举报
文章被收录于专栏:Excel催化剂

在PowerBIDeskTop开启的SSAS服务,和Sqlserver所开启的一个本质的区别是,前者其端口号是随机生成的,即上一次打开获得的端口号,下一次关闭后再打开,系统分配给它新的端口号,而后者因为是服务器版的,服务器的SSAS端口号是固定的,且服务器一般都是长期打开的,不存在端口号变化引起数据连接字符串要变更的情况。

此篇对应功能实现出自:第3波-与PowerbiDesktop互通互联(Excel透视表连接PowerbiDesktop数据模型)https://www.jianshu.com/p/e05460ad407d

Excel连接PowerBIDeskTop端口号更改了怎么办?

因为这个问题,必须在Excel上对其端口号进行重新更新操作,才可以保证再次打开PowerBIDeskTop的SSAS服务后,原来存储在Excel上的通过连接字符串引用到的数据结果仍然可以保持和SSAS模型有连接关系 。

所以就出现了更新连接字符串的功能需求,当然尽可能地减少用户的操作,让更友好的界面来引导用户作必要的识别重新匹配。

Excel与PowerBIDeskTop连接,是用工作薄连接来承接的,所以只需遍历工作薄连接,将其展现给用户。

代码语言:javascript
复制
        private void formPbidUpdateConnect_Load(object sender, EventArgs e)
        {
            foreach (Excel.WorkbookConnection wkbCnn in Common.ExcelApp.ActiveWorkbook.Connections)
            {
                if (wkbCnn.Description == "pbidConnection")
                {
                    int rowIndex = this.dataGridView1.Rows.Add();
                    this.dataGridView1.Rows[rowIndex].Cells[0].Value = wkbCnn.Name;
                }
            }
            this.fileName.Width = this.workbookConnect.Width + 50;
            this.Width = this.fileName.Width * 2 + 80;

            pbidPortTittleMappings = PbidConnection.GetPbidPortTittleMappings();
            this.fileName.Items.AddRange(pbidPortTittleMappings.Select(s => s.FileName + "|" + s.Port).ToArray());
        }

最终Excel工作薄连接,只需要用下正则表达式,将原来的端口号给替换一下即可。

代码语言:javascript
复制
        private void btnEnter_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in this.dataGridView1.Rows)
            {
                if (row.Cells[1].Value!=null)
                {
                    Excel.WorkbookConnection wkbCnn = Common.ExcelApp.ActiveWorkbook.Connections[row.Cells[0].Value];
                    int newport = int.Parse(row.Cells[1].Value.ToString().Split(new char[] { '|' })[1]);
                    string newDbName = pbidPortTittleMappings.Where(s => s.Port == newport)
                                                        .Select(t => t.DbName).FirstOrDefault();
                    string newModelName = pbidPortTittleMappings.Where(s => s.Port == newport)
                                                        .Select(t => t.ModelName).FirstOrDefault();
                    string wkbcnnString = wkbCnn.OLEDBConnection.Connection;
                    wkbcnnString = Regex.Replace(wkbcnnString, @"(?<=localhost:)\d+", newport.ToString());
                    wkbcnnString = Regex.Replace(wkbcnnString, @"(?<=Initial Catalog=)[^;]+", newDbName);
                    wkbCnn.OLEDBConnection.Connection = wkbcnnString;
                    wkbCnn.OLEDBConnection.CommandText = newModelName;
                }

            }
            this.Close();
        }

结语

在Excel、PowerBIDeskTop、.Net编程三者知识的融合下,打造出来最精彩的Excel催化剂功能应用,出自国人之手,并且无论在功能实现还是原始代码都无私奉献给PowerBI社区,供应社区繁荣。

若你也受感动,何不尽一己微博之力,加入到分享Excel催化剂的行列当中?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Excel连接PowerBIDeskTop端口号更改了怎么办?
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档