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

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:這個就是我們看到的工作表,比如Sheet1sheet2等等。

 

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 肥仔 閱讀(3845) 評論(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>
            久久精品国产精品亚洲| 在线视频亚洲欧美| 久久视频一区二区| 蜜臀99久久精品久久久久久软件| 欧美v国产在线一区二区三区| 美女网站在线免费欧美精品| 一区二区欧美在线| 久热精品视频在线观看一区| 午夜精品一区二区三区四区| 久久久久久久久久久成人| 亚洲视频第一页| 亚洲国产成人精品久久久国产成人一区| 亚洲免费视频在线观看| 久久综合久久综合这里只有精品| 狂野欧美激情性xxxx| 亚洲视频每日更新| 亚洲性感美女99在线| 亚洲色图自拍| 一区二区三区四区五区在线| 亚洲欧洲另类国产综合| 欧美二区不卡| 欧美成人亚洲成人| 欧美jizzhd精品欧美喷水| 免费久久99精品国产| 中文欧美日韩| 亚洲综合电影一区二区三区| 亚洲午夜精品国产| 一本色道久久88综合亚洲精品ⅰ | 亚洲国产日韩在线一区模特| 国内欧美视频一区二区| 国产日韩欧美成人| 中国亚洲黄色| 亚洲风情在线资源站| 亚洲国产精品免费| 久久精品九九| 欧美成人一区二区三区| 国内精品嫩模av私拍在线观看| 极品尤物久久久av免费看| 亚洲激情视频在线播放| 亚洲免费av片| 欧美一区亚洲一区| 亚洲视频电影在线| 久久午夜电影| 国产精品系列在线| 亚洲一级二级| 亚洲美女性视频| 99爱精品视频| 欧美日韩免费高清一区色橹橹| 亚洲免费观看高清完整版在线观看熊| 欧美国产成人在线| 欧美福利小视频| 99伊人成综合| 久久精品动漫| 欧美黑人一区二区三区| 久久久久九九九| 欧美高清视频www夜色资源网| 欧美日韩色婷婷| 亚洲亚洲精品在线观看| 亚洲中字黄色| 国产精品一区一区| 亚洲国产精品福利| 国产亚洲精品久| 亚洲人精品午夜| 欧美成人一区二区三区片免费 | 一区二区三区日韩欧美精品| 狠狠狠色丁香婷婷综合激情| 先锋亚洲精品| 亚洲欧美成人一区二区三区| 亚洲电影毛片| 久久精品亚洲一区二区| 亚洲在线观看视频网站| 欧美国产日韩一二三区| 久久久久久亚洲精品杨幂换脸| 国产精品成人av性教育| 亚洲桃色在线一区| 久久婷婷国产麻豆91天堂| 欧美一区二区三区在线看| 亚洲淫性视频| 国产精品免费在线| 欧美一级久久久久久久大片| 欧美激情一区二区三区全黄| 亚洲精品美女91| 亚洲精品一线二线三线无人区| 美女国产一区| 久久久久国产精品一区二区| 国产精品亚洲аv天堂网| 午夜精品一区二区三区电影天堂 | 亚洲免费播放| 亚洲国产毛片完整版 | 欧美精品大片| 亚洲毛片播放| 亚洲乱码国产乱码精品精| 国产真实久久| 欧美一区二区大片| 久久久久国色av免费观看性色| 欧美在线观看一区二区| 亚洲欧美电影在线观看| 亚洲欧美日韩一区二区在线| 亚洲毛片在线观看.| 欧美成人精品激情在线观看| 亚洲精品日韩综合观看成人91| 久久久久久国产精品mv| 一区二区三区四区五区精品| 一本色道综合亚洲| 在线一区二区三区做爰视频网站| 欧美好骚综合网| 99精品热视频只有精品10| 国产精品亚洲综合天堂夜夜| 在线亚洲免费| 销魂美女一区二区三区视频在线| 久久久久久成人| 蜜桃av综合| 亚洲黑丝在线| 欧美日韩色一区| 欧美电影美腿模特1979在线看 | 久久久激情视频| 欧美a级片网| 亚洲欧洲精品一区二区三区| 亚洲伊人久久综合| 国产欧美日韩综合| 久久久噜噜噜久噜久久| 亚洲国产婷婷| 国产精品一区久久久| 亚洲专区免费| 欧美激情性爽国产精品17p| 国产精品免费看久久久香蕉| 午夜精品免费视频| 欧美刺激性大交免费视频 | 欧美激情二区三区| 国产伦精品一区二区三区四区免费 | 亚洲欧美精品在线观看| 黄色日韩在线| 一区二区三区四区国产精品| 一区二区成人精品| 国产三级精品三级| 欧美国产精品劲爆| 亚洲三级影片| 狠狠爱综合网| 亚洲欧美电影院| 欧美日韩高清在线播放| 中日韩男男gay无套| 久久综合色影院| 国产一二精品视频| 欧美精品 国产精品| 欧美一区日本一区韩国一区| 亚洲欧洲视频在线| 国产精品地址| 亚洲精品一级| 久久久蜜桃精品| 亚洲一区二区网站| 最新热久久免费视频| 国产一区二区三区四区老人| 亚洲女女女同性video| 欧美成人午夜视频| 久久欧美肥婆一二区| 亚洲影音一区| 国产精品你懂的| 欧美成人激情视频| 久久精品国产96久久久香蕉| 制服丝袜亚洲播放| 欧美一区久久| 99国内精品| 亚洲激情社区| 欧美日本一区二区高清播放视频| 久久av红桃一区二区小说| 亚洲午夜在线| 99精品久久久| 欧美在线免费看| 亚洲精品中文字幕在线观看| 亚洲第一中文字幕| 国产综合自拍| 狠狠久久五月精品中文字幕| 国产欧美亚洲精品| 欧美中文字幕第一页| 久久久99爱| 在线观看亚洲视频| 久久久九九九九| 亚洲电影成人| 欧美.www| 亚洲视频综合在线| 国产亚洲第一区| 久久精品一区二区国产| 欧美不卡高清| 欧美va亚洲va国产综合| 蜜桃av噜噜一区| 亚洲少妇自拍| 国产在线观看91精品一区| 国产精品视频免费在线观看| 国产精品激情| 久久久久久成人| 美国成人毛片| 欧美日韩成人综合| 国产精品成av人在线视午夜片 | 午夜精品久久久久久久99黑人| 午夜视频一区| 精品成人在线视频| 欧美视频免费在线| 国产精品a久久久久| 国产日韩欧美综合| 在线电影国产精品|