views:

10379

answers:

16

I have a project where I would like to generate a report export in MS Word format. The report will include images/graphs, tables, and text. What is the best way to do this? Third party tools? What are your experiences?

+5  A: 

The quickest way I have done it in the past is to use XML. Here is a good article that should get you started:

http://msdn.microsoft.com/en-us/magazine/cc164064.aspx

Dale Ragan
Wow, that is a good article.
Frank Krueger
+19  A: 

The answer is going to depend slightly upon if the application is running on a server or if it is running on the client machine. If you are running on a server then you are going to want to use one of the XML based office generation formats as there are know issues when using Office Automation on a server.

However, if you are working on the client machine then you have a choice of either using Office Automation or using the Office Open XML format (see links below), which is supported by Microsoft Office 2000 and up either natively or through service packs. One draw back to this though is that you might not be able to embed some kinds of graphs or images that you wish to show.

The best way to go about things will all depend sightly upon how much time you have to invest in development. If you go the route of Office Automation there are quite a few good tutorials out there that can be found via Google and is fairly simple to learn. However, the Open Office XML format is fairly new so you might find the learning curve to be a bit higher.

Office Open XML Iinformation

Rob
A: 

@Dale Ragan: That will work for the Office 2003 XML format, but that's not portable (as, say, .doc or .docx files would be).

To read/write those, you'll need to use the Word Object Library ActiveX control:

http://www.codeproject.com/KB/aspnet/wordapplication.aspx

DannySmurf
A: 

@Danny Smurf: Actually this article describes what will become the Office Open XML format which Rob answered with. I will pay more attention to the links I post for now on to make sure there not obsolete. I actually did a search on WordML, which is what it was called at the time.

I believe that the Office Open XML format is the best way to go.

Dale Ragan
+1  A: 

The project I am speaking of will be running on a server and not a winforms or client app

schmidty
+3  A: 

Schmidty, if you want to generate Word documents on a web server you will need a licence for each client (not just the web server). See this section in the first link Rob posted:

"Besides the technical problems, you must also consider licensing issues. Current licensing guidelines prevent Office applications from being used on a server to service client requests, unless those clients themselves have licensed copies of Office. Using server-side Automation to provide Office functionality to unlicensed workstations is not covered by the End User License Agreement (EULA)."

If you meet the licensing requirements, I think you will need to use COM Interop - to be specific, the Office XP Primary Interop Assemblies.

Luke Girvin
+5  A: 

Have you considered using .RTF as an alternative?

It supports embedding images and tables as well as text, opens by default using Microsoft Word and whilst it's featureset is more limited (count out any advanced formatting) for something that looks and feels and opens like a Word document it's not far off.

Your end users probably won't notice.

DavidWhitney
+7  A: 

I have found Aspose Words to be the best as not everybody can open Office Open XML/*.docx format files and the Word interop and Word automation can be buggy. Aspose Words supports most document file types from Word 97 upwards.

It is a pay-for component but has great support. The other alternative as already suggested is RTF.

John
+1  A: 

Check out VSTO (Visual Studio Tools for Office). It is fairly simple to create a Word template, inject an xml data island into it, then send it to the client. When the user opens the doc in Word, Word reads the xml and transforms it into WordML and renders it. You will want to look at the ServerDocument class of the VSTO library. No extra licensing is required from my experience.

DancesWithBamboo
+1  A: 

I currently do this exact thing.

If the document isn't very big, doesn't contain images and such, then I store it as an RTF with #MergeFields# in it and simply replace them with content, sending the result down to the user as an RTF.

For larger documents, including images and dynamically inserted images, I save the initial Word document as a Single Webpage *.mht file containing the #MergeFields# again. I then do the same as above. Using this, I can easily render a DataTable with some basic Html table tags and replace one of the #MergeFields# with a whole table.

Images can be stored on your server and the url embedded into the document too.

Interestingly, the new Office 2007 file formats are actually zip files - if you rename the extension to .zip you can open them up and see their contents. This means you should be able to switch content such as images in and out using a simple C# zip library.

littlecharva
A: 

I faced this problem and created a small library for this. It was used in several projects and then I decided to publish it. It is free and very very simple but I'm sure it will help with you with the task. Invoke the Office Open XML Library, http://invoke.co.nz/products/docx.aspx.

+2  A: 

I have had good success using the Syncfusion Backoffice DocIO which supports doc and docx formats.

In prior releases it did not support everything in word, but accoriding to your list we tested it with tables and text as a mail merge approach and it worked fine.

Not sure about the import of images though. On their blurb page http://www.syncfusion.com/products/DocIO/Backoffice/features/default.aspx it says

Blockquote Essential DocIO has support for inserting both Scalar and Vector images into the document, in almost all formats. Bitmap, gif, png and tiff are some of the common image types supported.

So its worth considering.

As others have mentioned you can build up a RTF document, there are some good RTF libraries around for .net like http://www.codeproject.com/KB/string/nrtftree.aspx

Jafin
+4  A: 

I have spent the last week or so getting up to speed on Office Open XML. We have a database application that stores survey data that we want to report in Microsoft Word. You can actually create Word 2007 (docx) files from scratch in C#. The Open XML SDK version 2 includes a cool application called the Document Reflector that will actually provide the C# code to fully recreate a Word document. You can use parts or all of the code, and substitute the bits you want to change on the fly. The help file included with the SDK has some good code samples as well.

There is no need for the Office Interop or any other Office software on the server - the new formats are 100% XML.

+2  A: 

To generate Word documents with Office Automation within .NET, specifically in C# or VB.NET:

  1. Add the Microsoft.Office.Interop.Word assembly reference to your project. The path is \Visual Studio Tools for Office\PIA\Office11\Microsoft.Office.Interop.Word.dll.

  2. Follow the Microsoft code example you can find here: http://support.microsoft.com/kb/316384/en-us.

Marcello Belguardi
A: 

There are three ways to create word document. 1. use Office OLE automation , doc, docx support, but does not recommend using Office application in server-side scenarios. 2. Office Open XML sdk , but it can only support docx. 3. There are 3 parts component can do this better, I recommanded Spire.Doc, it easy to use and Hight performance, doc, docx support. more details, http://www.e-iceblue.com/Introduce/word-for-net-introduce.html

Peter
+1  A: 

Free library for creating DocX documents. Nice and simple.

MadBoy