VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3719|回复: 7

[求助] 如何通过VC对两个excel文件的sheet进行复制

[复制链接]
47_avatar_middle
在线会员 发表于 2015-8-23 22:36:51 | 显示全部楼层 |阅读模式
3驿站币
现有A.xls和B.xls两个excel文件,其中A.xls文件中包含有如下sheet:A1、A2、A3,B.xls文件中包含如下sheet:B1、B2、B3。
现在请用VC对excel进行操作,把A.xls文件中的A2复制到B.xls中,并且放在B2后面,B3前面,重命名为“B2.5”。
请最好用我附件中那个CMyExcel类进行操作,它并没提供相应的函数,请帮我写出这个函数。
如何通过VC对两个excel文件的sheet进行复制 MyExcel类.zip (28.92 KB, 下载次数: 15)

最佳答案

查看完整内容

给楼主点参考代码吧,希望对你有帮助,别总要现成的函数,靠自己研究出来岂不是更好? 可以这样去复制 COleVariant m_covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);//全局变量 //获取要复制的sheet的区域 m_sheets.AttachDispatch(m_book.GetWorksheets(),TRUE); m_sheet.AttachDispatch(m_sheets.GetItem(COleVariant((short)1))); m_range.AttachDispatch(m_sheet.GetRange(_variant_t("A1"),_variant_t("E40"))); ...




上一篇:老大,关于远控代码错误的提示,帮帮忙
下一篇:list
47_avatar_middle
ico_lz  楼主| 发表于 2015-8-25 04:27:48 | 显示全部楼层
好吧 我已经解决了 具体参考的是如下链接:
http://zhidao.baidu.com/question/455986637.html?qbl=relate_question_2&word=vc%20excel%C4%DA%C8%DD%B8%B4%D6%C6&optimi=4
51_avatar_middle
online_admins 发表于 2015-8-23 22:36:52 | 显示全部楼层
给楼主点参考代码吧,希望对你有帮助,别总要现成的函数,靠自己研究出来岂不是更好?

可以这样去复制
COleVariant m_covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);//全局变量
//获取要复制的sheet的区域
m_sheets.AttachDispatch(m_book.GetWorksheets(),TRUE);
m_sheet.AttachDispatch(m_sheets.GetItem(COleVariant((short)1)));
m_range.AttachDispatch(m_sheet.GetRange(_variant_t("A1"),_variant_t("E40")));

//复制选取的区域
m_range.Copy(vtMissing);

//在现有sheet后增加新sheet
COleVariant temp;
temp.pdispVal = m_sheet.m_lpDispatch;
temp.vt = VT_DISPATCH;
m_sheet = m_sheets.Add(m_covOptional,temp,m_covOptional,m_covOptional);

//复制sheet1的格式和列宽到新的sheet中
m_sheet.AttachDispatch(m_sheets.GetItem(COleVariant((short)m_Id)));
m_range.AttachDispatch(m_sheet.GetRange(_variant_t("A1"),vtMissing));
m_range.PasteSpecial(xlPasteFormats,xlPasteSpecialOperationNone,vtMissing,vtMissing);//复制表的格式
m_range.PasteSpecial(xlPasteColumnWidths,xlPasteSpecialOperationNone,vtMissing,vtMissing);//复制列宽

这样即可利用一个sheet作为配置表去复制出一张空表!
47_avatar_middle
ico_lz  楼主| 发表于 2015-8-24 17:02:55 | 显示全部楼层
Syc 发表于 2015-8-24 12:56
给楼主点参考代码吧,希望对你有帮助,别总要现成的函数,靠自己研究出来岂不是更好?

可以这样去复制

