VC中彻底玩转Excel

合集下载

使用VC++操作Excel文件(OLE)

使用VC++操作Excel文件(OLE)

使用VC++操作Excel文件(OLE)使用VC++操作Excel文件 - [程序设计]2008-07-17博主ps:在上看到的这篇文章,但是由于这篇文章写得比较早,有些地方在office2007的情况下稍有出入。

所以改动了一点。

本文档适用于:•Microsoft Foundation Classes (MFC), Microsoft Visual C++, 32-bit Editions, version 6.0 以上•Microsoft OLE 库第一步:建立一个自动化工程1.启动VC 6.0,打开新建对话框,新建一个MFC AppWizard(exe)工程,这里工程明设置为TestExcel。

2.进入MFC 应用程序向导,选择基本对话框,直接点击完成:3.打开MFC ClassWizard窗口(查看—>建立类向导),选择Automation,单击Add Class按钮,选择From a type library...,弹出文件选择对话框,之后定位到Microsoft Office的安装目录(通常为C:\Program Files\Microsoft Office\Office12),选择EXCEL.exe,确定后,弹出Confirm Classes窗口,选择列表中的所有类,单击OK 按钮。

注意原来文章里说的文件名是EXCEL9.OLB,因安装的Office版本不同而有所差异,EXCEL9.OLB对应的是Microsoft Office 2000,微软命名方式为Excel+数字的形式,Office版本越高,数字越大。

在我用的office2007里直接用的exe文件4.返回编辑器,查看工程文件,可发现多了EXCEL.H及EXCEL.CPP两个文件。

5.打开stdafx.h头文件确保包含如下头文件:#include <afxdisp.h>#include "excel9.h"6.打开TestExcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:BOOL CTestExcelApp::InitInstance(){if( !AfxOleInit() ){AfxMessageBox("初始化Ole出错!");return FALSE;}AfxEnableControlContainer();............return FALSE;}为保证编译时不产生重复定义错误,打开excel9.h文件,在文件开始位置加入如下代码:#if !defined _HEAD_FILE_EXCEL9_#define _HEAD_FILE_EXCEL9_相应的,在文件末尾加入:#endif到此,OLE自动化工程建立完成。

VC++操作EXCEL表格,附带两个小例子

VC++操作EXCEL表格,附带两个小例子

C++读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑。

由于前两天要做导表工具,比较了常用的方法,总结一下写个短文,1.OLE的方式这个大约是最常用的方式,这个方式其实启动了一个EXCEL的进程在背后读写EXCEL 文件,这个方式的最大好处是什么事情都能做。

包括设置EXCEL的格式,增加删除Sheet,读写单元格,等等。

功能几乎是最全的,而且使用起来也不是特别的难。

其基本方法都是使用导出的.h文件进行OLE操作,但是由于OLE的接口说明文档不多,想非常完美的使用她们也不是太容易,好在例子也很多。

网上普遍认为OLE速度慢,EXCEL的OLE读写方式也基本一样。

但是读取速度可以改进,如果在读取的加载整个Sheet的Range的全部数据,而不是一个个单元格读取,那么速度还是相对不错。

想想原理也很简单,整体读取减少了OLE的交互次数。

OLE的写入方式一般只能几个进行比较方便,所以速度可能要快很多。

我自己的亲身体会是,一个EXCEL文件,100多列的字段,如果采用一个个单元格的读取方式,1s大约3条左右的记录,如果整体读取,速度可以提高几十倍。

OLE读写EXCEL方式功能很强大,读取速度还可以,但写入速度不高,当然这个方式不可能移植的,而且你必须安装了EXCEL。

2.Basic EXCEL 方式这是CodeProject上的一个推荐开源工程了,/KB/office/BasicExcel.aspx作者是基于EXCEL的文件格式进行的处理。

但是为什么叫Basic EXCEL呢。

他不支持很多东西,公式,文件格式,表格合并等(有人说中文支持也不好),所以可以认为他只支持最基本的EXCEL表格,我自己的尝试是如果这个EXCEL文件有其他元素(公式,格式等),使用Basic EXCEL读取会失败。

OLE读写EXCEL方式功能比较弱,由于是直接根据文件格式操作,读写速度都不错,你也不需要按照EXCEL,另外这个方式是可以移植的,但是有一些成本,其代码比较晦涩难懂,而且没有注释,另外即使在Windows平台上,告警也很多。

VC操作Excel

