dlutyuanhongl(乱石铺街)的BLOG

VC知识库BLOG 首页 新随笔 联系 聚合 登录
  11 Posts :: 1 Stories :: 72 Comments :: 2 Trackbacks

留言簿(8)

随笔分类

随笔档案

文章分类

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜

    时常在论坛上看到有人问这个VC操作Word或者Excel有没有书系统地介绍如何去做,有这个必要吗?其实捅破这层窗户纸,你就会恍然大悟,原来是这么回事啊!在此我觉得有必要把我工作中操纵Excel的一点小体会拿出来和大家共享,也许对初学者能有所帮助,高手就不要看了。操作Word请看牛人yingkou的BLOG(http://blog.vckbase.com/yingkou) .基本步骤如下

        一、Excel的层次结构   
        Application

               Workbooks

                   Workbook

                    ......

               Worksheets

                   Worksheet

                    ......

               Range

                   Font

                   Borders

                    ......

            .......


        二、插入类型库

        1、在一个已有的MFC工程按Ctrl + W 弹出ClassWizard对话框。
        2、Add Class...\From a type Library... 在 Office 目录中,找到你想使用的Excel类型库(Offce2000下,此目录在C:\Program Files\Microsoft Office\Office\EXCEL9.OLB)。选择EXCEL9.OLB此类型文件。
        3、在弹出的对话框中选择要添加的类,具体选那些类要根据实际情况而定。当然你也可以全选。

          三、基本操作

           当你要选用Excel生成报表时,表的结构可能有固定的部分,这时做一个模板,这样可以减少编码的负担。加载Excel模板的代码如下。
        

    _Application  ExcelApp;           // 定义Excel应用程序
       Workbooks          wbsBooks;
      _Workbook          wbBook;
      Worksheets         wssSheets;
      _Worksheet         wsSheet;
      Range        rngXls;
      FontXls            font;               // 字体
      BordersXls         border;         // 边框
      // 初始化Com
    if (::CoInitialize( NULL ) == E_INVALIDARG)
  
{
              AfxMessageBox(_T(
"初始化Com失败!"));
    }


    
// 创建Excel2000服务器(启动Excel)
    if ( !ExcelApp.CreateDispatch(_T("Excel.Application"), NULL))
  
{
        AfxMessageBox(_T(
"创建Excel2000服务失败!"));
        ::CoUninitialize();

    }
   
       ExcelApp.SetVisible(FALSE);  // 隐藏
       
     CString strPath;
    strPath 
+= "C:\\template.xlt"//    模板的路径    
    CFileFind filefind;
    
if!filefind.FindFile( strPath ) )
  
{
        AfxMessageBox( 
"没有找到模版文档,请其查找" );
        
        CFileDialog dlg (TRUE,
                                    NULL,                                  
                                    NULL,
                                    OFN_HIDEREADONLY
|OFN_OVERWRITEPROMPT,
                                   "模版||*.xlt||",
                                   NULL );
        
        
if (IDOK == dlg.DoModal())
     
{
            strPath 
= dlg.GetPathName(); 
        }

    }


    COleVariant vOptional( (
long)DISP_E_PARAMNOTFOUND, VT_ERROR );

    
try
  
{
        wbsBooks.AttachDispatch(ExcelApp.GetWorkbooks(), TRUE);
        wbBook.AttachDispatch(wbsBooks.Add(COleVariant(strPath)), TRUE );

        wssSheets 
= wbBook.GetWorksheets();
        wsSheet 
= wssSheets.GetItem(_variant_t("Sheet1")); // Get Sheet1
          wsSheet.SetName( "Your Sheet" );    // 改名
          // 得到全部Cells,此时,rngXls 是cells的集合
          rngXls = wsSheetAcc.GetCells();      
    }

    
catch (CException e)
  
{
        AfxMessageBox( 
"" )
    }
       
        我们知道在Excel中每个单元格可以用A1,A2,C3的形式来表示。譬如获得A1到C5之间单元格集可以这样实现,rngXls = rngXls.GetRange( COleVariant(_T(“A1“)),COleVariant(_T(“C5“)) );但是我们习惯用坐标形式如(1,1),(2,1)来表示每个单元格,在上述操作中,就没有办法用我们习惯的坐标的形式实现。它们之间如何转换那?这个用如下函数实现.
       
