One element you’ll eventually run up against when dealing with Word documents is "compatibility”.
You can see one small indicator of compatibility in the above screenshot. When you open any old format DOC file in Word 2007 or 2010, it’ll open in compatibility mode.
But what does that mean, really?
Compatibility in a Nutshell
Word’s Compatibility mode actually encompasses a fairly significant number of tweaks to how Word renders a document. You can see those options at the bottom of the Advanced tab on Word’s Options dialog.
a small sampling of compatibility options available
Word sets those options in a number of different combinations depending on the source of the original document. You can select the source document manually via the below dropdown, but most of the time, Word will choose an appropriate selection automatically when it opens the original document.
The problem is, many of those options can cause Word to render a document in very strange, unpredictable ways. In fact, most Word experts advise to manually turn OFF all compatibility options (and so force Word to layout the document using it’s most recent rules, either those set for Word 2007 or for Word 2010).
Controlling Compatibility Programmatically
Manipulating those settings manually via the Options dialog is fine, but if you’ve got thousands of documents to deal with, that may not be your best approach.
Why not automate it with a bit of .net code?
Private Sub ForceCompatibility(ByVal Doc As Word.Document) Doc.Convert() Doc.Application.Options.DisableFeaturesbyDefault = False For Each e As Word.WdCompatibility In [Enum].GetValues(GetType(Word.WdCompatibility)) Dim res As Boolean = False Select Case e Case Word.WdCompatibility.wdDontULTrailSpace res = True Case Word.WdCompatibility.wdDontAdjustLineHeightInTable res = True Case Word.WdCompatibility.wdNoSpaceForUL res = True Case Word.WdCompatibility.wdExpandShiftReturn res = False Case Word.WdCompatibility.wdLeaveBackslashAlone res = True Case Word.WdCompatibility.wdDontBalanceSingleByteDoubleByteWidth res = True End Select Doc.Compatibility(e) = res Next End Sub
So, what’s going on here?
First, I pass in a Document variable to the function. This variable contains a reference to the Document object you need to fix compatibility on. You can easily obtain teh Active document object with the Application.ActiveDocument property.
The function first calls the Doc.Convert method. This converts the document to the latest format available to the version of Word you’re running and enables all new features. This conversion happens in memory. Nothing is saved to disk at this point. Also, you’d think that this would be enough to turn off all compatibility tweaks, but alas, Word leaves many of them still turned of after this conversion.
Next, it uses the DisableFeaturesbyDefault property to enable all available features.
Then, it enumerates all the wdCompability options to clear or set them as necessary. This handy bit of trickery can come in handy in a number of situations. Essentially, it uses a little reflection here:
[Enum].GetValues(GetType(Word.WdCompatibility))
to retrieve an array of all the possible values of the wdCompatibility enumeration.
Then, the For loop simply iterates through all the values in that array.
The SELECT CASE then matches up a few specific enumeration values that don’t work quite like you might expect, and handles them with special cases.
For instance, the wdNoSpaceForUL option is equivalent to the “Add Space for Underlines” option in the Word Options Dialog. However, the logic is reversed.
Leave it to a word processing program to make use of double negatives like this!
Odd Man Out
The wdExpandShiftReturn option is the one exception. When cleared, this option prevents Word from expanding spaces on lines that end with a soft Return (a Shift-Return). Many Word experts indicate that this is preferable to Word’s default behavior of expanding those spaces, so I’ve set it here accordingly. Your mileage may vary.
And finally, be sure the SAVE the document in xml format, using the Save method like this:
Doc.SaveAs FileName:="doc.xml", FileFormat:=wdFormatXML
So there you have it. A quick and easy way to force a document into the latest Word file format and turn off any errant compatibility options in the process.