VC6.0实现读取Excel数据的方法

Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法。具体步骤如下:
 
1.首先要将excel类添加到工程中。

在ClassWizard中,【Add Class】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe;2007应该又独立的lib库,这个没有验证),添加必要的几个类:

// Excel应用对象
_Application  m_oExcelApp;   // Excel程序
_Worksheet  m_oWorkSheet;   // 工作表
_Workbook  m_oWorkBook;   // 工作簿
Workbooks  m_oWorkBooks;  // 工作簿集合
Worksheets  m_oWorkSheets;  // 工作表集合
Range  m_oCurrRange;   // 使用区域

添加到工程中的文件是excel.h和excel.cpp。

2.初始化Com库

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

3.读取文件中的数据

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;

// 打开文件
lpDisp = m_oWorkBooks.Open( strFilePath,
    _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 );

// 遍历整个Excel表格
CStringArray* arrayStr;
arrayStr = new CStringArray[lgUsedRowNum];
for ( int i = 0; i < lgUsedRowNum; )
{
   for ( int j = 1; j <= lgUsedColumnNum; )
   {
   oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
   VARIANT varItemName = oCurCell.GetText();
   CString strItemName;
   strItemName = varItemName.bstrVal;
//         AfxMessageBox( strItemName );
   // 判断是否是合并的单元格
   VARIANT varMerge = oCurCell.GetMergeCells();
   if ( varMerge.boolVal == -1 )
   {
//             AfxMessageBox( _T( "是合并的单元格!" ) );
   }
   else if ( varMerge.boolVal == 0 )
   {
//             AfxMessageBox( _T( "不是合并的单元格!" ) );
   }

   arrayStr[i].Add( strItemName );
   j++;
   }
   i++;
}

// 更新列表控件数据
m_pExcelOperDlg->initListCtrlColumn( lgUsedColumnNum );
m_pExcelOperDlg->updateListCtrlData( arrayStr, lgUsedRowNum );

// 释放二维数组
delete[] arrayStr;