// Converts (row,col) indices to an Excel-style A1:C1 string in Excel
void CPrintInExcel::IndexToString( int row, int col, char* strResult )
{
    
if( col > 26 )
  
{
         sprintf( strResult,
"%c%c%d",'A' + (col-1)/26-1,'A' + (col-1)%26,row );
    }

    
else
  
{
         sprintf( strResult,
"%c%d"'A' + (col-1)%26,row );
    }

}

         有了这个函数,操作Excel就方便多了。今天就写到这儿了,有空再继续。
posted on 2005-03-20 10:30 乱石铺街 阅读(9252) 评论(29)  编辑 收藏

Feedback

# re: 轻轻松松搞定VC操作Excel之一 2005-03-20 13:47 笑话
好东西,谢了!!!!!嘿~~~~~~~~~~


# re: 轻轻松松搞定VC操作Excel之一 2005-03-23 08:10 andy
确实好棒!

# re: 轻轻松松搞定VC操作Excel之一 2005-05-08 20:37 JIMMY
在VC条件下往EXCEL中写入数据,1页数据显示不完,如何将数据换页啊?

# re: 轻轻松松搞定VC操作Excel之一 2005-05-09 21:38 dlutyuanhongl
在添加一个Worksheet。

# re: 轻轻松松搞定VC操作Excel之一 2005-05-17 13:20 Egg
好东西
解决了我编程的大难题啊
谢谢了!!

# re: 轻轻松松搞定VC操作Excel之一 2005-07-29 08:47 Raymond
不错不错,不知道有没有相应的例子参考参考阿

# re: 轻轻松松搞定VC操作Excel之一 2005-08-30 09:15 wolf
有源码吗,给我一份?谢谢!
xing_can@163.com

# re: 轻轻松松搞定VC操作Excel之一 2005-09-06 11:37 宝宏
还有我,
payi_2001@hotmail.com
多谢!

# re: 轻轻松松搞定VC操作Excel之一 2005-09-12 20:37 dlutyuanhongl
呵呵,源码本站就有。

# re: 轻轻松松搞定VC操作Excel之一 2005-10-12 14:59 NJHS
如何看excel9.h与excel9.cpp程序呢

其中的类的方法与操作都没有注释,怎么知道各个函数是干什么用的呢

有什么资料吗?


# re: 轻轻松松搞定VC操作Excel之一 2005-10-25 18:24 ilove611
我也很需要站长的源代码,能给我一份么?
我得邮箱houkunpeng@163.com

# re: 轻轻松松搞定VC操作Excel之一 2005-10-25 20:23 无心_所爱
COleVariant vOpt(DISP_E_PARAMNOTFOUND,VT_ERROR);
注解:缺省值的Variant变量,可以用在一些有缺省值的Excel函数,十分好用,十分感谢论坛一个前辈告诉我的(具体名字忘记了,呵呵,不好意思)

# re: 轻轻松松搞定VC操作Excel之一 2005-11-02 16:41 wisdom
"EXCEL9.OLB之类的文件"是根据不同office版本而不同名字的,如在Office Xp 中有XL5CHS32.OLB(中文版本),XL5ENS32.OLB(英文版本)等

# re: 轻轻松松搞定VC操作Excel之一 2005-11-11 19:30
我也很需要站长的源代码,能给我一份么? 
我得邮箱jianjun1983@126.com 
谢谢!

# re: 轻轻松松搞定VC操作Excel之一 2005-11-11 19:30
我也很需要站长的源代码,能给我一份么? 
我得邮箱jianjun1983@126.com 
谢谢!

# re: 轻轻松松搞定VC操作Excel之一 2005-11-22 16:51 陈波
我现在有个高级操作需要实现,那就是将图放入单元格,并将它居中,其实我通过PasteSpecial已经完成了放入过程,难就难在居中。我已经郁闷了很久,不知道怎么实现之,你给点主义吧。
我的联系方式:boocheen@gmail.com

要是你能解决这个问题,我想见面和你聊聊,希望你是在北京,我们现在有个项目需要找高手加入做。

