• <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>

            woaidongmao

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

            VC中操作excel表格

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

             

            操作系統(tǒng)是Microsoft XP,辦公套裝是Microsoft Office 2003,編程環(huán)境是Microsoft Visual Studio 6.0,一切都是Microsoft

             

            我最近要將數(shù)據(jù)庫中的內(nèi)容查詢出來放到excel表格以便打印,所以上網(wǎng)找了這方面的內(nèi)容,這里主要是拋磚引玉。

             

            從思路上來看,操作excel表格就是將其打開,然后寫入/讀出數(shù)據(jù),然后關(guān)閉。

             

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

             

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

             

            if (CoInitialize(NULL) != 0)

             

            {

             

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

             

                   exit(1);

             

            }

             

            假如這個(gè)條件不通過就不能運(yùn)行起程序。

             

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

             

            這樣對COM支持庫的代碼已經(jīng)完成。

             

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

             

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

             

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

             

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

             

            _Workbook:這是一個(gè)工作簿,也就相當(dāng)于一個(gè)xls文件。Excel可以同時(shí)打開多個(gè)工作簿,所以工作簿之間必定能夠互相切換,每個(gè)工作簿可以關(guān)聯(lián)工作表容器并獲得工作表的索引。

             

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

             

            _Worksheet:這個(gè)就是我們看到的工作表,比如Sheet1sheet2等等。

             

            Rang:就是我們看到的能選中的方框的大小。而我們所要作的操作基本上是以區(qū)域?yàn)閱挝贿M(jìn)行的。

             

             

             

            介紹完這些,就添加一個(gè)菜單,來響應(yīng)操作excel的命令。

             

            然后下面附帶這個(gè)函數(shù)的內(nèi)容,注釋還算可以吧,并且附上網(wǎng)上不知道誰寫的但是轉(zhuǎn)載極多的一個(gè)封裝類。

             

            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("創(chuàng)建Excel服務(wù)失敗!", "信息提示", MB_OK);  

                return;  

            }  

            //利用模板建立新文檔  

            workBooks.AttachDispatch(_app.GetWorkbooks());  

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

            //得到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());  

             

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

            // 上邊是頭  

             

            /* 

            中間要做的工作有這兩項(xiàng):設(shè)置數(shù)據(jù)和拷貝格式 

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

            */ 

            //寫入數(shù)據(jù)  

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

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

            //拷貝一段區(qū)域到另外的一段區(qū)域  

            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("創(chuàng)建Excel服務(wù)失敗!", "信息提示", MB_OK);

                   return;

                }

                //利用模板建立新文檔

                workBooks.AttachDispatch(_app.GetWorkbooks());

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

                //得到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());

               

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

                // 上邊是頭

               

                /*

                中間要做的工作有這兩項(xiàng):設(shè)置數(shù)據(jù)和拷貝格式

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

                */

                //寫入數(shù)據(jù)

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

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

                //拷貝一段區(qū)域到另外的一段區(qū)域

                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()  

            {  

            //創(chuàng)建Excel 2000服務(wù)器(啟動Excel)   

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

            {   

            AfxMessageBox("創(chuàng)建Excel服務(wù)失敗!");   

            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字節(jié)的數(shù)字   

            {  

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

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

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

            }  

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

            {  

            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博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/callmeback/archive/2009/02/18/3906310.aspx

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

            久久久久香蕉视频| 无遮挡粉嫩小泬久久久久久久| 尹人香蕉久久99天天拍| 国产精品99久久免费观看| 欧美久久亚洲精品| 久久九九青青国产精品| 亚洲国产婷婷香蕉久久久久久| 国产成人久久激情91| 久久久久波多野结衣高潮| 国产香蕉97碰碰久久人人| 久久久久人妻一区精品性色av| 日韩一区二区三区视频久久| 日本久久久久久中文字幕| 亚洲狠狠婷婷综合久久久久| 欧美伊人久久大香线蕉综合69| 久久久综合九色合综国产| 无码人妻久久一区二区三区| 亚洲第一永久AV网站久久精品男人的天堂AV | 99久久精品免费看国产一区二区三区| 日本三级久久网| 国产午夜久久影院| 久久人人爽人人爽人人片AV不 | 激情久久久久久久久久| 国产精品一久久香蕉国产线看| 亚洲精品午夜国产va久久| 久久精品无码一区二区三区日韩 | 中文精品久久久久人妻| 久久夜色精品国产亚洲av| 国产亚州精品女人久久久久久 | 国产精品久久久久蜜芽| 色婷婷久久久SWAG精品| 久久精品无码一区二区三区日韩| 国产成人综合久久久久久| 国产精品久久久福利| 久久夜色精品国产噜噜噜亚洲AV| 精品国产乱码久久久久久呢| 精品久久久久久无码不卡| 97精品伊人久久大香线蕉| 久久中文字幕人妻丝袜| 久久精品无码一区二区WWW| 思思久久精品在热线热|