|
Page 1 of 2: [1] 2 » |
|
|
| 7/23/2003 11:54:02 AM |
|
|
# Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(HyperActive Member)
posts: 278
since: May 22, 2003
from: King of Prussia
|
This topic is rated 10 points.
|
|
Version 2.0
I have seen way too many posts and answered way too many questions
to have me believe this is not yet a frequently asked question. So
Starting now I am going to begin compiling a guide to using,
manipulating, and creating documents in MS Office using VB .NET.
============
MS Word
============
1) Creating a new Document
Hey you gotta start somewhere.
First make sure you import the Word Object Library to your project.
Now that you have access to the Word Object Library you need to have create an instance of the application
Code: 'office xp
Dim wordApp As Word.Application
wordApp = CreateObject("Word.Application")
'office 2000
Dim wordApp As Word.Application
wordApp = New Word.Application
'office 97
Dim wordApp As Word.ApplicationClass
wordApp = New Word.Application
Although with most objects you create a new instance of it using
the New keyword, with OfficeXP it is best to Explicitly define it with
the CreateObject method due to a bug that exists in Office 97, which is why we create the Object with the ApplicationClass and not the Application Object.
Now that we have a running Application, we are going to want to create a document, so ...
Code:'XP and 2000
Dim wordDoc As Word.Document
'97, once again the 97 bug
Dim wordDoc As Word.DocumentClass
Now that we have an identifier for our document we are going to want to create a new document and play with it.
Code: Dim wordRng As Word.Range
Dim wordPara As Word.Paragraph
With WordApp
.WindowState = Word.WdWindowState.wdWindowStateMaximize
.Documents.Add
wordDoc = wordApp.ActiveDocument
wordRng = wordDoc.Range
With wordRng
.Font.Bold = True
.Font.Italic = True
.Font.Size = 24
'since this is going to be the first bit of text, you could just use the .Text field, but it is better practice
'to prevent data lose to use .InsertAfter, anytime you enter data into the .Text field, it erases the pervious
'info and replaces it with the new, .InsertAfter does the same as .Text += "anything"
.InsertAfter "Word Automation"
.InsertParagraphAfter
' Insert a blank paragraph between the two paragraphs.
.InsertParagraphAfter
End With
'note, for non XP users, use wordPara = wordRng.Paragraphs.Item(3)
wordPara = wordRng.Paragraphs(3)
With wordPara.Range
.Bold = False
.Italic = True
.Font.Size = 14
.InsertAfter "Document Created On: " .Collapse(Direction:=Word.WdCollapseDirection.wdCollapseEnd)
.InsertDateTime DateTimeFormat:="MM-DD-YY HH:MM:SS"
End With
.ActiveDocument.SaveAs "c:\My Documents\createDoc.Doc"
.ActiveDocument.Saved = True
.Quit
End With
That should give you some idea of using the object library. Now
this final step is optional but recommended. To help the garbage
collector and to increase speed and effectively use memory, set all
your large objects to nothing when finished with them. This will allow
them to be taken out of memory a lot easier.
Code: wordPara = Nothing
wordRng = Nothing
wordDoc = Nothing
wordApp = Nothing
2) Opening a Word Document
OK, first create the application and document as before
Code:'for xp users it would be
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
' Create new hidden instance of Word.
wordApp = CreateObject("Word.Application")
Now invoke the Application.Documents.Open(...) method
Code: wordDoc = wordApp.Documents.Open(FileName:=docName)
The open method has a lot of different possible parameters. For lack of a better way to put it, here they are
FileName - If you dont understand this one, you shouldnt be here
ConfirmConversions - Set to true if the you want the convert file dialog to appear if the file is not an MS Word doc
ReadOnly - Set to True if you dont want the ability to modify the text
AddToRecentFiles - Set to true if you want the Word doc in the Recent Files listing
Revert - If the file is already open, True will discard all unsaved changes and open file from disk, False will activate current
Format - Specifies file converter;
wdOpenFormatAuto, wdOpenFormatDocument, wdOpenFormatTemplate,
wdOpenFormatRTF, wdOpenFormatText, wdOpenFormatUnicodeText
Password - If the doc needs a password to open, this is where you put it
WritePassWordDocument - if to modify the doc you need a password, you put it here
PasswordTemplate - If the doc is based on a template, you put that password here
WritePasswordTemplate - To change template, password Here
Now that that is over with, do anything you want and quit
Code: ' Display document name and count of words, and then close
' document without saving changes.
With wordDoc
accessWordDoc = "'" & .Name & "' contains " & .Words.Count & " words."
.Close wdDoNotSaveChanges
End With
wordApp.Quit(False)
Set wordApp = Nothing
For anyone, like myself, who still has to use Word 97, you will recieve the error
Quote:'close' is ambiguous across the inherited interfaces 'Word._Document' and 'Word.DocumentEvents_Event'.
to get around this, force the type of object with the current close/quit method
Code: CType(.ActiveDocument, Word._Document).Close()
I've seen that questions asked about 10 times in 3 months so I am going to keep repeating it.
3) Inserting Data into Word from an MS Access Form
Here is the code to do this in Word XP:-
Code:Private Sub MergeButton_Click()
On Error GoTo MergeButton_Err
Dim objWord As Word.Application
' Get path of the photo.
Dim sImagePath As String sImagePath = "" If InStr(2, ImagePath.Value, ":") Or InStr(1, ImagePath.Value, "\") Then
sImagePath = ImagePath.Value 'path was complete
Else ' ImagePath is to file in folder of this database.
sImagePath = Me.Application.CurrentProject.path & "\" & ImagePath.Value
End If
'Start Microsoft Word.
Set objWord = CreateObject("Word.Application")
With objWord ' Make the application visible.
.Visible = True ' Open the document.
.Documents.Open ("c:\MyDocs\mymerge.doc")
' Move to each bookmark and insert text from the form.
.ActiveDocument.Bookmarks("First").Select .Selection.Text = (CStr(Forms!Employees!FirstName))
.ActiveDocument.Bookmarks("Last").Select .Selection.Text = (CStr(Forms!Employees!LastName))
.ActiveDocument.Bookmarks("Address").Select .Selection.Text = (CStr(Forms!Employees!Address))
.ActiveDocument.Bookmarks("City").Select .Selection.Text = (CStr(Forms!Employees!City))
.ActiveDocument.Bookmarks("Region").Select .Selection.Text = (CStr(Forms!Employees!Region))
.ActiveDocument.Bookmarks("PostalCode").Select .Selection.Text = (CStr(Forms!Employees!PostalCode))
.ActiveDocument.Bookmarks("Greeting").Select .Selection.Text = (CStr(Forms!Employees!FirstName))
' Insert the photo.
.ActiveDocument.Bookmarks("Photo").Select .Selection.InlineShapes.addpicture fileName:=sImagePath, _
LinkToFile:=False, SaveWithDocument:=True End With
' Print the document in the foreground so that Word
' does not close until the document is finished printing.
objWord.ActiveDocument.PrintOut Background:=False ' Close the document without saving changes.
objWord.ActiveDocument.Close
SaveChanges:=wdDoNotSaveChanges
' Quit Microsoft Word and release the object variable.
objWord.Quit
Set objWord = Nothing
Exit Sub
MergeButton_Err:
' If a field on the form is empty,
' remove the bookmark text and continue.
If Err.Number = 94 Then objWord.Selection.Text = "" Resume Next ' If the Photo field is empty...
ElseIf Err.Number = 2046 Then MsgBox "Please add a photo to this record and try again." Else MsgBox Err.Number & vbCr & Err.Description
End If Exit Sub End Sub
Edited by - thebrow on 7/30/2003 11:22:18 AM
|
|
| 7/27/2003 4:40:31 AM |
|
|
#1 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(vbCity Leader)
posts: 4741
since: Feb 21, 2002
from: Dumfries, Scotland
|
I think some of the code in the FAQ will only work with XP. Attached is
a demo solution, which should have backward compatibility, that
demonstrates the first two topics of the FAQ; thanks again to thebrow
for this follow-up
[Edit] There's a temporary problem with file uploading, so the attachment hasn't made the trip. I'll post it up as soon as things are fixed.
Edited by - XTab on 7/27/2003 5:04:17 AM
|
|
| 7/28/2003 9:44:44 AM |
|
|
#2 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(Fanatic Member)
posts: 232
since: Apr 25, 2003
from: Westfield MA
|
This reply is rated 3 points.
|
|
Over the past 6 weeks I have been trying to add something along the
same lines but have issues when it comes to office XP. will this code
also work with Office XP?
|
|
| 7/28/2003 10:57:59 AM |
|
|
#3 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(HyperActive Member)
posts: 278
since: May 22, 2003
from: King of Prussia
|
This reply is rated 1 point.
|
|
The code I posted is XP for Office XP while the code I sent XTab that is posted for download should work with 97 and 2000
Office XP objects prefer explicit declaration (using set,
createobject, etc) and generally will cause errors, bug, exceptions
when defined implicately
Office 2000 doesnt have any problems with implict declaration (New) since .net was first designed to work with it
Office 97 has a wrapper bug that prevents explicit declaration and
causes conflicts with implicit. This forces you to define the
Application by with New ApplicationClass or force the conflicting methods to their type with CType. This is defined in much greater detail in the KB article I linked to in section 1
|
|
| 7/29/2003 6:54:51 AM |
|
|
#4 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(Junior Member)
posts: 25
since: Jul 29, 2003
from: Virginia
|
This reply is rated 3 points.
|
|
Hi,
I try this for vs.net 2003 and office XP and I have and error
I include the word library but i can't defined the line:
Imports Interop.Word
Also I getting error in the line:
WA = CreateObject("Word.Application")
ERROR DESCRIPTION:
An unhandled exception of type 'System.InvalidCastException' occurred in
PrintSpoolFolder.exe
Additional information: Specified cast is not valid.
Any Ideas why i'm getting this error?
Is wordApp.Print() the command for print?
Thanks in advance
JFB
|
|
| 7/29/2003 7:46:30 AM |
|
|
#5 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(HyperActive Member)
posts: 278
since: May 22, 2003
from: King of Prussia
|
This reply is rated 1 point.
|
|
ok a couple things
1) when i was pasting this together, i forgot a line or two.
to use Imports Interop.Word, you must add this line
Imports System.Runtime.InteropServices
to your assembly infor and copy the dll of office and word to the bin folder of your project.
sorry, I make small mistakes a lot. Also its a lot easier to just add the reference in the Solution Explorer
2) not sure why you are getting that error, but make sure you define Dim WA as Word.Application. If that doesnt work try
Dim WA as Word.ApplicationClass. If that doesnt work, well I'm
really suprised and have never seen that before. Try implicate
declarations then or add the Set operator (Set WA =
CreateObject("Word.Application"))
3) To print use the PrintOut method in the Application or the
Document Objects. (by default the activedocument is printed unless the
filename parameter is set)
|
|
| 7/29/2003 9:06:34 AM |
|
|
#6 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(Junior Member)
posts: 25
since: Jul 29, 2003
from: Virginia
|
This reply is rated 3 points.
|
|
Tks for you reply thebrow,
I try all you said and still the error.
Also i cant define the line Imports Interop.Word
I'm attaching my simple project.
Any other toughts?
Tks again
JFB
|
|
| 7/29/2003 9:47:44 AM |
|
|
#7 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(HyperActive Member)
posts: 278
since: May 22, 2003
from: King of Prussia
|
This reply is rated 1 point.
|
|
ok i looked at it and i made a few small changes and everything seemed
to work fine for me, i couldnt run the project because i only have
VS.net 2002.
|
Attachment: |
|
Form1.zip (990 B) This has been downloaded 164 time(s). |
|
|
| 7/30/2003 7:50:23 AM |
|
|
#8 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(Junior Member)
posts: 25
since: Jul 29, 2003
from: Virginia
|
This reply is rated 3 points.
|
|
Tks thebrow for all you help.
Finally i made it work like this...
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
' Create new hidden instance of Word.
Try
'for office xp
wordApp = CreateObject("Word.Application")
wordDoc = CreateObject("Word.document")
Catch
'for office 2000 and 97
wordApp = New Word.Application
wordDoc = New Word.Document
End Try
wordApp.Visible = False
wordDoc = wordApp.Documents.Open(FileName:="C:\spool folder\test.doc")
wordDoc.printout()
wordDoc.close()
wordApp.Quit()
wordApp = Nothing
wordDoc = Nothing
|
|
| 8/28/2003 2:34:56 AM |
|
|
#9 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(New Member)
posts: 1
since: Aug 28, 2003
from: UK
|
This reply is rated 3 points.
|
|
Great guide well done fella, but Im having problems with it. Tried a
few of the follow up post messages but this is what I have:
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Try
'for office xp
WriteLog("Switch: Office XP")
wordApp
= CreateObject("Word.Application")
wordDoc
= CreateObject("Word.document")
Catch
'for office 2000 and 97
WriteLog("Switch:
Office 2K / 97")
wordApp = New Word.Application
wordDoc = New Word.Document
End Try
wordDoc
=
wordApp.Documents.Open(FileName:="c:\inetpub\wwwroot\docstreamer\1.rtf")
Office XP is installed on my system (running locally for now). I
get cannot creative ActiveX component if I force it to use the XP code.
If I use the try catch I get Access Denied as it tries to use the 2k version (which isnt installed)
Any ideas why the XP method wouldn't work ?! I have ref'd both the word and office components
Edited by - anthonymain on 8/28/2003 2:36:36 AM
|
|
| 8/28/2003 12:21:29 PM |
|
|
#10 Re: Ultimate Guide To Office Automation. Part 1 - MS Word |
|
|
|
(HyperActive Member)
posts: 278
since: May 22, 2003
from: King of Prussia
|
This reply is rated 1 point.
|
|
I've been looking into this for awhile, and this is what I've found
Microsoft has been using late binding in all of their documentation
of automating Office for years, however for some reason or another
problems have arrised whenever late binding is used with Office
products on some machines and not others. In fact Microsoft has even
acknowledged this in one of the more recent kb articles on Automating
Office XP. When I wrote this FAQ, the machine I was using Office XP on
( my company had just switched to XP everything ) had no problems with
the late binding methods I posted, however when I first tried
distributing the app, there were massive errors on serval different
computers claiming that the objects could not be made.
I guess I need to rewrite the example I posted but I am 1) too lazy right now and 2) have alot of work to do.
Just use early early binding for all office types
Dim WordApp As Word.Application
wordApp = New Word.Application
Also, some of the constants that I have posted in XP their name Space changes from Office.* to Microsoft.Office.Core.*
|
|
|
Page 1 of 2: [1] 2 » |
|
|
|
All times are GMT -08:00 (Pacific Time) |
|
|