我們在開發網站時,有很大一部分人采用的是MVC模式,而V是代表視圖,關於視圖開發的語言,都有語法簡單,開發迅速的特點,比如說 velocity,JStl等等,而通常用這種語言寫成的文件我們通常稱其為模板。模板,從名字上可以得出,這是一種通用具有參照性的樣板,所有的東西都是按照它的比例剪栽而成的。
在采用MVC方式開發html頁時,因為html是普通文本表示的,我們就會用如下形式表Html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xHtml11.dtd">
2 <html XMLns="http://www.w3.org/1999/xHtml" XML:lang="zh-CN" lang="zh-CN">
3 <head>
4 <title>#if($title) $title - #end xxx網</title>
5 <meta http-equiv="Content-Type" content="text/Html; charset=utf-8" />
6 <meta http-equiv="Content-Language" content="cn"/>
7 <meta content="all" name="robots"/>
8 <meta name="author" content="mailto:netcorner@live.com%22/>
9 <meta name="copyright" content="http://www.xxx.com%22/>
10 <meta name="description" content="$!title"/>
11 <meta name="keyWords" content="$!title"/>
12 <link rel="icon" href="$applicationPath/favicon.ico" type="image/x-icon"/>
13 <script src="$applicationPath/script/jquery1.3.2.JS" type="text/Javascript"></script>
14 </head>
15 <body>
16 #body()
17 </body>
18 </Html>
通過上面的形式,我們程序就可以把以“${var}”形式的替換成我們想要的數據,而且處理起來很方便,頁面和邏輯進行區分,但是對於我們的Office文件(如excel,word的文件)應該怎麼處理呢?因為他們不是文本的,所以通常情況下想要以 Excel或Word文件模板像Html一樣做模板處理就相當困難了!那麼有什麼辦法處理這種情況呢?
在開發過程中,我們會遇到很多情況是這樣的:要導出數據,導出成Excel、PDF、Word形式的,有的如果想打印,也可以直接導出這幾種形式,以方便用戶打印。這幾種情況在開發中是經常存的,對於開發OA時,這種情況遇到的就更多一些了。
那麼有沒有把像Excel、Word文檔當成模板處理的呢?
其實有很多方式可以實現這種情況的,我知道的大致有這幾種情況。
1.通過操作Office類庫,在程序中進行操作
這種情況,得調用Office類庫,而且還得寫不少代碼。
2.用openXML代替Office的二進制代碼
感覺很復雜,也不知道openXML文件是否支持Office早期版本。
3.用Office文件另存為XML形式來表示
例:
我建立doc文件,在文檔裡面輸入“aaaaaaaaaaaaaaaaa”,並別存為“XML文檔(*.xml)”,當你直接打開這個xml文件是就是直接打開Word文檔了,而文檔裡面就是我輸入的數據。用記事本打開剛才保存的XML文件,發現裡面就是一個文本格式的。代碼如下:
<?XML version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/Word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:Office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" w:MacrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><o:DocumentPropertIEs><o:Title>aaaaaaaaaaaaaaaaa</o:Title><o:Author>netcorner</o:Author><o:LastAuthor>netcorner</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>0</o:TotalTime><o:Created>2010-03-10T05:18:00Z</o:Created><o:LastSaved>2010-03-10T05:18:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>2</o:Words><o:Characters>16</o:Characters><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>17</o:CharactersWithSpaces><o:Version>11.6359</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="宋體" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="宋體"><w:altName w:val="SimSun"/><w:panose-1 w:val="02010600030101010101"/><w:charset w:val="86"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="288F0000" w:usb-2="00000016" w:usb-3="00000000" w:csb-0="00040001" w:csb-1="00000000"/></w:font><w:font w:name="@宋體"><w:panose-1 w:val="02010600030101010101"/><w:charset w:val="86"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="288F0000" w:usb-2="00000016" w:usb-3="00000000" w:csb-0="00040001" w:csb-1="00000000"/></w:font></w:fonts><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="a"><w:name w:val="Normal"/><wx:uiName wx:val="正文"/><w:pPr><w:widowControl w:val="off"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:kern w:val="2"/><w:sz w:val="21"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="a0"><w:name w:val="Default Paragraph Font"/><wx:uiName wx:val="默認段落字體"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="a1"><w:name w:val="Normal Table"/><wx:uiName wx:val="普通表格"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="a2"><w:name w:val="No List"/><wx:uiName wx:val="無列表"/><w:semiHidden/></w:style></w:styles><w:docPr><w:vIEw w:val="print"/><w:zoom w:percent="200"/><w:bordersDontSurroundHeader/><w:bordersDontSurroundFooter/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="420"/><w:drawingGridVerticalSpacing w:val="156"/><w:displayHorizontalDrawingGridEvery w:val="0"/><w:displayVerticalDrawingGridEvery w:val="2"/><w:punctuationKerning/><w:characterSpacingControl w:val="CompressPunctuation"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:spaceForUL/><w:balanceSingleByteDoubleByteWidth/><w:doNotLeaveBackslashAlone/><w:ulTrailSpace/><w:doNotExpandShiftReturn/><w:adjustLineHeightInTable/><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/><w:useFELayout/></w:compat></w:docPr><w:body><wx:sect><w:p><w:pPr><w:rPr><w:rFonts w:hint="fareast"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="fareast"/></w:rPr><w:t>aaaaaaaaaaaaaaaaa</w:t></w:r></w:p><w:sectPr><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/><w:cols w:space="425"/><w:docGrid w:type="lines" w:line-pitch="312"/></w:sectPr></wx:sect></w:body></w:WordDocument>
而剛才輸入的文字"aaaaaaaaaaaaaaaaa",就在其中。如果你需用用變量,那麼就可以用變量替換了。
那麼程序應該如何處理該文檔呢?
其實處理方式和MVC中處理html一樣的,只是把這個Office的XML文檔當作Html模板處理並,在程序端另存為文檔時也得處理一下,如下列代碼:
1 HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=Word.doc");
2 HttpContext.Current.Response.Charset = "UTF-8";
3 HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
4 HttpContext.Current.Response.ContentType = "text/XML";
5 HttpContext.Current.Response.Write(TemplateProcess.Output(MyContext, "/layout/include/" + this.MethodName));//模板處理的Office模板文本代碼
6 HttpContext.Current.Response.End();
通過上面形式,就可以把office文件當作文本模板導出Office可以正常顯示讀取的Word或Excel文件了。