barden 发表于 2012-2-29 14:25:08

VS08 操作 已经打开的excel问题

TCHAR szCurrPath;
GetCurrentDirectory(MAX_PATH, szCurrPath);// 得到程序所在目录
strFile = szCurrPath;
strFile += "\\demo.xls";
app.SetVisible(TRUE); //excel不可见
app.SetUserControl(TRUE); //允許其它用戶控制Excel
app.SetAlertBeforeOverwriting(FALSE);
app.SetDisplayAlerts(FALSE); //表示是否忽略警告信息,比如提示“文件xxx.xls已经存在是否覆盖?”,若SetDisplayAlerts的参数为FALSE则不出现提示信并默认覆盖。
//COleDispatchDriver::m_bAutoRelease
//说明:如果为TRUE,则当调用ReleaseDispatch或COleDispatchDriver对象被销毁时,由m_lpDispatch访问的COM对象将被自动释放。
//缺省的,在构造函数中m_bAutoRelease被设置为TRUE。
//打开demo.xls
books.AttachDispatch(app.GetWorkbooks());
lpDisp = books.Open(strDatePath,
covOptional, covOptional , covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional);
/////////////////////////////////////////////////////////////
。。。。。。
/////////////////////////////////////////////////////////////
//保存
book.SaveAs(COleVariant(strFile),covOptional,covOptional,
covOptional,covOptional,covOptional,0,covOptional,
covOptional,covOptional,covOptional,covOptional);   


//关闭所有的book,退出Excel
book.Close (covOptional,COleVariant(strDatePath),covOptional);
books.Close();   
   
usedRange.ReleaseDispatch();
range.ReleaseDispatch();//释放对象
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();

app.Quit();
app.ReleaseDispatch();
   

打开excel的程序如上所示,现在小弟的问题是这样的:
(1)demo.xls未打开,程序执行都没问题,往excel表里填写数据、保存都正确。
(2)demo.xls先打开,再执行程序,程序执行后,发现demo.xls的数据未变化,还是原来的数据。此时,我如果把这两句给注释掉 app.SetAlertBeforeOverwriting(FALSE);
app.SetDisplayAlerts(FALSE); //表示是否忽略警告信息,比如提示“文件xxx.xls已经存在是否覆盖?”,若SetDisplayAlerts的参数为FALSE则不出现提示信并默认覆盖。
就会出现文件已打开,需要覆盖类似的提示,下面有三个选项(1,是 2.否 3 .取消),我选择1.是 的时候,程序能正常执行,但是数据还是未保存。 选择2,3时都会出现错误,执行文件被中断。


以上是我最近在用VC操作excel表时出现的一些问题,请大家帮忙改正一下。先谢谢了~~

程序参考:
http://apps.hi.baidu.com/share/detail/22029062
http://hi.baidu.com/yimeng08/blog/item/a4de101565fab7ee1ad57647.html


文件保存提示错误和这篇文章的问题是一样的~~
http://www.officexy.com/Articles/Outlook/OutlookVBA/2006102993747161.htm
用VC对Excel文件进行写操作后,在程序结束前需要对一些对象进行收尾工作,如调用_Workbook::Save()方法(该方法是Microsoft提供的供VC调用的对Excel文件操作的标准方法,在文件excel9.cpp或excel.cpp中定义)保存文件。
问题就出现在这里,若选取要保存的Excel文件以前不存在则程序创建一个同名的空Excel文件,对Excel表的操作实际是对其同名副本的操作,Save()方法会触发一个"另存为"的对话框,需要覆盖原来同名的空Excel文件,否则写入Excel的数据会丢失。若选取的Excel文件已经存在,则调用Save()方法不会触发"另存为"对话框,系统会自动保存写到Excel中的数据。
需要说明的是,在调用Save()前,已经调用过SetAlertBeforeOverwriting(FALSE)和SetDisplayAlerts(FALSE)关掉一些警告窗口了。若调用SaveAs()方法,虽不会触发"另存为"对话框,但会出抛出“找不到成员”的错误,这时保存写好的Excel文件后并重新打开发现数据还是丢失。
想尽所有办法,可总无法去掉那个讨厌的"另存为"对话框,请各位大虾帮忙。多谢了!

barden 发表于 2012-2-29 14:25:31

在线等~~

gold 发表于 2012-2-29 14:49:13

表述能力有待提高
文件既然已经打开了,那再次打开就是只读了,当然写不进去了,我之前使用的时候也遇到这个问题,但我觉得这个不是问题
这种问题还是不要在这里提了,用过的人不多

barden 发表于 2012-2-29 15:27:54

回复【2楼】gold
-----------------------------------------------------------------------

哦~感谢回答
页: [1]
查看完整版本: VS08 操作 已经打开的excel问题