VC++ Excel基本操作(初始化,插入,颜色)

最近做VC++操作excel,特地转载文章,另外我自己实现了C++的excel类,需要可以私信我。


-------------------------------------转载内容:--------------------------------------------------

 

最近由于工作需要,不得不操作Excel,包括基本的数据输入输出、字体设置、颜色设置、单元格的合并、填充色的设置,当然还包括图表的生成以及渐近线的操作等。折腾了许久,项目终于完成了^_^。现在将学习操作Excel的点点滴滴记录下来和大家一同分享,也作为自己的一次总结。

      1、Excel的对象模型(有人称其为层次结构)

      打开一个Excel工作表,点击“工具”->“宏”->“Visual Basic 编辑器”选项打开VB的编辑器,打开帮助文档,里面“Microsoft Excel Visual Basic 参考”下的“Microsoft Excel 对象模型”展示了完整的Excel的层次结构,是不是有点类似于MFC的继承图表啊?利用帮助文档我们可以找到一些需要的知识,下面介绍一些类:

      _Application:表示整个的Excel应用程序,包含一个工作簿集合

      Workbooks:工作簿集合,包含N个工作簿(Workbook)

      _Workbook:工作簿,包含一个工作表(sheets)集合

      Worksheets:工作表集合,包含N个工作表

      _Worksheet:工作表,也就是我们在Excel中看到的Sheet1、Sheet2、Sheet3,它是我们操作Excel的基本单位

      Range:这是单元格的集合,我们知道Excel是由一个个的单元格组成的,通过Range来操作单元格

      Font:用于设置单元格的字体、颜色、字号、粗体设置

      Interior:设置底色

      Boards:设置区域内所有单元格的边框,如果要设置一组区域的外边框的话用Rang->BorderAround设置

      下面用一个具体的例子来说明怎么通过MFC来操作Excel

      2、Excel库的插入

      在我们MFC的工程中,按Ctrl+W打开MFC类向导对话框,点击“Add Class...”->“From a type Library...”,找到你所使用的excel类型库,我使用的在目录C:/Program Files/Microsoft Office/OFFICE11下的“EXCEL.EXE”文件,查找时文件类型选“All Files”,然后添加我们所需要的类,通常以上列举的前6类是必须的,其它的需要时再添加。我不认为全部添加是一种好的做法,一个我觉得很乱,另外生成的excel.cpp文件会很大。我建议浏览一遍这些类,这样当你做些操作时可以更清楚的知道需要添加哪些类。添加完需要的类后,我们就可以来做一些基本的操作了。

      3、Com支持库的初始化

      通常在App的InitInstance()里面加入初始化和关闭COM库的操作,在DoModal()调用之前加入初始化的代码:

if (CoInitialize(NULL) != 0)   
{   
    AfxMessageBox("初始化COM支持库失败!");   
    exit(1);   
}   

 在return之前加入CoUninitialize(); 关闭CON库。

      4、代码演示一些基本的操作

      首先别忘了包含头文件“excel.h”,若用到_variant_t()时,需要包含头文件“comdef.h”和“comutil.h”,否则会出现错误:

