青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

VC中操作excel表格

http://blog.csdn.net/callmeback/archive/2009/02/18/3906310.aspx

 

操作系統是Microsoft XP,辦公套裝是Microsoft Office 2003,編程環境是Microsoft Visual Studio 6.0,一切都是Microsoft

 

我最近要將數據庫中的內容查詢出來放到excel表格以便打印,所以上網找了這方面的內容,這里主要是拋磚引玉。

 

從思路上來看,操作excel表格就是將其打開,然后寫入/讀出數據,然后關閉。

 

首先創建一個程序(我的例子是一個MFC的單文檔程序),在程序的入口處和出口處先作這樣兩個步驟來支持COM庫:

 

在程序入口處CXXXApp:: InitInstance()函數AfxEnableControlContainer();語句之后加入下面幾行:

 

if (CoInitialize(NULL) != 0)

 

{

 

       AfxMessageBox(“初始化COM支持庫失敗!);

 

       exit(1);

 

}

 

假如這個條件不通過就不能運行起程序。

 

在程序的出口處CXXXApp:: ExitInstance()函數return語句之前加入下面這句話:CoUninitialize();來釋放COM支持庫。

 

這樣對COM支持庫的代碼已經完成。

 

下面要從Office的安裝目錄中找到對VC操作excel文件的動態庫,在某些版本下這個文件是Excel8.olb或者Excel9.olb,在我的版本中是excel.exe這個exe也是動態庫的形式,是微軟公司主要的文件結果之一。選擇vcView菜單里面的ClassWizad命令,會彈出一個對話框;然后點擊Add Class…按鈕選擇From a type library,會彈出一個打開對話框,從這里打開Office安裝目錄下…\Office11\EXCEL.EXE文件,從里面選擇幾個要用到的類:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, Range,點擊OK按鈕。會在程序中生成一個excel.hexcel.cpp文件,這些文件中包含了剛才我們選擇的幾個類的代碼。下面介紹一下這幾個類:

 

vc操縱excelexe動態庫里面有好多個對象模型,就是剛才在創建過程中看到的那個列表,但是經常用到的有這么幾個:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, RangeCharts_Chart,最后面的兩個是用來操作圖表的,我沒有用到所以這里也就不記錄了。

 

_Application:這里的Application就是Excel本身,眾所周知,一個Excel可以包含多個工作簿,每個工作簿又可以包含多個工作表,而每個工作表又可以包含多個區域或者圖表,所以這里他們是樹型的結構關系,而application最基本的一個功能就是找到它的子項工作簿。果然,我們在引入我們程序的Application類中看到了這樣的成員函數:GetWorkbooks()。既然application就是excel,那么打開程序,退出程序,顯示/隱藏程序這些基本的操作都可以在這個類的成員函數中找到,果不其然。

 

Workbooks:這個對象是一個容器對象,它里面存放著所有打開的工作簿。因此,我們可以猜測它一定有添加,查找,打開/關閉工作簿的功能。(本程序中使用excel的一個xlt模板來生成一個xls文件就是使用了這個容器對象的添加功能。)

 

_Workbook:這是一個工作簿,也就相當于一個xls文件。Excel可以同時打開多個工作簿,所以工作簿之間必定能夠互相切換,每個工作簿可以關聯工作表容器并獲得工作表的索引。

 

Worksheets:也是一個容器對象,和Workbooks類似。

 

_Worksheet:這個就是我們看到的工作表,比如Sheet1,sheet2等等。

 

Rang:就是我們看到的能選中的方框的大小。而我們所要作的操作基本上是以區域為單位進行的。

 

 

 

介紹完這些,就添加一個菜單,來響應操作excel的命令。

 

然后下面附帶這個函數的內容,注釋還算可以吧,并且附上網上不知道誰寫的但是轉載極多的一個封裝類。

 

view plaincopy to clipboardprint?

_Application _app;  

_Workbook _workBook;  

_Worksheet _workSheet;  

Worksheets workSheets;  

Workbooks workBooks;  

Range range;  

Range copyFrom;  

Range copyTo;  

 

if(!_app.CreateDispatch("Excel.Application", NULL))  

{  

    MessageBox("創建Excel服務失敗!", "信息提示", MB_OK);  

    return;  

}  

//利用模板建立新文檔  

