MFC操作excel存取数据全步骤
- 格式:pdf
- 大小:161.82 KB
- 文档页数:5
由于目前的工作内容涉及到了几处需要输出EXCEL表格的内容,因此在网上也查找了些资料,在下面总结下,以方便使用;1、当你输出的内容已经在输出的时候全部知道,并且输出格式已经固定,那么你就可以使用下面的方法输出,用if( (pfile = fopen(strFileName, "wb+")) != NULL)打开EXCEL,然后在其中用fprintf写入,用\T到下一个单元格,用\n到下一行;适合输出内容固定,格式固定的内容。
[cpp]</pre><pre name="code" class="cpp">void CRqEquipReqView::SaveDxcFileXLS(CString strFileName, BOOL bSaveAsAll){FILE *pfile = NULL;CString strGroupName;CString strMain, strSlave;CString strMainName, strMainCreateTime, strMainDirection, strMainCap, strMainStatus; CString strMainSrc, strMainSrcAccess, strMainSrcConGroup;CString strMainDst, strMainDstAccess, strMainDstConGroup;CString strProName, strProCreateTime, strProDirection, strProCap, strProStatus;CString strProSrc, strProSrcAccess, strProSrcConGroup;CString strProDst, strProDstAccess, strProDstConGroup;strMain.LoadString(IDS_RQNLPCT_MAIN);strSlave.LoadString(IDS_RQNLPCT_SLAVE);if(m_pRqGroup){strGroupName = m_pRqGroup->GetName();}int MainCount = m_lstDxc.GetItemCount();int ProCount = m_lstProtDxc.GetItemCount();//参数中带'b'的话是以二进制文件形式打开文件, 否则是以文本文件打开.//以文本文件形式打开时, 值26就作为EOF了, 前者则不会.//如果不是保存成文本形式的话, 切记加上'b'//"a "模式在添加数据前并不清除EOF标志,添加数据后用MS-DOS的TYPE命令只能显示数据到原来EOF 标志,而并不会显示后来添加的.//"a+ "模式会清除EOF标志,添加数据后,用MS-DOS的TYPE命令能显示所有的数据."a+ "模式需要以CTRL+Z EOF标志结束的流输入.if( (pfile = fopen(strFileName, "wb+")) != NULL){fprintf(pfile, strGroupName + "-" + strMain + "\n");CString strItem;strItem.LoadString(IDS_RQSUBNET_DXCNAME);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_DXCCAP);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_DXCDIR);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_SRCCARD);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_SRCAP);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_SRCCONNECTGROUP);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_DSTCARD);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_DSTAP);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_RQSUBNET_DSTCONNECTGROUP);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_STATUS);fprintf(pfile, strItem + "\t");strItem.LoadString(IDS_DXCCREATETIME);fprintf(pfile, strItem + "\t\n");CRqNeDxc rqNeDxc;for(int mainDxc = 0; mainDxc < m_lstDxc.GetItemCount(); mainDxc++){int iDxcID = m_lstDxc.GetItemData(mainDxc);if (!m_bSingle){if(iDxcID < m_vRqNeDxcBiDsp.size()){rqNeDxc = m_vRqNeDxcBiDsp[iDxcID];}else{rqNeDxc = m_vRqNeDxcUniDsp[iDxcID - m_vRqNeDxcBiDsp.size()]; }}else{rqNeDxc = m_vRqDxc[iDxcID];}if(!bSaveAsAll && !rqNeDxc.GetSelected()){continue;}strMainName = m_lstDxc.GetItemText(mainDxc, NAMECOL);strMainCap = m_lstDxc.GetItemText(mainDxc, CAPCOL);strMainDirection = m_lstDxc.GetItemText(mainDxc, DIRCOL);strMainSrc = m_lstDxc.GetItemText(mainDxc, SRCCARDCOL);strMainSrcAccess = m_lstDxc.GetItemText(mainDxc, SRCTU12COL);strMainSrcAccess = " " + strMainSrcAccess;strMainSrcAccess += " ";strMainSrcConGroup = m_lstDxc.GetItemText(mainDxc, SRCCONGROUPCOL);strMainDst = m_lstDxc.GetItemText(mainDxc, DSTCARDCOL);strMainDstAccess = m_lstDxc.GetItemText(mainDxc, DSTTU12COL);strMainDstAccess = " " + strMainDstAccess;strMainDstAccess += " ";strMainDstConGroup = m_lstDxc.GetItemText(mainDxc, DSTCONGROUPCOL);strMainStatus = m_lstDxc.GetItemText(mainDxc, ENABLE);strMainCreateTime = m_lstDxc.GetItemText(mainDxc, CREATET IME);fprintf(pfile, strMainName + "\t");fprintf(pfile, strMainCap + "\t");fprintf(pfile, strMainDirection + "\t");fprintf(pfile, strMainSrc + "\t");fprintf(pfile, strMainSrcAccess + "\t");fprintf(pfile, strMainSrcConGroup + "\t");fprintf(pfile, strMainDst + "\t");fprintf(pfile, strMainDstAccess + "\t");fprintf(pfile, strMainDstConGroup + "\t");fprintf(pfile, strMainStatus + "\t");fprintf(pfile, strMainCreateTime + "\t\n");}if(ProCount == 0){CString strTmp;strTmp.LoadString(IDS_NOPROTSERVICE);fprintf(pfile, strGroupName + "-" + strSlave + "(" + strTmp + ")" + "\n"); }else{fprintf(pfile, strGroupName + "-" + strSlave + "\n");}for(int proDxc = 0; proDxc < m_lstProtDxc.GetItemCount(); proDxc++){int iDxcID = m_lstProtDxc.GetItemData(proDxc);if (!m_bSingle){rqNeDxc = m_vRqNeDxcUniDsp_ForProList[iDxcID];}else{rqNeDxc = m_vRqDxc[iDxcID];}if(!bSaveAsAll && !rqNeDxc.GetSelected()){continue;}strProName = m_lstProtDxc.GetItemText(proDxc, NAMECOL);strProCap = m_lstProtDxc.GetItemText(proDxc, CAPCOL);strProDirection = m_lstProtDxc.GetItemText(proDxc, DIRCOL);strProSrc = m_lstProtDxc.GetItemText(proDxc, SRCCARDCOL);strProSrcAccess = m_lstProtDxc.GetItemText(proDxc, SRCTU12COL);strProSrcAccess = " " + strProSrcAccess;strProSrcAccess += " ";strProSrcConGroup = m_lstProtDxc.GetItemText(proDxc, SRCCONGROUPCOL);strProDst = m_lstProtDxc.GetItemText(proDxc, DSTCARDCOL);strProDstAccess = m_lstProtDxc.GetItemText(proDxc, DSTTU12COL);strProDstAccess = " " + strProDstAccess;strProDstAccess += " ";strProDstConGroup = m_lstProtDxc.GetItemText(proDxc, DSTCONGROUPCOL); strProStatus = m_lstProtDxc.GetItemText(proDxc, ENABLE);strProCreateTime = m_lstProtDxc.GetItemText(proDxc, CREATETIME);fprintf(pfile, strProName + "\t");fprintf(pfile, strProCap + "\t");fprintf(pfile, strProDirection + "\t");fprintf(pfile, strProSrc + "\t");fprintf(pfile, strProSrcAccess + "\t");fprintf(pfile, strProSrcConGroup + "\t");fprintf(pfile, strProDst + "\t");fprintf(pfile, strProDstAccess + "\t");fprintf(pfile, strProDstConGroup + "\t");fprintf(pfile, strProStatus + "\t");fprintf(pfile, strProCreateTime + "\t\n");}fclose(pfile);}else{CString strmsg;strmsg.LoadString(IDS_CLOSEEXCEL);AfxMessageBox(strmsg, 0, 0);}}2、这种输入方式,适合后台输出,不需要打开EXCEL文件,不需要选择输出路径,只是后台自己默默的记录EXCEL文件。
1.对excel的保存:1)excel合成需要如下步骤:通过MFC工程的类向导添加类,并从现有类库中选择(from a type library),在弹出的对话框中选择office的ex cel.exe(或者是exce l.olb),这里必须是of fice,而不能是wps,(对应得是et.exe,而不是exce l.exe)。
2)在弹出的对话框中选择_Applicat ion、Workboo ks、_Workbo ok、Workshe ets、_Worksh eet、Range,加入新类,即可达到用MF C 操作exc el的前提条件。
3)然后再用相应的MFC语句生成excel表格,注意excel保存时需要添加“comdef.h”头文件。
4)程序如下:在对应(需要操作exc el的)的CPP文件前加#include "comdef.h"_Applic ationExcelAp p;Workboo ks workboo ks;_Workbo ok workboo k;Workshe ets sheets;_Worksh eet sheet;Range range;if (!ExcelAp p.CreateD ispatc h("Excel.Applica tion",NULL)){AfxMess ageBox("创建Excel服务失败!");}//创建Excel 2000服务器(启动Excel)ExcelAp p.SetVisi ble(false);workboo ks.AttachD ispatc h(ExcelAp p.GetWork books(),true); //用来锁定对应的工作簿workboo k.AttachD ispatc h(workboo ks.Add(COleVar iant((_bstr_t)CString().AllocSy sSt rin g())));//得到Works heetssheets.AttachD ispatc h(workboo k.GetWork sheets(),true);sheet.AttachD ispatc h(sheets.GetItem(_varian t_t("Sheet1")),true);//得到全部Cel ls,此时,range是c ells的集合.range.AttachD ispatc h(sheet.GetCell s(),true);//设置1行2列的单元的值range.SetItem(_varian t_t((long)1),_varian t_t((long)2),_varian t_t("This Is A ExcelTestProgram!"));TCHAR szPath[MAX_PAT H];::GetCurr entDir ectory(MAX_PAT H, szPath);CString strPath(szPath);strPath +=_T("\\test.xlsx");sheet.SaveAs(strPath,vtMissi ng,vtMissi ng,vtMissi ng,vtMissi ng,vtMissi ng,vtMissi ng,vtMissi ng,vtMissi ng,vtMissi ng);ExcelAp p.SetVisi ble(true);ExcelAp p.Release Dispat ch();workboo ks.Release Dispat ch();workboo k.Release Dispat ch();sheets.Release Dispat ch();sheet.Release Dispat ch();2.Excel的数据读取:运用在MSDN中的示例函数(具体函数见ex cel文档创建示例4):根据顺序,依次从系统中获取app、books、book、sheets、sheet、range、对象,然后获取路径s t rpath。
doc文档可能在W AP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
MFC 实现excel 的读写操作这个是使用ODBC 来完成的第一步:建立基于对话框的MFC 工程,命名为MfctoExc;第二步:添加两个头文件到stdafx.h,#include #include <odbcinst.h>第三步:添加两个按钮控件和一个List Box 控件,给List Box 添加控制变量CListBox m_ExcelList;添加DDX_Control(pDX, IDC_LIST_BOX, m_ExcelList);第四步:给两个按钮添加两个功能函数,读写excelvoid CMfctoExcDlg::OnRead(){ // TODO: Add your control notification handler code hereCDatabase database;CString sSql;CString sItem1, sItem2,sItem3;CString sDriver;CString sDsn;CString sFile,sPath;//获取主程序所在路径,存在sPath 中GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PA TH); 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); // 设置读取的查询语句. sSql = "SELECT Num,Name, Age " //设置索引顺序"FROM Exceldemo " ; "ORDER BY Name "; // 执行查询语句recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); // 获取查询结果while (!recset.IsEOF()) { //读取Excel 内部数值recset.GetFieldValue("Num", sItem1); recset.GetFieldValue("Name", sItem2); recset.GetFieldValue("Age", sItem3); //显示记取的内容m_ExcelList.AddString( sItem1 + " --> "+sItem2+ " --> "+sItem3 ); // 移到下一行recset.MoveNext(); } // 关闭数据库database.Close();} CATCH(CDBException, e) { // 数据库操作产生异常时……AfxMessageBox("数据库错误: " + e->m_strError); } END_CATCH; } void CMfctoExcDlg::OnWrite() { // TODO: Add your control notification handler code here CDatabase database; CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel 安装驱动CString sExcelFile,sPath; CString sSql; //获取主程序所在路径,存在sPath 中GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH); sPath.ReleaseBuffer (); int nPos; nPos=sPath.ReverseFind ('\\'); sPath=sPath.Left (nPos); sExcelFile = sPath + "\\Demo.xls"; TRY { // 创建进行存取的字符串sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONL Y=FALSE;CREATE_DB= \"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile); // 创建数据库(既Excel 表格文件) if( database.OpenEx(sSql,CDatabase::noOdbcDialog) ) { // 创建表结构(序号、姓名、年龄) sSql = "CREATE TABLE Exceldemo (Num Number,Name TEXT,Age NUMBER)";//可以用中文表示序号,姓名,年龄等database.ExecuteSQL(sSql); // 插入数值sSql = "INSERT INTO Exceldemo (Num,Name,Age) V ALUES (1,'小西',24)"; database.ExecuteSQL(sSql); sSql = "INSERT INTO Exceldemo (Num,Name,Age) V ALUES (2,'小东',22)"; database.ExecuteSQL(sSql); sSql = "INSERT INTO Exceldemo (Num,Name,Age) V ALUES (3,'小朱',25)"; database.ExecuteSQL(sSql); sSql = "INSERT INTO Exceldemo (Num,Name,Age) V ALUES (4,'小鸭',27)"; database.ExecuteSQL(sSql); } // 关闭数据库database.Close(); AfxMessageBox("Excel 文件写入成功!"); } CA TCH_ALL(e) { TRACE1("Excel 驱动没有安装: %s",sDriver); } // 要建立的Excel 文件END_CATCH_ALL; } 第五步:添加成员函数CString CMfctoExcDlg::GetExcelDriver() { char szBuf[2001]; WORD cbBufMax = 2000; WORD cbBufOut; char *pszBuf = szBuf; CString sDriver; // 获取已安装驱动的名称(涵数在odbcinst.h 里) if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) return ""; // 检索已安装的驱动是否有Excel……do { if (strstr(pszBuf, "Excel") != 0) { //发现! sDriver = CString(pszBuf); break; } pszBuf = strchr(pszBuf, '\0') + 1; } while (pszBuf[1] != '\0'); return sDriver; } 文件存储路径设置:CString filename, sExcelFile ; CFileDialog fileDlg (FALSE, "Path", filename,OFN_FILEMUSTEXIST| OFN_HIDEREADONL Y, "*.xls "); if( fileDlg.DoModal()==IDOK) { sExcelFile = fileDlg.GetPathName(); CFileFind finder; BOOL bWorking = finder.FindFile(sExcelFile);//寻找文件// 要建立的Excel 文件if (bWorking)//如果已经存在文件,则删除{ CFile::Remove((LPCTSTR)sExcelFile);} } else return ; 将变量写入Excel 可以用下面的笨方法:for(int i=0;i<5;i++) { sSql = "INSERT INTO Exceldemo (Num,Name,Age) V ALUES ("; str0.Format("%d",a[i]); sSql=sSql+str0; sSql=sSql+",'"; sSql=sSql+str[i]; sSql=sSql+"',"; str0.Format("%0.7f",data[i]); sSql=sSql+str0; sSql=sSql+")"; database.ExecuteSQL(sSql); } 其中a[ ]是一个int 型数组,str[ ]是CString 数组,data[ ]是float 数字1。
MFC操作Excel1.导入相应的类库1、导入的类:CApplication,CMyFont,CRange,CWorkBook,CWorkBooks,CWorkSheet,CWorkSheets,CBorders, Cnterior2、将导入的每个类的头文件中的import "C:\\Program Files(x86)\\Microsoft Office\\Office12\\EXCEL.EXE"no_namespace 注释掉3、在CApplication的头文件上面添加如下代码#import"C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" \rename("RGB", "MSORGB") \rename("DocumentProperties", "MSODocumentProperties") \ rename("SearchPath","MsoSearchPath") \rename_namespace("Office")using namespace Office;#import"C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"using namespace VBIDE;#import"C:\\Program Files (x86)\\MicrosoftOffice\\Office12\\EXCEL.EXE" \rename("DialogBox", "ExcelDialogBox") \rename("RGB","ExcelRGB") \rename("CopyFile", "ExcelCopyFile") \rename("ReplaceText", "ExcelReplaceText") \no_auto_excludeusing namespace Excel;4、重新对代码进行编译2.功能代码ExcelFile.h#pragma once#include"CApplication.h"#include"CWorkbook.h"#include"CWorkbooks.h"#include"CWorksheet.h"#include"CWorksheets.h"#include"CRange.h"#include"CExcelFont.h"#include"CBorders.h"#include"Cnterior.h"class ExcelFile{public:ExcelFile(void);~ExcelFile(void);public:static BOOL InitApp();static CApplication s_app;static BOOL isStart;static void Quit();public:CWorkbook m_book;TCHAR m_FileName[MAX_PATH];BOOL m_isOpen;CWorkbooks m_books;CWorksheets m_sheets;CWorksheet m_sheet;CRange m_curr_range;public:BOOL Create(LPTSTR szPathName);BOOL Open(LPTSTR szPathName);void Close();void Save();void SaveAs(CString pathName);//加载sheet 通过名字BOOL LoadSheet(LPTSTR sheetName);//加载sheet 通过索引位置BOOL LoadSheet(long index);//获取制定单元格的字符串值BOOL GetCellString(LPTSTR content,UINT len,long x,long y);//获取单元格中的数值BOOL GetCellNumber(DOUBLE * retVal,long x,long y);//获取单元格中的整数BOOL GetCellInt(LONG * retVal,long x,long y);//获取单元格中的日期BOOL GetCellDate(SYSTEMTIME* date,long x,long y);//向单元格中写字符串BOOL SetCellString(LPTSTR content,long x,long y);//向单元格中写整数BOOL SetCellInt(LONG val,long x,long y);//写浮点数BOOL SetCellNumber(DOUBLE val,long x,long y);//写日期BOOL SetCellDate(SYSTEMTIME date,long x,long y);//检查一个CELL是否是字符串BOOL IsCellString(long x,long y);//检查一个Cell是否是数值BOOL isCellNumber(long x,long y);//检查一个CELL是否是日期时间类型BOOL isCellDate(long x,long y);//得到当前sheet的总行数int GetRowCount();//得到当前sheet的总列数int GetColumnCount();//合并单元格void Merge(int x,int y,int cx,int cy);//坐标转换CString IndexToString(long x,long y);//写公式BOOL SetFormula(CString formula,long x,long y);//设置单元格格式BOOL SetNumberFormat(CString format,long x,long y); //============设置单个单元格字体格式=================//设置字体颜色BOOL SetFontColor(unsigned long color,long x,long y); //设置字体大小BOOL SetFontSize(unsigned char csize,long x,long y); //设置字体BOOL SetFontFamily(CString strStyle,long x,long y); //设置粗体BOOL SetBold(BOOL bBold,long x,long y);//============设置区域格式=========================//设置区域字体颜色BOOL SetRangeFontColor(unsigned long color,CStringc1,CString c2);//设置区域字体大小BOOL SetRangeFontSize(unsigned char csize,CStringc1,CString c2);//设置区域字体BOOL SetRangeFontFamily(CString strStyle,CStringc1,CString c2);//设置区域粗体BOOL SetRangeBold(BOOL bBold,CString c1,CString c2);//合并区域BOOL Merge(CString c1,CString c2);//设置区域的水平对其方式BOOL SetHorizontalAlignment(long mode,CStringc1,CString c2);//设置区域的垂直对其方式BOOL SetVerticalAlignment(long mode,CStringc1,CString c2);//设置列宽BOOL SetColumnWidth(long width,CString c1,CString c2);//设置行高BOOL SetRowHeight(long height,CString c1,CString c2);//设置边框线BOOL SetBorders(CString c1,CString c2);//设置表格底色BOOL SetColorIndex(unsigned long color,CStringc1,CString c2);//设置外边框线BOOL SetAround(CString c1,CString c2);//添加一个sheetBOOL AddSheet(CString sName);ExcelFile.cpp#include"stdafx.h"#include"ExcelFile.h"#include<stack>BOOL ExcelFile::isStart = FALSE;CApplication ExcelFile::s_app;COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);//程序退出void ExcelFile::Quit(){if (ExcelFile::isStart){ExcelFile::s_app.Quit();ExcelFile::s_app.ReleaseDispatch();ExcelFile::s_app = NULL;ExcelFile::isStart = FALSE;}}//程序初始化BOOL ExcelFile::InitApp(){if (ExcelFile::isStart){return TRUE;}if(!s_app.CreateDispatch(_T("Excel.Application"),NULL)){ return FALSE;}else{ExcelFile::isStart = TRUE;return TRUE;}}ExcelFile::ExcelFile(void){this->m_isOpen = FALSE;}ExcelFile::~ExcelFile(void){}//创建一个文件BOOL ExcelFile::Create(LPTSTR szPathName){if (m_isOpen){return FALSE;}m_books.AttachDispatch(ExcelFile::s_app.get_Workboo ks(),TRUE);LPDISPATCH lpDis = NULL;lpDis = m_books.Add(covOptional);if (lpDis){m_book.AttachDispatch(lpDis);m_sheets.AttachDispatch(m_book.get_Worksheets(),TRU E);_tcscpy_s(m_FileName,MAX_PATH,szPathName);m_isOpen = TRUE;this->SaveAs(szPathName);return TRUE;}return FALSE;}//打开一个文件BOOL ExcelFile::Open(LPTSTR szPathName){if (m_isOpen){return FALSE;}m_books.AttachDispatch(ExcelFile::s_app.get_Workboo ks(),TRUE);LPDISPATCH lpDis = NULL;lpDis =m_books.Open(szPathName,covOptional,covOptional,covOpt ional,covOptional,covOptional,covOptional,covOptional, covOptional,covOptional,covOptional,covOptional,covOpt ional,covOptional,covOptional);if (lpDis){m_book.AttachDispatch(lpDis);m_sheets.AttachDispatch(m_book.get_Worksheets(),TRU E);_tcscpy_s(m_FileName,MAX_PATH,szPathName);m_isOpen = TRUE;return TRUE;}return FALSE;}//关闭当前操作的文件void ExcelFile::Close(){if (m_isOpen){m_curr_range.ReleaseDispatch();m_curr_range.ReleaseDispatch();m_book.Close(COleVariant(short(FALSE)),COleVariant( m_FileName),covOptional);m_book.ReleaseDispatch();m_book.ReleaseDispatch();m_curr_range.ReleaseDispatch();m_sheet.ReleaseDispatch();m_sheets.ReleaseDispatch();m_books.ReleaseDispatch();this->m_isOpen = FALSE;}}//保存当前文件void ExcelFile::Save(){if (m_isOpen){m_book.Save();}}//另存为void ExcelFile::SaveAs(CString pathName){if (m_isOpen){m_book.SaveAs(COleVariant(pathName),covOptional,cov Optional,covOptional,covOptional,covOptional,0,covOpti onal,covOptional,covOptional,covOptional,covOptional);}}//加载sheetBOOL ExcelFile::LoadSheet(LPTSTR sheetName){if (!m_isOpen){return FALSE;}LPDISPATCH lpDis = NULL;m_curr_range.ReleaseDispatch();m_sheet.ReleaseDispatch();lpDis = m_sheets.get_Item(COleVariant(sheetName));if (lpDis){m_sheet.AttachDispatch(lpDis,TRUE);m_curr_range.AttachDispatch(m_sheet.get_Cells());return TRUE;}else{return FALSE;}}BOOL ExcelFile::LoadSheet(long index){if (!m_isOpen){return FALSE;}LPDISPATCH lpDis = NULL;m_curr_range.ReleaseDispatch();m_sheet.ReleaseDispatch();lpDis = m_sheets.get_Item(COleVariant(index));if (lpDis){m_sheet.AttachDispatch(lpDis,TRUE);m_curr_range.AttachDispatch(m_sheet.get_Cells());return TRUE;}else{return FALSE;}}//获取字符串值BOOL ExcelFile::GetCellString(LPTSTR content,UINTlen,long x,long y){COleVariant vResult ;CString str;if (m_isOpen){CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);vResult = range.get_Value2();range.ReleaseDispatch();//字符串if (vResult.vt == VT_BSTR){str = vResult.bstrVal;}//整数if (vResult.vt == VT_INT){str.Format(_T("%d"),vResult.intVal);}//8字节的数字if (vResult.vt == VT_R8){//AfxMessageBox(_T("r8"));str.Format(_T("%.4f"),vResult.dblVal);}//时间if (vResult.vt == VT_DATE){SYSTEMTIME st;VariantTimeToSystemTime(vResult.date, &st);CTime tm(st);str=tm.Format("%Y-%m-%d");}//空if (vResult.vt = VT_EMPTY){str = "";}_tcscpy_s(content,len,str.GetBuffer());return TRUE;}else{return FALSE;}}//向单元格中写字符串BOOL ExcelFile::SetCellString(LPTSTR content,long x,long y){if (m_isOpen){CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);range.put_Value2(COleVariant(content));range.ReleaseDispatch();return TRUE;}else{return FALSE;}}//检查一个CELL是否是字符串BOOL ExcelFile::IsCellString(long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVariant (x),COleVariant(y)).pdispVal,TRUE);COleVariant vResult = range.get_Value2();range.ReleaseDispatch();if (vResult.vt == VT_BSTR){return TRUE;}else{return FALSE;}}//检查一个Cell是否是数值BOOL ExcelFile::isCellNumber(long x,long y){ if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVariant (x),COleVariant(y)).pdispVal,TRUE);COleVariant vResult = range.get_Value2();range.ReleaseDispatch();if (vResult.vt == VT_INT || vResult.vt==VT_I8 || vResult.vt==VT_I4 || vResult.vt==VT_R4||vResult.vt==VT_R8){return TRUE;}else{return FALSE;}}//检查一个CELL是否是日期时间类型BOOL ExcelFile::isCellDate(long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVariant (x),COleVariant(y)).pdispVal,TRUE);COleVariant vResult = range.get_Value2();range.ReleaseDispatch();if (vResult.vt == VT_DATE){return TRUE;}else{return FALSE;}}//获取单元格中的数字BOOL ExcelFile::GetCellNumber(DOUBLE* retVal,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);COleVariant vResult = range.get_Value2();range.ReleaseDispatch();if (vResult.vt == VT_R8){*retVal = vResult.dblVal;return TRUE;}if (vResult.vt == VT_R4){*retVal = vResult.fltVal;return TRUE;}return FALSE;}//获取单元格中的整数BOOL ExcelFile::GetCellInt(LONG* retVal,long x,long y){ if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);COleVariant vResult = range.get_Value2();range.ReleaseDispatch();if (vResult.vt == VT_I4){*retVal = vResult.lVal;return TRUE;if (vResult.vt == VT_INT){*retVal = vResult.intVal;return TRUE;}return FALSE;}//获取单元格中的日期BOOL ExcelFile::GetCellDate(SYSTEMTIME* date,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);COleVariant vResult = range.get_Value2();range.ReleaseDispatch();if (vResult.vt == VT_DATE){VariantTimeToSystemTime(vResult.date, date);return TRUE;}return FALSE;}//向单元格中写整数BOOL ExcelFile::SetCellInt(LONG val,long x,long y){ if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);range.put_Value2(COleVariant((long)val));range.ReleaseDispatch();return TRUE;//写浮点数BOOL ExcelFile::SetCellNumber(DOUBLE val,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);range.put_Value2(COleVariant(double(val)));range.ReleaseDispatch();return TRUE;}//写日期BOOL ExcelFile::SetCellDate(SYSTEMTIME time,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);COleDateTime dateTime;dateTime.SetDate(time.wYear,time.wMonth,time.wDay);COleVariant v_time(dateTime);v_time.vt = VT_DATE;range.put_Value2(v_time);range.ReleaseDispatch();return TRUE;}//得到总行数int ExcelFile::GetRowCount(){CRange range;CRange useRange;useRange.AttachDispatch(m_sheet.get_UsedRange(),TRU E);range.AttachDispatch(useRange.get_Rows(),TRUE);int count = range.get_Count();useRange.ReleaseDispatch();range.ReleaseDispatch();return count;}//得到总列数int ExcelFile::GetColumnCount(){CRange range;CRange useRange;useRange.AttachDispatch(m_sheet.get_UsedRange(),TRU E);range.AttachDispatch(useRange.get_Columns(),TRUE);int count = range.get_Count();useRange.ReleaseDispatch();range.ReleaseDispatch();return count;}//合并单元格void ExcelFile::Merge(int x,int y,int cx,int cy){CRange range;CRange meRange;range.AttachDispatch(m_curr_range.get_Item(COleVariant(long(x)),COleVariant(long(y))).pdispVal,TRUE);meRange.AttachDispatch(range.get_Resize(COleVariant (long(cx)),COleVariant(long(cy))));meRange.Merge(COleVariant(long(0)));range.ReleaseDispatch();meRange.ReleaseDispatch();}//坐标转换将(2,3)类型的坐标转换为C2类型的坐标CString ExcelFile::IndexToString(long x,long y){ std::stack<char> ss;char mod = y%26;long dis = y/26;ss.push(mod);while (dis > 0){mod = dis%26;dis = dis/26;ss.push(mod);}CString str = _T("");while (!ss.empty()){str.AppendChar(_T('A' - 1 + ss.top()));ss.pop();}CString indexStr;indexStr.Format(_T("%s%d"),str,x);return indexStr;}//向单元格中写公式BOOL ExcelFile::SetFormula(CString formula,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);range.put_Formula(COleVariant(formula));range.ReleaseDispatch();return TRUE;}//设置单元格格式BOOL ExcelFile::SetNumberFormat(CString format,longx,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);range.put_NumberFormat(COleVariant(format));range.ReleaseDispatch();return TRUE;}//设置字体颜色BOOL ExcelFile::SetFontColor(unsigned long color,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);CExcelFont font = range.get_Font();font.put_Color(COleVariant(long(color)));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置字体大小BOOL ExcelFile::SetFontSize(unsigned char csize,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);CExcelFont font = range.get_Font();font.put_Size(COleVariant(csize));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置字体样式BOOL ExcelFile::SetFontFamily(CString strStyle,longx,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);CExcelFont font = range.get_Font();font.put_Name(COleVariant(strStyle));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置粗体BOOL ExcelFile::SetBold(BOOL bBold,long x,long y){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Item(COleVari ant(x),COleVariant(y)).pdispVal,TRUE);CExcelFont font = range.get_Font();font.put_Bold(COleVariant(short(bBold)));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置区域字体颜色BOOL ExcelFile::SetRangeFontColor(unsigned longcolor,CString c1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);CExcelFont font = range.get_Font();font.put_Color(COleVariant(long(color)));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置区域字体大小BOOL ExcelFile::SetRangeFontSize(unsigned charcsize,CString c1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);CExcelFont font = range.get_Font();font.put_Size(COleVariant(csize));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置区域字体BOOL ExcelFile::SetRangeFontFamily(CStringstrStyle,CString c1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);CExcelFont font = range.get_Font();font.put_Name(COleVariant(strStyle));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置区域粗体BOOL ExcelFile::SetRangeBold(BOOL bBold,CStringc1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);CExcelFont font = range.get_Font();font.put_Bold(COleVariant(short(bBold)));font.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//合并区域BOOL ExcelFile::Merge(CString c1,CString c2){ if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);range.Merge(COleVariant(long(0)));range.ReleaseDispatch();return TRUE;}//设置区域的水平对其方式BOOL ExcelFile::SetHorizontalAlignment(longmode,CString c1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);//-4108:居中,-4131:靠左,-4152:靠右range.put_HorizontalAlignment(COleVariant(long(mode )));range.ReleaseDispatch();return TRUE;}//设置区域的垂直对其方式BOOL ExcelFile::SetVerticalAlignment(long mode,CString c1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);//-4160:靠上,-4108 :居中,-4107:靠下range.put_VerticalAlignment(COleVariant(long(mode)) );range.ReleaseDispatch();return TRUE;}//设置列宽BOOL ExcelFile::SetColumnWidth(long width,CStringc1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);range.put_ColumnWidth(COleVariant(long(width)));range.ReleaseDispatch();return TRUE;}//设置行高BOOL ExcelFile::SetRowHeight(long height,CStringc1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);range.put_RowHeight(COleVariant(long(height)));range.ReleaseDispatch();return TRUE;}//设置边框线BOOL ExcelFile::SetBorders(CString c1,CString c2){if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);CBorders borders;borders.AttachDispatch(range.get_Borders());borders.put_LineStyle(COleVariant((long)XlLineStyle ::xlContinuous));borders.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置表格底色BOOL ExcelFile::SetColorIndex(unsigned longcolor,CString c1,CString c2){if (!m_isOpen){return FALSE;}CRange range;Cnterior ct;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);ct.AttachDispatch(range.get_Interior());ct.put_Color(COleVariant((long)(color)));ct.ReleaseDispatch();range.ReleaseDispatch();return TRUE;}//设置外边框线BOOL ExcelFile::SetAround(CString c1,CString c2){ if (!m_isOpen){return FALSE;}CRange range;range.AttachDispatch(m_curr_range.get_Range(COleVar iant(c1),COleVariant(c2)),TRUE);range.BorderAround(COleVariant((long)XlLineStyle::x lContinuous),2,0,vtMissing);range.ReleaseDispatch();return TRUE;}//添加一个sheetBOOL ExcelFile::AddSheet(CString sName){if (!m_isOpen){return FALSE;}CWorksheet sheet;LPDISPATCH lpDis = m_sheets.Add(vtMissing,vtMissing, _variant_t((long)1), vtMissing);if (lpDis){sheet.AttachDispatch(lpDis);sheet.put_Name(sName);sheet.ReleaseDispatch();return TRUE;}else{return FALSE;}}//删除一个sheetBOOL ExcelFile::DelSheet(CString sName){if (!m_isOpen){return FALSE;}CWorksheet sheet;LPDISPATCH lpDis =m_sheets.get_Item(COleVariant(sName));if (lpDis){sheet.AttachDispatch(lpDis);sheet.Delete();sheet.ReleaseDispatch();return TRUE;}else{return FALSE;}}//删除一个sheetBOOL ExcelFile::DelSheet(long index){if (!m_isOpen){return FALSE;}CWorksheet sheet;LPDISPATCH lpDis =m_sheets.get_Item(COleVariant(index));if (lpDis){sheet.AttachDispatch(lpDis);sheet.Delete();sheet.ReleaseDispatch();return TRUE;}else{return FALSE;}}//重命名一个sheet 通过NameBOOL ExcelFile::RenameSheet(CString sName,CString newName){if (!m_isOpen){return FALSE;}CWorksheet sheet;LPDISPATCH lpDis =m_sheets.get_Item(COleVariant(sName));if (lpDis){sheet.AttachDispatch(lpDis);sheet.put_Name(newName);sheet.ReleaseDispatch();return TRUE;}else{return FALSE;}}//重命名一个sheet //通过indexBOOL ExcelFile::RenameSheet(long index,CString newName){ if (!m_isOpen){return FALSE;}CWorksheet sheet;LPDISPATCH lpDis =m_sheets.get_Item(COleVariant(index));if (lpDis){sheet.AttachDispatch(lpDis);sheet.put_Name(newName);sheet.ReleaseDispatch();return TRUE;}else{return FALSE;}}。
1、创建基于对话框的应用程序;2、通过类型库增加6个类,分别为_Application, _Workbook, _Worksheet, Workbooks, Worksheets, Range。
这六个类添加完毕后会自动去掉'_',并在类之前加上C。
3、在C***Dlg类中增加上述六个类的对象做成员变量:CWorkbook book;CWorkbooks books;CWorksheet sheet;CWorksheets sheets;CRange range;CApplication app;4、在C***App类的Instance函数中增加下边的初始化函数,用来初时化com和ole。
注意,下边两个函数需要增加在定义对话框对象之前,否则不会倍执行。
::AfxOleInit();::CoInitialize(NULL);5、在C***Dlg.cpp文件中包含comdef.h头文件和string头文件。
对ok按钮添加相应函数,加入如下代码,在D盘增加TestExcel.xls文件,运行后D盘的Excel文件中的sheet1中的第一个单元格会被加入abcd。
if(!app.CreateDispatch("Excel.Application")){MessageBox("excel error!");return;}std::string strFileName = "D://TestExcel.xls";books.AttachDispatch(app.get_Workbooks(),TRUE);book.AttachDispatch(books.Add(_variant_t(strFileName.c_str())));LPDISPATCH pWorksheets = app.get_Worksheets();ASSERT(pWorksheets != NULL);sheets.AttachDispatch(pWorksheets, TRUE);//获得当前操作的sheetLPDISPATCH pWorksheet = sheets.get_Item(_variant_t("Sheet1"));ASSERT(pWorksheet != NULL);sheet.AttachDispatch(pWorksheet, TRUE);std::string str = "abcd";range.AttachDispatch(sheet.get_Cells(), TRUE);range.put_Item(_variant_t(1),_variant_t(1), _variant_t(str.c_str())); book.SaveCopyAs(_variant_t(strFileName.c_str()));版权声明:本文为博主原创文章,未经博主允许不得转载。
1.对excel的保存:1)excel合成需要如下步骤:通过MFC工程的类向导添加类,并从现有类库中选择(from a type library),在弹出的对话框中选择office 的excel.exe(或者是excel.olb),这里必须是office,而不能是wps,(对应得是et.exe,而不是excel.exe)。
2)在弹出的对话框中选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,即可达到用MFC操作excel的前提条件。
3)然后再用相应的MFC语句生成excel表格,注意excel保存时需要添加“comdef.h”头文件。
4)程序如下:在对应(需要操作excel的)的CPP文件前加#include"comdef.h"_Application ExcelApp;Workbooks workbooks;_Workbook workbook;Worksheets sheets;_Worksheet sheet;Range range;if(!ExcelApp.CreateDispatch("Excel.Application",NULL)){AfxMessageBox("创建Excel服务失败!");}//创建Excel2000服务器(启动Excel)ExcelApp.SetVisible(false);workbooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);//用来锁定对应的工作簿workbook.AttachDispatch(workbooks.Add(COleVariant((_bstr_t)CString().AllocSysSt ring())));//得到Worksheetssheets.AttachDispatch(workbook.GetWorksheets(),true);sheet.AttachDispatch(sheets.GetItem(_variant_t("Sheet1")),true);//得到全部Cells,此时,range是cells的集合.range.AttachDispatch(sheet.GetCells(),true);//设置1行2列的单元的值range.SetItem(_variant_t((long)1),_variant_t((long)2),_variant_t("This Is A Excel Test Program!"));TCHAR szPath[MAX_PATH];::GetCurrentDirectory(MAX_PATH,szPath);CString strPath(szPath);strPath+=_T("\\test.xlsx");sheet.SaveAs(strPath,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);ExcelApp.SetVisible(true);ExcelApp.ReleaseDispatch();workbooks.ReleaseDispatch();workbook.ReleaseDispatch();sheets.ReleaseDispatch();sheet.ReleaseDispatch();2.Excel的数据读取:运用在MSDN中的示例函数(具体函数见excel文档创建示例4):根据顺序,依次从系统中获取app、books、book、sheets、sheet、range、对象,然后获取路径strpath。
MFC对EXCEL的操作MFC对EXCEL的操作要说做OLE Automation容器,我还是喜欢VB,简单死了。
用V C,TMD能麻烦死你,不过使用起来“麻烦”也正是说明它相当灵话。
其实用VC实现自动化容器也只是麻烦,并不难。
我们一起来试试看怎么样?要做Excel的OLE自动化,前提当然是你得对Excel的可编程对象十分了解,了解它的最好方法就是使用VBA。
为了让大家有个比较,我们将首先用一段VB代码来实现一个最简单的Excel功能,再偿试用VC来实现同样的功能,看看工作量的差别有多大。
用VB实现自动化容器的好处是你根本不用知道什么是自动化,这就是我最喜欢的傻瓜用法。
真的吗?真的!不信我信就试试看!各位,请打开笔记本,启动VB6,建立一个标准工程,然后选择“工程”->“引用”,再选中“Microsoft Excel 8.0 Object Library”点OK,Excel对像库就装载进来了,就这么简单!然后在窗体建立一个命令按钮并输入如下代码:Private Sub Command1_Click()Dim xlsApp As ApplicationDim xlsWorkSheet As WorksheetDim xlsRange As Range' 第一段Set xlsApp = CreateObject("Excel.Application.8")xlsApp.Visible = True'第二段xlsApp.SheetsInNewWorkbook = 1'第三段With xlsApp.WorkbooksIf (.Count = 0) Then.AddEnd IfEnd With'第四段Set xlsWorkSheet = xlsApp.Worksheets.Item(1)xlsWorkSheet.Range("A1").Value = "用VB做,多简单!"End Sub上述代码启动Excel并在A1单元格中输入了几个字,这可能是做这个操作所用的最少代码(省略了错误处理)。
NX⼆次开发-基于MFC界⾯的NX对Excel读写操作(OLE⽅式(COM组件))EXCAL操作(⼀)打开写⼊新建⼀个MFC项⽬点击下⼀步选择基于对话框直接点完成,进来后如下图先点项⽬,右键属性,更改为多字节。
先什么都不动,编译⼀下代码。
默认看能不能通过。
然后点项⽬,右键类向导。
弹出窗⼝如下点击添加类-类型库中的MFC类弹出如下我们切换到⽂件,点击添加。
此处添加要找到的⽂件就是你电脑上装的EXCAL.exe这个程序⽂件。
如果你不知道怎么找到的话,有⼀个⽅法,先去开始菜单找到你的EXCAL快捷⽅式,然后在点右键,打开⽂件所在的位置。
这样就找到了。
下⾯在回到MFC项⽬⾥⾯,我们选中这个⽂件。
添加进来之后,如图所⽰。
左侧为EXCAL给出的接⼝,我们来选择⼀些需要的添加进来。
我们就先添加这七个,后续有其他需求在添加其他的。
(先在左侧接⼝⾥选中⼀个,点中间的>就能添加到右侧⾥⽣成的类⾥,不想要就在点中间的<撤退回去。
)然后我们点完成,点确定。
就看到头⽂件⾃动添加进来了。
我们点击新增进来的EXCAL每个头⽂件,都把第⼀⾏的那句注释掉。
都注释完之后,我们在#include "stdafx.h"⾥添加EXCAL头⽂件,然后编译代码,出现如下报错问题。
这时我们双击这个错误,跳到对应的代码那⾥。
有问题的位置如下我们需要在DialogBox前⾯加上⼀个 _ 下划线。
再去编译就通过了。
别问我为什么,我答不上来,你照着搞就是了,别⼈就是这么搞的。
好的,到这⾥我们这个项⽬环境就算搭建完成了。
下⾯可以写代码了。
点击MFC那个对话框界⾯,双击确定。
在⾥⾯写代码。
代码如下:打开EXCAL,写⼊内容。
1//1.创建基本对象2 CApplication App; //创建应⽤程序实例3 CWorkbooks Books; //⼯作簿,多个Excel⽂件4 CWorkbook Book; //单个⼯作簿5 CWorksheets sheets;//多个sheet页⾯6 CWorksheet sheet; //单个sheet页⾯7 CRange range; //操作单元格8//2.打开指定Excel⽂件,如果不存在就创建9char path[MAX_PATH];10 GetCurrentDirectory(MAX_PATH, (TCHAR*)path);//获取当前路径11 CString strExcelFile = (TCHAR*)path;12 CString strdevName = _T("\\Test.xlsx"); //xls也⾏13 strExcelFile += strdevName;14 COleVariant15 covTrue((short)TRUE),16 covFalse((short)FALSE),17 covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);1819 LPDISPATCH lpdisp = NULL;20//1.创建Excel实例21if (!App.CreateDispatch(_T("Excel.Application"), NULL))22 {23 AfxMessageBox(_T("创建Excel实例失败"));24 exit(-1);25 }26else27 {28 AfxMessageBox(_T("创建成功"));29 }30 App.put_Visible(TRUE); //打开Excel31 App.put_UserControl(FALSE);32//2. 得到workbooks容器33 Books.AttachDispatch(App.get_Workbooks());34 Book.AttachDispatch(Books.Add(covOptional));35 sheets.AttachDispatch(Book.get_Worksheets());36 sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1))); //获取sheet137 sheet.put_Name(_T("TestName")); //设置sheet1名字3839//3. 加载要合并的单元格40 range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);41 range.Merge(COleVariant((long)0)); //合并单元格4243//4. 设置表格内容44 range.AttachDispatch(sheet.get_Cells(), TRUE); //加载所有单元格45 range.put_Item(COleVariant((long)2), COleVariant((long)2), COleVariant(_T("电⽓⼯程及其⾃动化课程统计")));46 range.put_Item(COleVariant((long)3), COleVariant((long)2), COleVariant(_T("课程名称")));47 range.put_Item(COleVariant((long)3), COleVariant((long)3), COleVariant(_T("课时")));48 range.put_Item(COleVariant((long)3), COleVariant((long)4), COleVariant(_T("难度")));49 range.put_Item(COleVariant((long)3), COleVariant((long)5), COleVariant(_T("教学⽅式")));5051 range.put_Item(COleVariant((long)4), COleVariant((long)2), COleVariant(_T("电磁场")));52 range.put_Item(COleVariant((long)4), COleVariant((long)3), COleVariant(_T("30")));53 range.put_Item(COleVariant((long)4), COleVariant((long)4), COleVariant(_T("变态难")));54 range.put_Item(COleVariant((long)4), COleVariant((long)5), COleVariant(_T("⽼师讲课")));5556 range.put_Item(COleVariant((long)5), COleVariant((long)2), COleVariant(_T("电机学")));57 range.put_Item(COleVariant((long)5), COleVariant((long)3), COleVariant(_T("40")));58 range.put_Item(COleVariant((long)5), COleVariant((long)4), COleVariant(_T("难")));59 range.put_Item(COleVariant((long)5), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));6061 range.put_Item(COleVariant((long)6), COleVariant((long)2), COleVariant(_T("PLC")));62 range.put_Item(COleVariant((long)6), COleVariant((long)3), COleVariant(_T("20")));63 range.put_Item(COleVariant((long)6), COleVariant((long)4), COleVariant(_T("普通")));64 range.put_Item(COleVariant((long)6), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));656667 range.put_Item(COleVariant((long)7), COleVariant((long)2), COleVariant(_T("电⼒系统")));68 range.put_Item(COleVariant((long)7), COleVariant((long)3), COleVariant(_T("50")));69 range.put_Item(COleVariant((long)7), COleVariant((long)4), COleVariant(_T("难")));70 range.put_Item(COleVariant((long)7), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));7172 range.AttachDispatch(sheet.get_UsedRange());//加载已使⽤的单元格73 range.put_WrapText(COleVariant((long)1)); //设置⽂本⾃动换⾏7475//5.设置对齐⽅式76//⽔平对齐:默认 1 居中 -4108,左= -4131,右=-415277//垂直对齐:默认 2 居中 -4108,左= -4160,右=-410778 range.put_VerticalAlignment(COleVariant((long)-4108));79 range.put_HorizontalAlignment(COleVariant((long)-4108));80//6.设置字体颜⾊81 CFont0 ft;82 ft.AttachDispatch(range.get_Font());83 ft.put_Name(COleVariant(_T("楷体"))); //字体84 ft.put_ColorIndex(COleVariant((long)1));//颜⾊ //⿊⾊85 ft.put_Size(COleVariant((long)12)); //⼤⼩8687 range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);88 ft.AttachDispatch(range.get_Font());89 ft.put_Name(COleVariant(_T("华⽂⾏楷")));90 ft.put_Bold(COleVariant((long)1));91 ft.put_ColorIndex(COleVariant((long)5)); //颜⾊92 ft.put_Size(COleVariant((long)18)); //⼤⼩93 Book.SaveCopyAs(COleVariant(strExcelFile)); //保存9495 Book.put_Saved(TRUE);96//8.释放资源97 range.ReleaseDispatch();98 sheet.ReleaseDispatch();99 sheets.ReleaseDispatch();100 Book.ReleaseDispatch();101 Books.ReleaseDispatch();102 App.ReleaseDispatch();编译后,我们点调试-开始执⾏。
VC和excel数据导出与保存在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加进去,因为网上流传的绝大部分教程都只添加这几个类,这完全根据你个人的需要。
但在本例中我们至少还要用到Interior类(设置底色),Font类(设置字体),而且这样做又简单又方便扩展功能,不管三七二十一全部弄进去吧!但这样做会有一个问题,有可能产生类的名字冲突,例如本来你自己写了一个类叫Font,当你全部添加时又再次加入了Font类,这样就重复定义了,不过可以通过名字空间来解决这个问题。
再在VCExcelDlg.cpp文件的头部添加(如果系统已经自动添加就不要重复添加了):#include "VCExcel.h"#include "comdef.h"这样一来我们的程序就可以自由调用EXCEL了,一切准备就绪。
下面先在CVCExcelDlg中添加如下成员变量,用来操控Excel应用程序、工作簿和单元格。
Range m_ExlRge;_Worksheet m_ExlSheet;Worksheets m_ExlSheets;_Workbook m_ExlBook;Workbooks m_ExlBooks;_Application m_ExlApp;我们利用加载Excel模板来生成要求的表格,在本工程Debug文件夹中建立一个Excel文件,命名为Template.xls。
使用excel提取数据的步骤
使用Excel提取数据的步骤如下:
1.打开Excel表格,选择需要提取数据的单元格或列。
2.使用Excel的筛选功能,选择需要筛选的条件,如文本筛选、数字筛选等。
3.在筛选条件下,选择需要提取的数据,可以通过手动选择或使用快捷键Ctrl+Shift+
下箭头进行批量选择。
4.将选择的数据复制到其他位置,如另一个单元格、列或工作表。
可以使用Ctrl+C复
制数据,然后使用Ctrl+V粘贴数据。
5.如果需要进一步处理或分析数据,可以使用Excel的函数、公式和图表等功能。
以上是使用Excel提取数据的基本步骤,具体操作可能会因Excel版本和个人习惯而有所不同。