2011-08-07

how to use a relative path to a data source for word mail merging (word 2007, word 2010)

suppose you set up mail merging in a word document and specify a data source that is in the same folder (e.g. a csv or an excel file), and then you move the folder.  next time you open the word document, word will look in the original location for the data source and give an error "file.docx is a mail merge document. Word cannot find its datasource."  with way too much trouble you can make the the source relative by editing the word document without using microsoft word.

0. back up the word file you are editing because you might destroy it in the following steps.
1. find an OpenXML editor that can edit zipped xml files.  for non-commercial use you can use this: http://free.editix.com/.  the following directions contain elements that are specific to using editix.
2. open editix.
3. click file-> open
4. under "files of type" choose "microsoft office documents"
5. open a word file with mail merging already set up with an absolute path to the datasource

warning: there may be two places where you have to change the path when using text files.



6. if you can find it, navigate to "file.docx" > "word" > "_rels" > "settings.xml.rels" (open this .xml.rels file).  if you can't find it then skip to step 9.
7. right click in white space in the panel on the right and click "pretty format" to make the xml easier to read
8. look for something like the below.

Target="file:///C:\users\you\documents\datasource.csv"

above is an absolute path.  change it to something like the below, which looks for a file called "datasource.csv" that must be in the same folder as the word document.

Target="datasource.csv"

warning: there may be other references to the data source in settings.xml.rels that need to be changed to relative paths.  thanks to mark for pointing this out.

if the data source is in a folder called "data", and the "data" folder is in the same place as the word document, type

Target="data/datasource.csv"

if the word document is in a folder called "word documents" and the "word documents" folder is in the same place as the data source, type

Target="../datasource.csv"

because ../ means go to the folder above.  "../../datasource.csv" means to look two folders up.  for more help google search "absolute and relative paths".

in this step only, if there are any spaces in the path to your file, replace the spaces with "%20" (not including the quotes)

9. navigate to "file.docx" > "word" > "settings.xml".  you should definitely be able to find this one no matter what your type of data source.
10. format again so you can read the xml easily
11. look for something like the below

 <w:query w:val="SELECT * FROM C:\users\you\documents\datasource.csv"/>

do not replace spaces with %20 here.

12. change "C:\users\you\my documents\datasource.csv" to a relative path.  it should be the same as the path you used in step 8 if you did step 8.  e.g.

 <w:query w:val="SELECT * FROM datasource.csv"/>


i would love a comment if this article helped you.

3 comments:

  1. Just tried the above, and it worked first time - excellent! Users may find, as I did, that they have more than one entry to edit under the "file.docx" > "word" > "_rels" > "settings.xml.rels" portion (your steps 6-8 above), or that the edit in step 11 regarding the 'SELECT * FROM ...' may not be in the 'SELECT' clause but may be nearby, possibly in more than one location, but it's fairly obvious to just spot the absolute file path/name and edit it as described.
    One last point, I followed your instructions then moved the Word document and all worked fine. However, if I then re-open the Word document at its new location using editix, I see the relative paths have become new absolute paths...?! I haven't had time to look into the impact of this for portability etc., but maybe others will comment.
    Great job, thanks. Mark

    ReplyDelete
  2. thanks mark. i put a note in step 8 for this.

    i hadn't tested it but i was afraid word would make the paths absolute again. this method works well for me when i let users download a zip file from my website with a csv and a mail merge document and it is unknown what the path will be when the user extracts the zip file.

    ReplyDelete
  3. Thank you man!
    It worked like a charm :)
    Regards from Barcelona

    ReplyDelete