workBooks.AttachDispatch(_app.GetWorkbooks());  

_workBook.AttachDispatch(workBooks.Add(_variant_t("\"C:\\Documents and Settings\\模板.xlt\"")));//你可以自己創建一個模板,并自由設定目錄  

//得到worksheets  

workSheets.AttachDispatch(_workBook.GetWorksheets());  

//得到workSheet  

_workSheet.AttachDispatch(workSheets.GetItem(_variant_t("sheet1")));  

//得到拷貝的母板  

copyFrom.AttachDispatch(_workSheet.GetRange(_variant_t("A3"), _variant_t("Q6")));  

copyTo.AttachDispatch(_workSheet.GetRange(_variant_t("A61"), _variant_t("A61")));  

//得到全部的cells  

range.AttachDispatch(_workSheet.GetCells());  

 

///////////////////////////////////////////////////////////////////////////////////////////////////  

// 上邊是頭  

 

/* 

中間要做的工作有這兩項:設置數據和拷貝格式 

設置數據就是將數據庫中查詢出來的數據寫入表格,拷貝格式就是將表格拷貝到別的地方。 

*/ 

//寫入數據  

range.SetItem(_variant_t((long)3), _variant_t((long)1), _variant_t("寫入數據了"));  

range.SetItem(_variant_t((long)5), _variant_t((long)1), _variant_t("重新寫入數據了"));  

//拷貝一段區域到另外的一段區域  

copyFrom.Copy(_variant_t(copyTo));  

range.SetItem(_variant_t((long)61), _variant_t((long)1), _variant_t("123"));  

 

//顯示excel表格  

    _app.SetVisible(TRUE);  

//保存為文件  

_app.SetDisplayAlerts(FALSE);   //隱藏彈出的對話框  

_workSheet.SaveAs("d:\\Test.xls",vtMissing,vtMissing,vtMissing,vtMissing,  

    vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);  

_app.Quit();  

//下邊是尾  

///////////////////////////////////////////////////////////////////////////////////////////////////  

copyFrom.ReleaseDispatch();  

copyTo.ReleaseDispatch();  

range.ReleaseDispatch();  

_workSheet.ReleaseDispatch();  

workSheets.ReleaseDispatch();  

_workBook.ReleaseDispatch();  

workSheets.ReleaseDispatch();  

_app.ReleaseDispatch(); 

    _Application _app;

    _Workbook _workBook;

    _Worksheet _workSheet;

    Worksheets workSheets;

    Workbooks workBooks;

    Range range;

    Range copyFrom;

    Range copyTo;

   

    if(!_app.CreateDispatch("Excel.Application", NULL))

    {

       MessageBox("創建Excel服務失??!", "信息提示", MB_OK);

       return;

    }

    //利用模板建立新文檔

    workBooks.AttachDispatch(_app.GetWorkbooks());

    _workBook.AttachDispatch(workBooks.Add(_variant_t("\"C:\\Documents and Settings\\模板.xlt\"")));//你可以自己創建一個模板,并自由設定目錄

    //得到worksheets

    workSheets.AttachDispatch(_workBook.GetWorksheets());

    //得到workSheet

    _workSheet.AttachDispatch(workSheets.GetItem(_variant_t("sheet1")));

    //得到拷貝的母板

    copyFrom.AttachDispatch(_workSheet.GetRange(_variant_t("A3"), _variant_t("Q6")));

    copyTo.AttachDispatch(_workSheet.GetRange(_variant_t("A61"), _variant_t("A61")));

    //得到全部的cells

    range.AttachDispatch(_workSheet.GetCells());

   

    ///////////////////////////////////////////////////////////////////////////////////////////////////

    // 上邊是頭

   

    /*

    中間要做的工作有這兩項:設置數據和拷貝格式

    設置數據就是將數據庫中查詢出來的數據寫入表格,拷貝格式就是將表格拷貝到別的地方。

    */

    //寫入數據

    range.SetItem(_variant_t((long)3), _variant_t((long)1), _variant_t("寫入數據了"));

    range.SetItem(_variant_t((long)5), _variant_t((long)1), _variant_t("重新寫入數據了"));

    //拷貝一段區域到另外的一段區域

    copyFrom.Copy(_variant_t(copyTo));

    range.SetItem(_variant_t((long)61), _variant_t((long)1), _variant_t("123"));

   

    //顯示excel表格

       _app.SetVisible(TRUE);

    //保存為文件

    _app.SetDisplayAlerts(FALSE);   //隱藏彈出的對話框

    _workSheet.SaveAs("d:\\Test.xls",vtMissing,vtMissing,vtMissing,vtMissing,

       vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);

    _app.Quit();

    //下邊是尾

    ///////////////////////////////////////////////////////////////////////////////////////////////////

    copyFrom.ReleaseDispatch();

    copyTo.ReleaseDispatch();

    range.ReleaseDispatch();

    _workSheet.ReleaseDispatch();

    workSheets.ReleaseDispatch();

    _workBook.ReleaseDispatch();

    workSheets.ReleaseDispatch();

    _app.ReleaseDispatch();

 

 

 

