导出代码如下所示:
void CDataToExcelDlg::OnButeduce() 
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_edit.IsEmpty())
{
MessageBox("文件名不能为空!");
return;
}
_Application app;    
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
COleVariant
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //创建Excel 2000服务器(启动Excel) 
if (!app.CreateDispatch("Excel.Application",NULL)) 

AfxMessageBox("创建Excel服务失败!"); 
exit(1); 

app.SetVisible(false); 
//利用模板文件建立新文档 
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CString strPath = path;
strPath += "\\DataGridToExcel";
books.AttachDispatch(app.GetWorkbooks(),true); 
book.AttachDispatch(books.Add(_variant_t(strPath)));
//得到Worksheets 
sheets.AttachDispatch(book.GetWorksheets(),true);
//得到sheet1 
sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")),true);
CString str1;
str1 = "第1页";
sheet.SetName(str1);
for( int i=0;i<sheets.GetCount()-1;i++)
{
sheet = sheet.GetNext();
str1.Format("第%d页",i+2);
sheet.SetName(str1);
}
sheet.AttachDispatch(sheets.GetItem(_variant_t("第1页")),true);
//得到全部Cells 
range.AttachDispatch(sheet.GetCells(),true); 
CString sText;
m_adodc.GetRecordset().MoveFirst();
for(int setnum=0;setnum<m_adodc.GetRecordset().GetRecordCount()+1;setnum++)
{
for(int num=0;num<m_datagrid.GetColumns().GetCount();num++)
{
if(!setnum)
{
sText.Format("%d",num);
range.SetItem(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)),
_variant_t(m_datagrid.GetColumns().GetItem((_variant_t)sText).GetCaption()));
}
else
{
sText.Format("%d",num);
range.SetItem(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)),
_variant_t(m_datagrid.GetColumns().GetItem((_variant_t)sText).GetText()));
}
}
m_adodc.GetRecordset().MoveNext();
if(!setnum)
{
m_adodc.Refresh();
}
}
//将表格保存
CString name;
name.Format("\\%s.xls",m_edit);
strPath = path + name;
sheet.SaveAs(strPath,covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional,covOptional);
app.SetVisible(true);  //释放对象 
range.ReleaseDispatch(); 
sheet.ReleaseDispatch(); 
sheets.ReleaseDispatch(); 
book.ReleaseDispatch(); 
books.ReleaseDispatch();
app.ReleaseDispatch(); 
}
输入文件名以后,点击“导出至EXCEL”,然后会弹出一个警告,说“无法找到DataGridToExcel.xls。请检查文件名的拼写,并检查文件位置是否正确。如果您正试图从“文件”菜单上最近使用的文件列表中打开文件,请确认文件未被重命名、移动或删除。”
请问高手这是什么意思?我用的是EXCEL2003。

解决方案 »

  1.   

    不要用GetCurrentDirectory获取程序路径,用GetModuleFileName自己截取一下。
      

  2.   

    调试或者用MessageBox打印看路径对不对,然后看文件是否是只读的。
      

  3.   

    调试发现是这里出的问题:
    book.AttachDispatch(books.Add(_variant_t(strPath)));
    运行到这里以后,然后会调到
    CATCH_ALL(e)
    {
    CWinThread* pWinThread = AfxGetThread();
    if ( pWinThread != NULL )
    {
    lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
    TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
    lResult);
    }
    结果就出现我说的那个问题了。
      

  4.   

    我把那句改成
    book.AttachDispatch(books.Add(_variant_t("c:\\1111")));
    //(这句应该就是定义所导出的excel所储存的文件夹路径吧?)
    然后再在c盘中新建一个名为“1111”的文件夹。程序运行时,先在edit控件中写入文档的名字,点击导出时,弹出错误对话框说“Excel无法访问1111。该文档可能为只读或加密文档”。
      

  5.   

    我也是啊,在导入excel数据到access的时候弹出:Excel无法访问checkfiledemo。该文档可能为只读或加密文档(checkfiledemo是这个项目名称)