21xrx.com
2025-03-27 06:43:36 Thursday
文章检索 我的文章 写文章
C++读取Excel文件代码
2023-07-08 13:46:09 深夜i     9     0
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文件,并进行进一步的数据处理和分析。

  
  

评论区