MFC寫Excel文件

1、首先項目中添加類”Typelib中的MFC->選擇文件中”,選擇office的安裝路徑中的excel.exe;

2、選中以下幾項_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然後導入;

3、導入後自動在工程中添加CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange這些類; 

並將把這些類的頭文件中的第一句話 #import ".......EXCEL.EXE" nonamespace 刪除; 

4、編譯時會遇到問題Not enough actual parameters for macro 'DialogBoxW' 

解決的方法:在CRange類中找到VARIANT DialogBox(){}並將DialogBox其改成_DialogBoxW

5、在菜單上添加一個按鈕,並添加事件,寫入代碼:

     // TODO: 在此添加命令處理程序代碼

         CApplication objApp;

         CWorkbooks objBooks;

         CWorkbook objBook;

         CWorksheets objSheets;

         CWorksheet objSheet;

         CRange objRange,usedRange;

         LPDISPATCH lpDisp;

         COleVariant vResult;

         COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

         if(!objApp.CreateDispatch(_T("Excel.Application"),NULL))

         {

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

                   return;

         }

 

         objApp.put_Visible(TRUE);

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

         objBooks.AttachDispatch(objApp.get_Workbooks(),TRUE);

         //objBook.AttachDispatch(objBooks.Add((COleVariant)TempPath),TRUE);//加載EXCEL模板

         objSheets.AttachDispatch(objBook.get_Sheets(),TRUE);//加載Sheet頁面

         //添加新的Sheet頁面

         //objSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);  

         //刪除第二個Sheet頁面

         //objSheet.AttachDispatch(objSheets.get_Item(_variant_t((long)2)),TRUE);

         //objSheet.Delete();

 

         //把第一個Sheet頁面的名字改變爲TestSheet

         objSheet.AttachDispatch(objSheets.get_Item(COleVariant((long)1)),TRUE);

         objSheet.put_Name("TestSheet");

 

         ///////合併第一行單元格A1D1//////

         //加載要合併的單元格

         objRange.AttachDispatch(objSheet.get_Range(COleVariant("A1"),COleVariant("D1")),TRUE);

         objRange.Merge(COleVariant((long)0));

 

         ////////設置表格內容////////

 

         objRange.AttachDispatch(objSheet.get_Cells(),TRUE);//加載所有單元格

//這裏的_variant_t可以使用COleVariant代替

        objRange.put_Item(COleVariant((long)1),COleVariant((long)1),COleVariant("數學系研究生課程統計"));

        objRange.put_Item(_variant_t((long)2),_variant_t((long)1),_variant_t("課程名"));

        objRange.put_Item(_variant_t((long)2),_variant_t((long)2),_variant_t("課時"));

        objRange.put_Item(_variant_t((long)2),_variant_t((long)3),_variant_t("難度"));

        objRange.put_Item(_variant_t((long)2),_variant_t((long)4),_variant_t("教學方式"));

        objRange.put_Item(_variant_t((long)3),_variant_t((long)1),_variant_t("泛函分析"));

        objRange.put_Item(_variant_t((long)3),_variant_t((long)2),_variant_t("60"));

        objRange.put_Item(_variant_t((long)3),_variant_t((long)3),_variant_t("普通"));

        objRange.put_Item(_variant_t((long)3),_variant_t((long)4),_variant_t("老師講課"));

        objRange.put_Item(_variant_t((long)4),_variant_t((long)1),_variant_t("微分流形"));

        objRange.put_Item(_variant_t((long)4),_variant_t((long)2),_variant_t("40"));

        objRange.put_Item(_variant_t((long)4),_variant_t((long)3),_variant_t(""));

        objRange.put_Item(_variant_t((long)4),_variant_t((long)4),_variant_t("自學"));

        objRange.put_Item(_variant_t((long)5),_variant_t((long)1),_variant_t("二階橢圓型方程與方程組"));

        objRange.put_Item(_variant_t((long)5),_variant_t((long)2),_variant_t("60"));

        objRange.put_Item(_variant_t((long)5),_variant_t((long)3),_variant_t("很難"));

        objRange.put_Item(_variant_t((long)5),_variant_t((long)4),_variant_t("討論"));

         objRange.AttachDispatch(objSheet.get_UsedRange());//加載已使用的單元格

 

         objRange.put_WrapText(_variant_t((long)1));//設置單元格內的文本爲自動換行

        

        objRange.put_HorizontalAlignment(_variant_t((long)-4108));

        objRange.put_VerticalAlignment(_variant_t((long)-4108));

         ///////設置整體的字體、字號及顏色//////

//要使用字體類,需要在初始Excel的時候導入這個類(下面幾個類也是如此)

//爲了使用這些類,可以初始化的時候將excel中的類全部導入,並將所有的頭文件命改爲excel.h

   // Font ft;

       //ft.AttachDispatch(objRange.get_Font());

       //ft.put_Name(_variant_t("宋體"));//字體

       //ft.SetColorIndex(_variant_t((long)11));//字的顏色

       //ft.SetSize(_variant_t((long)12));//字號

       /////////////設置標題字體及顏色//////////

       //m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A1"),_variant_t("D1")));

       //ft.AttachDispatch(m_ExlRge.GetFont());

       //ft.SetBold(_variant_t((long)1));//粗體

       //ft.SetSize(_variant_t((long)13));

       //ft.SetColorIndex(_variant_t((long)2));

       //CellFormat cf;

       //cf.AttachDispatch(m_ExlRge.GetCells());

 

//      //////////////設置底色/////////////////

 

        Interior it;

        it.AttachDispatch(m_ExlRge.GetInterior());

        it.SetColorIndex(_variant_t((long)11));//標題底色

        ////表格內容的底色////

        m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A2"),_variant_t("D5")));

        it.AttachDispatch(m_ExlRge.GetInterior());

        it.SetColorIndex(_variant_t((long)15));

//      //////////////爲表格設置邊框/////////////

//

       CRange UnitRge;

       CString CellName 

       for(int i=1;i<=5;i++)

       {

                 for(int j=1;j<=4;j++)

                 {    

                     CellName.Format("%c%d",j+64,i);//單元格的名稱

                     UnitRge.AttachDispatch(objRange.get_Range(_variant_t(CellName),_variant_t(CellName)));//加載單元格

 

                 //LineStyle=線型Weight=線寬ColorIndex=線的顏色(-4105爲自動)

                UnitRge.BorderAround(_variant_t((long)1),_variant_t((long)2),_variant_t((long)-4105),vtMissing);//設置邊框

                 }

       }

         //釋放對象(相當重要!)

         objRange.ReleaseDispatch();

         objSheet.ReleaseDispatch();

         objSheets.ReleaseDispatch();

         objBook.ReleaseDispatch();

         objBooks.ReleaseDispatch();

         //m_ExlApp一定要釋放,否則程序結束後還會有一個Excel進程駐留在內存中,而且程序重複運行的時候會出錯

         objApp.ReleaseDispatch();

         //退出程

發佈了74 篇原創文章 · 獲贊 36 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章