| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2379 人关注过本帖
标题:【hu9jj】vfp控制excel的问题有新进展了没
只看楼主 加入收藏
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:0 
11楼说的视图我挺感兴趣
但我本身从没有使用过视图
不知道11楼说的是个什么情况

个性太多,无法显示
2013-01-21 13:28
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:30 
以下是引用asdf_123000在2013-1-20 13:36:50的发言:

用视图技术打开Excel表,然后变成VFP表很快,7楼的数据,大概1秒钟能完成.
具体说说
2013-01-21 13:54
Kerberos
Rank: 5Rank: 5
来 自:江苏扬州
等 级:职业侠客
帖 子:227
专家分:355
注 册:2012-9-11
收藏
得分:5 
学习

想学好VFP,想做VFP高手,想帮助更多的人解决VFP问题!
2013-01-21 14:14
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:0 
先结贴了

个性太多,无法显示
2013-01-21 21:14
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用TonyDeng在2013-1-21 12:36:39的发言:

理论上说,没有可靠的办法。
不对,应该说理论上说是有可靠的办法的。因为操作系统是通过文件句柄来对打开的文件进行操作的,且文件句柄是唯一的,只要我们得到文件的句柄并通过句柄对文件进行操作,就不会出现这种情况。关键在于:1、如何得到文件句柄;2、即使得到文件句柄后EXCEL是否支持通过文件句柄进行操作。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-01-22 08:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
Windows是多任务系统,所有进程和线程、甚至程序语句的调度都是由Windows支配的,任何进程都不可以支配另一个进程的行为,除非对方程序有接受外部进程的设计。Excel、Word等是COM组件,即允许多进程使用的共享组件,这个性质决定了任何进程和用户都可以随时启动Excel内核,无法阻拦,Windows也不会允许有进程阻拦别的进程执行Excel。

我们通过CreateObject("Excel.Application")得到的,就是通过Excel内核类派生出的一个Excel对象实例,那已经是该窗体的句柄了,所有的OLE指令,都是通过这个句柄发送出去的。正如我们设计一个表单.scx类,无法妨碍用户多次执行这个类派生多个实例表单,因为这个类天生就设计成允许多次启动的。对的,除非该类设计本身有阻拦这种启动的机制,才有可能检测多进程启动并予以阻拦的可能。

Windows是操作系统,从操作系统的角度来看,它确实知道任何进程的启动和状态,Windows所知道的、以及所能做到的,应用程序却未必知道、能够做到。我们可以得到当前系统中有几个Excel在运行,但却无法阻拦操作系统让别的用户启动新的Excel,也不能杀掉已经启动的Excel。在VFP中,你要启动Excel,可以发现系统中已经有Excel在运行了,你可以不动作,但无法让已经启动的Excel关掉;如果你已经启动Excel,你更无法阻拦别的用户再启动Excel,人家启动的Excel是另一个新的对象,操作系统不会把新对象的句柄交给你控制,你可以知道,但不可能操纵它,因为这个句柄的主人不是你现在的进程(它的主人是操作系统)。
收到的鲜花
  • tlliqi2013-01-22 19:48 送鲜花  20朵   附言:谢谢

授人以渔,不授人以鱼。
2013-01-22 14:35
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
问题就在于VFP中建立的EXCEL对象,然后打开或新建EXCEL文件并对文件进行读写操作,按理不应该会影响到用户其他先前或之后打开的EXCEL文件,因应他们的文件句柄不同。可事实上确实受到了影响:读数据过程中若用户通过双击图标打开新的EXCEL文件时,很可能就会造成VFP读数据出错;写数据时用户若打开新的EXCEL文件,则VFP很可能将数据写入了用户打开的EXCEL文件中。这也许是VFP的BUG吧?
收到的鲜花
  • tlliqi2013-01-22 19:49 送鲜花  20朵   附言:谢谢

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-01-22 17:28
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
回复 26楼 TonyDeng 回复 27楼 hu9jj
谢谢
2013-01-22 19:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是Excel自身的问题。Excel设计为可重入的,它有一个内核(类),当系统中某个进程创建了第一个Excel对象,Windows就把Excel的内核加载到内存中,以后再创建新的Excel对象,它就不会再重新加载,直接使用同样的内核,只是开辟空间供新的对象数据使用而已,也就是说,处理数据的功能即逻辑代码是同一个东西,但处理的实例数据不同——这就是Windows面向对象的运行机制。所有面向对象的编程,本质上都是这样实现的。这类似于老师教学生,做竖式加法,教的是方法,那就是逻辑代码,亦即类设计代码,实际做的时候,是套入具体的数据,创建新的竖式,照着同样的方法进行处理,那些一道一道的竖式结果,就是具体的实例,而进行运算的手法是完全是一样的,都是那个老师教出来的。Excel的运作,可能也是这样的,它在读写外部设备的时候(通常这样的动作线程不可重入,因为旧式的程序设计多数没有异步文件机制),当Excel在进行这种动作的时候,不巧时间片被切换给用户启动另一个Excel对象,这也需要时间,两个进程在抢时间片,一个动作无法在系统供给的连续CPU时间内完成,再重入时就出错了。

可以举个例子,有某个函数fun(),它使用一个静态变量,比如计数器counter,统计某个数据,这可以在该函数被操作系统切换暂停后重入时把记忆的数据恢复原状继续运行。但现在的问题是,这个函数也是静态的,它被多个对象实例同时使用,那么,A进程使用它的时候记下了counter=10,被切换到B进程,极可能此时的counter值被B拿去当作原来的环境恢复使用了,然后又被更改掉,那么后面的一连串错误就可想而知了。现在是我们不能确保Excel没有使用这种模式的设计。其实Windows记忆自己创建了多少个窗口也是这样的,它内部有一个表格,专门记录这些数据,是只能给它自己使用的,应用程序禁止接触那些东西,所以在理论上必须由操作系统来改善这个问题。

可以实验一下:在Windows中启动一个Excel,随便处理什么文件或数据,不关闭,然后再双击Excel(不打开什么),我试过不会有新的Excel出现,但如果双击某个.xls文档,就会出现一个新的Excel窗口了。这说明,Excel实际上有检查自己是否已经启动的机制,除非真的需要处理不同的数据,否则它不会创建空白的自己。如果用CreateObject("Excel.Application")创建对象,这个语句要求启动一个空白的Excel,前提应是系统中没有Excel在运行,此时可以改用直接打开Excel文档的方式创建。而在Excel进行磁盘读写的时候出错,我认为是Excel没有实现异步文件读写的缘故,新的.NET框架开始支持异步文件了,但可能应该也要使用最新的Office才行,不过这时是否仍然支持COM模式被VFP操纵就不得而知了,还没用过。

授人以渔,不授人以鱼。
2013-01-22 22:45
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:0 
回复 26楼 TonyDeng
果然这些东西很“低”了
用vfp不好实现

如果是限制excel的线程数量呢
图片附件: 游客没有浏览图片的权限,请 登录注册


上图是打开一个空的excel时excel.exe所占用的文件

这个问题还不能解决的话
那就开始想象如果在“更快”上下工夫

个性太多,无法显示
2013-01-23 10:04
快速回复:【hu9jj】vfp控制excel的问题有新进展了没
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042990 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved