int CGridCtrl::CopyDataToExcelFile(const CStringArray& strContentArray, int nColNum, CString strFileName, CString strSheetName) { CString strTemp = _T(""); for (int i = 0; i < strContentArray.GetCount(); i ++) { if ( 0 == (i%nColNum) && (0 != i)) { strTemp += _T("/r/n"); } strTemp += strContentArray.GetAt(i) + _T("/t"); } //两个版本,下面的注释是用SDK,这里Ole COleDataSource* pSource = new COleDataSource(); CSharedFile sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT); sf.Write(strTemp, strTemp.GetLength()); //写入数据 HGLOBAL hMem = sf.Detach(); if (!hMem) return 1; pSource->CacheGlobalData(CF_TEXT, hMem); pSource->SetClipboard(); /* HGLOBAL hMem; LPTSTR pStr; hMem = GlobalAlloc(GHND | GMEM_SHARE, strTemp.GetLength() + 1);// 分配内存空间 pStr = (LPTSTR)GlobalLock(hMem); lstrcpy(pStr, strTemp); GlobalUnlock(hMem); ::OpenClipboard(NULL); ::EmptyClipboard(); ::SetClipboardData(CF_TEXT, hMem);// 设置剪贴板文本 CloseClipboard(); GlobalFree(hMem);// 释放内存空间*/ if (!strFileName.IsEmpty()) if(FAILED(::CoInitialize(NULL))) return -1 ; CApplication oExcel; CWorkbooks oBooks; CWorkbook oBook; CWorksheets oSheets; CWorksheet oSheet; CRange oRange; // If you have not created Excel, create a new instance. if (oExcel.m_lpDispatch == NULL) {oExcel.CreateDispatch(_T("Excel.Application"));} // Show Excel to the user. if (!strFileName.IsEmpty()) oExcel.put_Visible(FALSE); else oExcel.put_Visible(FALSE); oExcel.put_UserControl(TRUE); // Add a new workbook and get the first worksheet in that book. oBooks = oExcel.get_Workbooks(); VARIANT vtFalse; vtFalse.vt=VT_BOOL; vtFalse.boolVal=VARIANT_FALSE; VARIANT vtTrue; vtTrue.vt=VT_BOOL; vtTrue.boolVal=VARIANT_TRUE; COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); //if (!strFileName.IsEmpty()) // oBook = oBooks.Open(strFileName, vtFalse, vtTrue, vtFalse, vtFalse, vtTrue, vtFalse, vtFalse, vtFalse, vtTrue, vtFalse, vtFalse, vtTrue, vtTrue, vtTrue); oBook = oBooks.Add(covOptional); oSheets = oBook.get_Worksheets(); oSheet = oSheets.get_Item(COleVariant(short(1))); oSheet.put_Name(strSheetName); // Set the range of data to retrieve // 计算行列数 // int iRows = GetRowCount(); int iCols = GetColumnCount(); TCHAR cEndCellCol; CString strEndCellChars = _T(""); if(iCols> 26) { cEndCellCol = TCHAR(_T('A') + iCols/26-1); strEndCellChars = CString(cEndCellCol); } cEndCellCol = TCHAR(_T('A') + iCols%26-1); strEndCellChars += CString(cEndCellCol); CString strEndCell; strEndCell.Format(strEndCellChars + _T("%d"), iRows); CString strEndColCell; strEndColCell.Format(strEndCellChars + _T("%d"), 1); CString strEndRowCell; strEndRowCell.Format(_T("A%d"), iRows); oRange = oSheet.get_Range(COleVariant(_T("A1")),COleVariant(strEndCell)); CRange oRangeColHeader = oSheet.get_Range(COleVariant(_T("A1")),COleVariant(strEndColCell)); CRange oRangeRowHeader = oSheet.get_Range(COleVariant(_T("A1")),COleVariant(strEndRowCell)); oSheet.Paste(covOptional,covOptional); if (!strFileName.IsEmpty()) { VARIANT vtFileName; vtFileName.vt=VT_BSTR; vtFileName.bstrVal=strFileName.AllocSysString(); oBook.Close(vtTrue, vtFileName, vtFalse); SysFreeString(vtFileName.bstrVal); oExcel.Quit(); ::CoUninitialize(); } else { oExcel.put_Visible(TRUE); } return 0; }