Простой Класс для работы с Excell в QT.
Была задача использовать Excell в QT, Нашел в сети исходники и переписал под свои нужды, данный класс сохраняет значения в ячейки, без возможности чтения из них.
Для использования в QT при динамической сборке следует определить
#define _AFXDLL, при статической сборке закомментировать #define _AFXDLL.
LIBS += ole32.lib
oleaut32.lib
strmiids.lib
INCLUDEPATH += "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" \
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include"
* Собирать только компилятором от MS.
Пример использования класса:
m_xsl = new CMSExcel
if(m_xsl->OpenExcelBook(CA2CT("SomeExcellFile.xlsx"), false) == S_OK){m_xsl->SetExcelValue(CA2CT("C4"), CA2CT("SomeValue"), true, 0);}m_xsl->Close();
#define _AFXDLL
#ifndef OLEXLS_H__
#define OLEXLS_H__
#include <afxdisp.h>
#include <vector>
#include <ole2.h>
HRESULT OLEMethod(int nType, VARIANT *pvResult, IDispatch *pDisp,LPOLESTR ptName, int cArgs...);
class CMSExcel
{
HRESULT m_hr;
IDispatch* m_pEApp;
IDispatch* m_pBooks;
IDispatch* m_pActiveBook;
private:
HRESULT Initialize(bool bVisible = true);
public:
CMSExcel(void);
//Destructor
~CMSExcel(void);
HRESULT SetVisible(bool bVisible);
HRESULT OpenExcelBook(LPCTSTR szFilename, bool bVisible);
HRESULT SetExcelValue(LPCTSTR szRange,LPCTSTR szValue,bool bAutoFit, int nAlignment);
HRESULT Quit();
};
#endif
#include "olexls.h"HRESULT OLEMethod(int nType, VARIANT *pvResult, IDispatch *pDisp,LPOLESTR ptName, int cArgs...){if(!pDisp) return E_FAIL;va_list marker;va_start(marker, cArgs);DISPPARAMS dp = { NULL, NULL, 0, 0 };DISPID dispidNamed = DISPID_PROPERTYPUT;DISPID dispID;char szName[200];// Convert down to ANSIWideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);// Get DISPID for name passed...HRESULT hr= pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);if(FAILED(hr)) {return hr;}
// Allocate memory for arguments...VARIANT *pArgs = new VARIANT[cArgs+1];// Extract arguments...for(int i=0; i<cArgs; i++) {pArgs[i] = va_arg(marker, VARIANT);}
// Build DISPPARAMSdp.cArgs = cArgs;dp.rgvarg = pArgs;// Handle special-case for property-puts!if(nType & DISPATCH_PROPERTYPUT) {dp.cNamedArgs = 1;dp.rgdispidNamedArgs = &dispidNamed;}
// Make the call!hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp, pvResult, NULL, NULL);if(FAILED(hr)) {return hr;}
// End variable-argument section...va_end(marker);delete [] pArgs;return hr;}CMSExcel::CMSExcel(void){m_hr = S_OK;m_pEApp = NULL;m_pBooks = NULL;m_pActiveBook = NULL;}//DestructorCMSExcel::~CMSExcel(void){Quit();
CoUninitialize();
}HRESULT CMSExcel::Initialize(bool bVisible){CoInitialize(NULL);CLSID clsid;m_hr = CLSIDFromProgID(L"Excel.Application", &clsid);if(SUCCEEDED(m_hr)){
m_hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&m_pEApp);if(FAILED(m_hr)) m_pEApp=NULL;}
{
m_hr=SetVisible(bVisible);}
return m_hr;}HRESULT CMSExcel::SetVisible(bool bVisible){/* DISPID dispID;VARIANT pvResult;LPOLESTR ptName=_T("Visible");m_hr = m_pWApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);if(SUCCEEDED(m_hr)){VARIANT x;x.vt = VT_I4;x.lVal =bVisible?1:0;DISPID prop=DISPATCH_PROPERTYPUT;DISPPARAMS dp = { NULL,NULL,0,0 };dp.cArgs =1;dp.rgvarg =&x;dp.cNamedArgs=1;dp.rgdispidNamedArgs= ∝m_hr = m_pWApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT,&dp, &pvResult, NULL, NULL);}*/if(!m_pEApp) return E_FAIL;VARIANT x;x.vt = VT_I4;x.lVal = bVisible;m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, m_pEApp, L"Visible", 1, x);return m_hr;}HRESULT CMSExcel::OpenExcelBook(LPCTSTR szFilename, bool bVisible){OutputDebugStringW(szFilename);
if(m_pEApp==NULL){
if(FAILED(m_hr=Initialize(bVisible)))return m_hr;}
{
VARIANT result;VariantInit(&result);
m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pEApp, L"Workbooks", 0);m_pBooks = result.pdispVal;}
{
COleVariant sFname(szFilename);VARIANT result;VariantInit(&result);
m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pBooks, L"Open", 1,sFname.Detach());m_pActiveBook = result.pdispVal;}
return m_hr;}HRESULT CMSExcel::SetExcelValue(LPCTSTR szRange,LPCTSTR szValue,bool bAutoFit, int nAlignment){if(!m_pEApp) return E_FAIL;if(!m_pActiveBook) return E_FAIL;IDispatch *pSheets;{
VARIANT result;VariantInit(&result);
m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveBook, L"Sheets", 0);pSheets = result.pdispVal;}
IDispatch *pSheet;{
VARIANT result;VariantInit(&result);
VARIANT itemn;itemn.vt = VT_I4;itemn.lVal = 1;m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, pSheets, L"Item", 1, itemn);pSheet = result.pdispVal;}
IDispatch* pRange;{
COleVariant oleRange(szRange);VARIANT result;VariantInit(&result);
m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, pSheet, L"Range", 1, oleRange.Detach());pRange = result.pdispVal;}
{
COleVariant oleValue(szValue);m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pRange, L"Value", 1, oleValue.Detach());}
if(bAutoFit){
IDispatch* pEntireColumn;{
VARIANT result;VariantInit(&result);
m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, pRange, L"EntireColumn",0);pEntireColumn= result.pdispVal;}
{
m_hr=OLEMethod(DISPATCH_METHOD, NULL, pEntireColumn, L"AutoFit", 0);}
pEntireColumn->Release();}
{
VARIANT x;x.vt = VT_I4;x.lVal = nAlignment;m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pRange, L"HorizontalAlignment", 1, x);}
pRange->Release();pSheet->Release();pSheets->Release();return m_hr;}HRESULT CMSExcel::Quit(){if(m_pEApp==NULL) return E_FAIL;DISPID dispID;LPOLESTR ptName=_T("Quit");m_hr = m_pEApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);if(SUCCEEDED(m_hr)){
DISPPARAMS dp = { NULL, NULL, 0, 0 };m_hr = m_pEApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,&dp, NULL, NULL, NULL);}
m_pEApp->Release();m_pEApp=NULL;return m_hr;}
Комментариев нет:
Отправить комментарий