通过com组件方式来访问excel数据 打开VC编辑器,并打开类向导(快捷键CTRL+W,VS2010 CTRL+Shift+X),点击“Add Class”->”from a type library…”,再插入EXCEL9.OLB文件 为了保证不会出错最好全部选中如下图 最后发现在工程目录下生成有excel9.h和excel9.cpp,将这两个文件拷贝到新建的工程目录下面 EXCEL9.OLB(excel9.h和excel9.cpp)自己可以到网上下载这里写链接内容
* App::InitInstance ()
{
if (! AfxOleInit())
{
AfxMessageBox(_T("无法初始化COM的动态连接库" ));
return FALSE ;
}
}
COleVariant VOptional((long )DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application readApp;
Workbooks readBooks;
_Workbook readBook;
Worksheets readSheets;
_Worksheet readSheet;
Range readRange;
VARIANT ret;
UpdateData(TRUE) ;
if(!readApp.CreateDispatch("Excel.Application" ) )
{
AfxMessageBox(_T("无法打开工作薄!" ) ) ;
return;
}
readApp.SetVisible(TRUE );
readApp.SetUserControl(TRUE );
read Books=read App.GetWorkbooks(); //获取工作薄集合
read Book=read Books.Open("xls的文件路径" ,
VOptional,VOptional,VOptional,
VOptional,VOptional,VOptional,
VOptional,VOptional,VOptional,
VOptional,VOptional,VOptional); //打开一个工作薄
read Sheets=read Book.GetWorksheets();//获取工作表集合
read Sheet=read Sheets.GetItem(COleVariant((short)1 ));//获取第一个工作表
//获取使用的行数,再获取每行的字段
Range usedRange
usedRange.AttachDispatch (readSheet.GetUsedRange ())
readRange.AttachDispatch (usedRange.GetRows ())
long iRowNum=readRange.GetCount ()
//获取每行的字段个数
readRange.AttachDispathc (usedRange.GetRows ())
long iColumnNum=readRange.GetCount ()
//通过循环来获取每一行的每个字段的值
for (int i=1
{
CString str
CString strText[13 ]
//读取第i行第j列的单元格值
for(int j=1
{
readRange.AttachDispatch (readSheet.GetCells ())
readRange.AttachDispatch (readRange.GetItem (COleVariant(long(i)),COleVariant(long(1 ))).pdispVal )
ret =readRange.GetValue ()
if (ret .vt ==VT_BSTR) //判断是否为文本(字符串)
{
str=ret .bstrVal
strText[j-1 ]=str
AfxMessageBox(strText[j-1 ])
}
else if (ret .vt ==VT_R8) //8 字节的数字
{
str.Format ("%f" ,ret .dblVal )
AfxMessageBox(str)
}
else if(ret .vt ==VT_DATE) //时间格式
{
SYSTEMTIME st
VariantTimeToSystemTime((long)&vet.date , &st )
strText[j-1 ].Format ("%d-%d-%d %d:%d:%d" ,st .wYear ,st .wMonth ,st .wDay ,st .wHour ,st .wMinute ,st .wSecont )
AfxMessageBox(strText[j-1 ])
}
else if(vet.vt ==VT_EMPTY) //单元格空的
{
str=""
continue
}
}
}
read Book.Close(COleVariant((short)FALSE), VOptional, VOptional);
read App.ReleaseDispatch();
read App.Quit();
//以上是对excel数据进行读取
COleVariant VOptional((long) DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application writeApp;
Workbooks writeBooks;
_Workbook writeBook;
Worksheets writeSheets;
_Worksheet writeSheet;
Range writeRange;
if(!writeApp.CreateDispatch(_T("Excel.Application" ,NULL) ) )
{
AfxMessageBox(_T("创建Excel服务失败!" ) ) ;
return;
}
writeBooks.AttachDispatch (writeApp.GetWorkbooks (),TRUE );
writeBook.AttachDispatch (writeBooks.Add (_variant_t(m_Browse)),TRUE );
writeSheets.AttachDispatch (writeBook.GetSheets (),TRUE );
writeSheet.AttachDispatch (writeSheets.GetItem (_variant_t((long )1 )),TRUE );
writeRange.AttachDispatch (writeSheet.GetCells (),TRUE );
writeRange.SetItem (_variant_t((long) 1),_variant_t((long) 1),_variant_t("name" ) );
writeRange.SetItem (_variant_t((long) 1),_variant_t((long) 2),_variant_t("id" ) );
writeRange.SetItem (_variant_t((long) 1),_variant_t((long) 3),_variant_t("tel" ) );
int i=2 ;
CString cmd=_T("select * from changsha_order" );
CRecordset rs(&m_db);
rs.Open(CRecordset::snapshot,cmd);
CString strname,strid,strtel;
while (!rs.IsEOF())
{
rs.GetFieldValue(short (0 ),strname);
rs.GetFieldValue(1 ,strid);
rs.GetFieldValue(2 ,strtel);
writeRange.SetItem(_variant_t((long )i),_variant_t((long )1 ),_variant_t(strname));
writeRange.SetItem(_variant_t((long )i),_variant_t((long )2 ),_variant_t(strid));
writeRange.SetItem(_variant_t((long )i),_variant_t((long )3 ),_variant_t(strtel));
i++;
rs.MoveNext();
}
//由于保存文件时aa.xls ,结果在aa1.xls 中,不知为何,所以删除aa.xls 文件,另存为aa.xls
CFile file
file.Remove (m_Browse)
writeBook.SaveAs (COleVariant(m_Browse),VOptional,
VOptional,VOptional,
VOptional,VOptional,(long)0 , VOptional,VOptional,VOptional,VOptional)
writeApp.SetUserControl (TRUE)
writeBook.SetSaved (TRUE)
writeApp.SetVisible (FALSE)
writeRange.ReleaseDispatch ()
writeSheet.ReleaseDispatch ()
writeSheets.ReleaseDispatch ()
writeBook.ReleaseDispatch ()
writeBooks.ReleaseDispatch ()
writeApp.ReleaseDispatch ()
writeApp.Quit ()