隨筆-1  評(píng)論-4  文章-15  trackbacks-0
           

             Excel是微軟公司辦公自動(dòng)化套件中的一個(gè)軟件,他主要是用來(lái)處理電子表格。Excel以其功能強(qiáng)大,界面友好等受到了許多用戶的歡迎。在設(shè)計(jì)應(yīng)用系統(tǒng)時(shí),對(duì)于不同的用戶,他們對(duì)于打印的需求是不一樣的,如果要使得程序中的打印功能適用于每一個(gè)用戶,可以想象程序設(shè)計(jì)是十分復(fù)雜的。由于Excel表格的功能強(qiáng)大,又由于幾乎每一臺(tái)機(jī)器都安裝了它,如果把程序處理的結(jié)果放到Excel表格中,這樣每一個(gè)用戶就可以根據(jù)自己的需要在Excel中定制自己的打印。這樣不僅使得程序設(shè)計(jì)簡(jiǎn)單,而且又滿足了諸多用戶的要求,更加實(shí)用了。那么用Visual C#如何調(diào)用Excel,如何又把數(shù)據(jù)存放到Excel表格中?本文就來(lái)探討上述問(wèn)題的解決辦法。

            Excel對(duì)象
            微軟的Excel對(duì)象模型包括了128個(gè)不同的對(duì)象,從矩形,文本框等簡(jiǎn)單的對(duì)象到透視表,圖表等復(fù)雜的對(duì)象.下面我們簡(jiǎn)單介紹一下其中最重要,也是用得最多的四個(gè)對(duì)象。

            (1) Application對(duì)象。Application對(duì)象處于Excel對(duì)象層次結(jié)構(gòu)的頂層,表示Excel自身的運(yùn)行環(huán)境。 
            (2) Workbook對(duì)象。Workbook對(duì)象直接地處于Application對(duì)象的下層,表示一個(gè)Excel工作薄文件。
            (3) Worksheet對(duì)象。Worksheet對(duì)象包含于Workbook對(duì)象,表示一個(gè)Excel工作表。
            (4) Range對(duì)象。Range對(duì)象包含于Worksheet對(duì)象,表示Excel工作表中的一個(gè)或多個(gè)單元格。

           C#中的受管代碼和非受管代碼 
            在.net公用語(yǔ)言框架內(nèi)運(yùn)行的程序?yàn)槭芄艽a。受管代碼在程序中所有類(lèi)型都受到嚴(yán)格檢查,沒(méi)有指針,對(duì)內(nèi)存的管理完全由運(yùn)行系統(tǒng)控制。受控狀態(tài)下,編寫(xiě)程序更為容易,且更少出錯(cuò),我們可以花更多的時(shí)間在解決實(shí)際問(wèn)題上而不是在計(jì)算機(jī)語(yǔ)言問(wèn)題上。相對(duì)而言,那些在.NET框架外運(yùn)行的程序?yàn)榉鞘芄艽a。比如:COM組件、ActiveX組件、Win32 API函數(shù)、指針運(yùn)算等。C#編程中在某些特定情況下,需要運(yùn)用非受管代碼,例如,要利用一個(gè)成熟的COM組件,或者調(diào)用一個(gè)API函數(shù),或者用指針去編寫(xiě)實(shí)時(shí)/高效程序等。

           Visual C#中調(diào)用ExcelCOM組件
            一個(gè).NET組件事實(shí)上是一個(gè).NET下的DLL,它包含的不僅是運(yùn)行程序本身,更重要的是包含這個(gè)DLL的描述信息(Meta Data,即元數(shù)據(jù)),而一個(gè)COM組件是用其類(lèi)庫(kù)(TLB)儲(chǔ)存其描述信息。這些COM組件都是非受管代碼,要在Visual C#中使用這些非受管代碼的COM組件,就必須把他們轉(zhuǎn)換成受管代碼的.NET組件。所以在用Visual C#調(diào)用Excel表格之前,必須完成從COM組件的非受管代碼到受管代碼的類(lèi)庫(kù)的轉(zhuǎn)換。
            1、將ExcelCOM組件轉(zhuǎn)換為.NET組件
            在項(xiàng)目中打開(kāi)Add Reference對(duì)話框,選擇COM欄,之后在COM列表中找到"Microsoft Excel 9.0 Object Library"Office2000),然后將其加入到項(xiàng)目的References中即可。Visual C#.NET會(huì)自動(dòng)產(chǎn)生相應(yīng)的.NET組件文件,以后即可正常使用。
            這個(gè)轉(zhuǎn)換形成.NET組件不能單獨(dú)使用,它不過(guò)是以前的COM組件的一個(gè)外層包裝,在.NET中可以通過(guò)這個(gè)外層包裝去發(fā)現(xiàn)原來(lái)的COM組件并調(diào)用其相應(yīng)的界面函數(shù)。所以它必須與原來(lái)的COM組件一起起作用。
            2Visual C#打開(kāi)Excel表格
            事實(shí)上,在C#中使用一個(gè)經(jīng)轉(zhuǎn)換的COM組件和使用任何一個(gè)其它.NET組件完全一樣。可以用new關(guān)鍵字創(chuàng)建一個(gè)經(jīng)轉(zhuǎn)換的COM組件,然后再像使用任何一個(gè)其它C#對(duì)象一樣使用這個(gè)組件對(duì)象。
            在轉(zhuǎn)換后的.NET組件中定義了一個(gè)命名空間Excel,在此命名空間中封裝了一個(gè)類(lèi)Application,這個(gè)類(lèi)和啟動(dòng)Excel表格有非常重要的關(guān)系,在Visual C#中,只需要下列三行代碼就可以完成打開(kāi)Excel表格的工作,具體如下:

          Excel.Application excel = new Excel.Application ()//引用Excel對(duì)象
          excel.Application.Workbooks.Add ( true )//引用Excel工作簿
          excel.Visible = true //使Excel可視


            但此時(shí)的Excel表格是一個(gè)空的表格,沒(méi)有任何內(nèi)容,下面就來(lái)介紹如何往Excel表格中輸入數(shù)據(jù)。
            3、往Excel表格中輸入數(shù)據(jù)
            在命名空間"Excel"中,還定義了一個(gè)類(lèi)"Cell",這個(gè)類(lèi)所代表的就是Excel表格中的一個(gè)單元格。通過(guò)給"Cell"賦值,從而實(shí)現(xiàn)往Excel表格中輸入相應(yīng)的數(shù)據(jù),下列代碼功能是打開(kāi)Excel表格,并且往表格輸入一些數(shù)據(jù)。

          Excel.Application excel = new Excel.Application () 
          excel.Application.Workbooks.Add ( true ) 
          excel.Cells[ 1 , 1 ] = "First Row First Column" 
          excel.Cells[ 1 , 2 ] = "First Row Second Column" 
          excel.Cells[ 2 , 1 ] = "Second Row First Column" 
          excel.Cells[ 2 , 2 ] = "Second Row Second Column" 
          excel.Visible = true ;

            4、實(shí)例
            下面實(shí)例在C#中連接Oracle數(shù)據(jù)庫(kù)(Name),從表(TableName)中讀取數(shù)據(jù),并寫(xiě)入Excel

          string cnString="Provider=msdaora.1;Data source=Name; ";
          cnString=cnString+"user id=UserName;password=Password";
          try
          {
           OleDbConnection cn=new OleDbConnection (cnString);
           cn.Open ();
           try
           {
            string s="select * from Name.TableName";
            OleDbCommand cmd=new OleDbCommand (s,cn);
            OleDbDataReader dr=cmd.ExecuteReader ();
            Excel.Application xlApp = new Excel.Application();
            if(xlApp==null){MessageBox.Show ("Can't open Excel!");return;}
            xlApp.Application .Workbooks .Add (true);
            int row=2,fieldcount;
            fieldcount=dr.FieldCount ;
            for(int col=0;col<fieldcount;col++) xlApp.Cells [1,col+1]=dr.GetName(col);
            while (dr.Read ())
            {
             for(int col=0;col<fieldcount;col++) 
              xlApp.Cells [row,col+1]=dr.GetValue(col).ToString();
              row++;
            }
            xlApp.Visible =true;
            xlApp=null;
           }
           catch(Exception ex ){MessageBox.Show (ex.Message );}
           finally {cn.Close();}
          }
          catch(Exception ex){MessageBox.Show (ex.Message );}
          }
          }

            5、安裝一個(gè)使用COM組件的.net程序
            如果要將這樣的程序安裝運(yùn)行在另一臺(tái)機(jī)器上,那么除了安裝運(yùn)行程序外,還做三件事。
            首先,是安裝.NET運(yùn)行系統(tǒng)。因?yàn)槿魏我粋€(gè).NET程序都不能離開(kāi).NET運(yùn)行系統(tǒng)去獨(dú)立運(yùn)行。
            其次,所調(diào)用的COM組件必須要安裝在目標(biāo)機(jī)器上。本例中大多數(shù)目標(biāo)機(jī)器上都裝有Microsoft OfficeExcel,一般不會(huì)有這個(gè)問(wèn)題。但如果是另一個(gè)用戶自定義的COM組件,那么這個(gè)COM組件在運(yùn)行.NET程序之前必須先安裝好。

               6Excel屬性方法

          1 顯示當(dāng)前窗口:ExcelApp.Visible := True;

          2 更改 Excel 標(biāo)題欄:ExcelApp.Caption := '標(biāo)題內(nèi)容';
          3 添加新工作簿:ExcelApp.WorkBooks.Add;
          4 設(shè)置第2個(gè)工作表為活動(dòng)工作表:ExcelApp.WorkSheets[2].Activate;
          5 給單元格賦值:ExcelApp.Cells[1,1].Value := '第一行第一列';
          6 設(shè)置指定列的寬度(單位:字符個(gè)數(shù)),以第一列為例:
          ExcelApp.ActiveSheet.Columns[1].ColumnsWidth := 5;
          7 設(shè)置指定行的高度(單位:磅)(1磅=0.035厘米),以第二行為例:
          ExcelApp.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
          8、文字水平居中:Excelid.worksheets[1].Rows[1].HorizontalAlignment := $FFFFEFF4;
            
          文字垂直居中:Excelid.worksheets[1].Rows[1].VerticalAlignment := $FFFFEFF4;
          9 插入一行或一列:

          a. ExcelApp.ActiveSheet.Rows[2].Insert;
          b. ExcelApp.ActiveSheet.Columns[1].Insert;
          10 刪除一行或一列:

          a. ExcelApp.ActiveSheet.Rows[2].Delete;
          b. ExcelApp.ActiveSheet.Columns[1].Delete;  
          11、合并單元格

          a. Microsoft.Office.Interop.Excel.Range range = wsheet.get_Range(A1, F8');

              range.Merge(0);

          b. Microsoft.Office.Interop.Excel.Range range = wsheet.get_Range(wsheet.Cells[2, 1], wsheet.Cells[6, 3]);

           range.Merge(0);


          12、豎行顯示文字:ExcelApp.worksheets[1].Cells.Item[1,1].Orientation:= xlVertical;
          13、單元格加邊線:ExcelApp.worksheets[1].Range[A1:F8].Borders.LineStyle := 1;
          14、在第8行之前插入分頁(yè)符:ExcelApp.WorkSheets[1].Rows[8].PageBreak := 1;
          15、在第4列之前刪除分頁(yè)符:ExcelApp.ActiveSheet.Columns[4].PageBreak := 0;
          16、指定邊框線寬度:ExcelApp.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
          1-    2-   3-    4-   5-( " )     6-( / )
          17、拷貝操作

          a.拷貝整個(gè)工作表:ExcelApplication1.ActiveSheet.Used.Range.Copy;
          b.拷貝指定區(qū)域:ExcelApplication1.ActiveSheet.Range[ 'A1:E2' ].Copy;
          c.A1位置開(kāi)始粘貼:ExcelApplication1.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
          d.從文件尾部開(kāi)始粘貼:ExcelApplication1.ActiveSheet.Range.PasteSpecial;
          18、清除第一行第四列單元格公式:ExcelApp.ActiveSheet.Cells[1,4].ClearContents;
          19、工作表保存:

          if not ExcelApp.ActiveWorkBook.Saved then
                         ExcelApp.ActiveSheet.PrintPreview;
          20、工作表另存為:ExcelApp.SaveAs( 'C:"Excel"Demo1.xls' );
          21、放棄存盤(pán):ExcelApp.ActiveWorkBook.Saved := True;
          22、關(guān)閉工作簿:ExcelApp.WorkBooks.Close;
          23、退出 ExcelExcelApp.Quit; 

          24、設(shè)置第一行字體屬性:

          ExcelApp.ActiveSheet.Rows[1].Font.Name := '隸書(shū)';
          ExcelApp.ActiveSheet.Rows[1].Font.Color := clBlue;
          ExcelApp.ActiveSheet.Rows[1].Font.Bold := True;
          ExcelApp.ActiveSheet.Rows[1].Font.UnderLine := True;
          ExcelApp.ActiveSheet.Rows[1].Font.size:=10;
          25、進(jìn)行頁(yè)面設(shè)置:

          a.頁(yè)眉:ExcelApp.ActiveSheet.PageSetup.CenterHeader := '報(bào)表演示';
          b.頁(yè)腳:ExcelApp.ActiveSheet.PageSetup.CenterFooter := '&N頁(yè) &P頁(yè)';
          c.頁(yè)眉到頂端邊距2cmExcelApp.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
          d.頁(yè)腳到底端邊距3cmExcelApp.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
          e.頂邊距2cmExcelApp.ActiveSheet.PageSetup.TopMargin := 2/0.035;
          f.底邊距2cmExcelApp.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
          g.左邊距2cmExcelApp.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
          h.右邊距2cmExcelApp.ActiveSheet.PageSetup.RightMargin := 2/0.035;

           i.頁(yè)面水平居中:ExcelApp.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
          j.頁(yè)面垂直居中:ExcelApp.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
          k.打印單元格網(wǎng)線:ExcelApp.ActiveSheet.PageSetup.PrintGridLines := True;
          26、打印預(yù)覽工作表:ExcelApp.ActiveSheet.PrintPreview;
          27、打印輸出工作表:ExcelApp.ActiveSheet.PrintOut;
          28excel的多單元格合計(jì)功能:ExcelApp..Cells[ARow, ACol].Formula 
          := '= SUM($+IntToStr(BeginRow) +:$ + IntToStr(EndRow) +');
          注:聲明變量ARow, ACol: Integer;
          29、打開(kāi)已經(jīng)存在的Excel文件: ExcelApplication1.Workbooks.Open (c:"a.xls
          EmptyParam,EmptyParam,EmptyParam,EmptyParam,
          EmptyParam,EmptyParam,EmptyParam,EmptyParam,

          EmptyParam,EmptyParam,EmptyParam,EmptyParam,0); 

           最后,轉(zhuǎn)換后的.NET組件DLL文件要安裝在目標(biāo)機(jī)器上。因?yàn)?/span>.NET組件不需要在Windows ReGIStry中注冊(cè),所以最簡(jiǎn)單的方法是將.NET組件DLL文件拷貝到運(yùn)行程序目錄下。如果此.NET組件被多個(gè).NET程序共享,可以將其安裝在.NET公用組件區(qū)中,從而可被任何一個(gè).NET組件使用。只有當(dāng)一個(gè).NET組件參與了事務(wù)處理時(shí),才需要將它注冊(cè)為一個(gè)COM+組件。因?yàn)?/span>.NET仍然用傳統(tǒng)的COM+機(jī)制來(lái)處理事務(wù)的提交、回滾等。

          posted on 2010-07-15 10:10 farmer 閱讀(361) 評(píng)論(2)  編輯  收藏

          評(píng)論:
          # re: C#操作Excel文件 2012-06-20 22:09 | kylexy
          app.ActiveSheet.Rows[1].Delete;出現(xiàn)下面錯(cuò)誤:
          錯(cuò)誤 1 只有 assignment、call、increment、decrement 和 new 對(duì)象表達(dá)式可用作語(yǔ)句 D:\Test\pro-excel\pro-excel\Form1.cs 96 23 pro-excel
          錯(cuò)誤 2 “object”不包含“Rows”的定義,并且找不到可接受類(lèi)型為“object”的第一個(gè)參數(shù)的擴(kuò)展方法“Rows”(是否缺少 using 指令或程序集引用?) D:\Test\pro-excel\pro-excel\Form1.cs 96 39 pro-excel
            回復(fù)  更多評(píng)論
            
          # re: C#操作Excel文件 2012-06-20 22:10 | kylexy
          這個(gè)函數(shù)在那個(gè)庫(kù)中,按要求添加庫(kù)了,怎么解決  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 兰考县| 仲巴县| 大冶市| 开鲁县| 乳源| 罗山县| 若羌县| 五常市| 龙海市| 千阳县| 芒康县| 天津市| 读书| 南通市| 拜泉县| 张家港市| 石首市| 许昌县| 金湖县| 三河市| 罗甸县| 郑州市| 平顺县| 都江堰市| 芜湖县| 苗栗县| 江陵县| 上虞市| 大关县| 长治县| 新兴县| 民和| 凤阳县| 揭西县| 杂多县| 客服| 宽城| 永清县| 延庆县| 治多县| 靖边县|