MoreNotepad++

--------活出自己的精彩。

导航

通过Com操作Excel

// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//

#pragma once

// 下で指定された定義の前に対象プラットフォームを指定しなければならない場合、以下の定義を変更してください。
// 異なるプラットフォームに対応する値に関する最新情報については、MSDN を参照してください。
#ifndef WINVER                // Windows XP 以降のバージョンに固有の機能の使用を許可します。
#define WINVER 0x0501        // これを Windows の他のバージョン向けに適切な値に変更してください。
#endif

#ifndef _WIN32_WINNT        // Windows XP 以降のバージョンに固有の機能の使用を許可します。                   
#define _WIN32_WINNT 0x0501    // これを Windows の他のバージョン向けに適切な値に変更してください。
#endif                        

#ifndef _WIN32_WINDOWS        // Windows 98 以降のバージョンに固有の機能の使用を許可します。
#define _WIN32_WINDOWS 0x0410 // これを Windows Me またはそれ以降のバージョン向けに適切な値に変更してください。
#endif

#ifndef _WIN32_IE            // IE 6.0 以降のバージョンに固有の機能の使用を許可します。
#define _WIN32_IE 0x0600    // これを IE. の他のバージョン向けに適切な値に変更してください。
#endif

#define WIN32_LEAN_AND_MEAN        // Windows ヘッダーから使用されていない部分を除外します。
#include <stdio.h>
#include <tchar.h>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS    // 一部の CString コンストラクタは明示的です。

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN        // Windows ヘッダーから使用されていない部分を除外します。
#endif

#include <afx.h>
#include <afxwin.h>         // MFC のコアおよび標準コンポーネント
#include <afxext.h>         // MFC の拡張部分
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>        // MFC の Internet Explorer 4 コモン コントロール サポート
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>            // MFC の Windows コモン コントロール サポート
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <iostream>

#import "h:\\Program Files\\Common Files\\microsoft shared\\OFFICE11\\MSO.DLL" \
    rename("RGB","MsoRGB") \
    rename("SearchPath","MsoSearchPath")

#import "h:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"

#import "h:\\Program Files\\Microsoft Office\\Office11\\EXCEL.EXE" \
    rename( "DialogBox", "ExcelDialogBox" ) \
    rename( "RGB", "ExcelRGB" ) \
    rename( "CopyFile", "ExcelCopyFile" ) \
    rename( "ReplaceText", "ExcelReplaceText" ) \
    exclude( "IFont", "IPicture" ) no_dual_interfaces


// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
// TestCom.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "TestCom.h"

#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一のアプリケーション オブジェクトです。

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // MFC を初期化して、エラーの場合は結果を印刷します。
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: 必要に応じてエラー コードを変更してください。
        _tprintf(_T("致命的なエラー: MFC の初期化ができませんでした。\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO: アプリケーションの動作を記述するコードをここに挿入してください。

        try
        {
            if(!AfxOleInit())
            {
                AfxMessageBox(_T( "Cannot initialize COM dll" ));
                return 1;
            }

            ::CoInitialize(NULL);
            Excel::_ApplicationPtr pExcelApp;

            HRESULT hr = pExcelApp.CreateInstance("Excel.Application");
            ATLASSERT(SUCCEEDED(hr));
            pExcelApp->Visible = true;   // make Excel’s main window visible

            Excel::_WorkbookPtr pWorkbook = pExcelApp->Workbooks->Open(_bstr_t("C:\\test.xls"));  // open excel file
            Excel::_WorksheetPtr pWorksheet = pWorkbook->ActiveSheet;

            pWorksheet->Name = L"Chart Data";
            Excel::RangePtr pRange = pWorksheet->Cells;

            const int nplot = 100;
            const double xlow = 0.0, xhigh = 20.0;
            double h = (xhigh-xlow)/(double)nplot;
            pRange->Item[1][1] = L"x";  // read/write cell’s data
            pRange->Item[1][2] = L"f(x)";
            for (int i=0;i<nplot;++i)
            {
                double x = xlow+i*h;
                pRange->Item[i+2][1] = x;
                pRange->Item[i+2][2] = sin(x)*exp(-x);
            }

            Excel::RangePtr pBeginRange = pRange->Item[1][1];
            Excel::RangePtr pEndRange = pRange->Item[nplot+1][2];
            Excel::RangePtr pTotalRange = 
                pWorksheet->Range[(Excel::Range*)pBeginRange][(Excel::Range*)pEndRange];
            Excel::_ChartPtr pChart = pExcelApp->ActiveWorkbook->Charts->Add();
            // refer to :
            // http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.chart.chartwizard(v=vs.80).aspx
            pChart->ChartWizard(
                (Excel::Range*)pTotalRange,
                (long)Excel::xlXYScatter,
                6L,
                (long)Excel::xlColumns,
                1L,1L,
                true,
                L"My Graph",
                L"x",L"f(x)");
            pChart->Name = L"My Data Plot";

            pWorkbook->Close(VARIANT_TRUE);  // save changes
            pExcelApp->Quit();
        }
        catch (_com_error& error)
        {
            const TCHAR *msg = error.ErrorMessage();
            ATLASSERT(FALSE);
            ATLTRACE2(error.ErrorMessage());
        }

    }

    return nRetCode;
}

源代码来自:http://www.cnblogs.com/wdhust/archive/2011/04/20/2022963.html

posted on 2013-07-05 16:10  MoreNotepad++  阅读(228)  评论(0)    收藏  举报