在网上查阅了很多VC++6.0对EXECL文件的读写资料,都有一些问题,不能完全满足我的要求。经过几个小时的整理和调试,已完成对EXECL文件的读写,现将我的经验分享给大家,希望对这方面需求的人有所帮助。
一、运行环境
操作系统:WINDOWS XP SP3
编辑器:VC++6.0
OFFICES:MS OFFICES 2003
二、得到EXECL 2003的函数库
打开一个工程,对话框的、文档-视图的都行,我是打开的已有文档-视图工程(图1)。
图1
在图2 所示的“查看—新建工程”向导下,打开MFC 类向导对话框(图3)。
图2
图3
在图3中点击“ADD Class”,下的“”,选择EXECL 2003的执行文件(图4)。
在下面弹出的窗口(图5)中选择所有的类(当然也可以只选择需要的几个类,为了以后方便使用,建议选择所有的类),得到2个文件:execl.h和execl.cpp。从execl中导入的类已自
动加入到工程中(图6)
图5
图6
在你需要读写execl数据(*.XLS)的*.CPP的相关*.件中加入execl.h,就可以使用execl中的函数了(图7)。
图7
三、实现的源代码及说明
LRESULT CMapgistwoView::ReadDataFramFile(WPARAM wParam, LPARAM lParam)//从文件读数
{
//if(m_DataFileName.CompareNoCase(m_ReadDataFromFile.m_FileName)!=0){
delete []data;//存放数据的变量
//m_DataFileName=m_ReadDataFromFile.m_FileName;
//}
//else{
//MessageBox("请选择一个不同的文件!");
//return 0;
//}
_Application app; //定义读写XLS文件的execl变量
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//------------------
//CompareNoCase为不区分大小写比较,而Compare为区分大小写比较
//如果两个对象完全一致则返回0,如果小于lpsz,则返回-1,否则返回1.
m_DataFileName=m_ReadDataFromFile.m_FileName;//从对话框中得到选择的文件名,存入视窗类的变量中
//创建Excel 2000服务器(启动Excel)
if (!app.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
return FALSE;
}
app.SetVisible(FALSE); // TRUE使Excel可见 FALSE--不可见
app.SetUserControl(TRUE); // 允许其他用户控制Excel
books.AttachDispatch(app.GetWorkbooks(),true);
/*
//新建一个XLS文件
book = books.Add(COleVariant("")); // 得到Workbook book1.xls
sheets = book.GetWorksheets(); // 得到Worksheets
sheet = sheets.GetItem(COleVariant((short)1)); // 得到Worksheet
//-------------------SetCellValue--------------
range=sheet.GetRange(COleVariant(IndexToString(5,1)),COleVariant(IndexToString(8,2)));
range.SetValue2(COleVariant("OK"));//设定范围内的值
app.SetAlertBeforeOverwriting(FALSE); //取消提示是否覆盖的对话框
app.SetDisplayAlerts(FALSE);//取消提示是否保存的对话框
book.SaveAs(COleVariant("D:\\3.xls"),VOptional,VOptional,
VOptional,VOptional,VOptional,0,
VOptional,VOptional,VOptional,VOptional,VOptional);
*/
//上面未用的代码在这没用使用,所以就屏蔽了,但在调试的时候顺利通过。
//打开一个已存在的XLS文件
app.SetVisible(FALSE); // TRUE使Excel可见 FALSE--不可见
app.SetUserControl(TRUE); // 允许其他用户控制Excel
book.AttachDispatch(books.Open(m_DataFileName,VOptional, VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional
));
sheets.AttachDispatch(book.GetWorksheets(),true); //得到Worksheets
//怎样获取所有表单的名称,如下:
long lCount = sheets.GetCount();
CString strSheetName;
for(long n=1; n<=lCount; n++)
{
sheet.AttachDispatch(sheets.GetItem(COleVariant((long)n)));
//strSheetName = (sheet.GetName());//得到了,类推可得到所有的
//MessageBox(strSheetName);
break;
}
//---------------得到行数和列数----------------
range.AttachDispatch(sheet.GetUsedRange());
range.AttachDispatch(range.GetRows());
ROWS=range.GetCount();//已经使用的行数
range.AttachDispatch(range.GetColumns());
COLS=range.GetCount();//已经使用的列数
//------------------------
//分配数据空间
m_ReadDataFromFile.m_ColsName.ResetContent();//重置保存XLS标题行数据的LISTBOX的数据。
data=new CString[COLS*ROWS];
//MessageBox("OK");
int n0,i,j;
if(m_ReadDataFromFile.m_ChechBTH){//有标题行
n0=1;
for(i=0;i<COLS;i++){
range = sheet.GetRange(COleVariant(IndexToString(1,i+1)),COleVariant(IndexToString(1,i+1)));
strSheetName.Format(_T("%d."),i+1);
strSheetName+=range.GetText().bstrVal;
m_ReadDataFromFile.m_ColsName.InsertString(i, strSheetName);
}
}else{ //无标题行
n0=0;
for(i=0;i<COLS;i++){
//range = sheet.GetRange(COleVariant(IndexToString(1,i+1)),COleVariant(IndexToString(1,i+1)));
strSheetName.Format(_T("%d.%c"),i+1,'A'+i);
m_ReadDataFromFile.m_ColsName.InsertString(i, strSheetName);
}
}
if( COLS > 26 )
{
m_ReadDataFromFile.m_Cols.Format(_T("%d(%c%c)"),COLS,'A' + (COLS-1)/26-1,'A' + (COLS-1)%26);
}
else
{
m_ReadDataFromFile.m_Cols.Format(_T("%d(%c)"),COLS, 'A' + (COLS-1)%26);
}
//-------------------GetCellValue--------------
StartProgress();
SetSubProgressName("正在读取数据,请等待.......");
SetRange(0,ROWS);rows函数的使用方法及实例
for(i=n0;i<ROWS;i++){
SetPos(i);
for(j=0;j<COLS;j++){
range = sheet.GetRange(COleVariant(IndexToString(i+1,j+1)),COleVariant(IndexToString(i+1,j+1)));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论