PowerBIDeskTopとの相互接続のエクセル触媒47波-Excelを開く最初

ときに海外のオープンソースソフトウェアの追求であり、しかし、国ではなく、知識の税支払わ盛り上がりのIQを吹い白本当に悲しいの収穫で、GitHubにし、他のプラットフォーム上での高品質なオープンソースコードの多くを生成しました。
しかし、インターネットの精神を共有し、その利益を共有するために、より多くの人々をもたらすために。
PowerBIフィールドで、遠大な、非常に良いDAXStudioと表形式のエディタや他のオープンソースツールがありました。これにより、Excelの触媒はまた、コアだけでなく、オープンソースの機能ポイントに熱心PowerBI集団に決めました。
私は、引用コードソースの署名、それは持っていると考えるべきではない、グループの恩恵を受けることを望む、との情報非対称性の収穫IQ税の使用の継続であり続け、それがオープンソースの原理を押すのがベストです。

Cipian対応によって実現される機能:ウェーブ3 - (接続PowerbiDesktopエクセルピボットテーブルデータモデル)とPowerbiDesktop配線https://www.jianshu.com/p/e05460ad407d

どのようにサービスインスタンスSSASを現在開いPowerBIDeskTopコンピュータがオンになって確認するには?

時間がPowerBIDeskTopを実行しているので、SSASのインスタンスを開き、同様のSQLSERVERをオンにすることですが、マシンの機能へのアクセスが制限は、特定の形式は、msmdsrv.exeプロセスを持つことがタスクマネージャ上で表示することができます。

Pbix処理後にファイルを開くmsmdsrv.exe

あなたが複数のpbixファイルを開くと、より多くのmsmdsrv.exeプロセスがあるだろう、コア接続PowerBIDeskTopエクセルは、それがポート番号msmdsrv.exeオープンとして認識されるようになりました。

ポート番号を認識した場合にも、複数のmsmdsrv.exe実行が同時に存在する場合と、あなたはまた別のmsmdsrv.exeが元PowerBIDeskTopオープンPbixファイルへの対応によって開かれたポート番号が必要です。

だけで、ファイル名に関連付けられたときに特定のポートを識別するために、ユーザビュー、対応する接続​​msmdsrv.exeモデルは、最終的に所望に対応するデータに接続された対応するファイルpbixを達成するために必要な接続ポート番号を介して、所属します過去のモデル。

特定のコード

Excelの触媒技術的な困難がオープンDAXStudioコードスニペットを使用して、上記を達成するために。

古いルールは、第1の鍵情報の一部を格納するために使用されるエンティティクラスを作成します。

    class PbidFileInfo
    {
        public string FileName { get; set; }
        public int Port { get; set; }
        public string DbName { get; set; }

        public string ModelName { get; set; }

    }

次のコードを介して利用可能なSSASインスタンスのポート番号と対応するpbixファイル名など、リターンリストリストによって開かPowerBIDeskTopに関する情報。


