odbc写excel

#pragma once
#include
#include

class __declspec(dllexport) CRWExcel
{
public:
 CRWExcel(void);
 CRWExcel(CString File, CString SheetOrSeparator, bool Backup = true);
 CString getExcelDriver();
 BOOL open(const CString &dsn);
 bool readRows(CString &sql,CStringArray &RowValues);
 bool readTitles(CStringArray &RowValues);
 bool executeSQL(CString &sql);
public:
 ~CRWExcel(void);
private:
 CDatabase *m_pDatabase;
 CRecordset *m_pRecordset;
 CString m_sDsn;
 CString m_sSheetName;// = SheetOrSeparator;
 CString m_sFile;
 CString m_sSql;

 int m_dTotalColumns;//total columns
};

 

#include "StdAfx.h"
#include "RWExcel.h"
#include
using namespace std;
CRWExcel::CRWExcel(CString sFile, CString SheetOrSeparator, bool Backup /* = true */)
:m_sFile(sFile),m_pRecordset(NULL)
{
 m_pDatabase = new CDatabase;

 m_sDsn.Format(L"DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s", getExcelDriver(), sFile, sFile);
 if(!open(m_sDsn))
 {
  AfxMessageBox(L"打開失敗");
  m_pDatabase->Close();
  m_pDatabase = NULL;
 }
 if (m_pDatabase)
 {
  m_pRecordset = new CRecordset(m_pDatabase);
 }
}

CRWExcel::CRWExcel(void)
{
}

CRWExcel::~CRWExcel(void)
{
 if (m_pRecordset != NULL)
 {
  m_pRecordset->Close();
  delete m_pRecordset;
  m_pRecordset = NULL;
 }
 if (m_pDatabase != NULL)
 {
  m_pDatabase->Close();
  delete m_pDatabase;
  m_pDatabase = NULL;
 }
}
CString CRWExcel::getExcelDriver()
{
 wchar_t szBuf[2001];
 WORD cbBufMax = 2000;
 WORD cbBufOut;
 wchar_t *pszBuf = szBuf;
 CString sDirver;
 // Get the names of the installed drivers ("odbcinst.h" has to be included )
 if(!SQLGetInstalledDrivers(szBuf,cbBufMax,& cbBufOut))
 {
  sDirver = L"";
 }

 // Search for the driver...
 do
 {
  if( wcsstr( pszBuf, L"Excel" ) != 0 )
  {
   // Found !
   sDirver= CString( pszBuf );
   break;
  }
  pszBuf = wcschr( pszBuf, '\0' ) + 1;
 }
 while( pszBuf[1] != '\0' );
 return sDirver;
}

BOOL CRWExcel::open(const CString &dsn)
{
 return m_pDatabase->OpenEx(dsn, CDatabase::noOdbcDialog);
}
bool CRWExcel::executeSQL(CString &sql)
{
 try
 {
  // 能夠後退 [3/12/2009 f3219162]
  // pRecordset->Open(CRecordset::snapshot, sql, CRecordset::readOnly);
  // 不能夠后退
  //pRecordset->Open(CRecordset::forwardOnly, sql, CRecordset::readOnly);
  m_pRecordset->Open(CRecordset::snapshot, sql, CRecordset::readOnly);
 }
 catch(...)
 {
  return false;
 }
 return true;
}
bool CRWExcel::readRows(CString &sql,CStringArray &RowValues)
{
 ASSERT(m_pDatabase!=NULL);
 ASSERT(m_pRecordset!=NULL);
 //- 得到列數
 int nColumns =m_pRecordset->m_nResultCols;
 while (!m_pRecordset->IsEOF())
 {

  wstring wstr(L"");
  for (int i=0;i  {
   CString sAge1;
   m_pRecordset->GetFieldValue(i,sAge1);
   wstr +=L" ";
   wstr +=sAge1.GetBuffer();
   wstr +=L" ";
  }
  CString sAge(wstr.c_str());
  RowValues.Add(sAge);
  m_pRecordset->MoveNext();
 }
 m_pRecordset->MoveFirst();
 return true;
}
bool CRWExcel::readTitles(CStringArray &RowValues)
{
 ASSERT(m_pDatabase!=NULL);
 ASSERT(m_pRecordset!=NULL);
 int nColumns =m_pRecordset->m_nResultCols;
 if(m_pRecordset->IsEOF())
 {
  return false;
 }
 wstring wstr(L"");
 for (int i=0;i {
  CString sAge1;
  m_pRecordset->GetFieldValue(i,sAge1);
  wstr +=L" ";
  wstr += m_pRecordset->m_rgODBCFieldInfos[i].m_strName;
  wstr +=L" ";
 }
 CString sAge(wstr.c_str());
 RowValues.Add(sAge);
 return true;
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12560256/viewspace-609244/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12560256/viewspace-609244/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值