c# 通过句柄获取已经打开的excel表中的值 excelwinformc# 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的意思是我打开程序 如果任务管理器里面有excel时候直接去抓Excel里面的内容吗 恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理 恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理windows自带的任务管理器好像无法直接找到当前打开文件的位置 恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理windows自带的任务管理器好像无法直接找到当前打开文件的位置我不需要找到excel文件的位置,winform程序是开机自启动的,系统一启动这个winform就开始轮询进程列表,如果有excel文件被用户双击打开,这时候winform就开始自动获取单元格里的内容,并通过tcp/ip将值传送给上位机,通信这块没什么问题,关键是如果取到单元格内的值。在进程列表中找到excel的话,就能取到excel的句柄,得到句柄之后能取出值吗 这个有难度恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理windows自带的任务管理器好像无法直接找到当前打开文件的位置我不需要找到excel文件的位置,winform程序是开机自启动的,系统一启动这个winform就开始轮询进程列表,如果有excel文件被用户双击打开,这时候winform就开始自动获取单元格里的内容,并通过tcp/ip将值传送给上位机,通信这块没什么问题,关键是如果取到单元格内的值。在进程列表中找到excel的话,就能取到excel的句柄,得到句柄之后能取出值吗这好像MS没有提供这样的接口, 不知道哎 ,应该是取不到的吧............. 你也可以看看这篇文章http://blog.csdn.net/wzsy/article/details/7227427http://blog.csdn.net/wzsy/article/details/7227430http://blog.csdn.net/wzsy/article/details/7227439 恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理windows自带的任务管理器好像无法直接找到当前打开文件的位置我不需要找到excel文件的位置,winform程序是开机自启动的,系统一启动这个winform就开始轮询进程列表,如果有excel文件被用户双击打开,这时候winform就开始自动获取单元格里的内容,并通过tcp/ip将值传送给上位机,通信这块没什么问题,关键是如果取到单元格内的值。在进程列表中找到excel的话,就能取到excel的句柄,得到句柄之后能取出值吗这好像MS没有提供这样的接口,如果有这样的接口 那万一用户电脑被我植入一个开机启动程序,那我就可以直接找到所有他打开的文件内容了.这个是不是有点夸张了 我给大家上个图吧客户是用vba开发出来的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"); } 这与标题不符,不回答,只给你个提示你用录制宏的式,录制一个点击的效果出来。然后去查里面宏的原码那段点击的代码段。再转换成C#的代码。上面说了拿到了Excel.ApplicationClass怎么整都可以了,这跟Excel里面的处里宏是一样的。 这与标题不符,不回答,只给你个提示你用录制宏的式,录制一个点击的效果出来。然后去查里面宏的原码那段点击的代码段。再转换成C#的代码。上面说了拿到了Excel.ApplicationClass怎么整都可以了,这跟Excel里面的处里宏是一样的。ok结贴,我得把你关注一下 谢谢wyd1520的回复,正巧我也在和楼主一样,在发愁怎样实时获取excel表格中的数据,多谢多谢,明天赶紧试一下,同时也谢谢楼主 大家帮忙看看拆分文档【循环报错数值超出范围】 关于Access 2007 的操作问题 Windows服务执行问题 显示和隐藏窗体 不能显示第二个窗体 比较急的问题:关于C/S 树形结构 1000元求购打印货物运单 如何从HashTable 中取得 key 值 C#导出EXCEL的解决方案(Windows) wpf如何实现图片叠加显示 WPF,这是附加属性还是属性值继承 C#怎样进行窗体间实时传值? lock嵌套使用有什么目的(c#)?
恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理
恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理
windows自带的任务管理器好像无法直接找到当前打开文件的位置
恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理
windows自带的任务管理器好像无法直接找到当前打开文件的位置我不需要找到excel文件的位置,winform程序是开机自启动的,系统一启动这个winform就开始轮询进程列表,如果有excel文件被用户双击打开,这时候winform就开始自动获取单元格里的内容,并通过tcp/ip将值传送给上位机,通信这块没什么问题,关键是如果取到单元格内的值。在进程列表中找到excel的话,就能取到excel的句柄,得到句柄之后能取出值吗
恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理
windows自带的任务管理器好像无法直接找到当前打开文件的位置我不需要找到excel文件的位置,winform程序是开机自启动的,系统一启动这个winform就开始轮询进程列表,如果有excel文件被用户双击打开,这时候winform就开始自动获取单元格里的内容,并通过tcp/ip将值传送给上位机,通信这块没什么问题,关键是如果取到单元格内的值。在进程列表中找到excel的话,就能取到excel的句柄,得到句柄之后能取出值吗
这好像MS没有提供这样的接口,
http://blog.csdn.net/wzsy/article/details/7227427
http://blog.csdn.net/wzsy/article/details/7227430
http://blog.csdn.net/wzsy/article/details/7227439
恩恩,对的,我这边的需求就是,当excel打开的时候,做一些自动化的处理
windows自带的任务管理器好像无法直接找到当前打开文件的位置我不需要找到excel文件的位置,winform程序是开机自启动的,系统一启动这个winform就开始轮询进程列表,如果有excel文件被用户双击打开,这时候winform就开始自动获取单元格里的内容,并通过tcp/ip将值传送给上位机,通信这块没什么问题,关键是如果取到单元格内的值。在进程列表中找到excel的话,就能取到excel的句柄,得到句柄之后能取出值吗
这好像MS没有提供这样的接口,如果有这样的接口 那万一用户电脑被我植入一个开机启动程序,那我就可以直接找到所有他打开的文件内容了.这个是不是有点夸张了
只要取到 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");
}
上面说了拿到了Excel.ApplicationClass怎么整都可以了,这跟Excel里面的处里宏是一样的。
上面说了拿到了Excel.ApplicationClass怎么整都可以了,这跟Excel里面的处里宏是一样的。
ok结贴,我得把你关注一下