| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3136 人关注过本帖
标题:VFP对EXCEL读操作,如何防止用户另外启动EXCEL而造成错误。
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用sdta在2012-5-7 12:21:38的发言:

既然提示用户在操作前关闭EXCEL,就不会再出现你所说的问题。如果用户置提示不顾,那用户是在自找麻烦。
还有个办法,就是隐藏鼠标的光标,等VFP操作完EXCEL后,再显示鼠标的光标。

你不能那么野蛮,关掉Windows的光标吧?关掉VFP中的光标,不妨碍用户在Windows操作的,换言之,关掉Windows的光标,就影响多任务环境,不合理。

授人以渔,不授人以鱼。
2012-05-07 12:49
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
19楼的表达似乎有点野蛮,但其思路与4楼是大同小异的,即在VFP对EXCEL操作过程中暂时停止用户打开EXCEL表的权力。换个思路,如果我们能够让操作系统不使用VFP申请的EXCEL进程,而另外建立一个新的进程,可能问题就会迎刃而解了。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-05-07 17:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
操作系统没有阻拦这个的道理,因为这是多任务系统,天生就要允许同时运行多个任务,没理由阻拦。只能是应用软件自己判断是否应该用自己来处理同一个文件,虽然不能阻止网络上别的机器的Excel进程处理同一个文件,但自己的是应该有所判别的,这只能认为是bug。根据17楼所说的现象,在单独启动另外一个Excel进程之后再Open一个文件,Excel软件进行了恰当的判断,但直接双击文件名附带启动Excel进程的时候,其启动方式与前不同。有时编程考虑不周,也不奇怪的。这个问题,应该通过多方测试,总结规律才好说,比如是否与Office的版本、打了补丁等有关。

授人以渔,不授人以鱼。
2012-05-08 00:05
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
今天测试了一下,在VFP对EXCEL读操作的时候,我在金蝶EAS系统中导出数据到EXCEL表也会引起VFP的读数据错误。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-05-09 19:07
qshuju
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:217
专家分:112
注 册:2011-6-9
收藏
得分:15 
如果实现无法实现,就是有个笨办法,即:在VFP导出EXCEL之前弹出提示,提示用户“在导出未完成之前,请不要另外运行EXCEL,否则会导致导出错误”,这样不可以了吗?
2012-05-11 02:01
qshuju
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:217
专家分:112
注 册:2011-6-9
收藏
得分:0 
我觉得这个方法可行,就是提示用户:不要人为破坏数据的导出。在导出数据时,让VFP程序独占窗口,让用户无法对windows桌面等进行其它操作,这也应该是个好的办法,你们说呢?等数据导出完成后,控制权再释放给用户,我想这样做应该不难吧。哈哈
2012-05-11 02:05
qshuju
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:217
专家分:112
注 册:2011-6-9
收藏
得分:0 
这样又省事,又省力,多好啊。
2012-05-11 02:05
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
应该说也是有效的办法之一,但缺点也是显而易见的,就是在读数据的期间剥夺了用户使用电脑的权利。如果读操作时间较长,用户就不能进行其他事务处理,正如T版主所说的那样,有点太“野蛮”了,而且也影响用户正常工作。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-05-11 07:44
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
感谢各位的热心参与!尽管还没有找到理想的解决方案,但因为不想看到论坛的结贴提示,只好先结贴。结贴之后仍希望各位继续各抒已见。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-05-12 07:21
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:0 
之前也遇到过类似问题
使用的是 2003
貌似如果同时打开两个excel 的时候,,关闭其中一个的时候另一个也会跟着关闭
(做个试验,分别创建两个excel文件,保存后全部关闭,然后分别双击这两个文件,打开任务管理器,发现了么,只有一个excel进程)
导致vfp对excel操作失败
但是,如果是双击excel.exe创建的excel进程,则是一个独立的进程
到这里就有了两种解决方法
打开某个文件前检查是否有excel进程,如果有,提示关闭,并在vfp操作excel的时候提示不要打开其他excel文件
程序代码:
Clear
Declare integer CreateToolhelp32Snapshot in win32api integer,integer
Declare integer Process32First in win32api integer,string @
Declare integer Process32Next in win32api integer,string @
Declare integer CloseHandle in win32api integer
CLEAR
lnHand = 0
lnHand = CreateToolhelp32Snapshot(3,0)
If lnHand>0
    lctitle=SPACE(256)
    If Process32First(lnHand,@lctitle) > 0
        tln = 0
        Do while Process32Next(lnHand,@lctitle)> 0
            m.lnval=SUBSTR(lctitle,37,256)
            m.lnval=left(m.lnval,AT(CHR(0),m.lnval) - 1)
            If Lower(m.lnval) == 'excel.exe'
                tln = tln + 1
                If tln == 2
                    Exit
                Endif
            Endif
        Enddo
        If tln == 3
            Messagebox("Excel进程正在运行",4096,"Message")
            CloseHandle(lnHand)
            Clear Dlls 

        Endif
    Endif
    CloseHandle(lnHand)
Endif

2. 就是直接运行excel.exe来创建独立的进程,则不会受其他进程的影响
(没有具体使用过,有兴趣的可以研究研究)

个性太多,无法显示
2012-05-12 14:46
快速回复:VFP对EXCEL读操作,如何防止用户另外启动EXCEL而造成错误。
数据加载中...
 
   



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

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