// 关闭
m_oWorkBook.Close( covOptional, COleVariant( strFilePath ), 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进程会自动结束。

补充:本文所述程序实例完整源码点此下载

(0)

相关推荐

  • vc++实现的tcp socket客户端和服务端示例

    Tcp Server 复制代码 代码如下: #include <WinSock2.h>#include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main(){ // initial socket library WORD wVerisonRequested; WSADATA wsaData; int err; wVerisonRequested = MAKEWORD(1, 1); err = WSASta

  • vc中float与DWORD的互想转换实现代码

    引子:在看<龙书>的时候有个float到DWORD的转换函数不理解. DWORD d3d::FtoDw(float f) { return *((DWORD*)&f); } 背景: 有些函数需要传入DWORD类型的变量,但是该变量的实际意义是用小数来表示的.这里就需要在不改变float本身值的情况下传入一个DWORD变量. 一段网上的代码 DWORD dw = 0; float f1 = 0.25; cout<<"f1 = "<<f1<

  • VC++中的字体设置方法详解

    VC++中static text字体改变 窗口都有2个和字体有关的函数:CWnd::GetFont()和SetFont(CFont*, BOOL);1)CFont* pFont = m_static.GetFont(); 2)LOGFONT LogFont;pFont->GetLogFont(&LogFont); 3)对LogFont直接操纵修改里面的字体选项 //如LogFont.lfUnderline = 1;设置下划线 LogFont.lfHeight=30;       //字体大小

  • VC定时器的用法实例详解

    本文实例讲述了VC中定时器的用法,分享给大家供大家参考.具体用法分析如下: 定时器在VC中的使用频繁,其原型为: 复制代码 代码如下: WINUSERAPI UINT WINAPI SetTimer ( HWND hWnd , UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); 其中的参数用法如下: hWnd       是欲设置定时器的窗体句柄.定时时间到时,系统会向该窗体发送WM_TIMER消息. nIDEvent     定时器标识符.

  • VC List Control控件如何删除选中的记录实例详解

    VC List Control控件如何删除选中的记录实例详解 实例代码: OnButtonDelete() { POSITION pos = m_list.GetFirstSelectedItemPosition(); int idx = m_list.GetNextSelectedItem(pos); while (idx != -1){ LVITEM lvi; lvi.iItem = idx; lvi.iSubItem = 0; lvi.mask = LVIF_IMAGE; if (m_li

  • VC WinExec打开指定程序或者文件的方法

    ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow); ⑵ 参数: lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数). uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值. ⑶ 返回值: 若函数调用成功,则返回值大于31.若函数调用失败,则返回值为下列之一: ① 0:系统内存或资源已耗

  • VC双画布消除屏幕闪烁实例详解

    VC双画布消除屏幕闪烁实例详解 在vc中贴图时,直接贴图到屏幕的CDC,会因为图面贴入的时间不同而造成屏幕的闪烁.解决这个问题的办法是先把图面画到内存画布上,在一次画到屏幕,内存映射到屏幕很快,所以不会造成闪烁. 实例代码: CDC m_dcMem; //创建内存画布 CBitmap m_bmpMemDC; //创建内存画布的 //初始化内存画布 CDC* pDC = GetDC(); if(pDC->GetSafeHdc()) { if(!m_dcMem.CreateCompatibleDC(

  • VC6.0实现读取Excel数据的方法

    Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法.具体步骤如下:   1.首先要将excel类添加到工程中. 在ClassWizard中,[Add Class],在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe:2007应该又独立的lib库,这个没有验证),添加必要的几个类: // Excel应用对象 _Application m_oExcelApp; // Excel程序 _Worksheet m_oW

  • R语言读取excel数据的方法(两行命令)

    安装库 安装xlsx install.packages("xlsx") 使用 library(xlsx) ray = read.xlsx('D:/Code/R/Data in Excel/Chapter 8/gamma-ray.xls',1) 后面的参数,第一个放地址,第二个放具体sheet页(这里除了可以放数值之外,还可以放对应的名字(字符串)).除此之外,还可以使用encoding="utf-8"的方式来定义使用中文数据. 效果: > a = read.x

  • C#利用Openxml读取Excel数据实例

    本文实例讲述了C#利用Openxml读取Excel数据的方法,分享给大家供大家参考.具体分析如下: 这里有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.FromOADate(double d)转换为时间. 可是缺点的地方就是,如果Cell.DataType ==NULL, 根本无法确认这个数据到底是 浮点型还是[被转换为了日期的浮点数].查阅了很多国外资料,的确国外博客有一部分都反映

  • Android开发实现读取excel数据并保存为xml的方法

    本文实例讲述了Android开发实现读取excel数据并保存为xml的方法.分享给大家供大家参考,具体如下: 前阵子,公司请外面人翻译了一些android中values中的一些strings,然而保存的都是excel格式,如果单纯的将excel中的数据粘贴到指定的xml中的话,工作量非常的大,于是,自己写了个简单的demo,将excel中的数据读取并保存为xml对应的数据,下面的demo和图片展示: 1.数据保存在BeanValue中,包括key和value,方便后续数据读取 package c

  • Python3读取Excel数据存入MySQL的方法

    Python是数据分析的强大利器. 利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据处理. 这里向大家分享python3如何使用xlrd读取excel,并使用Python3操作pymysql模块将数据存入Mysql中,有需要的朋友们一起来看看吧. 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. python操作excel主要用

  • c#读取excel数据的两种方法实现

    方法一:OleDb: 用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不太灵活,不过可以在 DataTable 中对数据进行一些删减修改. 优点:读取方式简单.读取速度快 缺点:除了读取过程不太灵活之外,这种读取方式还有个弊端就是,当Excel数据量很大时.会非常占用内存,当内存不够时会抛出内存溢出的异常. 不过一般情况下还是非常不错的. (代码比原文相较有所修改) DataTable GetDataFromExcelByConn(bool hasTitle = false)

  • Android应用读取Excel文件的方法

    本文实例讲述了Android应用读取Excel文件的方法.分享给大家供大家参考,具体如下: ReadExcel.java文件: public class ReadExcel extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

  • C#基于COM方式读取Excel表格的方法

    本文实例讲述了C#基于COM方式读取Excel表格的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using Sys

  • ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】

    本文实例讲述了ThinkPHP框架实现导出excel数据的方法.分享给大家供大家参考,具体如下: 在ThinkPHP框架下,导出excel数据的方法示例: 在操作前,应该在系统框架的扩展目录中添加ORG库,即要包含ThinkPHP\Extend\Library\ORG\Util\PHPExcel.class.php文件及其相关支持文件. <?php header("Content-type: text/html; charset=utf-8"); class MesTestAct

  • Python3.6+selenium2.53.6自动化测试_读取excel文件的方法

    环境: 编辑工具: 浏览器: 安装xlrd 安装DDT 一 分析 1 目录结构 2 导入包 二 代码 import xlrd class ExcelUtil(): def __init__(self,excelPath,sheetName="Sheet1"): self.data = xlrd.open_workbook(excelPath) self.table = self.data.sheet_by_name(sheetName) #获取第一行作为key值 self.keys =

随机推荐