VC6.0读取Excel文件数据

VC6.0读取Excel文件数据

文件存储在Excel文件中,因此第一步是能够在程序中方便地读取表格数据,这里用的是VC6.0 MFC。文章内容仅供参考,程序不完整。

完整的VC6.0相关程序,需要的可以下载:https://download.csdn.net/download/qq_31569581/10714285


1、电脑上安装VC6.0,Excel2007,其他Office版本亦可(WPS尽量避免);

2、建立一个MFC基于对话框的应用程序工程,名称自己定,这里取名为"Solar",添加一个按钮、一个列表控件,分别取名为"Model2","List1",并为后者添加成员变量"m_ExcelData"。(对于新手如我,列表成员变量如下图)

 

3、在程序入口处CXXXApp:: InitInstance()函数AfxEnableControlContainer();语句之后加入下面几行:

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

假如这个条件不通过就不能运行起程序。在程序的出口处CSolarApp:: ExitInstance()函数return语句之前加入下面这句话:

CoUninitialize();

来释放COM支持库,这样对COM库的支持就已完成。

4、下面要从Office的安装目录中找到对VC操作excel文件的动态库,在某些版本下这个文件是Excel8.olb或Excel9.olb,在我的版本中是excel.exe这个exe也是动态库的形式,是微软公司主要的文件结果之一。选择VC的View(查看)菜单里面的类向导ClassWizad命令,会弹出一个对话框;然后点击Add Class…按钮选择From a type library,会弹出一个打开对话框,从这里打开Office安装目录下D:\Program Files\Microsoft Office\Office16\EXCEL.EXE文件,(具体目录视office版本而定)从里面选择几个要用到的类:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, Range,点击OK按钮(不要重复导入,一次性control全选即可)。会在程序中生成一个excel.h和excel.cpp文件,这些文件中包含了刚才我们选择的几个类的代码。下面介绍一下这几个类:

 

扫描二维码关注公众号,回复: 4288894 查看本文章

  在VC操纵excel的exe动态库里面有好多个对象模型,就是刚才在创建过程中看到的那个列表,但是经常用到的有这么几个:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, Range,Charts和_Chart,最后面的两个是用来操作图表的,这里没有用到所以这里也就不记录了。

  5、准备工作做好之后,接下来开始实现按钮功能:按下之后读取Excel表格数据,并显示在列表控件中。这里只是进行简单地显示,没有给出具体的处理过程及结果图像。(这只是部分实例)

 在头文件"afxstd.h"中添加以下几个头文件(有些电脑环境可能不必全部加),注意别重复添加某些头文件。

#include <comdef.h>
#include <comutil.h>
#include <OAIDL.H>
#include <afxdisp.h>
#include "excel.h"

 若编译报重定义错误,解决方法是在"excel.h"头文件中的头部添加

#if !defined _HEAD_FILE_EXCEL9_ 
#define _HEAD_FILE_EXCEL9_

   在其尾部添加:

#endif

 在对话框初始化函数BOOL CSolarDlg::OnInitDialog()中添加列表控件风格设置语句:

m_Exceldata.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

