轻轻松松搞定VC操作Excel之一

博客分享了VC操作Excel的方法,适合初学者。介绍了Excel的层次结构,如Application、Workbooks等;说明了插入类型库的步骤,包括在MFC工程中操作及选择类型文件;还提及基本操作,如选用Excel生成报表时可做模板减轻编码负担。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.vckbase.com/dlutyuanhongl/archive/2005/03/20/3746.html

    时常在论坛上看到有人问这个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模板的代码如下。
        

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

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

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

ExpandedBlockEnd.gif    }

None.gif
None.gif    COleVariant vOptional( (
long )DISP_E_PARAMNOTFOUND, VT_ERROR );
None.gif
None.gif    
try
ExpandedBlockStart.gifContractedBlock.gif  
{
InBlock.gif        wbsBooks.AttachDispatch(ExcelApp.GetWorkbooks(), TRUE);
InBlock.gif        wbBook.AttachDispatch(wbsBooks.Add(COleVariant(strPath)), TRUE );
InBlock.gif
InBlock.gif        wssSheets 
= wbBook.GetWorksheets();
InBlock.gif        wsSheet 
= wssSheets.GetItem(_variant_t("Sheet1")); // Get Sheet1
          wsSheet.SetName( "Your Sheet" );    // 改名
          // 得到全部Cells,此时,rngXls 是cells的集合
          rngXls = wsSheetAcc.GetCells();      
ExpandedBlockEnd.gif
    }

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

InBlock.gif    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif  
{
InBlock.gif         sprintf( strResult,
"%c%d"'A' + (col-1)%26,row );
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值