用xml模块方式导出多种offcie文件
我们在开发网站时,有很大一部分人采用的是MVC模式,而V是代表视图,关于视图开发的语言,都有语法简单,开发迅速的特点,比如说velocity,jstl等等,而通常用这种语言写成的文件我们通常称其为模板。模板,从名字上可以得出,这是一种通用具有参照性的样板,所有的东西都是按照它的比例剪栽而成的。
在采用MVC方式开发html页时,因为html是普通文本表示的,我们就会用如下形式表html
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文件,发现里面就是一个文本格式的。代码如下:
<?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模板处理并,在程序端另存为文档时也得处理一下,如下列代码:
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文件了。