別人的代碼:

 

 

view plaincopy to clipboardprint?

.h文件: 

#include "comdef.h"  

#include "excel.h"  

class ExcelFile   

{  

public:  

void ShowInExcel(bool bShow);  

CString GetCell(int iRow, int iColumn);  

int     GetCellInt(int iRow, int iColumn);  

int GetRowCount();  

int GetColumnCount();  

bool LoadSheet(int iIndex);  

CString GetSheetName(int iIndex);  

static void InitExcel();  

static void ReleaseExcel();  

int GetSheetCount();  

bool Open(CString FileName);  

ExcelFile();  

virtual ~ExcelFile();  

protected:  

private:  

static _Application m_ExcelApp;  

 

Workbooks    m_Books;   

_Workbook    m_Book;   

Worksheets   m_sheets;   

_Worksheet   m_sheet;   

Range        m_Rge;   

};  

.cpp文件:  

ExcelFile::ExcelFile()  

{  

}  

ExcelFile::~ExcelFile()  

{  

m_Rge.ReleaseDispatch();   

m_sheet.ReleaseDispatch();   

m_sheets.ReleaseDispatch();   

m_Book.ReleaseDispatch();   

m_Books.ReleaseDispatch();   

}  

void ExcelFile::InitExcel()  

{  

//創建Excel 2000服務器(啟動Excel)   

if (!m_ExcelApp.CreateDispatch("Excel.Application",NULL))   

{   

AfxMessageBox("創建Excel服務失敗!");   

exit(1);   

}   

}  

void ExcelFile::ReleaseExcel()  

{  

m_ExcelApp.ReleaseDispatch();  

}  

bool ExcelFile::Open(CString FileName)  

{  

//打開excel文件  

//利用模板文件建立新文檔   

m_Books.AttachDispatch(m_ExcelApp.GetWorkbooks(),true);   

LPDISPATCH lpDis = NULL;  

lpDis = m_Books.Add(_variant_t(FileName)); // 如何判斷文件是否打開?  

if (lpDis)  

{  

m_Book.AttachDispatch(lpDis);   

//得到Worksheets   

m_sheets.AttachDispatch(m_Book.GetWorksheets(),true);   

return true;  

}  

return false;  

}  

int ExcelFile::GetSheetCount()  

{  

return m_sheets.GetCount();  

}  

CString ExcelFile::GetSheetName(int iIndex)  

{  

_Worksheet sheet;  

sheet.AttachDispatch(m_sheets.GetItem(_variant_t((long)iIndex)),true);  

CString name = sheet.GetName();  

sheet.ReleaseDispatch();  

return name;  

}  

bool ExcelFile::LoadSheet(int iIndex)  

{  

LPDISPATCH lpDis = NULL;  

m_Rge.ReleaseDispatch();  

m_sheet.ReleaseDispatch();  

lpDis = m_sheets.GetItem(_variant_t((long)iIndex));  

if (lpDis)  

{  

        m_sheet.AttachDispatch(lpDis,true);  

        m_Rge.AttachDispatch(m_sheet.GetCells(), true);  

        return true;  

}  

return false;  

}  

int ExcelFile::GetColumnCount()  

{  

Range range;  

Range usedRange;  

usedRange.AttachDispatch(m_sheet.GetUsedRange(), true);  

range.AttachDispatch(usedRange.GetColumns(), true);  

int count = range.GetCount();  

usedRange.ReleaseDispatch();  

range.ReleaseDispatch();  

return count;  

}  