# re: 轻轻松松搞定VC操作Excel之一 2005-12-23 19:24 YSX
我也要,呵呵太好了。
ysx74@163169.net

# re: 轻轻松松搞定VC操作Excel之一 2006-01-15 14:07 MF
其实,实现单元格的表达形式从“B2”到(2,2)并没有那么复杂,你可以这样:
Excel::_ApplicationPtr pApp;
pApp.CreateInstance("Excel.Application");
pApp->PutVisible(0,VARIANT_TRUE);
Excel::_WorkbookPtr pWorkbook;
pWorkbook=pApp->GetWorkbooks()->Add();
Excel::_WorksheetPtr pSheet;
pSheet=pWorkbook->GetWorksheets()->GetItem("Sheet1"); 
Excel::RangePtr pCells;
pCells=pSheet->GetCells();
Excel::RangePtr pCell;
pCell=pCells->GetItem(COleVariant(long(2)),COleVariant(long(2)));
pCell->PutValue("I'm here!");

# re: 轻轻松松搞定VC操作Excel之一 2006-01-15 14:08 MF
其实,实现单元格的表达形式从“B2”到(2,2)并没有那么复杂,你可以这样:
Excel::_ApplicationPtr pApp;
pApp.CreateInstance("Excel.Application");
pApp->PutVisible(0,VARIANT_TRUE);
Excel::_WorkbookPtr pWorkbook;
pWorkbook=pApp->GetWorkbooks()->Add();
Excel::_WorksheetPtr pSheet;
pSheet=pWorkbook->GetWorksheets()->GetItem("Sheet1"); 
Excel::RangePtr pCells;
pCells=pSheet->GetCells();
Excel::RangePtr pCell;
pCell=pCells->GetItem(COleVariant(long(2)),COleVariant(long(2)));
pCell->PutValue("I'm here!");

# re: 轻轻松松搞定VC操作Excel之一 2006-01-15 14:23 MF
另外,我认为,要将图片贴入单元格是不可能的,因为图片贴入后应当属于Sheet,而不会属于Range或Cell,从而要居中更无从谈起。
不知你是怎样实现的,或者你所提的问题没表达清楚。

# re: 轻轻松松搞定VC操作Excel之一 2006-02-08 05:00 令狐勇
for(int i=1;i<=n;i++)
{
     rgMyRge.AttachDispatch( rgMyRge.GetItem (COleVariant(long(n)),COleVariant(long(1))).pdispVal,true);
     V=rgMyRge.GetValue();//V 是 VARAINT类型
     C=V.bstrVal;//C是Cstring类型
     m_1.SetWindowText(C);
}

这样子输出的东西好像不对,读到的东西怎么会少?
各位大侠尽快帮忙,急了好几天了。

# re: 轻轻松松搞定VC操作Excel之一 2006-05-11 22:35 korben
如何调用Excel文档中定义的宏呢?谢谢!

# re: 轻轻松松搞定VC操作Excel之一 2006-05-12 22:55 zjt
我也很需要站长的源代码,能给我一份么?  
我得邮箱zhjting1981@163.com
谢谢! 

# re: 轻轻松松搞定VC操作Excel之一 2006-05-14 13:45 红精灵
我按照你的方法试了,没有成功
(我装的是office xp),所以把xlsch5.h&.cpp加进来了,但还是编译通不过。。。

能够看一下您的源码吗?
hj330@163.com
万分感激!!!

# re: 轻轻松松搞定VC操作Excel之一 2006-06-10 17:06 Von
为什么我连创建Excel服务都会失败??

# re: 轻轻松松搞定VC操作Excel之一 2006-08-18 17:59 wsanhu
我也很需要站长的源代码,能给我一份么?   
我的邮箱:wsanhu@163.com 
多谢!  


# re: 轻轻松松搞定VC操作Excel之一 2006-12-09 13:08 lixianyin
当你在读写几个5000行以上的表格时,用户打开excel,做其他的事时怎么处理?我头疼死了!

# re: 轻轻松松搞定VC操作Excel之一 2007-12-04 13:00 yike0829
楼主,怎样才能得到源码呢?

# re: 轻轻松松搞定VC操作Excel之一 2008-04-29 15:30 gui
yuioftyu

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]