MFC操作Excel
下面的操作基于Excel2003
一.初始化操作
1.导入类库
点击查看->建立类向导-> Add Class...\From a type Library...-> C:\Program Files\Microsoft Office\Office\EXCEL.EXE,接下来就可以看到导入的类excel.h, excel.cpp。
2.初始化COM
找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用,如:
if (!AfxOleInit())
{
AfxMessageBox("注册COM出错!");
return FALSE;
}
二.我自己写的Excel操作类
ExcelOperate.h
#include "atlbase.h"
#include "excel.h"
using namespace myexcel;
class CExcelOperate
{
private:
myexcel::_Application m_ecApp;
Workbooks m_ecBooks;
_Workbook m_ecBook;
Worksheets m_ecSheets;
_Worksheet m_ecSheet;
myexcel::Range m_ecRange;
VARIANT ret;//保存单元格的值
public:
CExcelOperate();
virtual ~CExcelOperate();
public:
//操作
//**********************创建新EXCEL*******************************************
BOOL CreateApp();
BOOL CreateWorkbooks(); //创建一个新的EXCEL工作簿集合
BOOL CreateWorkbook(); //创建一个新的EXCEL工作簿
BOOL CreateWorksheets(); //创建一个新的EXCEL工作表集合
BOOL CreateWorksheet(short index); //创建一个新的EXCEL工作表
BOOL CreateSheet(short index);
BOOL Create(short index = 1); //创建新的EXCEL应用程序并创建一个新工作簿和工作表
void ShowApp(); //显示EXCEL文档
void HideApp(); //隐藏EXCEL文档
//**********************打开文档*********************************************
BOOL OpenWorkbook(CString fileName, short index = 1);
BOOL Open(CString fileName); //创建新的EXCEL应用程序并打开一个已经存在的文档。
BOOL SetActiveWorkbook(short i); //设置当前激活的文档。
//**********************保存文档*********************************************
BOOL SaveWorkbook(); //Excel是以打开形式,保存。
BOOL SaveWorkbookAs(CString fileName);//Excel以创建形式,保存。
BOOL CloseWorkbook();
void CloseApp();
//**********************读信息********************************
BOOL GetRangeAndValue(CString begin, CString end);//得到begin到end的Range并将之间的值设置到ret中
void GetRowsAndCols(long &rows, long &cols);//得到ret的行,列数
BOOL GetTheValue(int rows, int cols, CString &dest);//返回第rows,cols列的值,注意只返回文本类型的,到dest中
BOOL SetTextFormat(CString &beginS, CString &endS);//将beginS到endS设置为文本格式(数字的还要用下面的方法再转一次)
BOOL SetRowToTextFormat(CString &beginS, CString &endS);//将beginS到endS(包括数字类型)设置为文本格式
};
ExcelOperate.cpp
CExcelOperate::CExcelOperate()
{
}
CExcelOperate::~CExcelOperate()
{
}
BOOL CExcelOperate::CreateApp()
{
//if (FALSE == m_wdApp.CreateDispatch("Word.Application"))
COleException pe;
if (!m_ecApp.CreateDispatch(_T("Excel.Application"), &pe))
{
AfxMessageBox("Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);
pe.ReportError();
throw &pe;
return FALSE;
}
return TRUE;
}
BOOL CExcelOperate::CreateWorkbooks() //创建一个新的EXCEL工作簿集合
{
if (FALSE == CreateApp())
{
return FALSE;
}
m_ecBooks = m_ecApp.GetWorkbooks();
if (!m_ecBooks.m_lpDispatch)
{
AfxMessageBox("WorkBooks创建失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}
BOOL CExcelOperate::CreateWorkbook() //创建一个新的EXCEL工作簿
{
if(!m_ecBooks.m_lpDispatch)
{
AfxMessageBox("WorkBooks为空!", MB_OK|MB_ICONWARNING);
return FALSE;
}
COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_ecBook = m_ecBooks.Add(vOptional);
if(!m_ecBook.m_lpDispatch)
{
AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);
return FALSE;
}
/*
//得到document变量
m_wdDoc = m_wdApp.GetActiveDocument();
if (!m_wdDoc.m_lpDispatch)
{
AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到selection变量
m_wdSel = m_wdApp.GetSelection();
if (!m_wdSel.m_lpDispatch)
{
AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到Range变量
m_wdRange = m_wdDoc.Range(vOptional,vOptional);
if(!m_wdRange.m_lpDispatch)
{
AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
*/
return TRUE;
}
BOOL CExcelOperate::CreateWorksheets() //创建一个新的EXCEL工作表集合
{
if(!m_ecBook.m_lpDispatch)
{
AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);
return FALSE;
}
m_ecSheets = m_ecBook.GetSheets();
if(!m_ecSheets.m_lpDispatch)
{
AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}
BOOL CExcelOperate::CreateWorksheet(short index) //创建一个新的EXCEL工作表
{
if(!m_ecSheets.m_lpDispatch)
{
AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
return FALSE;
}
m_ecSheet = m_ecSheets.GetItem(COleVariant(index));
if(!m_ecSheet.m_lpDispatch)
{
AfxMessageBox("WorkSheet为空!", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}
BOOL CExcelOperate::CreateSheet(short index)
{
if(CreateWorksheets() == FALSE)
{
return FALSE;
}
if(CreateWorksheet(index) == FALSE)
{
return FALSE;
}
return TRUE;
}
BOOL CExcelOperate::Create(short index) //创建新的EXCEL应用程序并创建一个新工作簿和工作表
{
if(CreateWorkbooks() == FALSE)
{
return FALSE;
}
if(CreateWorkbook() == FALSE)
{
return FALSE;
}
if(CreateSheet(index) == FALSE)
{
return FALSE;
}
return TRUE;
}
void CExcelOperate::ShowApp() //显示WORD文档
{
m_ecApp.SetVisible(TRUE);
}
void CExcelOperate::HideApp() //隐藏word文档
{
m_ecApp.SetVisible(FALSE);
}
//**********************打开文档*********************************************
BOOL CExcelOperate::OpenWorkbook(CString fileName, short index)
{
if(!m_ecBooks.m_lpDispatch)
{
AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//COleVariant vFileName(_T(fileName));
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_ecBook = m_ecBooks.Open(fileName,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
if(!m_ecBook.m_lpDispatch)
{
AfxMessageBox("WorkSheet获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
if(CreateSheet(index) == FALSE)
{
return FALSE;
}
return TRUE;
}
BOOL CExcelOperate::Open(CString fileName) //创建新的EXCEL应用程序并打开一个已经存在的文档。
{
if(CreateWorkbooks() == FALSE)
{
return FALSE;
}
return OpenWorkbook(fileName);
}
/*BOOL CExcelOperate::SetActiveWorkbook(short i) //设置当前激活的文档。
{
}*/
//**********************保存文档*********************************************
BOOL CExcelOperate::SaveWorkbook() //文档是以打开形式,保存。
{
if (!m_ecBook.m_lpDispatch)
{
AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
m_ecBook.Save();
return TRUE;
}
BOOL CExcelOperate::SaveWorkbookAs(CString fileName)//文档以创建形式,保存。
{
if (!m_ecBook.m_lpDispatch)
{
AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant vFileName(_T(fileName));
m_ecBook.SaveAs(
vFileName, //VARIANT* FileName
vOptional, //VARIANT* FileFormat
vOptional, //VARIANT* LockComments
vOptional, //VARIANT* Password
vOptional, //VARIANT* AddToRecentFiles
vOptional, //VARIANT* WritePassword
0, //VARIANT* ReadOnlyRecommended
vOptional, //VARIANT* EmbedTrueTypeFonts
vOptional, //VARIANT* SaveNativePictureFormat
vOptional, //VARIANT* SaveFormsData
vOptional, //VARIANT* SaveAsAOCELetter
vOptional //VARIANT* ReadOnlyRecommended
/* vOptional, //VARIANT* EmbedTrueTypeFonts
vOptional, //VARIANT* SaveNativePictureFormat
vOptional, //VARIANT* SaveFormsData
vOptional //VARIANT* SaveAsAOCELetter*/
);
return TRUE;
}
BOOL CExcelOperate::CloseWorkbook()
{
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_ecBook.Close(vFalse, // SaveChanges.
vTrue, // OriginalFormat.
vFalse // RouteDocument.
);
m_ecBook = m_ecApp.GetActiveWorkbook();
if(!m_ecBook.m_lpDispatch)
{
AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
if(CreateSheet(1) == FALSE)
{
return FALSE;
}
return TRUE;
}
void CExcelOperate::CloseApp()
{
SaveWorkbook();
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//m_ecDoc.Save();
m_ecApp.Quit();
if(m_ecRange.m_lpDispatch)
m_ecRange.ReleaseDispatch();
if(m_ecSheet.m_lpDispatch)
m_ecSheet.ReleaseDispatch();
if(m_ecSheets.m_lpDispatch)
m_ecSheets.ReleaseDispatch();
if(m_ecBook.m_lpDispatch)
m_ecBook.ReleaseDispatch();
if(m_ecBooks.m_lpDispatch)
m_ecBooks.ReleaseDispatch();
if(m_ecApp.m_lpDispatch)
m_ecApp.ReleaseDispatch();
}
BOOL CExcelOperate::GetRangeAndValue(CString begin, CString end)
{
if(!m_ecSheet.m_lpDispatch)
{
AfxMessageBox("Sheet获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
m_ecRange = m_ecSheet.GetRange(COleVariant(begin), COleVariant(end));
if(!m_ecRange.m_lpDispatch)
{
AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
return FALSE;
}
ret = m_ecRange.GetValue2();//得到表格中的值
return TRUE;
}
void CExcelOperate::GetRowsAndCols(long &rows, long &cols)
{
COleSafeArray sa(ret);
sa.GetUBound(1,&rows);
sa.GetUBound(2,&cols);
}
//只返回CString类型的,其他类型概视为错误
BOOL CExcelOperate::GetTheValue(int rows, int cols, CString &dest)
{
long rRows, rCols;
long index[2];
VARIANT val;
COleSafeArray sa(ret);
sa.GetUBound(1,&rRows);
sa.GetUBound(2,&rCols);
if(rows < 1 || cols < 1 || rRows < rows || rCols < cols)
{
AfxMessageBox("出错点1");
return FALSE;
}
index[0]=rows;
index[1]=cols;
sa.GetElement(index,&val);
if(val.vt != VT_BSTR)
{
CString str;
str.Format("出错点2, %d",val.vt);
AfxMessageBox(str);
return FALSE;
}
dest = val.bstrVal;
return TRUE;
}
//将beginS到endS之间设置为文本格式
BOOL CExcelOperate::SetTextFormat(CString &beginS, CString &endS)
{
if(GetRangeAndValue(beginS, endS))
{
m_ecRange.Select();
m_ecRange.SetNumberFormatLocal(COleVariant("@"));
return TRUE;
}
return FALSE;
}
//将beginS到endS之间(必须是一列)设置为真正的文本格式
BOOL CExcelOperate::SetRowToTextFormat(CString &beginS, CString &endS)
{
if(GetRangeAndValue(beginS, endS))
{
m_ecRange.Select();
Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS));
if(!m_tempRange.m_lpDispatch) return FALSE;
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE);
//int tempArray[2] = {1, 2};
COleSafeArray saRet;
DWORD numElements = {2};
saRet.Create(VT_I4, 1, &numElements);
long index = 0;
int val = 1;
saRet.PutElement(&index, &val);
index++;
val = 2;
saRet.PutElement(&index, &val);
//m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));
m_ecRange.TextToColumns(m_tempRange.GetItem(COleVariant((short)1),COleVariant((short)1)), 1, 1, vFalse, vTrue, vFalse, vFalse, vFalse, vFalse, vFalse, saRet, vFalse, vFalse, vTrue);
m_tempRange.ReleaseDispatch();
return TRUE;
}
return FALSE;
}