如何将CListCtrl中的数据导出到excel表中(系统为win7下) RT知道的朋友提醒下,谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我采用网上看到的一篇文章http://blog.csdn.net/yzhangtong/archive/2006/10/10/1328273.aspx结果我在xp下导出正常,到了win7下就不能导出调试跟了下代码在代码if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )位置xp可以创建文件,而win7下不能创建成功,不过程序也没有返回失败纠结ing 64 位机子没试过,我的 32 位 win7 系统,用网上的导出txt数据到excel表格的程序,正常运行并成功导出数据到excel 我有别人写的一个操作类我昨天刚在win7 64位下成功的,楼主留信箱发给你 class CExportData{public: CExportData(void);public: ~CExportData(void);public: BOOL MakeSurePathExists( CString &Path, bool FilenameIncluded); BOOL GetDefaultXlsFileName(CString& sExcelFile); void ExportListToExcel(CListCtrl* pList, CString strTitle); CString GetExcelDriver();};#include "StdAfx.h"#include "ExportData.h"#include <afxdb.h>#include <odbcinst.h>//使用ODBC操作EXCEL加的#include <io.h>//操作字符串需要加的#include "shlwapi.h"#include "LangCmsCnt.h"CExportData::CExportData(void){}CExportData::~CExportData(void){}void CExportData::ExportListToExcel(CListCtrl* pList, CString strTitle){ CString warningStr; if (pList->GetItemCount ()>0) { CDatabase database; CString sDriver; CString sExcelFile; CString sSql; CString tableName = strTitle; // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" sDriver = GetExcelDriver(); // AfxMessageBox(sDriver); if (sDriver.IsEmpty()) { // 没有发现Excel驱动 MSG_BOX_ID(ID_STR_EXCEL_EXPT_TIP_NODIRVER); return; } ///默认文件名 if (!GetDefaultXlsFileName(sExcelFile)) return; // 创建进行存取的字符串 sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, sExcelFile, sExcelFile); //AfxMessageBox(sSql); // 创建数据库 (既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<8;i++) { if (i!=0) { sSql = sSql + _T(", "); strH = strH + _T(", "); }; sSql = sSql + _T(" [") + columnData.pszText +_T("] TEXT"); strH = strH + _T(" [") + columnData.pszText +_T("] "); } columnName.ReleaseBuffer (); columnNum = i; sSql = _T("CREATE TABLE [") + tableName + _T("] ( ") + sSql + _T(" ) "); database.ExecuteSQL(sSql); // 插入数据项 int nItemIndex; for (nItemIndex=0;nItemIndex<pList->GetItemCount ();nItemIndex++) { strV = _T(""); for(i=0;i<columnNum;i++) { if (i!=0) { strV = strV + _T(", ") ; } strV = strV + _T(" '") + pList->GetItemText(nItemIndex,i) +_T("' "); } sSql = _T("INSERT INTO ")+ tableName +_T(" (")+ strH + _T(")") +_T(" VALUES(")+ strV + _T(")"); // AfxMessageBox(sSql); database.ExecuteSQL(sSql); } } // 关闭数据库 database.Close(); warningStr.Format(_T("%s%s!"), LOADSTRINGEX(ID_STR_EXCEL_EXPT_TIP_SUCCEED), sExcelFile); AfxMessageBox(warningStr); }}CString CExportData::GetExcelDriver(){ TCHAR szBuf[2001]; WORD cbBufMax = 2000; WORD cbBufOut; TCHAR *pszBuf = szBuf; CString sDriver; // 获取已安装驱动的名称(涵数在odbcinst.h里) if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) return _T(""); // 检索已安装的驱动是否有Excel... do { if (StrStr(pszBuf, _T("Excel")) != 0) { //发现 ! sDriver = CString(pszBuf); break; } StrChr(pszBuf, '\0'); pszBuf += 1; } while (pszBuf[1] != '\0'); //return sDriver; return _T("Microsoft Excel Driver (*.xls)");}//获得默认的文件名BOOL CExportData::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(_T("%04d%02d%02d%02d%02d%02d"),filenameyear,filenamemonth,filenameday,filehour,filemin,filesec); //AfxMessageBox(timeStr); sExcelFile = timeStr + _T(".xls"); // prompt the user (with all document templates) CFileDialog dlgFile(FALSE,_T(".xls"),sExcelFile); CString title; CString strFilter; title = LOADSTRINGEX(ID_STR_EXCEL_EXPT_FILEDLG_TITLE); strFilter = LOADSTRINGEX(ID_STR_EXCEL_EXPT_FILTER); strFilter += (TCHAR)'\0'; // next string please strFilter += _T("*.xls"); strFilter += (TCHAR)'\0'; // last string dlgFile.m_ofn.nMaxCustFilter++; dlgFile.m_ofn.nFilterIndex = 1; dlgFile.m_ofn.lpstrFilter = strFilter; dlgFile.m_ofn.lpstrTitle = title; if (dlgFile.DoModal()==IDCANCEL) return FALSE; // open cancelled sExcelFile = dlgFile.GetFileName(); sExcelFile.ReleaseBuffer(); if (MakeSurePathExists(sExcelFile,true)) { if(!DeleteFile(sExcelFile)) { // delete the file MSG_BOX_ID(ID_STR_EXCEL_EXPT_TIP_OV_FAILED); return FALSE; } } return TRUE;}BOOL CExportData::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 !_access((char *)Path.GetBuffer(0),0);}应该可以.. 是不是excel版本的问题,保存成03和保存成07版本用的SAVEAS里面的参数不同 关于vc设置excel格式的问题(急) 文件内存映射的几个问题?? 对话框循环输入如何实现 关于c++中应用程序的问题 ADO问题! 关于窗口某坐标颜色问题 static控件和其他控件重叠时是不是都是在上面阿? 菜鸟问题,非常简单 关于ADO智能指针的释放问题,在线等待 如何寻找封闭区域? 如何把已经存在的类加载到工作空间中啊! 关于24位bmp图像转换成8位bmp的问题
我采用网上看到的一篇文章
http://blog.csdn.net/yzhangtong/archive/2006/10/10/1328273.aspx结果我在xp下导出正常,到了win7下就不能导出调试跟了下代码在代码
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
位置
xp可以创建文件,而win7下不能创建成功,不过程序也没有返回失败纠结ing
我昨天刚在win7 64位下成功的,楼主留信箱发给你
{
public:
CExportData(void);
public:
~CExportData(void);public:
BOOL MakeSurePathExists( CString &Path, bool FilenameIncluded);
BOOL GetDefaultXlsFileName(CString& sExcelFile);
void ExportListToExcel(CListCtrl* pList, CString strTitle);
CString GetExcelDriver();
};#include "StdAfx.h"
#include "ExportData.h"
#include <afxdb.h>
#include <odbcinst.h>//使用ODBC操作EXCEL加的
#include <io.h>//操作字符串需要加的
#include "shlwapi.h"
#include "LangCmsCnt.h"
CExportData::CExportData(void)
{
}CExportData::~CExportData(void)
{
}void CExportData::ExportListToExcel(CListCtrl* pList, CString strTitle)
{
CString warningStr;
if (pList->GetItemCount ()>0)
{
CDatabase database;
CString sDriver;
CString sExcelFile;
CString sSql;
CString tableName = strTitle; // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
// AfxMessageBox(sDriver);
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
MSG_BOX_ID(ID_STR_EXCEL_EXPT_TIP_NODIRVER);
return;
} ///默认文件名
if (!GetDefaultXlsFileName(sExcelFile))
return; // 创建进行存取的字符串
sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, sExcelFile, sExcelFile);
//AfxMessageBox(sSql);
// 创建数据库 (既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<8;i++)
{
if (i!=0)
{
sSql = sSql + _T(", ");
strH = strH + _T(", ");
}; sSql = sSql + _T(" [") + columnData.pszText +_T("] TEXT");
strH = strH + _T(" [") + columnData.pszText +_T("] ");
}
columnName.ReleaseBuffer ();
columnNum = i;
sSql = _T("CREATE TABLE [") + tableName + _T("] ( ") + sSql + _T(" ) "); database.ExecuteSQL(sSql); // 插入数据项
int nItemIndex;
for (nItemIndex=0;nItemIndex<pList->GetItemCount ();nItemIndex++)
{
strV = _T("");
for(i=0;i<columnNum;i++)
{
if (i!=0)
{
strV = strV + _T(", ") ;
}
strV = strV + _T(" '") + pList->GetItemText(nItemIndex,i) +_T("' ");
} sSql = _T("INSERT INTO ")+ tableName
+_T(" (")+ strH + _T(")")
+_T(" VALUES(")+ strV + _T(")");
// AfxMessageBox(sSql);
database.ExecuteSQL(sSql);
} } // 关闭数据库
database.Close(); warningStr.Format(_T("%s%s!"), LOADSTRINGEX(ID_STR_EXCEL_EXPT_TIP_SUCCEED), sExcelFile);
AfxMessageBox(warningStr);
}
}CString CExportData::GetExcelDriver()
{
TCHAR szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
TCHAR *pszBuf = szBuf;
CString sDriver;
// 获取已安装驱动的名称(涵数在odbcinst.h里)
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
return _T("");
// 检索已安装的驱动是否有Excel...
do
{
if (StrStr(pszBuf, _T("Excel")) != 0)
{
//发现 !
sDriver = CString(pszBuf);
break;
}
StrChr(pszBuf, '\0');
pszBuf += 1; }
while (pszBuf[1] != '\0'); //return sDriver;
return _T("Microsoft Excel Driver (*.xls)");
}//获得默认的文件名
BOOL CExportData::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(_T("%04d%02d%02d%02d%02d%02d"),filenameyear,filenamemonth,filenameday,filehour,filemin,filesec);
//AfxMessageBox(timeStr);
sExcelFile = timeStr + _T(".xls");
// prompt the user (with all document templates)
CFileDialog dlgFile(FALSE,_T(".xls"),sExcelFile);
CString title;
CString strFilter; title = LOADSTRINGEX(ID_STR_EXCEL_EXPT_FILEDLG_TITLE);
strFilter = LOADSTRINGEX(ID_STR_EXCEL_EXPT_FILTER);
strFilter += (TCHAR)'\0'; // next string please
strFilter += _T("*.xls");
strFilter += (TCHAR)'\0'; // last string
dlgFile.m_ofn.nMaxCustFilter++;
dlgFile.m_ofn.nFilterIndex = 1; dlgFile.m_ofn.lpstrFilter = strFilter;
dlgFile.m_ofn.lpstrTitle = title; if (dlgFile.DoModal()==IDCANCEL)
return FALSE; // open cancelled
sExcelFile = dlgFile.GetFileName();
sExcelFile.ReleaseBuffer();
if (MakeSurePathExists(sExcelFile,true))
{
if(!DeleteFile(sExcelFile))
{ // delete the file
MSG_BOX_ID(ID_STR_EXCEL_EXPT_TIP_OV_FAILED);
return FALSE;
}
}
return TRUE;
}BOOL CExportData::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 !_access((char *)Path.GetBuffer(0),0);
}
应该可以..