在一个excel中复制sheet我其实已经研究出来了,代码如下:(我自己写的,给CMyExcel添加了这个函数)
BOOL CMyExcel::CopySheet(CString csDestSheet, BOOL bBehind)
{
        COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);       
        _Worksheet DestSheet;
        DestSheet = MySheets.GetItem(_variant_t(csDestSheet));
        MyApp.SetVisible(FALSE);
        MyApp.SetUserControl(FALSE);
        MyApp.SetAlertBeforeOverwriting(FALSE);//禁用覆盖提示
        MyApp.SetDisplayAlerts(FALSE);//禁止显示警告提示
        if (bBehind == TRUE)
        {
                MySheet.Copy(covOptional,_variant_t(DestSheet));
        }
        else
        {
                MySheet.Copy(_variant_t(DestSheet), covOptional);
        }
        return TRUE;
}

上述函数可以实现同一个excel的sheet复制,当然还得润色一下,比如要copy的sheet如果不存在怎么办...

现在我的问题是:

现在不同excel间的sheet复制,我尝试写了如下代码:
        LPDISPATCH lpDisp=NULL;
        COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
        Worksheets aSheets, bSheets;
        _Worksheet aSheet, bSheet;
CMyExcel aExcel, bExcel;
        aExcel.Open("D:\\A.xls");
        bExcel.Open("D:\\B.xls");
        aExcel.OpenSheet("A1");
        bExcel.OpenSheet("B2");
        aSheets = aExcel.MySheets;
        bSheets = bExcel.MySheets;
        aSheet = aExcel.MySheet;
        bSheet = bExcel.MySheet;
COleVariant temp;
        //temp.pdispVal = destSheet.m_lpDispatch;
        temp.pdispVal = bSheet.m_lpDispatch;
        temp.vt = VT_DISPATCH;
        //aSheet.Copy(vOpt, _variant_t(bSheet));
        aSheet.Copy(vOpt, temp);
        temp.Detach();
        aExcel.Save();
        aExcel.Exit();
        bExcel.Save();
        bExcel.Exit();
编译没报错,运行的时候弹出“worksheet类的copy方法无效”,

后来我又尝试写了如下代码:
CMyExcel aExcel, bExcel;
        _Worksheet aSheet, bSheet;
        Range copyfrom, copyto;
        aExcel.Open("D:\\A.xls");
        bExcel.Open("D:\\B.xls");
        aExcel.OpenSheet("A1");
        bExcel.OpenSheet("B2");
        aSheet = aExcel.MySheet;
        bSheet = bExcel.MySheet;
        copyfrom.AttachDispatch(aSheet.GetRange(_variant_t("A1"), _variant_t("J10")));   
        copyto.AttachDispatch(bSheet.GetRange(_variant_t("A1"), _variant_t("J10")));   
        copyfrom.Copy(_variant_t(copyto));

        copyfrom.ReleaseDispatch();   
        copyto.ReleaseDispatch();   
        aSheet.ReleaseDispatch();
        bSheet.ReleaseDispatch();


        aExcel.Save();
        aExcel.Exit();
        bExcel.Save();
        bExcel.Exit();

也是编译没报错,运行的时候弹出“range类的copy方法无效”
47_avatar_middle
ico_lz  楼主| 发表于 2015-8-25 02:49:42 | 显示全部楼层
excel9.cpp中的相关函数如下:
  1. void _Worksheet::Copy(const VARIANT& Before, const VARIANT& After)
  2. {
  3.         static BYTE parms[] = VTS_VARIANT VTS_VARIANT;
  4.         InvokeHelper(0x227, DISPATCH_METHOD, VT_EMPTY, NULL, parms, &Before, &After);
  5. }
复制代码
47_avatar_middle
ico_lz  楼主| 发表于 2015-8-25 02:51:37 | 显示全部楼层
我录制了宏,相关代码如下:
    Sheets("A1").Select
    Sheets("A1").Copy After:=Workbooks("B.xls").Sheets(3)
94_avatar_middle
在线会员 发表于 2017-8-17 11:22:35 | 显示全部楼层
楼主你用的是什么方法?用copy好像不能把
38_avatar_middle
在线会员 发表于 2018-4-3 16:01:24 | 显示全部楼层
学习下!!!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-4-19 09:24

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表