第一个作品 错误好多 麻烦帮我看看 谢谢哥哥姐姐 急用

dinghuichenggong 2009-07-24 07:48:14
我用的是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();
}



...全文
147 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ToBeTough 2009-07-27
[Quote=引用 11 楼 dinghuichenggong 的回复:]
解决了  都没人帮我  你们也没看出来    _Worksheet不应该在最后有S  我多写了一个S  所以说我未声明它  呵呵
[/Quote]自己解决更好,那就接分咯
回复
dinghuichenggong 2009-07-26
这个我试过了 不行 晕 这么难解决
回复
dinghuichenggong 2009-07-26
解决了 都没人帮我 你们也没看出来 _Worksheet不应该在最后有S 我多写了一个S 所以说我未声明它 呵呵
回复
oyljerry 2009-07-25
http://topic.csdn.net/u/20080819/14/e1a916b1-c679-4cf9-bdef-4a688bc51ef8.html
回复
oyljerry 2009-07-25
#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\mso.dll" rename("RGB", "MSRGB")

#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only, \
rename("Reference", "ignorethis"), rename("VBE", "JOEVBE")

#import "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" exclude("IFont", "IPicture") \
rename("RGB", "ignorethis"), rename("DialogBox", "ignorethis"), rename("VBE", "JOEVBE"), \
rename("ReplaceText", "JOEReplaceText"), rename("CopyFile","JOECopyFile"), \
rename("FindText", "JOEFindText"), rename("NoPrompt", "JOENoPrompt")

回复
dinghuichenggong 2009-07-25
放到stdafx.h中倒是好实现 但里面第三个#import中应该把msword.olb改成EXCEL相关的吧 不知道应该用什么替换 还有就是我已经添加了相关类了 在My3Dlg.cpp中包含什么对应的excel头文件》? 谢谢帮忙
回复
oyljerry 2009-07-25
[Quote=引用 5 楼 dinghuichenggong 的回复:]
#include <afxtemp1.h>
#include <afxcoll.h>
#include "stdafx.h"
#include "My3.h"
#include "My3Dlg.h"
#include "excel.h"
#include <afx.h>
#include <iostream.h>
#include <afxcoll.h>
#include <time.h>
#include <stdlib.h>

#import  "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL" 
#import  "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" 
#import  "C:\Program Files\Microsoft Office\OFFICE11\msword.olb"  rename("FindText","_FindText"), rename("ExitWindows","_ExitWindows") 
using namespace Excel;


对照别人写的调用WORD改了几个地方就出现下面的错误  帮忙看看 


f:\myexe\my3\debug\mso.tlh(1494) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
F:\MYEXE\My3\My3Dlg.cpp(18) : error C2871: 'Excel' : does not exist or is not a namespace
F:\MYEXE\My3\My3Dlg.cpp(231) : error C2065: '_Worksheets' : undeclared identifier
F:\MYEXE\My3\My3Dlg.cpp(231) : error C2146: syntax error : missing ';' before identifier 'sheet'
F:\MYEXE\My3\My3Dlg.cpp(231) : error C2065: 'sheet' : undeclared identifier
F:\MYEXE\My3\My3Dlg.cpp(261) : error C2228: left of '.AttachDispatch' must have class/struct/union type
F:\MYEXE\My3\My3Dlg.cpp(263) : error C2228: left of '.GetUsedRange' must have class/struct/union type
F:\MYEXE\My3\My3Dlg.cpp(285) : error C2228: left of '.GetCells' must have class/struct/union type


在线等答案  谢谢了  直接发分
[/Quote]
#import的部分代码放到stdafx.h中
你的My3Dlg.cpp中要包含对应的excel头文件,你要导入excel 库时,添加对应的相关类
回复
dinghuichenggong 2009-07-25
#include <afxtemp1.h>
#include <afxcoll.h>
#include "stdafx.h"
#include "My3.h"
#include "My3Dlg.h"
#include "excel.h"
#include <afx.h>
#include <iostream.h>
#include <afxcoll.h>
#include <time.h>
#include <stdlib.h>

#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL"
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "C:\Program Files\Microsoft Office\OFFICE11\msword.olb" rename("FindText","_FindText"), rename("ExitWindows","_ExitWindows")
using namespace Excel;


对照别人写的调用WORD改了几个地方就出现下面的错误 帮忙看看


f:\myexe\my3\debug\mso.tlh(1494) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
F:\MYEXE\My3\My3Dlg.cpp(18) : error C2871: 'Excel' : does not exist or is not a namespace
F:\MYEXE\My3\My3Dlg.cpp(231) : error C2065: '_Worksheets' : undeclared identifier
F:\MYEXE\My3\My3Dlg.cpp(231) : error C2146: syntax error : missing ';' before identifier 'sheet'
F:\MYEXE\My3\My3Dlg.cpp(231) : error C2065: 'sheet' : undeclared identifier
F:\MYEXE\My3\My3Dlg.cpp(261) : error C2228: left of '.AttachDispatch' must have class/struct/union type
F:\MYEXE\My3\My3Dlg.cpp(263) : error C2228: left of '.GetUsedRange' must have class/struct/union type
F:\MYEXE\My3\My3Dlg.cpp(285) : error C2228: left of '.GetCells' must have class/struct/union type



在线等答案 谢谢了 直接发分
回复
回复
favorxx 2009-07-25
好多错误有可能就一个错误引起的,设置断点吧,看看那步错了
回复
oyljerry 2009-07-25
可以设置断点,调试运行一下,看运行过程中各个变量等是否正确......
回复
lijiawlm 2009-07-25
支持一下....
作品还不错
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

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