本文目录一览:
- 1、如何用MFC打开Excel文件(只读)
- 2、MFC中读写excel文件,请问什么方式最好啊,我网上看了很多,有OLE的,有COM的,还有在MFC中直接添加的。
- 3、用mfc怎么打开excel表格
- 4、MFC怎么读写EXCEL文件
- 5、MFC中怎么读取Excel文件里的每个单元格内容
如何用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();