I was recently tasked with the job of replacing a K2.NET 2003 Workflow that used some Word Automation to merge some data together and produce a document. The C# code that did the automation ran on a x32 SharePoint 2007 Server but did not function whatsoever on the x64 platform, and besides server-side automation is not recommended anyways.
I created a new Content Type in SharePoint 2007 with a Parent of Document
added the new site columns that I needed to hold the data I wanted to put into the document
I then created a new document library, went into Settings | Document Library Settings | Advanced Settings and selected “Yes” for “Allow management of content types?” and pressed “OK”.
Under Content Types I selected “Add from existing site content types” and chose the Content Type I created above.
Once my Content Type is added I return to my Document Library and select New | FormLetter
This will open Word 2007 with a new empty document that includes the properties from your Content Type
Save the .docx to your local computer and then you can add the server properties to your document by selecting Insert | Quick Parts | Document Property and select the field you would like to put into the document
Now after you’re done you save the file (again to your local computer), we go back to edit the Content Type settings: Site Settings | Site Content Types | FormLetter | Advanced settings
Upload the .docx file you saved earlier as the new template. Now for some code to access all this, here is a snippet from my workflow
using (SPWeb currentTeamSite = workflowProperties.Web)
{
SPListCollection lists = currentTeamSite.Lists;
SPDocumentLibrary docLib = (SPDocumentLibrary)lists["Form Letters"];
SPContentType CType = docLib.ContentTypes["FormLetter"];
SPFileCollection fileCollection = currentTeamSite.GetFolder(docLib.RootFolder.Url).Files;
SPFile template = currentTeamSite.GetFile(CType.DocumentTemplateUrl);
SPFile file = fileCollection.Add("Form Letter" + ".docx", template.OpenBinary(), true);
file.Item["ContentTypeId"] = CType.Id;
file.Item["Title"] = "My Form Letter";
// fields required by the Content Type
file.Item["ClientFirstName"] = “Some Text”;
file.Item["ClientLastName"] = “Some Text”;
file.Item["ClientCompanyName"] = “Some Text”;
file.Item.Update();
}
Now if you want to provide some support for Word 2003 in all of this I will post that to my next blog post on the subject.
Thanks for posting this. Very interesting stuff. Definitely a good alternative to Infopath for certain situations. How would this work in word 2003 though? I suppose one could use fields instead but I think that they don\’t update automatically.
LikeLike
To make this work for Word 2003 I save the document in Word 2003 XML format and do a string replace for the fields we care about. Now by fields I mean placeholders I have created like this {ClientFirstName} so using the column names in the content type and iterating through them I can easily replace them with real data.
LikeLike
I appreciate the tip. Thanks.
LikeLike
How to insert images in word documents using this approach.
LikeLike
Hi,
If you are still on MOSS 2007 I don’t really have an answer for you, if your environment is SharePoint 2010 then I would say you could use the OpenXML API to do it.
Hope that is of some help.
Wes
LikeLike