两种VC操纵EXCEL的方法.

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版本亦可... 阅读详情

           第一种方法,简单的,用CDatabase实现. 程序是一个基于对话框的,步骤:

    A,为了避免代码重复,设置下面几个全局变量(类范围的),要引入头文件<afxdb.h>

              CDatabase m_db;                     //数据库
             CString m_dbdriver;                 //要生成的EXCEL文件的目录
             char m_path[MAX_PATH];       //获取路径用的数组
               CString m_strdir;                      //包括EXCEL文件名在内的路径名.
               CString m_strsql;                    //SQL命令语句,用m_db可直接执行.

B,在OnInitDialog方法中,生成一个xls文件,并插入两条记录,可在TRY语句中进行,因为这里面要创建一张表,当再次启动程序时,会有异常发生,说表已经存在了,这时就避免了重复创建和插入.代码如下:

m_dbdriver="MICROSOFT EXCEL DRIVER (*.XLS)";
 GetCurrentDirectory(MAX_PATH,m_path);
 m_strdir=m_path;
 m_strdir+="//test.xls";             //上面初始化各个变量.
 m_strsql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s",m_dbdriver,m_strdir,m_strdir);
 TRY
 { 
  if (m_db.OpenEx(m_strsql,CDatabase::noOdbcDialog))
  {
   m_strsql="Create Table OdbcExl(Name Text,Age Number,Gener Text)";
   m_db.ExecuteSQL(m_strsql);
   m_strsql="Insert Into OdbcExl(Name,Age,Gener) Values('Bob',34,'Male')";
   m_db.ExecuteSQL(m_strsql);
   m_strsql="Insert Into OdbcExl(Name,Age,Gener) Values('Jane',23,'Female')";
   m_db.ExecuteSQL(m_strsql);

   m_db.Close();
  }
 
 }
 CATCH_ALL(e)
 {
 // e->ReportError();
  m_db.Close();
  return FALSE;
 }
 END_CATCH_ALL;

C,其实上面已经达到了答题人的要求,但作为一个程序,这也太不像话了,于是我又稍微加了点不值一提的东西,在对话框上输入信息,再插入到EXCEL表中去,这一切都在按下"插入"按钮后发生:

 UpdateData();

 m_strsql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s", m_dbdriver,m_strdir,m_strdir);

 TRY
 { 
  if (m_db.OpenEx(m_strsql,CDatabase::noOdbcDialog))
  {
   m_strsql.Format("Insert into OdbcExl(Name,Age,Gener)Values('%s',%d,'%s')",m_name,m_age,m_gener);
   m_db.ExecuteSQL(m_strsql);
  }
 }
 CATCH_ALL(e)
 {
  e->ReportError();
 // db.Close();
 }
 END_CATCH_ALL;
 m_db.Close();

可以说,只要对CDatabase稍有了解,对SQL语句稍有了解,这个问题就很容易解决,如果要说这是一个针对Excel文件操作的方法,那是因为在OpenEx初始化数据库对象(不是"打开"哦)时用的文件后缀名为.xls而已,我们可以像在普通的数据库中一样进行其他操作,如用SELECT语句来读取EXCEL文件的内容等, 第一种方法完.

下面是第二种方法,这里涉及的原理要复杂一些了,传说中的OLE(对象链接与嵌入)技术在这里用上了,EXCEL.EXE作为一个组件服务器,应用程序作为客户端......,还是直接写过程吧,头晕晕的,只能平铺直述了.

A,从classwizard中add class处from type library,去office的安装目录下引入excel.exe(这是office 2003的选择,其他版本都是用olb文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着excel文件的一个个部分,常用的有这几个_application,workbooks,_workbook,worksheets,_worksheet,Range,它们分别代表不同的意义._application代表了EXCEL服务器,workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks), _workbook就是一个表,相当于MDI中的一个视窗, worksheets表示所有的表单,每个表都可能有很多表单(建立一个Excel文件之后,打开,可以看到有sheet1,sheet2等,所有这些sheetn就组成了worksheets), _worksheet就表示一个表单, range表示元素的集合. 搞清楚上面这几个名词的意思非常重要.

B,在dlg.h中声明下面几个变量:

 _Application exlapp;   //组件服务器的各个classes
 _Workbook wbk;
 Workbooks wbks;
 _Worksheet wht;
 Worksheets whts;
 LPDISPATCH lpDisp;
 并在app.cpp的InitInstance方法中加入下面两句AfxInitOle(); AfxEnableControlContainer();

