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