描述:
代码如下:
Range rgMyRge;
rgMyRge.AttachDispatch(ExcelSheet.GetColumns(),true); //得列数
nCols = rgMyRge.GetCount(); //nClos = 256
rgMyRge.AttachDispatch(ExcelSheet.GetRows(),true); //得行数
nRows = rgMyRge.GetCount(); //nRows = 655536
解决方案1:
请看我完整的Excel读取代码:
void CTestExcelDlg::OnButton1()
{
CString sFilter="Excel文件(*.xls;*.xlw)|*.xls;*.xlw";
if (!sFilter.IsEmpty()) sFilter+="|所有文件(*.*)|*.*||";
else sFilter="所有文件(*.*)|*.*||";
CFileDialog dlg(TRUE,NULL,NULL,0,(LPCSTR)sFilter, this);
dlg.m_ofn.Flags|=OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_LONGNAMES|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY;//OFN_SHOWHELP|
CString sInitPath = "c:\\";
char buf[20480]="";
dlg.m_ofn.lpstrFile=buf;
dlg.m_ofn.nMaxFile=2048;
dlg.m_ofn.lpstrTitle="选择源文件";
dlg.m_ofn.lpstrInitialDir=(LPCTSTR)sInitPath;//初始化最初的路径。
int nRet=dlg.DoModal();
if(nRet==IDCANCEL)
{
return;
}
POSITION pos=dlg.GetStartPosition();
if(pos==NULL)return ;
CStringArray arrSourPath;
arrSourPath.SetSize(0, 10);
while(pos!=NULL)
{
arrSourPath.Add(dlg.GetNextPathName(pos));
}
int nFileCount = arrSourPath.GetSize();
if(nFileCount<=0)
{
AfxMessageBox("No file choiced!");
return;
}
// TODO: Add your control notification handler code here
// OLE Variant for Optional.
//初始化COM
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("Can't initialize COM");
}
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application objApp;
_Workbook objBook;
Workbooks objBooks;
Worksheets objSheets;
_Worksheet objSheet;
Range objRange;
VARIANT ret;
// 下面生成Excel实例并打开一个存在的工作簿:
objApp.CreateDispatch("Excel.Application");
objBooks = objApp.GetWorkbooks();
nFileCount = arrSourPath.GetSize();
for(int nIndex=0; nIndex<nFileCount; nIndex++)
{
CString sSourFile = arrSourPath.GetAt(nIndex);
CString sDestFile;
int nPos = sSourFile.ReverseFind('.');
sDestFile = sSourFile.Left(nPos);
sDestFile += ".txt";
objBook = objBooks.Open(sSourFile,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional);
objSheets = objBook.GetWorksheets();
int SheetsCount=objSheets.GetCount();//这里获得了sheet的数目
FILE *fp; //创建一个txt文件用来存放从Excel文件中抽取的文本内容
//fp=fopen("c:\\book1.txt","wt"); //将文件打开
fp=fopen(sDestFile, "wt");
//for(int sheet=1;sheet<=SheetsCount;sheet++)
//既然只要一个sheet,这是设置一下即可。
SheetsCount =1;
for(int sheet=1;sheet<=SheetsCount;sheet++)
{//注意:从1开始。
objSheet = objSheets.GetItem(COleVariant((short)sheet));//获得指定的工作表
CString SheetName = objSheet . GetName();//获得当前工作表名称
fprintf(fp,"工作表%d:%s\n",sheet,SheetName); //将这个名称输出
objRange = objSheet.GetUsedRange();//这里获得所有的已用的Cells(单元格)
//objRange = objSheet.GetRange(COleVariant("A1"), COleVariant("D20"));
ret = objRange.GetValue();
if(ret.vt == VT_EMPTY) continue; //碰到空的工作表就返回
COleSafeArray sa(ret);
//判断数组的维数
long lNumRows;
long lNumCols;
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);
//输出中的SAFEARRAY元素
long index[2];
VARIANT val;
int r, c;
CString contents;
for(r=1;r<=lNumRows;r++)
{
bool bEmpty=true;
for(c=1;c<=lNumCols;c++)
{
if(c==1)
{
c ";//tab
}
if(c>=8 && c<=13) //G-M
{
continue;
}
index[0]=r;
index[1]=c;
sa.GetElement(index, &val);
switch(val.vt)
{
case VT_BOOL: //如果单元格中的值为布尔值
{
bool flag=val.boolVal;
if(flag==true) contents+="TRUE"; //输出的内容进行转换
else contents+="FALSE";
bEmpty=false;
break;
}
case VT_R8: //如果单元格中的值为数字
{//这里将整数从实数中分离出来,防止整数后面有一串'0'。
float value=val.dblVal;
char buffer[20];
sprintf(buffer,"%f",value);
if(c==17) //Q
{
CString tmp=buffer;
int dot=tmp.Find('.');
CString Left=tmp.Left(dot+2);
contents+=Left;
}
else
{
CString tmp=buffer;
int dot=tmp.Find('.');
CString Left=tmp.Left(dot);
tmp=tmp.Mid(dot+1);
if(tmp=="000000") contents+=Left;
else contents+=buffer;
bEmpty=false;
}
bEmpty=false;
/*
char buffer[20];
sprintf(buffer,"%f",value);
CString tmp=buffer;
int dot=tmp.Find('.');
CString Left=tmp.Left(dot);
tmp=tmp.Mid(dot+1);
if(tmp=="000000") contents+=Left;
else contents+=buffer;
bEmpty=false;
*/
/*CString sTmp;
if(c==17) //Q
{
sTmp.Format("%.1f", val.dblVal);
}
else{
sTmp.Format("%.0f", val.dblVal);
}
contents += sTmp;*/
contents+=" ";//tab,用于格式控制
break;
}
case VT_BSTR://文字
{
contents+=(CString)val.bstrVal;
//if(1==c) Ar=contents.GetLength();
contents+=" ";//tab
bEmpty=false;
break;
}
case VT_EMPTY:
{
break;
}//end of case Empty
}//end of switch
}//end of col
if(fp){
//if( !contents.IsEmpty() ) //内容不为空,就输出
{
fprintf(fp,"%s",contents);
fprintf(fp,"\n");
}
}
}//end of rows
fprintf(fp,"\n");
}//end