C,这里我没有像上面一样完全用程序来生成一个Excel文件,而是在开始时就在当前目录下生成了一个Excel文件,在对话框上我设置了两个按钮,下面是"显示"按钮的代码:
 //创建Excel服务器
 if(!exlapp.CreateDispatch("Excel.Application"))
 {
  AfxMessageBox("无法启动Excel服务器!");
  return;
 }
 COleVariant  avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 exlapp.SetVisible(TRUE);//使Excel可见
 exlapp.SetUserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝.
 
 //Open an excel file
 char path[MAX_PATH];
 GetCurrentDirectory(MAX_PATH,path);
 CString strPath = path;
 strPath += "//VCOpExcel";

 wbks.AttachDispatch(exlapp.GetWorkbooks());
 
 lpDisp=wbks.Open(strPath,
  avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
 
 wbks.ReleaseDispatch();
 exlapp.ReleaseDispatch();

D,与上面第一种方法一样,可以插入记录:

 UpdateData();     //读入数据
 if (""==m_name)     //判断名字输入有效
 {
  MessageBox("Please input a right name");
  return;
 }
 if (0>=m_age||100<=m_age)  //判断年龄输入有效
 {
  MessageBox("Please input a right age");
  return;
 }

 char *p=strupr(_strdup(m_gener));
 if (strcmp(p,"FEMALE")&&strcmp(p,"MALE")) //判断性别输入有效
 {
  MessageBox("Please input a right gener");
  return;
 }
 

 Range range;
 Range usedRange;
 COleVariant  avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 
 if(!exlapp.CreateDispatch("Excel.Application")) //启动服务器
 {
  AfxMessageBox("无法启动Excel服务器!");
  return;
 }
 char path[MAX_PATH];
 GetCurrentDirectory(MAX_PATH,path);
 CString strPath = path;
 strPath += "//VCOpExcel";
 wbks.AttachDispatch(exlapp.GetWorkbooks());
 lpDisp=wbks.Open(strPath,            //初始化.
  avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
 wbk.AttachDispatch(lpDisp);
 whts.AttachDispatch(wbk.GetWorksheets());
 lpDisp=wbk.GetActiveSheet();
 wht.AttachDispatch(lpDisp);
 
 
 
 usedRange.AttachDispatch(wht.GetUsedRange());
 range.AttachDispatch(usedRange.GetRows());
 long iRowNum=range.GetCount();//已经使用的行数
 range.AttachDispatch(wht.GetCells());
 
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(1)),COleVariant(m_name));
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(2)),COleVariant(m_age));
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(3)),COleVariant(m_gener));
 
 wbk.Save();
 wbk.Close(avar,COleVariant(strPath),avar);
 wbks.Close();
 exlapp.Quit();

第二种方法完.

两种VC操纵EXCEL的方法 第一种方法,简单的,用CDatabase实现. 程序是一个基于对话框的,步骤:     A,为了避免代码重复,设置下面几个全局变量(类范围的),要引入头文件               CDatabase m_db;                     //数据库              CString m_dbdriver;                 //要生成的EXC 阅读详情

相关推荐

VC操作Excel插入行

VC操作Excel插入行

excel之单元格格式/设置/

http://blog.csdn.net/shuilan0066/article/details/7925023 示例---将所有单元格设置为文本格式:   [cpp] view plaincopyprint? _Application app;       //Excel应用程序接口  Workbooks books;        //工作薄集合  _W

bai_lu_sz的专栏 2950

VC++的Excel插入数据实例

本源码演示如何用VC建立一个新的工作簿,并向其单元格中添加一条数据,它也可以完成在指定行之前插入一行新数据。   

vc操作Excel

源地址:http://blog.csdn.net/shuilan0066/article/details/7936376 设置篇 1 设置单元格的值   1) 选中指定单元格,使用SetValue设置值 CellName.Format(_T("A%d"),i);//单元格的名称 range.AttachDis

XuePiaoFei1的专栏 904

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1906

ADRC自抗扰控制:工程抗扰“黑科技”,附C代码实战!

自抗扰控制(ADRC)是一种革新性的强鲁棒控制策略,通过主动估计和补偿系统扰动,无需精确数学模型即可实现优异控制性能。本文详细解析ADRC三大核心组件:跟踪微分器(TD)实现指令柔化,扩张状态观测器(ESO)实时估计总扰动,非线性状态反馈(NLSEF)完成动态补偿。针对二阶系统,文章提供完整的参数设计方法和C语言实现框架,包括关键函数fhan和fal的代码实现。ADRC将复杂对象"线性化"为积分器串联系统,显著提升抗扰能力,特别适用于电机控制、飞行器姿态等存在模型不确定性和强干扰的场景。

技术工作者 1734

excel数据表转成insert语句插入数据库

