当前位置:文档之家› VC读取写入EXCEL2003文件

VC读取写入EXCEL2003文件

利用automation具体如下:1。

你要在新建的工程中导入excel的类库。

以新建基础对话框工工程test为例。

建好后通过类向导(ctrl+w)addclass选from a type libray...,excel2003的是excel.exe文件,在c:/program files/microsoft office/office11/文件夹下。

选excel.exe,把所有的类都导入,注意使用Shift按键选择。

2。

在testApp::InitInstance()中初始化,AfxOleInit();//加在initinstance方法里最前就好。

3. 在对话框中加一个按钮,双击按钮对应的处理函数如下:别望了在加头文件:在#include "stdafx.h"后面加#include "excel.h"3.1//打开Excel文件,使用Excel程序显示,不读数据,也不写入数据,手工使用鼠标关闭Excel文件。

//声明操作excel文件类的对象_Application objApp;// _application代表了EXCEL服务器Workbooks objBooks; //workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks),COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);//检测电脑上是否安装了Excel程序。

if(!objApp.CreateDispatch("Excel.Application")){ AfxMessageBox("无法启动Excel程序,请正确安装!");return;}objApp.m_bAutoRelease = TRUE; //??什么意思?objApp.SetVisible(TRUE); //打开Excel程序,没有显示任何数据。

objApp.SetUserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝//下面两句的功能和objBooks = objApp.GetWorkbooks(); 一样。

LPDISPATCH pWkBooks = objApp.GetWorkbooks(); //GetWorkbooks什么功能?objBooks.AttachDispatch(pWkBooks,TRUE); //将一个IDispatch连接附着于COleDispatchDriver对象//获得当前程序所在的路径,excel文件在此路径下。

char CurrentProgramPath[MAX_PATH];GetCurrentDirectory(MAX_PATH,CurrentProgramPath);CString ExcelFilePathName = CurrentProgramPath;//ExcelFilePathName表示excel文件的路径和文件名ExcelFilePathName += "\\Data.xls";//打开Excel文件,如果前面设置了objApp.SetVisible(TRUE),所以下句命令执行后,显示这个excel文件的数据。

//如果前面没有设置objAppApp.SetVisible(TRUE),下句命令执行后,不会显示这个Excel文件的数据。

//采用只读方式打开excel文件,_variant_t(true), true必须为小写,大写编译出错。

objBooks.Open(ExcelFilePathName,VOptional, _variant_t(true), VOptional, VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional,VOptional,VOptional);3.2//打开Excel文件,读出其中的数据,供后面设置Mschart控件使用。

//Excel文件使用三列,第一列表示序号,第二列表示第一组份的数据,第二列表示第二组份的数据。

//声明操作excel文件类的对象_Application objApp; //_application代表了EXCEL服务器Workbooks objBooks;//workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks),_Workbook objBook;//_workbook就是一个表,相当于MDI中的一个视窗,Worksheets objSheets; // worksheets表示所有的表单,每个表都可能有很多表单(建立一个Excel文件之后,打开,可以看到有sheet1,sheet2等,所有这些sheetn就组成了worksheets)_Worksheet objSheet;//_worksheet就表示一个表单,Range objRange,usedRange;//Range 表示元素的集合COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);VARIANT ret;CString cstr="";//检测电脑上是否安装了Excel程序。

if(!objApp.CreateDispatch("Excel.Application")){ AfxMessageBox("无法启动Excel服务器!");return;}// objApp.SetVisible(TRUE); //打开Excel程序,没有显示任何数据。

// objApp.SetUserControl(FALSE);//允许其它用户控制Excel,否则Excel将一闪即逝// objApp.m_bAutoRelease = TRUE; //??什么意思?objBooks = objApp.GetWorkbooks();//获得当前程序所在的路径,excel文件在此路径下。

char CurrentProgramPath[MAX_PATH];GetCurrentDirectory(MAX_PATH,CurrentProgramPath);CString ExcelFilePathName = CurrentProgramPath;//ExcelFilePathName表示excel文件的路径和文件名ExcelFilePathName += "\\Data.xls";//打开Excel文件,如果前面设置了objApp.SetVisible(TRUE),所以下句命令执行后,显示这个excel文件的数据。

//如果前面没有设置objAppApp.SetVisible(TRUE),下句命令执行后,不会显示这个Excel文件的数据。

//采用只读方式打开excel文件,_variant_t(true), true必须为小写,大写编译出错。

objBook = objBooks.Open(ExcelFilePathName,VOptional, _variant_t(true), VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);objSheets = objBook.GetWorksheets();//设定当前的工作表sheet是excel文件的第几个工作表sheet COleVariant((short)1)表示第一个COleVariant((short)2)表示第二个objSheet = objSheets.GetItem(COleVariant((short)1));//获得已经使用的行数和列数。

usedRange.AttachDispatch(objSheet.GetUsedRange());objRange.AttachDispatch(usedRange.GetRows());long iRowNum=objRange.GetCount();//已经使用的行数objRange.AttachDispatch(usedRange.GetColumns());long iColumnNum=objRange.GetCount();//已经使用的列数//设定读取的行列范围//objRange = objSheet.GetRange(COleVariant("A1"), COleVariant("C1000"));ret = objRange.GetValue(VOptional);COleSafeArray sa(ret);//读出内容。

long lNumRows; long lNumCols;sa.GetUBound(1, &lNumRows); sa.GetUBound(2, &lNumCols);long index[2];VARIANT val;int row, column;for(row=1;row<=iRowNum;row++)//row表示行数{ for(column=1;column<=iColumnNum;column++)//c表示列数{ index[0]=row;index[1]=column;sa.GetElement(index, &val);//val类对象中包含取的row行、column列的内容switch(val.vt){ case VT_R8: //数字{ //TRACE("\t\t%1.2f", val.dblVal);CString cstr2=""; cstr2.Format("%1.1f",val.dblVal); cstr+=cstr2+"\n";break;}case VT_BSTR: //文字{//TRACE("\t\t%s",(CString)val.bstrVal);cstr+=(CString)val.bstrVal+"\n";break;}case VT_EMPTY://表示此row行、column列的内容为空。

相关主题