VC++对话框中使用表格控件的方法
VC中操作Excel方法集锦

1、MSDN 上的代码,很好的例子#include "excel8.h "// OLE Variant for Optional.COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);_Application objApp;_Workbook objBook;Workbooks objBooks;Worksheets objSheets;_Worksheet objSheet;Range objRange;VARIANT ret;// Instantiate Excel and open an existing workbook.objApp.CreateDispatch( "Excel.Application ");objBooks = objApp.GetWorkbooks();objBook = objBooks.Open( "C:\\Test.xls ",VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional);objSheets = objBook.GetWorksheets();objSheet = objSheets.GetItem(COleVariant((short)1));//Get the range object for which you wish to retrieve the//data and then retrieve the data (as a variant array, ret).objRange = objSheet.GetRange(COleVariant( "A1 "), COleVariant( "C8 "));ret = objRange.GetValue();//Create the SAFEARRAY from the VARIANT ret.COleSafeArray sa(ret);//Determine the array 's dimensions.long lNumRows;long lNumCols;sa.GetUBound(1, &lNumRows);sa.GetUBound(2, &lNumCols);//Display the elements in the SAFEARRAY.long index[2];VARIANT val;int r, c;TRACE( "Contents of SafeArray\n ");TRACE( "=====================\n\t ");for(c=1;c <=lNumCols;c++){TRACE( "\t\tCol %d ", c);}TRACE( "\n ");for(r=1;r <=lNumRows;r++){TRACE( "Row %d ", r);for(c=1;c <=lNumCols;c++){index[0]=r;index[1]=c;sa.GetElement(index, &val);switch(val.vt){case VT_R8:{TRACE( "\t\t%1.2f ", val.dblVal);break;}case VT_BSTR:{TRACE( "\t\t%s ",(CString)val.bstrVal);break;}case VT_EMPTY:{TRACE( "\t\t <empty> ");break;}}}TRACE( "\n ");}//Close the workbook without saving changes//and quit Microsoft Excel.objBook.Close(COleVariant((short)FALSE), VOptional, VOptional);objApp.Quit();2、不错的一篇文章在VC中彻底玩转Excel作者:龚敏来源:子玉山庄更新:10/8/2004如今Excel是越来越重要了,在我们自己开发的程序中不免要和Excel打交道了。
VC Table控件的用法

VC之TAB控件VC中使用TAB Control控件假如我现在有个SDI程序,View是Form View,想在上面放个Tab Control,包含两个Page。
现在让我们来看看应该怎样处理。
首先当然要增加一个Tab Control资源,然后利用Class Wizard,在View中增加一个Control变量。
接着建立两个对话框资源,别忘了把Style改为Child,Border改为None。
然后就可以在上面加其他控件了。
接着利用Class Wizard,分别为这两个对话框建立两个类,比如CPage1和CPage2。
然后在View类头文件中,加入这两个对话框对象。
同时增加一个变量int m_CurSelTab,用了表明是哪个Page即将被切换。
为了避免用户在切换Tab时,程序对Tab Index的枚举,可以利用数组来做这个事情。
在View的初始化函数中需要把CPage1、CPage2和Tab Control关联起来,并保存页面地址,设置初始页面,等等。
void CTab_testView::OnInitialUpdate(){CFormView::OnInitialUpdate();GetParent()->RecalcLayout();ResizeParentToFit();//为Tab Control增加两个页面m_tab.InsertItem(0, _T("First"));m_tab.InsertItem(1, _T("Second"));//创建两个对话框m_page1.Create(IDD_DIALOG1, &m_tab);m_page2.Create(IDD_DIALOG2, &m_tab);//设定在Tab内显示的范围CRect rc;m_tab.GetClientRect(rc);rc.top += 20;rc.bottom -= 8;rc.left += 8;rc.right -= 8;m_page1.MoveWindow(&rc);m_page2.MoveWindow(&rc);//把对话框对象指针保存起来pDialog[0] = &m_page1;pDialog[1] = &m_page2;//显示初始页面pDialog[0]->ShowWindow(SW_SHOW);pDialog[1]->ShowWindow(SW_HIDE);//保存当前选择m_CurSelTab = 0;}这里面需要注意的是,我用了一个CDialog指针数组来进行保存,数组的大小是Tab Control页面的个数,数组下标对应着每个页面的索引(这样方便快速存取)。
Visual Basic调用Excel之技巧

]Visual Basic调用Excel之技巧Visual Basic(以下简称VB)是一套可视化、面向对象、事件驱动方式的结构化程序设计语言,已经成为许多程序设计者甚至专业程序员用来开发WINDOWS应用程序的首选开发工具。
但用过VB的程序设计人员都知道,要想用VB输出复杂的表格来,是十分困难的。
能不能用VB调用EXCEL呢?Active 技术标准为我们解决了这个问题。
最近笔者为单位开发“土工试验数据整理”的某个模块时,涉及到复杂数据表格的输出问题,经过笔者的摸索,用VB调用EXCEL,取得了很好的效果。
本文从编程实践的角度对使用VB控制EXCEL的技术作简要说明。
1 EXCEL的对象模型如果一个应用程序支持自动化技术,那么其它的应用就可以通过其暴露的对象,对它进行控制,控制程序称为客户机,而被控制的一方就称为服务器,被控制的对象就是Active对象。
VB正是通过EXCEL显露的各级对象来控制EXCEL工作的。
每个对象都有各自的方法和属性,通过方法可以实现对对象的控制,而属性则可以改变对象的各种状态。
理解EXCEL的对象模型是对其编程的基础。
EXCEL是以层次结构组织对象的,其对象模型中含有许多不同的对象元素,这些对象元素就是VB可以操纵的。
在EXCEL对象的层次结构中,最顶层是Application对象,是Excel本身。
从该对象开始往下依次是:.workbooks对象集,是Application对象的下层,其指的是Excel的工作簿文件。
.worksheets对象集,是Workbooks对象集的下层,它表示的是Excel的一个工作表。
.Cells和Range对象,它们是worksheets对象的下层,它则指向Excel工作表中的一个或多个单元格。
以上介绍的四个对象是Excel中最重要也是用得最多的对象,而且从上面的介绍中也不难看出,要控制Excel中的某个具体对象,如某个工作簿中某一表格中的单元格,就必须从Excel层次结构对象的最上层即Application对象开始遍历。
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之基本操作/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中MicrosoftFlexGrid控件的使用

