宋昀杰 于梅英 張珂
摘要:使用Microsoft Visual Studio 2010在ASP.NET平臺(tái)上建立BS架構(gòu)的應(yīng)用程序,實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)入Word模板,并生成Word文件,再通過WinRAR對(duì)文件進(jìn)行壓縮后下載至本地。
關(guān)鍵詞:ASP.NET;C#;Office 2003;Word;WinRAR;
中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)26-6179-04
在制作軟件時(shí),客戶通常需要系統(tǒng)有將數(shù)據(jù)生成指定格式的Word文件,并將其下載至本地的功能,如:生成人員信息表,生成人員簡(jiǎn)歷等。下面介紹的是其中一種在ASP.NET平臺(tái)下實(shí)現(xiàn)此功能的方法。
1實(shí)現(xiàn)功能
訪問系統(tǒng)網(wǎng)站,將所需要的人員信息批量生成Word文件并打包下載至本地PC,要求生成的Word文件中數(shù)據(jù)均在指定的位置,并且含有合乎大小要求的員工相片。
2前期準(zhǔn)備
服務(wù)器需安裝Office 2003,以便在程序中引入Microsoft.Vbe.Interop.dll;需要制作Word模板,在模板中提前構(gòu)建好人員信息表的布局,如圖1;并將其存儲(chǔ)在服務(wù)器的指定文件夾下。在Microsoft Visual Studio 2010下創(chuàng)建Visual C#網(wǎng)站。
3實(shí)現(xiàn)過程
3.1在模板中插入書簽
在先前制作的Word模板中插入書簽。例如在需顯示姓名的位置上插入書簽,并設(shè)置書簽的ID,如圖2;在模板中姓名的顯示位上置插入了ID為name的書簽。
圖2插入Word書簽
在所有需要的位置上插入書簽后,保存Word模板。
3.2創(chuàng)建名為WordOp.cs的類文件
WordOp類主要用來對(duì)Word的操作,即生成Word文件,并且在生成的Word文件中插入指定數(shù)據(jù)的功能,實(shí)現(xiàn)代碼如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
//引用Interop.Microsoft.Office.Interop.Word.dll
using Microsoft.Office.Interop.Word;
using System.IO;
//
//WordOp
//
public class WordOp
{public WordOp()
{//TODO:在此處添加構(gòu)造函數(shù)邏輯}
private ApplicationClass WordApp;
private Document WordDoc;
private static bool isOpened = false;//判斷word模版是否被占用
public void SaveAs(string strFname, bool isReplace)
{
if (isReplace && File.Exists(strFname))
{File.Delete(strFname);}
object missing = Type.Missing;
object fileName = strFname;
WordDoc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);}
//定義一個(gè)Word.Application對(duì)象
public void activeWordApp()
{WordApp = new ApplicationClass();}
public void Quit()
{object missing = System.Reflection.Missing.Value;
WordApp.Application.Quit(ref missing, ref missing, ref missing);
isOpened = false;}
//按照先前設(shè)計(jì)好的模版新建Word文件
public void OpenTempelte(string strTemppath)
{object Missing = Type.Missing;
//object Missing = System.Reflection.Missing.Value;
activeWordApp();
WordApp.Visible = false;
object oTemplate = (object)strTemppath;
try
{
WordDoc = WordApp.Documents.Add(ref oTemplate, ref Missing, ref Missing, ref Missing);
isOpened = true;
WordDoc.Activate();}
catch (Exception Ex)
{Quit();
isOpened = false;
throw new Exception(Ex.Message);}}
public void FillLable(string LabelId, string Content)
{ //打開Word模版
// OpenTempelte(tempName); //對(duì)LabelId的標(biāo)簽進(jìn)行填充內(nèi)容Content,即函件題目項(xiàng)
object bkmC = LabelId;
if (WordApp.ActiveDocument.Bookmarks.Exists(LabelId) == true)
{if (LabelId != "PIC")//判斷是否是顯示照片的書簽
{WordApp.ActiveDocument.Bookmarks.get_Item(ref bkmC).Select();
WordApp.Selection.TypeText(Content);}
else
{try
{object missing = System.Reflection.Missing.Value;
InlineShape li = WordApp.ActiveDocument.Bookmarks.get_Item(ref bkmC).Range.InlineShapes.AddPicture(Content, ref missing, ref missing, ref missing);
li.Width = 85;//設(shè)置照片的寬
li.Height = 100;} //設(shè)置照片的高
catch { }
}}}}
需要注意的是,在填充書簽數(shù)據(jù)時(shí),可以根據(jù)書簽ID來判斷書簽的用途,如果是用來顯示照片的書簽,需要使用WordApp.Acti? veDocument.Bookmarks.get_Item(ref bkmC).Range.InlineShapes.AddPicture()方法,并為相片按照Word模板上需顯示的大小設(shè)置高度和寬度。
3.3將人員信息生成Word文件
獲取Word模板的地址和Word模板的文件名。
string path = Server.MapPath("當(dāng)前路徑");
string templatePath = path + "http://Word模板名稱";
建立WordOp類的實(shí)例。
WordOp wop = new WordOp();
調(diào)用WordOp類中的OpenTempelte()方法,把帶Word模板名稱的路徑傳給此方法。如:wop.OpenTempelte(templatePath);
調(diào)用WordOp類中的FillLable()方法,把書簽ID和需要導(dǎo)入的數(shù)據(jù)傳給此方法。如:wop.FillLable("name", "張三");
如果要傳圖片數(shù)據(jù),就將圖片的地址傳遞過去即可。
如:wop.FillLable("PIC", "http”//…….jpg");
接下來調(diào)用WordOp類中的wop.SaveAs()方法,將已經(jīng)把數(shù)據(jù)插入指定位置,并且建立完成的Word文件命名,存入指定的路徑下。
如:wop.SaveAs(指定路勁+ "Word文件名.doc", true);
最后調(diào)用WordOp類中的wop.Quit()方法關(guān)閉系統(tǒng)對(duì)Word的調(diào)用。
如:wop.Quit();
這樣就成功的將一份已經(jīng)導(dǎo)入數(shù)據(jù)的Word文件建立在了指定的路徑下;如果需要生成多份Word文件,就把上述代碼寫在循環(huán)中即可。
3.4將Word文件打包并下載
接下來是要將生成好的Word文件下載到本地PC機(jī)上。一般情況下,如果下載的文件為單一文件,都會(huì)很容易實(shí)現(xiàn);然而下載文件為復(fù)數(shù)時(shí),一般的下載方法就不能應(yīng)用了,此時(shí),必須將文件進(jìn)行壓縮,打包成一個(gè)RAR文件進(jìn)行下載。這里需要運(yùn)用Win RAR,首先編寫對(duì)WinRAR操作的方法CreateRar()。
public void CreateRar(string pSource, string pDestination)
{string _Source = pSource.ToString();
string _Destination = pDestination.ToString();
System.Diagnostics.Process _Process = new System.Diagnostics.Process();
_Process.StartInfo.FileName = "Winrar.exe";
_Process.StartInfo.CreateNoWindow = true;
_Process.StartInfo.Arguments = " a -r -ep1 " + _Destination + " " + _Source;
_Process.Start();
_Process.WaitForExit();
if (_Process.HasExited)
{int iExitCode = _Process.ExitCode;
if (iExitCode == 0)
{//壓縮成功}
else
{//壓縮失敗}}
_Process.Close();}
調(diào)用CreateRar(),將要壓縮的文件夾和文件夾壓縮后的存放路徑及名稱作為參數(shù),傳給此方法。
如:CreateRar(壓縮文件路徑),存放路徑+ "/Word.rar"));
然后,再將壓縮好的Word.rar文件下載至本地PC機(jī)解壓即可。最終Word文件的顯示效果如圖3所示。在對(duì)批量的Word文件進(jìn)行壓縮時(shí),需要注意一點(diǎn),如果壓縮文件數(shù)量過多,系統(tǒng)會(huì)出現(xiàn)過長(zhǎng)的命令運(yùn)行時(shí)間,有可能會(huì)誤導(dǎo)用戶,使其產(chǎn)生系統(tǒng)功能出錯(cuò)或網(wǎng)速過慢的錯(cuò)覺。所以最好在系統(tǒng)進(jìn)行壓縮時(shí),在界面上顯示等待提示,在后臺(tái)對(duì)文件壓縮的時(shí)間進(jìn)行判斷,用Sleep()將系統(tǒng)掛起預(yù)計(jì)的時(shí)間,這樣做可大大降低系統(tǒng)出錯(cuò)的幾率。
4結(jié)尾語(yǔ)
由于Office辦公軟件被廣泛使用,所以在編寫應(yīng)用系統(tǒng)時(shí),很多功能都需要和Office組件進(jìn)行結(jié)合開發(fā)來實(shí)現(xiàn)。上述內(nèi)容只是針對(duì)了Office中的Word一項(xiàng)進(jìn)行介紹,然而還有很多種方法可以和Office中的任何功能進(jìn)行結(jié)合或調(diào)用,例如在Microsoft Visual Studio 2010中,就專門提供了許多和Office的外接程序,這些都需要在學(xué)習(xí)和實(shí)踐中來慢慢掌握。
參考文獻(xiàn):
[1] Asp.net下將頁(yè)面內(nèi)容導(dǎo)入到word模板中的方法[EB/OL].http://www.alixixi.com/program/a/2010111566128.shtml.
[3] DAVE STEARNS.Microsoft Office 2000 Web Components編程技術(shù)內(nèi)幕[M].北京:北京希望電子出版社,2000.