使用ODBC读取excel文件

odbcexcel.cpp:

#include "StdAfx.h"
#include "OdbcExcel.h"

CString 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;
}

COdbcExcel::COdbcExcel(void)
{
}

COdbcExcel::~COdbcExcel(void)
{
}

void COdbcExcel::ReadExcel()
{
 CString qudong = GetExcelDriver();
}

CString COdbcExcel:: 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 COdbcExcel::Initial_path(CString _path)
{
 ExcelName = _path;
 int _exit = PathFileExists(ExcelName);
 if (1 == _exit)
 {
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}

void COdbcExcel::Initial_sheet_columnname(CString _sheet, CString _columnname)
{
 SheetName  = _sheet;
 ColumnName = _columnname;
 CString _temp = _columnname;
 ColumnLength = _temp.Remove(',') + 1;
}

void COdbcExcel::Open_DataBase()
{   
 // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
 sDriver = GetExcelDriver();
 if (sDriver.IsEmpty())
 {
  // 没有发现Excel驱动
  AfxMessageBox("没有安装Excel驱动!");
  return;
 }
 // 创建进行存取的字符串
 sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, ExcelName);
 TRY
 {
  // 打开数据库(既Excel文件)
  database.Open(NULL, false, false, sDsn);
  recset = new CRecordset(&database);
  //recset = &database;
  //CRecordset recset(&database);
  // 设置读取的查询语句.
  sSql =  "SELECT " + ColumnName + " FROM " + SheetName;//"ORDER BY Name ";
  // 执行查询语句
  recset->Open(CRecordset::forwardOnly/*dynamic*/, sSql, CRecordset::readOnly);   
 }
 CATCH(CDBException, e)
 {
  // 数据库操作产生异常时...
  AfxMessageBox("数据库错误: " + e->m_strError);
 }
 END_CATCH;
}

void COdbcExcel::Close_DataBae()
{
 recset->Close();
 // 关闭数据库
 database.Close();
}

bool COdbcExcel::GetValueFromExcel( int _column, int & _value)
{
 if ( _column > ColumnLength)
 {
  return FALSE;
 }
 else
 {
  CString result;
  int value_;
  CString onecolumn = GetOneColumn(_column);
  recset->GetFieldValue(onecolumn, result);
  char* _tempchar = result.GetBuffer();
  sscanf(_tempchar, "%d", &value_);
  _value = value_;
  return TRUE;
 }
}

bool COdbcExcel::GetValueFromExcel(int _column, double &_value)
{
 if ( _column > ColumnLength)
 {
  return FALSE;
 }
 else
 {
  CString result;
  CString onecolumn = GetOneColumn(_column);
  recset->GetFieldValue(onecolumn, result);
  char* _tempchar = result.GetBuffer();
  sscanf(_tempchar, "%f", &_value);
  return TRUE;
 }

}

bool COdbcExcel::GetValueFromExcel(int _column, char *_value)
{
 if ( _column > ColumnLength)
 {
  return FALSE;
 }
 else
 {
  CString result;
  CString onecolumn = GetOneColumn(_column);
  recset->GetFieldValue(onecolumn, result);
  //_value = result.GetBuffer();
  strcpy(_value, result.GetBuffer());
  return TRUE;
 }   
}

void COdbcExcel::MoveNextRow()
{
 recset->MoveNext();
}

CString COdbcExcel::GetOneColumn(int th)
{
 CString _tempstr = ColumnName;
 CString _result;
 int n;
 while ( 0 != th)
 {
  n = _tempstr.Find(',');
  if ( -1 == n)
  {
   return _tempstr;
  }
  else
  {
   _result = _tempstr.Left(n);
   _tempstr = _tempstr.Right(_tempstr.GetLength() - n - 1);
   --th;   
  }   
 }
 return _result;
}

 

***************************************************************************\

odbcexcel.h

#pragma once

#include <afxdb.h>
#include <odbcinst.h>
#include <shlwapi.h>
#include <iostream>
using namespace std;


class COdbcExcel
{
public:
 COdbcExcel(void);
 ~COdbcExcel(void);

 void ReadExcel();

 CString GetExcelDriver();//OK
 bool Initial_path (CString _path);//OK
 void Initial_sheet_columnname(CString _sheet, CString _columnname);//布尔类型返回值没设定
 void Open_DataBase();//OK
 void Close_DataBae();//OK
 bool GetValueFromExcel( int _column, int & _value);//OK
 bool GetValueFromExcel( int _column, double & _value);//OK
 bool GetValueFromExcel( int _column, char* _value);//OK
 void MoveNextRow();//OK
 CString GetOneColumn(int th);//OK


public:
 ///初始化excel文件
 CString ExcelName;
 CString SheetName;
 CString ColumnName;
 ///初始化excel文件


 ///初始化DataBase
 CDatabase database;
 CRecordset *recset;
 CString sDsn;
 CString sDriver;
 CString sSql;
 ///初始化DataBase


 ///查询
 int ColumnLength;
 ///查询
};

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用ODBC(Open Database Connectivity)来连接Excel文件,然后使用C++代码来读写文件。 以下是使用ODBC连接Excel文件的步骤: 1. 安装Excel ODBC驱动程序 首先需要安装Excel ODBC驱动程序。在Windows系统中,可以在“控制面板” -> “管理员工具” -> “ODBC数据源(64位)”或“ODBC数据源(32位)”中找到该驱动程序。 2. 创建ODBC数据源 打开ODBC数据源窗口,单击“系统DSN”选项卡,然后单击“添加”按钮。在“创建新数据源”对话框中,选择Excel驱动程序,然后单击“完成”按钮。在“ODBC Microsoft Excel Setup”对话框中,指定Excel文件的名称和路径,然后单击“确定”按钮。这样就创建了一个ODBC数据源。 3. 使用ODBC API连接Excel文件 在C++代码中,可以使用ODBC API连接到Excel文件。以下是一个示例程序,它使用ODBC API连接到Excel文件并将数据写入其中: ```c++ #include <iostream> #include <windows.h> #include <sql.h> #include <sqlext.h> int main() { // 初始化ODBC环境 SQLHENV env; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); // 连接到Excel文件 SQLHDBC dbc; SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); SQLCHAR* connStr = (SQLCHAR*)"DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\\test.xlsx;"; SQLRETURN rc = SQLDriverConnect(dbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); if (SQL_SUCCEEDED(rc)) { // 执行SQL语句 SQLHSTMT stmt; SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); rc = SQLExecDirect(stmt, (SQLCHAR*)"CREATE TABLE Sheet1 (ID INT, Name VARCHAR(50))", SQL_NTS); if (SQL_SUCCEEDED(rc)) { // 插入数据 SQLCHAR* insertQuery = (SQLCHAR*)"INSERT INTO Sheet1 (ID, Name) VALUES (1, 'John')"; rc = SQLExecDirect(stmt, insertQuery, SQL_NTS); } // 释放资源 SQLFreeHandle(SQL_HANDLE_STMT, stmt); } SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env); return 0; } ``` 此代码演示了如何使用ODBC API连接到Excel文件并创建一个名为“Sheet1”的表,然后向其中插入一个记录。你可以根据自己的需求修改此代码来读取或更新Excel文件中的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值