zoukankan      html  css  js  c++  java
  • 【VC++学习笔记一】MFC操作Excel

          最近在做一个读取Excel的功能,之前也做过相关的,但总是零零闪闪的,趁着正在劲头上,归纳一下:

          利用Automation添加相关的类,在Excel2010中可以在安装文件夹下直接点击Excel.exe 会生成很多类,建议只导入需要用到的类,不然会很卡。

          用到的类和变量说明:CApplication m_ExlApp;//应用程序类,对应每一个Excel应用程序

                                      CWorkbook wbk;//工作簿
                                      CWorkbooks wbks;//对应每个Exel文档

                                      CWorksheets whts ,m_Wheet;//对应每个文档的每一个sheet表
                                      CRange range;//单元格范围,运用最广泛,获取单元格范围
                                      ColeVarinat var;//读取每个零时变量    

    1.  加载程序:if(!m_ExlApp.CreateDispatch("Excel.Application"))
                              {
                                    AfxMessageBox("无法启动Excel服务器!");
                                    return;
                              }
    2. 连接工作簿、工作表等      COleVariant  avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
                                        m_ExlApp.put_Visible(TRUE);//使Excel可见
                                        m_ExlApp.put_UserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝.
                                        wbks.AttachDispatch(m_ExlApp.get_Workbooks());
                                        wbk =wbks.Open(m_StrExcelPath,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
                                        whts = wbk.get_Sheets();
                                        m_Wheet = whts.get_Item(_variant_t((short)1));
                                        range.AttachDispatch(m_Wheet.get_UsedRange());          
    3. 获得行高、列宽   Var = RangRow.get_RowHeight();
                             CString strHeight;  
                             strHeight.Format(CString((LPCSTR)(_bstr_t)(_variant_t)Var));
                             float fHeight = _tstof(strHeight)*9600/7200;  //转换为像素  列宽同理
    4. 获取单元格批注   CComment com;//批注类
                            com = range.get_Comment();    
                            CString strCom = _T("");
                            strCom = com.Text(vtMissing,vtMissing,vtMissing);
    5. 获取单元格是否含有边框线  CRange RCellBorder;
                                         CBorders BCellBorders;
                                         CBorder BCellBorder;
                                         COleVariant varBorderInfo;
                                         RCellBorder.AttachDispatch(m_Wheet.get_Cells());
                                         RCellBorder.AttachDispatch(RCellBorder.get_Item(COleVariant(nRow),COleVariant(nCol)).pdispVal);
                                         BCellBorders = RCellBorder.get_Borders();
                                         for (long i = 7;i < 11;i++)
                                         {//Left:7 Top:8 Bottom:9 Right 10
                                              BCellBorder = BCellBorders.get_Item(i);
                                              varBorderInfo = BCellBorder.get_LineStyle();
                                               if (-4142 != varBorderInfo.lVal)
                                               {//说明含有边界值,具体的可以自己查看                                            
                                               }
                                          }//从左到右依次判断,并给报表的对应单元格赋值
    6. 获取单元格所含公式       CRange RFormula;
                                      COleVariant varFormula;
                                      CString strFormula = _T("");
                                      RFormula.AttachDispatch(m_Wheet.get_Cells());
                                      RFormula.AttachDispatch(RFormula.get_Item(COleVariant(nRow),COleVariant(nCol)).pdispVal);
                                      varFormula = RFormula.get_Formula();
                                      strFormula = varFormula.bstrVal;
                                      if (0 != strFormula.CompareNoCase(""))
                                     {
                                      }
                                      RFormula.ReleaseDispatch();
    7. 获取字体信息               LOGFONT *pLogFont = NULL; 字体信息存放在这个指针中
                                      CFont0 fTextFont;
                                     CRange RTextFont;
                                     COleVariant varFontInfo;
                                     RTextFont.AttachDispatch(m_Wheet.get_Cells());
                                     RTextFont.AttachDispatch(RTextFont.get_Item(COleVariant(nRow),COleVariant(nCol)).pdispVal);
                                     fTextFont = RTextFont.get_Font();
                                     pCell = (CGridCell*)m_npGridCtrl->GetCell(nRow,nCol);//获取原有单元格的字体
                                     pLogFont = pCell->GetFont();

                                     //字体名称
                                    varFontInfo = fTextFont.get_Name();
                                    CString strFontName(varFontInfo.bstrVal);
                                    strcpy(pLogFont->lfFaceName,strFontName);

                                    //字体高度
                                    varFontInfo = fTextFont.get_Size();
                                    double dHeight = abs(varFontInfo.dblVal * 96/72);
                                    pLogFont->lfHeight = long(dHeight);

                                    //加粗
                                   varFontInfo = fTextFont.get_Bold();
                                    if (varFontInfo.boolVal)
                                   {
                                         pLogFont->lfWeight = 700;
                                   }

                                   //斜体
                                  varFontInfo = fTextFont.get_Italic();
                                  if (varFontInfo.boolVal)
                                  {
                                     pLogFont->lfItalic = TRUE;
                                   }

                                   //下划线 读出单下滑线与多下划线
                                  varFontInfo = fTextFont.get_Underline();
                                  long lUnderLine = varFontInfo.lVal;
                                  if (-4119 == lUnderLine || 2 == lUnderLine)
                                 {
                                     pLogFont->lfUnderline = TRUE;
                                 }

                //第一次写这样的博客,记录学习笔记,成为优秀的程序员,终有一天,我要站在巨人的肩上!

         

  • 相关阅读:
    当下流行的分布式文件系统大阅兵
    smb相关资料
    Linux下将多个静态库(.a)合并成一个静态库文件(.a)的命令操作,方法一
    IBInspectable的使用
    iOS开发拓展篇——如何把项目托管到GitHub
    iOS开发拓展篇-XMPP简单介绍
    iOS开发拓展篇—应用之间的跳转和数据传递
    使用NSURLSession获取网络数据和下载文件
    李洪强实现横向滚动的View<二>
    李洪强实现横向滚动的View<一>
  • 原文地址:https://www.cnblogs.com/OldGlory/p/3227899.html
Copyright © 2011-2022 走看看