21xrx.com
2025-06-13 02:47:25 Friday
文章检索 我的文章 写文章
使用C++操作Excel文件
2023-07-13 19:53:21 深夜i     --     --
C++ Excel 操作

Excel文件是一个非常常见的电子表格,它具有广泛的用途和应用,因此,使用C++操作Excel文件的技能是非常重要的。

在C++中,操作Excel文件的常见方法包括使用COM接口和使用第三方库。

使用COM接口

COM(组件对象模型)是一种微软开发的对象模型,可以使得不同编程语言之间能够相互交互。以此来操作Excel文件,我们可以使用Microsoft Excel应用程序对象,根据Excel的对象模型,实现对Workbook、Worksheets、Range等Excel对象的操作。

以下是一个简单的C++代码示例,可以用来打开并访问Excel文件:

// Step 1: 定义必要的头文件
#include <windows.h>
#include <ole2.h>
#include <iostream>
// Step 2: 加载并初始化Excel Application
void InitExcel()
{
  HRESULT hr;
  hr = CoInitialize(NULL);
  if (FAILED(hr))
  
    std::cout << "Failed to initialize COM library";
    return;
  
  hr = CoCreateInstance(CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_pExcel);
  if (FAILED(hr))
  {
    std::cout << "Failed to create Excel Application instance";
    CoUninitialize();
    return;
  }
}
// Step 3: 打开Excel文件
void OpenExcelFile(wchar_t *strFilePath)
{
  HRESULT hr;
  VARIANT varResult;
  DISPPARAMS dp = { 0 };
  hr = m_pExcel->GetIDsOfNames(IID_NULL, &strOpen, 1, LOCALE_USER_DEFAULT, &m_nIDOpen);
  if (FAILED(hr))
  
    std::cout << "Failed to get GetIDsOfNames for Open";
    return;
  
  VariantInit(&varResult);
  dp.cArgs = 1;
  dp.rgvarg = new VARIANT[1];
  dp.rgvarg[0].vt = VT_BSTR;
  dp.rgvarg[0].bstrVal = SysAllocString(strFilePath);
  hr = m_pExcel->Invoke(m_nIDOpen, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dp, &varResult, NULL, NULL);
  if (FAILED(hr))
  
    std::cout << "Failed to open Excel file";
    return;
  
}
// Step 4: 访问Workbook和Worksheets
void AccessWorkbookWorksheets()
{
  HRESULT hr;
  VARIANT varResult;
  DISPPARAMS dp = { 0 };
  hr = m_pExcel->GetIDsOfNames(IID_NULL, &strActiveWorkbook, 1, LOCALE_USER_DEFAULT, &m_nIDActiveWorkbook);
  if (FAILED(hr))
  
    std::cout << "Failed to get GetIDsOfNames for ActiveWorkbook";
    return;
  
  VariantInit(&varResult);
  hr = m_pExcel->Invoke(m_nIDActiveWorkbook, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dp, &varResult, NULL, NULL);
  if (FAILED(hr))
  
    std::cout << "Failed to get ActiveWorkbook";
    return;
  
  IDispatch *pWorkbookDispatch = varResult.pdispVal;
  hr = pWorkbookDispatch->GetIDsOfNames(IID_NULL, &strSheets, 1, LOCALE_USER_DEFAULT, &m_nIDSheets);
  if (FAILED(hr))
  
    std::cout << "Failed to get GetIDsOfNames for Sheets";
    return;
  
  hr = pWorkbookDispatch->Invoke(m_nIDSheets, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dp, &varResult, NULL, NULL);
  if (FAILED(hr))
  
    std::cout << "Failed to get Sheets";
    return;
  
  IDispatch *pWorksheetsDispatch = varResult.pdispVal;
}
// Step 5: 访问Range
void AccessRange()
{
  HRESULT hr;
  VARIANT varResult;
  DISPPARAMS dp = { 0 };
  hr = m_pExcelRange->GetIDsOfNames(IID_NULL, &strValue, 1, LOCALE_USER_DEFAULT, &m_nIDValue);
  if (FAILED(hr))
  
    std::cout << "Failed to get GetIDsOfNames for Value";
    return;
  
  VariantInit(&varResult);
  hr = m_pExcelRange->Invoke(m_nIDValue, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dp, &varResult, NULL, NULL);
  if (FAILED(hr))
  
    std::cout << "Failed to get Value";
    return;
  
  std::wcout << "Cell Value: ";
  if (varResult.vt == VT_BSTR)
  
    std::wcout << varResult.bstrVal << std::endl;
  
  else
  
    std::wcout << varResult.iVal << std::endl;
  
}
// Step 6: 释放资源
void ReleaseExcel()
{
  if (m_pExcelRange)
  {
    m_pExcelRange->Release();
    m_pExcelRange = NULL;
  }
  if (m_pExcelWorksheets)
  {
    m_pExcelWorksheets->Release();
    m_pExcelWorksheets = NULL;
  }
  if (m_pExcelWorkbook)
  {
    m_pExcelWorkbook->Release();
    m_pExcelWorkbook = NULL;
  }
  if (m_pExcel)
  {
    m_pExcel->Release();
    m_pExcel = NULL;
  }
  CoUninitialize();
}

使用第三方库

另一个常见的方法是使用第三方库,例如libxls、libxl、ExcelFormat等。这些库都提供了类似的接口,可以读取、写入、编辑Excel文件。

以下是一个使用libxl库来操作Excel文件的示例代码:

// Step 1: 定义必要的头文件
#include "libxl.h"
#include <iostream>
// Step 2: 加载Excel文件
void LoadExcelFile()
{
  libxl::Book* book = xlCreateBook();
  if (book == NULL)
  
    std::cout << "Failed to create Excel book";
    return;
  
  if (!book->load("myfile.xls"))
  {
    std::cout << "Failed to load Excel file";
    book->release();
    return;
  }
  libxl::Sheet* sheet = book->getSheet(0);
  if (sheet == NULL)
  {
    std::cout << "Failed to get Excel sheet";
    book->release();
    return;
  }
  int nrows = sheet->lastRow();
  int ncols = sheet->lastCol();
  for (int i = 0; i < nrows; ++i)
  {
    for (int j = 0; j < ncols; ++j)
    {
      libxl::CellType type = sheet->cellType(i, j);
      if (type == libxl::CELLTYPE_NUMBER)
      {
        std::cout << sheet->readNum(i, j) << "\t";
      }
      else if (type == libxl::CELLTYPE_BOOLEAN)
      {
        std::cout << sheet->readBool(i, j) << "\t";
      }
      else if (type == libxl::CELLTYPE_STRING)
      {
        std::cout << sheet->readStr(i, j) << "\t";
      }
    }
    std::cout << std::endl;
  }
  book->release();
}
// Step 3: 写入Excel文件
void WriteExcelFile()
{
  libxl::Book* book = xlCreateBook();
  if (book == NULL)
  
    std::cout << "Failed to create Excel book";
    return;
  
  libxl::Sheet* sheet = book->addSheet("Sheet1");
  if (sheet == NULL)
  {
    std::cout << "Failed to add Excel sheet";
    book->release();
    return;
  }
  sheet->writeStr(0, 0, "Hello, World!");
  book->save("myfile.xls");
  book->release();
}

结论

可以看到,无论是使用COM接口还是第三方库,都可以很容易地实现对Excel文件的操作。同时,C++作为一种高级编程语言,在处理大量数据和复杂逻辑时具有很强的优势,因此,使用C++来操作Excel文件可以提高效率和灵活性。

  
  

评论区