描述:
程序实现如下
1. 打开Excel
Application m_app;
Range m_range;
_Worksheet m_worksheet;
Workbooks m_workbooks;
Sheets m_worksheets;
CWnd *pExelWnd = CWnd::FindWindow("XLMAIN", NULL);
if (pExelWnd )
{
pExelWnd->ShowWindow(SW_SHOWNORMAL);
pExelWnd->UpdateWindow();
pExelWnd->BringWindowToTop();
} else if(!m_app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("No Excel");
return;
}
LPDISPATCH pRange, pWorkbooks;
VERIFY(pWorkbooks = m_app.GetWorkbooks());
m_workbooks.AttachDispatch(pWorkbooks);
LPDISPATCH pWorkbook = NULL;
int nSheets=0;
m_app.SetSheetsInNewWorkbook(50);
CComVariant Template(true); //文件名
pWorkbook = m_workbooks.Add(Template); // 如果已有Excel启动,则程序执行到这出错
// 前面语句调用后 pExcelWnd=CWnd::FindWindow("Xlmain", NULL);
// 如果pExcelWnd!= NULL 则程序执行到上面红色行的语句出错
if (m_workbooks.GetCount() == 0 || nSheets==50)
{
nSheets=0;
m_app.SetSheetsInNewWorkbook(50);
pWorkbook = m_workbooks.Add(Template); // Save the pointer for
// later release
}
LPDISPATCH pWorksheets = m_app.GetWorksheets();
ASSERT(pWorksheets != NULL);
m_worksheets.AttachDispatch(pWorksheets);
// 得到sheet1
LPDISPATCH pWorksheet = m_worksheets.GetItem(COleVariant((short)1));
m_worksheet.AttachDispatch(pWorksheet);
m_worksheet.Select(Template);
// 得到sheet中所有行和列的对象
pRange = m_worksheet.GetCells();
m_range.AttachDispatch(pRange);
2. 添加数据
m_range.SetItem(COleVariant((long)(1)),COleVariant((long)(1)),COleVariant(""));
m_range.SetItem(COleVariant((long)(1)),COleVariant((long)(2)),COleVariant(“No.1”));
3. 关闭Excel
m_app.SetVisible(TRUE);
// m_workbooks.Save
m_range.ReleaseDispatch();
m_worksheet.ReleaseDispatch();
m_worksheets.ReleaseDispatch();
m_workbooks.ReleaseDispatch();
m_app.ReleaseDispatch();
当已经有一个Excel程序在执行时,为什么在下面的行会出错
CComVariant Template(true); // (false); //文件名
pWorkbook = m_workbooks.Add(Template);
请教高手帮忙,先谢谢了!
解决方案1:
没招,你参考一下这个示例:
http://www.fruitfruit.com/vc/activex/excelauto.cpp