VC中Microsoft FlexGrid控件的使用VC中Microsoft FlexGrid控件的使用及合并单元格、可编辑操作1. 给FlexGrid控件绑定成员变量:m_FlexGrid。
2. 设置行列数m_FlexGrid.SetCols(4); //设置列数m_FlexGrid.SetRows(6); //设置行数3. 设置固定行数和固定列数m_FlexGrid.SetFixedRows(1); //设置固定行数为1行m_FlexGrid.SetFixedCols(0); //设置固定列数为0列 4. 设置列宽、行高m_FlexGrid.SetColWidth(1,1500); //设置列号为1的列宽为1500m_FlexGrid.SetRowHeight(2,300); //设置行号为2的行高为300 5. 设置文本对齐方式m_FlexGrid.SetColAlignment(1,4); //设置列号为1的文本对齐方式参数对应描述为:0 单元内容顶部左对齐。
1 单元内容中间左对齐。
对字符串的缺省设置值。
2 单元内容底部左对齐。
3 单元内容顶部居中。
4 单元内容中间居中。
5 单元内容底部居中。
6 单元内容顶部右对齐。
7 单元内容中间右对齐。
对数字的缺省设置值。
8 单元内容底部右对齐。
9 单元内容一般对齐方式。
对字符串中间左对齐而对数值中间右对齐。
6. 设置表头和单元格内容m_FlexGrid.SetTextArray(0,"Head1"); //设置表头(第1列)内容为“Head1”m_FlexGrid.SetTextMatrix(1,1,"Text"); //设置单元格(行号1列号1)内容为“Text” 7. 增加一行m_FlexGrid.AddItem("AddString",(COleVariant)(3L)); //在行号为3的位置增加一行8. 合并单元格for(i=0;i<4;i++)m_FlexGrid.SetTextMatrix(5,i,"合计"); //将行号为5、列号从0到4的单元格内容设为相同“合计”m_FlexGrid.SetMergeCells(2); //设置单元格合并方式(下述)m_FlexGrid.SetMergeRow(5,TRUE); //设置要合并的行SetMergeCells函数的参数值如下:0: flexMergeNever 默认的选项,就是不合并1: flexMergeFree 不规则的合并2: flexMergeRestrictRows 行合并3: flexMergeRestrictColumns 列合并4: flexMergeRestrictBoth 行,列都合并注意只有单元格内容相同时才能进行合并操作。
VC++ 列表控件(CList) 使用方法 (2)

VC++ 列表控件(CList) 使用方法(2)列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。
MFC中使用CListCtrl类来封装列表控件的各种操作。
通过调用BOOL Create( DWORD dwStyle, const RECT&rect, CWnd* pParentWnd, UINT nI D );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点LVS_SINGLESEL 同时只能选中列表中一项首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);通过调用intInsertItem( intnItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。
除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。
通过调用intInsertColumn( intnCol, LPCTSTR lpszColumnHeading, intnFormat , intnWidth, i ntnSubItem);可以插入列。
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();第二种方法完.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在对话框中使用表格控件的方法:
将该控件改成“report”类型,方法如下。
首先打开该控件的属性,将其设置为“Report”类型,如下图所示。
改完后变为如下形式,是变成了一个列表框。
下面说一下如何通过代码向控件中填加内容,主要是设置表头,然后加入内容,至少有两种方法可以进行信息的加入,下面仅介绍一种。
首先向与对话框对应的类中加入一个与ListControl控件对应的成员函数。
填加方法如下:
运行“ClassWizard”定义一个类的ListCtrl控件成员,填加界面如下,其中IDC_LIST1是上面填加的表格控件的ID 。
选中“Member Variables”标签,点击“Add Variable”出现如下对话框,添加变量名,添加后,就会在与对话框对应的类中加如m_List变量,类型为CListCtrl。
在程序中加入如下代码,实现在表格中显示信息:
m_List.InsertColumn(0,"Col 1",LVCFMT_LEFT,80,0); //设置列
m_List.InsertColumn(1,"Col 2",LVCFMT_LEFT,80,1);
m_List.InsertColumn(2,"Col 3",LVCFMT_LEFT,80,2);
m_List.InsertItem(0,"Item 1_1"); //插入行
m_List.SetItemText(0,1,"Item 1_2"); //设置该行的不同列的显示字符m_List.SetItemText(0,2,"Item 1_3");
运行上面几行代码后的效果如下图所示。