请教一个关于调用Word.Document(Active控件)的问题

balloy 2002-05-25 01:23:27
下面的代码是我在http://www.dev-club.com/找到的,用于将HTML中的表格转到Word中去,即可方便打印。


<html>
<head>
<title>Build Document by Script</TITLE>
</HEAD>
<Table id="myData" border=1 align=center>
<Tr align=center>
<Td>产品名称</Td>
<Td>产品描述</Td>
<Td>产品单价</Td>
<Td>产品等级</Td>
</Tr>
<Tr align=center>
<Td>产品一</Td>
<Td>This is a test</Td>
<Td align=right>300.50</Td>
<Td>一级</Td>
</Tr>
<Tr align=center>
<Td>产品二</Td>
<Td>This is a test</Td>
<Td align=right>300.50</Td>
<Td>一级</Td>
</Tr>
<Tr align=center>
<Td>产品三</Td>
<Td>This is a test</Td>
<Td align=right>300.50</Td>
<Td>一级</Td>
</Tr>
</Tabld>
<input type=button onclick="vbscript:buildDoc '',4" value="build">
<BODY>
</BODY>
</HTML>
<script language="vbscript">
Sub buildDoc(theTemplate,intTableRows)
Dim Table1
set Table1 = document.all.myData
row = Table1.rows.length
Set objWordDoc = CreateObject("Word.Document")
ObjWordDoc.Application.Visible=True
Dim theArray(4,4)
'Redim Preserve theArray(4,row)
colnum = Table1.rows(1).cells.length
for i=0 to row-1
for j=0 to colnum-1
theArray(j+1,i+1) = Table1.rows(i).cells(j).innerHTML
next
next

intNumrows = 4

objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("测试的表格")
objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("")
objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("")

Set rngPara = objWordDoc.Application.ActiveDocument.Paragraphs(1).Range
With rngPara
.Bold = True
.ParagraphFormat.Alignment = 1
.Font.Name = "Arial"
.Font.Size = 12
End With

Set rngCurrent = objWordDoc.Application.ActiveDocument.Paragraphs(3).Range
Set tabCurrent = ObjWordDoc.Application.ActiveDocument.Tables.Add(rngCurrent,intNumrows,4)

for i = 1 to colnum
objWordDoc.Application.ActiveDocument.Tables(1).Rows(1).Cells(i).Range.InsertAfter

theArray(i,1)


objWordDoc.Application.ActiveDocument.Tables(1).Rows(1).Cells(i).Range.ParagraphFormat.alignment

=1
next
tabRow = 2

For j = 2 to intNumrows
'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(1).Range.ParagraphFormat.alig

nment=1
objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(2).Range.InsertAfter

theArray(2,j)


objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(2).Range.ParagraphFormat.alig

nment=1
objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(3).Range.InsertAfter

FormatCurrency(theArray(3,j))


objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(3).Range.ParagraphFormat.alig

nment=2
objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(4).Range.InsertAfter

theArray(4,j)
'objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(4).Range.InsertAfter

Chr(10)


objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(4).Range.ParagraphFormat.alig

nment=1
tabRow = tabRow + 1
Next

'

objWordDoc.Application.ActiveDocument.Tables(1).Rows(tabRow).Cells(4).Range.ParagraphFormat.alig

nment=1

'objWordDoc.Application.ActiveDocument.Paragraph.Add.Range.InsertAfter(" ")
'objWordDoc.Application.ActiveDocument.Paragraph.Add.Range.InsertAfter(" ")
'objWordDoc.Application.ActiveDocument.Paragraph.Add.Range.InsertAfter("Regards,")
'objWordDoc.Application.ActiveDocument.Paragraph.Add.Range.InsertAfter(" ")
'objWordDoc.Application.ActiveDocument.Paragraph.Add.Range.InsertAfter("Daryl B. Morticum")
'objWordDoc.Application.ActiveDocument.Paragraph.Add.Range.InsertAfter("Sales Associate")
'objWordDoc.Application.ActiveDocument.Envelope.Insert Address
' objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertAfter("由廖家远设计")

objWordDoc.Application.ActiveDocument.SaveAs "tempSample.doc",

0,False,"",True,"",False,False,False, False,False
'objWordDoc.Application.printout()


End Sub
</script>


问题是,现在这段代码只适合简单表格的形式(没有colspan或rowspan > 1的情况),那种情况就很难处理,另外,我需要的内容可能不是表格,那又必须有另外的处理方式,很麻烦。
所以,我想,这个控件有没有什么类似LoadHTML(strHtml)之类的方法,可以直接读入一段HTML,做为内容?或者有其它的变通方法,谢谢大家指教。

...全文
336 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
balloy 2002-05-25
  • 打赏
  • 举报
回复
问题解决了,修改客户端代码如下:

Sub OpenDoc()

Dim l_objWordDoc

Set l_objWordDoc = CreateObject("Word.Document")

l_objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertFile("http://yzy/study/print/word.asp")

l_objWordDoc.Application.Visible = True
l_objWordDoc.Application.ActiveDocument.SaveAs "tempSample.doc", 0,False,"",True,"",False,False,False, False,False
'l_objWordDoc.Application.printout()
End Sub

这样就可以了,多谢大家的热心帮助,散分
balloy 2002-05-25
  • 打赏
  • 举报
回复
客户端代码如下:

<html>
<head>
</head>
<body>
<input type=button onClick="vbscript:OpenDoc" value="OpenDoc">

<script language="vbscript">
Sub OpenDoc()

Dim l_objWordApp
Dim l_objWordDoc

