C++使用OLE高速读写EXCEL的源码
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
C++builder用OLE操作Excel(目前最全的资料)
C++builder用OLE操作Excel(目前最全的资料)C++builder 用OLE操作Excel(目前最全的资料)用OLE操作Excel(目前最全的资料)关键字:Office,Excel,Sheet,Cell,OLE,CreateObject,Merge,工作簿,工作表,单元格,合并,自动化本文转自 C++Builder 研究 - /article/go.asp?i=529&d=0iezy5 用OLE操作Excel(目前最全的资料)(04.2.19更新)本文档部分资料来自互联网,大部分是ccrun(老妖)在Excel中通过录制宏-->察看宏代码-->转为CB代码而来.本文档不断更新中.欢迎大家关注.要在应用程序中控制Excel的运行,首先必须在编制自动化客户程序时包含Comobj.hpp#include \\\"Comobj.hpp\\\"C++ Builder把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。
设置对象属性:void OlePropertySet(属性名,参数……);获得对象属性:Variant OlePropertyGet(属性名,参数……);调用对象方法:1) Variant OleFunction(函数名,参数……);2) void OleProcedure(过程名,参数……);在程序中可以用宏定义来节省时间:#define PG OlePropertyGet#define PS OlePropertySet#define FN OleFunction#define PR OleProcedure举例:ExcelApp.OlePropertyGet(\\\"workbooks\\\").OleFunction(\\ \"Add\\\");可写为ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\");C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel 的对象、方法和属性。
c语言操作excel文件的系列代码
为了深入探讨如何使用C语言操作excel文件的系列代码,首先我们需要了解一些基本概念和背景知识。
C语言作为一种高效、灵活的编程语言,能够通过各种库和函数来实现对excel文件的读写操作。
在本文中,我将从简单的读取excel文件开始,逐步深入到更复杂的数据处理和格式操作,帮助您更好地理解和掌握这一主题。
1. 读取excel文件在使用C语言操作excel文件时,我们首先需要使用相应的库来实现对excel文件的读取操作。
通过调用库中的函数,我们可以打开excel 文件、读取其中的数据,并进行必要的处理。
在这一部分,我将介绍如何使用C语言代码来打开excel文件,并读取其中的数据,以便您能够快速上手并理解基本的读取操作。
2. 写入excel文件除了读取操作,我们还需要了解如何使用C语言来向excel文件中写入数据。
通过调用库中相应的函数,我们可以打开excel文件、写入数据,并进行必要的格式化和处理。
在这一部分,我将介绍如何使用C语言代码来创建excel文件,并向其中写入数据,以便您能够深入理解和掌握写入操作的技巧和要点。
3. 数据处理和格式操作在实际应用中,我们常常需要对从excel文件中读取到的数据进行处理和格式操作。
这包括对数据进行计算、筛选、排序等操作,以及对数据进行格式化和样式设置等操作。
在这一部分,我将介绍如何使用C语言代码来对excel文件中的数据进行各种处理和格式操作,帮助您更好地应用这些技巧解决实际问题。
4. 个人观点和理解在学习和掌握C语言操作excel文件的系列代码时,我认为最重要的是理解其基本原理和核心思想。
只有深入理解了excel文件的读写操作、数据处理和格式操作等核心概念,我们才能更好地运用C语言代码来实现各种功能。
我建议在学习过程中注重对基本概念的理解,并多做实践和实战,以提升自己的技能和水平。
总结回顾通过本文的深入讨论和详细介绍,我相信您已经对使用C语言操作excel文件的系列代码有了全面、深刻的理解。
使用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自动化工程建立完成。
c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
c#中采⽤OLEDB⽅式来读取EXCEL⽂件和将数据写⼊EXCEL⽂件Microsoft Jet 提供程序⽤于连接到 Excel ⼯作簿。
在以下连接字符串中,Extended Properties 关键字设置 Excel 特定的属性。
“HDR=Yes;”指⽰第⼀⾏中包含列名,⽽不是数据,“IMEX=1;”通知驱动程序始终将“互混”数据列作为⽂本读取。
Excel 8.0 针对Excel2000及以上版本,Excel5.0 针对Excel97。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""注意,Extended Properties 所需的双引号必须还要加双引号。
Provider=Microsoft.Jet.OLEDB.4.0只⽀持Office97-2003,不⽀持2007。
如果需要⽀持2007,使⽤ Provider='Microsoft.Ace.OLEDB.12.0使⽤打开、读取并关闭代码⽰例如下:using System.Data.OleDb;using System.Data;String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=c:/test.xls;" +"Extended Properties=Excel 8.0;";OleDbConnection objConn = new OleDbConnection(sConnectionString);objConn.Open();OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM [sheet1]", objConn);OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();objAdapter1.SelectCommand = objCmdSelect;DataSet objDataset1 = new DataSet();//将Excel中数据填充到数据集objAdapter1.Fill(objDataset1, "XLData");objConn.Close();另⼀版本参考代码:string ConnnectionString = string.Format(@"Provider='Microsoft.Ace.OLEDB.12.0';Data Source={0};" + "Extended Properties=Excel 8.0;", ExcelPath);OleDbConnection Excelconn = new OleDbConnection(ConnnectionString);try{Excelconn.Open();OleDbCommand Excelcomm = new OleDbCommand();//这段代码甚⾄可以让Connection重定向,根据实际需要选择该写,如果不需要重定向,From TableName就好了string ExcelCommText = string.Format("select * FROM [Excel 8.0;HDR=yes;DATABASE={0}].[{1}$]", ExcelPath, TableName);OleDbDataAdapter sda = new OleDbDataAdapter(ExcelCommText, Excelconn);DataSet ds = new DataSet();sda.Fill(ds);从上⾯可以看出,使⽤可将Excel当作普通数据库,使⽤SQL语句来操作。
最全的OLE操作Excel的完整代码
最全的OLE操作Excel的完整代码#include<Utilcls.h>#include "Excel_2K_SRVR.h"//#include "ComObj.hpp"/*-------------------------------------------------//谨慎的思考310032649原创文章//目前真正最全的OLE操作Excel的完整代码//版本:2007.01.15.01//C++Builder专家组原创文章//转载请保留本版权信息,谢谢合作--------------------------------------------------/void __fastcall TForm1::Button1Click(TObject *Sender){AnsiString str1="asvasd";//要入库的数据Variant ex,newxls,sh;try{ex=CreateOleObject("Excel.Application");//启动Excelex.OlePropertySet("Visible",(Variant)true);//使Excel启动后可见//ex.OlePropertyGet("WorkBooks").OleProcedure("ADD");//新建一新工作薄(加上这一句,会有两个Excel窗口,同时关闭)//ex.OlePropertySet("Visible",(Variant)false);//使Excel启动后不可见//ex.OlePropertySet("Windowstate",1);//Excel启动后窗体状态:1(xlNormal)正常显示(Excel上次关闭时是什么状态,启动后就是什么状态),2(xlMinimized)最小化(不是缩小到任务栏),3(xlMaximized)最大化newxls=(ex.OlePropertyGet("Workbooks")).OleFunction("Add");//①//使用ExcelApp的Exec方法新建一有3个工作表的默认工作薄//newxls=(ex.OlePropertyGet("Workbooks")).OleFunction("Add",1);//创建有单个工作表的工作簿//newxls=ex.OlePropertyGet("workbooks").OleFunction("open", "c:\\123.xls");//打开已存在的文件,使用时可将上面关于新建①的那行屏蔽掉sh=newxls.OlePropertyGet("ActiveSheet");}catch(...){ShowMessage("启动Excel出错,可能沒有安裝Excel");return;}//Excel的警告提示:sh.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",false);//关闭Excel的警告提示,如提示保存等//sh.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",true);//打开Excel的警告提示,如提示保存等//选择工作表://newxls.OlePropertyGet("Sheets", 2).OleProcedure("Select");//选择第二工作表//sh = newxls.OlePropertyGet("ActiveSheet");//选择第二工作表//重命名工作表://sh.OlePropertySet("Name", "Sheet的新名字");//重命名当前工作表//取得工作表总数:int nSheetCount=newxls.OlePropertyGet("Sheets").OlePropertyGet("Count");//取得工作表总数Edit1->Text=nSheetCount;/*-------------------------------------------------//目前真正最全的OLE操作Excel的完整代码//版本:2007.01.15.01//C++Builder专家组原创文章//转载请保留本版权信息,谢谢合作--------------------------------------------------///新建工作表并重命名:try{Variant bef1,aft1;int count=ex.OlePropertyGet("sheets").OlePropertyGet("count");aft1=ex.OlePropertyGet("sheets",count);ex.OlePropertyGet("sheets").OleProcedure("Add",bef1.NoParam() , aft1);sh = ex.OlePropertyGet("ActiveSheet");sh.OlePropertySet("Name","增加的sheet的名字");//名字不能重复}catch(...){//ShowMessage ("There's something wrong with your excel file./nPlease check it!");}//指定状态栏显示的文本://ex.OlePropertySet ("StatusBar","您好,请您稍等。
c++ olefile解析
要解析OLE文件,你需要了解OLE(Object Linking and Embedding)文件格式。
OLE文件是一种二进制文件格式,用于存储复合文档,例如Word文档、Excel工作簿或PowerPoint演示文稿。
C++中可以使用第三方库来解析OLE文件,例如libole(开源)或Microsoft的COM库。
下面是一个使用libole库解析OLE文件的示例代码:c复制代码#include<iostream>#include<libole/ole.h>int main() {OleFile* oleFile = OleFile_Open("example.docx");if (oleFile) {std::cout << "OLE file opened successfully." << std::endl;OleFileEntry* entry = OleFile_RootEntry(oleFile);if (entry) {std::cout << "Root directory found." << std::endl;OleStream* stream = OleFile_OpenStream(entry, "WordDocument", STGM_READ);if (stream) {std::cout << "Word document stream opened successfully." << std::endl;// Read and process Word document data...OleStream_Close(stream);}OleFileEntry_Release(entry);}OleFile_Close(oleFile);} else {std::cout << "Failed to open OLE file." << std::endl;}return0;}在上面的示例中,我们首先使用OleFile_Open函数打开OLE文件。
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文件的内容有了更深入的了解。
希望本文能对大家有所帮助。
c读取excel文件的几种方法
c读取e x c e l文件的几种方法公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]C# 读取EXCEL文件的几种经典方法例子引入(读取时excel要打开)namespace读取excel测试{public partial class Form1 : Form{public Form1(){InitializeComponent();}lsx|电子表格|*.xls|所有文件|*.*";oString();法一:采用OleDB读取EXCEL文件:把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:public DataSet ExcelToDS(string Path){string strConn = "Provider=" +"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 = "Provider=" +"Data Source="+ Path +";"+"Extended Properties=Excel ;";OleDbConnection conn = new OleDbConnection(strConn);DataTable schemaTable =string tableName=[0][2].ToString().Trim();另外:也可进行写入EXCEL文件,实例如下:public void DSToExcel(string Path,DataSet oldds){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
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;}}。
用c#读取Excel的三种方法
C#读取Excel的三种方法及比较(1)OleDB方式优点:将Excel直接当做数据源处理,通过SQL直接读取内容,读取速度较快。
缺点:读取数据方式不够灵活,无法直接读取某一个单元格,只有将整个Sheet 页读取出来后(结果为Datatable)再在Datatable中根据行列数来获取指定的值。
当Excel数据量很大时。
会非常占用内存,当内存不够时会抛出内存溢出的异常。
读取代码如下:1:public DataTableGetExcelTableByOleDB(string strExcelPath, string tableName) 2: {3:try4:{5:DataTabledtExcel = new DataTable();6://数据表7:DataSet ds = new DataSet();8://获取文件扩展名9:string strExtension = System.IO.Path.GetExtension(strExcelPath);10:string strFileName = System.IO.Path.GetFileName(strExcelPath);11://Excel的连接12:OleDbConnectionobjConn = null;13:switch (strExtension)14:{15:case".xls":16:objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel8.0;HDR=NO;IMEX=1;\"");17:break;18:case".xlsx":19:objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel12.0;HDR=NO;IMEX=1;\"");20:break;21:default:22:objConn = null;23:break;24:}25:if (objConn == null)26:{27:returnnull;28:}29:objConn.Open();30://获取Excel中所有Sheet表的信息31://System.Data.DataTableschemaTable =objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); 32://获取Excel的第一个Sheet表名33://string tableName = schemaTable.Rows[0][2].ToString().Trim();34:string strSql = "select * from [" + tableName + "]";35://获取Excel指定Sheet表中的信息36:OleDbCommandobjCmd = new OleDbCommand(strSql, objConn);37:OleDbDataAdaptermyData = new OleDbDataAdapter(strSql, objConn);38:myData.Fill(ds, tableName);//填充数据39:objConn.Close();40://dtExcel即为excel文件中指定表中存储的信息41:dtExcel = ds.Tables[tableName];42:return dtExcel;43:}44:catch45:{46:returnnull;47:}48: }下面说明一下连接字符串HDR=Yes,这代表第一行是标题,不做为数据使用(但是我在实际使用中,如果第一行存在复杂数值,那么读取得到的Datatable列标题会自动设置为F1、F2等方式命名,与实际应用不符,所以当时是通过HDR=No方式将所有内容读取到Datatable中,然后手动将第一行设置成标题的);IMEX ( IMportEXport mode )设置IMEX 有三种模式:0 is Export mode1 is Import mode2 is Linked mode (full update capabilities)我这里特别要说明的就是IMEX 参数了,因为不同的模式代表著不同的读写行为:当IMEX=0 时为“汇出模式”,这个模式开启的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平台上,告警也很多。
C++BUILDER中OLE操作EXCEL的文件
C++BUILDER中OLE操作EXCEL的文件用OLE操作EXCEL文件一、首先在函数最上方加入以下头文件(很重要)#include "stdio.h"#include "Excel_2K_SRVR.h"在头文件中的private下定义:Variant Ex,Wb,Sheet,ERange,EBorders;二、要先创建和设置以下函数。
AnsiString ExcelFileName=GetCurrentDir()+"\\table.xls";Ex=Variant::CreateObject("Excel.Application");//创建应用对象Ex.OlePropertySet("Visible",false);//使Excel程序不可见Wb=Ex.OlePropertyGet("WorkBooks").OleFunction("Add"); Wb.OleProcedure("SaveAs",ExcelFileName.c_str());//根据路径保存Wb.OleProcedure("Close");//关闭工作簿Ex.OleFunction("Quit");//关闭Excel(以上函数可实现对EXCEL的创建然后保存关闭)三、要对所创建的EXCEL文件进行错误检测try{Ex=Variant::CreateObject("Excel.Application");}catch(…){Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK);return;}四、当第三中的try中有创建EXCEL对象,就有对它的属性也就是显示或隐藏进行设置和打开,如下:Ex.OlePropertySet("Visible",false);Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",Exce lFile Name.c_str());//打开指定的Excel表格文件。
C#使用OLE技术操作excel
cmd.ExecuteNonQuery();
//增加資料
mandText = "INSERT INTO [" + SheetName + "$] VALUES(1,'elmer','password')";
//連線字串
string cs =
"Data Source=" + FileName + ";" +
"Provider=" + ProviderName +
"Extended Properties=" + ExtendedString +
"HDR=" + Hdr +
1.4 "HDR":第一行是否為標題
1.5 "IMEX" :通知驅動程序始終將「互混」數據列作為文本讀取
//定義OLE======================================================
//1.檔案位置
private const string FileName = "C:\\test.xls";
//4.第一行是否為標題
private const string Hdr = "Yes;";
//5.IMEX=1 通知驅動程序始終將「互混」數據列作為文本讀取
private const string IMEX = "0';";
vc访问excel的两篇文章(主要介绍OLE方式).
vc访问excel的两篇文章(主要介绍OLE方式).文章一、Excel操作类-CSpreadSheet and BasicExcel CSpreadSheet - A Class to Read and Write to Excel and Text Delimited Spreadsheet,使用ODBC操作ExcelBasicExcel - A Class to Read and Write to Microsoft Excel,直接从Excel文件格式出发,操作Excel#转载:由于工作需要,需要在excel和mysql数据库之间互相交换数据,于是在网上搜索了一下用vc如何操作excel,基本上有三种实现方式,一种是利用odbc,一种是使用微软的automation技术,一种就是直接分析excel的格式并进行解析。
在codeproject上找到两个开源的操作类,一个是basicexcel,地址为:一个是CSpreadSheet,地址为:两个我都使用了一下,最后决定使用basicexcel,下面说说我的感受:1 CSpreadSheet,采用odbc实现,速度慢,bug多,但是对中文支持比较好,但是有个让我最不能忍受的确定,就是它把所有的数据写入excel中时都当作字符串来实现,这样导致在excel的每个field 中的内容前都自动添加一个单引号,原因是excel为了防止自动格式转换,添加一个单引号使得每个数据项都强制转换成字符串类型。
最后怎么都去不掉,只好放弃使用。
2 basicexcel,采用com方式实现,访问速度快,api接口也比较简单,可以随意设置excel中field内容的类型,但是对于中文的支持不好,要自己处理汉字编码,支持ansi字符和unicode字符。
刚开始的时候写入的汉字都是乱码,后来自己做了字符转换,吧gb2312编码的汉字转变成unicode编码,就可以正常显示了这两个类在官方网页上都有api使用说明和示例工程,大家一起交流...由于刚刚使用,感受暂时就这么多了,感觉微软的东西还真是麻烦...文章二、VC操作Excel文件编程相关内容总结本文来自CSDN博客,转载请标明出处:/handsing/archive/2010/04/08/5461070.asp x最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要报给其他单位)。
C++使用OLE高速读写EXCEL的源码
90.///写入一个CELL一个int
91.voidSetCellInt(longirow,longicolumn,intnew_int);
92.///写入一个CELL一个string
93.voidSetCellString(longirow,longicolumn,CString new_string);
38.
39.#include "StdAfx.h"
40.#include "illusion_excel_file.h"
41.
42.
43.
44.COleVariant
45.covTrue((short)TRUE),
46.covFalse((short)FALSE),
47.covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
小小伤心一下,我blog里面写的很认真的文字还有几篇,这篇大概是最随意的文章。个人估计这是SEO的作用导致的。
另外,由于文中提到了可以加快OLE读取的EXCEL的速度,总有一些哥们找我要代码。
好吧,好吧,把代码放出来,因为我原来也是找人家的代码逐步改的。来而不往非礼也。
我的代码参考的地方是这儿,再次感谢原作者
71.///通过名称使用某个sheet,
72.BOOLLoadSheet(constchar* sheet,BOOLpre_load = FALSE);
73.///通过序号取得某个Sheet的名称
74.CString GetSheetName(longtable_index);
75.
76.///得到Sheet的总数
59.{
60.//
c#读取excel数据的两种方法实现
c#读取excel数据的两种⽅法实现⽅法⼀:OleDb:⽤这种⽅法读取Excel速度还是⾮常的快的,但这种⽅式读取数据的时候不太灵活,不过可以在 DataTable 中对数据进⾏⼀些删减修改。
优点:读取⽅式简单、读取速度快缺点:除了读取过程不太灵活之外,这种读取⽅式还有个弊端就是,当Excel数据量很⼤时。
会⾮常占⽤内存,当内存不够时会抛出内存溢出的异常。
不过⼀般情况下还是⾮常不错的。
(代码⽐原⽂相较有所修改)DataTable GetDataFromExcelByConn(bool hasTitle = false){OpenFileDialog openFile = new OpenFileDialog();openFile.Filter = "Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls";openFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);openFile.Multiselect = false;if (openFile.ShowDialog() == DialogResult.Cancel) return null;var filePath = openFile.FileName;string fileType = System.IO.Path.GetExtension(filePath);if (string.IsNullOrEmpty(fileType)) return null;using (DataSet ds = new DataSet()){string strCon = string.Format("Provider=Microsoft.Jet.OLEDB.{0}.0;" +"Extended Properties=\"Excel {1}.0;HDR={2};IMEX=1;\";" +"data source={3};",(fileType == ".xls" ? 4 : 12), (fileType == ".xls" ? 8 : 12), (hasTitle ? "Yes" : "NO"), filePath);string strCom = " SELECT * FROM [Sheet1$]";using (OleDbConnection myConn = new OleDbConnection(strCon))using (OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn)){myConn.Open();myCommand.Fill(ds);}if (ds == null || ds.Tables.Count <= 0) return null;return ds.Tables[0];}}⽅法⼆:Com组件的⽅式读取Excel这种⽅式需要先引⽤ Microsoft.Office.Interop.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平台上,告警也很多。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.#include <CWorksheet.h>
8.#include <CWorksheets.h>
9.#include <CApplication.h>
10.
11.///
12.///用于OLE的方式的EXCEL读写,
13.classIllusionExcelFile
48.
49.//
50.CApplication IllusionExcelFile::excel_application_;
51.
52.
53.IllusionExcelFile::IllusionExcelFile():
54.already_preload_(FALSE)
55.{
56.}
57.
58.IllusionExcelFile::~IllusionExcelFile()
41.COleSafeArray ole_safe_array_;
42.
43.protected:
44.
45.///EXCEL的进程实例
46.staticCApplication excel_application_;
47.public:
48.
49.///
50.voidShowInExcel(BOOLbShow);
32.///当前使用sheet
33.CWorksheet excel_work_sheet_;
34.///当前的操作区域
35.CRange excel_current_range_;
36.
37.
38.///是否已经预加载了某个sheet的数据
39.BOOLalready_preload_;
40.///Create the SAFEARRAY from the VARIANT ret.
我自己这儿一直保存了一套别人生成的这几个文件,也可以用。大家可以找找有没有下载的,不过我不太确认跨版本是否可行。
还有既然是OLE,你一定要安装EXCEL的。
1.#pragma once
2.
3.//OLE的头文件
4.#include <CRange.h>
5.#include <CWorkbook.h>
73.///通过序号取得某个Sheet的名称
74.CString GetSheetName(longtable_index);
75.
76.///得到Sheet的总数
77.intGetSheetCount();
78.
79.///打开文件
80.BOOLOpenExcelFile(constchar* file_name);
14.{
15.
16.public:
17.
18.//构造函数和析构函数
19.IllusionExcelFile();
20.virtual~IllusionExcelFile();
21.
22.protected:
23.///打开的EXCEL文件名称
24.CString open_excel_file_;
90.{
91.//先关闭
92.CloseExcelFile();
93.
94.//利用模板文件建立新文档
95.excel_books_.AttachDispatch(excel_application_.get_Workbooks(),true);
96.
97.LPDISPATCH lpDis = NULL;
59.{
60.//
61.CloseExcelFile();
62.}
63.
64.
65.//初始化EXCEL文件,
66.BOOLIllusionExcelFile::InitExcel()
67.{
68.
69.//创建Excel 2000服务器(启动Excel)
70.if(!excel_application_.CreateDispatch("Excel.Application",NULL))
99.staticvoidReleaseExcel();
100.///取得列的名称,比如27->AA
101.staticchar*GetColumnName(longiColumn);
102.
103.protected:
104.
105.//预先加载
106.voidPreLoadSheet();
107.};
13.1.Date :
14.Author :.
17.这个类是从网上下载的,我坐享其成,感谢原来的作者,我只试试是稍稍做了一下修正。
18.修正包括一些参数的使用不谨慎,bool 改为BOOL等,对于对象关系,我改了一部分,感觉原来的作者对于OO的思路部分不是很清楚。
38.
39.#include "StdAfx.h"
40.#include "illusion_excel_file.h"
41.
42.
43.
44.COleVariant
45.covTrue((short)TRUE),
46.covFalse((short)FALSE),
47.covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
25.
26.///EXCEL BOOK集合,(多个文件时)
27.CWorkbooks excel_books_;
28.///当前使用的BOOK,当前处理的文件
29.CWorkbook excel_work_book_;
30.///EXCEL的sheets集合
31.CWorksheets excel_sheets_;
3.FileName : illusion_excel_file.cpp
4.Author : Sail
5.Version :
6.Date Of Creation : 2009年4月3日
7.Description :
8.
9.Others :
10.Function List :
11.1. ......
12.Modification History:
98.lpDis = excel_books_.Add(COleVariant(file_name));
99.if(lpDis)
100.{
101.excel_work_book_.AttachDispatch(lpDis);
92.///写入一个CELL一个string
93.voidSetCellString(longirow,longicolumn,CString new_string);
94.
95.public:
96.///初始化EXCEL OLE
97.staticBOOLInitExcel();
98.///释放EXCEL的 OLE
59.///得到整数
60.intGetCellInt(longiRow,longiColumn);
61.///得到double的数据
62.doubleGetCellDouble(longiRow,longiColumn);
63.
64.///取得行的总数
65.intGetRowCount();
66.///取得列的总数
好吧,好吧,把代码放出来,因为我原来也是找人家的代码逐步改的。来而不往非礼也。
我的代码参考的地方是这儿,再次感谢原作者
/gyssoft/archive/2007/04/29/1592104.aspx
我根据自己的需要做了整理,干净了一点,而后根据发现的速度问题做了一些优化。
19.对于这类东西OLE,我完全不了解,用别人封装的东西感觉还是放心了很多,C++,伟大的C++
20./gyssoft/archive/2007/04/29/1592104.aspx
21.
22.OLE读写EXCEL都比较慢,所以应该尽量减少OLE的次数
23.对于读取,还有解决方法,请试用一下预加载的方式,这个方法一次加载所有的读取数据,如此速度就飞快了。
86.CString GetOpenFileName();
87.///取得打开sheet的名称
88.CString GetLoadSheetName();
89.
90.///写入一个CELL一个int
91.voidSetCellInt(longirow,longicolumn,intnew_int);
81.///关闭打开的Excel 文件,有时候打开EXCEL文件就要
82.voidCloseExcelFile(BOOLif_save = FALSE);
83.//另存为一个EXCEL文件
84.voidSaveasXSLFile(constCString &xls_file);
85.///取得打开文件的名称
CPP文件的与代码如下:
[cpp]view plaincopy
1./******************************************************************************************
2.Copyright : 2000-2004, Appache 2.0
71.{
72.AfxMessageBox("创建Excel服务失败,你可能没有安装EXCEL,请检查!");
73.returnFALSE;
74.}
75.
76.excel_application_.put_DisplayAlerts(FALSE);