error C2065: '_variant_t' : undeclared identifier”。

      下面的代码包括了一些基本的操作:

 // 变量的定义  
    _Application app;  
    Workbooks books;  
    _Workbook book;  
    Worksheets sheets;  
    _Worksheet sheet;  
    Range range;  
    LPDISPATCH lpDisp;      
    COleVariant vResult;  
  
    CString str = "";  
      
    COleVariant  
        covTrue((short)TRUE),  
        covFalse((short)FALSE),  
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
      
    //创建Excel 2003服务器(启动Excel)  
    if (!app.CreateDispatch("Excel.Application",NULL))   
    {   
        AfxMessageBox("Create Excel service failure!");  
        return;  
    }  
  
    // 设置为FALSE时,后面的app.Quit();注释要打开  
    // 否则EXCEL.EXE进程会一直存在,并且每操作一次就会多开一个进程  
    app.SetVisible(TRUE);  
    books.AttachDispatch(app.GetWorkbooks(),true);  
      
    /* 
    *   打开一个工作簿。 
    *   Excel 2000 只需要13个参数就行,Excel 2003需要15个参数 
    */  
    lpDisp = books.Open("E://test.xls",  
        covOptional, covOptional, covOptional, covOptional,  
        covOptional, covOptional, covOptional, covOptional,  
        covOptional, covOptional, covOptional, covOptional,  
        covOptional, covOptional);  
    ASSERT(lpDisp);  
      
    book.AttachDispatch(lpDisp);  
      
    // 得到Worksheets    
    sheets.AttachDispatch(book.GetWorksheets(),true);   
      
    // 得到Worksheet  
    sheet.AttachDispatch(sheets.GetItem(_variant_t((short)(1))));     
      
    // 得到全部Cells   
    range.AttachDispatch(sheet.GetCells(),true);  
  
      
    // 往单元格A1里写入字符串数据,就像操作矩阵一样,第1行第1列  
    range.SetItem(_variant_t((LONG)1),_variant_t((LONG)1),_variant_t("hello word!"));  
  
    // 往单元格A2里写入时间数据  
    range.AttachDispatch(sheet.GetRange(_variant_t("A2"), _variant_t("A2")),true);  
    range.SetValue2(_variant_t("2011/02/15"));  
  
    // 往单元格A3~A6里写入浮点数据  
    range.AttachDispatch(sheet.GetRange(_variant_t("A3"), _variant_t("A6")),true);  
    range.SetValue2(_variant_t((double)3.14));  
  
    // 设置单元格的列宽为12  
    range.AttachDispatch(sheet.GetRange(_variant_t("A1"), _variant_t("A1")),true);  
    range.SetColumnWidth(_variant_t((long)12));  
  
    // 所有单元格居中显示  
    range.AttachDispatch(sheet.GetCells(),true);  
    range.SetHorizontalAlignment(_variant_t((long)-4108)); // -4108:居中,-4131:靠左,-4152:靠右  
    range.SetVerticalAlignment(_variant_t((long)-4108)); // -4108:居中,-4160:靠上,-4107:靠下  
  
    // 读取单元格的数据,第4行第1列  
    range.AttachDispatch(range.GetItem(_variant_t((long)(4)),_variant_t((long)(1))).pdispVal );  
    vResult =range.GetValue(covOptional);  
      
    switch (vResult.vt)  
    {  
    case VT_BSTR:       // 字符串  
        str=vResult.bstrVal;  
        break;  
    case VT_R8:         // 8字节的数字  
        str.Format("%f",vResult.dblVal);  
        break;  
    case VT_DATE:       // 时间格式  
        SYSTEMTIME st;  
        VariantTimeToSystemTime(vResult.date, &st);  
        break;  
    case VT_EMPTY:      // 单元格空的  
        str="";  
        break;  
    }  
    //MessageBox(str);  
  
    Font ft;    // 要插入excel类库里面的Font类,下面类似  
      
    range.AttachDispatch(sheet.GetRange(_variant_t("A3"), _variant_t("A5")),true);  
    ft.AttachDispatch(range.GetFont());  
    ft.SetName(_variant_t("华文行楷")); // 字体   
    ft.SetSize(_variant_t((long)12));   // 字号  
    //ft.SetColorIndex(_variant_t((long)3));    // 字的颜色: 红色  
         ft.SetColor( _variant_t((long) RGB(255, 0, 0) ) );  
    ft.SetBold(_variant_t((long)1));    // 1:粗体,0:非粗体  
  
    Interior it; // 底色设置  
      
    range.AttachDispatch(sheet.GetRange(_variant_t("C3"), _variant_t("E6")),true);  
    it.AttachDispatch(range.GetInterior());       
    it.SetColorIndex(_variant_t((long)20)); // 底色设置为浅青色  
  
    Borders borders; // 先设置区域内所有单元格的边框  
    borders = range.GetBorders();  
    borders.SetColorIndex(_variant_t((long)1));  
    borders.SetLineStyle(_variant_t((long)1));  
    borders.SetWeight(_variant_t((long)2));  
  
    // 然后设置外边框  
    // LineStyle=线型(1~13) Weight=线宽 ColorIndex=线的颜色(-4105为自动, 1为黑色)   
    range.BorderAround(_variant_t((long)9),_variant_t((long)1),_variant_t((long)1),vtMissing);  
  
    range.AttachDispatch(sheet.GetRange(_variant_t("C8"), _variant_t("D9")),true);  
    // 合并单元格  
    range.Merge(_variant_t((long)0));  
  
  
    book.Save();                    // 保存Excel的内容  
//  app.SetDisplayAlerts(false);    // 不弹出对话框询问是否保存  
//  app.Quit();                     // 退出  
  
    //释放对象    
    range.ReleaseDispatch();  
    sheet.ReleaseDispatch();  
    sheets.ReleaseDispatch();  
    book.ReleaseDispatch();  
    books.ReleaseDispatch();  
    app.ReleaseDispatch();  


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【前言】 工作或学习中可能需要实现基于VC读\写Excel文件的功能,本人最近也遇到了该问题。中间虽经波折,但是最终还是找到了解决问题的办法。 在此跟大家分享,希望对跟我同样迷茫过的同学们有所帮助。 1、程序功能 1)打开一个excel文件; 2)显示到CListCtrl上; 3)新建一个Excel文件。 以上均在对话框中实现。 2、平台 VC++2010 3、实现方法 常用的Excel打开方式有两种 1)通过数据库打开; 2)OLE方式打开。 由于方式1)操作繁琐,经常出现莫名的错误,这里选用方式2). 4、准备步骤 首先新建一个Dialog窗体程序,添加list control和两个按钮 1)将ExcelLib文件夹拷贝到程序目录下; 2)将Export2Excel.h,Export2Excel.cpp两个文件添加到项目; 3)包含头文件,#include "ExcelLib/Export2Excel.h" 通过以上步骤在程序中引入了可以读取Excle文件的CExport2Excel类; 5、打开excel文件 通过按钮点击打开 void CExcelTestDlg::OnBnClickedButtonOpenExcel() { //获取文件路径 CFileDialog* lpszOpenFile; CString szGetName; lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,"Excel File(*.xlsx;*.xls)|*.xls;*.xlsx",NULL); if (lpszOpenFile->DoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //打开文件 //文件中包含多个sheet时,默认打开第一个sheet CExport2Excel Excel_example; Excel_example.OpenExcel(szGetName); //获取sheet个数 int iSheetNum = Excel_example.GetSheetsNumber(); //获取已使用表格行列数 int iRows = Excel_example.GetRowCount(); int iCols = Excel_example.GetColCount(); //获取单元格的内容 CString cs_temp = Excel_example.GetText(1,1); //AfxMessageBox(cs_temp); //List control上显示 //获取工作表列名(第一行) CStringArray m_HeadName; m_HeadName.Add(_T("ID")); for (int i=1;iGetItemCount()>0) { m_list.DeleteColumn(0); } //初始化ClistCtrl,加入列名 InitList(m_list,m_HeadName); //填入内容 //第一行是标题,所以从第2行开始 CString num; int pos; for (int row = 2;row<=iRows; row++) { pos = m_list.GetItemCount(); num.Format(_T("%d"),pos +1); m_list.InsertItem(pos,num); for (int colum=1;columDoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //文件全名称 CString csFileName = szGetName; //需要添加的两个sheet的名称 CString csSheetName = "newSheet"; CString csSheetName2 = "newSheet2"; // 新建一个excel文件,自己写入文字 CExport2Excel Excel_example; //新建excel文件 Excel_example.CreateExcel(csFileName); //添加sheet,新加的sheet在前,也就是序号为1 Excel_example.CreateSheet(csSheetName); Excel_example.CreateSheet(csSheetName2); //操作最开始添加的sheet:(newSheet) Excel_example.SetSheet(2); //添加表头 Excel_example.WriteHeader(1,"第一列"); Excel_example.WriteHeader(2,"第二列"); //添加核心数据 Excel_example.WriteData(1,1,"数据1"); Excel_example.WriteData(1,2,"数据2"); //保存文件 Excel_example.Save(); //关闭文件 Excel_example.Close(); } 7、注意事项 1)一般单个Excel文件包含多个sheet,程序默认打开第一个; 2)指定操作sheet,使用Excel_example.SetSheet(2)函数; 3)打开文件时最左侧的sheet序号为1,新建excel时最新添加的sheet序号为1. 【后记】 本程序主要基于网络CSDN中---“Excel封装库V2.0”---完成,下载地址是:http://download.csdn.net/detail/yeah2000/3576494,在此表示感谢!同时, 1)在其基础上作了小改动,改正了几个小错误,添加了几个小接口; 2)添加了如何使用的例子,原程序是没有的; 3)详细的注释 发现不足之处,还请大家多多指教!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值