导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

操作EXCEL2003的代码 一次发不了那么多

dinghuichenggong 2009-07-24 09:12:21
#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();
}
...全文
23 点赞 收藏 1
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zngsai 2009-08-12
顶,楼主太无私了!顶。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……