21xrx.com
2024-11-22 07:41:26 Friday
登录
文章检索 我的文章 写文章
C++读写Excel表格的实现方法
2023-07-10 03:18:58 深夜i     --     --
C++ 读写 Excel表格 实现方法

C++作为一种功能强大的编程语言,可以方便地读写Excel表格。本文将介绍使用C++读写Excel表格的实现方法。

一、使用C++读取Excel表格

要使用C++读取Excel表格,需要使用Microsoft Excel官方提供的COM接口。以下是实现步骤:

1.使用Microsoft Excel官方提供的COM接口打开Excel文件。

2.定义Worksheet和Range对象,分别表示Excel文件中的工作表和单元格范围。

3.创建Excel应用程序实例和Workbook对象,打开Excel文件。

4.获取要读取的工作表对象和需要读取的单元格范围。

5.使用Range对象读取单元格的内容。

6.将读取到的内容存储到数组或变量中。

下面是示例代码:

// C++代码读取Excel表格

#include

#include

#include "Excel.h"

using namespace std;

int main()

{

// 打开Excel文件

HRESULT hr;

hr = CoInitialize(NULL);

IDispatch *pExcelApp;

CLSID clsid;

hr = CLSIDFromProgID(L"Excel.Application", &clsid);

hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcelApp);

IDispatch *pWorkbook;

hr = pExcelApp->GetIDispatch(TRUE, &pWorkbook);

VARIANT vFile;

vFile.vt = VT_BSTR;

vFile.bstrVal = SysAllocString(L"D:\\test.xlsx");

VARIANT vtWorkbooks;

vtWorkbooks.vt = VT_DISPATCH;

vtWorkbooks.pdispVal = pWorkbook;

IDispatch *pWorkbooks;

pWorkbooks = vtWorkbooks.pdispVal;

IDispatch *pArgs;

pArgs = NULL;

DISPPARAMS params = pArgs;

VARIANT vtSheet;

VARIANT vtRange;

VARIANT vtCellValue;

// 获取工作表对象

vtSheet.vt = VT_DISPATCH;

hr = pWorkbook->GetIDsOfNames( L"S", 1, &MyName, &dispid);

hr = pWorkbook->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &vtSheet, NULL, NULL);

// 获取需要读取的单元格范围

vtRange.vt = VT_DISPATCH;

hr = pWorkbook->GetIDsOfNames( L"Range", 1, &MyName, &dispid);

params.rgvarg[0] = vtSheet;

params.rgvarg[1] = _variant_t(L"B2:D2");

params.cArgs = 2;

hr = pWorkbook->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &vtRange, NULL, NULL);

// 读取单元格内容

for(int i = 1; i <= 3; i++)

{

VARIANT vtIndex;

vtIndex.vt = VT_INT;

vtIndex.intVal = i;

params.rgvarg[0] = vtIndex;

hr = vtRange.pdispVal->GetIDsOfNames( L"Cells", 1, &MyName, &dispid);

hr = vtRange.pdispVal->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &vtCellValue, NULL, NULL);

if(vtCellValue.vt == VT_BSTR)

{

cout << "第" << i << "列的内容是:" << (char*)_bstr_t(vtCellValue.bstrVal) << endl;

}

}

// 关闭文件和应用程序

params.rgvarg[0] = vtSheet;

hr = pWorkbook->GetIDsOfNames( L"Close", 1, &MyName, &dispid);

hr = pWorkbook->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL);

hr = pExcelApp->GetIDsOfNames( L"Quit", 1, &MyName, &dispid);

params.cArgs = 0;

hr = pExcelApp->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL);

// 释放COM资源

vtSheet.pdispVal->Release();

vtRange.pdispVal->Release();

vtCellValue.pdispVal->Release();

pWorkbook->Release();

pExcelApp->Release();

return 0;

}

二、使用C++写入Excel表格

要使用C++写入Excel表格,同样需要使用Microsoft Excel官方提供的COM接口。以下是实现步骤:

1.使用Microsoft Excel官方提供的COM接口打开或创建Excel文件。

2.定义Worksheet和Range对象,分别表示Excel文件中的工作表和单元格范围。

3.创建Excel应用程序实例和Workbook对象,打开或创建Excel文件。

4.获取要写入的工作表对象和需要写入的单元格范围。

5.将要写入的内容赋值给Range对象。

6.保存Excel文件。

下面是示例代码:

// C++代码写入Excel表格

#include

#include

#include "Excel.h"

using namespace std;

int main()

{

// 打开Excel文件

HRESULT hr;

hr = CoInitialize(NULL);

IDispatch *pExcelApp;

CLSID clsid;

hr = CLSIDFromProgID(L"Excel.Application", &clsid);

hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcelApp);

IDispatch *pWorkbook;

hr = pExcelApp->GetIDispatch(TRUE, &pWorkbook);

VARIANT vFile;

vFile.vt = VT_BSTR;

vFile.bstrVal = SysAllocString(L"D:\\test.xlsx");

VARIANT vtWorkbooks;

vtWorkbooks.vt = VT_DISPATCH;

vtWorkbooks.pdispVal = pWorkbook;

IDispatch *pWorkbooks;

pWorkbooks = vtWorkbooks.pdispVal;

IDispatch *pArgs;

pArgs = NULL;

DISPPARAMS params = 0;

VARIANT vtSheet;

VARIANT vtRange;

VARIANT vtValue;

// 获取工作表对象

vtSheet.vt = VT_DISPATCH;

hr = pWorkbook->GetIDsOfNames( L"S", 1, &MyName, &dispid);

hr = pWorkbook->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &vtSheet, NULL, NULL);

// 获取需要写入的单元格范围

vtRange.vt = VT_DISPATCH;

hr = pWorkbook->GetIDsOfNames( L"Range", 1, &MyName, &dispid);

params.rgvarg[0] = vtSheet;

params.rgvarg[1] = _variant_t(L"B2:D2");

params.cArgs = 2;

hr = pWorkbook->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &vtRange, NULL, NULL);

// 写入单元格内容

vtValue.vt = VT_BSTR;

vtValue.bstrVal = SysAllocString(L"100");

params.rgvarg[0] = vtValue;

hr = vtRange.pdispVal->GetIDsOfNames( L"Value", 1, &MyName, &dispid);

hr = vtRange.pdispVal->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &params, NULL, NULL, NULL);

// 保存文件

hr = pWorkbook->GetIDsOfNames( L"Save", 1, &MyName, &dispid);

hr = pWorkbook->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL);

// 关闭文件和应用程序

params.rgvarg[0] = vtSheet;

hr = pWorkbook->GetIDsOfNames( L"Close", 1, &MyName, &dispid);

hr = pWorkbook->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL);

hr = pExcelApp->GetIDsOfNames( L"Quit", 1, &MyName, &dispid);

params.cArgs = 0;

hr = pExcelApp->Invoke( dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL);

// 释放COM资源

vtSheet.pdispVal->Release();

vtRange.pdispVal->Release();

vtValue.pdispVal->Release();

pWorkbook->Release();

pExcelApp->Release();

return 0;

}

总结

以上就是使用C++读写Excel表格的实现方法。使用COM接口可以方便地控制Microsoft Excel应用程序,实现对Excel文件的读写操作。需要注意的是,在使用COM接口时需要注意COM对象的释放和内存管理,否则可能会导致内存泄露或程序崩溃。

  
  

评论区

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