#include <stdlib.h>
#include <afxtemp1.h>
#include <afxcoll.h>
#include "stdafx.h"
#include "My3.h"
#include "My3Dlg.h"
#include "excel.h"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);*/
    lpDisp=books.Open("F:\MYEXE\1.xls",
VOptional,VOptional,VOptional,VOptional,VOptional,
VOptional,VOptional,VOptional,VOptional,VOptional,
VOptional,VOptional); 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[4000][2];
/// CSortStringArray ssort;
CStringArray ss;
/* //声明一个INT类型的变量控制列
int oneCol=iStartCol+1;
//外循环是控制行数为第二列   内循环是第二列的所有数据*/
// while(oneCol)///////////////////////////////////////////////////////记得在最后判断 使循环退出
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;
}
}
        //////////////////从数组中循环读取数据进行插入数据库前的处理////////////////////////////
/* for(i=0;i<=iRowNum;i++) {
ss.Add(sarrays[i][1]);
}*/
///////////////////对数据进行格式化   如:将MN去掉,对17位共有文件类型的长度进行截取等等/////////
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 mm=0,k=999;
// int mn=mm+1;
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 tongHang=1;
int kongZhi=chuanHou4.GetSize();//目的是删除1000份好操作
CStringArray fenHang,geShu,fanWei;//为了输出方便  
///// fenHang.Add(chuanQian3.GetAt(0));////将此数组初始化为第一个分行号,如011;
////////////////输出1000就在数组中删除1000
while(kongZhi>1000)
{   
int tongHang=1;
// CStringArray fenHang,geShu,fanWei;//为了输出方便  
    //for(;mm<k;mm++)/////////////////////获得1000的数据
 for(;i<999;i++)/////////////////////获得1000的数据
 {
                     zhiDing.Add(chuanHou4.GetAt(i));
 }
                 //for(;mm<k-1;mm++)
 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));
  }
                          //记得不同的时候将分行输出   分行不同之后要将tongHang变量初始化为1 3个数组也清空     
 //////////// fenHang.Add(chuanQian3.GetAt(mm));
 }
 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);
               //CArchive ar(&file,CArchive::store);
CString diYi(riQi+strDate+diZi+itoa(xiangHao)+xiangZi);
//  ar<<diYi;
file.Write(diYi,sizeof(diYi)); //ar<<\r\n;
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();
} 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();
// 注销COM库
    CoUninitialize();
//CDialog::OnOK();
}