OK,在函数BOOL CSolarDlg::OnModel2()中添加数据读取及显示代码:

       _Application m_oExcelApp;
       Workbooks m_oWorkSheets;
       _Worksheet m_oWorkSheet;
       Workbooks m_oWorkBooks;
       _Workbook m_oWorkBook;
       Range m_oCurrRange;
       if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) ) 
       {
           ::MessageBox( NULL, _T( "创建Excel服务失败!" ), _T( "错误提示!" ), MB_OK | MB_ICONERROR); 
          exit(1); 
      }
  
      //设置为显示
      m_oExcelApp.SetVisible(FALSE);
      m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //没有这条语句,下面打开文件返回失败。
  
      LPDISPATCH  lpDisp = NULL;
      COleVariant covTrue((short)TRUE);
      COleVariant covFalse((short)FALSE);
      COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
      Range       oCurCell;
  
      CString FilePathName;
      CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框
      if(dlg.DoModal() == IDOK)
      {
          FilePathName = dlg.GetPathName();
          /*
          (1)GetPathName();取文件名全称,包括完整路径。取回C:\\WINDOWS\\TEST.EXE
          (2)GetFileTitle();取回TEST
          (3)GetFileName();取文件全名:TEST.EXE
          (4)GetFileExt();取扩展名EXE
          */
		  //AfxMessageBox("Open file!.");
      }
      else
      {
          AfxMessageBox("Open file opetation has been canceled.");
          return;
      }
      
      // 打开文件
      lpDisp = m_oWorkBooks.Open( FilePathName, 
                                _variant_t(vtMissing), 
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing),
                                _variant_t(vtMissing) );
      // 获得活动的WorkBook( 工作簿 )
      m_oWorkBook.AttachDispatch( lpDisp, TRUE );
      // 获得活动的WorkSheet( 工作表 )
      m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
      // 获得使用的区域Range( 区域 )
      m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
  
      // 获得使用的行数
      long lgUsedRowNum = 0;
      m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
      lgUsedRowNum = m_oCurrRange.GetCount();
      // 获得使用的列数
      long lgUsedColumnNum = 0;
      m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
      lgUsedColumnNum = m_oCurrRange.GetCount();
      // 读取Sheet的名称
      CString strSheetName = m_oWorkSheet.GetName();
  
      //得到全部Cells,此时,CurrRange是cells的集合 
      m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE ); 
   //AfxMessageBox("Open file!.");
      // 更新列表控件数据
      for ( int j = 0; j < lgUsedColumnNum; ++j)
      {
		  
          if(j == 9)
          {
              m_ExcelData.InsertColumn(j,"Index",LVCFMT_CENTER);
              m_ExcelData.SetColumnWidth(j,40);
              continue;
          }
		  //AfxMessageBox("Open file!.");
         oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(0 + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
		 
          VARIANT varItemName = oCurCell.GetText();
        strItemName = varItemName.bstrVal;
          m_ExcelData.InsertColumn(j,strItemName,LVCFMT_CENTER);
          m_ExcelData.SetColumnWidth(j,80);
		  
      }

      for ( int i = 1; i < lgUsedRowNum; ++i) //标题栏0+1行已经取出,从1+1开始获取数据到29+1
      {
          strItemName.Format("%d",i);
          m_ExcelData.InsertItem(i-1,strItemName);
          m_ExcelData.SetItemText(i-1,0,strItemName);
          for ( int j = 1; j < lgUsedColumnNum; ++j) //1-8
         {
             oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
             VARIANT varItemName = oCurCell.GetText();
             strItemName = varItemName.bstrVal;
 
             // 判断是否是合并的单元格
             VARIANT varMerge = oCurCell.GetMergeCells();
             if ( varMerge.boolVal == -1 )
             {
                  AfxMessageBox( _T( "是合并的单元格!" ) );
             }
             else if ( varMerge.boolVal == 0 )
             {
                  AfxMessageBox( _T( "不是合并的单元格!" ) );
             }
             
             m_ExcelData.SetItemText(i-1,j,strItemName);
         }
     }
 
     // 关闭
     m_oWorkBook.Close( covOptional, COleVariant( FilePathName ), covOptional );
     m_oWorkBooks.Close();
     // 释放
     m_oCurrRange.ReleaseDispatch();
     m_oWorkSheet.ReleaseDispatch();
     m_oWorkSheets.ReleaseDispatch();
     m_oWorkBook.ReleaseDispatch();
     m_oWorkBooks.ReleaseDispatch();
     m_oExcelApp.ReleaseDispatch();
     m_oExcelApp.Quit();    // 这条语句是推出Excel程序,任务管理器中的EXCEL进程会自动结束

 代码中字符串变量strItemName是全局变量,在文件开头声明:

CString strItemName = " ";

须注意的是:

  • 代码中79-92行是为列表添加属性列及名称,第一个属性序号("Index")是人为命名并添加,不是必须的;从第二个属性列开始为表格属性;
  • 代码中23-39行是文件打开过程,选择Excel文件后,下面代码会根据完整文件名进行数据读取;
  • 在VC数组及列表控件中,下标从0开始,而读取Excel表格数据时,索引从1开始。

猜你喜欢

转载自blog.csdn.net/qq_31569581/article/details/83015749