понедельник, 10 ноября 2014 г.

Простой Класс для работы с Excell в QT.

Простой Класс для работы с Excell в QT.



Была задача использовать Excell в QT, Нашел в сети исходники и переписал под свои нужды, данный класс сохраняет значения в ячейки, без возможности чтения из них.

Для использования в QT при динамической сборке следует определить
#define _AFXDLL, при статической сборке закомментировать #define _AFXDLL.


Так-же в настройках .pro следует указать.




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 ANSI
 WideCharToMultiByte(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 DISPPARAMS
 dp.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;
}
    //Destructor
CMSExcel::~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= &prop;
  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;
}



Комментариев нет:

Отправить комментарий