int ExcelFile::GetRowCount()  

{  

Range range;  

Range usedRange;  

usedRange.AttachDispatch(m_sheet.GetUsedRange(), true);  

range.AttachDispatch(usedRange.GetRows(), true);  

int count = range.GetCount();  

usedRange.ReleaseDispatch();  

range.ReleaseDispatch();  

return count;  

}  

CString ExcelFile::GetCell(int iRow, int iColumn)  

{  

Range range;  

range.AttachDispatch(m_Rge.GetItem (COleVariant((long)iRow),COleVariant((long)iColumn)).pdispVal, true);  

    COleVariant vResult =range.GetValue2();  

CString str;  

if(vResult.vt == VT_BSTR)       //字符串  

{  

str=vResult.bstrVal;  

}  

else if (vResult.vt==VT_INT)  

{  

        str.Format("%d",vResult.pintVal);  

}  

else if (vResult.vt==VT_R8)     //8字節的數字   

{  

str.Format("%f",vResult.dblVal);  

//str.Format("%.0f",vResult.dblVal);  

//str.Format("%1f",vResult.fltVal);  

}  

else if(vResult.vt==VT_DATE)    //時間格式  

{  

SYSTEMTIME st;  

VariantTimeToSystemTime(vResult.date, &st);  

}  

else if(vResult.vt==VT_EMPTY)   //單元格空的  

{  

    str="(NULL)";  

}   

range.ReleaseDispatch();  

return str;  

}  

int ExcelFile::GetCellInt(int iRow, int iColumn)  

{  

Range range;  

range.AttachDispatch(m_Rge.GetItem(COleVariant((long)iRow),COleVariant((long)iColumn)).pdispVal, true);  

COleVariant vResult =range.GetValue2();  

int num;  

num = (int)vResult.date;  

range.ReleaseDispatch();  

return num;  

}  

void ExcelFile::ShowInExcel(bool bShow)  

{  

m_ExcelApp.SetVisible(bShow);  

} 

 

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/callmeback/archive/2009/02/18/3906310.aspx

