隨筆-1  評論-4  文章-15  trackbacks-0
           

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

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

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

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

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

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


            但此時的Excel表格是一個空的表格,沒有任何內(nèi)容,下面就來介紹如何往Excel表格中輸入數(shù)據(jù)。
            3、往Excel表格中輸入數(shù)據(jù)
            在命名空間"Excel"中,還定義了一個類"Cell",這個類所代表的就是Excel表格中的一個單元格。通過給"Cell"賦值,從而實現(xiàn)往Excel表格中輸入相應(yīng)的數(shù)據(jù),下列代碼功能是打開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、實例
            下面實例在C#中連接Oracle數(shù)據(jù)庫(Name),從表(TableName)中讀取數(shù)據(jù),并寫入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、安裝一個使用COM組件的.net程序
            如果要將這樣的程序安裝運行在另一臺機器上,那么除了安裝運行程序外,還做三件事。
            首先,是安裝.NET運行系統(tǒng)。因為任何一個.NET程序都不能離開.NET運行系統(tǒng)去獨立運行。
            其次,所調(diào)用的COM組件必須要安裝在目標機器上。本例中大多數(shù)目標機器上都裝有Microsoft OfficeExcel,一般不會有這個問題。但如果是另一個用戶自定義的COM組件,那么這個COM組件在運行.NET程序之前必須先安裝好。

               6Excel屬性方法

          1 顯示當前窗口:ExcelApp.Visible := True;

          2 更改 Excel 標題欄:ExcelApp.Caption := '標題內(nèi)容';
          3 添加新工作簿:ExcelApp.WorkBooks.Add;
          4 設(shè)置第2個工作表為活動工作表:ExcelApp.WorkSheets[2].Activate;
          5 給單元格賦值:ExcelApp.Cells[1,1].Value := '第一行第一列';
          6 設(shè)置指定列的寬度(單位:字符個數(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行之前插入分頁符:ExcelApp.WorkSheets[1].Rows[8].PageBreak := 1;
          15、在第4列之前刪除分頁符:ExcelApp.ActiveSheet.Columns[4].PageBreak := 0;
          16、指定邊框線寬度:ExcelApp.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
          1-    2-   3-    4-   5-( " )     6-( / )
          17、拷貝操作

          a.拷貝整個工作表:ExcelApplication1.ActiveSheet.Used.Range.Copy;
          b.拷貝指定區(qū)域:ExcelApplication1.ActiveSheet.Range[ 'A1:E2' ].Copy;
          c.A1位置開始粘貼:ExcelApplication1.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
          d.從文件尾部開始粘貼: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、放棄存盤:ExcelApp.ActiveWorkBook.Saved := True;
          22、關(guān)閉工作簿:ExcelApp.WorkBooks.Close;
          23、退出 ExcelExcelApp.Quit; 

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

          ExcelApp.ActiveSheet.Rows[1].Font.Name := '隸書';
          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、進行頁面設(shè)置:

          a.頁眉:ExcelApp.ActiveSheet.PageSetup.CenterHeader := '報表演示';
          b.頁腳:ExcelApp.ActiveSheet.PageSetup.CenterFooter := '&N &P';
          c.頁眉到頂端邊距2cmExcelApp.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
          d.頁腳到底端邊距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.頁面水平居中:ExcelApp.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
          j.頁面垂直居中: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的多單元格合計功能:ExcelApp..Cells[ARow, ACol].Formula 
          := '= SUM($+IntToStr(BeginRow) +:$ + IntToStr(EndRow) +');
          注:聲明變量ARow, ACol: Integer;
          29、打開已經(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文件要安裝在目標機器上。因為.NET組件不需要在Windows ReGIStry中注冊,所以最簡單的方法是將.NET組件DLL文件拷貝到運行程序目錄下。如果此.NET組件被多個.NET程序共享,可以將其安裝在.NET公用組件區(qū)中,從而可被任何一個.NET組件使用。只有當一個.NET組件參與了事務(wù)處理時,才需要將它注冊為一個COM+組件。因為.NET仍然用傳統(tǒng)的COM+機制來處理事務(wù)的提交、回滾等。

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 聂拉木县| 阳东县| 安义县| 永济市| 汤原县| 新竹县| 利津县| 津南区| 西峡县| 视频| 曲沃县| 太湖县| 郴州市| 东明县| 新巴尔虎左旗| 宜君县| 高雄市| 金塔县| 屏东市| 灯塔市| 西青区| 侯马市| 凤冈县| 吉安市| 邢台县| 哈巴河县| 岐山县| 铅山县| 秦安县| 乐昌市| 广西| 东平县| 岳池县| 扶余县| 正安县| 白河县| 乌拉特前旗| 上蔡县| 民乐县| 鄯善县| 多伦县|