#include "StdAfx.h" #include "ExcelImpl.h" ////////////////////////////////////////////////////////////////////////////// //名称:GetExcelDriver //功能:获取ODBC中Excel驱动 //作者:徐景周(jingzhou_xu@163.net) //组织:未来工作室(Future Studio) //日期:2002.9.1 ///////////////////////////////////////////////////////////////////////////// CString CExcelImpl::GetExcelDriver() { char szBuf[2001]; WORD cbBufMax = 2000; WORD cbBufOut; char *pszBuf = szBuf; CString sDriver; // 获取已安装驱动的名称(涵数在odbcinst.h里) if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) return ""; // 检索已安装的驱动是否有Excel... do { if (strstr(pszBuf, "Excel") != 0) { //发现 ! sDriver = CString(pszBuf); break; } pszBuf = strchr(pszBuf, '\0') + 1; } while (pszBuf[1] != '\0'); return sDriver; } /////////////////////////////////////////////////////////////////////////////// // BOOL MakeSurePathExists( CString &Path,bool FilenameIncluded) // 参数: // Path 路径 // FilenameIncluded 路径是否包含文件名 // 返回值: // 文件是否存在 // 说明: // 判断Path文件(FilenameIncluded=true)是否存在,存在返回TURE,不存在返回FALSE // 自动创建目录 // /////////////////////////////////////////////////////////////////////////////// BOOL CExcelImpl::MakeSurePathExists( CString &Path, bool FilenameIncluded) { int Pos=0; while((Pos=Path.Find('\\',Pos+1))!=-1) CreateDirectory(Path.Left(Pos),NULL); if(!FilenameIncluded) CreateDirectory(Path,NULL); // return ((!FilenameIncluded)?!_access(Path,0): // !_access(Path.Left(Path.ReverseFind('\\')),0)); return !_access(Path,0); } //获得默认的文件名 BOOL CExcelImpl::GetDefaultXlsFileName(CString& sExcelFile) { ///默认文件名:yyyymmddhhmmss.xls CString timeStr; CTime day; day=CTime::GetCurrentTime(); int filenameday,filenamemonth,filenameyear,filehour,filemin,filesec; filenameday=day.GetDay();//dd filenamemonth=day.GetMonth();//mm月份 filenameyear=day.GetYear();//yyyy filehour=day.GetHour();//hh filemin=day.GetMinute();//mm分钟 filesec=day.GetSecond();//ss timeStr.Format("%04d%02d%02d%02d%02d%02d",filenameyear,filenamemonth,filenameday,filehour,filemin,filesec); sExcelFile = timeStr + ".xls"; // prompt the user (with all document templates) CFileDialog dlgFile(FALSE,".xls",sExcelFile); CString title; CString strFilter; title = "指纹机数据"; strFilter = "Excel文件(*.xls)"; strFilter += (TCHAR)'\0'; // next string please strFilter += _T("*.xls"); strFilter += (TCHAR)'\0'; // last string dlgFile.m_ofn.nMaxCustFilter++; dlgFile.m_ofn.nFilterIndex = 1; // append the "*.*" all files filter CString allFilter; VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER)); strFilter += allFilter; strFilter += (TCHAR)'\0'; // next string please strFilter += _T("*.*"); strFilter += (TCHAR)'\0'; // last string dlgFile.m_ofn.nMaxCustFilter++; dlgFile.m_ofn.lpstrFilter = strFilter; dlgFile.m_ofn.lpstrTitle = title; if (dlgFile.DoModal()==IDCANCEL) return FALSE; // open cancelled CString sn = dlgFile.GetFileTitle() ; CString strPath = dlgFile.GetPathName(); sExcelFile = strPath; if (MakeSurePathExists(sExcelFile,true)) { if(!DeleteFile(sExcelFile)) { // delete the file MessageBox(NULL, "覆盖文件时出错!", "提示", MB_ICONINFORMATION); return FALSE; } } return TRUE; } CExcelImpl::CExcelImpl(void) { } CExcelImpl::~CExcelImpl(void) { } /////////////////////////////////////////////////////////////////////////////// // void ExportListToExcel(CListCtrl* pList, CString strTitle) // 参数: // pList 需要导出的List控件指针 // strTitle 导出的数据表标题 // 说明: // 导出CListCtrl控件的全部数据到Excel文件。Excel文件名由用户通过“另存为” // 对话框输入指定。创建名为strTitle的工作表,将List控件内的所有数据(包括 // 列名和数据项)以文本的形式保存到Excel工作表中。保持行列关系。 // // edit by [r]@dotlive.cnblogs.com /////////////////////////////////////////////////////////////////////////////// CString CExcelImpl::ExportListToExcel(CListCtrl* pList, CString strTitle) { CString warningStr; CString sExcelFile; if (pList->GetItemCount()>0) { CDatabase database; CString sDriver; CString sSql; CString tableName = strTitle; // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" sDriver = GetExcelDriver(); if (sDriver.IsEmpty()) { // 没有发现Excel驱动 AfxMessageBox("没有安装Excel!"); return ""; } ///默认文件名 if (!GetDefaultXlsFileName(sExcelFile)) { return ""; } // 创建进行存取的字符串 sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile); // 创建数据库 (既Excel表格文件) if( database.OpenEx(sSql,CDatabase::noOdbcDialog) ) { // 创建表结构 int i; LVCOLUMN columnData; CString columnName; int columnNum = 0; CString strH; CString strV; sSql = ""; strH = ""; columnData.mask = LVCF_TEXT; columnData.cchTextMax =100; columnData.pszText = columnName.GetBuffer (100); for(i=0;pList->GetColumn(i,&columnData);i++) { if (i!=0) { sSql = sSql + ", " ; strH = strH + ", " ; } sSql = sSql + " " + columnData.pszText +" TEXT"; strH = strH + " " + columnData.pszText +" "; } columnName.ReleaseBuffer (); columnNum = i; sSql = "CREATE TABLE " + tableName + " ( " + sSql + " ) "; database.ExecuteSQL(sSql); // 插入数据项 int nItemIndex; for (nItemIndex=0;nItemIndexGetItemCount();nItemIndex++){ strV = ""; for(i=0;iGetItemText(nItemIndex,i) +"' "; } sSql = "INSERT INTO "+ tableName +" ("+ strH + ")" +" VALUES("+ strV + ")"; database.ExecuteSQL(sSql); } } // 关闭数据库 database.Close(); warningStr.Format("Excel文件成功保存至%s",sExcelFile); AfxMessageBox(warningStr); return sExcelFile; } return ""; } void CExcelImpl::ReadExcelToList(CListCtrl* pList, CString strTitle,DWORD &dwListCount) { //strTitle+=".xls"; CStringArray Rows, Column; CSpreadSheet varSheet(strTitle, "LoginData"); //pList->DeleteAllItems();//首先清空listview DWORD oldListCount = dwListCount; for (int i = 0; i InsertItem(i+oldListCount, strContents) ; for (int j = 0; j < Rows.GetSize(); j++) { strContents = Rows.GetAt(j); pList->SetItemText(i+oldListCount,j,strContents); } dwListCount++; } }