Set l_objWordApp = CreateObject("Word.Application")
Set l_objWordDoc = CreateObject("Word.Document")

Set l_objWordDocuments = l_objWordApp.Documents
l_objWordDoc.Application.Visible = True

l_objWordDocuments.Open("http://yzy/study/print/word.asp")
'^^^^^^^^^上面这句如何换成l_objWordDocuments.Open("E:\a.doc")就可以
End Sub
</script>
</body>
</html>

word.asp就是上面的文件,内容如下:

<%
response.ContentType="application/msword"

Const adTypeBinary = 1
Dim strFilePath

strFilePath = "E:\a.htm"

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile strFilePath

Response.BinaryWrite objStream.Read

objStream.Close
Set objStream = Nothing
%>

可是当用http://方式时,就是打不开word文件,不知道为什么
MeXP 2002-05-25
  • 打赏
  • 举报
回复
response.ContentType="application/msword"

Const adTypeBinary = 1
Dim strFilePath

strFilePath = "E:\a.htm"

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile strFilePath

Response.BinaryWrite objStream.Read

objStream.Close
Set objStream = Nothing

继续用上面的代码,只不过换换路径
balloy 2002-05-25
  • 打赏
  • 举报
回复
因为客户不多,而且好像都有,所以暂时可以不考虑客户没装word这个因素。现在不乱码了,现在的问题是客户端如何打开这个服务器端的word?
MeXP 2002-05-25
  • 打赏
  • 举报
回复
我明白了,你的意思用word打开网页,来进行打印(万一客户没装word怎么办)
回过头来看你的代码便明白了
乱码的原因是数据有中文吗?
XML不知能否做到
balloy 2002-05-25
  • 打赏
  • 举报
回复
to mexp(秦汉风) :
首先非常感谢你的热心帮助,我再把我的完整想法说一下:



我的想法是这样的,上面所作的一切,都是为了能让用户实现打印(以其预览)功能。我的html表格是已经画好了的,所以不希望使用类似袁飞打印控件那样的控件重新画一遍。
鉴于客户大多已经安装了Office系列的现状,我想让html直接生成到Word中去给客户打印,最上面的一篇文章就是干这活的,但它的缺点也很明显,就是太不灵活了(不能处理复杂表格等),我想,Word既然可以直接打开html文件,那它肯定就可以自己分析html脚本(而且一般情况来说,分析得要比我自己编程的好),我的想法就是,在服务器端将html脚本生成一个Word文件(或者用Content-Type,使客户浏览器误认为是一个Word文件),客户端再调用本机上的Word程序打开,即可实现打印。
大致思路就是这样,这其中的实现细节还有许多我不懂的地方(但对有经验的人来说,确易如反掌),如果我一个人,我只有像瞎子过河一般,所以,在此寻求大家的帮助,谢谢大家。
MeXP 2002-05-25
  • 打赏
  • 举报
回复
dim wdApp
set wdApp = CreateObject("Word.Application")
set Application("WordApp") = wdApp
‘ Add a document.
set Application("WordDoc") = wdApp.Documents.Add
‘ Release reference.
set wdApp = nothing
服务器端创建代码
balloy 2002-05-25
  • 打赏
  • 举报
回复
下面就是在客户端打开word文件的问题了,这段代码是我从msdn上找到的:
Dim docOne As Word.Document
Dim docTwo As Word.Document
Dim docThree As Word.Document

Set docOne = Documents(1)
Set docTwo = Documents("Policies.doc")
Set docThree = ActiveDocument

可我却怎么也找不到Documents对象是如何来的,各位大虾,请指教
MeXP 2002-05-25
  • 打赏
  • 举报
回复
我想IE本身不支持word文档,你这个照猫画虎不行的,他为什么不用strFilePath = "E:\a.doc"呢?

看看专题有没有你要的http://www.csdn.net/Subject/15/index.shtm

你是要在服务器段生成word文档吧?
balloy 2002-05-25
  • 打赏
  • 举报
回复
我的需要是由一个html文件(或者一段html标签)直接生成一个Word文档,只是现在还没有找到好方法。

上面的文件我以及找到处理方法了,代码如下:
<%
response.ContentType="application/msword"

Const adTypeBinary = 1
Dim strFilePath

strFilePath = "E:\a.htm"

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile strFilePath

Response.BinaryWrite objStream.Read

objStream.Close
Set objStream = Nothing
%>
MeXP 2002-05-25
  • 打赏
  • 举报
回复
Response.BinaryWrite objFile.ReadAll()
我觉得这种方法不对
word文档有其格式
你这样不乱码才怪,就好像有时用写字板打开doc文档一样,乱码

你到底要做什么?我不太明白,请说明
balloy 2002-05-25
  • 打赏
  • 举报
回复
请各位大虾帮忙啊,我只有今天下午的半天时间了!
balloy 2002-05-25
  • 打赏
  • 举报
回复
好像不行啊,我找到了一个例子,但自己编了一个,却出来全是乱码,源文件:

<%
Const ForReading=1
Response.Buffer = True


Dim objFileSystem, objFile

Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = objFileSystem.OpenTextFile("E:\a.doc", ForReading)

Response.ContentType = "application/msword"
Response.BinaryWrite objFile.ReadAll()

Set objFile = Nothing
Set objFileSystem = Nothing

%>
funboy88 2002-05-25
  • 打赏
  • 举报
回复
这么长的代码痛苦呀,还是自己去找找这方面的资料看看
freezwy 2002-05-25
  • 打赏
  • 举报
回复
去专题里面看看。上面有个入口。

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