標籤:io ar os 使用 for sp 檔案 資料 on
利用C#.NET設計的管理資訊系統應用非常廣泛,但其報表往往是利用水晶報表或其它工具形成固定式報表,這樣不便於修改和電子文檔的儲存及傳遞,如果能將輸出結果寫入到Word文檔中這樣就解決了這個問題。現從以下幾個方面介紹如何利用C#.NET來控制Word文檔的操作。
1 利用C#.NET產生和設定Word文檔
我們用VS2008中的C#.NET來實現的,所以要安裝好VS2008。在編程之前必須從“項目”菜單上“添加引用”對話方塊的“COM”選碩卡中添加對類型庫的引用,並在程式首部加入“usingWord;”這一引用。根據電腦上安裝的Word版本,類型庫將有所不同。例如,對於MicrosoftWord2003,類型庫的名稱為MicrosoftWord11.0Ob2
jectLibrary。
[1]
111 Word文檔的建立
C#中要使用Word文檔,先要定義一個Word應用,其格式是Word.Applicationmywordapp=newWord.Appli2cation();。第二步是要定義一個Word文檔,應用語句Word.Documentnewdoc=newWord.Document();實現。第三步是定義一個對象用於記錄檔案名稱(包含檔案所在的路徑),對其進行初始化,並利用系統提供的檔案函數判斷其是否存在,如存在則利用系統函數將期刪除,定義一對象,用於記錄檔案名稱(包含檔案所在的路徑)objectwfilename;將對象初始化wfilename=System.Windows.Forms.Application.StartupPath+“樣本.doc”;判斷檔案是否已存在if(System.IO.File.Exists((string)wfilename));如果已存在就刪除System.IO.File.Delete((string)wfilename);否則就建立一Word文檔,在建立之前先定義一個對象用於Word文檔建立時的參數傳遞,ObjectNoth2ing=System.Reflection.Missing.Value;最後通過Word應用建立一個指定路徑的Word文檔,newdoc=mywordapp.
Documents.Add(refNothing,refNothing,refNothing,refNothing);112 Word文檔的版面設定
Word的版面設定一般包括,頁面橫縱向布局,紙張類型,頁面邊界,頁首,頁尾設定等,下面這段代碼是將Word
版面設定為縱向布局,設定紙張類型為A4紙,上下左右邊距為2厘米。
doc.PageSetup.Orientation=Word.WdOrientation.wdOrientLandscape;∥設定頁面為縱向doc.PageSetup.PageWidth=WordApp.CentimetersToPoints(29.7F);∥設定紙張寬度
doc.PageSetup.PageHeight=WordApp.CentimetersToPoints(21F);∥設定紙張高度newdoc.PageSetup.TopMargin=57;∥設定上邊距newdoc.PageSetup.BottomMargin=57;∥設定下邊距newdoc.PageSetup.LeftMargin=57;∥設定左邊距newdoc.PageSetup.RightMargin=57;∥設定右邊距113 頁首頁尾的添加與設定
頁首頁尾是word文檔中每個頁面裡上、下頁面邊界界定的用於儲存和顯示文本、圖形的資訊區。頁首頁尾常用於word文檔的列印修飾,內容可以包括文檔當前頁頁碼、文檔頁數、文檔建立日期時間、文檔作者、文檔標題、文檔路徑和檔案名稱、公司徽標、邊框線、特製圖形等文字或圖形。
mywordApp.ActiveWindow.View.Type=WdViewType.wdOutlineView;
mywordApp.ActiveWindow.View.SeekView=WdSeekView.wdSeekPrimaryHeader;mywordApp.ActiveWindow.ActivePane.Selection.InsertAfter(“[頁首內容]”
);mywordApp.Selection.ParagraphFormat.Alignment=myword.WdParagraphAlignment.wdAlignParagraphRight;∥
設定靠右對齊
mywordApp.ActiveWindow.View.SeekView=WdSeekView.wdSeekMainDocument;∥跳出頁首設定。
2 C#對Word當中表格的操作
211 建立表格及設定表格和儲存格屬性
objectautoFitBehavior=Word.WdAutoFitBehavior.wdAutoFitWindow;
newdoc.Content.Tables.Add(mywordApp.Selection.Range,表格行數,表格列數,refmissing,refautoFitBehav2ior);
212 合併儲存格
newdoc.Content.Tables[1].Cell(i+1,j).Select();objectmoveUnit=Word.WdUnits.wdLine;objectmoveCount=1;
objectmoveExtend=Word.WdMovementType.wdExtend;
mywordApp.Selection.MoveUp(refmoveUnit,refmoveCount,refmoveExtend);mywordApp.Selection.Cells.Merge();
mywordApp.Selection.Cells.VerticalAlignment=Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;newdoc.Content.Tables[1].Cell(i+1,1).Range.Text=“儲存格內容填充”;213 拆分儲存格
Word.TablenewTable=newdoc.Tables[1];objectbeforeRow=newTable.Rows[1];newTable.Rows.Add(refbeforeRow);Word.Cellcell=newTable.Cell(1,1);cell.Merge(newTable.Cell(1,2));objectRownum=2;objectColumnnum=2;
cell.Split(refRownum,refColumnnum);214 添加行、添加列
newdoc.Content.Tables[0].Rows.Add(refbeforeRow);∥添加行newdoc.Content.Tables[0].Columns.Add(refbeforeColumn);∥添加列
?
3 用C#.NET將資料庫中的資料寫入Word文檔
311 建立與資料庫的串連
要將資料寫入Word文檔,首先要建立資料庫的串連,這裡應用的是ADO.NET的System.Data.OleDb技術來訪問Access資料庫。在使用此技術前要添加usingSystem.data.OleDb引用。具體應用分三部。
(1)在程式的公用部分定義一個串連。
OleDbConnectionmyConn=newOleDbConnection();(2)在頁面載入部分添加以下代碼來定義連接字串。
stringconnstr=“provider=Microsoft.Jet.OLEDB.4.0;datasource=.\\basic.mdb”;myConn.ConnectionString=connstr;
(3)在每一個應用函數中用myConn.open();和myConn.clos();來開啟和關閉串連。[2]
312 建立資料集執行個體
在程式中我們使用ADO.NET的DataReader類以串連方式從資料來源讀取資料。我們不能直接執行個體化Da2
taReader類,而是通過執行Command對象的ExecuteReader方法返回它的執行個體[1]。執行個體如以下代碼。
[3]
stringsqlsr=“select3fromunit”;
OleDbCommandmycomm=newOleDbCommand(sqlsr,myConn);OleDbDataReaderdr=mycomm.ExecuteReader();313 資料寫入Word文檔
利用C#將程式中的資料的寫入到Word文檔中,在程式對變數中的資料處裡好後可以用newdoc.Content.In2sertAfter(name);將name變數中的資料寫入到Word文檔當前位置的後面。用.InserBefore(name);將name變數中的資料寫入到Word文檔當前位置的前面。.InsertDateTime可以插入當前系統時間等等。設定字型是否為粗體用newdoc.Paragraphs.Last.Range.Font.Bold=0;當值為“0”時就不設為粗體,當為“1”時設為粗體,用newdoc.Par2agraphs.Last.Range.Font.Name=“字型名”;可以設定字型。用newdoc.Paragraphs.Last.Range.Font.Size=10;可以設定字型的大小。用newdoc.Paragraphs.Last.Alignment=Word.WdParagraphAlignment.wdAlignParagraphLeft;可以設定對齊。314 從剪貼簿中擷取資料
在記憶體中開啟一個Word文檔,將所選的內容複寫到剪貼簿中,這樣我們就可以從剪貼簿中取得資料,首先啟用當前Word文檔newdoc.ActiveWindow.Selection.WholeStory();第二步將選定的內容複寫到剪貼簿中newdoc.ActiveWindow.Selection.Copy();第三步定義對象IDataObjectdata=Clipboard.GetDataObject();第四步擷取data對象中的內容txtFileContent.Text=data.GetData(DataFormats.Text).ToString()。通過這幾個步驟我們就可以擷取記憶體中開啟的Word文檔中選定的內容並將其運用到我們所需要的地方。
4 用SQL語句進行查詢和統計並將結果寫入Word文檔
SQL語句具有,綜合統一,集資料定義、資料操縱、資料管理的功能於一體,語言風格統一,可以獨立完成資料
庫的全部操作;高度非過程化,提出“做什麼”而不是“怎麼做”面向集合的操作方式;兩種使用方式和統一的文法結,SQL語言既是自含式語言,又是嵌人式語言,作為自含式語言,它可單獨使用,使用者在終端上直接鍵入SQL命令就可以實現對資料庫進行操作;語言簡潔,易學易用等特點。在我們的程式中應用SQL語語句將大大提高我們程式的效率。
SQL語句非常豐富,這裡只對資料統計的資料分析常用到的彙總函式進行簡單介紹及如何運用C#將其結果寫入到Word中。
彙總函式又稱列函數或者組函數是基於在一個值集(或一組值)中的某一特定的計算返回一個單一的值;當它們與SELECT語句的GROUPBY子句一起使用時每一個彙總函式為每一個組產生一個單一值,當不與GROUP
BY子句一起使用時是為整個表產生一單一值。表1為彙總函式簡介
表1 彙總函式
函數名
傳回值類型含 義
max()浮點型返回選擇值中的最大值min()浮點型返回選擇值中的最小值
count(3)整型返回一個SELECT語句的行數sum()浮點型計算選擇值的和
avg()浮點型計算選擇值的平均值stdev()浮點型計算選擇值的標準差var()
浮點型
計算選擇值的方差
表2 OleDbCommand的執行方法方法名
說 明
ExecuteNonQuery()返回受影響的行數ExecuteReader()返回SqlDataReader()對象ExecuteXmlReader()返回XmlReader對象ExecuteScaler()
返回結果中的首行首列
要將SQL語句查詢的結果寫入的Word文檔還要做一些準備工作,首先要建立一個與資料庫的串連,前面我
們已經介紹了怎麼建立一個與Access資料庫的串連myConn;第二步定義一個OleDbCommand對象如mycmmd;第三步定義一CommandText用來設定資料來源執行的Transact-SQL語句。第四步執行OleDbCommand對象,OleDb2Command對象有四種其說明見表2。這樣就可以將OleDbCommand對象執行的結果負給程式中的變數,再用前面介紹的方法將資料寫入到Word文檔。
根據需要我們可以選擇不同的OleDbCommand的執行方法來得到我們所需要的資料,下面是利用彙總函式中的coun(3)函數通過OleDbCommand的執行方法中的ExecuteScaler()返回jbqk表中的某一教學單位人員個數的例子。
stringsqlstr="selectcount(3)asmmfromjbqkwhere分類=’教學’and單位=’"+unitname+"’";
OleDbCommandmycmmd=newOleDbCommand(sqlstr,myConn);jx_n=(int)mycmmd.ExecuteScalar();
[6]
這樣jx_n變中就存了某一教學單位人員個數,這樣就可以通過C#將其寫入到我們所需要的Word文檔中的相應位置上去。其它的彙總函式和OleDbCommand的執行方法的用法和上面的用法相類似這裡就不一一舉例了。
5 結束語
利用C#控制Word主要目的是為了形成靈活可變的報表,這些報表可以做修改後發給需要它的人,並可以作為電子文檔將其儲存起來,以備今後的使用。C#對Word的操作非常豐富,文中只提及其基本的操作,希望能對讀者有所協助。
基於C#.NET的動態Word文檔產生及資料填充研究