有时候得到的是一张数据图表,要将这张图表完完全全复制粘贴到数据库中是一个比较复杂的事情,如果只是一个晓得数据库,还可以一行一行的输入,但是如果是一张大的数据表的话,这个工作量就会非常大,现在为大家介绍一个简单的方法。 数据如下: 1、把excel的数据转成inser into ,在F的第一行中放入:=CONCATENATE(“(“,A2,”,’”,B2,”’,”,C2,”,’”,D2,”’...

晓丫头的博客 1万+

上机笔试题目:取出指定条件二维数组的子数组

取出指定条件二维数组的子数组: 1)传入参数为: 参数一:String[][]sArray2字符串二维数组 参数二:Stringkey字符串 参数三:StringkeyFormat含匹配符的字符串,如下:%0-%1,其中%x含义如为:一维数据列序号为x的值。 keyFormat 可以为 %0-%1-%2,%0-%3-%8-%x...... 例子如下...

91奔跑的蜗牛 636

VC操作EXCEL

Excel为发人员提供了强大的外部接口,方便开发人员进行二次开发。最近笔者就采用excel 的automation技术成功地解决了excel报表的自动生成功能.<br />首先给大家介绍一下报表创建模块的组成,如下图所示<br /> <br /><br /> <br />模版文件。由于笔者设计的报表都是周期性的固定报表,做成模版更适合数据的读写操作和图表的生成,所以将全部的报表归纳整理生成了几类模版。<br />      模版描述文件。主要纪录数据写在那个行那个列,那个图表对应什么类型的数据。它跟随模版文

Augusdi的专栏 1万+

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码,仅供学习及设计参考。

GJZGRB的博客 1416

Python爬虫教程:抓取地方政府网站的公开文件与政策信息

Web爬虫是指一种自动化脚本,用于模拟人类浏览器访问网页、提取网页内容的数据抓取工具。发送请求到目标网页;获取网页内容;解析网页内容,提取所需数据;将数据保存或进一步处理。爬虫可以抓取各种形式的数据,如文本、图片、文件等。本教程将重点展示如何抓取地方政府网站上公开的政策文件、公告等信息。许多政府网站都会采取一定的反爬虫措施,防止大量数据被爬取。IP封锁:如果短时间内大量请求来自同一IP,可能会被封锁。验证码:一些网站会使用验证码来验证访问者是否为机器人。动态加载。

2201_76125261的博客 1981

python通过Excel表格读取存储数据

库:openpyxl from openpyxl import load_workbook #定义一个Excel的操作类 class ExcelOperate(): def __init__(self,excel_path,excel_sheet_name): ''' :param excel_path: 测试数据Excel文件路径 :param excel_sheet_name: excel文件sheet页名称 ''' .

weixin_39274808的博客 963

(王道408考研数据结构)第一章绪论-第二节1:算法的基本概念、算法的特性及设计要求

算法(Algorithm):是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作王道视频课中讲到了一个例子,展示了算法就是解决问题的特定步骤的描述对于给定的问题可以有多种多样的算法来解决,只不过这些算法有各自的优点和缺点。

快乐江湖的博客 2682

VC操纵EXCEL的两种方法

 第一种方法,简单的,用CDatabase实现. 程序是一个基于对话框的,步骤:     A,为了避免代码重复,设置下面几个全局变量(类范围的),要引入头文件              CDatabase m_db;                     //数据库             CString m_dbdriver;                 //要生成的EXCEL文件

JiangRB的专栏 519

RK3588 部署 YOLO26 目标检测:PT → ONNX → RKNN 全流程

YOLO26n 在 RK3588 上 INT8 量化后 NPU 推理约 15ms,系统 FPS 约 55,可以覆盖边缘端实时检测需求。模型从 PT 到 RKNN 的转换要用opset=11避免算子兼容问题。先用 YOLO26n + 640 输入跑通全链路,确认推理结果正确后再做性能调优。

m0_64661770的博客 303

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

m0_51579041的博客 1万+

在VC中使用Automation操纵Word和Excel

在VC中使用Automation操纵Word和Excel 最近要在程序中添加一个将程序中的图片和数据输出到Word的功能并且需要将数据导出到Excel,以前从来没弄过,遂首先祭起在优快云的VC/MFC论坛搜索的法宝。输入关键字Word得到n篇帖子,一一看过之后得知有两种方法可以做我所需要的事情,一种是使用Office自带的类型库的方法,另一种是直接使用COM的Automation技术。两种方法比

rivershan的专栏 4306

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VC Excel类

 时常在论坛上看到有人问这个VC操作Word或者Excel有没有书系统地介绍如何去做,有这个必要吗?其实捅破这层窗户纸,你就会恍然大悟,原来是这么回事啊!在此我觉得有必要把我工作中操纵Excel的一点小体会拿出来和大家共享,也许对初学者能有所帮助,高手就不要看了。操作Word请看牛人yingkou的BLOG(http://blog.vckbase.com/yingkou) .基本步骤如下:  

透明果冻 5847

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 浮点数表示及其实现.
下一篇: MFC运行时类型识别(MFC RTTI)与动态创建
biblereader
博客等级 码龄20年 11粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值