当前位置:软件学习 > Excel >>

使用odbc读写excel类: (2) 源文件

  1#include "stdafx.h"
  2#include "odbcexcel.h"
  3using namespace std;
  4
  5/*************************************************************************************************
  6  2009-11-2  修改了整型数据显示不一致的问题,如5454,读取时是5454.0,在excel表格显示是5454
  7            
  8**************************************************************************************************/
  9
 10CString CODBCExcel::GetExcelDriver()
 11{
 12    TCHAR szBuf[2001];
 13    WORD cbBufMax = 2000;
 14    WORD cbBufOut;
 15    TCHAR *pszBuf = szBuf;
 16
 17    CString strExcelDriver;
 18    // Get the names of the installed drivers ("odbcinst.h" has to be included )
 19    if(!SQLGetInstalledDrivers(szBuf,cbBufMax,& cbBufOut))
 20    {
 21        strExcelDriver = "";
 22    }
 23
 24    // Search for the driver
 25    do
 26    {
 27        if( _tcsstr( pszBuf, _T("Excel") ) != 0 )
 28        {
 29            // Found !
 30            strExcelDriver = CString( pszBuf );
 31            break;
 32        }
 33        pszBuf = _tcschr( pszBuf, _T('\0')) + 1;
 34    }
 35    while( pszBuf[1] != '\0' );
 36
 37    return strExcelDriver;
 38}
 39
 40//////////////////////////////////////////////////////////////////////////
 41CODBCExcel::CODBCExcel()
 42{
 43}
 44
 45CODBCExcel::~CODBCExcel()
 46{
 47   m_db.Close();
 48   for (map<CString,CODBCExcelSheet*>::iterator iter = m_Sheets.begin(); iter != m_Sheets.end();)
 49   {
 50      delete iter->second;   iter = m_Sheets.erase(iter);
 51   }
 52}
 53
 54bool CODBCExcel::Open(const CString& strFileName)
 55{
 56    if (m_db.IsOpen())     return  true;
 57
 58  CString strDSN;
 59    strDSN.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),
 60                 GetExcelDriver(), strFileName, strFileName);
 61  return m_db.OpenEx(strDSN, CDatabase::noOdbcDialog) == TRUE;
 62}
 63
 64bool CODBCExcel::Save()
 65{
 66    CString strSQL;
 67    for (map<CString,CODBCExcelSheet*>::iterator iter = m_Sheets.begin(); iter != m_Sheets.end();++iter)
 68    {
 69        iter->second->Save();
 70    }
 71    return true;
 72}
 73
 74void CODBCExcel::Close()
 75{
 76   m_db.Close();
 77}
 78
 79CODBCExcelSheet* CODBCExcel::GetWorkSheet(const CString& strSheetName)
 80{
 81    CString strSQL;
 82    strSQL.Format(_T("SELECT * FROM [%s$A1:IV65536]"), strSheetName);
 83    CODBCExcelSheet* sheet = 0;
 84    bool bNew = false;
 85    map<CString,CODBCExcelSheet*>::iterator iter = m_Sheets.find(strSheetName);
 86    if (iter != m_Sheets.end())
 87    {
 88        sheet = iter->second;
 89        if (CODBCExcelSheet::Add == sheet->m_nFlag || CODBCExcelSheet::Update == sheet->m_nFlag)
 90            return sheet;
 91    }
 92    else
 93    {
 94        sheet = new CODBCExcelSheet(*this, strSheetName);
 95        bNew = true;
 96    }
 97    try
 98    {
 99        sheet->m_recordset.Open(CRecordset::forwardOnly, strSQL, CRecordset::readOnly);
100    }
101    catch()
102    {
103        if (sheet)    sheet->m_recordset.Close();
104        if (!bNew)    return sheet;
105        delete sheet; return 0;
106    }
107    sheet->Init(); 
108    m_Sheets.insert(make_pair(strSheetName, sheet));
109    return sheet;
110}
111
112CODBCExcelSheet* CODBCExcel::AddWorkSheet(const CString &strSheetName, const CStringArray& ColHeaders)
113{
114   CODBCExcelSheet* sheet = GetWorkSheet(strSheetName);
115   if (!sheet)
116   {
117       sheet = new CODBCExcelSheet(*this, strSheetName);
118       if (!sheet)      return  0;
119       sheet->m_nFlag = CODBCExcelSheet::Add;
120       sheet->m_ColHeaders.Copy(ColHeaders);
121       m_Sheets.insert(make_pair(strSheetName, sheet));
122   }
123   else
124   {
125       sheet->m_dwRows = 0;
126       sheet->m_nFlag = CODBCExcelSheet::Update;
127       sheet->m_ColHeaders.RemoveAll();
128       sheet->m_ColHeaders.Copy(ColHeaders);
129   }
130   sheet->m_dwCols = ColHeaders.GetCount();
131   return sheet;
132}
133
134void CODBCExcel::DeleteWorkSheet(const CString& strSheetName)
135{
136    map<CString,CODBCExcelSheet*>::iterator iter = m_Sheets.find(strSheetName);
137    if (iter != m_Sheets.end())
138    {
139        iter->second->m_nFlag = CODBCExcelSheet::De

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,