天天看點

vs2010建立控制台程式使用C++讀寫excel檔案(ODBC方式)

轉自:https://www.cnblogs.com/renjiashuo/p/7545784.html

用ODBC實作讀寫excel檔案

優點:

(1).不需要安裝office,隻需要有Excel驅動即可(Microsoft Excel

Driver (*.xls))

(2).不需使用MFC,代碼少,使用友善

vs2010下親測可用,流程如下:

  1. vs2010建立一個空項目
  2. 源檔案中添加如下主程式檔案

testOperateExcel.cpp

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

//擷取ODBC中Excel驅動
CString GetExcelDriver()
{
	char szBuf[2001];
	WORD cbBufMax = 2000;
	WORD cbBufOut;
	char *pszBuf = szBuf;
	CString sDriver;

	//擷取已安裝驅動的名稱
	if(!SQLGetInstalledDrivers(szBuf,cbBufMax,&cbBufOut))
		return "";

	//檢索已安裝的驅動是否有Excel...
	do
	{
		if(strstr(pszBuf,"Excel") != 0)  //csv
		{
			//發現excel驅動
			sDriver = CString(pszBuf);
			break;
		}
		pszBuf = strchr(pszBuf,'\0') + 1;
	}while(pszBuf[1] != '\0');

	return sDriver;
}


//讀取Excel檔案
void ReadFromExcel()
{
	CDatabase database;
	CString sSql;
	CString sItem1,sItem2;
	CString sDriver;
	CString sDsn;
	CString sFile = "d:\\demo.xls"; 

	sDriver = GetExcelDriver();
	if(sDriver.IsEmpty())
	{
		cout<<"沒有安裝Excel驅動"<<endl;
		return;
	}

	//建立進行存取的字元串
	sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
	
	try
	{
		//打開資料庫(即Excel檔案)
		database.Open(NULL,false,false,sDsn);
		CRecordset recset(&database);
		//設定讀取的查詢語句
		sSql = "select name,age from demo order by name"; 
		//執行查詢
		recset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);
		//擷取查詢結果
		while(!recset.IsEOF())
		{
			//讀取Excel内部數值
			recset.GetFieldValue("name",sItem1);
			recset.GetFieldValue("age",sItem2);
			cout<<sItem1<<"\t"<<sItem2<<endl;
			//移到下一行
			recset.MoveNext();
		}
		//關閉資料庫
		database.Close();
	}
	catch(CDBException e)
	{
		AfxMessageBox("資料庫操作産生異常:"+e.ReportError());
	}
}



//建立并寫入Excel檔案(未實作重寫覆寫,如有需要請自行處理啦)
void WriteToExcel()
{
	CDatabase database;
	CString sDriver = "Microsoft Excel Driver (*.xls)"; //Excel安裝驅動
	CString sExcelFile = "d:\\demo.xls"; //要寫入的Excel檔案
	CString sSql;
	TRY
	{
		//建立進行存取的字元串
		sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver,sExcelFile,sExcelFile);
		//建立資料庫(即建立Excel檔案)
		if(database.OpenEx(sSql,CDatabase::noOdbcDialog))
		{
			//建立表結構(姓名,年齡)
			sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
			database.ExecuteSQL(sSql);
			
			//插入數值
			sSql = "INSERT INTO demo (Name,Age) VALUES ('xiaoming',18)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO demo (Name,Age) VALUES ('Kobe',40)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO demo (Name,Age) VALUES ('James',34)";
			database.ExecuteSQL(sSql);
		}
		//關閉資料庫
		database.Close();
	}
	CATCH_ALL(e)
	{
		TRACE1("Excel驅動沒有安裝: %s",sDriver);
	}
	END_CATCH_ALL;
}


int main()
{
	WriteToExcel();
	ReadFromExcel();
	return 0;
}
           

3.常見報錯問題如何處理:

項目屬性更改(以下酌情,出現哪個錯誤改哪個,本人遇到(1)和(2))

(1).菜單欄 項目->cppRWexcel屬性->配置屬性->正常->項目預設值->MFC的使用->在共享 DLL 中使用 MFC。

(2).菜單欄 項目->cppRWexcel屬性->配置屬性->正常->項目預設值->字元集->使用多位元組字元集。

(3).(vs2017可能需要修改)菜單欄 項目->cppRWexcel屬性->配置屬性->連結器->輸入->附加依賴項中添加"legacy_stdio_definitions.lib"不含雙引号。

(4).(vs2010可能需要修改)菜單欄 項目->cppRWexcel屬性->配置屬性->清單工具->輸入和輸出->嵌入清單->否。

4.編譯并運作程式,檢視結果:

相應路徑生成demo.xls檔案:

vs2010建立控制台程式使用C++讀寫excel檔案(ODBC方式)

且輸出讀取結果如下:

vs2010建立控制台程式使用C++讀寫excel檔案(ODBC方式)

繼續閱讀