public static List<Entity.PbidFileInfo> GetPbidPortTittleMappings()
        {
            List<Entity.PbidFileInfo> pbidPortTittleMappings = new List<Entity.PbidFileInfo>();
            ManagementClass mgmtClass = new ManagementClass("Win32_Process");
            foreach (ManagementObject process in mgmtClass.GetInstances())
            {
                string processName = process["Name"].ToString().ToLower();
                if (processName == "msmdsrv.exe")
                {

                    // get the process pid
                    System.UInt32 pid = (System.UInt32)process["ProcessId"];
                    var parentPid = int.Parse(process["ParentProcessId"].ToString());
                    var parentTitle = "";
                    if (parentPid > 0)
                    {
                        var parentProcess = Process.GetProcessById(parentPid);
                        //if (parentProcess.ProcessName == "devenv") _icon = EmbeddedSSASIcon.Devenv;
                        parentTitle = parentProcess.MainWindowTitle;
                        if (parentTitle.Length == 0)
                        {
                            // for minimized windows we need to use some Win32 api calls to get the title
                            parentTitle = GetWindowTitle(parentPid);
                        }
                    }
                    // Get the command line - can be null if we don't have permissions
                    // but should have permission for PowerBI msmdsrv as it will have been
                    // launched by the current user.
                    string cmdLine = null;
                    if (process["CommandLine"] != null)
                    {
                        cmdLine = process["CommandLine"].ToString();
                        try
                        {
                            var rex = new System.Text.RegularExpressions.Regex("-s\\s\"(?<path>.*)\"");
                            var m = rex.Matches(cmdLine);
                            if (m.Count == 0) continue;
                            string msmdsrvPath = m[0].Groups["path"].Captures[0].Value;
                            var portFile = string.Format("{0}\\msmdsrv.port.txt", msmdsrvPath);
                            if (System.IO.File.Exists(portFile))
                            {
                                string sPort = System.IO.File.ReadAllText(portFile, Encoding.Unicode);
                                string cnnString = cnnString = $"localhost:{sPort}";
                                using (AMO.Server server = new AMO.Server())
                                {
                                    server.Connect(cnnString);
                                    string dbName = server.Databases[0].Name;
                                    string modelName = server.Databases[0].Model.Name;

                                    pbidPortTittleMappings.Add(new Entity.PbidFileInfo()
                                    {
                                        FileName = parentTitle.Replace(" - Power BI Desktop", ""),
                                        Port = int.Parse(sPort),
                                        DbName = dbName,
                                        ModelName = modelName
                                    });
                                }
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }
            }
            return pbidPortTittleMappings;
        }


        //#region PInvoke calls to get the window title of a minimize window
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern bool IsWindowVisible(IntPtr hWnd);


        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
            IntPtr lParam);

        private static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
        {
            var handles = new List<IntPtr>();

            foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
                EnumThreadWindows(thread.Id,
                    (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

            return handles;
        }

        private const uint WM_GETTEXT = 0x000D;

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam,
            StringBuilder lParam);

        private static string GetWindowTitle(int procId)
        {
            foreach (var handle in EnumerateProcessWindowHandles(procId))
            {
                StringBuilder message = new StringBuilder(1000);
                if (IsWindowVisible(handle))
                {
                    SendMessage(handle, WM_GETTEXT, message.Capacity, message);
                    if (message.Length > 0) return message.ToString();
                }

            }
            return "";
        }

アイデア上記のコードは次のとおりです。使用MANAGEMENTCLASS Win32_Processクラスの下で、対応するmsmdsrv.exe PIDを取得します。

API機能により一部のシステムでは、対応するタイトルを取得します。

やコマンドの特性を再利用最終msmdsrv.port.txtファイルのフルパスを対応する相手が正規パススプライシングプロセスをmsmdsrv.exeへのパスを取り得ます。著者として、マシンのパスは
C:\ Users \ユーザーのMicrosoft \管理者 \パワーBIデスクトップストアのApp \ AnalysisServicesWorkspaces \ AnalysisServicesWorkspace115089896データ\ \ msmdsrv.port.txt

C:\ Users \ユーザー管理\マイクロソフト\パワーBIデスクトップストアのApp \ AnalysisServicesWorkspaces \ AnalysisServicesWorkspace1855860078 \データ\ msmdsrv.port.txt

リユースポート番号情報は、最終的に手を得るために、対応する異なるポート番号をmsmdsrv.exe、このファイルのプロパティに格納されます。

リユースAMOオブジェクトモデルともモデル名の下に、このデータベース名とポート番号を読み取ります。

一緒にすべての情報を得るために最後の後、あなたはアクセス接続を開始するために、Excelクライアントに戻ることができます。
そして、ユーザレベルで、フォームの読みやすさが異なるモデルを選択するユーザーのための重要な情報を視覚化します。

ユーザーがExcelクライアント上で選択するための重要な情報を表示します

        private void formPbidNewConnect_Load(object sender, EventArgs e)
        {
            this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            List<Entity.PbidFileInfo> pbidPortTittleMappings = PbidConnection.GetPbidPortTittleMappings();
            foreach (var item in pbidPortTittleMappings)
            {
                this.dataGridView1.Rows.Add(new object[] { item.Port, item.FileName,item.DbName,item.ModelName });
            }
            this.dataGridView1.Rows[0].Selected = true;
        }

ピボットテーブルレベルでは、単にプロバイダMSOLAP缶とOLEDB接続を構築します。
具体的なコードは次のよう:

        private void btnEnter_Click(object sender, EventArgs e)
        {
            DataGridViewRow row = this.dataGridView1.SelectedRows[0];
            Entity.PbidFileInfo pbidFileInfo = Common.GetPbidFileInfo(row);
            Excel.WorkbookConnection wkbcnn;
            if (Common.ExcelApp.ActiveWorkbook.Connections.Cast<Excel.WorkbookConnection>().Any(s=>s.Name==pbidFileInfo.FileName))
            {
                Common.ExcelApp.ActiveWorkbook.Connections[pbidFileInfo.FileName].Delete();
            }
            string wkbCnnString = $"OLEDB;Provider=MSOLAP;Integrated Security=SSPI;Persist Security Info=True;Data Source=localhost:{pbidFileInfo.Port};Initial Catalog={pbidFileInfo.DbName};";
            Common.ExcelApp.ActiveWorkbook.Connections.Add(pbidFileInfo.FileName, "pbidConnection", wkbCnnString, pbidFileInfo.ModelName, 1);
            Excel.Worksheet wht = Common.ExcelApp.Worksheets.Add();
            wkbcnn = Common.ExcelApp.ActiveWorkbook.Connections[pbidFileInfo.FileName];
            Excel.PivotCache pvtCache = Common.ExcelApp.ActiveWorkbook.PivotCaches().Create(Excel.XlPivotTableSourceType.xlExternal, wkbcnn);
            pvtCache.CreatePivotTable(wht.Range["A1"]);
            this.Close();
        }

エピローグ

何も健康で豊かな社会、地域社会への最も商業的に価値のあるコードの貢献の本質にExcelの触媒するために、共有することはできませんが、また、中国社会の声に国際的影響力のうち、より大きな声であることを。

技術交流QQグループ

QQグループ名:Excelの触媒オープンディスカッショングループ、QQグループ番号:788 145 319
Excelの触媒次元コードのオープンソースのディスカッショングループ

Excelの触媒について

Excelの触媒名、最初の公開のマイクロチャンネル番号は、その名前を避ける、正式エクセルプラグイン、プラグイン継続的な更新を立ち上げ、更新サイクルは、ラインの機能モジュールに一週間のために戦うことができるかもしれ私の時間に依存します。Excelの触媒プラグイン永久無料で個々のユーザーへのコミットメント!

Excelの触媒プラグインは、一度インストールし、技術の最新の展開を使用して、すべての将来のアップデートは自動的に更新再インストールするインストールパッケージをダウンロードし、手動で、懸念の更新を繰り返す必要完了していないあなたは常に単一のインストールで最新バージョンを維持することができます!

触媒Excelは、プラグインのダウンロードリンク:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

著者にお問い合わせください

いいえ公共ありません

取名催化剂,因Excel本身的强大,并非所有人能够立马享受到,大部分人还是在被Excel软件所虐的阶段,就是头脑里很清晰想达到的效果,而且高手们也已经实现出来,就是自己怎么弄都弄不出来,或者更糟的是还不知道Excel能够做什么而停留在不断地重复、机械、手工地在做着数据,耗费着无数的青春年华岁月。所以催生了是否可以作为一种媒介,让广大的Excel用户们可以瞬间点燃Excel的爆点,无需苦苦地挣扎地没日没夜的技巧学习、高级复杂函数的烧脑,最终走向了从入门到放弃的道路。

最后Excel功能强大,其实还需树立一个观点,不是所有事情都要交给Excel去完成,也不是所有事情Excel都是十分胜任的,外面的世界仍然是一个广阔的世界,Excel只是其中一枚耀眼的明星,还有其他更多同样精彩强大的技术、工具等。*Excel催化剂也将借力这些其他技术,让Excel能够发挥更强大的爆发!

关于Excel催化剂作者

姓名:李伟坚,从事数据分析工作多年(BI方向),一名同样在路上的学习者。
服务过行业:零售特别是鞋服类的零售行业,电商(淘宝、天猫、京东、唯品会)

技术路线从一名普通用户,通过Excel软件的学习,从此走向数据世界,非科班IT专业人士。
历经重重难关,终于在数据的道路上达到技术平原期,学习众多的知识不再太吃力,同时也形成了自己的一套数据解决方案(数据采集、数据加工清洗、数据多维建模、数据报表展示等)。

擅长技术领域:Excel等Office家族软件、VBA&VSTO的二次开发、Sqlserver数据库技术、Sqlserver的商业智能BI技术、Powerbi技术、云服务器布署技术等等。

2018年には、彼のキャリアは、元のフルタイムの仕事から、主要な調整を行って始めました一時的に前方の道路上で、決まった収入をフリーランスになっていない、フルタイムの仕事に苦い復帰明確ではない、のためのExcel触媒しなければならない事業と開発大きな影響を受けた(時間内にフルタイムの仕事を維持することができなかっただけで、時間に発表された作品で結果を置くことができない彼は、年齢、家族の責任の30年を持っているので、仕事以外の時間は、非常に限られている)こと。

期待と支持者の過半数:Excelの触媒は、ダウンを実行することができました、私はグループの利点を持っている(サポートすることができましたマルチメッセージの励ましを、転送小さな報酬の下での推薦と最も集中し、どこの会社ができるの下で友人のサークルと私はウィンウィンを達成するために、あなたの会社の技術の価値を最大化することができますので、お勧めのピアをお勧めします(データは協力のフォームを開発するための予備的コンサルタントや小さなプロジェクトがどのように想像することができます)。

おすすめ

転載: www.cnblogs.com/ExcelCuiHuaJi/p/11225095.html