word|建立 隨著人們對資料庫及動態HTML (DHTML)的應用和對XML的興趣的增加,所以在商業網站的資料中使用動態內容變得越來越普遍。這裡我們就成功運用了一則最新的技巧——用ASP建立 Word 檔案,我想您看後肯定會受到很大的啟發。
原文出處:http://www.asptoday.com/articles/19990825.htm
背景
BuildDoc.asp是一個ASP檔案,它讀入一個網頁表單的輸出,並建立一個Microsoft Word檔案作為輸出, 其中包含根據表單內資料改變產生的一個表格。表單內容不再局限於靜態資訊。也就是說, 表單中所顯示的內容可能隨著使用者的互動作用而改變。
BuildDoc所滿足的商業需求是:根據銷售人員網頁列表變化的記錄,建立表單信件。只有被銷售人員修改過的資料才被發送到Word, 在那裡這些資料被格式化到表格中。
BuildDoc讀入表單上的所有資訊,識別被改變的行,然後用被改變的行中包含的資訊來建立一個 Microsoft Word檔案。BuildDoc使用一個模板檔案(buildDoc.dot),其中包含地址頭和一些預先格式化的文本。然後向檔案中寫入一個表格,其中的每一行都對應與網頁表單中被修改過的一行。
怎麼做?
開始時,將所有的網頁表單域讀入接收網頁的隱含表單域中。在下面的原始碼中,請注意在Body標記中對“onLoad”的調用。它調用buildDoc VB指令碼子程式,向它傳遞3個參數:頁面中表單的內容(所有的隱含域)、Word模板檔案的位置、從輸入表單中收到的行數。讀所有的輸入表單域,然後當頁面裝載後調用buildDoc子程式。為了簡短起見,這裡假定所有變數在使用之前都已被聲明:
buildDoc.asp中裝載輸入表單域的代碼如下:
〈!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
〈HEAD>
〈TITLE>Build Document〈/TITLE>
〈META HTTP-EQUIV="Refresh" CONTENT="30;URL='orderForm.asp'">
〈/HEAD>
〈%
dotLocation="'servernamedirectory heTemplate.dot'"
intRowCount = Request.Form("rowCount") 'initialize a row counter
%>
〈BODY Language="VBScript" onLoad="buildDoc document.theForm,
〈%=dotLocation%>,intRowCount>
〈FORM NAME="theForm">
〈%
itemCount = 0 'set field counter to zero
For Each Item in Request.Form 'count up the form fields
itemCount = itemCount + 1 'using For..Next loop
%>
〈INPUT TYPE="hidden" NAME="〈%=Item%>" VALUE="〈%=Request(Item)%>">
〈% Next %>
〈INPUT TYPE="hidden" NAME="numbRows" VALUE="〈%=intRowCount%>">
〈INPUT TYPE="hidden" NAME="fieldCount" VALUE="〈%=itemCount%>">
〈/FORM>
〈/BODY>
〈/HTML>
用下面例子中的代碼來建立一個Word 檔案對象。請注意在Internet Explorer 4+中,要將瀏覽器的安全性設定為Low或 Custom,以能使應用程式運行成功。
〈%
Set objWordDoc = CreateObject("Word.Document")
ObjWordDoc.Application.Documents.Add theTemplate, False
ObjWordDoc.Application.Visible=True
%>
調整數組的維數使它與網頁表單所包含的行數相同。這時,將Y軸設為4個常量,這是輸出檔案中所需要 的欄數。X軸包含從表單中接收的行數。
〈% Redim Preserve theArray(4,intTableRows) %>
現在開始檢查所有的表單行。在所有輸入的網頁表單域中迴圈,收集每個表單網域名稱及其相應的值。逐個檢查以決定將其放入哪個數列元素內,然後將其放入。以下舉例代碼中的SELECT CASE命令很重要,這決定表單域屬於哪一列。為了方便,使用不確定編碼的CASE選擇。
〈%
For intCount = 0 to frmData.fieldCount.value
strOkay = "Y"
strSearch = frmData.elements(intCount).name 'load the field name
strValue = frmData.elements(intCount).value 'load the field value
strPosition = Instr(1,strSearch,"_") 'get pos val of "_"
intStringLen=strPosition-1
If intStrLen > 0 Then
strLeft = Left(strSearch,intStringLen)
strRight = Right(strSearch,(Len(strSearch)-Len(strLeft)-1))
Select Case strLeft
Case "SKU" intArrayY=0
Case "description" intArrayY=1
Case "price" intArrayY=2
Case "quantity" intArrayY=3
End Select
IntArrayX = strRight
If strOkay 〈> "N" Then
TheArray(intArrayY, intArrayX) = strValue
End If
End If
Next
%>
現在開始建立檔案。對於啟用的檔案,用變數rngCurrent設定Microsoft Word檔案對象RANGE(為了防止使用者開啟另一個檔案),通過指定表格的位置( rngCurrent)以及行、列的數目來確定其大小。
〈%
Set rngCurrent = objWordDoc.Application.ActiveDocument.Content
Set tabCurrent = ObjWordDoc.Application.ActiveDocument.Tables.Add
rngCurrent,intNumrows,4)
%>
建立了有表格的檔案之後,我們開始往表格中裝入資料。首先指到第一行row(tabRow=1 ), 然後進行逐行迴圈。在每行結尾處插入斷行符號[Chr(10)],以便產生行間空行,最後增加行計數器,用“FormatCurrency” 輸出美圓值以保證使用$符號、逗號、小數點的位置。通過在
“ParagraphAlignment=2”處設定欄數來實現美圓數量的正確調整。用VBA容易一些,不象用VBScript那樣難。
〈%
For j = 1 to intTableRows
ObjWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Borders.Enable=False
objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(1).Range.InsertAfter
theArray(1,j)
objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(2).Range.InsertAfter
theArray(2,j)
objWordDoc.Appli