hur.cn - 华软网

 热门搜索

如何将CListCtrl中的数据导出到excel表中(系统为win7下)

  作者:未知    来源:网络    更新时间:2011/4/14
RT

知道的朋友提醒下,谢谢了
---华软 网友回答---
Google下VC 操作Excel
---华软网友回复---
引用 1 楼 visualeleven 的回复:
Google下VC 操作Excel


我采取网上看到的一篇文章
http://blog.csdn.net/yzhangtong/archive/2006/10/10/1328273.aspx

结果我在xp下导出正常,到了win7下就不能导出

调试跟了下代码

代码
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
位置
xp能够创建资料,而win7下不能创建成功,不进程序也没有前往失利

纠结ing
---华软网友回复---
再增补下,对方机子是64位
---华软网友回复---
64 位机子没试过,我的 32 位 win7 系统,用网上的导出txt数据到excel表格的程序,正常运行并成功导出数据到excel
---华软网友回复---
引用 4 楼 tandyt 的回复:
64 位机子没试过,我的 32 位 win7 系统,用网上的导出txt数据到excel表格的程序,正常运行并成功导出数据到excel


嗯,我在他人的机子上尝试过OK,为啥为在64位机上失利了,没法创建...
---华软网友回复---
我有他人写的一个操作类
我昨天刚在win7 64位下成功的,楼主留信箱发给你
---华软网友回复---
引用 6 楼 huliang66 的回复:
我有他人写的一个操作类
我昨天刚在win7 64位下成功的,楼主留信箱发给你



hailiang.weng@gmail.com

非常谢谢
---华软网友回复---
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);
}


应该能够..
---华软网友回复---
  class="deleted_message"> 该回复于2011-04-16 09:33:08被版主删除
---华软网友回复---
是否是excel版本的问题,保存成03和保存成07版本用的SAVEAS里面的参数不同      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。