在VC中使用智能指针操作Excel。
1、工程添加excel9.h和excel9.cpp文件,或者使用导入动态库的方式
2、Excel结构:Excel属于多文档视图结构,一个应用程序包含若干个工作簿,每个工作簿包含若干个工作表
3、智能指针介绍
_Application m_appExcel; //excel应用程序
Workbooks m_wBooks; //工作簿集合
_Workbook m_wBook; //单个工作簿
Worksheets m_wSheets; //工作表集合
_Worksheet m_wSheet; //单个工作表
Range m_rCells; //单元格集合
4、初始化COM:CoInitialize(NULL);可以在应用程序cpp文件的InitInstance();函数中直接初始化
if(S_OK != ::CoInitialize(NULL))
{
MessageBox(NULL,"初始化Com库失败!",NULL,MB_ICONERROR|MB_OK);
return FALSE;
}
或者对其封装为函数。
5、释放资源
if(m_rCells.m_lpDispatch != NULL)
{
m_rCells.ReleaseDispatch();
}
//释放工作表
if(m_wSheet.m_lpDispatch != NULL)
{
m_wSheet.ReleaseDispatch();
}
if(m_wSheets.m_lpDispatch != NULL)
{
m_wSheets.ReleaseDispatch();
}
//释放当前活动工作簿
if(m_wBook.m_lpDispatch != NULL)
{
m_wBook.Save();
m_wBook.ReleaseDispatch();
}
//关闭打开得excel文件
if(m_wBooks.m_lpDispatch != NULL)
{
m_wBooks.Close();
m_wBooks.ReleaseDispatch();
}
//释放excel接口
if(m_appExcel.m_lpDispatch != NULL)
{
m_appExcel.Quit();
m_appExcel.ReleaseDispatch();
}
最后释放:CoUninitialize();
5、使用方法:
if(!m_appExcel.CreateDispatch("Excel.Application", NULL))
{
MessageBox("创建Excel应用程序失败!",NULL,MB_ICONERROR|MB_OK);
return ;
}
//设置excel可见或者不可见
m_appExcel.SetVisible(FALSE);
m_wBooks = m_appExcel.GetWorkbooks();
CComVariant varPara;
varPara.vt = VT_ERROR;
varPara.scode = DISP_E_PARAMNOTFOUND;
LPCTSTR lpFile = m_strExcelPath;
m_wBook = m_wBooks.Open(lpFile, varPara, CComVariant(FALSE), varPara,
varPara, varPara, varPara, varPara, varPara,
varPara, varPara, varPara, varPara);
/*获取Sheets集合*/
m_wSheets = m_wBook.GetSheets();
if(NULL == m_wSheets.m_lpDispatch)
{
return ;
}
/*Sheet总数*/
int iSheetCount = m_wSheets.GetCount();
m_wSheet = m_wSheets.GetItem(CComVariant(1));
if(NULL == m_wSheet.m_lpDispatch)
{
return ;
}
//取得单元格集合
m_rCells = m_wSheet.GetCells();
//取得iRow, iLine指定得单元格,及其内容(iRow和iLine为参数)
LPDISPATCH lpDispatch = m_rCells.GetItem(CComVariant(iRow), CComVariant(iLine)).pdispVal;
rCellTable.AttachDispatch(lpDispatch);
if(NULL == rCellTable.m_lpDispatch)
{
return FALSE;
}
VARIANT varCellText;
VariantInit(&varCellText);
varCellText = rCellTable.GetText();
strText = varCellText.bstrVal;
VariantClear(&varCellText);
rCellTable.ReleaseDispatch();
给工作表重命名:pSheet->PutName("Exp One Sheet");//如果运行有错,可以pSheet->PutName(L"Exp One Sheet")插入一个工作表,
函数原型:_WorksheetPtr Worksheets::Add(const _variant_t &Before = vtMissing, //在哪个工作表前插入
const _variant_t &After = vtMissing, //在哪个工作表后插入
const _variant_t &Count = vtMissing, //插入工组表个数
const _variant_t &Type = vtMissing) //插入工作表类型有意思的是,不光这个函数,其他的有默认值的参数的默认值都是vtMissing 。
_WorksheetPtr pSheet = pSheets->GetItem(2);
VARIANT var;
var.vt = VT_DISPATCH;var.pdispVal = pSheet;
pSheets->Add(); //在第一个工作表之前插入一个空白工作表
pSheets->Add(var); //在pSheet工作表之前插入一个空白工作表
pSheets->Add(vtMissing,var); //在pSheet工作表之后插入一个空白工作表
pSheets->Add(vtMissing,var,2); //在pSheet工作表之后插入两个空白工作表这里仅仅涉及到_variant_t类型的使用。