⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exportexcelview.cpp

📁 vc输出到EXCEL.大家看看. 应用程序向导已为您创建了这个 exportexcel 应用程序。此应用程序不仅演示 Microsoft 基础类的基本使用方法
💻 CPP
字号:
// exportexcelView.cpp : CexportexcelView 类的实现
//

#include "stdafx.h"
#include "exportexcel.h"

#include "exportexcelDoc.h"
#include "exportexcelView.h"
#include <ole2.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CexportexcelView

IMPLEMENT_DYNCREATE(CexportexcelView, CView)

BEGIN_MESSAGE_MAP(CexportexcelView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

// CexportexcelView 构造/析构

CexportexcelView::CexportexcelView()
{
	// TODO: 在此处添加构造代码

}

CexportexcelView::~CexportexcelView()
{
}

BOOL CexportexcelView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return CView::PreCreateWindow(cs);
}

// CexportexcelView 绘制

void CexportexcelView::OnDraw(CDC* /*pDC*/)
{
	CexportexcelDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
}


// CexportexcelView 打印

BOOL CexportexcelView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CexportexcelView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加额外的打印前进行的初始化过程
}

void CexportexcelView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加打印后进行的清除过程
}


// CexportexcelView 诊断

#ifdef _DEBUG
void CexportexcelView::AssertValid() const
{
	CView::AssertValid();
}

void CexportexcelView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CexportexcelDoc* CexportexcelView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CexportexcelDoc)));
	return (CexportexcelDoc*)m_pDocument;
}
#endif //_DEBUG


// CexportexcelView 消息处理程序

void CexportexcelView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
// 初始化COM库
 CoInitialize(NULL);

 // 获得EXCEL的CLSID
 CLSID clsid;
 HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);

 if(FAILED(hr)) {
AfxMessageBox(_T("CLSIDFromProgID() 函数调用失败!"));
  return;
 }

 // 创建实例
 IDispatch *pXlApp;
 hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
 if(FAILED(hr)) {
  AfxMessageBox(_T("请检查是否已经安装EXCEL!"));
  return ;
 }
 
 // 显示,将Application.Visible属性置1
 VARIANT x;
 x.vt = VT_I4;
 x.lVal = 1;
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);

 // 获取Workbooks集合
 IDispatch *pXlBooks;
 {
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
 pXlBooks = result.pdispVal;
 }
 
 // 调用Workbooks.Add()方法,创建一个新的Workbook
 IDispatch *pXlBook;
 {
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
 pXlBook = result.pdispVal;
 }
 
 // 创建一个15x15的数组,用于填充表格
 VARIANT arr;
 WCHAR szTmp[32];
 arr.vt = VT_ARRAY | VT_VARIANT;
 SAFEARRAYBOUND sab[2];
 sab[0].lLbound = 1; sab[0].cElements = 15;
 sab[1].lLbound = 1; sab[1].cElements = 15;
 arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);

 // 初始化数组内容
 for(int i=1; i<=15; i++) {
  for(int j=1; j<=15; j++) {
   VARIANT tmp;
   tmp.vt = VT_BSTR;
   wsprintfW(szTmp,L"%i,%i",i,j);
   tmp.bstrVal = SysAllocString(szTmp);
   // 添加数据到数组中
   long indices[] = {i,j};
   SafeArrayPutElement(arr.parray, indices, (void *)&tmp);
  }
 }
 
 // 从Application.ActiveSheet属性获得Worksheet对象
 IDispatch *pXlSheet;
 {
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
 pXlSheet = result.pdispVal;
 }

 // 选择一个15x15大小的Range
 IDispatch *pXlRange;
 {
 VARIANT parm;
 parm.vt = VT_BSTR;
 parm.bstrVal = ::SysAllocString(L"A1:O15");

 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
 VariantClear(&parm);

 pXlRange = result.pdispVal;
 }

 AfxMessageBox(_T("我要填充数据了哈!"));

 // 用我们的数组填充这个Range
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
 pXlRange->Release();

 // 另外再选择一个Range
 {
 VARIANT parm;
 parm.vt = VT_BSTR;
 parm.bstrVal = ::SysAllocString(L"A11:O25");
  
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
 VariantClear(&parm);
  
 pXlRange = result.pdispVal;
 }
 
AfxMessageBox(_T( "我还要填充一次哈!"));

 // 用我们的数组再次填充这个Range
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);

AfxMessageBox(_T("好了,我们该保存文件了!"));

 // 接下来我们该保存文件了,利用Worksheet.SaveAs()方法(我这里忽略了其他所有参数,除了文件名)
 {
 VARIANT filename;
 filename.vt = VT_BSTR;
 filename.bstrVal = SysAllocString(L"c:\\test.xls");
 AutoWrap(DISPATCH_METHOD, NULL, pXlSheet, L"SaveAs", 1, filename);
 }

 AfxMessageBox(_T( "哈哈,收工了!"));

 // 退出,调用Application.Quit()方法
 AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
 
 // 释放所有的接口以及变量
 pXlRange->Release();
 pXlSheet->Release();
 pXlBook->Release();
 pXlBooks->Release();
 pXlApp->Release();
 VariantClear(&arr);
 
 // 注销COM库
 CoUninitialize();





    CView::OnLButtonDown(nFlags, point);
}
HRESULT  CexportexcelView::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
    // Begin variable-argument list...
    va_list marker;
    va_start(marker, cArgs);

    if(!pDisp) {
        AfxMessageBox(_T("NULL IDispatch passed to AutoWrap()"));
        _exit(0);
    }

    // Variables used...
    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    HRESULT hr;
    char buf[200];
    char szName[200];

    // Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

    // Get DISPID for name passed...
    hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
    if(FAILED(hr)) {
        sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr);
        AfxMessageBox(_T( "AutoWrap()"));
        _exit(0);
        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(autoType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }

    // Make the call!
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
    if(FAILED(hr)) {
        sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);
       AfxMessageBox(_T("AutoWrap()"));
        _exit(0);
        return hr;
    }
    // End variable-argument section...
    va_end(marker);

    delete [] pArgs;

    return hr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -