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

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| 亚洲欧洲一区二区三区久久| 亚洲国产成人高清精品| 亚洲国产成人精品视频| 日韩图片一区| 午夜精品久久久久久久白皮肤 | 国产精品美女www爽爽爽| 国产精品亚洲综合一区在线观看 | 欧美日韩视频不卡| 欧美午夜精品久久久久久孕妇 | 欧美中文字幕视频| 久久精品国产综合| 免费一级欧美片在线观看| 亚洲成在人线av| 亚洲福利免费| 亚洲欧美成人综合| 久久久久久久综合| 欧美日韩国产精品专区| 国产一区二区三区久久精品| 在线免费高清一区二区三区| 亚洲日产国产精品| 亚洲综合第一页| 榴莲视频成人在线观看| 亚洲精品一二三| 欧美一区二区大片| 欧美精品在线视频观看| 久久爱www久久做| 久久久国产亚洲精品| 欧美日韩成人在线观看| 国产亚洲成年网址在线观看| 亚洲伦理精品| 欧美一级网站| 亚洲精品视频免费观看| 欧美诱惑福利视频| 欧美日韩国产专区| 狠狠色狠狠色综合日日91app| 99国产麻豆精品| 久久一二三区| 亚洲欧美视频在线| 欧美色视频日本高清在线观看| 黄色国产精品一区二区三区| 亚洲影院在线观看| 亚洲动漫精品| 乱中年女人伦av一区二区| 国产视频一区免费看| 一区二区三区久久精品| 欧美福利视频| 久久人人超碰| 国产在线国偷精品产拍免费yy| 亚洲桃色在线一区| 亚洲国产一区二区精品专区| 久久久久国内| 国产一区二区三区在线播放免费观看| 亚洲夜间福利| 一区二区三区三区在线| 欧美片网站免费| 亚洲精品裸体| 欧美激情精品久久久久久蜜臀| 午夜精品久久久久久久蜜桃app| 欧美日韩不卡一区| av成人激情| 亚洲欧洲一区二区三区久久| 欧美+亚洲+精品+三区| 亚洲韩日在线| 欧美激情偷拍| 欧美精品粉嫩高潮一区二区 | 国产精品中文字幕在线观看| 亚洲天堂av综合网| 一本色道久久综合狠狠躁篇的优点| 欧美wwwwww| 一区二区三区四区国产| 亚洲精选视频免费看| 欧美日韩中文在线| 欧美一区二区三区在线免费观看| 亚洲欧美在线免费观看| 国产在线精品自拍| 蜜桃久久av一区| 欧美高清免费| 在线视频你懂得一区| 在线性视频日韩欧美| 久久国产精品久久精品国产| 久久黄色级2电影| 国产欧美 在线欧美| 亚洲欧美日韩国产成人精品影院 | 久久九九国产精品| 久久国产精品黑丝| 亚洲人成人一区二区三区| 亚洲免费观看高清在线观看| 国产精品区二区三区日本| 久久乐国产精品| 欧美ab在线视频| 亚洲午夜成aⅴ人片| 久久精品亚洲| 国产精品99久久不卡二区| 亚洲午夜性刺激影院| 伊人夜夜躁av伊人久久| 日韩午夜在线观看视频| 国产日韩欧美日韩| 亚洲高清免费视频| 欧美日韩国产一区| 亚洲午夜羞羞片| 毛片一区二区三区| 欧美一区二区三区在线| 麻豆亚洲精品| 欧美在线国产精品| 看片网站欧美日韩| 久久国产主播精品| 欧美精品一区二区三区高清aⅴ| 亚洲欧美国内爽妇网| 免费在线亚洲| 久久九九99| 欧美日韩精品免费| 欧美1区2区| 黄色精品免费| 亚洲深爱激情| 9久re热视频在线精品| 久久免费高清| 欧美资源在线| 欧美日韩一区二区三区四区五区 | 欧美激情精品久久久久久黑人| 国产精品久久久久久久久借妻 | 日韩亚洲欧美精品| 狠狠综合久久av一区二区老牛| 99国产精品国产精品毛片| 亚洲国产99精品国自产| 亚欧成人在线| 亚洲免费在线观看视频| 免费永久网站黄欧美| 美女黄网久久| 好吊色欧美一区二区三区视频| 午夜精品久久久久久久| 亚洲欧美日韩精品久久亚洲区| 欧美日韩国产精品成人| 亚洲国产日韩一级| 亚洲激情欧美| 美女精品在线观看| 免费成人av在线| 在线免费观看视频一区| 亚洲人永久免费| 久热这里只精品99re8久| 久久综合九色| 黄色成人av在线| 久久久久国产精品一区| 久久久久久综合网天天| 国产精品私人影院| 在线一区日本视频| 亚洲一区二区三区精品在线| 欧美视频在线视频| 在线亚洲欧美专区二区| 亚洲欧美国产77777| 国产欧美一区二区精品性 | 日韩视频中文| 欧美日韩一区二区三区在线看| 亚洲免费av片| 欧美一区二区三区播放老司机| 国产精品日日摸夜夜摸av| 中文精品视频| 久久久国产精彩视频美女艺术照福利| 国产有码在线一区二区视频| 欧美在线视频a| 欧美aⅴ99久久黑人专区| 日韩一级黄色片| 国产精品亚洲片夜色在线| 久久av在线| 亚洲国产一区二区精品专区| 亚洲欧美美女| 亚洲国产高清一区二区三区| 欧美精品一区二区三区在线播放| 一区二区三区精品| 久久亚洲一区二区三区四区| 亚洲精品中文字| 国产精品视频最多的网站| 久久久久综合| 亚洲蜜桃精久久久久久久| 久久精品夜色噜噜亚洲aⅴ| 亚洲人成精品久久久久| 国产精品私房写真福利视频| 理论片一区二区在线| 一区二区精品在线| 噜噜噜噜噜久久久久久91| 亚洲精品影视| 国产亚洲美州欧州综合国| 欧美激情91| 欧美一区二区免费观在线| 日韩网站在线| 欧美激情按摩在线| 久久久免费精品| 亚洲一区二区三区午夜| 亚洲国产三级网| 国产情侣久久| 国产精品wwwwww| 欧美视频你懂的| 欧美精品在线播放| 久久综合久久久| 久久久噜噜噜久久人人看| 欧美一区二区成人6969|