本文目录一览:

如何用MFC打开Excel文件(只读)

直接调用shellexecute()函数即可,将第二个参数设置为open,第三个参数设置为文件路径

MFC中读写excel文件,请问什么方式最好啊,我网上看了很多,有OLE的,有COM的,还有在MFC中直接添加的。

读写Excel文件方式比较

1、OLE的方式

这个大约是最常用的方式,这个方式其实启动了一个EXCEL的进程在背后读写EXCEL文件,这个方式的最大好处是什么事情都能做。包括设置EXCEL的格式,增加删除Sheet,读写单元格,等等。功能几乎是最全的,而且使用起来也不是特别的难。

其基本方法都是使用导出的.h文件进行OLE操作,但是由于OLE的接口说明文档不多,想非常完美的使用她们也不是太容易,好在例子也很多。

网上普遍认为OLE速度慢,EXCEL的OLE读写方式也基本一样。但是读取速度可以改进,如果在读取的加载整个Sheet的Range的全部数据,而不是一个个单元格读取,那么速度还是相对不错。想想原理也很简单,整体读取减少了OLE的交互次数。OLE的写入方式一般只能几个进行比较方便,所以速度可能要快很多。

我自己的亲身体会是,一个EXCEL文件,100多列的字段,如果采用一个个单元格的读取方式,1s大约3条左右的记录,如果整体读取,速度可以提高几十倍。

OLE读写EXCEL方式功能很强大,读取速度还可以,但写入速度不高,当然这个方式不可能移植的,而且你必须安装了EXCEL。

2.Basic EXCEL 方式

这是CodeProject上的一个推荐开源工程了,

作者是基于EXCEL的文件格式进行的处理。但是为什么叫Basic EXCEL呢。

他不支持很多东西,公式,文件格式,表格合并等(有人说中文支持也不好),所以可以认为他只支持最基本的EXCEL表格,

我自己的尝试是如果这个EXCEL文件有其他元素(公式,格式等),使用Basic EXCEL读取会失败。

OLE读写EXCEL方式功能比较弱,由于是直接根据文件格式操作,读写速度都不错,你也不需要按照EXCEL,另外这个方式是可以移植的,但是有一些成本,其代码比较晦涩难懂,而且没有注释,另外即使在Windows平台上,告警也很多。

3.Sourceforge 上的几个EXCEL库。

Sourceforge 上有几个开源的的EXCEL库,但是完善的不多,有的是为了PHP读写EXCEL准备的,包括libXLS,XLSlib,SmartEXCEL等。我下载了几个实验了一下,在Widonws都没有编译成功。也罢了。

4.ODBC的方式

这个亲身没有尝试过,但是按照原理,应该只能读写。

速度吗,ODBC的速度本来就是出名的慢了。

值得一提的是Basic EXCEL的作者原来在CodeProject上有一个给予ODBC方式的封装CSpreadSheet 。如果有兴趣,大家可以去看看。其实内心还是很佩服这个作者的。

5.ADO的方式

ADO的方式听说应该就是使用OLEDB的方式。和OLE的方式应该没有本质区别。我看了看例子也和OLE很像

6.LibXL

LibXL 是一个收费的EXCEL的库。

按照他的说明,他可以不依赖EXCEL读取XLS文件。包括设置格式等。看例子操作应该很简单。但是是否可以移植到Linux平台,我估计难度也不小。呵呵。

由于要收费,没有法子测试了。

7.网上一些号称不用OLE读取EXCEL例子

初步看了一下,这个应该是网上探索EXCEL格式文档的例子。可以实际操作的方式不强。

用mfc怎么打开excel表格

方法/步骤

打开需要插入对象文件的Excel表格,如下图所示。

用鼠标单击要插入对象文件单元格,然后依次点击"插入"菜单--"对象",窗口会自动弹出"对象"对话框,如下图所示。

在"对象"对话框中选择"由文件创建"选项卡,单击"浏览",选择需要插入的对象文件,此处我们先选择一个Excel文件插入。

选择"对象"对话框中的"显示图标",点击"更改图标",窗口会自动弹出"更改图标"对话框。如下图所示。

将"图标标题"中的文件路径及文件扩展名删掉,只保留文件名称,如下图所示。然后点击"确定"按钮。

在"对象"对话框中点击"确定"按钮,Excel文件就插入完毕了。在阅读时,只需双击这个Excel文件,就可以将之打开了。

MFC怎么读写EXCEL文件

可以用多种方法,比如说用ODBC对excel数据库进行操作,或者说用excel 的COM接口进行编程。我找到一个例子关键代码如下:

//创建并写入Excel文件

void CRWExcel::WriteToExcel()

{

CDatabase database;

CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动

CString sExcelFile = "c://demo.xls"; // 要建立的Excel文件

CString sSql;

TRY

{

// 创建进行存取的字符串

sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s",

sDriver, sExcelFile, sExcelFile);

// 创建数据库 (既Excel表格文件)

if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )

