第一个作品 错误好多 麻烦帮我看看 谢谢哥哥姐姐 急用
我用的是EXCEL2003 添加了一个ADOConn类 但是没用上 本来是想直接将数据存入到数据库再对表的记录集进行操作的
void CMy3Dlg::OnOK()
{
// TODO: Add extra validation here
//初始化
CoInitialize(NULL);
//定义变量
_Application excelapp;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheets 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("F:\MYEXE\1.xls",
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();
long iStartRow=usedRange.GetRow();
long iStartCol=usedRange.GetColumn();
//声明一个数组,用于模拟记录集暂时存储读取的数据
CString sarrays[][];
/// CSortStringArray ssort;
CStringArray ss;
for(int i=iStartRow;i<=iRowNum;i++)
{
// for(int oneRow=iStartRow;oneRow<=iRowNum;oneRow++)
for(int j=iStartCol;j<=iColNum;j++)
{
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch(range.GetItem
(COleVariant((long)oneRow),COleVariant((long)oneCol)).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;
}
}
//////////////////从数组中循环读取数据进行插入数据库前的处理////////////////////////////
CString strr;
for(i=0;i<=iRowNum;i++)
{
if(sarrays[i][1].GetLength==19)////////////////MN01109090900010001
{
strr=sarrays[i][1].Left(15);
strr.Right(13);
}
else
{
strr=sarrays[i][1].Right(13);
}
ss.Add(strr);
}
///////////////////利用sort()对数据进行排序/////////////////////////////
/// sort(ss,TRUE,FALSE);
// }
sort(ss,TRUE,FALSE);
//////////////////////////去加急件“000”//////////////////////////////
int nReturn=0;
CString str1("000");
CString st;
int i,nCount=ss.GetSize()-1;
for(i=0;i<nCount;i++)
{
st=ss.GetAt(i).Left(3);
if(st==str1)
{
ss.RemoveAt(i);
}
}
/////////////////将SS中的字符串统一取后四位存放到新字符串数组中////////////////////////
CStringArray chuanHou4;
CString sstt;
for(i=0;i<ss.GetSize();i++)///范围限制这可能会错
{
sstt=ss.GetAt(i).Right(4);
chuanHou4.Add(sstt);
}
/////////////////将SS中的字符串统一取前三位分行号存放到新字符串数组中/////////////////////////
CStringArray chuanQian3;
CString ssttt;
for(i=0;i<ss.GetSize();i++)
{
ssttt=ss.GetAt(i).Left(3);
chuanQian3.Add(ssttt);
}
////////////////////////////////////////////获取1000份进行分箱处理//////////////////////////////////
////////////////////////////////////////////////////////////////// //断号就更新frist变量为断号下个序号
CString frist=ss.GetAt(0).Right(4);//保存第一个序列号 或 断号后的下一个序号
int xiangHao=1;/////////////////////////保存箱号 输出箱号时用
//将只保存后四位的数组中的数据添加到新数组中
CStringArray zhiDing;
int i=0;
int mn=i+1;
//写个变量获得日期
SYSTEMTIME st;
CString strDate;
GetLocalTime(&st);
strDate.Format("%4d-%2d-%2d",st.wYear,st.wMonth,st.wDay);//格式化日期
CString riQi("日期: ");
CString diZi("第 ");
CString xiangZi("箱");
int kongZhi=chuanHou4.GetSize();//目的是删除1000份好操作
CStringArray fenHang,geShu,fanWei;//为了输出方便
////////////////输出1000就在数组中删除1000
while(kongZhi>1000)
{
int tongHang=1;
for(;i<999;i++)/////////////////////获得1000的数据
{
zhiDing.Add(chuanHou4.GetAt(i));
}
for(;i<998;i++)
{
fenHang.Add(chuanQian3.GetAt(0));
if(chuanQian3.GetAt(i).Compare(chuanQian3.GetAt(mn))==0 && atoi(zhiDing.GetAt(i))==atoi(zhiDing.GetAt(mn))-1)
{
tongHang++;
if(mn==999)
{
fanWei.Add(frist+"--"+zhiDing.GetAt(mn));
}
}
else if(chuanQian3.GetAt(i).Compare(chuanQian3.GetAt(mn))==0 && atoi(zhiDing.GetAt(i))!=atoi(zhiDing.GetAt(mn))-1)
{
tongHang++;
fanWei.Add(frist+"--"+zhiDing.GetAt(i));
frist=zhiDing.GetAt(mn);/////将断号后的序列号保存
///////判断如果最后俩范围不同的时候的添加情况
if(mn==999)
{
fanWei.Add(frist);//将最后一个发生断号的范围保存到数组中
}
}
else
{
fanWei.Add(frist+"--"+zhiDing.GetAt(i));
frist=zhiDing.GetAt(mn);//新分行的第一个序号
fenHang.Add(chuanQian3.GetAt(mn));//分行不一样的话应该把下一个分行保存所以参数是MN
geShu.Add(itoa(tongHang));///添加上个分行号的分数
tongHang=1;
}
}
///////////////////////删除1000份 否则循环将是死循环///////////////////
if(i==998)//////因为当最后一次比较的时候 i=998 mn=999
{
for(;i<999;i++)
{
chuanHou4.RemoveAt(i);
chuanQian3.RemoveAt(i); ///////目的是让这俩数组中的索引一一对应
}
}
//如果前范围和后范围一样 就去除重复 改变格式输出 如:0001--0001
for(;i<fanWei.GetSize();i++)
{
if(fanWei.GetAt(i).Left(4)==fanWei.GetAt(i).Right(4))
{
fanWei.SetAt(i)=fanWei.GetAt(i).Left(4);
}
}
/////将分行数组,个数数组,范围数组写入文本文件/////////////
CFile file("xiaowei.txt",CFile::modeCreate | CFile::modeWrite);
CString diYi(riQi+strDate+diZi+itoa(xiangHao)+xiangZi) file.Write(diYi,sizeof(diYi))
int ziJt=sizeof("\t");
int ziJn=sizeof("\n");
int ziZong=ziJt+ziJn;
file.Write("\t\n",ziZong);
for(k=0;k<fenHang.GetSize();k++)
{
CString fen1,ge1,fan1;
fen1=fenHang.GetAt(k);
ge1=geShu.GetAt(k);
fan1=fanWei.GetAt(k);
//ar<<fen1<<\t<<ge1<<\t<<fan1<<\r\n;
file.Write(fen1,sizeof(fen1));
file.Write("\t",ziJt);
file.Write(ge1,sizeof(ge1));
file.Write("\t",ziJt);
file.Write(fan1,sizeof(fan1));
file.Write("\t\n",ziZong);
file.Flush()
}
xiangHao++;///箱数自加
////写入数据后将三个数组清空
fenHang.RemoveAll();
geShu.RemoveAll();
fanWei.RemoveAll();
kongZhi=chuanHou4.GetSize();
}
/////最后不足1000份的数据直接在chuanHou4数组中进行的操作比较 /////////
file.Close();///////////////////关闭文件
range.ReleaseDispatch();
sheet.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
excelapp.ReleaseDispatch();
//关闭所有的BOOK,退出EXCEL
book.Close(covOptional,COleVariant("F:\MYEXE\1.xls"),covOptional);
books.Close();
excelapp.Quit();
//CDialog::OnOK();
}