I've been thinking about this problem as well, and I think the most straightforward approach is to use the RTF format and save as .doc (word will still open it and your users will be none the wiser). It is documented and easy to read and write with plain text. Maybe even do the transformation with xslt (not that I know anything about that).
Writing real doc files is stupidly hard and there aren't any good free libraries that will do it for you. Maybe you can buy a component for it though.
Bookmarks