posted on 2011-02-28 15:06 肥仔 閱讀(3840) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲片区在线| 亚洲国产美女久久久久| 这里只有精品视频| 欧美成人三级在线| 久久精品最新地址| 午夜精彩国产免费不卡不顿大片| 91久久黄色| 亚洲高清av| 亚洲成人在线网| 麻豆av一区二区三区久久| 亚洲欧美日韩精品综合在线观看| 亚洲美女av黄| 亚洲精品一区在线观看| 亚洲大胆人体视频| 欧美福利在线| 欧美福利视频网站| 欧美大片va欧美在线播放| 亚洲视频免费在线观看| 一区二区三区 在线观看视频| 一本色道久久综合亚洲精品小说| 一本色道久久综合亚洲精品高清 | 午夜精品久久久久久久久久久久| 久久精品国产亚洲5555| 亚洲成色www8888| 亚洲影院在线| 欧美第一黄网免费网站| 国产欧美精品日韩| 日韩系列在线| 久久综合成人精品亚洲另类欧美| 99精品视频免费观看| 久久久久久色| 国产毛片精品国产一区二区三区| 亚洲另类在线一区| 久久久久se| 亚洲小说春色综合另类电影| 欧美粗暴jizz性欧美20| 国内久久婷婷综合| 亚洲欧美日韩专区| 亚洲精品美女久久久久| 久久五月激情| 红桃视频亚洲| 久久国产乱子精品免费女| 一区二区av| 欧美大色视频| 亚洲国内自拍| 免费在线看成人av| 香蕉成人伊视频在线观看 | 国产欧美精品在线观看| 国产一区二区三区免费在线观看| 亚洲精品久久嫩草网站秘色| 久久久亚洲一区| 亚洲一区二区三区精品在线 | 欧美一区二区三区在线观看| 欧美日韩色综合| 亚洲国产精彩中文乱码av在线播放| 久久不射2019中文字幕| 亚洲尤物在线视频观看| 国产精品久久91| 亚洲欧美电影院| 一区二区三区毛片| 欧美视频你懂的| 亚洲在线一区二区三区| 亚洲一级在线观看| 国产精品日韩久久久| 亚洲欧美精品在线| 亚洲午夜久久久久久久久电影网| 国产精品av免费在线观看 | 亚洲欧美卡通另类91av| 亚洲五月六月| 国产中文一区| 免费观看成人| 欧美国产一区二区三区激情无套| 亚洲激情一区| 日韩一级大片在线| 国产精品久久久免费| 欧美一区日韩一区| 久久久久久九九九九| 亚洲国产精品久久久久| 亚洲欧洲精品一区二区三区| 欧美视频官网| 久久色中文字幕| 欧美成黄导航| 亚洲在线不卡| 久久成人免费| 亚洲美女精品成人在线视频| 99在线热播精品免费99热| 国产精品视频免费观看www| 久久久久久久精| 欧美高清在线视频观看不卡| 亚洲午夜视频| 久久精品99久久香蕉国产色戒| 激情综合中文娱乐网| 欧美激情按摩在线| 国产精品久久影院| 欧美91精品| 国产精品国产| 免费视频一区二区三区在线观看| 欧美黑人多人双交| 久久se精品一区精品二区| 欧美sm重口味系列视频在线观看| 亚洲欧美日韩国产一区二区| 久久人人爽国产| 亚洲影音一区| 美女脱光内衣内裤视频久久网站| 欧美日韩免费观看一区三区| 国产一区二区三区高清 | 久久综合九色欧美综合狠狠| 欧美刺激性大交免费视频| 欧美有码视频| 欧美日韩情趣电影| 欧美1区免费| 国产一区二区三区在线观看免费| 亚洲韩国精品一区| 一区二区三区在线视频免费观看| 中文精品视频一区二区在线观看| 91久久久亚洲精品| 欧美中文字幕视频| 亚洲欧美不卡| 欧美三区不卡| 亚洲美女中文字幕| 日韩视频精品| 毛片一区二区三区| 久久这里只精品最新地址| 国产美女精品一区二区三区| 一区二区三区你懂的| 日韩视频在线观看一区二区| 美日韩精品免费| 亚洲第一在线视频| 亚洲国产精品尤物yw在线观看| 久久国产精品99久久久久久老狼| 久久av一区二区三区| 国产欧美不卡| 欧美一区在线视频| 久久久亚洲高清| 激情欧美一区二区| 久久久视频精品| 免费在线国产精品| 亚洲国产天堂久久综合| 久久在线免费| 亚洲国产欧美另类丝袜| 99国产精品久久| 欧美三级午夜理伦三级中视频| 亚洲麻豆av| 亚洲宅男天堂在线观看无病毒| 欧美视频在线观看视频极品| 一区二区三区精品国产| 欧美一区二区在线免费观看| 国产日韩高清一区二区三区在线| 欧美在线999| 老司机aⅴ在线精品导航| 亚洲国产91色在线| 欧美激情精品久久久久久大尺度 | 国内精品视频666| 久久夜色精品亚洲噜噜国产mv| 欧美成人一区二区三区| 亚洲巨乳在线| 国产精品久久久久久久浪潮网站| 亚洲欧美视频| 欧美不卡视频一区发布| 日韩一二三在线视频播| 国产精品网曝门| 久久99伊人| 亚洲三级电影在线观看| 欧美夜福利tv在线| 亚洲第一中文字幕| 国产精品啊啊啊| 久久人人看视频| 一区二区三区导航| 久久中文字幕一区| 一区二区三区日韩欧美| 99re66热这里只有精品4| 亚洲午夜激情网站| 国产一区在线播放| 鲁大师影院一区二区三区| 亚洲免费成人av| 久久亚洲精品伦理| 亚洲小视频在线观看| 国内精品美女在线观看| 欧美日韩在线视频首页| 欧美在线亚洲| 一区二区精品在线| 蜜桃av久久久亚洲精品| 亚洲欧美美女| 亚洲三级免费| 精品av久久707| 国产精品久久久久aaaa九色| 免费成人高清视频| 性色av一区二区三区在线观看| 亚洲电影第三页| 欧美在线免费| 亚洲伊人网站| 亚洲精品在线免费| 国产一区二区三区成人欧美日韩在线观看| 欧美高清日韩| 久久综合色播五月| 久久激情一区| 欧美亚洲系列| 午夜精品久久久久久久| 一区二区三区国产盗摄| 亚洲精品无人区|