使用MFC在SDI的CXXXXView里面通过:“CXXXXCntrItem->DoVerb(OLEIVERB_SHOW, this)”打算对被载入视图中的Excel表进行编辑。(这里有个小问题:究竟可以被我编辑的表是在视图中还是在包容器里?视觉上看像是在视图中,但是命令又是使用Container里面的方法!题外话~~~)
编辑完以后则无法正确保存Excel对象。
主要代码如下:#include "CApplication.h"
#include "CWorkbooks.h"
#include "CWorkbook.h"
#include "CWorksheets.h"
#include "CWorksheet.h"
#include "CRange.h"///////////////////////////////////////////////////////////
void CXXXXView::EmbedAutomateExcel(CString FileName)
{
CApplication m_Excel;
CWorkbooks m_Books;
CWorkbook m_Book;
CWorksheets m_Sheets;
CWorksheet m_Sheet;
CRange m_Range; CXXXXCntrItem* pItem = NULL;
CXXXXDoc *pDoc = GetDocument(); ...... pItem->DoVerb(OLEIVERB_SHOW,this); //如果去掉这条语句,不能编辑,但是却可以保存文件了......
m_pSelection = pItem;
pDoc->UpdateAllViews(NULL); LPDISPATCH lpDisp;
lpDisp = pItem->GetIDispatch(); m_Book.AttachDispatch(lpDisp);
m_Sheets = m_ReportTable.m_Book.get_Worksheets();
m_Sheet = m_ReportTable.m_Sheets.get_Item(COleVariant((short)1));
m_Book.SaveAs(COleVariant(FileName), vOpt, vOpt, vOpt, vOpt, vOpt,
xlNC, xlLSC, vOpt, vOpt, vOpt, vOpt);
//在最后这句SaveAs()的时候出问题了,提示“未能创建对象,请确保在系统注册表中输入了该对象。”
}
///////////////////////////////////////////////////////////    应该有高手也遇到过这样的问题吧?最后我又尝试了使用“IPersistFile->Save(......)”的方法保存也没有效果?!请问究竟是怎么回事?如果去掉“DoVerb”在非编辑态下又能正确保存文件,百思不得其解,望高人们指教,万分感谢!!!!!!

解决方案 »

  1.   

    When showing a window as a result of DoVerb, it is very important for the object to explicitly call SetForegroundWindow on its editing window. This ensures that the object's window will be visible to the user even if another process originally obscured it. For more information see SetForegroundWindow and SetActiveWindow.
      

  2.   

    请问一下二楼~~SetForegroundWindow()怎么用?比如在我的程序里是否在执行DoVerb()之后再加上一句SetForegroundWindow()就可以了吗?(这样做也没效果)
    不知道能不能给一个稍微详细一点的解法:)
      

  3.   

    pItem->DoVerb(OLEIVERB_SHOW,this); //如果去掉这条语句,不能编辑,但是却可以保存文件了...... 很幸运,片刻前刚刚解决了这个问题,主要原因还是由于在DoVerb()以后,容器处于Activate状态,造成了文档不可保存,你试试在保存前加一句m_pSelection->Deactivate();应该就没问题了