用vc控制excel表,把结构相同的表的记录都追加到一张表中,现在copy出现问题!!请教大家!

wwsatan 2003-08-10 02:49:38

我想把两个excel文件合并成一个文件
每个文件中表的结构和表的个数都一样
每个表分别合并记录就行勒

下面是我的程序
我用copy方法来合并记录
这个方法需要指定一个目标range
比如从第n行到n+m行,该如何设定?

{ _Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wb1,wb2;
Worksheets wss1,wss2;
_Worksheet ws1,ws2;

//创建Excel 2000服务器(启动Excel)

if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
exit(1);
}
//1,打开两张表(workbook)wb1,wb2
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
wb1.AttachDispatch(wbsMyBooks.Add(_variant_t("c:\\test1.xls")));
wb2.AttachDispatch(wbsMyBooks.Add(_variant_t("c:\\test2.xls")));

//2, 得到workbook中sheet的数目 count
long sheetcount1,sheetcount2;

//先得到各自的sheets
wss1.AttachDispatch(wb1.GetWorksheets(),true);
wss2.AttachDispatch(wb2.GetWorksheets(),true);

//得到各自的sheet数目
sheetcount1 = wss1.GetCount();
sheetcount2 = wss2.GetCount();

//判断表数目是否相等
if(sheetcount1 != sheetcount2)
{
AfxMessageBox("工作簿中的表的数目不一致,无法追加记录");
return;
}

//3, 遍历每张表sheet
for(int i=1; i <= sheetcount1; i++)
{
//得到两张表
ws1.AttachDispatch(wss1.GetItem(_variant_t((long)i)));
ws2.AttachDispatch(wss2.GetItem(_variant_t((long)i)));

//4, 得到wb1,wb2中的表的行数
long itemcount1,itemcount2;

Range rg1,rg2,rowsrg1,rowsrg2,dstrg;

rg1.AttachDispatch(ws1.GetUsedRange());
rg2.AttachDispatch(ws2.GetUsedRange());

rowsrg1.AttachDispatch(rg1.GetRows());
rowsrg2.AttachDispatch(rg2.GetRows());

itemcount1 = rowsrg1.GetCount();
itemcount2 = rowsrg2.GetCount();


//追加记录!这里遇到问题
//copy需要指定一个矩形区域


请问:该如何指定这个dstrg?


//5,追加记录
rg2.Copy(_variant_t(dstrg));

}

}
...全文
229 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwsatan 2003-08-11
  • 打赏
  • 举报
回复
听懂勒,辛苦你勒阿
其实我已经追加成功勒


问题出在追加后的结果是在一个新生成的workbook里面,而不是被追加的workbook
能不能不让成新workbook阿!??

gzshd 2003-08-10
  • 打赏
  • 举报
回复

我想单用copy不可以吧,到了目地端需要用粘贴吧
而且我觉得不要得到被追加记录的range吧,只要把当前的光标(我不知道准确的说叫什么)放在要追加的表的有记录的最后一行的下一行的第一个单元格里,执行粘贴,电脑就会根据刚才copy的内容大小自动向下向右顺序延伸,这一点你可以实际在Excel中复制粘贴来证明。
我这样说不知道你能不能听懂,很多人说我表达能力不强,我再重说一遍吧。首先,copy源数据,得指定copy的范围,即多长多宽个单元格,这是一个矩形,在粘贴时,只要先将光标移到目的表要粘贴的矩形的左上角,执行粘贴电脑会自动根据copy在内存中的格式排满目的表你要粘贴的那个矩形。
好累,还没听懂吗?我倒......
光标移动到某个单元格,如:Range r=sheet.GetRange(COleVariant("A2:I4"),vOpt);
Range好像有一个粘贴的函数吧

如果实在不行,你可以考虑在程序的最后删到多余的表。
wwsatan 2003-08-10
  • 打赏
  • 举报
回复
没有描述清楚

目的和源都是一个文件(test1.xls,test2.xls),内有一个workbook, 内有n张表

现在追加之后,打开源文件,就会发现打开勒3个workbook,其中一个是原来就有的test1.xls,另外一个是目的workbook但是名字不一样test21.xls,还有一个是追加的结果test11.xls

怎么简单的一个copy会生成新的workbook???如何避免这一点啊,直接追加到test1.xls这一个workbook就行了???

wwsatan 2003-08-10
  • 打赏
  • 举报
回复
感谢楼上的兄弟!

现在实现勒追加记录,但是结果是原工作簿内生成勒两张表,一张是表2,一张是合并勒数据的也就是我想要的,还有一张表1,为什么会这样啊?我copy的时候指定的目的参数是表1中的range阿


copy部分的代码:

//得到追加的记录的range
CString tmp;
char tt='A'+col2-1;
tmp.Format("A1:%c%d",tt,row2);
rg2.AttachDispatch(ws2.GetRange(COleVariant(tmp),vtMissing));


//得到被追加记录的range
tt='A'+col1-1;
tmp.Format("A%d:%c%d",row1+1,tt,row2+row1);
dstrg.AttachDispatch(ws1.GetRange(COleVariant(tmp),vtMissing));

//用copy方法将选定的 Range 对象复制到指定区域
rg2.Copy(_variant_t(dstrg));

gzshd 2003-08-10
  • 打赏
  • 举报
回复
//copy需要指定一个矩形区域
//先得到要copy的表的行数
Range colsrg1;
long itemcount3;
colsrg1.AttachDispatch(rg2.GetColumns());
itemcount3=colsrg1.GetCount();
//因为你之前已得到它的列数了,所以现在可以把它全选
CString tmp;
char tt='A'+itemcount2-1;
//这儿Format之后的格式如:A1:I10 表示全选的是从第一行到第十行
tmp.Format("A1:%c%d",tt,itemcount3);
//这一句是全选
dstrg=ws2.GetRange(COleVariant(tmp),vOpt);

//5,追加记录
rg2.Copy(_variant_t(dstrg));

//在下面还得有粘贴的语句

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