views:

1012

answers:

2

Hello all.

I'm currently trying to do a mailmerge, using C# and OpenOffice.

I have a list of destanatary in my DB. I would like this to be possible :

  • the user edit an OO document, put fields like "name" "adresse" "city" and some standard text (e.g. : "Hello Name how are you ?",
  • edit the style, etc etc,
  • then go to my application, clic on "Send to all user in DB".

Then the program loops through all user, and for each user replace the mailmerge fields in the OO document with DB data's, send it by mail/print/whatever.

Problem : I can't find any way, in C#, to replace the mailmerge fields in the OO document with DB data's, because i can't find what Property/Method handle these fields.

Please help me by annual bonus depends on it ! (sic)

Only pointer I found was that it seems I'll need the UNO Library, but it seems it doesn't exist in C#.

+2  A: 

General help on using C# with OpenOffice:

http://www.oooforum.org/forum/viewtopic.phtml?p=151606 http://opendocument4all.com/content/view/68/47/

With OO 3.0 you'll need to reference cli_*.dll libraries, they are put to GAC when OO is installed.

A sample code to initialize OO connection:

 private static XMultiServiceFactory _multiServiceFactory;
 private static XComponentLoader _componentLoader;
 private static XFileIdentifierConverter _urlConverter;

 private static void Initialize()
 {
     XComponentContext localContext = uno.util.Bootstrap.bootstrap();
    _multiServiceFactory = (XMultiServiceFactory)localContext.getServiceManager();
    _componentLoader = (XComponentLoader)_multiServiceFactory.createInstance("com.sun.star.frame.Desktop");
    _urlConverter = (XFileIdentifierConverter)_multiServiceFactory.createInstance("com.sun.star.ucb.FileContentProvider");
 }

Loading document:

string url = _urlConverter.getFileURLFromSystemPath(Path.GetPathRoot(path), path);
XComponent xComponent = _componentLoader.loadComponentFromURL(url, "_blank", 0, new PropertyValue[] { MakePropertyValue("Hidden", new uno.Any(true))});
XTextDocument doc = (XTextDocument)xComponent;

where

 private static PropertyValue MakePropertyValue(string cName, Any uValue)
 {     
    PropertyValue oPropertyValue = new PropertyValue();
    if (!string.IsNullOrEmpty(cName))
       oPropertyValue.Name = cName;
    oPropertyValue.Value = uValue;
    return oPropertyValue;
 }

Read more on what you can do we XTextDocument here.

See also OpenOffice.org Developer's guide.

UPDATE. One more useful link:
http://blog.nkadesign.com/2008/net-working-with-openoffice-3/

Hope this helps

Dmitry Ornatsky
Thank for your answer, but what is the use of the code after "where" ? There is so few documentation on C#/OpenOffice :/
Clement Herreman
This function is used in the second code block
Dmitry Ornatsky
A: 

for [mail merage using c#][1], i recommand you to use Spire.Doc, very easy to use and withoule ole automation,

http://www.e-iceblue.com/Introduce/excel-for-net-introduce.html

hope useful to you.

Peter