描述:
如题! 谢谢! 答对,定给满分!
解决方案1:
以上是我转贴的,没有保留出处,所以希望作者不要介意。
我自己以前给一家服装公司写过类似的代码,代码太长,贴出一部分来谨供参考。
......
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
CString sheetName;
if (ExcelApp.m_lpDispatch == NULL) // If you have not created Excel, create a new instance.
{
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
exit(1);
}
wbsMyBooks.AttachDispatch(ExcelApp.get_Workbooks(),true);
}
//查找文件夹内所有文档
CString strfile(_T(""));
if(strpath.Right(1)=='\\') //去掉末尾的'\'
strpath.TrimRight('\\');
if(vecFileName.empty())
FindFile((LPCTSTR)strpath);
BOOL bFound=FALSE;
CString strord=_T("原始订单");
CString strtot=_T("订单总数");
CString strtotal=_T("合计");
vector<CString> vtemp;
vector<vector<CString> > pvv; //大数组,保存结果
//内容格式:1款号 2原始订单(合计) 3订单总数(合计)
for(vector<CString>::iterator iter=vecFileName.begin();iter!=vecFileName.end();++iter)
{
COleVariant ov(*iter);
wbMyBook.AttachDispatch(wbsMyBooks.Add(VARIANT(ov)));
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.get_Worksheets(),true);
for(short i=1;i<=wssMysheets.get_Count();i++)
{
//得到sheet[i]
wsMysheet.AttachDispatch(wssMysheets.get_Item(COleVariant((short)i)),true);
//得到WorkSheet名称,即为款号
sheetName=wsMysheet.get_Name();
//判断所选条件,进行过滤
if( (strcb1==_T("裤子") && sheetName[0]!='0') ||
(strcb1==_T("衣服") && sheetName[0]=='0') )
continue;
if( (strcb2==_T("梭织") && sheetName[0]!='1') ||
(strcb2==_T("毛织") && sheetName[0]!='2') ||
(strcb2==_T("针织") && sheetName[0]!='3') )
continue;
if( (strcb3==_T("男款") && sheetName[2]<'6') ||
(strcb3==_T("女款") && sheetName[2]>='6') )
continue;
//通过的就是符合条件的了
VARIANT ret;
VARIANT val;
long lNumRows;
long lNumCols;
long index[2];
long lcol=0; //合计列
long lrow=0; //订单总数行
//去掉自动筛选
wsMysheet.put_AutoFilterMode(false);
//得到前7行区域
rgMyRge.AttachDispatch(wsMysheet.get_Range(COleVariant("A1"), COleVariant("IV7")));
ret = rgMyRge.get_Value();
if(ret.vt==VT_EMPTY)
continue;
COleSafeArray sa(ret);
//Determine the array's dimensions.
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);
for(long i=1;i<lNumRows;i++)
{
for(long j=1;j<lNumCols;j++)
{
index[0]=i;
index[1]=j;
sa.GetElement(index,&val);
if(val.vt==VT_BSTR)
{
if(val.bstrVal==strtot)//订单总数行
lrow=i;
if(val.bstrVal==strtotal)//合计列
lcol=j;
}
}
}
if(lcol>0) //找到合计列
{
vtemp.clear();
if(lrow==0) //没找到订单总数行
lrow=5;
//判断是否同一款号!
if(!pvv.empty())
{
vector<vector<CString> >::iterator vvit;
for(vvit=pvv.begin();vvit!=pvv.end();++vvit)
{
if((*vvit).at(0) == sheetName)
break;
}
if(vvit!=pvv.end()) //已有相同款号
{
double dtemp1=0;
double dtemp2=0;
CString strtemp;
//保存原始订单
index[0]=lrow-1;
index[1]=lcol;
sa.GetElement(index,&val);
if(val.vt!=VT_EMPTY)
{
dtemp1=VariantToDouble(val);
dtemp2=atof((LPCTSTR)(*vvit).at(1));
dtemp1+=dtemp2;
strtemp.Format("%f",dtemp1);
//修改原数据(pvv[][1])
(*vvit).at(1)=strtemp;
}
//保存订单总数
index[0]=lrow;
index[1]=lcol;
sa.GetElement(index,&val);
if(val.vt!=VT_EMPTY)
{
dtemp1=VariantToDouble(val);
dtemp2=atof((LPCTSTR)(*vvit).at(2));
dtemp1+=dtemp2;
strtemp.Format("%f",dtemp1);
//修改原数据(pvv[][2])
(*vvit).at(2)=strtemp;
}
continue;
}//end of if(vvit!=pvv.end()) //已有相同款号
}//end of if(pvv.empty()==false)
//前面无相同款号
vtemp.push_back(sheetName); //保存款号
index[0]=lrow-1;
index[1]=lcol;
sa.GetElement(index,&val);
vtemp.push_back(VariantToCString(val)); //保存原始订单
index[0]=lrow;
index[1]=lcol;
sa.GetElement(index,&val);
vtemp.push_back(VariantToCString(val)); //保存订单总数
pvv.push_back(vtemp);
}//end of if(lcol>0) //找到合计列
}//END OF for(short i=1;i<=wssMysheets.get_Count();i++)
}//END OF for(vector<CString>::iterator iter=vecFileName.begin();iter!=vecFileName.end();++iter)
//先排序
long size=(long)pvv.size();
if(pvv.empty())
AfxMessageBox(_T("无此类型服装!"));
else
{
long* pd=new long[size];
long* psort=new long[size];
long max;
for(long tl=0;tl<size;tl++)
{
pd[tl]=_ttol((LPCTSTR)pvv[tl][2]);
}
for(long i=0;i<size;i++)
{
max=0;
for(long j=1;j<size;j++)
if(pd[j]>pd[max])
max=j;
psort[i]=max;//只保存位置号,未保存其值
pd[max]=-99999;
}
long nitem;
long dt;
for(long dv=0;dv<size;dv++)
{
//第一列
dt=psort[dv];
CString strspace=_T(" ");
strspace +=pvv[dt][0];
nitem = mlist.InsertItem(0xffff,strspace);
//第二列
pvv[dt][1].TrimRight('0');
pvv[dt][1].TrimRight('.');
mlist.SetItem(nitem,1,1,pvv[dt][1],NULL,0,0,0,0);
//第三列
pvv[dt][2].TrimRight('0');
pvv[dt][2].TrimRight('.');
mlist.SetItem(nitem,2,1,pvv[dt][2],NULL,0,0,0,0);
}
delete pd;
delete psort;
}
//关闭Excel
wbMyBook.Close(COleVariant((short)FALSE),VOptional,VOptional);
//wbsMyBooks.Close();
ExcelApp.Quit();<