VC操作Excel
31. // pointer.
32. book.AttachDispatch( lpDisp );
33. lpDisp = book.GetSheets();
34. ASSERT(lpDisp);
35. sheets.AttachDispatch(lpDisp);
29. covOptional, covOptional, covOptional, covOptional, covOptional,
30. covOptional, covOptional, covOptional, covOptional ); // Return Workbook's IDispatch
24. ASSERT(lpDisp);
25. books.AttachDispatch(lpDisp); // Attach the IDispatch pointer
26. // to the books object.
63. (long)e->m_wCode,(LPSTR)e->m_strDescription.GetBuffer(512));
64. ::MessageBox(NULL, buf, "COleDispatchException",
65. MB_SETFOREGROUND | MB_OK);
16. covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
17. if(!app.CreateDispatch("Excel.Application"))
18. {
19. AfxMessageBox("Couldn't CreateDispatch() for Excel");

VC操作Excel

VC操作Excel

VC操作Excel之基本操作/sp_daiyq/article/details/61912331、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来操作Excel2、Excel库的插入在我们MFC的工程中,按Ctrl+W打开MFC类向导对话框,点击“Add Class...”->“From a type Library...”,找到你所使用的excel类型库,我使用的在目录C:/ProgramFiles/Microsoft Office/OFFICE11下的“EXCEL.EXE”文件,查找时文件类型选“All Files”,然后添加我们所需要的类,通常以上列举的前6类是必须的,其它的需要时再添加。

如何用VC读取Excel表格中的数据详细介绍

如何用VC读取Excel表格中的数据详细介绍

如何用VC读取Excel表格中的数据详细介绍如何用VC读取Excel表格中的数据详细介绍2007-03-29 17:44首先,我们要明白的是,VC是通过ODBC来访问Excel表格的,也就是说,VC将Excel表格,当作数据库来处理。

当然了,也可以通过读以tab键隔开的文件来处理这样的文件,但是,我还是更加愿意用读取数据库的方式来访问Excel表格。

第二,既然是数据库,那么,就需要建立一个与该库对应的dsn,这个,而且,在建立dsn之前,首先要确定,已经安装了Excel的驱动。

第三,要访问数据库中的表格,就要先打开该表格,如此,就需要一个与之对应的RecordSet。

如此,有如下代码:void CRWExcel::ReadFromExcel(){CDatabase database;CString sSql;CString sItem1, sItem2;CString sDriver;CString sDsn;CString sFile = "Demo.xls";// 将被读取的Excel文件名// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"sDriver = GetExcelDriver();if (sDriver.IsEmpty()){// 没有发现Excel驱动AfxMessageBox("没有安装Excel驱动!");return;}// 创建进行存取的字符串sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);TRY{// 打开数据库,建立与这个Excel对应的Databasedatabase.Open(NULL, false, false, sDsn);CRecordset recset(&database);// 设置读取的查询语句.demo.xls并非文件名,需要在excel中进行//设置,具体文章最后有讲sSql = "SELECT Age, Name FROM DEMO.XLS";// 执行查询语句,打开表格recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);// 获取查询结果while (!recset.IsEOF()){//读取Excel内部数值recset.GetFieldValue("Name ", sItem1);recset.GetFieldValue("Age", sItem2);// 移到下一行recset.MoveNext();}// 关闭数据库database.Close();}CATCH(CDBException, e){// 数据库操作产生异常时...AfxMessageBox("数据库错误: " + e->m_strError);}END_CATCH;}需要注意的是,我们对我们的Excel表格需要进行一些处理,需要先选定我们要读取的数据,之后,选择插入>>名字>>之后,在输入框中输入我们在select语句中用到的表名。

在VC中彻底玩转Excel

在VC中彻底玩转Excel

[原创]在VC中彻底玩转Excel如今Excel是越来越重要了,在我们自己开发的程序中不免要和Excel打交道了。

利用 Automation 技术,我们可以在不去了解数据库的情况下玩转Exce,l而且你会发现一切竟如此轻松!好了,咱们开始吧,我不喜欢用长篇累牍的代码来故弄玄虚,所以下面的代码都是切中要害的片段,总体上是个连贯的过程,包括启动 Exce,l 读取数据,写入数据,以及最后的关闭Exce,l 其中还包括了很多人感兴趣的合并单元格的处理。

特别说明以下代码需要 MFC的支持,而且工程中还要包含 EXCEL2OO0勺定义文件:EXCEL9.,H EXCEL9.CPPVC6.0操作 Excel( 2008-1-22 11:26 )1.建立一个空的单文档程序;2.加入Excel的库文件:在vc+ +的view菜单里面选classwizard 然后选 Automation tab,再选Add Class 选"From a type library.",然后再选你需要的 object library。

(for this example, if you are automating Excel 97, choose the Microsoft Excel 8.0 Object Library; the defaultlocation is C:\Program Files\MicrosoftOffice\Office\Excel8.olb).If you are automating Microsoft Excel 2000, choose Microsoft Excel 9.0 Object Library for which the defaultlocation is the C:\Program Files\MicrosoftOffice\Office\Excel9.olb.If you are automating Microsoft Excel 2002 and Microsoft Office Excel 2003, the object library is embedded inthe file Excel.exe. The default location for Excel.exe in Office 2002 is C:\program Files\MicrosoftOffice\Office10\Excel.exe. The default location for Excel.exe in Office 2003 is C:\programFiles\MicrosoftOffice\Office11\Excel.exe.在 ListCtrl 框中选中 _Application, _Workbook, _Worksheet, Range, Sheets, Workbooks,单击 OK,自动生成 EXCEL8.f和 EXCEL8.CP文件(或者 EXCEL9.I和 EXCEL9.CP或者 EXCELS EXCEL.CPP。

使用VC++操作Excel文件

使用VC++操作Excel文件

我不会飞经验始于总结,进步源于积累(短地址: )<< 解决无法直接打开EXCEL文件的问题 | 首页 | 2008北京奥运会开幕式高清图片(46P) >>搜索最新日志最新评论打开MFC ClassWizard窗口(查看—>建立类向导),选择Automation,单击Add Class按钮,选择From a type library...,弹出文件选择对话框,之后定位到Microsoft Office的安装目录(通常访客/logs/24923682.html[2010/8/20 9:34:10]访问统计: 96302什么是返回编辑器,查看工程文件,可发现多了EXCEL9.H及EXCEL9.CPP两个文件。

打开stdafx.h头文件确保包含如下头文件:#include <afxdisp.h>#include "excel9.h"打开TestExcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:BOOL CTestExcelApp::InitInstance()/logs/24923682.html[2010/8/20 9:34:10]到此,即完成了我们的示例程序,下面将对程序进行详细的说明,如果大家有过使用VisualBasic操作Excel程序的经验,则应该能看懂下面程序:void CTestExcelDlg::OnButton1()/logs/24923682.html[2010/8/20 9:34:10]/logs/24923682.html[2010/8/20 9:34:10]/logs/24923682.html[2010/8/20 9:34:10]/logs/24923682.html[2010/8/20 9:34:10]/logs/24923682.html[2010/8/20 9:34:10]博客大巴博客大巴模板设计:柠檬星球 | 作者:小明/logs/24923682.html[2010/8/20 9:34:10]。

vc利用COM操作excel文件

vc利用COM操作excel文件

// Variables used...
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr;
char buf[200];
{
// 初始化COM库
CoInitialize(NULL);
// 获得EXCEL的CLSID
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if(FAILED(hr)) {
::MessageBox(NULL, "CLSIDFromProgID() 函数调用失败!", "错误", 0x10010);
sab[1].lLbound = 1; sab[1].cElements = 15;
arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
// 初始化数组内容
for(int i=1; i<=15; i++) {
for(int j=1; j<=15; j++) {
}
// Make the call!
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
if(FAILED(hr)) {

VC操纵EXCEL的两种方法

VC操纵EXCEL的两种方法

VC操纵EXCEL的两种方法第一种方法,简单的,用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;READO NLY=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;REA DONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s", m_dbdriver,m_strdir,m_strdi r);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文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着exc el文件的一个个部分,常用的有这几个_application,workbooks,_workbook,workshee ts,_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(); AfxEnableControl Container();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 filechar 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)),COleVa riant(m_name));range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(2)),COleVa riant(m_age));range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(3)),COleVa riant(m_gener));wbk.Save();wbk.Close(avar,COleVariant(strPath),avar);wbks.Close();exlapp.Quit();第二种方法完.。

轻轻松松搞定VC操作Excel之一

轻轻松松搞定VC操作Excel之一

轻轻松松搞定VC操作Excel之⼀时常在论坛上看到有⼈问这个VC操作Word或者Excel有没有书系统地介绍如何去做,有这个必要吗?其实捅破这层窗户纸,你就会恍然⼤悟,原来是这么回事啊!在此我觉得有必要把我⼯作中操纵Excel的⼀点⼩体会拿出来和⼤家共享,也许对初学者能有所帮助,⾼⼿就不要看了。

操作Word请看⽜⼈yingkou的BLOG() .基本步骤如下:⼀、Excel的层次结构ApplicationWorkbooksWorkbook......WorksheetsWorksheet......RangeFontBorders.............⼆、插⼊类型库1、在⼀个已有的MFC⼯程按Ctrl + W 弹出ClassWizard对话框。

2、Add Class...\From a type Library... 在 Office ⽬录中,找到你想使⽤的Excel类型库(Offce2000下,此⽬录在C:\ProgramFiles\Microsoft Office\Office\EXCEL9.OLB)。

选择EXCEL9.OLB此类型⽂件。

3、在弹出的对话框中选择要添加的类,具体选那些类要根据实际情况⽽定。

当然你也可以全选。

三、基本操作当你要选⽤Excel⽣成报表时,表的结构可能有固定的部分,这时做⼀个模板,这样可以减少编码的负担。

加载Excel模板的代码如下。

_Application ExcelApp; // 定义Excel应⽤程序Workbooks wbsBooks;_Workbook wbBook;Worksheets wssSheets;_Worksheet wsSheet;Range rngXls;FontXls font; // 字体BordersXls border; // 边框// 初始化Comif (::CoInitialize( NULL ) == E_INVALIDARG){AfxMessageBox(_T("初始化Com失败!"));}// 创建Excel2000服务器(启动Excel)if ( !ExcelApp.CreateDispatch(_T("Excel.Application"), NULL)){AfxMessageBox(_T("创建Excel2000服务失败!"));::CoUninitialize();}ExcelApp.SetVisible(FALSE); // 隐藏CString strPath;strPath += "C:\\template.xlt"; // 模板的路径CFileFind filefind;if( !filefind.FindFile( strPath ) ){AfxMessageBox( "没有找到模版⽂档,请其查找" );CFileDialog dlg (TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"模版||*.xlt||",NULL );if (IDOK == dlg.DoModal()){strPath = dlg.GetPathName();}}COleVariant vOptional( (long)DISP_E_PARAMNOTFOUND, VT_ERROR );try{wbsBooks.AttachDispatch(ExcelApp.GetWorkbooks(), TRUE);wbBook.AttachDispatch(wbsBooks.Add(COleVariant(strPath)), TRUE );wssSheets = wbBook.GetWorksheets();wsSheet = wssSheets.GetItem(_variant_t("Sheet1")); // Get Sheet1wsSheet.SetName( "Your Sheet" ); // 改名// 得到全部Cells,此时,rngXls 是cells的集合rngXls = wsSheetAcc.GetCells();}catch (CException e){AfxMessageBox( "" )}我们知道在Excel中每个单元格可以⽤A1,A2,C3的形式来表⽰。

vc++ 操作excel文件方法

vc++ 操作excel文件方法

我以前写了个VC操作Excel 2003的例子,是一个Console的程序,你可以修改一下文件保存的路径,然后运行一下看看。

/dukejoe/archive/2007/04/16/1156319.aspx以下是一部分的VC代码,全部的看链接吧。

我就不都粘了VC操作Excel文件保存问题用VC对Excel文件进行写操作后,在程序结束前需要对一些对象进行收尾工作,如调用_Workbook::Save()方法(该方法是Microsoft提供的供VC调用的对Excel文件操作的标准方法,在文件excel9.cpp或excel.cpp中定义)保存文件。

问题就出现在这里,若选取要保存的Excel文件以前不存在则程序创建一个同名的空Excel文件,对Excel 表的操作实际是对其同名副本的操作,Save()方法会触发一个"另存为"的对话框,需要覆盖原来同名的空Excel文件,否则写入Excel的数据会丢失。

若选取的Excel文件已经存在,则调用Save()方法不会触发"另存为"对话框,系统会自动保存写到Excel中的数据。

需要说明的是,在调用Save()前,已经调用过SetAlertBeforeOverwriting(FALSE)和SetDisplayAlerts(FALSE)关掉一些警告窗口了。

若调用SaveAs()方法,虽不会触发"另存为"对话框,但会出抛出“找不到成员”的错误,这时保存写好的Excel文件后并重新打开发现数据还是丢失。

想尽所有办法,可总无法去掉那个讨厌的"另存为"对话框,请各位大虾帮忙。

多谢了!SaveAs()是excelapp的方法吗。

xlApp.ActiveWorkbook.SaveAs "C:\excel.xls"xlApp.Quit我的没有问题。

如今Excel是越来越重要了,在我们自己开发的程序中不免要和Excel打交道了。

c语言excel用法 -回复

c语言excel用法 -回复

c语言excel用法-回复如何在C语言中使用Excel功能?在许多应用程序开发中,经常需要与Excel电子表格进行交互。

Excel是一种非常强大的办公软件,提供了丰富的功能,涵盖了各种数据处理和计算的需求。

C语言是一种高效且功能强大的编程语言,可以使用其灵活性和强大的算法来处理Excel数据。

本文将一步一步地介绍如何在C语言中使用Excel功能。

第一步:安装Excel库在C语言中使用Excel功能,我们需要安装一些Excel库。

目前,有许多可用的Excel库可以选择,如libxls、excelix、libxlsxwriter等。

这些库可以用于读取、写入和修改Excel电子表格。

在选择库的时候,我们需要考虑到库的稳定性、易用性和功能丰富性。

第二步:导入所需的头文件在使用Excel库之前,我们需要导入相关的头文件,以便在代码中使用Excel相关的函数和结构。

根据所选择的Excel库的不同,导入的头文件也会有所不同。

例如,如果选择了libxls库,我们需要导入libxls的头文件,如"#include <xls.h>"。

如果选择了libxlsxwriter库,我们需要导入libxlsxwriter的头文件,如"#include <xlsxwriter.h>"。

第三步:打开Excel电子表格一旦导入了所需的头文件,我们就可以开始使用Excel库。

首先,我们需要打开Excel电子表格。

在大多数Excel库中,可以使用如下的方法打开Excel电子表格:1. 准备要打开的Excel文件的路径和名称。

2. 创建一个与Excel电子表格关联的Excel对象或工作表对象。

3. 使用打开方法打开Excel电子表格。

例如,在libxls库中,我们可以使用xls_open()函数打开Excel电子表格。

其基本用法如下所示:xls_t *xls = xls_open("文件路径");第四步:读取和操作Excel数据一旦成功打开了Excel电子表格,我们可以开始读取和操作Excel数据。

visual C++6.0 操作excel

visual C++6.0 操作excel

使用MFC操作EXCEL文件环境是:win7+vc++6.0+excel2010一、加载1、在VC6.0里创建一个采访对话框的MFC工程,工程名为“TestExcel”,在对话框面板上创建一个OnButoon1按钮。

类视图文件视图2、打开MFCClassWizard窗口(查看—>建立类向导),选择Automation,单击AddClass 按钮,选择Froma type library...,弹出文件选择对话框,之后定位到C:\ProgramFiles\MicrosoftOffice(86)\OFFICE14\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可,为了简便,不出错保留了冗余),如下图。

2.选类视图中的CTestExcel类,双击OnButton1(),在编辑框出现void CTestExcelDlg::OnButton1()函数,在其中加入如下代码:void CTestExcelDlg::OnButton1(){//Workbooks->Workbook ->Worksheets->Worksheet ->Range_Application app; //Excel应用程序接口Workbooks books; //工作薄集合_Workbook book; //工作薄Worksheets sheets; //工作表集合_Worksheet sheet; //工作表Range range; //Excel中针对单元格的操作都应先获取其对应的Range对象Font font;Range cols;//COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用//VARIANT数据类型进行参数传递。

故下列程序中,函数参数都是通过COleVariant类来转换了的。

//covOptional 可选参数的VARIANT类型COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);if( !app.CreateDispatch("Excel.Application") ){this->MessageBox("无法创建Excel应用!");return;}//获取工作薄集合books=app.GetWorkbooks();//添加一个工作薄book=books.Add(covOptional);//获取工作表集合sheets=book.GetSheets();//获取第一个工作表sheet=sheets.GetItem(COleVariant((short)1));//选择工作表中A1:A1单元格区域range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));//设置A1=HELLO EXCEL!"//range.SetValue(COleVariant("HELLO EXCEL!")); //编译有错,注释掉//调整格式,设置粗体font=range.GetFont();font.SetBold(COleVariant((short)TRUE));//选择A2单元格,插入一个公式"=RAND()*100000",并设置A2数字格式为货币形式range=sheet.GetRange(COleVariant("A2"),COleVariant("A2"));range.SetFormula(COleVariant("=RAND()*100000"));range.SetNumberFormat(COleVariant("$0.00"));//选择A:A列,设置宽度为自动适应cols=range.GetEntireColumn();cols.AutoFit();//显示Excel表格,并设置状态为用户可控制app.SetVisible(TRUE);app.SetUserControl(TRUE);}3.在TestExcelDlg.cpp文件的开始处,加一行#include <excel.h>4.按Button按钮,出现一个Excel工作簿,可以在其中输入内容5.当关闭文件时,弹出如下对话框6.选择保存。

VC利用ADO操作Excel

VC利用ADO操作Excel

把Excel当做数据库来操作,步骤如下:1、在stdafx.h中加入#import "c:/program files/commonfiles/system/ado/msado15.dll" no_namespace rename ("EOF", "adoEOF")2、在工程的App类的构造函数中打开要操作的Excel表格_ConnectionPtrpCon_ex;CStringConnectionString;CToolsApp::CToolsApp(){CStringm_strAppPath=_T("");CStringexcel_path=_T("");CStringcon_str=_T("");//程序所在目录路径TCHAR exeFullPath[MAX_PATH];GetModuleFileName(NULL,exeFullPath,MAX_PATH);CStringstr;str.Format("%s",exeFullPath);m_strAppPath = str.Left( str.ReverseFind( '//' ) );excel_path = m_strAppPath+"//Database"+"//新全国图数据统计模版--.xls";CoInitialize(NULL);//打开excel/*"HDR=Yes;" 表示工作表的第一行是表头,没有数据。

"HDR=No;"与之相反。

"IMEX=1;"告诉驱动程序始终将"intermixed"数据类型(numbers, dates, strings等等)作为文本型读取。

VC2010对Excel的操作

VC2010对Excel的操作

VC2010对Excel的操作1.创建新的C++工程创建基于对话框的MFC程序2.添加库、添加Excel类库在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 11.0 Object Library<1.5>”在接口列表框中选择需要的类,在此,我们选择_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。

可以看到,六个类被添加了进来。

3.修改头文件分别将加进来的六个头文件上面的“#import"C:\\ProgramFiles\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace”注释掉。

4.添加头文件在stdAfx.h头文件中添加加进来的这几个头文件#include"CApplication.h"#include"CRange.h"#include"C Workbook.h"#include"C Workbooks.h"#include"C Worksheet.h"#include"C Worksheets.h"5.修改错误编译,会出现两个错误:…\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足…\crange.h(335): error C2059: 语法错误:“,”双击错误提示,定位在错误行,VARIANT DialogBox(){VARIANT result;InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);return result;}将该函数名“DialogBox()”前面加“_”下划线,即“_DialogBox()”,这样就可以编译成功了。

VC操作Excel文件编程相关内容总结

VC操作Excel文件编程相关内容总结

VC操作Excel文件编程相关容总结最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要报给其他单位)。

所以查阅了一下相关的VC的Excel编程操作,总结一下吧:(所有资料来源于网络)利用VC操作Excel的方法至少有两种1 .利用ODBC把Excel文件当成数据库文件,来进行读、写、修改等操作,网上有人编写了CSpreadSheet类,提供支持。

2. 利用Automation(OLD Automation)方法。

将Excel当成组件服务器,利用VBA。

又分为基于MFC的和SDK两种。

主要研究了一下第二种基于MFC的OLE编程方法。

一、Excel的对象模型在对Excel编程之前首先要了解微软Excel 对象(Object)模型。

(Parent-Child 关系)图 1 Office 应用程序对象模型(Excel)From msdn 其中:Application:代表应用程序本身。

即Excel应用程序Workbooks:是Workbook 的集合,代表了工作薄。

Worksheets:是Worksheet的集合,是Workbook的子对象。

Range:是Worksheet的子对象,可以理解为Sheet中一定围的单元格。

Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。

二、VC操作Excel的初始化过程1、导入Excel库文件。

首先打开Class Wizard,点击"Add class"按钮下的"From a type Library"导入 office安装目录下的"excel.exe"(适用于 Excel2003),然后选择需要用的一些类,比如_Application, _Workbook, Workbooks, Worksheets,_Wroksheet,Range, Shapes等。

点击确定后,系统会在你的程序目录下生成excel.h和excel.cpp两个文件,在要使用这些导入的类时加入#include "Excel.h"即可。

vc中EXCEL的读写操作

vc中EXCEL的读写操作

VC操作Excel1、Excel的层次结构:ApplicationWorkbooksWorkbook......WorksheetsWorksheet......RangeFontBorders.............2、插入类型库(1)、在一个已有的MFC工程按Ctrl + W 弹出ClassWizard对话框。

(2)、Add Class...\From a type Library... 在Office 目录中,找到你想使用的Excel类型库(Offce2000下,此目录在C:\Program Files\Microsoft Office\Office\EXCEL9.OLB;Offce2003下,此目录在C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE)。

选择EXCEL9.OLB或EXCEL.EXE;(3)、在弹出的对话框中选择要添加的类,具体选那些类要根据实际情况而定。

当然你也可以全选3、基本操作当你要选用Excel生成报表时,表的结构可能有固定的部分,这时做一个模板,这样可以减少编码的负担。

加载Excel模板的代码如下://(1)定义变量:下面的类型都是通过加入EXCEL类型库之后自动定义的C++类,你可以自由使用。

(_Application,Workbook……等)_Application ExcelApp; // 定义Excel应用程序Workbooks wbsBooks;_Workbook wbBook;Worksheets wssSheets;_Worksheet wsSheet;Range rngXls;FontXls font; // 字体BordersXls border; // 边框//(2)初始化Com,一般放在应用程序类的初始化函数中,并在结束时使用::CoUninitialize();释放COM库。

if (::CoInitialize( NULL ) == E_INVALIDARG){AfxMessageBox(_T("初始化Com失败!"));}//(3)创建Excel2000服务器(启动Excel)if ( !ExcelApp.CreateDispatch(_T("Excel.Application"), NULL)){AfxMessageBox(_T("创建Excel2000服务失败!"));::CoUninitialize();}ExcelApp.SetVisible(FALSE); // 隐藏//(4)打开模板CString strPath;strPath += "C:\\template.xlt"; // 模板的路径CFileFind filefind;if( !filefind.FindFile( strPath ) ){AfxMessageBox( "没有找到模版文档,请其查找" );CFileDialog dlg (TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"模版||*.xlt||",NULL );if (IDOK == dlg.DoModal()){strPath = dlg.GetPathName();}}//(5)操作strPath模板路径COleVariant vOptional( (long)DISP_E_PARAMNOTFOUND, VT_ERROR );try{wbsBooks.AttachDispatch(ExcelApp.GetWorkbooks(), TRUE);wbBook.AttachDispatch(wbsBooks.Add(COleVariant(strPath)), TRUE );wssSheets = wbBook.GetWorksheets();wsSheet = wssSheets.GetItem(_variant_t("Sheet1")); // Get Sheet1wsSheet.SetName( "Your Sheet" ); // 改名// 得到全部Cells,此时,rngXls 是cells的集合rngXls = wsSheetAcc.GetCells();}catch (CException e){AfxMessageBox( "" )}我们知道在Excel中每个单元格可以用A1,A2,C3的形式来表示。

VC++操作EXCEL表格,附带两个小例子

VC++操作EXCEL表格,附带两个小例子

C++读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑。

由于前两天要做导表工具,比较了常用的方法,总结一下写个短文,1.OLE的方式这个大约是最常用的方式,这个方式其实启动了一个EXCEL的进程在背后读写EXCEL 文件,这个方式的最大好处是什么事情都能做。

包括设置EXCEL的格式,增加删除Sheet,读写单元格,等等。

功能几乎是最全的,而且使用起来也不是特别的难。

其基本方法都是使用导出的.h文件进行OLE操作,但是由于OLE的接口说明文档不多,想非常完美的使用她们也不是太容易,好在例子也很多。

网上普遍认为OLE速度慢,EXCEL的OLE读写方式也基本一样。

但是读取速度可以改进,如果在读取的加载整个Sheet的Range的全部数据,而不是一个个单元格读取,那么速度还是相对不错。

想想原理也很简单,整体读取减少了OLE的交互次数。

OLE的写入方式一般只能几个进行比较方便,所以速度可能要快很多。

我自己的亲身体会是,一个EXCEL文件,100多列的字段,如果采用一个个单元格的读取方式,1s大约3条左右的记录,如果整体读取,速度可以提高几十倍。

OLE读写EXCEL方式功能很强大,读取速度还可以,但写入速度不高,当然这个方式不可能移植的,而且你必须安装了EXCEL。

2.Basic EXCEL 方式这是CodeProject上的一个推荐开源工程了,/KB/office/BasicExcel.aspx作者是基于EXCEL的文件格式进行的处理。

但是为什么叫Basic EXCEL呢。

他不支持很多东西,公式,文件格式,表格合并等(有人说中文支持也不好),所以可以认为他只支持最基本的EXCEL表格,我自己的尝试是如果这个EXCEL文件有其他元素(公式,格式等),使用Basic EXCEL读取会失败。

OLE读写EXCEL方式功能比较弱,由于是直接根据文件格式操作,读写速度都不错,你也不需要按照EXCEL,另外这个方式是可以移植的,但是有一些成本,其代码比较晦涩难懂,而且没有注释,另外即使在Windows平台上,告警也很多。

VC操作Excel之基本操作

VC操作Excel之基本操作

VC操作Excel之基本操作// 变量的定义_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); 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); // 得到Worksheetssheets.AttachDispatch(book.GetWorksheets(),true); // 得到Worksheetsheet.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),_vari ant_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)),_vari ant_t((long)(1))).pdispVal ); vResult=range.GetValue(covOptional); switch (vResult.vt) { caseVT_BSTR: // 字符串str=vResult.bstrVal; break; caseVT_R8: // 8字节的数字str.Format("%f",vResult.dblVal); break; case VT_DATE: // 时间格式SYSTEMTIME st; VariantTimeToSystemTime(vResult.date, &amp;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),_va riant_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();。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//这里应该确保strtmp为有效路径,否则的话该函数会自己处理异 常,导致以后的语句没有执行,没有关闭打开的文档
wbMyBook.SaveAs(COleVariant(strtmp),covOptional,covOptional,
covOptional,covOptional,covOptional,0, covOptional,covOptional,covOptional,covOptional);
range.AttachDispatch(usedRange.GetRows());
long iRowNum = range.GetCount();
//已经使
用的行数
range.AttachDispatch(usedRange.GetColumns());
long iColNum = range.GetCount();
//读取第一个单元格的对齐方式,数据类型:VT_I4,读取水平对齐 方式
range.AttachDispatch(wssMysheet.GetCells()); iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal); vResult.lVal = 0; vResult = iCell.GetHorizontalAlignment(); if(vResult.lVal != 0) {
在COM接口中,时常用到Variant,BSTR,SafeArray数据类型。 Variant数据类型是一个联合,可表示几乎所有的类型的数据,具体用 法见MSDN中的相关介绍,类_variant_t是对VARIANT数据类型的封 装。在Excel 2000的VB编程帮助中,如果提到某函数或属性需要一个 值,该值的数据类型通常是Variant,在封装Excel 2000对象的类定义 中,说明了具体需要的数据类型。BSTR是一个包括了字符串和字符串 长度的数据结构,类_bstr_t是对BSTR数据类型的封装。在Excel 2000的VB编程帮助中提到的字符串通常指BSTR。具体函数参数或属 性的数据类型,见封装该对象的类的定义。SafeArray是一个包括数组 和数组边界的结构,数组边界外的内容不允许访问。在Excel 2000的 VB编程帮助中提到的数组是指SafeArray。关于SafeArray的处理, 请见MSDN的相关帮助。 对于缺省参数和缺省值。在VB中,函数的参数可以空缺,在VC++中 不允许,必须将所有的参数填写完全。如果你希望指定某个参数为缺省
lpDisp = wbMyBook.GetActiveSheet(); wssMysheet.AttachDispatch(lpDisp);
//读取已经使用区域的信息,包括已经使用的行数、列数、起始
行、起始列
Range usedRange;
usedRange.AttachDispatch(wssMysheet.GetUsedRange());
//合并单元格的列数 range.AttachDispatch(unionRange.GetColumns()); long iUnionColumnNum=range.GetCount();
//合并区域的起始行,列 long iUnionStartRow=unionRange.GetRow(); 行,从1开始 long iUnionStartCol=unionRange.GetColumn(); 始列,从1开始
//设置第一个单元格字体颜色:红色 // CFont font; // range.AttachDispatch(wssMysheet.GetCells()); // range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal); // font(COleVariant((long)0xFF0000));
//起始 //起
}
else if(vResult.boolVal == 0) {
//不是合并的单元格,将第一个单元格合并成2行,3列 range.AttachDispatch(wssMysheet.GetCells());
unionRange.AttachDispatch(range.GetItem(COleVariant((long)1),COleV );
unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)2 unionRange.Merge(COleVariant((long)0)); //合并单元
格 }
//将文件保存为*.xls m_ExcelApp.SetVisible(TRUE); CString strtmp = m_strPath.Le9;.')) + ".xls";
range.AttachDispatch(range.GetItem(COleVariant(iStartRow),COleVaria
vResult = range.GetValue();
CString str;
if(vResult.vt == VT_BSTR)
//字符串
str = vResult.bstrVal;
wbMyBook.AttachDispatch(lpDisp);//得到Workbook
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets());// 得到Worksheets
//得到当前活跃sheet,如果有单元格正处于编辑状态中,此操作不 能返回,会一直等待
// {
//
AfxMessageBox("无法启动Excel服务器!");
//
return;
// }
//app.SetVisible(TRUE);
//使Excel可见
//ExcelApp.SetUserControl(TRUE); //允许其它用户控制
Excel
//打开c:\\*.xls
wbsMyBooks.AttachDispatch(m_ExcelApp.GetWorkbooks()); lpDisp = wbsMyBooks.Open(m_strPath,//此处无法打开文档
如今Excel是越来越重要了,在我们自己开发的程序中不免要和 Excel打交道了。利用Automation技术,我们可以在不去了解 数据库的情况下玩转Excel,而且你会发现一切竟如此轻松!
好了,咱们开始吧,我不喜欢用长篇累牍的代码来故弄玄虚,所以
下面的代码都是切中要害的片段,总体上是个连贯的过程, 包括启动Excel,读取数据,写入数据,以及最后的关闭Excel,其中 还包括了很多人感兴趣的合并单元格的处理。
vResult = unionRange.GetMergeCells();
if(vResult.boolVal == -1)
//是合并的单元格
{
//合并单元格的行数
range.AttachDispatch(unionRange.GetRows());
long iUnionRowNum=range.GetCount();
//已经使用
的列数
long iStartRow = usedRange.GetRow();
//已使用
区域的起始行,从1开始
long iStartCol = usedRange.GetColumn();
//已使用
区域的起始列,从1开始
//读取第iStartRow行,第iStartCol列单元格的值 range.AttachDispatch(wssMysheet.GetCells());
switch (vResult.lVal) { case 1: //默认
break; case -4108: //居中
break; case -4131 : //靠左
break; case -4152 : //靠右
break; } }
//垂直对齐方式 iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal); vResult.lVal = 0; vResult = iCell.GetVerticalAlignment(); if(vResult.lVal!=0) {
//关闭所有的book,退出Excel wbMyBook.Close(covOptional, COleVariant(""), covOptional); wbsMyBooks.Close(); //m_ExcelApp.Quit();
另外一篇是
在开发软件时,经常要将数据输出到Excel 2000中,在Excel 2000中对该数据进行进一步地格式化处理或进行计算处理。在Visual Basic中处理起来较简单,Excel 2000的VB编程帮助中有较为详细的 介绍。在Visual C++中如何进行处理了?利用Excel 2000的ActiveX Automate功能,处理起来同VB中类似。但要注意以下几点:
没有问题 covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional);
//合并单元格的处理,包括判断第一个单元格是否为合并单元格, 以及将第一个单元格进行合并
相关文档
最新文档