mfc中将list内容保存到Excel中出错

mfc中将list内容保存到Excel中报错
我按照 http://blog.csdn.net/qivan/article/details/7599924 中的方法,运行出来各种报错。。。

		// TODO: 在此添加控件通知处理程序代码
//导出
CFileDialog FileDialog(false,L"xls",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("Microsoft Excel 2000(*.xls)|*.xls|所有文件(*.*)"),this); 
if(FileDialog.DoModal()!=IDOK) 
{
return; 
}
CString cStrFile=FileDialog.GetPathName();  //选择保存路径名称

if(::PathFileExists(cStrFile)) 
DeleteFile(cStrFile); 

//CString cStrFile = _T("myexcel.xls");
COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

CApplication app; //Excel程序
CWorkbooks books; //工作簿集合
CWorkbook book;  //工作表
CWorksheets sheets;  //工作簿集合
CWorksheet sheet; //工作表集合
CRange range; //使用区域
 
CoUninitialize();
 
//book.PrintPreview(_variant_t(false));
if(CoInitialize(NULL)==S_FALSE) 
{
MessageBox("初始化COM支持库失败!");
return;
}

if(!app.CreateDispatch(_T("Excel.Application"))) //创建IDispatch接口对象
{
MessageBox(_T("Error!"));
return;
}

 
books = app.get_Workbooks();
book = books.Add(covOptional);
 

sheets = book.get_Worksheets();
sheet = sheets.get_Item(COleVariant((short)1));  //得到第一个工作表

CHeaderCtrl   *pmyHeaderCtrl= m_LEDList.GetHeaderCtrl(); //获取表头

    int   m_cols = pmyHeaderCtrl-> GetItemCount(); //获取列数
    int   m_rows = m_LEDList.GetItemCount();  //获取行数


TCHAR     lpBuffer[256];    

HDITEM   hdi; //This structure contains information about an item in a header control. This structure has been updated to support header item images and order values.
    hdi.mask   =   HDI_TEXT;
    hdi.pszText   =   lpBuffer;
    hdi.cchTextMax   =   256; 

    CString   colname;
    CString strTemp;

int   nListWidth;
int   iRow,iCol;
for(iCol=0;   iCol <m_cols;   iCol++)//将列表的标题头写入EXCEL 

GetCellName(1 ,iCol + 1, colname); //(colname就是对应表格的A1,B1,C1,D1)

range   =   sheet.get_Range(COleVariant(colname),COleVariant(colname));  

pmyHeaderCtrl-> GetItem(iCol,   &hdi); //获取表头每列的信息

range.put_Value2(COleVariant(hdi.pszText));  //设置每列的内容

nListWidth   =   m_LEDList.GetColumnWidth(iCol)/6; 

//得到第iCol+1列   
range.AttachDispatch(range.get_Item(_variant_t((long)(iCol+1)),vtMissing).pdispVal,true);   

//设置列宽  
range.put_ColumnWidth(_variant_t((long)nListWidth));

    } 

range   =   sheet.get_Range(COleVariant( _T("A1 ")),   COleVariant(colname)); 

range.put_RowHeight(_variant_t((long)50));//设置行的高度 


range.put_VerticalAlignment(COleVariant((short)-4108));//xlVAlignCenter   =   -4108 

COleSafeArray   saRet; //COleSafeArray类是用于处理任意类型和维数的数组的类
DWORD   numElements[]={m_rows,m_cols};       //行列写入数组
saRet.Create(VT_BSTR,   2,   numElements); //创建所需的数组

range = sheet.get_Range(COleVariant( _T("A2 ")),covOptional); //从A2开始
range = range.get_Resize(COleVariant((short)m_rows),COleVariant((short)m_cols)); //表的区域

long   index[2];  

for(   iRow   =   1;   iRow   <=   m_rows;   iRow++)//将列表内容写入EXCEL 

for   (   iCol   =   1;   iCol   <=   m_cols;   iCol++)  

index[0]=iRow-1; 
index[1]=iCol-1; 

CString   szTemp; 

szTemp=m_LEDList.GetItemText(iRow-1,iCol-1); //取得m_LEDList控件中的内容

BSTR   bstr   =   szTemp.AllocSysString(); //The AllocSysString method allocates a new BSTR string that is Automation compatible

saRet.PutElement(index,bstr); //把m_list控件中的内容放入saRet

SysFreeString(bstr);

}  

range.put_Value2(COleVariant(saRet)); //将得到的数据的saRet数组值放入表格

book.SaveCopyAs(COleVariant(cStrFile)); //保存到cStrFile文件
book.put_Saved(true);

books.Close();
 
//
 
book.ReleaseDispatch();
books.ReleaseDispatch();