COM, ATL

엑셀 오토메이션

디버그정 2008. 9. 3. 16:50

Visual Basic에서 엑셀 파일 등을 이용하는 것은 쉽다고 알려져 있으나

Visual C++에서는 어떻게 사용해야 될지 몰라서 검색을 해보니 몇가지 방법이 있었다.


1. Automation을 이용하는 방법이 있으며


http://support.microsoft.com/default.aspx?scid=kb;EN-US;186122


에서 기본 정보를 찾을 수 있다.


2. 좀 더 편한 방법을 찾다 보니 CSpreadSheet 클래스를 이용하는 방법이 있었다.


http://www.codeproject.com/KB/database/cspreadsheet.aspx

http://www.codeguru.com/cpp/data/mfc_database/microsoftexcel/article.php/c4307/


둘다 내용은 같은거 같고 codeguru가 로그인 안하고 파일 다운로드 할 수 있으니

쉽게 이용할 수 있을 것 같다.

첫번째 msdn 샘플...

  // OLE Variant for Optional.
      COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

      _Application objApp;
      _Workbook objBook;
      Workbooks objBooks;
      Worksheets objSheets;
      _Worksheet objSheet;
      Range objRange;
      VARIANT ret;

      // Instantiate Excel and open an existing workbook.
      objApp.CreateDispatch("Excel.Application");
      objBooks = objApp.GetWorkbooks();
      objBook = objBooks.Open("C:\\Test.xls",
                VOptional, VOptional, VOptional, VOptional,
                VOptional, VOptional, VOptional, VOptional,
                VOptional, VOptional, VOptional, VOptional);
      objSheets = objBook.GetWorksheets();
      objSheet = objSheets.GetItem(COleVariant((short)1));

      //Get the range object for which you wish to retrieve the
      //data and then retrieve the data (as a variant array, ret).
      objRange = objSheet.GetRange(COleVariant("A1"), COleVariant("C8"));
      ret = objRange.GetValue();

      //Create the SAFEARRAY from the VARIANT ret.
      COleSafeArray sa(ret);

      //Determine the array's dimensions.
      long lNumRows;
      long lNumCols;
      sa.GetUBound(1, &lNumRows);
      sa.GetUBound(2, &lNumCols);

      //Display the elements in the SAFEARRAY.
      long index[2];
      VARIANT val;
      int r, c;
      TRACE("Contents of SafeArray\n");
      TRACE("=====================\n\t");
      for(c=1;c<=lNumCols;c++)
      {
         TRACE("\t\tCol %d", c);
      }
      TRACE("\n");
      for(r=1;r<=lNumRows;r++)
      {
         TRACE("Row %d", r);
         for(c=1;c<=lNumCols;c++)
         {
            index[0]=r;
            index[1]=c;
            sa.GetElement(index, &val);
            switch(val.vt)
            {
            case VT_R8:
               {
                  TRACE("\t\t%1.2f", val.dblVal);
                  break;
               }
            case VT_BSTR:
               {
                  TRACE("\t\t%s",(CString)val.bstrVal);
                  break;
               }

            case VT_EMPTY:
               {
                  TRACE("\t\t<empty>");
                  break;
               }
            }
         }
         TRACE("\n");
      }

      //Close the workbook without saving changes
      //and quit Microsoft Excel.
      objBook.Close(COleVariant((short)FALSE), VOptional, VOptional);
      objApp.Quit();