前提・実現したいこと
Com初心者です。
現在cellからデータを取り出すコードを書いている途中で、
参考にと渡されたコードがあるのですが、
どういった処理を行っているのかいまいちわかっていないことと、
Variantを使用していますが、VariantInit()やVariantClear()がありません。
これって解放されていることになってるのでしょうか。
該当のソースコード
.h void GetCellData(const char* sc,const char* ec,CStringArray &dt,bool formula = false); void GetCellData(int cols,int rows,int cole,int rowe,CStringArray &dt,bool formula = false); CExcelCtrl(); virtual ~CExcelCtrl(); _Application m_excel; .cpp CExcelCtrl::CExcelCtrl() { CoInitialize(NULL); } CExcelCtrl::~CExcelCtrl() { CoUninitialize(); } void CExcelCtrl::GetCellData(int cols,int rows,int cole,int rowe,CStringArray &dt,bool formula) { CString sc,ec; sc.Format("%s%d",Num2Col(cols),rows); ec.Format("%s%d",Num2Col(cole),rowe); GetCellData(sc,ec,dt,formula); } void CExcelCtrl::GetCellData(const char* sc,const char* ec,CStringArray &dt,bool formula) { try{ _Worksheet ws = m_excel.GetActiveSheet(); Range range = ws.GetRange(COleVariant(sc),COleVariant(ec)); COleVariant data; if(formula) data = range.GetFormula(); else data = range.GetValue(vtMissing); COleSafeArray sa; sa.Attach(data); long rowmax,colmax; sa.GetUBound(1,&rowmax); sa.GetUBound(2,&colmax); CString str; VARIANT val; long idx[2]; dt.RemoveAll(); for(long row = 1;row <= rowmax;row++){ idx[0] = row; for(long col = 1;col <= colmax;col++){ idx[1] = col; sa.GetElement(idx,&val); switch(val.vt){ case VT_R8: str.Format("%1.2f", val.dblVal); break; case VT_BSTR: str.Format("%s",(CString)val.bstrVal); ::SysFreeString(val.bstrVal); break; case VT_EMPTY: str.Empty(); break; } dt.Add(str); } } }catch(COleDispatchException *e){ AfxMessageBox(e->m_strDescription,MB_ICONEXCLAMATION); dt.RemoveAll(); } }
補足情報(FW/ツールのバージョンなど)
windows10/64bit
visual studio 2017

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/25 07:19