顯示具有 ASP 標籤的文章。 顯示所有文章
顯示具有 ASP 標籤的文章。 顯示所有文章

2009年5月5日

asp動態加入xsl:include

asp動態加入xsl:include

範例如下
testXML.asp
<%
set htPageDom = Server.CreateObject("MICROSOFT.XMLDOM")
htPageDom.async = false
htPageDom.setProperty("ServerHTTPRequest") = true

'讀取XML File
LoadXML = server.MapPath("/hyweb") & "/testXML.xml"
xv = htPageDom.load(LoadXML)

'讀取XSLT File
set oxsl = Server.CreateObject("MICROSOFT.XMLDOM")
oxsl.load(server.MapPath("/hyweb") & "/testXML.xsl")

'產生xsl:include節點
set incXML = Server.CreateObject("MICROSOFT.XMLDOM")
set incSlt = incXML.createNode(1, "xsl:include","http://www.w3.org/1999/XSL/Transform")

'加入href屬性
Set NewAttribute=incXML.createAttribute("href")
NewAttribute.Text= "unitSLT.xsl"
incSlt.SetAttributeNode NewAttribute

'插入新節點於第一個子節點之前
set oxRoot = oxsl.selectSingleNode("xsl:stylesheet")
oxRoot.insertBefore incSlt,oxRoot.firstChild

'輸出至畫面
Response.ContentType = "text/HTML"
outString = replace(htPageDom.transformNode(oxsl),"<META http-equiv=""Content-Type"" content=""text/html; charset=UTF-16"">","")
outString = replace(outString,"&","&")
response.write replace(outString,"&","&")
%>


testXML.xml
<?xml version="1.0"?>
<A name="0">
<B name="1">
<C>B1C</C>
<C>B1C2</C>
</B>
<B name="2">
<C>B2C1</C>
<C>B2C2</C>
<D>B2D1</D>
</B>
</A>


testXML.xsl
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
Use Tempale testXML.xsl<br/>
<xsl:apply-templates select="A/B[1]/parent::*"/>
</xsl:template>

unitSLT.xsl
</xsl:stylesheet>


<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*"/>
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

<xsl:template match="/">
Use Tempale nuitSLT.xsl<br/>
<xsl:apply-templates select="A/B[1]"/>
</xsl:template>

</xsl:stylesheet>


輸出結果
Use Tempale testXML.xsl
<A name="0">
<B name="1">
<C>B1C</C>
<C>B1C2</C>
</B>
<B name="2">
<C>B2C1</C>
<C>B2C2</C>
<D>B2D1</D>
</B>
</A>

這裡要注意的是在testXML.xsl及unitSLT.xsl上都有<xsl:template match="/">的標籤,這樣的情況後面的tag會覆寫前面同名的tag

2009年4月15日

ASP產生Excel方法

報表是各種管理系統中一個重要的,而輸出的格式中Excel就佔有一席之地。
這裡舉一個例子。使用ASP輸出Excel,並能夠直接列印。
1.Excel報表模板的制作
首先根據給定的報表格式,製作一個Excel template,當然需要從DB中動態統計生成的資料留著空白。這個報表先在Excel中畫好,以此例子儲存路徑為\test\testTemplate1.xlt。

2.Excel報表的生成與打印
這裡採用了Excel的Application module,也就是必須安裝Excel到系統中。


(1) 建立Excel.Application
set objExcel=CreateObject("Excel.Application")

(2) 打開Excel template
objExcel.Workbooks.Open(server.mappath("\test")&"\testTemplate1.xlt") '打開Excel template
objExcel.Sheets(1).select '選定工作頁
set sheetActive=objExcel.ActiveWorkbook.ActiveSheet

(3) 加入資料到指定儲存格
例如sheetActive.range("g4").value=date() ‘這裡塞的是時間,當然也可以是任何資料

(4) 加入DB中的資料
這裡假設已有一個dataset名稱為adoRset。
num=7 '從Excel的第七行開始
do until adoRset.EOF
strRange="d"&num&":f"&num '設定要填寫內容的區域
sheetActive.range(strRange).font.size=10 ‘設定字體大小
sheetActive.range(strRange).WrapText=false ‘設定文字自動換行
sheetActive.range(strRange).ShrinkToFit=true ‘設定是否自動調整表格大小
sheetActive.range(strRange).value=array(adoRset("aa"),adoRset("bb"),adoRset("cc")) ‘把Dataset中的Data填寫到相應的儲存格中
num=num+1
adoRset.MoveNext
loop

(5) Excel臨時報表文件的保存及處理
實際執行中應該注意每次一個user進行報表列印時都建立一個臨時的Excel文件,而不是硬性規定名稱,因為如果用固定的名稱的話,只有第一次生成是成功的,後面的操作都會因為已存在同名文件而導致失敗。所以我們需要每次都產生一個臨時的而且不重復的名稱,這裡可以採用自己撰寫的getTemporaryFile()函數由來生成,然後存放在filename變數中,用filepos變數表示這些臨時檔案的路徑。
此外如果這些臨時檔案不處理的話久而久之會成為垃圾檔案,因此在每個用戶在Excel報表打印請求時要先刪除臨時目錄下所有原先產生的臨時檔案。
臨時文件的處理函數如下:

function getTemporaryFile(myFileSystem)

dim tempFile,dotPos
tempFile=myFileSystem.getTempName
dotPos=instr(1,tempFile,".")
getTemporaryFile=mid(tempFile,1,dotPos)&"xls"

end function

set myFs=createObject("scripting.FileSystemObject")
filePos=server.mappath("\test") & "\tmp\" '要存放臨時文件的臨時目錄
fileName=getTemporaryFile(myFs) '取得一個臨時文件名稱
myFs.DeleteFile filePos&"*.xls" '刪除該目錄下所有原先產生的臨時檔案
set myFs=nothing
objExcel.ActiveWorkbook.saveas filePos&filename '儲存臨時檔案

'關閉Excel.Application
objExcel.quit
set objExcel=Nothing



3.系統設定與注意事項
雖然以上程式很簡單,但實際應用不當經常會出現錯誤,所以下面要講到的系統配置和注意事項非常關鍵。

(1) 千萬要保證以上程式輸入的正確性,否則一旦發生錯誤,Excel佔據記憶體,導致下一次呼叫時速度狂慢,並產生記憶體區段不可讀寫的Windows錯誤。

(2) 一定要設置好負責列印功能的asp文件的權限。方法是:在IIS管理中,選擇該asp文件,右鍵然後選“屬性”->“文件安全性”-> "匿名訪問和驗證控制“,在這裡IIS預設是匿名登入,應該選擇驗證登入(這裡基本驗證和Windows驗證兩種方式均可,但前者不夠安全),這一點無比重要,否則應用當中會出錯的。

(3) 有的時候報表分為多頁,而且我們希望每一頁有相同的表頭,要求表頭每頁都自動列印,可以在Excel template中進行設置。方法如下:選擇工具列"文件"->"頁面設置"->"工作表",然後在"頂端標題行"輸入你表頭的行數(如:表頭為1-3行即填入:$1:$3)。