当前位置: 代码迷 >> C# >> c# 透过句柄获取已经打开的excel表中的值
  详细解决方案

c# 透过句柄获取已经打开的excel表中的值

热度:86   发布时间:2016-05-05 04:57:11.0
c# 通过句柄获取已经打开的excel表中的值
相当于是一个excel外挂,网上搜的资料都是需要先把excel导入进c#

但目前的需求是,一个c# winform需要轮询进程列表,当找到有excel进程时,自动将excel表中单元格内的值取出来。。。

各位大侠。。该如何做。。不胜感激
------解决思路----------------------
你的意思是我打开程序 如果任务管理器里面有excel时候直接去抓Excel里面的内容吗
------解决思路----------------------
楼主不需要用语句柄了,直接下面的代码 就能取出打开的EXCEL在进程中所有的文件了,包含能取到的路径和内容,
只要取到  Microsoft.Office.Interop.Excel.Application a = o as Microsoft.Office.Interop.Excel.Application; 这个对像,你就能为所欲为了,怎么操作EXCEL都成。剩下的就是你要去了解这个对像的操作EXCEL的方式。

[DllImport("ole32.dll")]
        public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);

        [DllImport("ole32.dll")]
        public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);


        private Hashtable GetRunningObjectTable()
        {
            Hashtable result = new Hashtable();

            IntPtr numFetched = IntPtr.Zero;
            IRunningObjectTable runningObjectTable;
            IEnumMoniker monikerEnumerator;
            IMoniker[] monikers = new IMoniker[1];
            GetRunningObjectTable(0, out runningObjectTable);
            runningObjectTable.EnumRunning(out monikerEnumerator);
            monikerEnumerator.Reset();
            while (monikerEnumerator.Next(1, monikers, numFetched) == 0)
            {
                IBindCtx ctx;
                CreateBindCtx(0, out ctx);
                string runningObjectName;monikers[0].GetDisplayName(ctx, null, out runningObjectName);
                object runningObjectVal;
                runningObjectTable.GetObject(monikers[0], outrunningObjectVal);
                result[runningObjectName] = runningObjectVal;
            }
            return result;
        }

        private bool XlsIsOpen(string fileName)
        {
            bool XlsIsOpen = false;
            Hashtable rot = GetRunningObjectTable();
            bool isOk = false;
            foreach (object o in rot.Values)
            {
                if (isOk)
                {
                    break;
                }
                Microsoft.Office.Interop.Excel.Application a = o as Microsoft.Office.Interop.Excel.Application;
                if (a != null)
                {
                    Microsoft.Office.Interop.Excel.Workbooks wbooks = a.Workbooks;
                    foreach (Microsoft.Office.Interop.Excel.Workbook wb in wbooks)
                    {
                       
                        if (wb.Name == fileName)
                        {
                            Microsoft.Office.Interop.Excel.Worksheet sheet = wb.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;


                            int iRowCount = sheet.UsedRange.Rows.Count;
                            int iColCount = sheet.UsedRange.Columns.Count;
                            Microsoft.Office.Interop.Excel.Range range;

                            for (int iRow = 1; iRow <= iRowCount; iRow++)
                            {


                                for (int iCol = 1; iCol <= iColCount; iCol++)
                                {

                                    Microsoft.Office.Interop.Excel.Range ss = (Microsoft.Office.Interop.Excel.Range)sheet.Cells[iRow, iCol];
                                    Console.WriteLine(ss.Text);
                                }
                            }
                            XlsIsOpen = true;
                            isOk = true;
                            break;
                        }
                    }
                    //a.DisplayAlerts = false;
                    //a.Quit();
                }
            }
            return XlsIsOpen;

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            XlsIsOpen(@"XX.xls");
        }
  相关解决方案