一: 利用BasicExcel类 com方式访问EXCEL
http://www.codeproject.com上搜,在其回复的消息内有一个MFC的示例,是已经修改过并处理过编码问题的。我测试一切正常!
二: 利用CSpreadSheet类 ODBC方式访问EXCEL
百度搜一下CSpreadSheet有示例!
建意用BasicExcel类使用很方便,大家都说好,特别是MFC的示例解决的编码问题得以解决(这个问题让我郁闷了几天!),现在好了!
感谢,只有这两字!!
以上两个类对于excel 2.1版本格式的文件不支持,已测试,不能读取也不能连接,需要用高版本的EXECL打开后保存一下,EXCEL就自动进行了转换。。。(这个问题,让我郁闷了三天。。。)最后给EXECL写了个外挂,模拟键盘操作进行了保存。。。汗!!
如果你看到此信息在笑我的笨方式的同时,请在下面回复一下,你的做法,以便与学习交流!
读取Excel文件,将文件内容存储在数组中。
首先利用Visual C++ 6.0,建立一个MFC基于对话框的工程项目,共享DLL,Win32平台。工程名称ExcelTest。在主对话框中加入一个按钮,
ID IDC_EXCELTEST
Caption Test Excel
双击该按钮,增加成员函数void CExcelTestDlg::OnExceltest()。
在BOOL CExcelTestApp::InitInstance()中,dlg.DoModal();之前增加代码:
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持库失败!");
exit(1);
}
在return FALSE; 语句前,加入:
CoUninitialize();
选择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library,选择C:/Program Files/Microsoft Office/office/Excel9.OLB(c:/Program Files/Microsoft Office/是本机上Microsoft Office 2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。
在ExcelTestDlg.cpp文件的头部,#include "ExcelTestDlg.h"语句之下,增加 :
#i nclude "Excel9.h"
在void CExcelTestDlg::OnExceltest() 函数中增加如下代码:
void CExcelTestDlg::OnExceltest()
{
CFileDialog filedlg(TRUE,"*.xls",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Xls文件 (*.xls)|*.xls");
filedlg.m_ofn.lpstrTitle="打开文件";
CString strFilePath;
if (IDOK==filedlg.DoModal())
{
strFilePath=filedlg.GetPathName();
}
else
{
return;
}
///////////////////
_Application excelapp;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
Range usedRange;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if(!excelapp.CreateDispatch("Excel.Application"))
{
MessageBox("确认是否安装了Excel");
}
books.AttachDispatch(excelapp.GetWorkbooks());
//打开Excel
lpDisp = books.Open(strFilePath,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional );
book.AttachDispatch(lpDisp);
sheets.AttachDispatch(book.GetWorksheets());
lpDisp = book.GetActiveSheet();
sheet.AttachDispatch(lpDisp);
//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
usedRange.AttachDispatch(sheet.GetUsedRange());
range.AttachDispatch(usedRange.GetRows());
//取得已经使用的行数
long iRowNum = range.GetCount();
range.AttachDispatch(usedRange.GetColumns());
//取得已经使用的列数
long iColNum = range.GetCount();
//取得已使用区域的起始行,从1开始
long iStartRow = usedRange.GetRow();
//取得已使用区域的起始列,从1开始
long iStartCol = usedRange.GetColumn();
CString sarrays[100][100];//按行列号存储excel文件内容,可以根据需求自己定义动态数组
for(int i=iStartRow;i<=iRowNum;i++)
{
for(int j=iStartCol;j<=iColNum;j++)
{
//读取单元格的值
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch(range.GetItem (COleVariant((long)i),
COleVariant((long)j)).pdispVal);
vResult = range.GetValue();
CString str,stry,strm,strd;
SYSTEMTIME st;
if(vResult.vt == VT_BSTR) //若是字符串
{
str = vResult.bstrVal;
}
else if (vResult.vt == VT_R8) //8字节的数字
{
str.Format("%f",vResult.dblVal);
}
else if(vResult.vt == VT_DATE) //时间格式
{
VariantTimeToSystemTime(vResult.date, &st);
stry.Format("%d",st.wYear);
strm.Format("%d",st.wMonth);
strd.Format("%d",st.wDay);
str = stry+"-"+strm+"-"+strd;
}
else if(vResult.vt == VT_EMPTY) //单元为空
{
str="";
}
sarrays[i-1][j-1] = str;
}
}
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
excelapp.ReleaseDispatch();
book.Close(covOptional,COleVariant(strFilePath),covOptional);
books.Close();
excelapp.Quit();
}
到此, sarrays[][]数组将整个Excel文件内容保存下来,可以将数组声明放在.h文件中。用户可以随时将文件内容放入数据库或其他文件中.