poi-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jon Svede <jsv...@yahoo.com>
Subject Re: how to add functions to POI
Date Mon, 04 Oct 2010 15:26:13 GMT

That example is very straightforward, thanks for pointing me to it.  
Additionally, I would like to contribute some docs on this because I think this 
is a really nice feature.  Are there instructions somewhere I can reference for 
adding such a contribution?

As far as patching it,  I don't think it *needs* a patch.  One suggestion might 
be that when POI encounters a custom function and it throws an exception, the 
comments of the exception point users to the UDFFinder docs.    

I can see a way to add to it, though.  This example works well when you have a 
single workbook with a small set of functions that need to be converted.  But 
what if you have an application built on POI that has a number of workbooks with 
a number of custom functions?  This declarative approach might be cumbersome 
(but certainly workable, so I am not criticizing).

My suggestion would be to provide some ability to do this through 
configuration.  The code snippet:

		UDFFinder udff1 = new DefaultUDFFinder(new String[] { "myFunc", }, 				new 
FreeRefFunction[] { new MyFunc(), }); 		UDFFinder udff2 = new 
DefaultUDFFinder(new String[] { "myFunc2", }, 				new FreeRefFunction[] { new 
MyFunc2(), }); This is basically registration, not unlike registering beans with 
Spring or even something simple like a properties file.  If this could be moved 
from code to a configuration I think it would make coding for these workbooks 
with custom functions easier (though on the other hand there is an argument to 
be made for keeping it as it is because this makes it declarative that a given 
workbook has custom functions).  Another benefit of going the configuration 
route is that a developer could write the function, add it to a file and 
basically forget about it because their POI instance would have it globally.    
On my project, we don't have an immediate need for this functionality, but maybe 
others do?  

So my idea would be something like the following:


      <bean id="myFunc" class="com.mycompany.my.project.MyFunction"/>
   <bean id=="myFunc2" class="com.mycompany.my.project.MyFunction2"/>




If you prefer not to use Spring.  There are probably other ways to achieve this 
part, these are just examples.

In the application code:

Workbook workbook = WorkbookFactory.create( "path/to/target/workbook.xls", 
"path/to/UserDefinedFunctions.xml" ) ;

Another way would be to have POI look in the classpath for a specific file; if 
it exists, POI loads the functions defined.  Then in the code there is no 
reference at all to this file (though again, it might make it more confusing).

I realize that this is semantic, users of the API could easily add this 
themselves.  I like the idea of not having to code the registration myself.

Anyway, hopefully this doesn't come off as a criticism because I am definitely 
not criticizing, this is great functionality as it is.  I've used POI over the 
years and I think very highly of it.  Please let me know if I can be of 



----- Original Message ----
From: Yegor Kozlov <yegor@dinom.ru>
To: dev@poi.apache.org
Sent: Mon, October 4, 2010 2:07:12 AM
Subject: Re: how to add functions to POI

> If after reading the code and the docs I can see how I might be of assistance 
> will do as you suggested.  Outside of the test case, is this feature
> documented?   I don't recall reading about this.

UDF is not well documented, all available bits of documentation are those in the 
source code  and in Bugzilla.

Perhaps, a good contribution would be an example how to use the UDF API.  
Patches are welcome.


To unsubscribe, e-mail: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org


To unsubscribe, e-mail: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org

View raw message