holyya.com
2025-09-05 00:39:12 Friday
登录
文章检索 我的文章 写文章
使用C++解析XLS和XLSX文件
2023-07-08 07:29:18 深夜i     --     --
C++ 解析 XLS XLSX 文件

随着数据处理与分析的广泛应用,微软的Excel成为了各个行业中广泛使用的办公软件。Excel中的数据可以结构化地排列并以各种图表和统计方式展示出来,但是数据的获取与处理常常受到文件格式的限制。本文介绍如何使用C++解析Excel文件中的数据。

Excel文件有两种常用格式:一种是旧版的.xls,另一种是新版的.xlsx。这两种格式的文件结构非常不同,但C++工具集提供了多种方式来读取它们。我们将使用两个支持库:OLE2和libxlsxwriter。

OLE2库是Windows操作系统的一部分,主要用于读取旧版Excel文件。开始之前,需要确定Excel文件中想要读取的表格所对应的sheet名称。使用OLE2库的核心代码如下:


#include <iostream>

#include <ole2.h>

using namespace std;

int main()

{

  CoInitialize(NULL);

  IStorage* storage;

  HRESULT hr = StgOpenStorage(L"example.xls", NULL, STGM_READ, NULL, 0, &storage);

  if (FAILED(hr))

    cout << "Open Storage Failed." << endl;

    return -1;

  

  IStream* stream;

  hr = storage->OpenStream(L"Sheet1", 0, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream);

  if (FAILED(hr)) {

    cout << "Open Stream Failed." << endl;

    storage->Release();

    return -1;

  }

  int buffer_size = 4096;

  char buffer[4096];

  ULONG bytes_read;

  while (SUCCEEDED(hr = stream->Read(buffer, static_cast<ULONG>(buffer_size), &bytes_read)) && bytes_read) {

    cout.write(buffer, bytes_read);

  }

  stream->Release();

  storage->Release();

  CoUninitialize();

  return 0;

}

以上代码使用了OLE2的StgOpenStorage和storage->OpenStream两个函数进行文件和sheet的打开。读取时,可以使用stream->Read函数将数据读入缓存,进行接下来的处理。

对于新版Excel文件,libxlsxwriter是一款开源库,主要用于读取基于XML的.xlsx格式。libxlsxwriter提供了一个简单的API,可以按行或按列读取数据,并生成新的.xlsx文件。

使用libxlsxwriter库的核心代码如下:


#include <iostream>

#include "xlsxwriter.h"

using namespace std;

int main()

{

  lxw_workbook* workbook = workbook_new("example.xlsx");

  lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);

  int row = 0;

  int col = 0;

  int num = 1;

  while (row < 10) {

    worksheet_write_number(worksheet, row, col, num, NULL);

    num++;

    row++;

  }

  workbook_close(workbook);

  return 0;

}

以上代码可以在打开一个新的工作簿后,将数字1到10按行写入workbook中。每次调用worksheet_write_number函数,都会在单元格中写入代表数字的内容。

总之,使用C++解析Excel文件需要根据文件格式选择不同的工具集并采用相应的API。无论使用OLE2库读取旧版Excel文件还是使用libxlsxwriter库读取新版Excel文件,都需要掌握相应的读取和写入数据的API。希望本文能对您在数据处理过程中的工作提供一些帮助。

  
  

评论区

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