VC读取写入EXCEL2003文件
VC读写excel
// 获得使用的行数 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();
{
//
AfxMessageBox( _T( "是合并的单元格!" ) );
}
else if ( varMerge.boolVal == 0 )
{
//
AfxMessageBox( _T( "不是合并的单元格!" ) );
}
arrayStr[i].Add( strItemName ); j++; } i++; }
CString strItemName;
strItemName = varItemName.bstrVal;
//
AfxMessageBox( strItemName );
// 判断是否是合并的单元格
VARIANT varMerge = oCurCell.GetMergeCells();
if ( varMerge.boolVal == -1 )
// Excel 应用对象
_Application m_oExcelApp;
// Excel 程序
_Worksheet
Visual Baisc 6.0操作Excel2003-最全使用说明
预备知识和操作在VB中要想调用Excel,需要打开VB编程环境“工程”菜单中的“引用”项目,并选取项目中的“Microsoft Excel 11.0 object library”项。
由于你的Excel版本不同,所以这个选项的版本号也是不同的。
因为EXCEL是以层次结构组织对象的,其对象模型中含有许多不同的对象元素。
第一层:Application对象,即Excel本身;第二层:workbooks对象集,指Excel的工作簿文件第三层:worksheets对象集,表示的是Excel的一个工作表;第四层:Cells和Range对象,指向Excel工作表中的单元格。
1从"工程"菜单中选择"引用"栏;选择Microsoft Excel 11.0 Object Library(EXCEL2003),然后选择" 确定"。
2关键代码Dim newxls As Excel.ApplicationDim newbook As Excel.WorkbookDim newsheet As Excel.WorksheetSet newxls=CreatObject("Excel.Application")Set newbook=newxls.Worksbooks.AddSet newsheet=newbook.Worksheets(1)newxls.Visible = True '这一句很关键,编程语言中show和visible应该还起初始化的作用。
newxls.Workbooks.Open FileName:=App.Path & "备件库存查询" + mydate + ".xls"3 newxls.Visible := True '显示当前窗口4 newxls.Caption := "应用程序调用Microsoft Excel" '更改Excel 标题栏5 newxls.Workbooks.Add '添加新工作簿6 newxls.Workbooks.Open("C:\Excel\Demo.xls") '打开已存在的工作簿newxls.Workbooks.Open FileName:=App.Path & "备件库存查询" + mydate + ".xls"7 newxls.WorkSheets[2].Activate '设置第2个工作表为活动工作表newxls.WorkSheets["Sheet2"].Activate8 newxls.Cells[1,4].Value := "第一行第四列" '给单元格赋值newsheet.Cells(1, 4) = "备件名称"9 newxls.ActiveSheet.Columns[1].ColumnsWidth := 5'设置指定列的宽度单位:字符个数以第一列为例10 newxls.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米设置指定行的高度,单位为磅,1磅=0.035厘米,以第二行为例11 在第8行之前插入分页符newxls.WorkSheets[1].Rows[8].PageBreak := 1在第4列之前删除分页符newxls.ActiveSheet.Columns[4].PageBreak := 012 关键代码Visual Basic6.0在excel中的range方法Sub Random()Dim myRange As RangeSet myRange = Worksheets("Sheet1").Range("A1:D5") '注意区域Range为二四象限对角线区域myRange.Formula = "=RAND()"myRange.Font.Bold = TrueEnd Sub13 关键代码Row = ActiveSheet.Range("A1:A679").Find("1-101").Row如果找不到1-101会崩溃Dim c As RangeSet c=ActiveSheet.Range("A1:A679").Find("1-101")If Not c Is Nothing Then '找到Set Row=c.RowElse '找不到'加入自已要处理的语句End If14 newxls.ActiveSheet.Range["B3:D4"].Borders[2].Weight := 3 '指定边框线宽度1-左2-右3-顶4-底5-斜( \ ) 6-斜( / )15 newxls.ActiveSheet.Cells[1,4].ClearContents '清除第一行第四列单元格公式16 newxls.ActiveSheet.Rows[1] := '隶书' '设置第一行字体属性:newxls.ActiveSheet.Rows[1].Font.Color := clBluenewxls.ActiveSheet.Rows[1].Font.Bold := Truenewxls.ActiveSheet.Rows[1].Font.UnderLine := True17 进行页面设置a.页眉newxls.ActiveSheet.PageSetup.CenterHeader := "报表演示"b.页脚newxls.ActiveSheet.PageSetup.CenterFooter := "第&P页"c.页眉到顶端边距2cm:newxls.ActiveSheet.PageSetup.HeaderMargin := 2/0.035d.页脚到底端边距3cm:newxls.ActiveSheet.PageSetup.HeaderMargin := 3/0.035e.顶边距2cm:newxls.ActiveSheet.PageSetup.TopMargin := 2/0.035f.底边距2cm:newxls.ActiveSheet.PageSetup.BottomMargin := 2/0.035g.左边距2cm:newxls.ActiveSheet.PageSetup.LeftMargin := 2/0.035h.右边距2cm:newxls.ActiveSheet.PageSetup.RightMargin := 2/0.035i.页面水平居中:newxls.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035j.页面垂直居中:newxls.ActiveSheet.PageSetup.CenterV ertically := 2/0.035k.打印单元格网线:newxls.ActiveSheet.PageSetup.PrintGridLines := True '这一条要注意使用18 拷贝操作a.拷贝整个工作表:ed.Range.Copyb.拷贝指定区域:newxls.ActiveSheet.Range["A1:E2"].Copyc.从A1位置开始粘贴:newxls.ActiveSheet.Range.["A1"].PasteSpeciald.从文件尾部开始粘贴:newxls.ActiveSheet.Range.PasteSpecial19 插入一行或一列a. newxls.ActiveSheet.Rows[2].Insertb. newxls.ActiveSheet.Columns[1].Insert20 删除一行或一列a. newxls.ActiveSheet.Rows[2].Deleteb. newxls.ActiveSheet.Columns[1].Delete21 打印预览工作表newxls.ActiveSheet.PrintPreview '这一条要注意使用22 打印输出工作表newxls.ActiveSheet.PrintOut '这一条要注意使用23 工作表保存If not newxls.ActiveWorkBook.Saved thennewxls.ActiveSheet.PrintPreviewEnd if24 工作表另存为newxls.SaveAs("C:\Excel\Demo1.xls")25 存盘ExcelID.ActiveWorkBook.Saved := True26 关闭工作簿ExcelID.WorkBooks.Close27 退出ExcelExcelID.Quit28 设置工作表密码ExcelID.ActiveSheet.Protect "123", DrawingObjects:=True, Contents:=True, Scenarios:=True29 EXCEL的显示方式为最大化ExcelID.Application.WindowState = xlMaximized30 工作薄显示方式为最大化ExcelID.ActiveWindow.WindowState = xlMaximized31 设置打开默认工作薄数量ExcelID.SheetsInNewWorkbook = 332 关闭时是否提示保存(true 保存;false 不保存)ExcelID.DisplayAlerts = False33 设置拆分窗口,及固定行位置ExcelID.ActiveWindow.SplitRow = 1ExcelID.ActiveWindow.FreezePanes = True34 设置打印时固定打印内容ExcelID.ActiveSheet.PageSetup.PrintTitleRows = "$1:$1"35 设置打印标题ExcelID.ActiveSheet.PageSetup.PrintTitleColumns = ""36 设置显示方式(分页方式显示)ExcelID.ActiveWindow.View = xlPageBreakPreview37 设置显示比例ExcelID.ActiveWindow.Zoom = 10038 让Excel 响应DDE 请求Ex.Application.IgnoreRemoteRequests = False编程例子用VB操作EXCELPrivate Sub Command3_Click()On Error GoTo err1Dim i As LongDim j As LongDim objExl As Excel.Application '声明对象变量Me.MousePointer = 11 '改变鼠标样式Set objExl = New Excel.Application '初始化对象变量objExl.SheetsInNewWorkbook = 1 '将新建的工作薄数量设为1objExl.Workbooks.Add '增加一个工作薄objExl.Sheets(1).Name = "book2" '修改工作薄名称objExl.Sheets("book2").Select '选中工作薄<book2>For i = 1 To 50 '循环写入数据For j = 1 To 5If i = 1 ThenobjExl.Selection.NumberFormatLocal = "@" '设置格式为文本objExl.Cells(i, j) = " E " & i & jElseobjExl.Cells(i, j) = i & jEnd IfNextNextobjExl.Rows("1:1").Select '选中第一行objExl.Selection.Font.Bold = True '设为粗体objExl.Selection.Font.Size = 24 '设置字体大小objExl.Cells.EntireColumn.AutoFit '自动调整列宽objExl.ActiveWindow.SplitRow = 1 '拆分第一行objExl.ActiveWindow.SplitColumn = 7 '拆分前七列objExl.ActiveWindow.FreezePanes = True '固定拆分objExl.ActiveSheet.PageSetup.PrintTitleRows = "$1:$1" '设置打印固定行objExl.ActiveSheet.PageSetup.PrintTitleColumns = "" '打印标题objExl.ActiveSheet.PageSetup.RightFooter = "打印时间: " & _Format(Now, "yyyy年mm月dd日hh:MM:ss")objExl.ActiveWindow.View = xlPageBreakPreview '设置显示方式objExl.ActiveWindow.Zoom = 100 '设置显示大小objExl.ActiveSheet.Protect "123", DrawingObjects:=True, _Contents:=True, Scenarios:=TrueobjExl.Application.IgnoreRemoteRequests = FalseobjExl.Visible = True '使EXCEL可见objExl.Application.WindowState = xlMaximized 'EXCEL的显示方式为最大化objExl.ActiveWindow.WindowState = xlMaximized '工作薄显示方式为最大化objExl.SheetsInNewWorkbook = 3 '将默认新工作薄数量改回3个Set objExl = Nothing '清除对象Me.MousePointer = 0 '修改鼠标Exit Suberr1:objExl.SheetsInNewWorkbook = 3objExl.DisplayAlerts = False '关闭时不提示保存objExl.Quit '关闭EXCELobjExl.DisplayAlerts = True '关闭时提示保存Set objExl = NothingMe.MousePointer = 0End Sub。
c读取excel文件的几种方法
c读取e x c e l文件的几种方法Revised by Petrel at 2021C# 读取EXCEL文件的几种经典方法例子引入(读取时excel要打开)namespace读取excel测试{public partial class Form1 : Form{public Form1(){InitializeComponent();}lsx|电子表格|*.xls|所有文件|*.*";" + "Data Source=" + path + ";" + "Extended Properties=Excel ;";OleDbConnection conn = new OleDbConnection(strConn);();string strExcel = "";OleDbDataAdapter myCommand = null;DataSet ds = null;strExcel = "select * from [sheet1$]"; myCommand = newOleDbDataAdapter(strExcel, strConn);ds = new DataSet();(ds, "table1");return ds;Data Source=" + path + ";Extended Properties='Excel ;HDR=NO;IMEX=1'";ables, null);oString();法一:采用OleDB读取EXCEL文件:把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:public DataSet ExcelToDS(string Path){string strConn = ".;" +"Data Source="+ Path +";"+"Extended Properties=Excel ;";OleDbConnection conn = new OleDbConnection(strConn);();string strExcel = "";OleDbDataAdapter myCommand = null;DataSet ds = null;strExcel="select * from [sheet1$]";myCommand = new OleDbDataAdapter(strExcel, strConn);ds = new DataSet();(ds,"table1");return ds;}对于EXCEL中的表即sheet([sheet1$])如果不是固定的可以使用下面的方法得到string strConn = ".;" +"Data Source="+ Path +";"+"Extended Properties=Excel ;";OleDbConnection conn = new OleDbConnection(strConn);DataTable schemaTable = (.Tables,null);string tableName=[0][2].ToString().Trim();另外:也可进行写入EXCEL文件,实例如下:public void DSToExcel(string Path,DataSet oldds){; Data Source ="+path1+";Extended Properties=Excel " ;OleDbConnection myConn = new OleDbConnection(strCon) ;string strCom="select * from [Sheet1$]";( ) ;OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom, myConn ) ;.OleDbCommandBuilder builder=newOleDbCommandBuilder(myCommand);i++){ewRow();for(int j=0;j<[0].;j++){nrow[j]=[0].Rows[i][j];}["Table1"].(nrow);}(newds,"Table1");();}2.方法二:引用的com组件:读取EXCEL文件首先是的获取,将Office安装目录下的文件Copy到DotNet的bin目录下,cmd到该目录下,运行 TlbImp 得到Dll文件。
利用VC操作Excel生成图文报表
VC中利用Excel2003生成图文报表(内部资料请勿外传)编写:邵江日期:2011-2-21检查:日期:审核:日期:批准:日期:武汉东健科技有限公司版权所有不得复制文档变更记录参考资料1.1VC利用EXCEL模板实现报表打印的九大步骤#include "excel9.h" //使用EXCEL类需要包含的头文件#include "comdef.h" //使用EXCEL类需要包含的头文件(注:需要"excel9.h"和"excel9.cpp",是通过类向导添加新类中的from a type library 到office安装目录下加载olb 文件注意excel加载exe文件)第二步:创建对象_Application ExcelApp;Workbooks wbsMyBooks;_Workbook wbMyBook;Worksheets wssMysheets;_Worksheet wsMysheet;Range rgMyRge;第三步:创建EXCEL服务器/*创建EXCEL服务器*/if (!ExcelApp.CreateDispatch("Excel.Application", NULL)){AfxMessageBox("创建EXCEL服务器失败!");return;}第四步:利用EXCEL模板创建EXCEL文档//strPath为模板的全路径名wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(), true);try{wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strPath)));}catch(...){AfxMessageBox("EXCEL模板打开失败,请检查文件是否存在!", MB_OK | MB_ICONSTOP);ExcelApp.Quit();return;}第五步:关联对象/*得到Worksheets*/wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(), true);/*得到Worksheet1*/wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")), true);/*得到全部Cells,此时,rgMyRge是cells的集合*/rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);第六步:设置单元格的值rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("姓名")); //1*1rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)2),_variant_t("QQ号")); //1*2rgMyRge.SetItem(_variant_t((long)2),_variant_t((long)1),_variant_t("风云在线")); rgMyRge.SetItem(_variant_t((long)2),_variant_t((long)2),_variant_t("278800 584"));第七步:打印预览ExcelApp.SetVisible(true);wbMyBook.PrintPreview(_variant_t(false));第八步:退出EXCEL应用程序/*设置保存标志为已保存,则不会弹出保存模板对话框,实际上并未保存,只是认为的标志保存了,因为这里不需要保存*/wbMyBook.SetSaved(true);/*退出EXCEL应用程序*/ExcelApp.Quit();第九步:释放对象/*释放对象*/rgMyRge.ReleaseDispatch();wsMysheet.ReleaseDispatch();wssMysheets.ReleaseDispatch();wbMyBook.ReleaseDispatch();wbsMyBooks.ReleaseDispatch();ExcelApp.ReleaseDispatch();1.2VC操作EXCELExcel为发人员提供了强大的外部接口,方便开发人员进行二次开发。
VC读取EXCEL文件
VC读取EXCEL文件[ 2005-9-16 11:16:00 | By: 阿木]在Visual C++ 中调用Excel 2000程蓬在开发软件时,经常要将数据输出到Excel 2000中,在Excel 2000中对该数据进行进一步地格式化处理或进行计算处理。
在Visual Basic中处理起来较简单,Excel 2000的VB编程帮助中有较为详细的介绍。
在Visual C++中如何进行处理了?利用Excel 2000的ActiveX Automate功能,处理起来同VB中类似。
但要注意以下几点:对于对象的属性值的读取或赋值,需要用GetProperty()或SetProperty(NewValue)函数,不能象VB中直接通过属性名称取值或赋值。
例如:Worksheet.GetCount(), Worksheet.SetName(“Sheet1”)。
对集合对象中的成员对象的引用,必须使用集合对象的GetItem()函数。
例如:Worksheets.GetItem(ColeVariant((long)1))或Worksheets.GetItem(ColeVaria nt(“Sheet1”))取得第一个工作表。
在COM接口中,时常用到Variant,BSTR,SafeArray数据类型。
V ariant数据类型是一个联合,可表示几乎所有的类型的数据,具体用法见MSDN中的相关介绍,类_variant_t是对V ARIANT数据类型的封装。
在Excel 2000的VB编程帮助中,如果提到某函数或属性需要一个值,该值的数据类型通常是Variant,在封装Excel 2000对象的类定义中,说明了具体需要的数据类型。
BSTR是一个包括了字符串和字符串长度的数据结构,类_bstr_t是对BSTR 数据类型的封装。
在Excel 2000的VB编程帮助中提到的字符串通常指BSTR。
具体函数参数或属性的数据类型,见封装该对象的类的定义。
vc++-newer-读写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上的一个推荐开源工程了,bbb://aaacodeprojectaaa/KB/office/BasicExcel.aspx整理是基于EXCEL的文件格式进行的处理。
但是为什么叫Basic EXCEL呢。
他不支持很多东西,公式,文件格式,表格合并等(有人说中文支持也不好),所以可以认为他只支持最基本的EXCEL表格,我自己的尝试是如果这个EXCEL文件有其他元素(公式,格式等),使用Basic EXCEL读取会失败。
OLE读写EXCEL方式功能比较弱,由于是直接根据文件格式操作,读写速度都不错,你也不需要按照EXCEL,另外这个方式是可以移植的,但是有一些成本,其代码比较晦涩难懂,而且没有注释,另外即使在Windows平台上,告警也很多。
vc读写Excel文件的方法
vc读写Excel⽂件的⽅法void ReadExcel(){CDatabase database;CString sSql;CString sItem1, sItem2 , sItem3;CString sDriver;CString sDsn;CString sFile,sPath;//获取主程序所在路径,存在sPath中GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);sPath.ReleaseBuffer();int nPos;nPos=sPath.ReverseFind ('\\');sPath=sPath.Left (nPos);sFile = sPath + "\\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⽂件)database.Open(NULL, false, false, sDsn);CRecordset recset(&database);// 设置读取的查询语句.注意此处表名的写法,excel⾥的表默认为系统表所以访问表时表名应为[表名$] sSql = "SELECT 考⽣编号,考⽣姓名,来源 ""FROM [student2$] ""ORDER BY 考⽣编号 ";// 执⾏查询语句recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);// 获取查询结果while (!recset.IsEOF()){//读取Excel内部数值recset.GetFieldValue("考⽣编号", sItem1);recset.GetFieldValue("考⽣姓名", sItem2);recset.GetFieldValue("来源", sItem3);//显⽰记取的内容m_ExcelList.AddString( sItem1 + " --> "+sItem2 );// 移到下⼀⾏recset.MoveNext();}// 关闭数据库database.Close();}CATCH(CDBException, e){// 数据库操作产⽣异常时...AfxMessageBox("数据库错误: " + e->m_strError);}END_CATCH;}下⾯是第⼆种⽅法,这⾥涉及的原理要复杂⼀些了,传说中的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 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)),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();第⼆种⽅法完。
c读取excel文件内容
c读取excel文件内容在C语言编程中,有时候我们需要读取Excel文件的内容,进行一些数据处理或者分析。
本文将介绍如何在C语言中读取Excel文件的内容,以及如何处理这些数据。
首先,我们需要使用C语言中的一些库来实现对Excel文件的读取。
在C语言中,我们可以使用libxls这个库来读取Excel文件。
这个库提供了一些函数,可以帮助我们打开Excel文件,并逐行读取其中的内容。
接下来,我们需要打开Excel文件,并创建一个workbook对象来表示这个文件。
然后,我们可以使用libxls提供的函数来逐行读取Excel文件中的内容。
通过这些函数,我们可以获取Excel文件中的每一行数据,然后进行处理。
在读取Excel文件的内容之后,我们可能需要对这些数据进行一些处理。
例如,我们可以将这些数据存储到一个数组中,或者进行一些计算操作。
在C语言中,我们可以使用数组来存储这些数据,然后通过循环来对这些数据进行处理。
除了使用libxls这个库之外,我们还可以考虑使用其他一些库来实现对Excel文件的读取。
例如,我们可以使用libxlsxwriter这个库来创建和写入Excel文件,同时也可以使用它来读取Excel文件的内容。
这个库提供了一些函数,可以帮助我们读取Excel文件中的内容,并进行一些处理操作。
总的来说,在C语言中读取Excel文件的内容并不是一件很困难的事情。
通过使用一些库,我们可以很容易地实现对Excel文件的读取,并对其中的内容进行处理。
通过本文的介绍,相信大家对在C语言中读取Excel文件的内容有了更深入的了解。
希望本文能对大家有所帮助。
VC++6中读取、写入和保存EXECL文件数据的方法(整理现有的资料,附源代码)
/*
//新建一个XLS文件
book = books.Add(COleVariant("")); //得到Workbook book1.xls
sheets = book.GetWorksheets(); //得到Worksheets
range.SetValue2(COleVariant("OK"));//设定范围内的值
app.SetAlertBeforeOverwriting(FALSE); //取消提示是否覆盖的对话框
app.SetDisplayAlerts(FALSE);//取消提示是否保存的对话框
book.SaveAs(COleVariant("D:\\3.xls"),VOptional,VOptional,
}
四、应用实例
数据输入界面
原始数据:
if (!app.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
return FALSE;
}
app.SetVisible(FALSE); // TRUE使Excel可见FALSE--不可见
app.SetUserControl(TRUE); //允许其他用户控制Excel
for(i=0;i<COLS;i++){
//range = sheet.GetRange(COleVariant(IndexToString(1,i+1)),COleVariant(IndexToString(1,i+1)));
VC读写excel
1. 初始化COM//初始化COM的动态连接库if(!AfxOleInit()){AfxMessageBox("无法初始化COM的动态连接库!");return FALSE;}2.包含#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL" rename( "RGB", "MSORGB" )using namespace Office;#pragma warning(disable : 4192)#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"#import "c:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" \rename( "DialogBox", "ExcelDialogBox" ) \rename( "RGB", "ExcelRGB" ) \rename( "CopyFile", "ExcelCopyFile" ) \rename( "ReplaceText", "ExcelReplaceText" )3.操作(CListCtrl控件)TCHAR szFilter[] = { _T("Excel文件(*.xls)|*.xls|所有文件(*.*)|*.*||") };CFileDialog SaveDialog(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);if (SaveDialog.DoModal() == IDOK){_variant_t varOption((long)DISP_E_PARAMNOTFOUND, VT_ERROR);CWaitCursor wait;try{Excel::_ApplicationPtr pExcelApp(_T("Excel.Application"));Excel::_WorkbookPtr pBook = pExcelApp->GetWorkbooks()->Add(varOption);Excel::_WorksheetPtr pSheet = pBook->ActiveSheet;Excel::RangePtr pRange = pSheet->Cells;CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();int nColumn = pHeader->GetItemCount();TCHAR szText[40] = { 0 };HDITEM hdi = { 0 };hdi.mask = HDI_TEXT;hdi.pszText = szText;hTextMax = 40;int i,j;for (i = 0; i < nColumn; i++){pHeader->GetItem(i, &hdi);pRange->PutItem(_variant_t((short) 1),_variant_t((short)(i+1)),hdi.pszText);//pRange->Item[1][i+1] = hdi.pszText;}Excel::RangePtr pHeaderRange = pRange->GetRange(variant_t(_T("A1")), variant_t(_T("N1"))); //pHeaderRange->SetHorizontalAlignment(varCenter);//pHeaderRange->SetVirticalAlignment(varCenter);pHeaderRange->Font->Bold = true;for (i = 0; i < m_list.GetItemCount(); i++){for (j = 0; j < nColumn; j++){//pRange->Item[i+2][j+1] = (LPCTSTR)m_list.GetItemText(i, j);pRange->PutItem(_variant_t((short)(i+2)),_variant_t((short)(j+1)),(LPCTSTR)m_list.GetItemText( i, j));}}pRange = pRange->EntireColumn;pRange->AutoFit();pBook->Close(true, (LPCTSTR)SaveDialog.GetPathName(), varOption);pExcelApp->Quit();AfxMessageBox(_T("数据已成功导出到Excel表格中!"), MB_OK | MB_ICONINFORMATION);}catch (_com_error e){AfxMessageBox(_T("导出数据错误!"), MB_OK | MB_ICONERROR);return;}}。
VC 数据导出到Excel
VC导出数据到EXCEL我们制作应用软件的时候,经常要把结果以报表的形式输出,当前使用较为广泛的当然是Excel表格,本文简略介绍在VC++6.0中如何使用Excel2003的库函数并对其进行编程。
先创建一个对话框工程,命名为VCExcel。
在对话框中添加一个按钮,控件ID为ID_RUNEXCEL,界面如下(是不是很搞笑哇,不过没关系,它照样能实现强大的功能!)。
再在该按钮上添加消息BN_CLICKED,其消息映射函数为OnRunexcel(),下面我们的工作就是要完成这个OnRunexcel()函数。
在这里我们通过一个实例来说明VC是如何调用Excel2003的接口编程的。
我们要编程输出一个如下表格。
格式如下:1、表头的字体为宋体,加粗,颜色为白色,底色为深蓝,垂直水平居中对齐;2、表中正文内容字体为宋体,颜色为深蓝,底色为灰色,垂直水平居中对齐;3、全部边框,文本自动换行。
在BOOL CVCExcelApp::InitInstance()之中,int nResponse = dlg.DoModal()语句之后加入如下代码:if(!AfxOleInit())///初始化COM库{AfxMessageBox("初始化COM失败");return FALSE;}为了能调用Excel的接口我们打开MFC ClassWizard->Automation->Add Class->From a type library,选择[Excel的安装路径]\EXCEL.exe,然后把所有的类都添加进去,头文件为excel.h,源文件为excel.cpp。
当然,你也可以只把一些比较常用的类如_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range加进去,因为网上流传的绝大部分教程都只添加这几个类,这完全根据你个人的需要。
c#读写excel2003
界面程序using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.OleDb; //访问excel2003namespace VS2010读写excel2003{public partial class Form1 : Form{public Form1(){InitializeComponent();}// 函数用来读取一个excel文件到DataTable中public static DataTable ReadExcelToTable(string path)//excel存放的路径{try{//连接字符串string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";//string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";ExtendedProperties='Excel 8.0;HDR=NO;IMEX=1';";using (OleDbConnection conn = new OleDbConnection(connstring)){conn.Open();DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字string firstSheetName = sheetsName.Rows[0][2].ToString();//得到第一个sheet的名字string sql = string.Format("SELECT * FROM [{0}]", firstSheetName);//查询字符串OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);DataSet set = new DataSet();ada.Fill(set);return set.Tables[0];}}catch (Exception){return null;}}private void DataToDataview(){string folder_path = "test.xls";dataGridView1.DataSource = null; //每次打开清空内容DataTable dt = ReadExcelToTable(folder_path);dataGridView1.DataSource = dt;}//读取任意表格值private void button1_Click(object sender, EventArgs e){int rowindex = int.Parse(comboBox1.Text); //读取行号int cellindex = int.Parse(comboBox2.Text); //读取列号string folder_path = "test.xls";dataGridView1.DataSource = null; //每次打开清空内容DataTable dt = ReadExcelToTable(folder_path); //读取excel文件到DataTabledataGridView1.DataSource = dt; //excel内容显示在datagridview中textBox1.Text =dt.Rows[rowindex][cellindex].ToString(); //指定内容显示在textbox中}//修改任意表格值private void button2_Click(object sender, EventArgs e){string[] rowname = {"1-2节","3-4节","5-6节","7-8节" }; //列序号string[] cellname = { "周一", "周二", "周三", "周四","周五" };//表头int rowindex = int.Parse(comboBox3.Text); //读取行号int cellindex = int.Parse(comboBox4.Text); //读取列号string folder_path = "test.xls";String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + folder_path + "; Extended Properties=Excel 8.0;";DataTable dt = ReadExcelToTable(folder_path);string oldname= dt.Rows[rowindex][cellindex].ToString(); //记录待更改原数据string newname = textBox2.Text; //待修改新数据if (newname == "")MessageBox.Show("请输入新数据");else//实例化一个Oledbconnection类(实现了IDisposable,要using){using (OleDbConnection ole_conn = new OleDbConnection(sConnectionString)){ole_conn.Open();using (OleDbCommand ole_cmd = ole_conn.CreateCommand()){//因为实际sheet下标从0开始,所以替换时行列序号需减1ole_mandText = "UPDATE [Sheet1$] SET " + cellname[cellindex - 1] + " = '" + newname + "' WHERE " + cellname[cellindex - 1] + " = '" + oldname + "' and 时间= '" + rowname[rowindex - 1] + "'";ole_cmd.ExecuteNonQuery(); //执行更新操作}}dataGridView1.DataSource = null; //每次打开清空内容dt = ReadExcelToTable(folder_path); //更新datatabledataGridView1.DataSource = dt; //excel内容显示在datagridview中MessageBox.Show("数据已更新");}}//数据更新private void button3_Click_1(object sender, EventArgs e){string sxuhao = textBox3.Text;string scell1 = textBox4.Text;string scell2 = textBox5.Text;string scell3 = textBox6.Text;string scell4 = textBox7.Text;string scell5 = textBox8.Text;string folder_path = "test.xls";String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + folder_path + "; Extended Properties=Excel 8.0;";if (sxuhao == "" || scell1 == "" || scell2 == "" || scell3 == "" || scell4 == "" || scell5 == "")MessageBox.Show("请输入新数据");else{using (OleDbConnection ole_conn = new OleDbConnection(sConnectionString)){ole_conn.Open();using (OleDbCommand ole_cmd = ole_conn.CreateCommand()){//因为实际sheet下标从0开始,所以替换时行列序号需减1// ole_mandText = "insert [Sheet1$] SET " + cellname[cellindex - 1] + " = '" + newname + "' WHERE " + cellname[cellindex - 1] + " = '" + oldname + "' and 时间= '" + rowname[rowindex - 1] + "'";ole_mandText = "insert into [Sheet1$] VALUES ('" +sxuhao+"', '"+ scell1+"','"+scell2+"','"+scell3+"','"+scell4+"','"+scell5+"')";// MessageBox.Show(ole_mandText);ole_cmd.ExecuteNonQuery(); //执行更新操作}}dataGridView1.DataSource = null; //每次打开清空内容DataTable dt = ReadExcelToTable(folder_path);dt = ReadExcelToTable(folder_path); //更新datatabledataGridView1.DataSource = dt; //excel内容显示在datagridview 中MessageBox.Show("数据已插入");}}}}。
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的形式来表示。
C 读取Excel类
C++¶ÁÈ¡ExcelÀà.txtVCͨ¹ýCOM×é¼þ¶ÔExcel ½øÐжÁдÏÂÔصØÖ·£º/source/1850105//*******************************************************************************// FILE NAME : cExcel.h//// DESCRIPTION : a class for control excel file// compile with VC 6.0 //// CREATE DATE : 2009-11-17// AUTHOR : ÄÁµÑAndy// QQ : 525908322// /andy84///*******************************************************************************#ifndef __CEXCEL_H__#define __CEXCEL_H__#include "stdafx.h"//import mso.dll#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\mso.dll" \rename("RGB", "MSRGB")//import VBE6EXT.OLB#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only, \rename("Reference", "ignorethis"),\rename("VBE", "JOEVBE")//import excel.exe#import "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" exclude("IFont", "IPicture") \rename("RGB", "ignorethis"),\rename("DialogBox", "ignorethis"),\rename("VBE", "JOEVBE"), \rename("ReplaceText", "JOEReplaceText"),\rename("CopyFile","JOECopyFile"), \rename("FindText", "JOEFindText"),\rename("NoPrompt", "JOENoPrompt")using namespace Office;using namespace VBIDE;using namespace Excel ;const COleVariant covTrue((short)TRUE);const COleVariant covFalse((short)FALSE);const COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);class cExcel{public:cExcel();~cExcel();void StartApp(void);void CreateWorkBook(void);void OpenWorkBook(CString filename);void SelectAcitveSheet(void);void SetSheetName(CString sheetname);void SelectRange( CString range );void SelectRange( int x , int y );void SetBackColor( long color );void GetFont(void);void SetFontName(CString fontname);void SetFontSytle(CString fontsytle);void SetFontSize(long size);void PutValue(CString string);void PutValue(int x , int y , CString string );CString GetCString( int x , int y );double GetValue(int x , int y );void Save(CString filename);void Save( CString path , CString filename );void Quit(void);private:_ApplicationPtr pApp;WorkbooksPtr pBooks ;_WorkbookPtr pBook ;SheetsPtr pSheets ;_WorksheetPtr pSheet;RangePtr pRange;InteriorPtr pInterior;FontPtr pFont;};#endif //CEXCEL_H//*******************************************************************************// FILE NAME : cExcel.cpp//// DESCRIPTION : a class for control excel file// compile with VC 6.0 //// CREATE DATE : 2009-11-17// AUTHOR : ÄÁµÑAndy// QQ : 525908322// /andy84///*******************************************************************************#include "stdafx.h"#include "cExcel.h"#include"Assert.h"//*******************************************************************************// FUNCTION : cExcel// DESCRIPTION : //// PARAMETERS : void// RETURN : void//*******************************************************************************cExcel::cExcel(){pApp = NULL;pBooks = NULL;pBook = NULL;pSheets = NULL;pSheet = NULL;pRange = NULL;pInterior = NULL;pFont = NULL;//*******************************************************************************// FUNCTION : ~cExcel// DESCRIPTION ://// PARAMETERS : void// RETURN : void//*******************************************************************************cExcel::~cExcel(){}//*******************************************************************************// FUNCTION : StartApp// DESCRIPTION : open excel.exe //// PARAMETERS : void// RETURN : void//*******************************************************************************void cExcel::StartApp(void){CoInitialize ( NULL );pApp.CreateInstance(L"Excel.Application");pApp->PutVisible(0,VARIANT_TRUE);//VARIANT_TRUEpBooks = pApp->GetWorkbooks();}//*******************************************************************************// FUNCTION : CreateWorkBook// DESCRIPTION : create *.xls file //// PARAMETERS : void// RETURN : void//*******************************************************************************void cExcel::CreateWorkBook(void){assert(pBooks != NULL );pBook = pBooks->Add((long)xlWorkbook);//*******************************************************************************// FUNCTION : OpenWorkBook// DESCRIPTION : open *.xls file //// PARAMETERS : void// RETURN : void//*******************************************************************************void cExcel::OpenWorkBook(CString filename ){assert(pBooks != NULL );pBook = pBooks->Open( (LPCSTR)filename );}//*******************************************************************************// FUNCTION : SelectAcitveSheet// DESCRIPTION ://// PARAMETERS : void// RETURN : void//*******************************************************************************void cExcel::SelectAcitveSheet(void){assert(pBook != NULL );pSheets = pBook->GetWorksheets();pSheet = pBook->GetActiveSheet();}//*******************************************************************************// FUNCTION : SetSheetName// DESCRIPTION ://// PARAMETERS : void// RETURN : void//*******************************************************************************void cExcel::SetSheetName(CString sheetname){assert(pSheet != NULL );pSheet->PutName( (LPCSTR)sheetname);}//*******************************************************************************// FUNCTION : SelectRange// DESCRIPTION ://// PARAMETERS : CString range (eg. "A1")// RETURN : void //*******************************************************************************void cExcel::SelectRange(CString range ){assert(pSheet != NULL );pRange = pSheet->GetRange((LPCSTR) range ,vtMissing);}//*******************************************************************************// FUNCTION : SelectRange// DESCRIPTION ://// PARAMETERS : int x , int y// RETURN : void //*******************************************************************************void cExcel::SelectRange( int x , int y ){CString range ;x = (0 == x ) ? 1 : x ;y = (0 == y ) ? 1 : y ;x = (x > 26)? (x%26) : ( x ) ;range.Format("%c%d",y+'A'-1, x);SelectRange( range );}//*******************************************************************************// FUNCTION : SetBackColor// DESCRIPTION ://// PARAMETERS : long color// RETURN : void //*******************************************************************************void cExcel::SetBackColor( long color ){assert(pRange != NULL );pInterior = pRange->GetInterior();pInterior->PutColor((long )color);}//*******************************************************************************// FUNCTION : GetFont// DESCRIPTION ://// PARAMETERS : void// RETURN : void //*******************************************************************************void cExcel::GetFont(void){assert(pFont != NULL );pFont =pRange->GetFont();}//*******************************************************************************// FUNCTION : SetFontName// DESCRIPTION ://// PARAMETERS : CString fontname// RETURN : void //*******************************************************************************void cExcel::SetFontName( CString fontname){assert(pFont != NULL );pFont->PutName((LPCSTR)fontname);//(L"Á¥Êé")}//*******************************************************************************// FUNCTION : SetFontSytle// DESCRIPTION ://// PARAMETERS : CString fontsytle// RETURN : void //*******************************************************************************void cExcel::SetFontSytle( CString fontsytle ){assert(pFont != NULL );pFont->PutFontStyle((LPCSTR)fontsytle);//(L"Bold Italic")}//*******************************************************************************// FUNCTION : SetFontSize// DESCRIPTION ://// PARAMETERS : long size// RETURN : void //*******************************************************************************void cExcel::SetFontSize( long size ){assert(pFont != NULL );pFont->PutSize((long)size);}//*******************************************************************************// FUNCTION : PutValue// DESCRIPTION ://// PARAMETERS : CString string// RETURN : void //*******************************************************************************void cExcel::PutValue( CString string ){assert(pRange != NULL );pRange->PutValue2((LPCSTR)string );}//*******************************************************************************// FUNCTION : PutValue// DESCRIPTION ://// PARAMETERS : int x , int y , CString string// RETURN : void//*******************************************************************************void cExcel::PutValue( int x , int y , CString string ){SelectRange(x, y);PutValue( string );}//*******************************************************************************// FUNCTION : PutValue// DESCRIPTION : read sting //// PARAMETERS : int x , int y// RETURN : CString//*******************************************************************************CString cExcel::GetCString( int x , int y ){CString result;COleVariant vResult;SYSTEMTIME st ;CString stry ,strm ,strd ;SelectRange(x, y);////////////////////////assert(pRange != NULL );///////////////////////vResult = pRange->GetValue2();switch ( vResult.vt ){case VT_BSTR: //OLE Automation string{result = vResult.bstrVal;break;}case VT_R8 : // 8 byte real{result.Format("%f",vResult.dblVal);break;}case VT_DATE: //date{VariantTimeToSystemTime(vResult.date, &st);stry.Format("%d",st.wYear);strm.Format("%d",st.wMonth);strd.Format("%d",st.wDay);result = stry+"-"+strm+"-"+strd;break ;}case VT_EMPTY: //empty{result.Empty();break ;}default:{AfxMessageBox("not string ");result.Empty();break;}}return result;}//*******************************************************************************// FUNCTION : GetValue// DESCRIPTION ://// PARAMETERS : int x , int y// RETURN : double //*******************************************************************************double cExcel::GetValue(int x , int y ){double result ;COleVariant vResult;SelectRange(x, y);vResult = pRange->GetValue2();if(VT_R8 == vResult.vt){result = vResult.dblVal ;}else{AfxMessageBox(" not VT_R8 ");}return result ;}//*******************************************************************************// FUNCTION : Save// DESCRIPTION ://// PARAMETERS : CString filename// RETURN : void //*******************************************************************************void cExcel::Save(CString filename){TCHAR szFilePath[MAX_PATH + 1];CString str_url ;GetModuleFileName(NULL, szFilePath, MAX_PATH);(_tcsrchr(szFilePath, _T('\\')))[1] = 0;str_url = szFilePath;str_url += filename ;////////////////////////assert(pBook != NULL );///////////////////////pBook->SaveAs( (LPCSTR) str_url ,(long)xlNormal ,(LPCSTR)"", (LPCSTR)"" ,(long)FALSE,(long)FALSE ,xlShared );}//*******************************************************************************// FUNCTION : Save// DESCRIPTION ://// PARAMETERS : CString path , CString filename// RETURN : void//*******************************************************************************void cExcel::Save( CString path , CString filename ){assert(pBook != NULL );path += filename ;pBook->SaveAs( (LPCSTR) path ,(long)xlNormal ,(LPCSTR)"", (LPCSTR)"" ,(long)FALSE,(long)FALSE ,xlShared );}//*******************************************************************************// FUNCTION : Quit// DESCRIPTION : close excel.exe //// PARAMETERS : void// RETURN : void//*******************************************************************************void cExcel::Quit(void){assert(pBook != NULL );assert(pBooks != NULL );assert(pApp != NULL );pBook->PutSaved(0,VARIANT_TRUE);//don't answer to savepBooks->Close();pApp->Quit();CoUninitialize ();}±¾ÎÄÀ´×ÔCSDN²©¿Í£¬×ªÔØÇë±êÃ÷³ö´¦£º/MudiAndy/archive/2009/11/26/4881740.aspx演讲稿尊敬的老师们,同学们下午好:我是来自10级经济学(2)班的学习委,我叫张盼盼,很荣幸有这次机会和大家一起交流担任学习委员这一职务的经验。
c语言读写excel,C++读写Excel的实现方法详解
c语⾔读写excel,C++读写Excel的实现⽅法详解1.导⼊Excel类型库使⽤Visual C++的扩展指令#import导⼊Excel类型库:#import "C:\\Program Files\\Common Files\\microsoft shared\\OFFICE14\\MSO.DLL" \rename("RGB","MsoRGB") \rename("SearchPath","MsoSearchPath")#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"#import "C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" \rename( "DialogBox", "ExcelDialogBox" ) \rename( "RGB", "ExcelRGB" ) \rename( "CopyFile", "ExcelCopyFile" ) \rename( "ReplaceText", "ExcelReplaceText" ) \exclude( "IFont", "IPicture" ) no_dual_interfaces#import指令会从指定的可执⾏⽂件,动态链接库等COM组件中导出类型库(type lib),在Debug和Release临时⽬录中⽣成对应的类型库头⽂件(type lib header file),以供C++程序使⽤。
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文档(代码备份)一:写Excel文档。
// 获取程序所在目录GetCurrentDirectory(MAX_PATH,g_csPathBuff);//创建并写入Excel文件CDatabase database;char *sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";// Excel安装驱动char sExcelFile[MAX_PATH];sprintf(sExcelFile,"%s\\data.xls",g_csPathBuff);// 要建立的Excel文件char sSql[500];DeleteFile(sExcelFile);TRY{// 创建进行存取的字符串sprintf(sSql,"DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CR EATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);// 创建数据库 (既Excel表格文件)database.OpenEx(sSql,CDatabase::noOdbcDialog);// 创建表结构(雷管数量、爆破坐标、爆破日期、、、)sprintf(sSql,"CREATE TABLE 批次%d ( 雷管数量 TEXT,爆破日期 TEXT,经度 TEXT,纬度 TEXT,爆破人员编号 TEXT,起爆器编号 TEXT,信息状态 TEXT,雷管编号 TEXT,雷管ID TEXT,延迟时间 TEXT)",i);// 执行SQL语句database.ExecuteSQL(sSql);sprintf(sSql,"INSERT INTO 批次%d(雷管数量,爆破日期,经度,纬度,爆破人员编号,起爆器编号,信息状态) VALUES(%s,%s,%s,%s,%s,%d,%s)",i,g_DBDArray[i].ucDetonatorLength,g_DBDArray[i].ucBlastingDate,csJingdu,csWeidu,g_DBDArray[i].ucOperatorID,g_nOperatorDev,g_DBDArray[i].ucIsRead);// 执行SQL语句database.ExecuteSQL(sSql);}CATCH (CMemoryException, e){AfxMessageBox("数据写入到Excel出错了");database.Close();}END_CATCH二:读Excel文档。
VC++新建操作保存等简单操作Excel
StrTime.Format("%02d-%02d-%02d",gtime.GetYear(),gtime.GetMonth(),gtime.GetDay()); gsLocal_1 += StrTime; gsLocal_2 += StrTime; gsLocal_1 +=")"; gsLocal_2 +=")";
//得到Worksheets sheets.AttachDispatch(book.GetWorksheets()); sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1"))); range.AttachDispatch(sheet.GetCells());
//得到Worksheets sheets.AttachDispatch(book.GetWorksheets()); sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1"))); range.AttachDispatch(sheet.GetCells());
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用automation具体如下:1。
你要在新建的工程中导入excel的类库。
以新建基础对话框工工程test为例。
建好后通过类向导(ctrl+w)addclass选from a type libray...,excel2003的是excel.exe文件,在c:/program files/microsoft office/office11/文件夹下。
选excel.exe,把所有的类都导入,注意使用Shift按键选择。
2。
在testApp::InitInstance()中初始化,AfxOleInit();//加在initinstance方法里最前就好。
3. 在对话框中加一个按钮,双击按钮对应的处理函数如下:别望了在加头文件:在#include "stdafx.h"后面加#include "excel.h"3.1//打开Excel文件,使用Excel程序显示,不读数据,也不写入数据,手工使用鼠标关闭Excel文件。
//声明操作excel文件类的对象_Application objApp;// _application代表了EXCEL服务器Workbooks objBooks; //workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks),COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);//检测电脑上是否安装了Excel程序。
if(!objApp.CreateDispatch("Excel.Application")){ AfxMessageBox("无法启动Excel程序,请正确安装!");return;}objApp.m_bAutoRelease = TRUE; //??什么意思?objApp.SetVisible(TRUE); //打开Excel程序,没有显示任何数据。
objApp.SetUserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝//下面两句的功能和objBooks = objApp.GetWorkbooks(); 一样。
LPDISPATCH pWkBooks = objApp.GetWorkbooks(); //GetWorkbooks什么功能?objBooks.AttachDispatch(pWkBooks,TRUE); //将一个IDispatch连接附着于COleDispatchDriver对象//获得当前程序所在的路径,excel文件在此路径下。
char CurrentProgramPath[MAX_PATH];GetCurrentDirectory(MAX_PATH,CurrentProgramPath);CString ExcelFilePathName = CurrentProgramPath;//ExcelFilePathName表示excel文件的路径和文件名ExcelFilePathName += "\\Data.xls";//打开Excel文件,如果前面设置了objApp.SetVisible(TRUE),所以下句命令执行后,显示这个excel文件的数据。
//如果前面没有设置objAppApp.SetVisible(TRUE),下句命令执行后,不会显示这个Excel文件的数据。
//采用只读方式打开excel文件,_variant_t(true), true必须为小写,大写编译出错。
objBooks.Open(ExcelFilePathName,VOptional, _variant_t(true), VOptional, VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional,VOptional,VOptional);3.2//打开Excel文件,读出其中的数据,供后面设置Mschart控件使用。
//Excel文件使用三列,第一列表示序号,第二列表示第一组份的数据,第二列表示第二组份的数据。
//声明操作excel文件类的对象_Application objApp; //_application代表了EXCEL服务器Workbooks objBooks;//workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks),_Workbook objBook;//_workbook就是一个表,相当于MDI中的一个视窗,Worksheets objSheets; // worksheets表示所有的表单,每个表都可能有很多表单(建立一个Excel文件之后,打开,可以看到有sheet1,sheet2等,所有这些sheetn就组成了worksheets)_Worksheet objSheet;//_worksheet就表示一个表单,Range objRange,usedRange;//Range 表示元素的集合COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);VARIANT ret;CString cstr="";//检测电脑上是否安装了Excel程序。
if(!objApp.CreateDispatch("Excel.Application")){ AfxMessageBox("无法启动Excel服务器!");return;}// objApp.SetVisible(TRUE); //打开Excel程序,没有显示任何数据。
// objApp.SetUserControl(FALSE);//允许其它用户控制Excel,否则Excel将一闪即逝// objApp.m_bAutoRelease = TRUE; //??什么意思?objBooks = objApp.GetWorkbooks();//获得当前程序所在的路径,excel文件在此路径下。
char CurrentProgramPath[MAX_PATH];GetCurrentDirectory(MAX_PATH,CurrentProgramPath);CString ExcelFilePathName = CurrentProgramPath;//ExcelFilePathName表示excel文件的路径和文件名ExcelFilePathName += "\\Data.xls";//打开Excel文件,如果前面设置了objApp.SetVisible(TRUE),所以下句命令执行后,显示这个excel文件的数据。
//如果前面没有设置objAppApp.SetVisible(TRUE),下句命令执行后,不会显示这个Excel文件的数据。
//采用只读方式打开excel文件,_variant_t(true), true必须为小写,大写编译出错。
objBook = objBooks.Open(ExcelFilePathName,VOptional, _variant_t(true), VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);objSheets = objBook.GetWorksheets();//设定当前的工作表sheet是excel文件的第几个工作表sheet COleVariant((short)1)表示第一个COleVariant((short)2)表示第二个objSheet = objSheets.GetItem(COleVariant((short)1));//获得已经使用的行数和列数。
usedRange.AttachDispatch(objSheet.GetUsedRange());objRange.AttachDispatch(usedRange.GetRows());long iRowNum=objRange.GetCount();//已经使用的行数objRange.AttachDispatch(usedRange.GetColumns());long iColumnNum=objRange.GetCount();//已经使用的列数//设定读取的行列范围//objRange = objSheet.GetRange(COleVariant("A1"), COleVariant("C1000"));ret = objRange.GetValue(VOptional);COleSafeArray sa(ret);//读出内容。
long lNumRows; long lNumCols;sa.GetUBound(1, &lNumRows); sa.GetUBound(2, &lNumCols);long index[2];VARIANT val;int row, column;for(row=1;row<=iRowNum;row++)//row表示行数{ for(column=1;column<=iColumnNum;column++)//c表示列数{ index[0]=row;index[1]=column;sa.GetElement(index, &val);//val类对象中包含取的row行、column列的内容switch(val.vt){ case VT_R8: //数字{ //TRACE("\t\t%1.2f", val.dblVal);CString cstr2=""; cstr2.Format("%1.1f",val.dblVal); cstr+=cstr2+"\n";break;}case VT_BSTR: //文字{//TRACE("\t\t%s",(CString)val.bstrVal);cstr+=(CString)val.bstrVal+"\n";break;}case VT_EMPTY://表示此row行、column列的内容为空。