{

// 创建表结构(姓名、年龄)

sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";

database.ExecuteSQL(sSql);

// 插入数值

sSql = "INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)";

database.ExecuteSQL(sSql);

sSql = "INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)";

database.ExecuteSQL(sSql);

sSql = "INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)";

database.ExecuteSQL(sSql);

}

// 关闭数据库

database.Close();

}

CATCH_ALL(e)

{

TRACE1("Excel驱动没有安装: %s",sDriver);

}

END_CATCH_ALL;

}

// 读取Excel文件

void CRWExcel::ReadFromExcel()

{

CDatabase database;

CString sSql;

CString sItem1, sItem2;

CString sDriver;

CString sDsn;

CString sFile = "Demo.xls"; // 将被读取的Excel文件名

// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"

sDriver = GetExcelDriver();

if (sDriver.IsEmpty())

{

// 没有发现Excel驱动

AfxMessageBox("没有安装Excel驱动!");

return;

}

// 创建进行存取的字符串

sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);

TRY

{

// 打开数据库(既Excel文件)

database.Open(NULL, false, false, sDsn);

CRecordset recset(database);

// 设置读取的查询语句.

sSql = "SELECT Name, Age "

"FROM demo "

"ORDER BY Name ";

// 执行查询语句

recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

// 获取查询结果

while (!recset.IsEOF())

{

//读取Excel内部数值

recset.GetFieldValue("Name ", sItem1);

recset.GetFieldValue("Age", sItem2);

// 移到下一行

recset.MoveNext();

}

// 关闭数据库

database.Close();

}

CATCH(CDBException, e)

{

// 数据库操作产生异常时...

AfxMessageBox("数据库错误: " + e-m_strError);

}

END_CATCH;

MFC中怎么读取Excel文件里的每个单元格内容

//第一步:打开文件

CFile f;

CFileException e;

// 打开文件

if (!f.Open("D://Book1.xls", CFile::modeRead, e))

{

TCHAR szError[1024];

e.GetErrorMessage(szError, 1024);

AfxMessageBox(szError);

return;

}

//第二步:读取版本号

// 读取版本

while (dwPos dwLen)

{

nRead = f.Read((void*)RecNo, 2);

if (RecNo == XL_BOF)

{

WORD Ver, Type;

f.Read((void*)RecLen, 2);

f.Read((void*)Ver, 2);

f.Read((void*)Type, 2);

f.Seek(RecLen, CFile::current);

int ver = 0;

switch (Ver)

{

case BIFF7:

ver = 7;

break;

case BIFF8:

ver = 8;

AfxMessageBox("Biff8");

break;

}

int type = 0;

switch (Type)

{

case WORKBOOK:

type = 5;

AfxMessageBox("Workbook");

break;

case WORKSHEET:

type = 16;

AfxMessageBox("Worksheet");

break;

case CHART:

type = 32;

AfxMessageBox("Chart");

break;

}

break;

}

dwPos = f.GetPosition();

}

//第三步:读其它数据

f.SeekToBegin();

dwPos = f.GetPosition();

// 读表格数据

while (dwPos dwLen)

{

nRead = f.Read((void*)RecNo, 2);

switch (RecNo)

{

case XL_BOF:

{

f.Read((void*)RecLen, 2);

AfxMessageBox("Bof");

}

break;

case XL_BOUNDSHEET:

{

DWORD temp;

BYTE visi;

BYTE type;

TCHAR name;

f.Read((void*)RecLen, 2);

f.Read((void*)temp, 4);

f.Read((void*)visi, 1);

f.Read((void*)type, 1);

f.Read((void*)StrLen, 2);

f.Read((void*)name, StrLen);

char buf[128];

memset(buf, 0x0, 128);

strncpy(buf, name, StrLen);

AfxMessageBox(buf);

}

break;

case XL_DIMENSION:

f.Read((void*)RecLen, 2);

f.Seek(RecLen, CFile::current);

AfxMessageBox("Dimension");

break;

case 0xE2: // INTERFACED

f.Read((void*)RecLen, 2);

AfxMessageBox("e2");

break;

case XL_SST:

f.Read((void*)RecLen, 2);

f.Seek(RecLen, CFile::current);

AfxMessageBox("SST");

break;

case XL_NUMBER:

f.Read((void*)RecLen, 2);

AfxMessageBox("Number");

break;

case XL_STRING:

f.Read((void*)RecLen, 2);

AfxMessageBox("String");

break;

case XL_RK:

f.Read((void*)RecLen, 2);

AfxMessageBox("RK");

break;

case XL_LABEL:

{

f.Read((void*)RecLen, 2);

AfxMessageBox("Label");

}

break;

case 0xD6:

f.Read((void*)RecLen, 2);

AfxMessageBox("RString");

break;

case XL_EOF:

dwPos = dwLen;

AfxMessageBox("Eof");

break;

default:

nRead = f.Read((void*)RecLen, 2);

if (nRead == 0)

dwPos = dwLen;

break;

}

}

//第四步:关闭文件

f.Close();