21xrx.com
2024-11-05 19:02:50 Tuesday
登录
文章检索 我的文章 写文章
C++读取Excel文件代码
2023-07-08 13:46:09 深夜i     --     --
C++ 读取 Excel文件 代码

C++是一种广泛使用的计算机编程语言,它支持各种应用程序开发,包括读取Excel文件。在本文中,我们将介绍如何使用C++读取Excel文件的代码。

为了读取Excel文件,我们需要使用一个叫做“OLE DB”的组件,它可以在运行时连接到Excel文件并读取数据。首先,我们需要在我们的代码中包含一些头文件,以便我们可以使用OLE DB接口和相关函数。下面是我们需要包含的几个头文件:


#include <windows.h>

#include <oleauto.h>

#include <oledb.h>

#include <msdasc.h>

#include <iostream>

#pragma comment(lib, "oledb32.lib")

接下来,我们需要定义一些全局变量和结构体,以便我们可以存储Excel文件的连接和数据。我们的代码将使用一个名为“ExcelData”的结构体来存储Excel数据。下面是我们的结构体定义:


struct ExcelData

  int rows;

  int cols;

  std::vector<std::vector<std::string>> data;

;

这个结构体包含了三个成员变量,其中“rows”和“cols”记录了我们读取的Excel表格的行数和列数,而“data”则是一个二维字符串向量,用来存储每个单元格的值。

接下来,我们需要实现一个名为“readExcel”的函数,该函数将连接到Excel文件并读取数据。下面是readExcel函数的实现:


void readExcel(const wchar_t* filename, ExcelData& data) {

  CoInitialize(NULL);

  IDBInitialize* dbinit = NULL;

  DBPROPSET dbPropSet = {};

  DBPROP dbProp = {};

  CLSID clsid;

  CLSIDFromString(L"{00000603-0000-0000-C000-000000000046}", &clsid);

  CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&dbinit);

  dbPropSet.guidPropertySet = DBPROPSET_DBINIT;

  dbPropSet.cProperties = 1;

  dbPropSet.rgProperties = &dbProp;

  dbProp.dwPropertyID = DBPROP_AUTHENTICATIONMODE;

  dbProp.dwOptions = DBPROPOPTIONS_REQUIRED;

  dbProp.colid = DB_NULLID;

  dbProp.vValue.vt = VT_I4;

  dbProp.vValue.lVal = DB_AUTHENTICATION_SQL;

  dbinit->SetProperties(1, &dbPropSet);

  IDBDataSourceAdmin* dbdsadmin = NULL;

  dbinit->QueryInterface(IID_IDBDataSourceAdmin, (void**)&dbdsadmin);

  dbdsadmin->CreateDataSource(0, NULL, IID_IDBInitialize, (IUnknown**)&dbinit);

  dbinit->Initialize();

  IDBCreateSession* dbcreatesession = NULL;

  dbinit->QueryInterface(IID_IDBCreateSession, (void**)&dbcreatesession);

  IOpenRowset* openrowset = NULL;

  dbcreatesession->CreateSession(NULL, IID_IOpenRowset, (IUnknown**)&openrowset);

  WCHAR connstr[1024];

  swprintf_s(connstr, L"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties='Excel 12.0 Macro;HDR=YES;IMEX=1;'", filename);

  WCHAR sql[1024];

  swprintf_s(sql, L"SELECT * FROM [Sheet1$]");

  IRowset* rowset = NULL;

  openrowset->OpenRowset(NULL, sql, NULL, IID_IRowset, 0, NULL, (IUnknown**)&rowset);

  IAccessor* accessor = NULL;

  rowset->QueryInterface(IID_IAccessor, (void**)&accessor);

  IColumnsInfo* columnsinfo = NULL;

  rowset->QueryInterface(IID_IColumnsInfo, (void**)&columnsinfo);

  DBORDINAL cols = 0;

  columnsinfo->GetColumnInfo(&cols, NULL, NULL, NULL, NULL, NULL);

  data.cols = cols;

  HACCESSOR haccessor = NULL;

  DBBINDING dbbinding[1024] = { 0 };

  DBLENGTH dblength = 0;

  DBBYTEOFFSET dbbyteoffset = 0;

  for (int i = 0; i < cols; i++) {

    columnsinfo->GetColumnInfo(&cols, NULL, NULL, NULL, NULL, NULL);

    dbbinding[i].iOrdinal = i + 1;

    dbbinding[i].dwPart = DBPART_VALUE;

    dbbinding[i].dwMemOwner = DBMEMOWNER_CLIENTOWNED;

    dbbinding[i].eParamIO = DBPARAMIO_NOTPARAM;

    dbbinding[i].wType = DBTYPE_STR;

    dbbinding[i].cbMaxLen = 1024;

  }

  accessor->CreateAccessor(DBACCESSOR_ROWDATA, cols, dbbinding, 0, &haccessor, &dblength);

  HROW hrow;

  HROW* phrow = &hrow;

  void* pdata[1024] = { 0 };

  char value[1024] = { 0 };

  ULONG fetchedrows = 0;

  ULONG fetchedcols = 0;

  rowset->GetNextRows(NULL, 0, 1, &fetchedrows, &phrow);

  while (fetchedrows == 1) {

    pdata[0] = value;

    rowset->GetData(hrow, haccessor, pdata);

    std::vector<std::string> row;

    for (int i = 0; i < cols; i++) {

      row.push_back(std::string((char*)pdata[i]));

    }

    data.data.push_back(row);

    rowset->ReleaseRows(1, phrow, NULL, NULL, NULL);

    rowset->GetNextRows(NULL, 0, 1, &fetchedrows, &phrow);

  }

  data.rows = data.data.size();

  accessor->ReleaseAccessor(haccessor, NULL);

  columnsinfo->Release();

  accessor->Release();

  rowset->Release();

  openrowset->Release();

  dbcreatesession->Release();

  dbdsadmin->Release();

  dbinit->Release();

  CoUninitialize();

}

该函数的输入参数是Excel文件的路径,它的输出将存储在我们之前定义的ExcelData结构体中。

最后,我们可以使用如下代码调用我们的readExcel函数,读取Excel文件并打印出其中的数据:


ExcelData data;

readExcel(L"./data.xlsx", data);

for (int i = 0; i < data.rows; i++) {

  for (int j = 0; j < data.cols; j++) {

    std::cout << data.data[i][j] << "\t";

  }

  std::cout << std::endl;

}

以上就是使用C++读取Excel文件的代码。通过使用OLE DB组件,我们可以轻松地连接到Excel文件并读取其中的数据。该代码可以帮助开发者更好地处理Excel文件,并进行进一步的数据处理和分析。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复